From f695d1236658ed4f99f36192b16aa62373acb2e8 Mon Sep 17 00:00:00 2001 From: furszy Date: Tue, 8 Dec 2020 14:36:25 -0300 Subject: [PATCH 01/86] CMakeList, pivxd and test_pivx fix for missing MacOS framework. Without the framework include, CMake isn't able to find the CFBundleGetMainBundle and relative classes/functions. Github-Pull: #2041 Rebased-From: 9afec2e40916ab1342a78c732f9a68886d86d0b5 --- CMakeLists.txt | 4 ++++ src/test/CMakeLists.txt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e63a90d18959..a95b7bc5c63c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -570,6 +570,10 @@ if(MINIUPNP_FOUND) target_include_directories(pivxd PUBLIC ${MINIUPNP_INCLUDE_DIR}) endif() +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + target_link_libraries(pivxd "-framework Cocoa") +endif() + target_link_libraries(pivxd ${sodium_LIBRARY_RELEASE} -ldl -lpthread) add_subdirectory(src/qt) diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 51aa21c3ca00f..18825b0e4ac4a 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -173,6 +173,10 @@ if(MINIUPNP_FOUND) target_include_directories(test_pivx PRIVATE ${MINIUPNP_INCLUDE_DIR}) endif() +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + target_link_libraries(test_pivx PRIVATE "-framework Cocoa") +endif() + target_link_libraries(test_pivx PRIVATE ${sodium_LIBRARY_RELEASE} -ldl -lpthread) enable_testing() From 0eaf73504c24c4b0e4b600d2d5179d0ce0141c1b Mon Sep 17 00:00:00 2001 From: furszy Date: Tue, 8 Dec 2020 15:05:55 -0300 Subject: [PATCH 02/86] [Test] Adding sapling transaction validation unit test coverage. Github-Pull: #2042 Rebased-From: 54c15e7161027bdf56d3f360b96479b64ea2e395 --- src/test/CMakeLists.txt | 1 + src/test/validation_tests.cpp | 95 +++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 18825b0e4ac4a..319dff20ff5e6 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -127,6 +127,7 @@ set(BITCOIN_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/uint256_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/univalue_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/util_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/validation_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sha256compress_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/upgrades_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/librust/sapling_rpc_wallet_tests.cpp diff --git a/src/test/validation_tests.cpp b/src/test/validation_tests.cpp index 56fee4d2da401..ad7be364874d5 100644 --- a/src/test/validation_tests.cpp +++ b/src/test/validation_tests.cpp @@ -4,6 +4,7 @@ #include "test/test_pivx.h" #include "primitives/transaction.h" +#include "sapling/sapling_validation.h" #include "tiertwo/specialtx_validation.h" #include "test/librust/utiltest.h" @@ -58,4 +59,98 @@ BOOST_AUTO_TEST_CASE(special_tx_validation_test) RegtestDeactivateSapling(); } +void test_simple_sapling_invalidity(CMutableTransaction& tx) +{ + CAmount nDummyValueOut; + { + CMutableTransaction newTx(tx); + CValidationState state; + + BOOST_CHECK(!CheckTransaction(newTx, false, false, state, false)); + BOOST_CHECK(state.GetRejectReason() == "bad-txns-vin-empty"); + } + { + CMutableTransaction newTx(tx); + CValidationState state; + + newTx.sapData->vShieldedSpend.emplace_back(); + newTx.sapData->vShieldedSpend[0].nullifier = GetRandHash(); + + BOOST_CHECK(!CheckTransaction(newTx, false, false, state, false)); + BOOST_CHECK(state.GetRejectReason() == "bad-txns-vout-empty"); + } + { + // Ensure that nullifiers are never duplicated within a transaction. + CMutableTransaction newTx(tx); + CValidationState state; + + newTx.sapData->vShieldedSpend.emplace_back(); + newTx.sapData->vShieldedSpend[0].nullifier = GetRandHash(); + + newTx.sapData->vShieldedOutput.emplace_back(); + + newTx.sapData->vShieldedSpend.emplace_back(); + newTx.sapData->vShieldedSpend[1].nullifier = newTx.sapData->vShieldedSpend[0].nullifier; + + BOOST_CHECK(!SaplingValidation::CheckTransactionWithoutProofVerification(newTx, state, nDummyValueOut)); + BOOST_CHECK(state.GetRejectReason() == "bad-spend-description-nullifiers-duplicate"); + + newTx.sapData->vShieldedSpend[1].nullifier = GetRandHash(); + + BOOST_CHECK(SaplingValidation::CheckTransactionWithoutProofVerification(newTx, state, nDummyValueOut)); + } + { + CMutableTransaction newTx(tx); + CValidationState state; + + // Create a coinbase transaction + CTxIn vin; + vin.prevout = COutPoint(); + newTx.vin.emplace_back(vin); + CTxOut vout; + vout.nValue = 2; + newTx.vout.emplace_back(vout); + + newTx.sapData->vShieldedSpend.emplace_back(); + + BOOST_CHECK(!CheckTransaction(newTx, false, false, state, false, false, true)); + BOOST_CHECK(state.GetRejectReason() == "bad-txns-invalid-sapling"); + } + { + CMutableTransaction newTx(tx); + CValidationState state; + + // Create a coinstake transaction + CTxIn vin; + vin.prevout = COutPoint(UINT256_ZERO, 0); + newTx.vin.emplace_back(vin); + CTxOut vout; + vout.nValue = 0; + newTx.vout.emplace_back(vout); + vout.nValue = 2; + newTx.vout.emplace_back(vout); + + newTx.sapData->vShieldedSpend.emplace_back(); + + BOOST_CHECK(!CheckTransaction(newTx, false, false, state, false, false, true)); + BOOST_CHECK(state.GetRejectReason() == "bad-txns-invalid-sapling"); + } +} + +BOOST_AUTO_TEST_CASE(test_simple_shielded_invalid) +{ + // Switch to regtest parameters so we can activate Sapling + SelectParams(CBaseChainParams::REGTEST); + + CMutableTransaction mtx; + mtx.nVersion = CTransaction::TxVersion::SAPLING; + + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_V5_0, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + test_simple_sapling_invalidity(mtx); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_V5_0, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); + + // Switch back to mainnet parameters as originally selected in test fixture + SelectParams(CBaseChainParams::MAIN); +} + BOOST_AUTO_TEST_SUITE_END() From 3066165b11c4aec5ec6173e655a261900e167ac2 Mon Sep 17 00:00:00 2001 From: furszy Date: Wed, 9 Dec 2020 18:24:29 -0300 Subject: [PATCH 03/86] [Sapling] Transparent inputs selection, fixing inverted order. Sort decrementally instead of incrementally. Github-Pull: #2046 Rebased-From: a1025e523c683537ac5a36a0e85751f206f3f134 --- src/sapling/sapling_operation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sapling/sapling_operation.cpp b/src/sapling/sapling_operation.cpp index 3e397f9d4a736..4315fcc90207b 100644 --- a/src/sapling/sapling_operation.cpp +++ b/src/sapling/sapling_operation.cpp @@ -285,9 +285,9 @@ OperationResult SaplingOperation::loadUtxos(TxValues& txValues) return errorOut("Insufficient funds, no available UTXO to spend"); } - // sort in ascending order, so smaller utxos appear first + // sort in descending order, so higher utxos appear first std::sort(transInputs.begin(), transInputs.end(), [](const COutput& i, const COutput& j) -> bool { - return i.Value() < j.Value(); + return i.Value() > j.Value(); }); // Final step, append utxo to the transaction From 99c2d5e9e2a210c8510f04e9dea4db539f63ca24 Mon Sep 17 00:00:00 2001 From: furszy Date: Wed, 9 Dec 2020 15:50:19 -0300 Subject: [PATCH 04/86] [TierTwo] Remove unneeded extra logging. Github-Pull: #2045 Rebased-From: 9213f07fd73195ac81b64a92f2efbc653aaf73dd --- src/tiertwo_networksync.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tiertwo_networksync.cpp b/src/tiertwo_networksync.cpp index 33abdbe340392..ce946550cee5b 100644 --- a/src/tiertwo_networksync.cpp +++ b/src/tiertwo_networksync.cpp @@ -107,7 +107,6 @@ bool CMasternodeSync::MessageDispatcher(CNode* pfrom, std::string& strCommand, C // TODO: This could be a MASTERNODE_SYNC_BUDGET_FIN as well, possibly should decouple the finalization budget sync // from the MASTERNODE_SYNC_BUDGET_PROP (both are under the BUDGETVOTESYNC message) UpdatePeerSyncState(pfrom->GetId(), NetMsgType::BUDGETVOTESYNC, MASTERNODE_SYNC_FINISHED); - LogPrintf("SYNC FINISHED!\n"); return true; } case MASTERNODE_SYNC_BUDGET_FIN: { From fb58f5f03428c87bca349934deb2f0c439dffeef Mon Sep 17 00:00:00 2001 From: Fuzzbawls Date: Wed, 9 Dec 2020 17:40:21 -0800 Subject: [PATCH 05/86] [Miner] Update block header's current version to v8 Avoids an upgrade warning from being triggered after 100 v8 blocks are on chain. Moved the network upgrade consensus check further up. Github-Pull: #2052 Rebased-From: 710f480e0de2a7f6014c4abf3877d61d27099242 --- src/miner.cpp | 13 +++++++++---- src/primitives/block.h | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index f25b3705a0eef..4b79bc3e7fd99 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -164,8 +164,14 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, // Make sure to create the correct block version const Consensus::Params& consensus = Params().GetConsensus(); - //!> Block v7: Removes accumulator checkpoints - pblock->nVersion = CBlockHeader::CURRENT_VERSION; + bool fSaplingActive = NetworkUpgradeActive(nHeight, consensus, Consensus::UPGRADE_V5_0); + + if (fSaplingActive) { + //!> Block v8: Sapling / tx v2 + pblock->nVersion = CBlockHeader::CURRENT_VERSION; + } else { + pblock->nVersion = 7; + } // -regtest only: allow overriding block.nVersion with // -blockversion=N to test forking scenarios if (Params().IsRegTestNet()) { @@ -391,8 +397,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, LogPrintf("%s : total size %u\n", __func__, nBlockSize); // Sapling - if (NetworkUpgradeActive(nHeight, consensus, Consensus::UPGRADE_V5_0)) { - pblock->nVersion = 8; + if (fSaplingActive) { SaplingMerkleTree sapling_tree; assert(view.GetSaplingAnchorAt(view.GetBestAnchor(), sapling_tree)); diff --git a/src/primitives/block.h b/src/primitives/block.h index f7b7e4c1bac31..3b51cec47ac8b 100644 --- a/src/primitives/block.h +++ b/src/primitives/block.h @@ -23,7 +23,7 @@ class CBlockHeader { public: // header - static const int32_t CURRENT_VERSION=7; //!> Version 7 removes nAccumulatorCheckpoint from serialization + static const int32_t CURRENT_VERSION=8; //!> Version 8 Sapling feature and tx v2 int32_t nVersion; uint256 hashPrevBlock; uint256 hashMerkleRoot; From f99a176344a746e47eebef7d06a47fa026dd6e88 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 10 Dec 2020 00:53:49 +0100 Subject: [PATCH 06/86] [BUG][RPC] Fix check in wallet upgrade RPC Github-Pull: #2047 Rebased-From: c1785d2cfd5b13393ef15e2496c3d506d6e3bdf8 --- src/wallet/rpcwallet.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index dc515daafd581..6afae95992b8d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -380,15 +380,15 @@ UniValue upgradewallet(const JSONRPCRequest& request) ); EnsureWallet(); - EnsureWalletIsUnlocked(); - LOCK2(cs_main, pwalletMain->cs_wallet); - // Do not do anything to non-HD wallets - if (pwalletMain->HasSaplingSPKM()) { + // Do not do anything to wallets already upgraded + if (pwalletMain->CanSupportFeature(FEATURE_LATEST)) { throw JSONRPCError(RPC_WALLET_ERROR, "Cannot upgrade the wallet. The wallet is already running the latest version"); } + EnsureWalletIsUnlocked(); + // Get version int prev_version = pwalletMain->GetVersion(); // Upgrade wallet's version From 957689712e0444cb24455097bbdddbc79bb89c8b Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 10 Dec 2020 01:32:55 +0100 Subject: [PATCH 07/86] [RPC] Add nullifiers to listshieldedunspent output Github-Pull: #2049 Rebased-From: e55a089bb7073a23830c893f474605f1656b1d08 --- src/wallet/rpcwallet.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 6afae95992b8d..ce29a9e481025 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -552,6 +552,7 @@ UniValue listshieldedunspent(const JSONRPCRequest& request) " \"amount\": xxxxx, (numeric) the amount of value in the note\n" " \"memo\": xxxxx, (string) hexademical string representation of memo field\n" " \"change\": true|false, (boolean) true if the address that received the note is also one of the sending addresses\n" + " \"nullifier\": xxxxx, (string) the note's nullifier, hex encoded" " }\n" " ,...\n" "]\n" @@ -639,6 +640,10 @@ UniValue listshieldedunspent(const JSONRPCRequest& request) if (hasSaplingSpendingKey) { obj.pushKV("change", pwalletMain->GetSaplingScriptPubKeyMan()->IsNoteSaplingChange(nullifierSet, entry.address, entry.op)); } + const auto& nd = pwalletMain->mapWallet.at(entry.op.hash).mapSaplingNoteData.at(entry.op); + if (nd.nullifier) { + obj.pushKV("nullifier", nd.nullifier->ToString()); + } results.push_back(obj); } } From b1133c462a4a719926aa2b320bbd2bf7a5d1869b Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 10 Dec 2020 01:42:17 +0100 Subject: [PATCH 08/86] [Tests] Check spent nullifier in sapling_wallet_listreceived Github-Pull: #2049 Rebased-From: e4896771f415254b38bf93529641de77ccacc77b --- test/functional/sapling_wallet_listreceived.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/functional/sapling_wallet_listreceived.py b/test/functional/sapling_wallet_listreceived.py index 0f5e3121e68bd..afcf6ff97714d 100755 --- a/test/functional/sapling_wallet_listreceived.py +++ b/test/functional/sapling_wallet_listreceived.py @@ -120,6 +120,11 @@ def run_test(self): # Now can check that the information is the same assert_equal(r, r2) + # Get the note nullifier + lsu = self.nodes[1].listshieldedunspent(); + assert_equal(len(lsu), 1) + nullifier = lsu[0]["nullifier"] + # Generate some change by sending part of shield_addr1 to shield_addr2 txidPrev = txid shield_addr2 = self.nodes[1].getnewshieldedaddress() @@ -129,6 +134,10 @@ def run_test(self): self.sync_all() self.generate_and_sync(height+4) + # Verify the spent nullifier + tx_json = self.nodes[1].getrawtransaction(txid, True) + assert_equal(nullifier, tx_json["vShieldedSpend"][0]["nullifier"]) + # Decrypted transaction details should be correct pt = self.nodes[1].viewshieldedtransaction(txid) assert_equal(pt['txid'], txid) From ac8d818c0ec6276a5d6dae7ba2752c27c4b7f555 Mon Sep 17 00:00:00 2001 From: furszy Date: Wed, 9 Dec 2020 19:47:02 -0300 Subject: [PATCH 09/86] [Wallet] BugFix: automatic upgrade for unlocked wallet isn't upgrading the wallet feature version. Github-Pull: #2048 Rebased-From: 1325cea73e5103e1d3ca3236214c227b05b6f20e --- src/wallet/wallet.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 25882c3f8a297..a4a1f2462a628 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -86,6 +86,11 @@ bool CWallet::ActivateSaplingWallet(bool memOnly) { if (m_sspk_man->SetupGeneration(m_spk_man->GetHDChain().GetID(), true, memOnly)) { LogPrintf("%s : sapling spkm setup completed\n", __func__); + // Just to be triple sure, if the version isn't updated, set it. + if (!SetMinVersion(WalletFeature::FEATURE_SAPLING)) { + LogPrintf("%s : ERROR: wallet cannot upgrade to sapling features. Try to upgrade using the 'upgradewallet' RPC command\n", __func__); + return false; + } return true; } return false; @@ -4002,7 +4007,8 @@ CWallet* CWallet::CreateWalletFromFile(const std::string walletFile) // Forced upgrade const bool fLegacyWallet = gArgs.GetBoolArg("-legacywallet", false); - if (gArgs.GetBoolArg("-upgradewallet", fFirstRun && !fLegacyWallet)) { + if (gArgs.GetBoolArg("-upgradewallet", fFirstRun && !fLegacyWallet) || + (!walletInstance->IsLocked() && prev_version == FEATURE_PRE_SPLIT_KEYPOOL)) { if (prev_version <= FEATURE_PRE_PIVX && walletInstance->IsLocked()) { // Cannot upgrade a locked wallet UIError("Cannot upgrade a locked wallet."); From 38895a927ac60ddb950eecb762b96d098a88ea41 Mon Sep 17 00:00:00 2001 From: "Bernhard M. Wiedemann" Date: Mon, 23 Apr 2018 23:57:21 +0200 Subject: [PATCH 10/86] Make tests pass after 2020 also test that 64 bit integers are properly handled Github-Pull: #2059 Rebased-From: e0ba82b213ed5142b6a9b7ecbe561f0ceb60d8b7 --- src/test/rpc_tests.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp index e2caa67ec7d78..042c2316cfedf 100644 --- a/src/test/rpc_tests.cpp +++ b/src/test/rpc_tests.cpp @@ -221,14 +221,14 @@ BOOST_AUTO_TEST_CASE(rpc_ban) ar = r.get_array(); BOOST_CHECK_EQUAL(ar.size(), 0); - BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 127.0.0.0/24 add 1607731200 true"))); + BOOST_CHECK_NO_THROW(r = CallRPC(std::string("setban 127.0.0.0/24 add 9907731200 true"))); BOOST_CHECK_NO_THROW(r = CallRPC(std::string("listbanned"))); ar = r.get_array(); o1 = ar[0].get_obj(); adr = find_value(o1, "address"); UniValue banned_until = find_value(o1, "banned_until"); BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/24"); - BOOST_CHECK_EQUAL(banned_until.get_int64(), 1607731200); // absolute time check + BOOST_CHECK_EQUAL(banned_until.get_int64(), 9907731200); // absolute time check BOOST_CHECK_NO_THROW(CallRPC(std::string("clearbanned"))); From aff68db238eb697488f6cadad6b882f4f2ac9a0d Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 12:37:28 -0300 Subject: [PATCH 11/86] [GUI] Transaction detail, scroll memo fix, starting from the top. Github-Pull: #2055 Rebased-From: 711af223ad8d6e57df5be6477a904da1138becb6 --- src/qt/pivx/sendconfirmdialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/qt/pivx/sendconfirmdialog.cpp b/src/qt/pivx/sendconfirmdialog.cpp index a8b11b0a83864..68bf7bb895f89 100644 --- a/src/qt/pivx/sendconfirmdialog.cpp +++ b/src/qt/pivx/sendconfirmdialog.cpp @@ -140,6 +140,8 @@ void TxDetailDialog::setData(WalletModel *_model, const QModelIndex &index) ui->contentMemo->setVisible(true); ui->labelDividerMemo->setVisible(true); ui->textMemo->adjustSize(); + ui->textMemo->moveCursor(QTextCursor::Start); + ui->textMemo->ensureCursorVisible(); } else { ui->contentMemo->setVisible(false); ui->labelDividerMemo->setVisible(false); @@ -211,6 +213,8 @@ void TxDetailDialog::setData(WalletModel *_model, WalletModelTransaction* _tx) ui->textMemo->insertPlainText(recipient.message); ui->contentMemo->setVisible(true); ui->labelDividerMemo->setVisible(true); + ui->textMemo->moveCursor(QTextCursor::Start); + ui->textMemo->ensureCursorVisible(); } else { ui->contentMemo->setVisible(false); ui->labelDividerMemo->setVisible(false); From 6baf3770740a4850bb570aee480e53b62ba17dc8 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 11:54:04 -0300 Subject: [PATCH 12/86] Make failures to connect via Socks5() more informative and less unnecessarily scary. * The "ERROR" was printed far too often during normal operation for what was not an error. Coming from btc@00678bdb0aeb296456501f818faaa012a75ce18e Github-Pull: #2054 Rebased-From: 097322c43ce0f56af7a6032d61d0bf3b751f30ae --- src/netbase.cpp | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/netbase.cpp b/src/netbase.cpp index 0e478bded0743..60307e77404ab 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -404,27 +404,21 @@ bool static Socks5(std::string strDest, int port, const ProxyCredentials *auth, return error("Proxy failed to accept request"); } if (pchRet2[1] != 0x00) { + // Failures to connect to a peer that are not proxy errors CloseSocket(hSocket); - switch (pchRet2[1]) { - case 0x01: - return error("Proxy error: general failure"); - case 0x02: - return error("Proxy error: connection not allowed"); - case 0x03: - return error("Proxy error: network unreachable"); - case 0x04: - return error("Proxy error: host unreachable"); - case 0x05: - return error("Proxy error: connection refused"); - case 0x06: - return error("Proxy error: TTL expired"); - case 0x07: - return error("Proxy error: protocol error"); - case 0x08: - return error("Proxy error: address type not supported"); - default: - return error("Proxy error: unknown"); + switch (pchRet2[1]) + { + case 0x01: LogPrintf("Socks5() connect to %s:%d failed: general failure\n", strDest, port); break; + case 0x02: LogPrintf("Socks5() connect to %s:%d failed: connection not allowed\n", strDest, port); break; + case 0x03: LogPrintf("Socks5() connect to %s:%d failed: network unreachable\n", strDest, port); break; + case 0x04: LogPrintf("Socks5() connect to %s:%d failed: host unreachable\n", strDest, port); break; + case 0x05: LogPrintf("Socks5() connect to %s:%d failed: connection refused\n", strDest, port); break; + case 0x06: LogPrintf("Socks5() connect to %s:%d failed: TTL expired\n", strDest, port); break; + case 0x07: LogPrintf("Socks5() connect to %s:%d failed: protocol error\n", strDest, port); break; + case 0x08: LogPrintf("Socks5() connect to %s:%d failed: address type not supported\n", strDest, port); break; + default: LogPrintf("Socks5() connect to %s:%d failed: unknown\n", strDest, port); } + return false; } if (pchRet2[2] != 0x00) { CloseSocket(hSocket); From 7eefabaca50d4a6a4a021a848571a40d50e675e1 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 11:55:39 -0300 Subject: [PATCH 13/86] SOCKS5 connecting and connected messages with -debug=net. They were too noisy and not necessary for normal operation. Coming from btc@0d9af79e5084dc2fb6a73abd9dd113dda4e993b4 Github-Pull: #2054 Rebased-From: 2027d66020a2a267dddd9c15a94e3a764e2d86ce --- src/netbase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/netbase.cpp b/src/netbase.cpp index 60307e77404ab..03fb88ce7df04 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -312,7 +312,7 @@ struct ProxyCredentials bool static Socks5(std::string strDest, int port, const ProxyCredentials *auth, SOCKET& hSocket) { IntrRecvError recvr; - LogPrintf("SOCKS5 connecting %s\n", strDest); + LogPrint(BCLog::NET, "SOCKS5 connecting %s\n", strDest); if (strDest.size() > 255) { CloseSocket(hSocket); return error("Hostname too long"); @@ -454,7 +454,7 @@ bool static Socks5(std::string strDest, int port, const ProxyCredentials *auth, CloseSocket(hSocket); return error("Error reading from proxy"); } - LogPrintf("SOCKS5 connected %s\n", strDest); + LogPrint(BCLog::NET, "SOCKS5 connected %s\n", strDest); return true; } From 2e237401e2eee553059e088f9b55e40f46c14ba9 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 11:57:41 -0300 Subject: [PATCH 14/86] Make Socks5() InterruptibleRecv() timeout/failures informative. Before: ERROR: Error reading proxy response Coming from btc@94fd1d8d53adceb80e5a41cc6438c7704aeac0f7 Github-Pull: #2054 Rebased-From: fdec2e3c0f7241daa07e2822a8a944db15e7a0c6 --- src/netbase.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/netbase.cpp b/src/netbase.cpp index 03fb88ce7df04..1276885732394 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -336,7 +336,8 @@ bool static Socks5(std::string strDest, int port, const ProxyCredentials *auth, char pchRet1[2]; if ((recvr = InterruptibleRecv(pchRet1, 2, SOCKS5_RECV_TIMEOUT, hSocket)) != IntrRecvError::OK) { CloseSocket(hSocket); - return error("Error reading proxy response"); + LogPrintf("Socks5() connect to %s:%d failed: InterruptibleRecv() timeout or other failure\n", strDest, port); + return false; } if (pchRet1[0] != 0x05) { CloseSocket(hSocket); From e9469b10b2e0518967c725b485da0c7943d1f2f0 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 11:59:29 -0300 Subject: [PATCH 15/86] Use Socks5ErrorString() to decode error responses from socks proxy. Coming from btc@bf9266e017b286c36e08fd09b91d9e39f14b2cf3 Github-Pull: #2054 Rebased-From: a1b0017e69be1400e3f400c5473b678ebbc15fad --- src/netbase.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/netbase.cpp b/src/netbase.cpp index 1276885732394..30f595462e5f8 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -308,6 +308,21 @@ struct ProxyCredentials std::string password; }; +std::string static Socks5ErrorString(int err) +{ + switch(err) { + case 0x01: return "general failure"; + case 0x02: return "connection not allowed"; + case 0x03: return "network unreachable"; + case 0x04: return "host unreachable"; + case 0x05: return "connection refused"; + case 0x06: return "TTL expired"; + case 0x07: return "protocol error"; + case 0x08: return "address type not supported"; + default: return "unknown"; + } +} + /** Connect using SOCKS5 (as described in RFC1928) */ bool static Socks5(std::string strDest, int port, const ProxyCredentials *auth, SOCKET& hSocket) { @@ -407,18 +422,7 @@ bool static Socks5(std::string strDest, int port, const ProxyCredentials *auth, if (pchRet2[1] != 0x00) { // Failures to connect to a peer that are not proxy errors CloseSocket(hSocket); - switch (pchRet2[1]) - { - case 0x01: LogPrintf("Socks5() connect to %s:%d failed: general failure\n", strDest, port); break; - case 0x02: LogPrintf("Socks5() connect to %s:%d failed: connection not allowed\n", strDest, port); break; - case 0x03: LogPrintf("Socks5() connect to %s:%d failed: network unreachable\n", strDest, port); break; - case 0x04: LogPrintf("Socks5() connect to %s:%d failed: host unreachable\n", strDest, port); break; - case 0x05: LogPrintf("Socks5() connect to %s:%d failed: connection refused\n", strDest, port); break; - case 0x06: LogPrintf("Socks5() connect to %s:%d failed: TTL expired\n", strDest, port); break; - case 0x07: LogPrintf("Socks5() connect to %s:%d failed: protocol error\n", strDest, port); break; - case 0x08: LogPrintf("Socks5() connect to %s:%d failed: address type not supported\n", strDest, port); break; - default: LogPrintf("Socks5() connect to %s:%d failed: unknown\n", strDest, port); - } + LogPrintf("Socks5() connect to %s:%d failed: %s\n", strDest, port, Socks5ErrorString(pchRet2[1])); return false; } if (pchRet2[2] != 0x00) { From bbc3a7e79fe466ff6acf475d5080a7aa33e78cb1 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 12:07:26 -0300 Subject: [PATCH 16/86] Revert "Use async name resolving to improve net thread responsiveness" Coming from btc@10ae7a7b2316f8052ec58ef237ce6dd987300900 Github-Pull: #2054 Rebased-From: f62d152ced39c87cd2f15af4df49b1960001fa68 --- src/netbase.cpp | 48 +----------------------------------------------- 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/src/netbase.cpp b/src/netbase.cpp index 30f595462e5f8..1c11a6d5b0217 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -94,30 +94,9 @@ bool static LookupIntern(const char* pszName, std::vector& vIP, unsign } } -#ifdef HAVE_GETADDRINFO_A - struct in_addr ipv4_addr; -#ifdef HAVE_INET_PTON - if (inet_pton(AF_INET, pszName, &ipv4_addr) > 0) { - vIP.emplace_back(ipv4_addr); - return true; - } - - struct in6_addr ipv6_addr; - if (inet_pton(AF_INET6, pszName, &ipv6_addr) > 0) { - vIP.emplace_back(ipv6_addr); - return true; - } -#else - ipv4_addr.s_addr = inet_addr(pszName); - if (ipv4_addr.s_addr != INADDR_NONE) { - vIP.emplace_back(ipv4_addr); - return true; - } -#endif -#endif - struct addrinfo aiHint; memset(&aiHint, 0, sizeof(struct addrinfo)); + aiHint.ai_socktype = SOCK_STREAM; aiHint.ai_protocol = IPPROTO_TCP; aiHint.ai_family = AF_UNSPEC; @@ -126,33 +105,8 @@ bool static LookupIntern(const char* pszName, std::vector& vIP, unsign #else aiHint.ai_flags = fAllowLookup ? AI_ADDRCONFIG : AI_NUMERICHOST; #endif - struct addrinfo* aiRes = NULL; -#ifdef HAVE_GETADDRINFO_A - struct gaicb gcb, *query = &gcb; - memset(query, 0, sizeof(struct gaicb)); - gcb.ar_name = pszName; - gcb.ar_request = &aiHint; - int nErr = getaddrinfo_a(GAI_NOWAIT, &query, 1, NULL); - if (nErr) - return false; - - do { - // Should set the timeout limit to a resonable value to avoid - // generating unnecessary checking call during the polling loop, - // while it can still response to stop request quick enough. - // 2 seconds looks fine in our situation. - struct timespec ts = {2, 0}; - gai_suspend(&query, 1, &ts); - boost::this_thread::interruption_point(); - - nErr = gai_error(query); - if (0 == nErr) - aiRes = query->ar_result; - } while (nErr == EAI_INPROGRESS); -#else int nErr = getaddrinfo(pszName, NULL, &aiHint, &aiRes); -#endif if (nErr) return false; From d4b8a329d900bfd569beb0b39e9f9a5de1e6ff39 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 12:11:46 -0300 Subject: [PATCH 17/86] [net] Avoid initialization to a value that is never read Prior to this commit the value stored to `s` at initialization was never read (in the case of STRERROR_R_CHAR_P). Coming from btc@58446094519151e2e203944267e592eec2470643 Github-Pull: #2054 Rebased-From: d46b3694896bb556de82fb266a9353e382eb8943 --- src/netbase.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/netbase.cpp b/src/netbase.cpp index 1c11a6d5b0217..934dc38846c48 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -663,13 +663,14 @@ std::string NetworkErrorString(int err) std::string NetworkErrorString(int err) { char buf[256]; - const char* s = buf; buf[0] = 0; /* Too bad there are two incompatible implementations of the * thread-safe strerror. */ + const char *s; #ifdef STRERROR_R_CHAR_P /* GNU variant can return a pointer outside the passed buffer */ s = strerror_r(err, buf, sizeof(buf)); #else /* POSIX variant always returns message in buffer */ + s = buf; if (strerror_r(err, buf, sizeof(buf))) buf[0] = 0; #endif From 77a3959f24857091e81af94d3e750925060b6cb1 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 12:51:37 -0300 Subject: [PATCH 18/86] [Masternode] Cache decoded Masternode private key Github-Pull: #2056 Rebased-From: 0a519bb0aafc4a32d0590165c44f543b27dccea9 --- src/activemasternode.cpp | 3 ++- src/activemasternode.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index 20df68b6e0299..3f6d61e8d2689 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -56,11 +56,12 @@ OperationResult initMasternode(const std::string& _strMasterNodePrivKey, const s CKey key; CPubKey pubkey; - if (!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, key, pubkey)) { return errorOut(_("Invalid masternodeprivkey. Please see the documentation.")); } + activeMasternode.pubKeyMasternode = pubkey; + activeMasternode.privKeyMasternode = key; fMasterNode = true; return OperationResult(true); } diff --git a/src/activemasternode.h b/src/activemasternode.h index d05d4844d745e..2f596bf6f3df1 100644 --- a/src/activemasternode.h +++ b/src/activemasternode.h @@ -40,6 +40,7 @@ class CActiveMasternode // Initialized by init.cpp // Keys for the main Masternode CPubKey pubKeyMasternode; + CKey privKeyMasternode; // Initialized while registering Masternode Optional vin; From 83080eac21dca124eb50913b47c44c43fcbd9cff Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 12:54:57 -0300 Subject: [PATCH 19/86] [Masternode] Stop parsing the masternode private key string on every ping. We are already caching it. Github-Pull: #2056 Rebased-From: c4562021b38588f02fc2a0980f8492fe1310d216 --- src/activemasternode.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index 3f6d61e8d2689..849dcc2bf8570 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -170,11 +170,8 @@ bool CActiveMasternode::SendMasternodePing(std::string& errorMessage) return false; } - CPubKey pubKeyMasternode; - CKey keyMasternode; - - if (!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, keyMasternode, pubKeyMasternode)) { - errorMessage = "Error upon calling GetKeysFromSecret.\n"; + if (!privKeyMasternode.IsValid() || !pubKeyMasternode.IsValid()) { + errorMessage = "Error upon masternode key.\n"; return false; } @@ -182,7 +179,7 @@ bool CActiveMasternode::SendMasternodePing(std::string& errorMessage) const uint256& nBlockHash = mnodeman.GetBlockHashToPing(); CMasternodePing mnp(*vin, nBlockHash); - if (!mnp.Sign(keyMasternode, pubKeyMasternode)) { + if (!mnp.Sign(privKeyMasternode, pubKeyMasternode)) { errorMessage = "Couldn't sign Masternode Ping"; return false; } From 8a88cd9acf7666f0e9ffda915e4d8f9a1f5c98e0 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 12:58:33 -0300 Subject: [PATCH 20/86] [Masternode] Stop parsing the MN private key string on every finalized budget vote. We are already caching it. [Masternode] CMasternodePayments::ProcessBlock, stop parsing the masternode private key string. Stop parsing strMasterNodePrivKey when we already have it parsed in mnfinalbudget and mnbudgetvote Github-Pull: #2056 Rebased-From: 329e6ef631195148acd90d477babcf928d95f0c9 --- src/activemasternode.cpp | 10 ++++++++++ src/activemasternode.h | 2 ++ src/budget/budgetmanager.cpp | 3 +-- src/masternode-payments.cpp | 7 ++----- src/rpc/budget.cpp | 9 ++++----- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index 849dcc2bf8570..90b40cb2aed18 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -232,3 +232,13 @@ bool CActiveMasternode::EnableHotColdMasterNode(CTxIn& newVin, CService& newServ return true; } + +bool CActiveMasternode::GetKeys(CKey& _privKeyMasternode, CPubKey& _pubKeyMasternode) +{ + if (!privKeyMasternode.IsValid() || !pubKeyMasternode.IsValid()) { + return error("Error trying to get masternode keys"); + } + _privKeyMasternode = privKeyMasternode; + _pubKeyMasternode = pubKeyMasternode; + return true; +} diff --git a/src/activemasternode.h b/src/activemasternode.h index 2f596bf6f3df1..4a611ba977ca1 100644 --- a/src/activemasternode.h +++ b/src/activemasternode.h @@ -56,6 +56,8 @@ class CActiveMasternode bool SendMasternodePing(std::string& errorMessage); /// Enable cold wallet mode (run a Masternode with no funds) bool EnableHotColdMasterNode(CTxIn& vin, CService& addr); + + bool GetKeys(CKey& privKeyMasternode, CPubKey& pubKeyMasternode); }; #endif diff --git a/src/budget/budgetmanager.cpp b/src/budget/budgetmanager.cpp index cae091d82d097..339ecb31e3ecb 100644 --- a/src/budget/budgetmanager.cpp +++ b/src/budget/budgetmanager.cpp @@ -500,8 +500,7 @@ void CBudgetManager::VoteOnFinalizedBudgets() // Get masternode keys CPubKey pubKeyMasternode; CKey keyMasternode; - if (!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, keyMasternode, pubKeyMasternode)) { - LogPrintf("%s: Unable to get masternode keys\n", __func__); + if (!activeMasternode.GetKeys(keyMasternode, pubKeyMasternode)) { return; } // Sign finalized budgets diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index 8d60ef1792614..894ce0e95d2c4 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -680,11 +680,8 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight) } } - std::string errorMessage; - CPubKey pubKeyMasternode; - CKey keyMasternode; - - if (!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, keyMasternode, pubKeyMasternode)) { + CPubKey pubKeyMasternode; CKey keyMasternode; + if (!activeMasternode.GetKeys(keyMasternode, pubKeyMasternode)) { LogPrint(BCLog::MASTERNODE,"CMasternodePayments::ProcessBlock() - Error upon calling GetKeysFromSecret.\n"); return false; } diff --git a/src/rpc/budget.cpp b/src/rpc/budget.cpp index d1ea19378ac04..d3c569c3a7337 100644 --- a/src/rpc/budget.cpp +++ b/src/rpc/budget.cpp @@ -273,7 +273,7 @@ UniValue mnbudgetvote(const JSONRPCRequest& request) UniValue statusObj(UniValue::VOBJ); while (true) { - if (!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, keyMasternode, pubKeyMasternode)) { + if (!activeMasternode.GetKeys(keyMasternode, pubKeyMasternode)) { failed++; statusObj.pushKV("node", "local"); statusObj.pushKV("result", "failed"); @@ -816,11 +816,10 @@ UniValue mnfinalbudget(const JSONRPCRequest& request) std::string strHash = request.params[1].get_str(); uint256 hash(uint256S(strHash)); - CPubKey pubKeyMasternode; - CKey keyMasternode; - - if (!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, keyMasternode, pubKeyMasternode)) + CPubKey pubKeyMasternode; CKey keyMasternode; + if (!activeMasternode.GetKeys(keyMasternode, pubKeyMasternode)) { return "Error upon calling GetKeysFromSecret"; + } CMasternode* pmn = mnodeman.Find(activeMasternode.vin->prevout); if (pmn == NULL) { From 545ca7745de37f860e083a2b2ead676838d963ae Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 11 Dec 2020 13:06:16 -0300 Subject: [PATCH 21/86] [Masternode] Clean now unused global strMasterNodePrivKey. Github-Pull: #2056 Rebased-From: 9e18f86ec8902c24f772d338c697b7b0991388ae --- src/activemasternode.cpp | 3 +-- src/masternodeman.h | 1 - src/util.cpp | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index 90b40cb2aed18..887268d65acaa 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -33,7 +33,6 @@ OperationResult initMasternode(const std::string& _strMasterNodePrivKey, const s // Global params set strMasterNodeAddr = _strMasterNodeAddr; - strMasterNodePrivKey = _strMasterNodePrivKey; // Address parsing. const CChainParams& params = Params(); @@ -56,7 +55,7 @@ OperationResult initMasternode(const std::string& _strMasterNodePrivKey, const s CKey key; CPubKey pubkey; - if (!CMessageSigner::GetKeysFromSecret(strMasterNodePrivKey, key, pubkey)) { + if (!CMessageSigner::GetKeysFromSecret(_strMasterNodePrivKey, key, pubkey)) { return errorOut(_("Invalid masternodeprivkey. Please see the documentation.")); } diff --git a/src/masternodeman.h b/src/masternodeman.h index 9030d2d238653..62b9da2cd0efd 100644 --- a/src/masternodeman.h +++ b/src/masternodeman.h @@ -26,7 +26,6 @@ class CActiveMasternode; extern CMasternodeMan mnodeman; extern CActiveMasternode activeMasternode; -extern std::string strMasterNodePrivKey; void DumpMasternodes(); diff --git a/src/util.cpp b/src/util.cpp index 6ed16bbafeae4..0ef573ca4913f 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -90,7 +90,6 @@ const char * const PIVX_MASTERNODE_CONF_FILENAME = "masternode.conf"; // PIVX only features // Masternode std::atomic fMasterNode{false}; -std::string strMasterNodePrivKey = ""; std::string strMasterNodeAddr = ""; bool fLiteMode = false; From 626170ec9dcfc51bc01b64b16ee6dcc86d5c5719 Mon Sep 17 00:00:00 2001 From: furszy Date: Sun, 13 Dec 2020 20:44:56 -0300 Subject: [PATCH 22/86] [Masternde] Refactor activeMasternode.GetKeys callers to not expect a bool. Github-Pull: #2056 Rebased-From: 89cc58301c9077190298fe6cc0b3c780478a6b99 --- src/activemasternode.cpp | 5 ++--- src/activemasternode.h | 2 +- src/budget/budgetmanager.cpp | 5 ++--- src/masternode-payments.cpp | 5 +---- src/rpc/budget.cpp | 14 +++----------- 5 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index 887268d65acaa..b21271707be10 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -232,12 +232,11 @@ bool CActiveMasternode::EnableHotColdMasterNode(CTxIn& newVin, CService& newServ return true; } -bool CActiveMasternode::GetKeys(CKey& _privKeyMasternode, CPubKey& _pubKeyMasternode) +void CActiveMasternode::GetKeys(CKey& _privKeyMasternode, CPubKey& _pubKeyMasternode) { if (!privKeyMasternode.IsValid() || !pubKeyMasternode.IsValid()) { - return error("Error trying to get masternode keys"); + throw std::runtime_error("Error trying to get masternode keys"); } _privKeyMasternode = privKeyMasternode; _pubKeyMasternode = pubKeyMasternode; - return true; } diff --git a/src/activemasternode.h b/src/activemasternode.h index 4a611ba977ca1..cfa4351d3756c 100644 --- a/src/activemasternode.h +++ b/src/activemasternode.h @@ -57,7 +57,7 @@ class CActiveMasternode /// Enable cold wallet mode (run a Masternode with no funds) bool EnableHotColdMasterNode(CTxIn& vin, CService& addr); - bool GetKeys(CKey& privKeyMasternode, CPubKey& pubKeyMasternode); + void GetKeys(CKey& privKeyMasternode, CPubKey& pubKeyMasternode); }; #endif diff --git a/src/budget/budgetmanager.cpp b/src/budget/budgetmanager.cpp index 339ecb31e3ecb..d04bb2e29ed77 100644 --- a/src/budget/budgetmanager.cpp +++ b/src/budget/budgetmanager.cpp @@ -500,9 +500,8 @@ void CBudgetManager::VoteOnFinalizedBudgets() // Get masternode keys CPubKey pubKeyMasternode; CKey keyMasternode; - if (!activeMasternode.GetKeys(keyMasternode, pubKeyMasternode)) { - return; - } + activeMasternode.GetKeys(keyMasternode, pubKeyMasternode); + // Sign finalized budgets for (const uint256& budgetHash: vBudgetHashes) { CFinalizedBudgetVote vote(*(activeMasternode.vin), budgetHash); diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index 894ce0e95d2c4..5c283ece3c80d 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -681,10 +681,7 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight) } CPubKey pubKeyMasternode; CKey keyMasternode; - if (!activeMasternode.GetKeys(keyMasternode, pubKeyMasternode)) { - LogPrint(BCLog::MASTERNODE,"CMasternodePayments::ProcessBlock() - Error upon calling GetKeysFromSecret.\n"); - return false; - } + activeMasternode.GetKeys(keyMasternode, pubKeyMasternode); LogPrint(BCLog::MASTERNODE,"CMasternodePayments::ProcessBlock() - Signing Winner\n"); if (newWinner.Sign(keyMasternode, pubKeyMasternode)) { diff --git a/src/rpc/budget.cpp b/src/rpc/budget.cpp index d3c569c3a7337..9eebc048e5717 100644 --- a/src/rpc/budget.cpp +++ b/src/rpc/budget.cpp @@ -273,14 +273,8 @@ UniValue mnbudgetvote(const JSONRPCRequest& request) UniValue statusObj(UniValue::VOBJ); while (true) { - if (!activeMasternode.GetKeys(keyMasternode, pubKeyMasternode)) { - failed++; - statusObj.pushKV("node", "local"); - statusObj.pushKV("result", "failed"); - statusObj.pushKV("error", "Masternode signing error, GetKeysFromSecret failed."); - resultsObj.push_back(statusObj); - break; - } + // Get MN keys + activeMasternode.GetKeys(keyMasternode, pubKeyMasternode); CMasternode* pmn = mnodeman.Find(activeMasternode.vin->prevout); if (pmn == NULL) { @@ -817,9 +811,7 @@ UniValue mnfinalbudget(const JSONRPCRequest& request) uint256 hash(uint256S(strHash)); CPubKey pubKeyMasternode; CKey keyMasternode; - if (!activeMasternode.GetKeys(keyMasternode, pubKeyMasternode)) { - return "Error upon calling GetKeysFromSecret"; - } + activeMasternode.GetKeys(keyMasternode, pubKeyMasternode); CMasternode* pmn = mnodeman.Find(activeMasternode.vin->prevout); if (pmn == NULL) { From 76ae626b375a6035b7e2b240edc735d1b74d7155 Mon Sep 17 00:00:00 2001 From: furszy Date: Sat, 12 Dec 2020 12:21:34 -0300 Subject: [PATCH 23/86] [Validation] Remove unused ReprocessBlocks function. Github-Pull: #2058 Rebased-From: c406568a884e39b32226c1d5fbd82f9bfa7306f3 --- src/validation.cpp | 31 ------------------------------- src/validation.h | 1 - 2 files changed, 32 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index ab1a007654add..6a5e790490ae6 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2108,37 +2108,6 @@ bool DisconnectBlocks(int nBlocks, const CChainParams& chainparams) return true; } -void ReprocessBlocks(int nBlocks, const CChainParams& chainparams) -{ - std::map::iterator it = mapRejectedBlocks.begin(); - while (it != mapRejectedBlocks.end()) { - //use a window twice as large as is usual for the nBlocks we want to reset - if ((*it).second > GetTime() - (nBlocks * Params().GetConsensus().nTargetSpacing * 2)) { - BlockMap::iterator mi = mapBlockIndex.find((*it).first); - if (mi != mapBlockIndex.end() && (*mi).second) { - LOCK(cs_main); - - CBlockIndex* pindex = (*mi).second; - LogPrintf("%s - %s\n", __func__, (*it).first.ToString()); - - CValidationState state; - ReconsiderBlock(state, pindex); - } - } - ++it; - } - - CValidationState state; - { - LOCK(cs_main); - DisconnectBlocks(nBlocks, chainparams); - } - - if (state.IsValid()) { - ActivateBestChain(state); - } -} - /** * Return the tip of the chain with the most work in it, that isn't * known to be invalid (it's however far from certain to be valid). diff --git a/src/validation.h b/src/validation.h index 39d6b993bf08e..62761aac77f84 100644 --- a/src/validation.h +++ b/src/validation.h @@ -331,7 +331,6 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex /** Reprocess a number of blocks to try and get on the correct chain again **/ bool DisconnectBlocks(int nBlocks, const CChainParams& chainparams); -void ReprocessBlocks(int nBlocks, const CChainParams& chainparams); /** Apply the effects of this block (with given index) on the UTXO set represented by coins */ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck, bool fAlreadyChecked = false); From 5a33bb1ca812e4498bfe1398da961ac4f92731c6 Mon Sep 17 00:00:00 2001 From: furszy Date: Sat, 12 Dec 2020 12:23:57 -0300 Subject: [PATCH 24/86] [Validation] Remove unused DisconnectBlocks function. Github-Pull: #2058 Rebased-From: 544b6bc18f508afcd54b93c3c978cec6f226515d --- src/validation.cpp | 13 ------------- src/validation.h | 3 --- 2 files changed, 16 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 6a5e790490ae6..3b9fc3bacf1b3 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2095,19 +2095,6 @@ bool static ConnectTip(CValidationState& state, CBlockIndex* pindexNew, const st return true; } -bool DisconnectBlocks(int nBlocks, const CChainParams& chainparams) -{ - LOCK(cs_main); - - CValidationState state; - - LogPrintf("%s: Got command to replay %d blocks\n", __func__, nBlocks); - for (int i = 0; i <= nBlocks; i++) - DisconnectTip(state, chainparams); - - return true; -} - /** * Return the tip of the chain with the most work in it, that isn't * known to be invalid (it's however far from certain to be valid). diff --git a/src/validation.h b/src/validation.h index 62761aac77f84..ffc624cf6bac0 100644 --- a/src/validation.h +++ b/src/validation.h @@ -329,9 +329,6 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex); * of problems. Note that in any case, coins may be modified. */ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool* pfClean = NULL); -/** Reprocess a number of blocks to try and get on the correct chain again **/ -bool DisconnectBlocks(int nBlocks, const CChainParams& chainparams); - /** Apply the effects of this block (with given index) on the UTXO set represented by coins */ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck, bool fAlreadyChecked = false); From 974b965ec291de97391d3542fe6aa59939c46fd5 Mon Sep 17 00:00:00 2001 From: furszy Date: Sat, 12 Dec 2020 12:26:31 -0300 Subject: [PATCH 25/86] [Validation] Remove unused DisconnectBlock function definition. Github-Pull: #2058 Rebased-From: ca3a1e6567c5d0abbb7fc6a449167e5972bb3734 --- src/validation.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/validation.h b/src/validation.h index ffc624cf6bac0..cd19d4db5dcb3 100644 --- a/src/validation.h +++ b/src/validation.h @@ -323,12 +323,6 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex); /** Functions for validating blocks and updating the block tree */ -/** Undo the effects of this block (with given index) on the UTXO set represented by coins. - * In case pfClean is provided, operation will try to be tolerant about errors, and *pfClean - * will be true if no problems were found. Otherwise, the return value will be false in case - * of problems. Note that in any case, coins may be modified. */ -bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool* pfClean = NULL); - /** Apply the effects of this block (with given index) on the UTXO set represented by coins */ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck, bool fAlreadyChecked = false); From 1ca9476aae0659fe3f1af777716404c2cf3a2a92 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sat, 12 Dec 2020 18:38:30 +0100 Subject: [PATCH 26/86] MN: pass lastPing to CMasternodeBroadcast constructor Github-Pull: #2060 Rebased-From: cf6ef9b1f261d2249561ba3fbc7cbadd1cc0742c --- src/masternode.cpp | 7 ++++--- src/masternode.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/masternode.cpp b/src/masternode.cpp index 275b83e3713c0..1efd69b19c78e 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -206,7 +206,7 @@ CMasternodeBroadcast::CMasternodeBroadcast() : CMasternode() { } -CMasternodeBroadcast::CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey pubKeyCollateralAddressNew, CPubKey pubKeyMasternodeNew, int protocolVersionIn) : +CMasternodeBroadcast::CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey pubKeyCollateralAddressNew, CPubKey pubKeyMasternodeNew, int protocolVersionIn, const CMasternodePing& _lastPing) : CMasternode() { vin = newVin; @@ -214,6 +214,8 @@ CMasternodeBroadcast::CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubK pubKeyCollateralAddress = pubKeyCollateralAddressNew; pubKeyMasternode = pubKeyMasternodeNew; protocolVersion = protocolVersionIn; + lastPing = _lastPing; + sigTime = lastPing.sigTime; } CMasternodeBroadcast::CMasternodeBroadcast(const CMasternode& mn) : @@ -294,7 +296,7 @@ bool CMasternodeBroadcast::Create(const CTxIn& txin, return false; } - mnbRet = CMasternodeBroadcast(service, txin, pubKeyCollateralAddressNew, pubKeyMasternodeNew, PROTOCOL_VERSION); + mnbRet = CMasternodeBroadcast(service, txin, pubKeyCollateralAddressNew, pubKeyMasternodeNew, PROTOCOL_VERSION, mnp); if (!mnbRet.IsValidNetAddr()) { strErrorRet = strprintf("Invalid IP address %s, masternode=%s", mnbRet.addr.ToStringIP (), txin.prevout.hash.ToString()); @@ -303,7 +305,6 @@ bool CMasternodeBroadcast::Create(const CTxIn& txin, return false; } - mnbRet.lastPing = mnp; if (!mnbRet.Sign(keyCollateralAddressNew, pubKeyCollateralAddressNew)) { strErrorRet = strprintf("Failed to sign broadcast, masternode=%s", txin.prevout.hash.ToString()); LogPrint(BCLog::MASTERNODE,"CMasternodeBroadcast::Create -- %s\n", strErrorRet); diff --git a/src/masternode.h b/src/masternode.h index 2d3bf70a44669..b94d4b368a3eb 100644 --- a/src/masternode.h +++ b/src/masternode.h @@ -268,7 +268,7 @@ class CMasternodeBroadcast : public CMasternode { public: CMasternodeBroadcast(); - CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey newPubkey, CPubKey newPubkey2, int protocolVersionIn); + CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey newPubkey, CPubKey newPubkey2, int protocolVersionIn, const CMasternodePing& _lastPing); CMasternodeBroadcast(const CMasternode& mn); bool CheckAndUpdate(int& nDoS); From aca376479a2e8e520f4ad3ef8c0212e2b0a7348f Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 13 Dec 2020 16:57:43 +0100 Subject: [PATCH 27/86] MN: pass sigTime to CMasternodePing constructor Github-Pull: #2060 Rebased-From: ae86d5b4a6ab8a14cc998252fce449a9bca54306 --- src/activemasternode.cpp | 2 +- src/masternode.cpp | 10 +++++----- src/masternode.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index b21271707be10..2c09db0b8880c 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -177,7 +177,7 @@ bool CActiveMasternode::SendMasternodePing(std::string& errorMessage) LogPrintf("CActiveMasternode::SendMasternodePing() - Relay Masternode Ping vin = %s\n", vin->ToString()); const uint256& nBlockHash = mnodeman.GetBlockHashToPing(); - CMasternodePing mnp(*vin, nBlockHash); + CMasternodePing mnp(*vin, nBlockHash, GetAdjustedTime()); if (!mnp.Sign(privKeyMasternode, pubKeyMasternode)) { errorMessage = "Couldn't sign Masternode Ping"; return false; diff --git a/src/masternode.cpp b/src/masternode.cpp index 1efd69b19c78e..be5da9b04d829 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -73,7 +73,7 @@ CMasternode::CMasternode() : addr = CService(); pubKeyCollateralAddress = CPubKey(); pubKeyMasternode = CPubKey(); - sigTime = GetAdjustedTime(); + sigTime = 0; lastPing = CMasternodePing(); protocolVersion = PROTOCOL_VERSION; nScanningErrorCount = 0; @@ -288,7 +288,7 @@ bool CMasternodeBroadcast::Create(const CTxIn& txin, // Get block hash to ping (TODO: move outside of this function) const uint256& nBlockHashToPing = mnodeman.GetBlockHashToPing(); - CMasternodePing mnp(txin, nBlockHashToPing); + CMasternodePing mnp(txin, nBlockHashToPing, GetAdjustedTime()); if (!mnp.Sign(keyMasternodeNew, pubKeyMasternodeNew)) { strErrorRet = strprintf("Failed to sign ping, masternode=%s", txin.prevout.hash.ToString()); LogPrint(BCLog::MASTERNODE,"CMasternodeBroadcast::Create -- %s\n", strErrorRet); @@ -564,14 +564,14 @@ CMasternodePing::CMasternodePing() : CSignedMessage(), vin(), blockHash(), - sigTime(GetAdjustedTime()) + sigTime(0) { } -CMasternodePing::CMasternodePing(const CTxIn& newVin, const uint256& nBlockHash) : +CMasternodePing::CMasternodePing(const CTxIn& newVin, const uint256& nBlockHash, uint64_t _sigTime) : CSignedMessage(), vin(newVin), blockHash(nBlockHash), - sigTime(GetAdjustedTime()) + sigTime(_sigTime) { } uint256 CMasternodePing::GetHash() const diff --git a/src/masternode.h b/src/masternode.h index b94d4b368a3eb..3d242a775d2fb 100644 --- a/src/masternode.h +++ b/src/masternode.h @@ -41,7 +41,7 @@ class CMasternodePing : public CSignedMessage int64_t sigTime; //mnb message times CMasternodePing(); - CMasternodePing(const CTxIn& newVin, const uint256& nBlockHash); + CMasternodePing(const CTxIn& newVin, const uint256& nBlockHash, uint64_t _sigTime); ADD_SERIALIZE_METHODS; From 8c2c328f9bcd97c11ec06cf225bf44aa29e0bcf8 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 13 Dec 2020 17:00:19 +0100 Subject: [PATCH 28/86] Refactor: always check mnp blockhash in CMasternodePing::CheckAndUpdate Github-Pull: #2060 Rebased-From: d2edcb7c59215bd4f17f517adc30849f09d301a3 --- src/masternode.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/masternode.cpp b/src/masternode.cpp index be5da9b04d829..f827e8b31dd36 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -602,6 +602,14 @@ bool CMasternodePing::CheckAndUpdate(int& nDos, bool fRequireAvailable, bool fCh return false; } + // Check if the ping block hash exists and it's within 24 blocks from the tip + if (!mnodeman.IsWithinDepth(blockHash, 2 * MNPING_DEPTH)) { + LogPrint(BCLog::MNPING,"%s: Masternode %s block hash %s is too old or has an invalid block hash\n", + __func__, vin.prevout.hash.ToString(), blockHash.ToString()); + nDos = 33; + return false; + } + // see if we have this Masternode CMasternode* pmn = mnodeman.Find(vin.prevout); const bool isMasternodeFound = (pmn != nullptr); @@ -633,14 +641,6 @@ bool CMasternodePing::CheckAndUpdate(int& nDos, bool fRequireAvailable, bool fCh return false; } - // Check if the ping block hash exists and it's within 24 blocks from the tip - if (!mnodeman.IsWithinDepth(blockHash, 2 * MNPING_DEPTH)) { - LogPrint(BCLog::MNPING,"%s: Masternode %s block hash %s is too old or has an invalid block hash\n", - __func__, vin.prevout.hash.ToString(), blockHash.ToString()); - nDos = 33; - return false; - } - // ping have passed the basic checks, can be updated now mnodeman.mapSeenMasternodePing.emplace(GetHash(), *this); From 25b25134e63233da857972cd12575f024c44c680 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 10 Dec 2020 01:49:14 +0100 Subject: [PATCH 29/86] [RPC] Redirect sendtoaddress to shieldedsendmany when shielded recipient Github-Pull: #2050 Rebased-From: 46fe14779f394532a9ca57b583d2768b719ea1bd --- src/wallet/rpcwallet.cpp | 58 +++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ce29a9e481025..946b95d221cd2 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -938,6 +938,8 @@ void SendMoney(const CTxDestination& address, CAmount nValue, CWalletTx& wtxNew) throw JSONRPCError(RPC_WALLET_ERROR, res.ToString()); } +static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request); + UniValue sendtoaddress(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 4) @@ -963,22 +965,60 @@ UniValue sendtoaddress(const JSONRPCRequest& request) HelpExampleCli("sendtoaddress", "\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\" 0.1 \"donation\" \"seans outpost\"") + HelpExampleRpc("sendtoaddress", "\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\", 0.1, \"donation\", \"seans outpost\"")); - LOCK2(cs_main, pwalletMain->cs_wallet); - - bool isStaking = false; - CTxDestination address = DecodeDestination(request.params[0].get_str(), isStaking); - if (!IsValidDestination(address) || isStaking) + bool isStaking = false, isShielded = false; + const std::string addrStr = request.params[0].get_str(); + const CWDestination& destination = Standard::DecodeDestination(addrStr, isStaking, isShielded); + if (!Standard::IsValidDestination(destination) || isStaking) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid PIVX address"); + const std::string commentStr = (request.params.size() > 2 && !request.params[2].isNull()) ? + request.params[2].get_str() : ""; + const std::string toStr = (request.params.size() > 3 && !request.params[3].isNull()) ? + request.params[3].get_str() : ""; + + if (isShielded) { + // convert params to 'shieldedsendmany' format + JSONRPCRequest req; + req.params = UniValue(UniValue::VARR); + req.params.push_back(UniValue("from_transparent")); + UniValue recipients(UniValue::VARR); + UniValue recipient(UniValue::VOBJ); + recipient.pushKV("address", addrStr); + recipient.pushKV("amount", request.params[1]); + recipients.push_back(recipient); + req.params.push_back(recipients); + + // send + SaplingOperation operation = CreateShieldedTransaction(req); + std::string txid; + auto res = operation.send(txid); + if (!res) + throw JSONRPCError(RPC_WALLET_ERROR, res.getError()); + + // add comment + const uint256 txHash(txid); + assert(pwalletMain->mapWallet.count(txHash)); + if (!commentStr.empty()) { + pwalletMain->mapWallet[txHash].mapValue["comment"] = commentStr; + } + if (!toStr.empty()) { + pwalletMain->mapWallet[txHash].mapValue["to"] = toStr; + } + + return txid; + } + + const CTxDestination& address = *Standard::GetTransparentDestination(destination); + LOCK2(cs_main, pwalletMain->cs_wallet); // Amount CAmount nAmount = AmountFromValue(request.params[1]); // Wallet comments CWalletTx wtx; - if (request.params.size() > 2 && !request.params[2].isNull() && !request.params[2].get_str().empty()) - wtx.mapValue["comment"] = request.params[2].get_str(); - if (request.params.size() > 3 && !request.params[3].isNull() && !request.params[3].get_str().empty()) - wtx.mapValue["to"] = request.params[3].get_str(); + if (!commentStr.empty()) + wtx.mapValue["comment"] = commentStr; + if (!toStr.empty()) + wtx.mapValue["to"] = toStr; EnsureWalletIsUnlocked(); From 2b7b466eac8028bd86642a4e5859001a3a1233ab Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 10 Dec 2020 02:11:52 +0100 Subject: [PATCH 30/86] [Test] Add case for (shielded) sendtoaddress Github-Pull: #2050 Rebased-From: 774c5441b39b523fcd7bce309060b7c1e0671688 --- test/functional/sapling_wallet.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/functional/sapling_wallet.py b/test/functional/sapling_wallet.py index 3d683011e97af..85322edd47a6c 100755 --- a/test/functional/sapling_wallet.py +++ b/test/functional/sapling_wallet.py @@ -324,7 +324,31 @@ def run_test(self): # Balance of node 0 is: prev_balance - 1 PIV (+fee) sent externally + 250 PIV matured coinbase assert_equal(self.nodes[0].getbalance(), satoshi_round(prev_balance + Decimal('249') - Decimal(fee))) + # Now shield some funds using sendtoaddress + self.log.info("TX12: Shielding coins with sendtoaddress RPC...") + prev_balance = self.nodes[0].getbalance() + mytxid12 = self.nodes[0].sendtoaddress(saplingAddr0, Decimal('10')) + self.check_tx_priority([mytxid12]) + self.log.info("Done. Checking details and balances...") + + # Decrypted transaction details should be correct + pt = self.nodes[0].viewshieldedtransaction(mytxid12) + fee = pt["fee"] + assert_equal(pt['txid'], mytxid12) + assert_equal(len(pt['spends']), 0) + assert_equal(len(pt['outputs']), 1) + out = pt['outputs'][0] + assert_equal(out['address'], saplingAddr0) + assert_equal(out['outgoing'], False) + assert_equal(out['value'], Decimal('10')) + + # Verify balance + self.nodes[2].generate(1) + self.sync_all() + assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('29')) # 19 prev balance + 10 received + self.log.info("All good.") + if __name__ == '__main__': WalletSaplingTest().main() From 99fa644d67dea5c4da197e2bc351c274d4c5c5be Mon Sep 17 00:00:00 2001 From: random-zebra Date: Fri, 11 Dec 2020 15:20:11 +0100 Subject: [PATCH 31/86] Refactor: Decouple ShieldedSendManyTo from sendtoaddress/sendmany Github-Pull: #2050 Rebased-From: 7dbd3bff6a459d388cbff552a5ca11a24b541ac1 --- src/wallet/rpcwallet.cpp | 113 ++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 62 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 946b95d221cd2..53b0301aa83a6 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -940,6 +940,53 @@ void SendMoney(const CTxDestination& address, CAmount nValue, CWalletTx& wtxNew) static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request); +/* + * redirect sendtoaddress/sendmany inputs to shieldedsendmany implementation (CreateShieldedTransaction) + */ +static UniValue ShieldedSendManyTo(const UniValue& sendTo, + const std::string& commentStr, + const std::string& toStr, + int nMinDepth, + bool fIncludeDelegated) +{ + // convert params to 'shieldedsendmany' format + JSONRPCRequest req; + req.params = UniValue(UniValue::VARR); + if (!fIncludeDelegated) { + req.params.push_back(UniValue("from_transparent")); + } else { + req.params.push_back(UniValue("from_trans_cold")); + } + UniValue recipients(UniValue::VARR); + for (const std::string& key : sendTo.getKeys()) { + UniValue recipient(UniValue::VOBJ); + recipient.pushKV("address", key); + recipient.pushKV("amount", sendTo[key]); + recipients.push_back(recipient); + } + req.params.push_back(recipients); + req.params.push_back(nMinDepth); + + // send + SaplingOperation operation = CreateShieldedTransaction(req); + std::string txid; + auto res = operation.send(txid); + if (!res) + throw JSONRPCError(RPC_WALLET_ERROR, res.getError()); + + // add comments + const uint256 txHash(txid); + assert(pwalletMain->mapWallet.count(txHash)); + if (!commentStr.empty()) { + pwalletMain->mapWallet[txHash].mapValue["comment"] = commentStr; + } + if (!toStr.empty()) { + pwalletMain->mapWallet[txHash].mapValue["to"] = toStr; + } + + return txid; +} + UniValue sendtoaddress(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 4) @@ -976,35 +1023,9 @@ UniValue sendtoaddress(const JSONRPCRequest& request) request.params[3].get_str() : ""; if (isShielded) { - // convert params to 'shieldedsendmany' format - JSONRPCRequest req; - req.params = UniValue(UniValue::VARR); - req.params.push_back(UniValue("from_transparent")); - UniValue recipients(UniValue::VARR); - UniValue recipient(UniValue::VOBJ); - recipient.pushKV("address", addrStr); - recipient.pushKV("amount", request.params[1]); - recipients.push_back(recipient); - req.params.push_back(recipients); - - // send - SaplingOperation operation = CreateShieldedTransaction(req); - std::string txid; - auto res = operation.send(txid); - if (!res) - throw JSONRPCError(RPC_WALLET_ERROR, res.getError()); - - // add comment - const uint256 txHash(txid); - assert(pwalletMain->mapWallet.count(txHash)); - if (!commentStr.empty()) { - pwalletMain->mapWallet[txHash].mapValue["comment"] = commentStr; - } - if (!toStr.empty()) { - pwalletMain->mapWallet[txHash].mapValue["to"] = toStr; - } - - return txid; + UniValue sendTo(UniValue::VOBJ); + sendTo.pushKV(addrStr, request.params[1]); + return ShieldedSendManyTo(sendTo, commentStr, toStr, 1, false); } const CTxDestination& address = *Standard::GetTransparentDestination(destination); @@ -2173,39 +2194,7 @@ UniValue sendmany(const JSONRPCRequest& request) } if (fShieldSend) { - // convert params to 'shieldedsendmany' format - JSONRPCRequest req; - req.params = UniValue(UniValue::VARR); - if (!fIncludeDelegated) { - req.params.push_back(UniValue("from_transparent")); - } else { - req.params.push_back(UniValue("from_trans_cold")); - } - UniValue recipients(UniValue::VARR); - for (const std::string& key : sendTo.getKeys()) { - UniValue recipient(UniValue::VOBJ); - recipient.pushKV("address", key); - recipient.pushKV("amount", sendTo[key]); - recipients.push_back(recipient); - } - req.params.push_back(recipients); - req.params.push_back(nMinDepth); - - // send - SaplingOperation operation = CreateShieldedTransaction(req); - std::string txid; - auto res = operation.send(txid); - if (!res) - throw JSONRPCError(RPC_WALLET_ERROR, res.getError()); - - // add comment - if (!comment.empty()) { - const uint256 txHash(txid); - assert(pwalletMain->mapWallet.count(txHash)); - pwalletMain->mapWallet[txHash].mapValue["comment"] = comment; - } - - return txid; + return ShieldedSendManyTo(sendTo, comment, "", nMinDepth, fIncludeDelegated); } // All recipients are transparent: use Legacy sendmany t->t From c314d7bfde66effad0f31b5966a05ef824981787 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Mon, 14 Dec 2020 11:25:44 +0100 Subject: [PATCH 32/86] Trivial: Add Zcash copyright Github-Pull: #2061 Rebased-From: 4fcbc39ebb64185e93b08f29c0e44ab0e0f26dbe --- COPYING | 1 + 1 file changed, 1 insertion(+) diff --git a/COPYING b/COPYING index 56853df72a97d..ebba4c8e102ff 100644 --- a/COPYING +++ b/COPYING @@ -3,6 +3,7 @@ Copyright (c) 2014-2015 Dash Developers Copyright (c) 2011-2013 The PPCoin developers Copyright (c) 2013-2014 The NovaCoin Developers Copyright (c) 2014-2018 The BlackCoin Developers +Copyright (c) 2016-2020 The Zcash developers Copyright (c) 2015-2020 PIVX Developers Permission is hereby granted, free of charge, to any person obtaining a copy From 7b8425abd10194613fd2f37ebf29bf5ae647ac3c Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 13 Dec 2020 18:57:46 +0100 Subject: [PATCH 33/86] Miner: do not include more than 750 kB of shielded txes inside a block Github-Pull: #2062 Rebased-From: 309783265131501c3fa3ac6ba321aea549405f57 --- src/consensus/consensus.h | 3 +++ src/miner.cpp | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h index 44dc1fcdeb4e0..3dbfc3e9df5b3 100644 --- a/src/consensus/consensus.h +++ b/src/consensus/consensus.h @@ -17,6 +17,9 @@ static const unsigned int MAX_BLOCK_SIZE_LEGACY = 1000000; /** The maximum size of a transaction after Sapling activation (network rule) */ static const unsigned int MAX_TX_SIZE_AFTER_SAPLING = 400000; +/** The maximum cumulative size of all Shielded txes inside a block */ +static const unsigned int MAX_BLOCK_SHIELDED_TXES_SIZE = 750000; + /** The maximum allowed number of signature check operations in a block (network rule) */ static const unsigned int MAX_BLOCK_SIGOPS_CURRENT = MAX_BLOCK_SIZE_CURRENT / 50; static const unsigned int MAX_BLOCK_SIGOPS_LEGACY = MAX_BLOCK_SIZE_LEGACY / 50; diff --git a/src/miner.cpp b/src/miner.cpp index 4b79bc3e7fd99..61ef891cfdc8f 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -295,6 +295,9 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, int nBlockSigOps = 100; bool fSortedByFee = (nBlockPrioritySize <= 0); + // Keep track of block space used for shielded txes + unsigned int nSizeShielded = 0; + TxPriorityCompare comparer(fSortedByFee); std::make_heap(vecPriority.begin(), vecPriority.end(), comparer); @@ -313,6 +316,10 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, if (nBlockSize + nTxSize >= nBlockMaxSize) continue; + const bool isShielded = tx.IsShieldedTx(); + if (isShielded && nSizeShielded + nTxSize > MAX_BLOCK_SHIELDED_TXES_SIZE) + continue; + // Legacy limits on sigOps: unsigned int nMaxBlockSigOps = MAX_BLOCK_SIGOPS_CURRENT; unsigned int nTxSigOps = GetLegacySigOpCount(tx); @@ -364,6 +371,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, ++nBlockTx; nBlockSigOps += nTxSigOps; nFees += nTxFees; + if (isShielded) nSizeShielded += nTxSize; if (fPrintPriority) { LogPrintf("priority %.1f fee %s txid %s\n", From ce7f265c310b7006c6c1b414a5f4dda88cf1bdca Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 13 Dec 2020 19:13:54 +0100 Subject: [PATCH 34/86] Consensus: check total size of all shielded txes inside a block Github-Pull: #2062 Rebased-From: 62fceb4cb1faa1d56422f063ab225b3f51e8031f --- src/miner.cpp | 2 +- src/validation.cpp | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 61ef891cfdc8f..fb77c93fb269f 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -312,7 +312,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, vecPriority.pop_back(); // Size limits - unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); + unsigned int nTxSize = tx.GetTotalSize(); if (nBlockSize + nTxSize >= nBlockMaxSize) continue; diff --git a/src/validation.cpp b/src/validation.cpp index 3b9fc3bacf1b3..35fbb712b41d0 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2680,6 +2680,16 @@ bool CheckColdStakeFreeOutput(const CTransaction& tx, const int nHeight) return true; } +// cumulative size of all shielded txes inside a block +static unsigned int GetTotalShieldedTxSize(const CBlock& block) +{ + unsigned int nSizeShielded = 0; + for (const auto& tx : block.vtx) { + if (tx->IsShieldedTx()) nSizeShielded += tx->GetTotalSize(); + } + return nSizeShielded; +} + bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) { if (block.fChecked) @@ -2713,9 +2723,14 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo // Size limits unsigned int nMaxBlockSize = MAX_BLOCK_SIZE_CURRENT; - if (block.vtx.empty() || block.vtx.size() > nMaxBlockSize || ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION) > nMaxBlockSize) + const unsigned int nBlockSize = ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION); + if (block.vtx.empty() || block.vtx.size() > nMaxBlockSize || nBlockSize > nMaxBlockSize) return state.DoS(100, false, REJECT_INVALID, "bad-blk-length", false, "size limits failed"); + // Check shielded txes limits (no need to check if the block size is already under 750kB) + if (nBlockSize > MAX_BLOCK_SHIELDED_TXES_SIZE && GetTotalShieldedTxSize(block) > MAX_BLOCK_SHIELDED_TXES_SIZE) + return state.DoS(100, false, REJECT_INVALID, "bad-blk-shielded-size", false, "shielded size limits failed"); + // First transaction must be coinbase, the rest must not be if (block.vtx.empty() || !block.vtx[0]->IsCoinBase()) return state.DoS(100, false, REJECT_INVALID, "bad-cb-missing", false, "first tx is not coinbase"); From 8c500dfa3537e2f66e3e6571b3233cf018bc298f Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 13 Dec 2020 19:50:29 +0100 Subject: [PATCH 35/86] Tests: Add sapling_fillblock functional test Github-Pull: #2062 Rebased-From: e0d9a083504e53e0758e482ea5a915b17631fc2e --- test/functional/sapling_fillblock.py | 120 +++++++++++++++++++++++++++ test/functional/test_runner.py | 1 + 2 files changed, 121 insertions(+) create mode 100755 test/functional/sapling_fillblock.py diff --git a/test/functional/sapling_fillblock.py b/test/functional/sapling_fillblock.py new file mode 100755 index 0000000000000..0a1d8e504ab10 --- /dev/null +++ b/test/functional/sapling_fillblock.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +# Copyright (c) 2020 The PIVX developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +from test_framework.test_framework import PivxTestFramework + +from test_framework.util import ( + assert_greater_than, + assert_greater_than_or_equal, + assert_equal, + Decimal, + satoshi_round, + sync_blocks, + sync_mempools, +) + +import time + +def timed(f): + start = time.time() + ret = f() + elapsed = time.time() - start + return ret, elapsed + +MAX_SHIELDED_BLOCKSIZE = 750000 + +class SaplingFillBlockTest(PivxTestFramework): + + def set_test_params(self): + self.num_nodes = 2 + self.setup_clean_chain = True + self.extra_args = [["-blockmaxsize=1999000"], []] + + def utxo_splitter(self, node_from, n_inputs, node_to): + txids = [] + # collect utxos + utxos = node_from.listunspent() + assert_greater_than_or_equal(len(utxos), n_inputs) + # sort by size + sorted(utxos, key=lambda utxo: utxo["amount"], reverse=True) + # pick the first N + utxos = utxos[:n_inputs] + # split each one in 100 (use fixed 0.05 PIV fee) + for u in utxos: + prevout = [{"txid": u["txid"], "vout": u["vout"]}] + output_amt = satoshi_round((u["amount"] - Decimal("0.05")) / 100) + recipients = {node_to.getnewaddress(): output_amt for _ in range(100)} + rawTx_unsigned = node_from.createrawtransaction(prevout, recipients) + rawTx_signed = node_from.signrawtransaction(rawTx_unsigned)["hex"] + txids.append(node_from.sendrawtransaction(rawTx_signed)) + return txids + + def check_mempool(self, miner, txids): + self.log.info("Checking mempool...") + sync_mempools(self.nodes) + mempool_info = miner.getmempoolinfo() + assert_equal(mempool_info['size'], len(txids)) + mempool_bytes = mempool_info['bytes'] + self.log.info("Miner's mempool size: %d bytes" % mempool_bytes) + assert_greater_than_or_equal(mempool_bytes, 1000000) + + def mine_and_checkblock(self, miner, alice): + self.log.info("Mining the block...") + bhash, elapsed = timed(lambda: miner.generate(1)[0]) + self.log.info("Block mined in %d seconds" % elapsed) + _, elapsed = timed(lambda: self.sync_all()) + bsize = alice.getblock(bhash, True)["size"] + self.log.info("Peers synced in %d seconds. Block size: %d" % (elapsed, bsize)) + # Only shielded txes in mempool. Block size must be below + # MAX_SHIELDED_BLOCKSIZE + 513 (header + coinbase + coinstake) + assert_greater_than(MAX_SHIELDED_BLOCKSIZE + 513, bsize) + + def send_shielded(self, node, n_txes, from_address, shield_to): + txids = [] + for i in range(n_txes): + txids.append(node.shieldedsendmany(from_address, shield_to)) + if (i + 1) % 200 == 0: + self.log.info("...%d Transactions created..." % (i + 1)) + return txids + + + def run_test(self): + miner = self.nodes[0] + alice = self.nodes[1] + # First mine 300 blocks + self.log.info("Generating 300 blocks...") + miner.generate(300) + sync_blocks(self.nodes) + assert_equal(self.nodes[0].getblockchaininfo()['upgrades']['v5 shield']['status'], 'active') + + ## -- First check that the miner never produces blocks with more than 750kB of shielded txes + + # Split 10 utxos (of 250 PIV each) in 1000 new utxos of ~2.5 PIV each (to alice) + UTXOS_TO_SPLIT = 10 + UTXOS_TO_SHIELD = UTXOS_TO_SPLIT * 100 + self.log.info("Creating %d utxos..." % UTXOS_TO_SHIELD) + txids = self.utxo_splitter(miner, UTXOS_TO_SPLIT, alice) + assert_equal(len(txids), UTXOS_TO_SPLIT) + miner.generate(2) + sync_blocks(self.nodes) + new_utxos = alice.listunspent() + assert_equal(len(new_utxos), UTXOS_TO_SHIELD) + + # Now alice shields the new utxos individually (fixed 0.2 PIV fee --> ~2.3 PIV notes) + self.log.info("Shielding utxos...") + alice_z_addr = alice.getnewshieldedaddress() + shield_to = [{"address": alice_z_addr, "amount": new_utxos[0]["amount"] - Decimal("0.2")}] + txids = self.send_shielded(alice, UTXOS_TO_SHIELD, "from_transparent", shield_to) + + # Check mempool + self.check_mempool(miner, txids) + + # Mine the block + self.mine_and_checkblock(miner, alice) + self.log.info("Done. %d txes still in mempool." % miner.getmempoolinfo()['size']) + + +if __name__ == '__main__': + SaplingFillBlockTest().main() diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 5e9700d13e5e5..7bc1f58f80f63 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -160,6 +160,7 @@ # These tests are not run by the travis build process. # Longest test should go first, to favor running tests in parallel # vv Tests less than 20m vv + 'sapling_fillblock.py', # ~ 780 sec 'feature_fee_estimation.py', # ~ 360 sec # vv Tests less than 5m vv # vv Tests less than 2m vv From 5797e2b1eaac39af54ed3e9503798ec4df921bc9 Mon Sep 17 00:00:00 2001 From: Ambassador <57232689+NoobieDev12@users.noreply.github.com> Date: Sat, 5 Dec 2020 22:42:30 +0100 Subject: [PATCH 36/86] [GUI][Trivial] Adjust CoinControl column widths for readability Default column widths when wallet starts is not wide enough to show enough text for some columns. This PR fixes it. Github-Pull: #2033 Rebased-From: 1b7317cfcd921b2c97c69587cfed2c8dd938e2e7 --- src/qt/coincontroldialog.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index 81b2ae1aa07bc..2e2022c5a1766 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -165,12 +165,12 @@ CoinControlDialog::CoinControlDialog(QWidget* parent, bool _forDelegation) : QDi // Toggle lock state connect(ui->pushButtonToggleLock, &QPushButton::clicked, this, &CoinControlDialog::buttonToggleLockClicked); - ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, 84); - ui->treeWidget->setColumnWidth(COLUMN_AMOUNT, 120); - ui->treeWidget->setColumnWidth(COLUMN_LABEL, 170); + ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, 100); + ui->treeWidget->setColumnWidth(COLUMN_AMOUNT, 110); + ui->treeWidget->setColumnWidth(COLUMN_LABEL, 160); ui->treeWidget->setColumnWidth(COLUMN_ADDRESS, 310); - ui->treeWidget->setColumnWidth(COLUMN_DATE, 100); - ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 100); + ui->treeWidget->setColumnWidth(COLUMN_DATE, 145); + ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 65); ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transacton hash in this column, but dont show it ui->treeWidget->setColumnHidden(COLUMN_VOUT_INDEX, true); // store vout index in this column, but dont show it From c12ff2be41390d8f0d0c9ba1382283ac17d5ba3d Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 15:17:35 +0100 Subject: [PATCH 37/86] BUG: SSPKM, guard GetDebit/GetCredit for non-shield v2 txes Github-Pull: #2064 Rebased-From: 99a43793f40309595f5a970dacb451308a5cd2e3 --- src/sapling/saplingscriptpubkeyman.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sapling/saplingscriptpubkeyman.cpp b/src/sapling/saplingscriptpubkeyman.cpp index 2e2f8f8bb0b76..6498affc4e3d2 100644 --- a/src/sapling/saplingscriptpubkeyman.cpp +++ b/src/sapling/saplingscriptpubkeyman.cpp @@ -671,6 +671,9 @@ isminetype SaplingScriptPubKeyMan::IsMine(const CWalletTx& wtx, const SaplingOut CAmount SaplingScriptPubKeyMan::GetCredit(const CWalletTx& tx, const isminefilter& filter, const bool fUnspent) const { + if (!tx.IsShieldedTx() || tx.sapData->vShieldedOutput.empty()) { + return 0; + } CAmount nCredit = 0; for (int i = 0; i < (int) tx.sapData->vShieldedOutput.size(); ++i) { SaplingOutPoint op(tx.GetHash(), i); @@ -697,6 +700,9 @@ CAmount SaplingScriptPubKeyMan::GetCredit(const CWalletTx& tx, const isminefilte CAmount SaplingScriptPubKeyMan::GetDebit(const CTransaction& tx, const isminefilter& filter) const { + if (!tx.IsShieldedTx() || tx.sapData->vShieldedSpend.empty()) { + return 0; + } CAmount nDebit = 0; for (const SpendDescription& spend : tx.sapData->vShieldedSpend) { const auto &it = mapSaplingNullifiersToNotes.find(spend.nullifier); @@ -720,7 +726,7 @@ CAmount SaplingScriptPubKeyMan::GetDebit(const CTransaction& tx, const isminefil CAmount SaplingScriptPubKeyMan::GetShieldedChange(const CWalletTx& wtx) const { - if (!wtx.isSaplingVersion() || wtx.sapData->vShieldedOutput.empty()) { + if (!wtx.IsShieldedTx() || wtx.sapData->vShieldedOutput.empty()) { return 0; } const uint256& txHash = wtx.GetHash(); From 43f7ca7024e5c8b5ea4db47821da7f627cf78f20 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 15:54:28 +0100 Subject: [PATCH 38/86] BUG: Guard access to tx.sapData in connectBlock Github-Pull: #2064 Rebased-From: f62ac6c194c811f429ad74fc8e4770a67b452c7e --- src/validation.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 35fbb712b41d0..3ac348f503bba 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1670,8 +1670,10 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin UpdateCoins(tx, view, i == 0 ? undoDummy : blockundo.vtxundo.back(), pindex->nHeight); // Sapling update tree - for(const OutputDescription &outputDescription : tx.sapData->vShieldedOutput) { - sapling_tree.append(outputDescription.cmu); + if (tx.IsShieldedTx() && !tx.sapData->vShieldedOutput.empty()) { + for(const OutputDescription &outputDescription : tx.sapData->vShieldedOutput) { + sapling_tree.append(outputDescription.cmu); + } } vPos.emplace_back(tx.GetHash(), pos); From 460a8756a47ff759ef2a993573df189388f8a094 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 15:55:02 +0100 Subject: [PATCH 39/86] Tests: fix order of sapData serialization Github-Pull: #2064 Rebased-From: fcbdd235c0b949c50dabbe5d1ea19158ac631514 --- test/functional/test_framework/messages.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py index b255265f42e3e..08d4c3c0173ea 100644 --- a/test/functional/test_framework/messages.py +++ b/test/functional/test_framework/messages.py @@ -370,8 +370,8 @@ def __init__(self, tx=None): self.nVersion = tx.nVersion self.vin = copy.deepcopy(tx.vin) self.vout = copy.deepcopy(tx.vout) - self.sapData = tx.sapData self.nLockTime = tx.nLockTime + self.sapData = tx.sapData self.sha256 = tx.sha256 self.hash = tx.hash @@ -379,9 +379,9 @@ def deserialize(self, f): self.nVersion = struct.unpack("= 2: self.sapData = deser_string(f) - self.nLockTime = struct.unpack("= 2: r += ser_string(self.sapData) - r += struct.pack(" Date: Tue, 15 Dec 2020 16:00:39 +0100 Subject: [PATCH 40/86] Tests: Add trolling exploit demo Github-Pull: #2064 Rebased-From: 9cc790f6bf1cbae198db4f368b9504388d338808 --- test/functional/sapling_malleable_sigs.py | 74 +++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100755 test/functional/sapling_malleable_sigs.py diff --git a/test/functional/sapling_malleable_sigs.py b/test/functional/sapling_malleable_sigs.py new file mode 100755 index 0000000000000..553dea15854db --- /dev/null +++ b/test/functional/sapling_malleable_sigs.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +# Copyright (c) 2018 The Zcash developers +# Copyright (c) 2020 The PIVX developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +from test_framework.test_framework import PivxTestFramework + +from test_framework.messages import ( + CTransaction, +) +from test_framework.util import ( + assert_equal, + assert_greater_than, + bytes_to_hex_str, + hex_str_to_bytes, +) + +from decimal import Decimal +from io import BytesIO + +class MalleableSigsTest(PivxTestFramework): + + def set_test_params(self): + self.num_nodes = 1 + saplingUpgrade = ['-nuparams=v5_shield:201'] + self.extra_args = [saplingUpgrade] + + def run_test(self): + node = self.nodes[0] + node.generate(2) + assert_equal(node.getblockcount(), 202) + + t_balance = node.getbalance() + z_balance = node.getshieldedbalance() + + z_addr = node.getnewshieldedaddress() + shield_to = [{"address": z_addr, "amount": Decimal('10')}] + + # Create rawtx shielding 10 PIV + self.log.info("Shielding 10 PIV...") + rawtx = node.rawshieldedsendmany("from_transparent", shield_to)["hex"] + self.log.info("Raw tx created") + + # Creating malleated tx + self.log.info("Removing sapling data...") + new_tx = CTransaction() + new_tx.deserialize(BytesIO(hex_str_to_bytes(rawtx))) + new_tx.sapData = b"" + new_rawtx = bytes_to_hex_str(new_tx.serialize()) + self.log.info("Sending malleated tx...") + txid = node.sendrawtransaction(new_rawtx, True) + assert(txid is not None) + self.log.info("Tx accepted in mempool") + + # No notes minted + assert_equal(node.getshieldedbalance(), z_balance) + # But 10 PIV have been effectively burned + fee = - Decimal(node.gettransaction(txid)['fee']) + assert_greater_than(fee, Decimal('10')) + assert_equal(node.getbalance(), t_balance - fee) + + hashes = node.generate(1) + assert_equal(len(hashes), 1) + chain_tx = node.gettransaction(txid) + assert_equal(chain_tx['confirmations'], 1) + self.log.info("Malleated Tx accepted on chain") + + + + + +if __name__ == '__main__': + MalleableSigsTest().main() From 0a82c1052a49301182c2ba3976c7d301786a4f7e Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 18:02:03 +0100 Subject: [PATCH 41/86] Script: Properly sign/verify shielded tx with sigversion sapling Github-Pull: #2064 Rebased-From: 2d7f8e218f131d91dd05d2e3efab9a0237396da0 --- src/kernel.cpp | 2 +- src/pivx-tx.cpp | 5 ++++- src/policy/policy.cpp | 2 +- src/primitives/transaction.h | 23 +++++++++++++++++++ src/rpc/rawtransaction.cpp | 7 ++++-- src/sapling/transaction_builder.cpp | 2 +- src/script/bitcoinconsensus.cpp | 3 ++- src/script/interpreter.cpp | 15 ++++++++----- src/script/interpreter.h | 8 +------ src/script/sign.cpp | 20 ++++++++--------- src/script/sign.h | 2 +- src/test/multisig_tests.cpp | 16 ++++++------- src/test/script_P2SH_tests.cpp | 3 ++- src/test/script_tests.cpp | 35 ++++++++++++++++------------- src/test/sighash_tests.cpp | 10 +++++++-- src/test/transaction_tests.cpp | 4 ++-- src/validation.cpp | 2 +- src/wallet/wallet.cpp | 4 +++- 18 files changed, 101 insertions(+), 62 deletions(-) diff --git a/src/kernel.cpp b/src/kernel.cpp index bf653e55eaead..06cebd2cc5a94 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -186,7 +186,7 @@ bool CheckProofOfStake(const CBlock& block, std::string& strError, const CBlockI const CTxIn& txin = tx->vin[0]; ScriptError serror; if (!VerifyScript(txin.scriptSig, stakePrevout.scriptPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, - TransactionSignatureChecker(tx.get(), 0, stakePrevout.nValue), &serror)) { + TransactionSignatureChecker(tx.get(), 0, stakePrevout.nValue), tx->GetRequiredSigVersion(), &serror)) { strError = strprintf("signature fails: %s", serror ? ScriptErrorString(serror) : ""); return false; } diff --git a/src/pivx-tx.cpp b/src/pivx-tx.cpp index e5d309e70e346..c1283f3d808b2 100644 --- a/src/pivx-tx.cpp +++ b/src/pivx-tx.cpp @@ -448,12 +448,14 @@ static void MutateTxSign(CMutableTransaction& tx, const std::string& flagStr) const CAmount& amount = coin.out.nValue; SignatureData sigdata; + SigVersion sigversion = mergedTx.GetRequiredSigVersion(); // Only sign SIGHASH_SINGLE if there's a corresponding output: if (!fHashSingle || (i < mergedTx.vout.size())) ProduceSignature( MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata, + sigversion, false // no cold stake ); @@ -462,7 +464,8 @@ static void MutateTxSign(CMutableTransaction& tx, const std::string& flagStr) sigdata = CombineSignatures(prevPubKey, MutableTransactionSignatureChecker(&mergedTx, i, amount), sigdata, DataFromTransaction(txv, i)); } UpdateTransaction(mergedTx, i, sigdata); - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i, amount))) + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, + MutableTransactionSignatureChecker(&mergedTx, i, amount), sigversion)) fComplete = false; } diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp index 2892986cfd255..1a69023fd4b0e 100644 --- a/src/policy/policy.cpp +++ b/src/policy/policy.cpp @@ -215,7 +215,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs) // IsStandard() will have already returned false // and this method isn't called. std::vector > stack; - if (!EvalScript(stack, tx.vin[i].scriptSig, false, BaseSignatureChecker(), SIGVERSION_BASE)) + if (!EvalScript(stack, tx.vin[i].scriptSig, false, BaseSignatureChecker(), tx.GetRequiredSigVersion())) return false; if (whichType == TX_SCRIPTHASH) { diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 68b3ecb27c031..64eeb5be22aba 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -21,6 +21,12 @@ class CTransaction; +enum SigVersion +{ + SIGVERSION_BASE = 0, + SIGVERSION_SAPLING = 1, +}; + // contextual flag to guard the serialization for v5 upgrade. // can be removed once v5 enforcement is activated. extern std::atomic g_IsSaplingActive; @@ -322,6 +328,12 @@ class CTransaction return isSaplingVersion() && nType != TxType::NORMAL && hasExtraPayload(); } + // Ensure that special and sapling fields are signed + SigVersion GetRequiredSigVersion() const + { + return isSaplingVersion() ? SIGVERSION_SAPLING : SIGVERSION_BASE; + } + /* * Context for the two methods below: * We can think of the Sapling shielded part of the transaction as an input @@ -421,6 +433,17 @@ struct CMutableTransaction * fly, as opposed to GetHash() in CTransaction, which uses a cached result. */ uint256 GetHash() const; + + bool isSaplingVersion() const + { + return nVersion >= CTransaction::TxVersion::SAPLING; + } + + // Ensure that special and sapling fields are signed + SigVersion GetRequiredSigVersion() const + { + return isSaplingVersion() ? SIGVERSION_SAPLING : SIGVERSION_BASE; + } }; typedef std::shared_ptr CTransactionRef; diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index 67a4aeadafc91..9c49202518472 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -799,9 +799,11 @@ UniValue signrawtransaction(const JSONRPCRequest& request) } SignatureData sigdata; + SigVersion sigversion = mergedTx.GetRequiredSigVersion(); // Only sign SIGHASH_SINGLE if there's a corresponding output: if (!fHashSingle || (i < mergedTx.vout.size())) - ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), prevPubKey, sigdata, fColdStake); + ProduceSignature(MutableTransactionSignatureCreator(&keystore, &mergedTx, i, amount, nHashType), + prevPubKey, sigdata, sigversion, fColdStake); // ... and merge in other signatures: for (const CMutableTransaction& txv : txVariants) { @@ -811,7 +813,8 @@ UniValue signrawtransaction(const JSONRPCRequest& request) UpdateTransaction(mergedTx, i, sigdata); ScriptError serror = SCRIPT_ERR_OK; - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, TransactionSignatureChecker(&txConst, i, amount), &serror)) { + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, + TransactionSignatureChecker(&txConst, i, amount), sigversion, &serror)) { TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); } } diff --git a/src/sapling/transaction_builder.cpp b/src/sapling/transaction_builder.cpp index a2ba420fdc151..97203338d56f5 100644 --- a/src/sapling/transaction_builder.cpp +++ b/src/sapling/transaction_builder.cpp @@ -364,7 +364,7 @@ TransactionBuilderResult TransactionBuilder::Build() bool signSuccess = ProduceSignature( TransactionSignatureCreator( keystore, &txNewConst, nIn, tIn.value, SIGHASH_ALL), - tIn.scriptPubKey, sigdata, false); + tIn.scriptPubKey, sigdata, SIGVERSION_SAPLING, false); if (!signSuccess) { return TransactionBuilderResult("Failed to sign transaction"); diff --git a/src/script/bitcoinconsensus.cpp b/src/script/bitcoinconsensus.cpp index 91f840345dadf..8294e50352aff 100644 --- a/src/script/bitcoinconsensus.cpp +++ b/src/script/bitcoinconsensus.cpp @@ -88,7 +88,8 @@ int bitcoinconsensus_verify_script(const unsigned char *scriptPubKey, unsigned i // Regardless of the verification result, the tx did not error. set_error(err, bitcoinconsensus_ERR_OK); - return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), flags, TransactionSignatureChecker(&tx, nIn), NULL); + return VerifyScript(tx.vin[nIn].scriptSig, CScript(scriptPubKey, scriptPubKey + scriptPubKeyLen), + flags, TransactionSignatureChecker(&tx, nIn), tx.GetRequiredSigVersion(), NULL); } catch (const std::exception&) { return set_error(err, bitcoinconsensus_ERR_TX_DESERIALIZE); // Error deserializing } diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index b6a87baed0616..b29094a39f609 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1170,7 +1170,10 @@ uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsig return UINT256_ONE; } - // currently: sigversion_sapling is disabled everywhere. + if (txTo.isSaplingVersion() && sigversion != SIGVERSION_SAPLING) { + throw std::runtime_error("SignatureHash in Sapling tx with wrong sigversion " + std::to_string(sigversion)); + } + if (sigversion == SIGVERSION_SAPLING) { uint256 hashPrevouts; @@ -1292,7 +1295,7 @@ bool TransactionSignatureChecker::CheckSig(const std::vector& vch int nHashType = vchSig.back(); vchSig.pop_back(); - uint256 sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->precomTxData); + const uint256& sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->precomTxData); if (!VerifySignature(vchSig, pubkey, sighash)) return false; @@ -1337,7 +1340,7 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con } -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) +bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror) { set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR); @@ -1346,12 +1349,12 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne } std::vector > stack, stackCopy; - if (!EvalScript(stack, scriptSig, flags, checker, SIGVERSION_BASE, serror)) + if (!EvalScript(stack, scriptSig, flags, checker, sigversion, serror)) // serror is set return false; if (flags & SCRIPT_VERIFY_P2SH) stackCopy = stack; - if (!EvalScript(stack, scriptPubKey, flags, checker, SIGVERSION_BASE, serror)) + if (!EvalScript(stack, scriptPubKey, flags, checker, sigversion, serror)) // serror is set return false; if (stack.empty()) @@ -1376,7 +1379,7 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigne CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end()); popstack(stackCopy); - if (!EvalScript(stackCopy, pubKey2, flags, checker, SIGVERSION_BASE, serror)) + if (!EvalScript(stackCopy, pubKey2, flags, checker, sigversion, serror)) // serror is set return false; if (stackCopy.empty()) diff --git a/src/script/interpreter.h b/src/script/interpreter.h index a7f6946537e5d..432f6bacb4316 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -96,12 +96,6 @@ struct PrecomputedTransactionData PrecomputedTransactionData(const CTransaction& tx); }; -enum SigVersion -{ - SIGVERSION_BASE = 0, - SIGVERSION_SAPLING = 1, -}; - uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion, const PrecomputedTransactionData* cache = nullptr); class BaseSignatureChecker @@ -157,6 +151,6 @@ class MutableTransactionSignatureChecker : public TransactionSignatureChecker }; bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* error = NULL); -bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror = NULL); +bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror = NULL); #endif // BITCOIN_SCRIPT_INTERPRETER_H diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 20ee7d81b38c9..66dc38e95d921 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -151,13 +151,13 @@ static CScript PushAll(const std::vector& values) return result; } -bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata, bool fColdStake, ScriptError* serror) +bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata, SigVersion sigversion, bool fColdStake, ScriptError* serror) { CScript script = fromPubKey; bool solved = true; std::vector result; txnouttype whichType; - solved = SignStep(creator, script, result, whichType, SIGVERSION_BASE, fColdStake); + solved = SignStep(creator, script, result, whichType, sigversion, fColdStake); CScript subscript; if (solved && whichType == TX_SCRIPTHASH) @@ -166,14 +166,14 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu // the final scriptSig is the signatures from that // and then the serialized subscript: script = subscript = CScript(result[0].begin(), result[0].end()); - solved = solved && SignStep(creator, script, result, whichType, SIGVERSION_BASE, fColdStake) && whichType != TX_SCRIPTHASH; + solved = solved && SignStep(creator, script, result, whichType, sigversion, fColdStake) && whichType != TX_SCRIPTHASH; result.emplace_back(subscript.begin(), subscript.end()); } sigdata.scriptSig = PushAll(result); // Test solution - return solved && VerifyScript(sigdata.scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker(), serror); + return solved && VerifyScript(sigdata.scriptSig, fromPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker(), sigversion, serror); } SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn) @@ -198,7 +198,7 @@ bool SignSignature(const CKeyStore &keystore, const CScript& fromPubKey, CMutabl TransactionSignatureCreator creator(&keystore, &txToConst, nIn, amount, nHashType); SignatureData sigdata; - bool ret = ProduceSignature(creator, fromPubKey, sigdata, fColdStake); + bool ret = ProduceSignature(creator, fromPubKey, sigdata, txToConst.GetRequiredSigVersion(), fColdStake); UpdateTransaction(txTo, nIn, sigdata); return ret; } @@ -276,8 +276,8 @@ struct Stacks Stacks() {} explicit Stacks(const std::vector& scriptSigStack_) : script(scriptSigStack_) {} - explicit Stacks(const SignatureData& data) { - EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE); + explicit Stacks(const SignatureData& data, SigVersion sigversion) { + EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), sigversion); } SignatureData Output() const { @@ -342,7 +342,7 @@ SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignature std::vector > vSolutions; Solver(scriptPubKey, txType, vSolutions); - return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SIGVERSION_BASE).Output(); + return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1, SIGVERSION_BASE), Stacks(scriptSig2, SIGVERSION_BASE), SIGVERSION_BASE).Output(); } namespace { @@ -388,9 +388,9 @@ bool IsSolvable(const CKeyStore& store, const CScript& script, bool fColdStaking // if found in a transaction, we would still accept and relay that transaction. In particular, DummySignatureCreator creator(&store); SignatureData sigs; - if (ProduceSignature(creator, script, sigs, fColdStaking)) { + if (ProduceSignature(creator, script, sigs, SIGVERSION_BASE, fColdStaking)) { // VerifyScript check is just defensive, and should never fail. - assert(VerifyScript(sigs.scriptSig, script, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker())); + assert(VerifyScript(sigs.scriptSig, script, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker(), SIGVERSION_BASE)); return true; } return false; diff --git a/src/script/sign.h b/src/script/sign.h index b49af499739a3..713ad8b91c163 100644 --- a/src/script/sign.h +++ b/src/script/sign.h @@ -68,7 +68,7 @@ struct SignatureData { }; /** Produce a script signature using a generic signature creator. */ -bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata, bool fColdStake, ScriptError* serror = nullptr); +bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata, SigVersion sigversion, bool fColdStake, ScriptError* serror = nullptr); /** Produce a script signature for a transaction. */ bool SignSignature(const CKeyStore& keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType, bool fColdStake = false); diff --git a/src/test/multisig_tests.cpp b/src/test/multisig_tests.cpp index 93b852210a1af..a001f3f6320e4 100644 --- a/src/test/multisig_tests.cpp +++ b/src/test/multisig_tests.cpp @@ -82,7 +82,7 @@ BOOST_AUTO_TEST_CASE(multisig_verify) keys.push_back(key[0]); keys.push_back(key[1]); s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK(VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err)); + BOOST_CHECK(VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), SIGVERSION_BASE, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); for (int i = 0; i < 4; i++) @@ -90,14 +90,14 @@ BOOST_AUTO_TEST_CASE(multisig_verify) keys.clear(); keys.push_back(key[i]); s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 1: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), SIGVERSION_BASE, &err), strprintf("a&b 1: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err)); keys.clear(); keys.push_back(key[1]); keys.push_back(key[i]); s = sign_multisig(a_and_b, keys, txTo[0], 0); - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), &err), strprintf("a&b 2: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_and_b, flags, MutableTransactionSignatureChecker(&txTo[0], 0, amount), SIGVERSION_BASE, &err), strprintf("a&b 2: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } @@ -109,18 +109,18 @@ BOOST_AUTO_TEST_CASE(multisig_verify) s = sign_multisig(a_or_b, keys, txTo[1], 0); if (i == 0 || i == 1) { - BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i)); + BOOST_CHECK_MESSAGE(VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), SIGVERSION_BASE, &err), strprintf("a|b: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } else { - BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err), strprintf("a|b: %d", i)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), SIGVERSION_BASE, &err), strprintf("a|b: %d", i)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } } s.clear(); s << OP_0 << OP_1; - BOOST_CHECK(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), &err)); + BOOST_CHECK(!VerifyScript(s, a_or_b, flags, MutableTransactionSignatureChecker(&txTo[1], 0, amount), SIGVERSION_BASE, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_SIG_DER, ScriptErrorString(err)); @@ -133,12 +133,12 @@ BOOST_AUTO_TEST_CASE(multisig_verify) s = sign_multisig(escrow, keys, txTo[2], 0); if (i < j && i < 3 && j < 3) { - BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 1: %d %d", i, j)); + BOOST_CHECK_MESSAGE(VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), SIGVERSION_BASE, &err), strprintf("escrow 1: %d %d", i, j)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } else { - BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), &err), strprintf("escrow 2: %d %d", i, j)); + BOOST_CHECK_MESSAGE(!VerifyScript(s, escrow, flags, MutableTransactionSignatureChecker(&txTo[2], 0, amount), SIGVERSION_BASE, &err), strprintf("escrow 2: %d %d", i, j)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } } diff --git a/src/test/script_P2SH_tests.cpp b/src/test/script_P2SH_tests.cpp index 7a1b9bc28736b..8ff5abaf0a7ea 100644 --- a/src/test/script_P2SH_tests.cpp +++ b/src/test/script_P2SH_tests.cpp @@ -44,7 +44,8 @@ Verify(const CScript& scriptSig, const CScript& scriptPubKey, bool fStrict, Scri txTo.vin[0].scriptSig = scriptSig; txTo.vout[0].nValue = 1; - return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, MutableTransactionSignatureChecker(&txTo, 0, txFrom.vout[0].nValue), &err); + return VerifyScript(scriptSig, scriptPubKey, fStrict ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, + MutableTransactionSignatureChecker(&txTo, 0, txFrom.vout[0].nValue), txTo.GetRequiredSigVersion(), &err); } BOOST_FIXTURE_TEST_SUITE(script_P2SH_tests, TestingSetup) diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp index 7672c70d34b54..ede0f23e9349c 100644 --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -91,7 +91,8 @@ void DoTest(const CScript& scriptPubKey, const CScript& scriptSig, int flags, bo CMutableTransaction tx = BuildSpendingTransaction(scriptSig, BuildCreditingTransaction(scriptPubKey)); CMutableTransaction tx2 = tx; static const CAmount amountZero = 0; - BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, MutableTransactionSignatureChecker(&tx, 0, amountZero), &err) == expect, message); + BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, flags, + MutableTransactionSignatureChecker(&tx, 0, amountZero), tx.GetRequiredSigVersion(), &err) == expect, message); BOOST_CHECK_MESSAGE(expect == (err == SCRIPT_ERR_OK), std::string(ScriptErrorString(err)) + ": " + message); #if defined(HAVE_CONSENSUS_LIB) CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); @@ -735,20 +736,21 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) CMutableTransaction txFrom12 = BuildCreditingTransaction(scriptPubKey12); CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), txFrom12); + const SigVersion sv12 = txTo12.GetRequiredSigVersion(); CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12); - BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), sv12, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); txTo12.vout[0].nValue = 2; - BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), sv12, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12); - BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), sv12, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12); - BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, flags, MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), sv12, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); } @@ -766,58 +768,59 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) CMutableTransaction txFrom23 = BuildCreditingTransaction(scriptPubKey23); CMutableTransaction txTo23 = BuildSpendingTransaction(CScript(), txFrom23); + const SigVersion sv23 = txTo23.GetRequiredSigVersion(); std::vector keys; keys.push_back(key1); keys.push_back(key2); CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key1); keys.push_back(key3); CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key3); CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key2); // Can't re-use sig CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); keys.clear(); // Must have signatures CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23); - BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), &err)); + BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, flags, MutableTransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), sv23, &err)); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, ScriptErrorString(err)); } @@ -939,7 +942,7 @@ BOOST_AUTO_TEST_CASE(script_standard_push) CScript script; script << i; BOOST_CHECK_MESSAGE(script.IsPushOnly(), "Number " << i << " is not pure push."); - BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Number " << i << " push is not minimal data."); + BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), SIGVERSION_BASE, &err), "Number " << i << " push is not minimal data."); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } @@ -948,7 +951,7 @@ BOOST_AUTO_TEST_CASE(script_standard_push) CScript script; script << data; BOOST_CHECK_MESSAGE(script.IsPushOnly(), "Length " << i << " is not pure push."); - BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), &err), "Length " << i << " push is not minimal data."); + BOOST_CHECK_MESSAGE(VerifyScript(script, CScript() << OP_1, SCRIPT_VERIFY_MINIMALDATA, BaseSignatureChecker(), SIGVERSION_BASE, &err), "Length " << i << " push is not minimal data."); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } } diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index 282f7114cd401..b6432480bf681 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -173,7 +173,7 @@ BOOST_AUTO_TEST_CASE(sighash_test) uint256 sh, sho; sho = SignatureHashOld(scriptCode, txTo, nIn, nHashType); - sh = SignatureHash(scriptCode, txTo, nIn, nHashType, 0, SIGVERSION_BASE); + sh = SignatureHash(scriptCode, txTo, nIn, nHashType, 0, txTo.GetRequiredSigVersion()); #if defined(PRINT_SIGHASH_JSON) CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << txTo; @@ -201,6 +201,9 @@ BOOST_AUTO_TEST_CASE(sighash_test) // TODO: Update with Sapling transactions.. BOOST_AUTO_TEST_CASE(sighash_from_data) { + /* TODO: update with proper signatures of saplingVersion txes + * + UniValue tests = read_json(std::string(json_tests::sighash, json_tests::sighash + sizeof(json_tests::sighash))); for (unsigned int idx = 0; idx < tests.size(); idx++) { @@ -242,8 +245,11 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) continue; } - sh = SignatureHash(scriptCode, tx, nIn, nHashType, 0, SIGVERSION_BASE); + sh = SignatureHash(scriptCode, tx, nIn, nHashType, 0, tx.GetRequiredSigVersion()); BOOST_CHECK_MESSAGE(sh.GetHex() == sigHashHex, strTest); } + + * + */ } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp index 5c546f3793581..1da983ae56941 100644 --- a/src/test/transaction_tests.cpp +++ b/src/test/transaction_tests.cpp @@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE(tx_valid) CAmount amount = 0; unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, TransactionSignatureChecker(&tx, i, amount, precomTxData), &err), + verify_flags, TransactionSignatureChecker(&tx, i, amount, precomTxData), tx.GetRequiredSigVersion(), &err), strTest); BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); } @@ -225,7 +225,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid) CAmount amount = 0; unsigned int verify_flags = ParseScriptFlags(test[2].get_str()); fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], - verify_flags, TransactionSignatureChecker(&tx, i, amount, precomTxData), &err); + verify_flags, TransactionSignatureChecker(&tx, i, amount, precomTxData), tx.GetRequiredSigVersion(), &err); } BOOST_CHECK_MESSAGE(!fValid, strTest); BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err)); diff --git a/src/validation.cpp b/src/validation.cpp index 3ac348f503bba..f8e0edbda9459 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -987,7 +987,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache &inputs, int nHeight) bool CScriptCheck::operator()() { const CScript& scriptSig = ptxTo->vin[nIn].scriptSig; - return VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *precomTxData), &error); + return VerifyScript(scriptSig, scriptPubKey, nFlags, CachingTransactionSignatureChecker(ptxTo, nIn, amount, cacheStore, *precomTxData), ptxTo->GetRequiredSigVersion(), &error); } std::map mapInvalidOutPoints; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index a4a1f2462a628..416504017d364 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2812,6 +2812,7 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, // Sign int nIn = 0; CTransaction txNewConst(txNew); + SigVersion sigversion = txNewConst.GetRequiredSigVersion(); for (const std::pair & coin : setCoins) { bool signSuccess; const CScript& scriptPubKey = coin.first->vout[coin.second].scriptPubKey; @@ -2822,11 +2823,12 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, TransactionSignatureCreator(this, &txNewConst, nIn, coin.first->vout[coin.second].nValue, SIGHASH_ALL), scriptPubKey, sigdata, + sigversion, !haveKey // fColdStake = false ); } else { signSuccess = ProduceSignature( - DummySignatureCreator(this), scriptPubKey, sigdata, false); + DummySignatureCreator(this), scriptPubKey, sigdata, sigversion, false); } if (!signSuccess) { From 87801619d513fe0ad08b99caaafc2edaf6e2ba80 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 18:55:35 +0100 Subject: [PATCH 42/86] Tests: update sighash json test data for saplingVersion txes Github-Pull: #2064 Rebased-From: cee6ef3db42285c20c4b9d6d159903d8e92003a9 --- src/test/data/sighash.json | 524 ++++++++++++++++++------------------- src/test/sighash_tests.cpp | 6 - 2 files changed, 262 insertions(+), 268 deletions(-) diff --git a/src/test/data/sighash.json b/src/test/data/sighash.json index c53d2b2211674..aaf6b9b04b3b9 100644 --- a/src/test/data/sighash.json +++ b/src/test/data/sighash.json @@ -1,210 +1,210 @@ [ ["raw_transaction, script, input_index, hashType, signature_hash (result)"], - ["907c2bc503ade11cc3b04eb2918b6f547b0630ab569273824748c87ea14b0696526c66ba740200000004ab65ababfd1f9bdd4ef073c7afc4ae00da8a66f429c917a0081ad1e1dabce28d373eab81d8628de802000000096aab5253ab52000052ad042b5f25efb33beec9f3364e8a9139e8439d9d7e26529c3c30b6c3fd89f8684cfd68ea0200000009ab53526500636a52ab599ac2fe02a526ed040000000008535300516352515164370e010000000003006300ab2ec229", "", 2, 1864164639, "31af167a6cf3f9d5f6875caa4d31704ceb0eba078d132b78dab52c3b8997317e"], + ["907c2bc503ade11cc3b04eb2918b6f547b0630ab569273824748c87ea14b0696526c66ba740200000004ab65ababfd1f9bdd4ef073c7afc4ae00da8a66f429c917a0081ad1e1dabce28d373eab81d8628de802000000096aab5253ab52000052ad042b5f25efb33beec9f3364e8a9139e8439d9d7e26529c3c30b6c3fd89f8684cfd68ea0200000009ab53526500636a52ab599ac2fe02a526ed040000000008535300516352515164370e010000000003006300ab2ec229", "", 2, 1864164639, "5734f85c593bcb9c54a27c86cdaef33f1ca9a2bd7db4ba07758ecee5dcb1e49d"], ["a0aa3126041621a6dea5b800141aa696daf28408959dfb2df96095db9fa425ad3f427f2f6103000000015360290e9c6063fa26912c2e7fb6a0ad80f1c5fea1771d42f12976092e7a85a4229fdb6e890000000001abc109f6e47688ac0e4682988785744602b8c87228fcef0695085edf19088af1a9db126e93000000000665516aac536affffffff8fe53e0806e12dfd05d67ac68f4768fdbe23fc48ace22a5aa8ba04c96d58e2750300000009ac51abac63ab5153650524aa680455ce7b000000000000499e50030000000008636a00ac526563ac5051ee030000000003abacabd2b6fe000000000003516563910fb6b5", "65", 0, -1391424484, "48d6a1bd2cd9eec54eb866fc71209418a950402b5d7e52363bfb75c98e141175"], - ["6e7e9d4b04ce17afa1e8546b627bb8d89a6a7fefd9d892ec8a192d79c2ceafc01694a6a7e7030000000953ac6a51006353636a33bced1544f797f08ceed02f108da22cd24c9e7809a446c61eb3895914508ac91f07053a01000000055163ab516affffffff11dc54eee8f9e4ff0bcf6b1a1a35b1cd10d63389571375501af7444073bcec3c02000000046aab53514a821f0ce3956e235f71e4c69d91abe1e93fb703bd33039ac567249ed339bf0ba0883ef300000000090063ab65000065ac654bec3cc504bcf499020000000005ab6a52abac64eb060100000000076a6a5351650053bbbc130100000000056a6aab53abd6e1380100000000026a51c4e509b8", "acab655151", 0, 479279909, "2a3d95b09237b72034b23f2d2bb29fa32a58ab5c6aa72f6aafdfa178ab1dd01c"], - ["73107cbd025c22ebc8c3e0a47b2a760739216a528de8d4dab5d45cbeb3051cebae73b01ca10200000007ab6353656a636affffffffe26816dffc670841e6a6c8c61c586da401df1261a330a6c6b3dd9f9a0789bc9e000000000800ac6552ac6aac51ffffffff0174a8f0010000000004ac52515100000000", "5163ac63635151ac", 1, 1190874345, "06e328de263a87b09beabe222a21627a6ea5c7f560030da31610c4611f4a46bc"], - ["e93bbf6902be872933cb987fc26ba0f914fcfc2f6ce555258554dd9939d12032a8536c8802030000000453ac5353eabb6451e074e6fef9de211347d6a45900ea5aaf2636ef7967f565dce66fa451805c5cd10000000003525253ffffffff047dc3e6020000000007516565ac656aabec9eea010000000001633e46e600000000000015080a030000000001ab00000000", "5300ac6a53ab6a", 1, -886562767, "f03aa4fc5f97e826323d0daa03343ebf8a34ed67a1ce18631f8b88e5c992e798"], + ["6e7e9d4b04ce17afa1e8546b627bb8d89a6a7fefd9d892ec8a192d79c2ceafc01694a6a7e7030000000953ac6a51006353636a33bced1544f797f08ceed02f108da22cd24c9e7809a446c61eb3895914508ac91f07053a01000000055163ab516affffffff11dc54eee8f9e4ff0bcf6b1a1a35b1cd10d63389571375501af7444073bcec3c02000000046aab53514a821f0ce3956e235f71e4c69d91abe1e93fb703bd33039ac567249ed339bf0ba0883ef300000000090063ab65000065ac654bec3cc504bcf499020000000005ab6a52abac64eb060100000000076a6a5351650053bbbc130100000000056a6aab53abd6e1380100000000026a51c4e509b8", "acab655151", 0, 479279909, "58446adb4309a20e4bc4263ca89d896644a1e59604b9a19eec33037eae17dded"], + ["73107cbd025c22ebc8c3e0a47b2a760739216a528de8d4dab5d45cbeb3051cebae73b01ca10200000007ab6353656a636affffffffe26816dffc670841e6a6c8c61c586da401df1261a330a6c6b3dd9f9a0789bc9e000000000800ac6552ac6aac51ffffffff0174a8f0010000000004ac52515100000000", "5163ac63635151ac", 1, 1190874345, "04f91c5c9fd31e9ebf480e1c8b4846b500638c5c9c53aa659e871dcbd011c164"], + ["e93bbf6902be872933cb987fc26ba0f914fcfc2f6ce555258554dd9939d12032a8536c8802030000000453ac5353eabb6451e074e6fef9de211347d6a45900ea5aaf2636ef7967f565dce66fa451805c5cd10000000003525253ffffffff047dc3e6020000000007516565ac656aabec9eea010000000001633e46e600000000000015080a030000000001ab00000000", "5300ac6a53ab6a", 1, -886562767, "d9c21d28cf5dd1f6d897aa3de5b27cca20b0f8841ea60db0c6edebc3a6b9d349"], ["50818f4c01b464538b1e7e7f5ae4ed96ad23c68c830e78da9a845bc19b5c3b0b20bb82e5e9030000000763526a63655352ffffffff023b3f9c040000000008630051516a6a5163a83caf01000000000553ab65510000000000", "6aac", 0, 946795545, "746306f322de2b4b58ffe7faae83f6a72433c22f88062cdde881d4dd8a5a4e2d"], - ["a93e93440250f97012d466a6cc24839f572def241c814fe6ae94442cf58ea33eb0fdd9bcc1030000000600636a0065acffffffff5dee3a6e7e5ad6310dea3e5b3ddda1a56bf8de7d3b75889fc024b5e233ec10f80300000007ac53635253ab53ffffffff0160468b04000000000800526a5300ac526a00000000", "ac00636a53", 1, 1773442520, "5c9d3a2ce9365bb72cfabbaa4579c843bb8abf200944612cf8ae4b56a908bcbd"], - ["ce7d371f0476dda8b811d4bf3b64d5f86204725deeaa3937861869d5b2766ea7d17c57e40b0100000003535265ffffffff7e7e9188f76c34a46d0bbe856bde5cb32f089a07a70ea96e15e92abb37e479a10100000006ab6552ab655225bcab06d1c2896709f364b1e372814d842c9c671356a1aa5ca4e060462c65ae55acc02d0000000006abac0063ac5281b33e332f96beebdbc6a379ebe6aea36af115c067461eb99d22ba1afbf59462b59ae0bd0200000004ab635365be15c23801724a1704000000000965006a65ac00000052ca555572", "53ab530051ab", 1, 2030598449, "c336b2f7d3702fbbdeffc014d106c69e3413c7c71e436ba7562d8a7a2871f181"], + ["a93e93440250f97012d466a6cc24839f572def241c814fe6ae94442cf58ea33eb0fdd9bcc1030000000600636a0065acffffffff5dee3a6e7e5ad6310dea3e5b3ddda1a56bf8de7d3b75889fc024b5e233ec10f80300000007ac53635253ab53ffffffff0160468b04000000000800526a5300ac526a00000000", "ac00636a53", 1, 1773442520, "61c8b232ee30770ff423506ea3f24b42bcbab9bb760e60fe38b1127e174692ea"], + ["ce7d371f0476dda8b811d4bf3b64d5f86204725deeaa3937861869d5b2766ea7d17c57e40b0100000003535265ffffffff7e7e9188f76c34a46d0bbe856bde5cb32f089a07a70ea96e15e92abb37e479a10100000006ab6552ab655225bcab06d1c2896709f364b1e372814d842c9c671356a1aa5ca4e060462c65ae55acc02d0000000006abac0063ac5281b33e332f96beebdbc6a379ebe6aea36af115c067461eb99d22ba1afbf59462b59ae0bd0200000004ab635365be15c23801724a1704000000000965006a65ac00000052ca555572", "53ab530051ab", 1, 2030598449, "fa153bf2c74869a1740e61fc88767bf0d685b4ddfcd6af5de3a1e54bddb2a758"], ["d3b7421e011f4de0f1cea9ba7458bf3486bee722519efab711a963fa8c100970cf7488b7bb0200000003525352dcd61b300148be5d05000000000000000000", "535251536aac536a", 0, -1960128125, "29aa6d2d752d3310eba20442770ad345b7f6a35f96161ede5f07b33e92053e2a"], ["04bac8c5033460235919a9c63c42b2db884c7c8f2ed8fcd69ff683a0a2cccd9796346a04050200000003655351fcad3a2c5a7cbadeb4ec7acc9836c3f5c3e776e5c566220f7f965cf194f8ef98efb5e3530200000007526a006552526526a2f55ba5f69699ece76692552b399ba908301907c5763d28a15b08581b23179cb01eac03000000075363ab6a516351073942c2025aa98a05000000000765006aabac65abd7ffa6030000000004516a655200000000", "53ac6365ac526a", 1, 764174870, "bf5fdc314ded2372a0ad078568d76c5064bf2affbde0764c335009e56634481b"], - ["c363a70c01ab174230bbe4afe0c3efa2d7f2feaf179431359adedccf30d1f69efe0c86ed390200000002ab51558648fe0231318b04000000000151662170000000000008ac5300006a63acac00000000", "", 0, 2146479410, "191ab180b0d753763671717d051f138d4866b7cb0d1d4811472e64de595d2c70"], - ["8d437a7304d8772210a923fd81187c425fc28c17a5052571501db05c7e89b11448b36618cd02000000026a6340fec14ad2c9298fde1477f1e8325e5747b61b7e2ff2a549f3d132689560ab6c45dd43c3010000000963ac00ac000051516a447ed907a7efffebeb103988bf5f947fc688aab2c6a7914f48238cf92c337fad4a79348102000000085352ac526a5152517436edf2d80e3ef06725227c970a816b25d0b58d2cd3c187a7af2cea66d6b27ba69bf33a0300000007000063ab526553f3f0d6140386815d030000000003ab6300de138f00000000000900525153515265abac1f87040300000000036aac6500000000", "51", 3, -315779667, "b6632ac53578a741ae8c36d8b69e79f39b89913a2c781cdf1bf47a8c29d997a5"], + ["c363a70c01ab174230bbe4afe0c3efa2d7f2feaf179431359adedccf30d1f69efe0c86ed390200000002ab51558648fe0231318b04000000000151662170000000000008ac5300006a63acac00000000", "", 0, 2146479410, "1fd7c8dcc6026d2d982f7d53381b03b8ebfc47ebd62e00c6270e8cddc4302cd0"], + ["8d437a7304d8772210a923fd81187c425fc28c17a5052571501db05c7e89b11448b36618cd02000000026a6340fec14ad2c9298fde1477f1e8325e5747b61b7e2ff2a549f3d132689560ab6c45dd43c3010000000963ac00ac000051516a447ed907a7efffebeb103988bf5f947fc688aab2c6a7914f48238cf92c337fad4a79348102000000085352ac526a5152517436edf2d80e3ef06725227c970a816b25d0b58d2cd3c187a7af2cea66d6b27ba69bf33a0300000007000063ab526553f3f0d6140386815d030000000003ab6300de138f00000000000900525153515265abac1f87040300000000036aac6500000000", "51", 3, -315779667, "4f83d3416e91af3ee593acf5e6e5cb998e818ce54a8f8698c6fdd9b5516914bb"], ["fd878840031e82fdbe1ad1d745d1185622b0060ac56638290ec4f66b1beef4450817114a2c0000000009516a63ab53650051abffffffff37b7a10322b5418bfd64fb09cd8a27ddf57731aeb1f1f920ffde7cb2dfb6cdb70300000008536a5365ac53515369ecc034f1594690dbe189094dc816d6d57ea75917de764cbf8eccce4632cbabe7e116cd0100000003515352ffffffff035777fc000000000003515200abe9140300000000050063005165bed6d10200000000076300536363ab65195e9110", "635265", 0, 1729787658, "6e3735d37a4b28c45919543aabcb732e7a3e1874db5315abb7cc6b143d62ff10"], - ["f40a750702af06efff3ea68e5d56e42bc41cdb8b6065c98f1221fe04a325a898cb61f3d7ee030000000363acacffffffffb5788174aef79788716f96af779d7959147a0c2e0e5bfb6c2dba2df5b4b97894030000000965510065535163ac6affffffff0445e6fd0200000000096aac536365526a526aa6546b000000000008acab656a6552535141a0fd010000000000c897ea030000000008526500ab526a6a631b39dba3", "00abab5163ac", 1, -1778064747, "d76d0fc0abfa72d646df888bce08db957e627f72962647016eeae5a8412354cf"], - ["a63bc673049c75211aa2c09ecc38e360eaa571435fedd2af1116b5c1fa3d0629c269ecccbf0000000008ac65ab516352ac52ffffffffbf1a76fdda7f451a5f0baff0f9ccd0fe9136444c094bb8c544b1af0fa2774b06010000000463535253ffffffff13d6b7c3ddceef255d680d87181e100864eeb11a5bb6a3528cb0d70d7ee2bbbc02000000056a0052abab951241809623313b198bb520645c15ec96bfcc74a2b0f3db7ad61d455cc32db04afc5cc702000000016309c9ae25014d9473020000000004abab6aac3bb1e803", "", 3, -232881718, "6e48f3da3a4ac07eb4043a232df9f84e110485d7c7669dd114f679c27d15b97e"], - ["4c565efe04e7d32bac03ae358d63140c1cfe95de15e30c5b84f31bb0b65bb542d637f49e0f010000000551abab536348ae32b31c7d3132030a510a1b1aacf7b7c3f19ce8dc49944ef93e5fa5fe2d356b4a73a00100000009abac635163ac00ab514c8bc57b6b844e04555c0a4f4fb426df139475cd2396ae418bc7015820e852f711519bc202000000086a00510000abac52488ff4aec72cbcfcc98759c58e20a8d2d9725aa4a80f83964e69bc4e793a4ff25cd75dc701000000086a52ac6aac5351532ec6b10802463e0200000000000553005265523e08680100000000002f39a6b0", "", 3, 70712784, "c6076b6a45e6fcfba14d3df47a34f6aadbacfba107e95621d8d7c9c0e40518ed"], - ["1233d5e703403b3b8b4dae84510ddfc126b4838dcb47d3b23df815c0b3a07b55bf3098110e010000000163c5c55528041f480f40cf68a8762d6ed3efe2bd402795d5233e5d94bf5ddee71665144898030000000965525165655151656affffffff6381667e78bb74d0880625993bec0ea3bd41396f2bcccc3cc097b240e5e92d6a01000000096363acac6a63536365ffffffff04610ad60200000000065251ab65ab52e90d680200000000046351516ae30e98010000000008abab52520063656a671856010000000004ac6aac514c84e383", "6aabab636300", 1, -114996813, "aeb8c5a62e8a0b572c28f2029db32854c0b614dbecef0eaa726abebb42eebb8d"], - ["0c69702103b25ceaed43122cc2672de84a3b9aa49872f2a5bb458e19a52f8cc75973abb9f102000000055365656aacffffffff3ffb1cf0f76d9e3397de0942038c856b0ebbea355dc9d8f2b06036e19044b0450100000000ffffffff4b7793f4169617c54b734f2cd905ed65f1ce3d396ecd15b6c426a677186ca0620200000008655263526551006a181a25b703240cce0100000000046352ab53dee22903000000000865526a6a516a51005e121602000000000852ab52ababac655200000000", "6a516aab63", 1, -2040012771, "a6e6cb69f409ec14e10dd476f39167c29e586e99bfac93a37ed2c230fcc1dbbe"], - ["fd22692802db8ae6ab095aeae3867305a954278f7c076c542f0344b2591789e7e33e4d29f4020000000151ffffffffb9409129cfed9d3226f3b6bab7a2c83f99f48d039100eeb5796f00903b0e5e5e0100000006656552ac63abd226abac0403e649000000000007abab51ac5100ac8035f10000000000095165006a63526a52510d42db030000000007635365ac6a63ab24ef5901000000000453ab6a0000000000", "536a52516aac6a", 1, 309309168, "7ca0f75e6530ec9f80d031fc3513ca4ecd67f20cb38b4dacc6a1d825c3cdbfdb"], - ["a43f85f701ffa54a3cc57177510f3ea28ecb6db0d4431fc79171cad708a6054f6e5b4f89170000000008ac6a006a536551652bebeaa2013e779c05000000000665ac5363635100000000", "ac", 0, 2028978692, "58294f0d7f2e68fe1fd30c01764fe1619bcc7961d68968944a0e263af6550437"], + ["f40a750702af06efff3ea68e5d56e42bc41cdb8b6065c98f1221fe04a325a898cb61f3d7ee030000000363acacffffffffb5788174aef79788716f96af779d7959147a0c2e0e5bfb6c2dba2df5b4b97894030000000965510065535163ac6affffffff0445e6fd0200000000096aac536365526a526aa6546b000000000008acab656a6552535141a0fd010000000000c897ea030000000008526500ab526a6a631b39dba3", "00abab5163ac", 1, -1778064747, "688d18b3251c3835a159f66205e18ca3d19a3232c5e9dbee96c6524a92b47be9"], + ["a63bc673049c75211aa2c09ecc38e360eaa571435fedd2af1116b5c1fa3d0629c269ecccbf0000000008ac65ab516352ac52ffffffffbf1a76fdda7f451a5f0baff0f9ccd0fe9136444c094bb8c544b1af0fa2774b06010000000463535253ffffffff13d6b7c3ddceef255d680d87181e100864eeb11a5bb6a3528cb0d70d7ee2bbbc02000000056a0052abab951241809623313b198bb520645c15ec96bfcc74a2b0f3db7ad61d455cc32db04afc5cc702000000016309c9ae25014d9473020000000004abab6aac3bb1e803", "", 3, -232881718, "37ad0a1058da1c7cf29567a1a295853ad4c391a261c535e8981b399e942ad4c9"], + ["4c565efe04e7d32bac03ae358d63140c1cfe95de15e30c5b84f31bb0b65bb542d637f49e0f010000000551abab536348ae32b31c7d3132030a510a1b1aacf7b7c3f19ce8dc49944ef93e5fa5fe2d356b4a73a00100000009abac635163ac00ab514c8bc57b6b844e04555c0a4f4fb426df139475cd2396ae418bc7015820e852f711519bc202000000086a00510000abac52488ff4aec72cbcfcc98759c58e20a8d2d9725aa4a80f83964e69bc4e793a4ff25cd75dc701000000086a52ac6aac5351532ec6b10802463e0200000000000553005265523e08680100000000002f39a6b0", "", 3, 70712784, "4557f6691df501845c901e6880396571c089ef38bb0f5234a999e0845cbf3659"], + ["1233d5e703403b3b8b4dae84510ddfc126b4838dcb47d3b23df815c0b3a07b55bf3098110e010000000163c5c55528041f480f40cf68a8762d6ed3efe2bd402795d5233e5d94bf5ddee71665144898030000000965525165655151656affffffff6381667e78bb74d0880625993bec0ea3bd41396f2bcccc3cc097b240e5e92d6a01000000096363acac6a63536365ffffffff04610ad60200000000065251ab65ab52e90d680200000000046351516ae30e98010000000008abab52520063656a671856010000000004ac6aac514c84e383", "6aabab636300", 1, -114996813, "5f1bff24bcfc09403e5e6d69f0573bc748c67b3a4383c2b9f518e58d79357f39"], + ["0c69702103b25ceaed43122cc2672de84a3b9aa49872f2a5bb458e19a52f8cc75973abb9f102000000055365656aacffffffff3ffb1cf0f76d9e3397de0942038c856b0ebbea355dc9d8f2b06036e19044b0450100000000ffffffff4b7793f4169617c54b734f2cd905ed65f1ce3d396ecd15b6c426a677186ca0620200000008655263526551006a181a25b703240cce0100000000046352ab53dee22903000000000865526a6a516a51005e121602000000000852ab52ababac655200000000", "6a516aab63", 1, -2040012771, "72c1097a74f95e2fe82a5488ddb560a0dce037c0aa3f2746d15ccfcd8a307015"], + ["fd22692802db8ae6ab095aeae3867305a954278f7c076c542f0344b2591789e7e33e4d29f4020000000151ffffffffb9409129cfed9d3226f3b6bab7a2c83f99f48d039100eeb5796f00903b0e5e5e0100000006656552ac63abd226abac0403e649000000000007abab51ac5100ac8035f10000000000095165006a63526a52510d42db030000000007635365ac6a63ab24ef5901000000000453ab6a0000000000", "536a52516aac6a", 1, 309309168, "82a02f03913b3419aaed0c9dbad202156c0f1095c6b4ae684256da9a5f334d68"], + ["a43f85f701ffa54a3cc57177510f3ea28ecb6db0d4431fc79171cad708a6054f6e5b4f89170000000008ac6a006a536551652bebeaa2013e779c05000000000665ac5363635100000000", "ac", 0, 2028978692, "db5686ba3f8821fabff9e3e0d2ba3c464d6df03828eec4ed0fe8cb7751d65dc7"], ["c2b0b99001acfecf7da736de0ffaef8134a9676811602a6299ba5a2563a23bb09e8cbedf9300000000026300ffffffff042997c50300000000045252536a272437030000000007655353ab6363ac663752030000000002ab6a6d5c900000000000066a6a5265abab00000000", "52ac525163515251", 0, -894181723, "8b300032a1915a4ac05cea2f7d44c26f2a08d109a71602636f15866563eaafdc"], ["82f9f10304c17a9d954cf3380db817814a8c738d2c811f0412284b2c791ec75515f38c4f8c020000000265ab5729ca7db1b79abee66c8a757221f29280d0681355cb522149525f36da760548dbd7080a0100000001510b477bd9ce9ad5bb81c0306273a3a7d051e053f04ecf3a1dbeda543e20601a5755c0cfae030000000451ac656affffffff71141a04134f6c292c2e0d415e6705dfd8dcee892b0d0807828d5aeb7d11f5ef0300000001520b6c6dc802a6f3dd0000000000056aab515163bfb6800300000000015300000000", "", 3, -635779440, "d55ed1e6c53510f2608716c12132a11fb5e662ec67421a513c074537eeccc34b"], ["8edcf5a1014b604e53f0d12fe143cf4284f86dc79a634a9f17d7e9f8725f7beb95e8ffcd2403000000046aabac52ffffffff01c402b5040000000005ab6a63525100000000", "6351525251acabab6a", 0, 1520147826, "2765bbdcd3ebb8b1a316c04656b28d637f80bffbe9b040661481d3dc83eea6d6"], - ["2074bad5011847f14df5ea7b4afd80cd56b02b99634893c6e3d5aaad41ca7c8ee8e5098df003000000026a6affffffff018ad59700000000000900ac656a526551635300000000", "65635265", 0, -1804671183, "663c999a52288c9999bff36c9da2f8b78d5c61b8347538f76c164ccba9868d0a"], - ["7100b11302e554d4ef249ee416e7510a485e43b2ba4b8812d8fe5529fe33ea75f36d392c4403000000020000ffffffff3d01a37e075e9a7715a657ae1bdf1e44b46e236ad16fd2f4c74eb9bf370368810000000007636553ac536365ffffffff01db696a0400000000065200ac656aac00000000", "63005151", 0, -1210499507, "b9c3aee8515a4a3b439de1ffc9c156824bda12cb75bfe5bc863164e8fd31bd7a"], + ["2074bad5011847f14df5ea7b4afd80cd56b02b99634893c6e3d5aaad41ca7c8ee8e5098df003000000026a6affffffff018ad59700000000000900ac656a526551635300000000", "65635265", 0, -1804671183, "786f40128bc76abbe2c181f52a8f9c96a35a553f127586d7e539ee6825c89853"], + ["7100b11302e554d4ef249ee416e7510a485e43b2ba4b8812d8fe5529fe33ea75f36d392c4403000000020000ffffffff3d01a37e075e9a7715a657ae1bdf1e44b46e236ad16fd2f4c74eb9bf370368810000000007636553ac536365ffffffff01db696a0400000000065200ac656aac00000000", "63005151", 0, -1210499507, "123dcd1cae693f07b01c4ded3ca217b56d84454087b7e3130e3294b9160c3809"], ["02c1017802091d1cb08fec512db7b012fe4220d57a5f15f9e7676358b012786e1209bcff950100000004acab6352ffffffff799bc282724a970a6fea1828984d0aeb0f16b67776fa213cbdc4838a2f1961a3010000000951516a536552ab6aabffffffff016c7b4b03000000000865abac5253ac5352b70195ad", "65655200516a", 0, -241626954, "be567cb47170b34ff81c66c1142cb9d27f9b6898a384d6dfc4fce16b75b6cb14"], - ["cb3178520136cd294568b83bb2520f78fecc507898f4a2db2674560d72fd69b9858f75b3b502000000066aac00515100ffffffff03ab005a01000000000563526363006e3836030000000001abfbda3200000000000665ab0065006500000000", "ab516a0063006a5300", 0, 1182109299, "2149e79c3f4513da4e4378608e497dcfdfc7f27c21a826868f728abd2b8a637a"], + ["cb3178520136cd294568b83bb2520f78fecc507898f4a2db2674560d72fd69b9858f75b3b502000000066aac00515100ffffffff03ab005a01000000000563526363006e3836030000000001abfbda3200000000000665ab0065006500000000", "ab516a0063006a5300", 0, 1182109299, "1cb486a7b49e671f4113a8a02bb6f0382ec558b517e432deb7c4f6afaea3c360"], ["18a4b0c004702cf0e39686ac98aab78ad788308f1d484b1ddfe70dc1997148ba0e28515c310300000000ffffffff05275a52a23c59da91129093364e275da5616c4070d8a05b96df5a2080ef259500000000096aac51656a6aac53ab66e64966b3b36a07dd2bb40242dd4a3743d3026e7e1e0d9e9e18f11d068464b989661321030000000265ac383339c4fae63379cafb63b0bab2eca70e1f5fc7d857eb5c88ccd6c0465093924bba8b2a000000000300636ab5e0545402bc2c4c010000000000cd41c002000000000000000000", "abac635253656a00", 3, 2052372230, "32db877b6b1ca556c9e859442329406f0f8246706522369839979a9f7a235a32"], ["1d9c5df20139904c582285e1ea63dec934251c0f9cf5c47e86abfb2b394ebc57417a81f67c010000000353515222ba722504800d3402000000000353656a3c0b4a0200000000000fb8d20500000000076300ab005200516462f30400000000015200000000", "ab65", 0, -210854112, "edf73e2396694e58f6b619f68595b0c1cdcb56a9b3147845b6d6afdb5a80b736"], - ["4504cb1904c7a4acf375ddae431a74de72d5436efc73312cf8e9921f431267ea6852f9714a01000000066a656a656553a2fbd587c098b3a1c5bd1d6480f730a0d6d9b537966e20efc0e352d971576d0f87df0d6d01000000016321aeec3c4dcc819f1290edb463a737118f39ab5765800547522708c425306ebfca3f396603000000055300ac656a1d09281d05bfac57b5eb17eb3fa81ffcedfbcd3a917f1be0985c944d473d2c34d245eb350300000007656a51525152ac263078d9032f470f0500000000066aac00000052e12da60200000000003488410200000000076365006300ab539981e432", "52536a52526a", 1, -31909119, "f0a2deee7fd8a3a9fad6927e763ded11c940ee47e9e6d410f94fda5001f82e0c"], + ["4504cb1904c7a4acf375ddae431a74de72d5436efc73312cf8e9921f431267ea6852f9714a01000000066a656a656553a2fbd587c098b3a1c5bd1d6480f730a0d6d9b537966e20efc0e352d971576d0f87df0d6d01000000016321aeec3c4dcc819f1290edb463a737118f39ab5765800547522708c425306ebfca3f396603000000055300ac656a1d09281d05bfac57b5eb17eb3fa81ffcedfbcd3a917f1be0985c944d473d2c34d245eb350300000007656a51525152ac263078d9032f470f0500000000066aac00000052e12da60200000000003488410200000000076365006300ab539981e432", "52536a52526a", 1, -31909119, "99e7f43744ba5781c38e8fed299d3746b52a32d6d2863dcfc7a650e7d844785e"], ["14bc7c3e03322ec0f1311f4327e93059c996275302554473104f3f7b46ca179bfac9ef753503000000016affffffff9d405eaeffa1ca54d9a05441a296e5cc3a3e32bb8307afaf167f7b57190b07e00300000008abab51ab5263abab45533aa242c61bca90dd15d46079a0ab0841d85df67b29ba87f2393cd764a6997c372b55030000000452005263ffffffff0250f40e02000000000651516a0063630e95ab0000000000046a5151ac00000000", "6a65005151", 0, -1460947095, "aa418d096929394c9147be8818d8c9dafe6d105945ab9cd7ec682df537b5dd79"], - ["2b3bd0dd04a1832f893bf49a776cd567ec4b43945934f4786b615d6cb850dfc0349b33301a000000000565ac000051cf80c670f6ddafab63411adb4d91a69c11d9ac588898cbfb4cb16061821cc104325c895103000000025163ffffffffa9e2d7506d2d7d53b882bd377bbcc941f7a0f23fd15d2edbef3cd9df8a4c39d10200000009ac63006a52526a5265ffffffff44c099cdf10b10ce87d4b38658d002fd6ea17ae4a970053c05401d86d6e75f99000000000963ab53526a5252ab63ffffffff035af69c01000000000100ba9b8b0400000000004cead10500000000026a520b77d667", "ab52abac526553", 3, -1955078165, "eb9ceecc3b401224cb79a44d23aa8f428e29f1405daf69b4e01910b848ef1523"], + ["2b3bd0dd04a1832f893bf49a776cd567ec4b43945934f4786b615d6cb850dfc0349b33301a000000000565ac000051cf80c670f6ddafab63411adb4d91a69c11d9ac588898cbfb4cb16061821cc104325c895103000000025163ffffffffa9e2d7506d2d7d53b882bd377bbcc941f7a0f23fd15d2edbef3cd9df8a4c39d10200000009ac63006a52526a5265ffffffff44c099cdf10b10ce87d4b38658d002fd6ea17ae4a970053c05401d86d6e75f99000000000963ab53526a5252ab63ffffffff035af69c01000000000100ba9b8b0400000000004cead10500000000026a520b77d667", "ab52abac526553", 3, -1955078165, "aec45480f27d013ebdff4cfe829aaeaef2f9b9009b874f845d0ee67628190ff7"], ["35df11f004a48ba439aba878fe9df20cc935b4a761c262b1b707e6f2b33e2bb7565cd68b130000000000ffffffffb2a2f99abf64163bb57ca900500b863f40c02632dfd9ea2590854c5fb4811da90200000006ac006363636affffffffaf9d89b2a8d2670ca37c8f7c140600b81259f2e037cb4590578ec6e37af8bf200000000005abac6a655270a4751eb551f058a93301ffeda2e252b6614a1fdd0e283e1d9fe53c96c5bbaafaac57b8030000000153ffffffff020d9f3b02000000000100ed7008030000000004abac000000000000", "abac", 3, 593793071, "88fdee1c2d4aeead71d62396e28dc4d00e5a23498eea66844b9f5d26d1f21042"], ["a08ff466049fb7619e25502ec22fedfb229eaa1fe275aa0b5a23154b318441bf547989d0510000000005ab5363636affffffff2b0e335cb5383886751cdbd993dc0720817745a6b1c9b8ab3d15547fc9aafd03000000000965656a536a52656a532b53d10584c290d3ac1ab74ab0a19201a4a039cb59dc58719821c024f6bf2eb26322b33f010000000965ac6aac0053ab6353ffffffff048decba6ebbd2db81e416e39dde1f821ba69329725e702bcdea20c5cc0ecc6402000000086363ab5351ac6551466e377b0468c0fa00000000000651ab53ac6a513461c6010000000008636a636365535100eeb3dc010000000006526a52ac516a43f362010000000005000063536500000000", "0063516a", 1, -1158911348, "f6a1ecb50bd7c2594ebecea5a1aa23c905087553e40486dade793c2f127fdfae"], ["5ac2f17d03bc902e2bac2469907ec7d01a62b5729340bc58c343b7145b66e6b97d434b30fa000000000163ffffffff44028aa674192caa0d0b4ebfeb969c284cb16b80c312d096efd80c6c6b094cca000000000763acabac516a52ffffffff10c809106e04b10f9b43085855521270fb48ab579266e7474657c6c625062d2d030000000351636595a0a97004a1b69603000000000465ab005352ad68010000000008636a5263acac5100da7105010000000002acab90325200000000000000000000", "6a6aab516a63526353", 2, 1518400956, "f7efb74b1dcc49d316b49c632301bc46f98d333c427e55338be60c7ef0d953be"], ["aeb2e11902dc3770c218b97f0b1960d6ee70459ecb6a95eff3f05295dc1ef4a0884f10ba460300000005516352526393e9b1b3e6ae834102d699ddd3845a1e159aa7cf7635edb5c02003f7830fee3788b795f20100000009ab006a526553ac006ad8809c570469290e0400000000050000abab00b10fd5040000000008ab655263abac53ab630b180300000000009d9993040000000002516300000000", "5351ababac6a65", 0, 1084852870, "f2286001af0b0170cbdad92693d0a5ebaa8262a4a9d66e002f6d79a8c94026d1"], - ["9860ca9a0294ff4812534def8c3a3e3db35b817e1a2ddb7f0bf673f70eab71bb79e90a2f3100000000086a636551acac5165ffffffffed4d6d3cd9ff9b2d490e0c089739121161a1445844c3e204296816ab06e0a83702000000035100ac88d0db5201c3b59a050000000005ac6a0051ab00000000", "535263ab006a526aab", 1, -962088116, "30df2473e1403e2b8e637e576825f785528d998af127d501556e5f7f5ed89a2a"], + ["9860ca9a0294ff4812534def8c3a3e3db35b817e1a2ddb7f0bf673f70eab71bb79e90a2f3100000000086a636551acac5165ffffffffed4d6d3cd9ff9b2d490e0c089739121161a1445844c3e204296816ab06e0a83702000000035100ac88d0db5201c3b59a050000000005ac6a0051ab00000000", "535263ab006a526aab", 1, -962088116, "c712e9109a1b77e93689e5c518d1b6f3b72149bcbe40b65832223345be9e336e"], ["4ddaa680026ec4d8060640304b86823f1ac760c260cef81d85bd847952863d629a3002b54b0200000008526365636a656aab65457861fc6c24bdc760c8b2e906b6656edaf9ed22b5f50e1fb29ec076ceadd9e8ebcb6b000000000152ffffffff033ff04f00000000000551526a00657a1d900300000000002153af040000000003006a6300000000", "ab526a53acabab", 0, 1055317633, "7f21b62267ed52462e371a917eb3542569a4049b9dfca2de3c75872b39510b26"], ["01e76dcd02ad54cbc8c71d68eaf3fa7c883b65d74217b30ba81f1f5144ef80b706c0dc82ca000000000352ab6a078ec18bcd0514825feced2e8b8ea1ccb34429fae41c70cc0b73a2799e85603613c6870002000000086363ab6365536a53ffffffff043acea90000000000016ad20e1803000000000100fa00830200000000056352515351e864ee00000000000865535253ab6a6551d0c46672", "6a6365abacab", 0, -1420559003, "8af0b4cbdbc011be848edf4dbd2cde96f0578d662cfebc42252495387114224a"], - ["fa00b26402670b97906203434aa967ce1559d9bd097d56dbe760469e6032e7ab61accb54160100000006635163630052fffffffffe0d3f4f0f808fd9cfb162e9f0c004601acf725cd7ea5683bbdc9a9a433ef15a0200000005ab52536563d09c7bef049040f305000000000153a7c7b9020000000004ac63ab52847a2503000000000553ab00655390ed80010000000005006553ab52860671d4", "536565ab52", 0, 799022412, "40ed8e7bbbd893e15f3cce210ae02c97669818de5946ca37eefc7541116e2c78"], - ["cb5c06dc01b022ee6105ba410f0eb12b9ce5b5aa185b28532492d839a10cef33d06134b91b010000000153ffffffff02cec0530400000000005e1e4504000000000865656551acacac6a00000000", "ab53", 0, -1514251329, "136beb95459fe6b126cd6cefd54eb5d971524b0e883e41a292a78f78015cb8d5"], - ["f10a0356031cd569d652dbca8e7a4d36c8da33cdff428d003338602b7764fe2c96c505175b010000000465ac516affffffffbb54563c71136fa944ee20452d78dc87073ac2365ba07e638dce29a5d179da600000000003635152ffffffff9a411d8e2d421b1e6085540ee2809901e590940bbb41532fa38bd7a16b68cc350100000007535251635365636195df1603b61c45010000000002ab65bf6a310400000000026352fcbba10200000000016aa30b7ff0", "5351", 0, 1552495929, "9eb8adf2caecb4bf9ac59d7f46bd20e83258472db2f569ee91aba4cf5ee78e29"], - ["c3325c9b012f659466626ca8f3c61dfd36f34670abc054476b7516a1839ec43cd0870aa0c0000000000753525265005351e7e3f04b0112650500000000000363ac6300000000", "acac", 0, -68961433, "5ca70e727d91b1a42b78488af2ed551642c32d3de4712a51679f60f1456a8647"], - ["2333e54c044370a8af16b9750ac949b151522ea6029bacc9a34261599549581c7b4e5ece470000000007510052006563abffffffff80630fc0155c750ce20d0ca4a3d0c8e8d83b014a5b40f0b0be0dd4c63ac28126020000000465000000ffffffff1b5f1433d38cdc494093bb1d62d84b10abbdae57e3d04e82e600857ab3b1dc990300000003515100b76564be13e4890a908ea7508afdad92ec1b200a9a67939fadce6eb7a29eb4550a0a28cb0300000001acffffffff02926c930300000000016373800201000000000153d27ee740", "ab6365ab516a53", 3, 598653797, "2be27a686eb7940dd32c44ff3a97c1b28feb7ab9c5c0b1593b2d762361cfc2db"], - ["b500ca48011ec57c2e5252e5da6432089130603245ffbafb0e4c5ffe6090feb629207eeb0e010000000652ab6a636aab8302c9d2042b44f40500000000015278c05a050000000004ac5251524be080020000000007636aac63ac5252c93a9a04000000000965ab6553636aab5352d91f9ddb", "52005100", 0, -2024394677, "49c8a6940a461cc7225637f1e512cdd174c99f96ec05935a59637ededc77124c"], - ["f52ff64b02ee91adb01f3936cc42e41e1672778962b68cf013293d649536b519bc3271dd2c00000000020065afee11313784849a7c15f44a61cd5fd51ccfcdae707e5896d131b082dc9322a19e12858501000000036aac654e8ca882022deb7c020000000006006a515352abd3defc0000000000016300000000", "63520063", 0, 1130989496, "7f208df9a5507e98c62cebc5c1e2445eb632e95527594929b9577b53363e96f6"], - ["ab7d6f36027a7adc36a5cf7528fe4fb5d94b2c96803a4b38a83a675d7806dda62b380df86a0000000003000000ffffffff5bc00131e29e22057c04be854794b4877dda42e416a7a24706b802ff9da521b20000000007ac6a0065ac52ac957cf45501b9f06501000000000500ac6363ab25f1110b", "00526500536a635253", 0, 911316637, "5fa09d43c8aef6f6fa01c383a69a5a61a609cd06e37dce35a39dc9eae3ddfe6c"], - ["f940888f023dce6360263c850372eb145b864228fdbbb4c1186174fa83aab890ff38f8c9a90300000000ffffffff01e80ccdb081e7bbae1c776531adcbfb77f2e5a7d0e5d0d0e2e6c8758470e85f00000000020053ffffffff03b49088050000000004656a52ab428bd604000000000951630065ab63ac636a0cbacf0400000000070063ac5265ac53d6e16604", "ac63", 0, 39900215, "713ddeeefcfe04929e7b6593c792a4efbae88d2b5280d1f0835d2214eddcbad6"], - ["530ecd0b01ec302d97ef6f1b5a6420b9a239714013e20d39aa3789d191ef623fc215aa8b940200000005ac5351ab6a3823ab8202572eaa04000000000752ab6a51526563fd8a270100000000036a006581a798f0", "525153656a0063", 0, 1784562684, "fe42f73a8742676e640698222b1bd6b9c338ff1ccd766d3d88d7d3c6c6ac987e"], - ["5d781d9303acfcce964f50865ddfddab527ea971aee91234c88e184979985c00b4de15204b0100000003ab6352a009c8ab01f93c8ef2447386c434b4498538f061845862c3f9d5751ad0fce52af442b3a902000000045165ababb909c66b5a3e7c81b3c45396b944be13b8aacfc0204f3f3c105a66fa8fa6402f1b5efddb01000000096a65ac636aacab656ac3c677c402b79fa4050000000004006aab5133e35802000000000751ab635163ab0078c2e025", "6aac51636a6a005265", 0, -882306874, "551ce975d58647f10adefb3e529d9bf9cda34751627ec45e690f135ef0034b95"], + ["fa00b26402670b97906203434aa967ce1559d9bd097d56dbe760469e6032e7ab61accb54160100000006635163630052fffffffffe0d3f4f0f808fd9cfb162e9f0c004601acf725cd7ea5683bbdc9a9a433ef15a0200000005ab52536563d09c7bef049040f305000000000153a7c7b9020000000004ac63ab52847a2503000000000553ab00655390ed80010000000005006553ab52860671d4", "536565ab52", 0, 799022412, "1d012f3cf718b47c0b0da922457278a8f2d8924f5aa995d4297edd852c757412"], + ["cb5c06dc01b022ee6105ba410f0eb12b9ce5b5aa185b28532492d839a10cef33d06134b91b010000000153ffffffff02cec0530400000000005e1e4504000000000865656551acacac6a00000000", "ab53", 0, -1514251329, "9c7f5099681d10ae90dcd3371b0d91abcd750dcb814d8b086292d59453e5feea"], + ["f10a0356031cd569d652dbca8e7a4d36c8da33cdff428d003338602b7764fe2c96c505175b010000000465ac516affffffffbb54563c71136fa944ee20452d78dc87073ac2365ba07e638dce29a5d179da600000000003635152ffffffff9a411d8e2d421b1e6085540ee2809901e590940bbb41532fa38bd7a16b68cc350100000007535251635365636195df1603b61c45010000000002ab65bf6a310400000000026352fcbba10200000000016aa30b7ff0", "5351", 0, 1552495929, "bc2e6724e54c289adb169d6a7830f093bbc0285aa7cc14882ab1c0f0ced08cfa"], + ["c3325c9b012f659466626ca8f3c61dfd36f34670abc054476b7516a1839ec43cd0870aa0c0000000000753525265005351e7e3f04b0112650500000000000363ac6300000000", "acac", 0, -68961433, "36a310a2ab177d9cac548b9536f7bf709756ccd253e619b5a56947873e416b92"], + ["2333e54c044370a8af16b9750ac949b151522ea6029bacc9a34261599549581c7b4e5ece470000000007510052006563abffffffff80630fc0155c750ce20d0ca4a3d0c8e8d83b014a5b40f0b0be0dd4c63ac28126020000000465000000ffffffff1b5f1433d38cdc494093bb1d62d84b10abbdae57e3d04e82e600857ab3b1dc990300000003515100b76564be13e4890a908ea7508afdad92ec1b200a9a67939fadce6eb7a29eb4550a0a28cb0300000001acffffffff02926c930300000000016373800201000000000153d27ee740", "ab6365ab516a53", 3, 598653797, "18b67b7cddeb877c9f691ab7edef215ecc41c1a799f617968d25b818bbd456f4"], + ["b500ca48011ec57c2e5252e5da6432089130603245ffbafb0e4c5ffe6090feb629207eeb0e010000000652ab6a636aab8302c9d2042b44f40500000000015278c05a050000000004ac5251524be080020000000007636aac63ac5252c93a9a04000000000965ab6553636aab5352d91f9ddb", "52005100", 0, -2024394677, "0dd01e8bf5316ce68f44c6058ddedc4a6415f8316c081ef0ce65cdab0be5215a"], + ["f52ff64b02ee91adb01f3936cc42e41e1672778962b68cf013293d649536b519bc3271dd2c00000000020065afee11313784849a7c15f44a61cd5fd51ccfcdae707e5896d131b082dc9322a19e12858501000000036aac654e8ca882022deb7c020000000006006a515352abd3defc0000000000016300000000", "63520063", 0, 1130989496, "d9815ba43bfb0e675144abbdd3a16644fc1b89b2566cfc1d2c3e4296f9fa6d91"], + ["ab7d6f36027a7adc36a5cf7528fe4fb5d94b2c96803a4b38a83a675d7806dda62b380df86a0000000003000000ffffffff5bc00131e29e22057c04be854794b4877dda42e416a7a24706b802ff9da521b20000000007ac6a0065ac52ac957cf45501b9f06501000000000500ac6363ab25f1110b", "00526500536a635253", 0, 911316637, "4347cdceae982505c17e919effc6b80d971fde13e9977008d67004e964d39010"], + ["f940888f023dce6360263c850372eb145b864228fdbbb4c1186174fa83aab890ff38f8c9a90300000000ffffffff01e80ccdb081e7bbae1c776531adcbfb77f2e5a7d0e5d0d0e2e6c8758470e85f00000000020053ffffffff03b49088050000000004656a52ab428bd604000000000951630065ab63ac636a0cbacf0400000000070063ac5265ac53d6e16604", "ac63", 0, 39900215, "c9b66747c2fac2c1ff326202ff0a1d1c02edca7297e6002f0adc45da6a1573e4"], + ["530ecd0b01ec302d97ef6f1b5a6420b9a239714013e20d39aa3789d191ef623fc215aa8b940200000005ac5351ab6a3823ab8202572eaa04000000000752ab6a51526563fd8a270100000000036a006581a798f0", "525153656a0063", 0, 1784562684, "fcd6f7a24fea2fe4f84c3b7f86bb832507e7f68a264bc10100abb05cbe9cc7f6"], + ["5d781d9303acfcce964f50865ddfddab527ea971aee91234c88e184979985c00b4de15204b0100000003ab6352a009c8ab01f93c8ef2447386c434b4498538f061845862c3f9d5751ad0fce52af442b3a902000000045165ababb909c66b5a3e7c81b3c45396b944be13b8aacfc0204f3f3c105a66fa8fa6402f1b5efddb01000000096a65ac636aacab656ac3c677c402b79fa4050000000004006aab5133e35802000000000751ab635163ab0078c2e025", "6aac51636a6a005265", 0, -882306874, "67143fd2c0eb76d63be653e673e0921138902d60a5ee8b2f8a1440ea9927d21b"], ["25ee54ef0187387564bb86e0af96baec54289ca8d15e81a507a2ed6668dc92683111dfb7a50100000004005263634cecf17d0429aa4d000000000007636a6aabab5263daa75601000000000251ab4df70a01000000000151980a890400000000065253ac6a006377fd24e3", "65ab", 0, 797877378, "069f38fd5d47abff46f04ee3ae27db03275e9aa4737fa0d2f5394779f9654845"], ["a9c57b1a018551bcbc781b256642532bbc09967f1cbe30a227d352a19365d219d3f11649a3030000000451655352b140942203182894030000000006ab00ac6aab654add350400000000003d379505000000000553abacac00e1739d36", "5363", 0, -1069721025, "6da32416deb45a0d720a1dbe6d357886eabc44029dd5db74d50feaffbe763245"], ["05c4fb94040f5119dc0b10aa9df054871ed23c98c890f1e931a98ffb0683dac45e98619fdc0200000007acab6a525263513e7495651c9794c4d60da835d303eb4ee6e871f8292f6ad0b32e85ef08c9dc7aa4e03c9c010000000500ab52acacfffffffffee953259cf14ced323fe8d567e4c57ba331021a1ef5ac2fa90f7789340d7c550100000007ac6aacac6a6a53ffffffff08d9dc820d00f18998af247319f9de5c0bbd52a475ea587f16101af3afab7c210100000003535363569bca7c0468e34f00000000000863536353ac51ac6584e319010000000006650052ab6a533debea030000000003ac0053ee7070020000000006ac52005253ac00000000", "6351005253", 2, 1386916157, "76c4013c40bfa1481badd9d342b6d4b8118de5ab497995fafbf73144469e5ff0"], - ["c95ab19104b63986d7303f4363ca8f5d2fa87c21e3c5d462b99f1ebcb7c402fc012f5034780000000009006aac63ac65655265ffffffffbe91afa68af40a8700fd579c86d4b706c24e47f7379dad6133de389f815ef7f501000000046aac00abffffffff1520db0d81be4c631878494668d258369f30b8f2b7a71e257764e9a27f24b48701000000076a515100535300b0a989e1164db9499845bac01d07a3a7d6d2c2a76e4c04abe68f808b6e2ef5068ce6540e0100000009ac53636a63ab65656affffffff0309aac6050000000005ab6563656a6067e8020000000003ac536aec91c8030000000009655251ab65ac6a53acc7a45bc5", "63526a65abac", 1, 512079270, "fb7eca81d816354b6aedec8cafc721d5b107336657acafd0d246049556f9e04b"], - ["ca66ae10049533c2b39f1449791bd6d3f039efe0a121ab7339d39ef05d6dcb200ec3fb2b3b020000000465006a53ffffffff534b8f97f15cc7fb4f4cea9bf798472dc93135cd5b809e4ca7fe4617a61895980100000000ddd83c1dc96f640929dd5e6f1151dab1aa669128591f153310d3993e562cc7725b6ae3d903000000046a52536582f8ccddb8086d8550f09128029e1782c3f2624419abdeaf74ecb24889cc45ac1a64492a0100000002516a4867b41502ee6ccf03000000000752acacab52ab6a4b7ba80000000000075151ab0052536300000000", "6553", 2, -62969257, "8085e904164ab9a8c20f58f0d387f6adb3df85532e11662c03b53c3df8c943cb"], - ["ba646d0b0453999f0c70cb0430d4cab0e2120457bb9128ed002b6e9500e9c7f8d7baa20abe0200000001652a4e42935b21db02b56bf6f08ef4be5adb13c38bc6a0c3187ed7f6197607ba6a2c47bc8a03000000040052516affffffffa55c3cbfc19b1667594ac8681ba5d159514b623d08ed4697f56ce8fcd9ca5b0b00000000096a6a5263ac655263ab66728c2720fdeabdfdf8d9fb2bfe88b295d3b87590e26a1e456bad5991964165f888c03a0200000006630051ac00acffffffff0176fafe0100000000070063acac65515200000000", "63", 1, 2002322280, "9db4e320208185ee70edb4764ee195deca00ba46412d5527d9700c1cf1c3d057"], + ["c95ab19104b63986d7303f4363ca8f5d2fa87c21e3c5d462b99f1ebcb7c402fc012f5034780000000009006aac63ac65655265ffffffffbe91afa68af40a8700fd579c86d4b706c24e47f7379dad6133de389f815ef7f501000000046aac00abffffffff1520db0d81be4c631878494668d258369f30b8f2b7a71e257764e9a27f24b48701000000076a515100535300b0a989e1164db9499845bac01d07a3a7d6d2c2a76e4c04abe68f808b6e2ef5068ce6540e0100000009ac53636a63ab65656affffffff0309aac6050000000005ab6563656a6067e8020000000003ac536aec91c8030000000009655251ab65ac6a53acc7a45bc5", "63526a65abac", 1, 512079270, "90a4706f98fdc7cc50e89b42866835fbeb79b600443e11733fccfc1806d29992"], + ["ca66ae10049533c2b39f1449791bd6d3f039efe0a121ab7339d39ef05d6dcb200ec3fb2b3b020000000465006a53ffffffff534b8f97f15cc7fb4f4cea9bf798472dc93135cd5b809e4ca7fe4617a61895980100000000ddd83c1dc96f640929dd5e6f1151dab1aa669128591f153310d3993e562cc7725b6ae3d903000000046a52536582f8ccddb8086d8550f09128029e1782c3f2624419abdeaf74ecb24889cc45ac1a64492a0100000002516a4867b41502ee6ccf03000000000752acacab52ab6a4b7ba80000000000075151ab0052536300000000", "6553", 2, -62969257, "e57e3c0a3853e73a1fa97a9934c7ff74cd9bfdc663b4336b3db9b7dd11c9a1cd"], + ["ba646d0b0453999f0c70cb0430d4cab0e2120457bb9128ed002b6e9500e9c7f8d7baa20abe0200000001652a4e42935b21db02b56bf6f08ef4be5adb13c38bc6a0c3187ed7f6197607ba6a2c47bc8a03000000040052516affffffffa55c3cbfc19b1667594ac8681ba5d159514b623d08ed4697f56ce8fcd9ca5b0b00000000096a6a5263ac655263ab66728c2720fdeabdfdf8d9fb2bfe88b295d3b87590e26a1e456bad5991964165f888c03a0200000006630051ac00acffffffff0176fafe0100000000070063acac65515200000000", "63", 1, 2002322280, "76ca1ca7123702c57cb20084471933af4faaac9fd1f9bc3f565e791d228aacea"], ["2ddb8f84039f983b45f64a7a79b74ff939e3b598b38f436def7edd57282d0803c7ef34968d02000000026a537eb00c4187de96e6e397c05f11915270bcc383959877868ba93bac417d9f6ed9f627a7930300000004516551abffffffffacc12f1bb67be3ae9f1d43e55fda8b885340a0df1175392a8bbd9f959ad3605003000000025163ffffffff02ff0f4700000000000070bd99040000000003ac53abf8440b42", "", 2, -393923011, "0133f1a161363b71dfb3a90065c7128c56bd0028b558b610142df79e055ab5c7"], - ["b21fc15403b4bdaa994204444b59323a7b8714dd471bd7f975a4e4b7b48787e720cbd1f5f00000000000ffffffff311533001cb85c98c1d58de0a5fbf27684a69af850d52e22197b0dc941bc6ca9030000000765ab6363ab5351a8ae2c2c7141ece9a4ff75c43b7ea9d94ec79b7e28f63e015ac584d984a526a73fe1e04e0100000007526352536a5365ffffffff02a0a9ea030000000002ab52cfc4f300000000000465525253e8e0f342", "000000", 1, 1305253970, "d1df1f4bba2484cff8a816012bb6ec91c693e8ca69fe85255e0031711081c46a"], - ["d1704d6601acf710b19fa753e307cfcee2735eada0d982b5df768573df690f460281aad12d0000000007656300005100acffffffff0232205505000000000351ab632ca1bc0300000000016300000000", "ac65ab65ab51", 0, 165179664, "40b4f03c68288bdc996011b0f0ddb4b48dc3be6762db7388bdc826113266cd6c"], + ["b21fc15403b4bdaa994204444b59323a7b8714dd471bd7f975a4e4b7b48787e720cbd1f5f00000000000ffffffff311533001cb85c98c1d58de0a5fbf27684a69af850d52e22197b0dc941bc6ca9030000000765ab6363ab5351a8ae2c2c7141ece9a4ff75c43b7ea9d94ec79b7e28f63e015ac584d984a526a73fe1e04e0100000007526352536a5365ffffffff02a0a9ea030000000002ab52cfc4f300000000000465525253e8e0f342", "000000", 1, 1305253970, "4edb88f00a28988519e92b3bb3ee02cf103122e77fac2dbd14d96c319ebdd624"], + ["d1704d6601acf710b19fa753e307cfcee2735eada0d982b5df768573df690f460281aad12d0000000007656300005100acffffffff0232205505000000000351ab632ca1bc0300000000016300000000", "ac65ab65ab51", 0, 165179664, "7706ae7d56cf9f287fe2555d79342400c1c3763b9e7136bf6c7d449a64664790"], ["d2f6c096025cc909952c2400bd83ac3d532bfa8a1f8f3e73c69b1fd7b8913379793f3ce92202000000076a00ab6a53516ade5332d81d58b22ed47b2a249ab3a2cb3a6ce9a6b5a6810e18e3e1283c1a1b3bd73e3ab00300000002acabffffffff01a9b2d40500000000056352abab00dc4b7f69", "ab0065", 0, -78019184, "2ef025e907f0fa454a2b48a4f3b81346ba2b252769b5c35d742d0c8985e0bf5e"], - ["3e6db1a1019444dba461247224ad5933c997256d15c5d37ade3d700506a0ba0a57824930d7010000000852ab6500ab00ac00ffffffff03389242020000000001aba8465a0200000000086a6a636a5100ab52394e6003000000000953ac51526351000053d21d9800", "abababacab53ab65", 0, 1643661850, "1f8a3aca573a609f4aea0c69522a82fcb4e15835449da24a05886ddc601f4f6a"], - ["f821a042036ad43634d29913b77c0fc87b4af593ac86e9a816a9d83fd18dfcfc84e1e1d57102000000076a63ac52006351ffffffffbcdaf490fc75086109e2f832c8985716b3a624a422cf9412fe6227c10585d21203000000095252abab5352ac526affffffff2efed01a4b73ad46c7f7bc7fa3bc480f8e32d741252f389eaca889a2e9d2007e000000000353ac53ffffffff032ac8b3020000000009636300000063516300d3d9f2040000000006510065ac656aafa5de0000000000066352ab5300ac9042b57d", "525365", 1, 667065611, "0d17a92c8d5041ba09b506ddf9fd48993be389d000aad54f9cc2a44fcc70426b"], + ["3e6db1a1019444dba461247224ad5933c997256d15c5d37ade3d700506a0ba0a57824930d7010000000852ab6500ab00ac00ffffffff03389242020000000001aba8465a0200000000086a6a636a5100ab52394e6003000000000953ac51526351000053d21d9800", "abababacab53ab65", 0, 1643661850, "1093491f76864664b1bbe7febcf348035d5728d45d661c4d5d0d91f74c8384f4"], + ["f821a042036ad43634d29913b77c0fc87b4af593ac86e9a816a9d83fd18dfcfc84e1e1d57102000000076a63ac52006351ffffffffbcdaf490fc75086109e2f832c8985716b3a624a422cf9412fe6227c10585d21203000000095252abab5352ac526affffffff2efed01a4b73ad46c7f7bc7fa3bc480f8e32d741252f389eaca889a2e9d2007e000000000353ac53ffffffff032ac8b3020000000009636300000063516300d3d9f2040000000006510065ac656aafa5de0000000000066352ab5300ac9042b57d", "525365", 1, 667065611, "b4d053225817f2e55f30522876e64d674def6e5c8caa235bacf500dc766ee2ce"], ["58e3f0f704a186ef55d3919061459910df5406a9121f375e7502f3be872a449c3f2bb058380100000000f0e858da3ac57b6c973f889ad879ffb2bd645e91b774006dfa366c74e2794aafc8bbc871010000000751ac65516a515131a68f120fd88ca08687ceb4800e1e3fbfea7533d34c84fef70cc5a96b648d580369526d000000000600ac00515363f6191d5b3e460fa541a30a6e83345dedfa3ed31ad8574d46d7bbecd3c9074e6ba5287c24020000000151e3e19d6604162602010000000004005100ac71e17101000000000065b5e90300000000040053ab53f6b7d101000000000200ac00000000", "6563ab", 1, -669018604, "8221d5dfb75fc301a80e919e158e0b1d1e86ffb08870a326c89408d9bc17346b"], ["efec1cce044a676c1a3d973f810edb5a9706eb4cf888a240f2b5fb08636bd2db482327cf500000000005ab51656a52ffffffff46ef019d7c03d9456e5134eb0a7b5408d274bd8e33e83df44fab94101f7c5b650200000009ac5100006353630051407aadf6f5aaffbd318fdbbc9cae4bd883e67d524df06bb006ce2f7c7e2725744afb76960100000005536aab53acec0d64eae09e2fa1a7c4960354230d51146cf6dc45ee8a51f489e20508a785cbe6ca86fc000000000651536a516300ffffffff014ef598020000000006636aac655265a6ae1b75", "53516a5363526563ab", 2, -1823982010, "13e8b5ab4e5b2ceeff0045c625e19898bda2d39fd7af682e2d1521303cfe1154"], - ["3c436c2501442a5b700cbc0622ee5143b34b1b8021ea7bbc29e4154ab1f5bdfb3dff9d640501000000086aab5251ac5252acffffffff0170b9a20300000000066aab6351525114b13791", "63acabab52ab51ac65", 0, -2140612788, "87ddf1f9acb6640448e955bd1968f738b4b3e073983af7b83394ab7557f5cd61"], - ["d62f183e037e0d52dcf73f9b31f70554bce4f693d36d17552d0e217041e01f15ad3840c838000000000963acac6a6a6a63ab63ffffffffabdfb395b6b4e63e02a763830f536fc09a35ff8a0cf604021c3c751fe4c88f4d0300000006ab63ab65ac53aa4d30de95a2327bccf9039fb1ad976f84e0b4a0936d82e67eafebc108993f1e57d8ae39000000000165ffffffff04364ad30500000000036a005179fd84010000000007ab636aac6363519b9023030000000008510065006563ac6acd2a4a02000000000000000000", "52", 1, 595020383, "da8405db28726dc4e0f82b61b2bfd82b1baa436b4e59300305cc3b090b157504"], + ["3c436c2501442a5b700cbc0622ee5143b34b1b8021ea7bbc29e4154ab1f5bdfb3dff9d640501000000086aab5251ac5252acffffffff0170b9a20300000000066aab6351525114b13791", "63acabab52ab51ac65", 0, -2140612788, "5f836a0ac76267513f0682aca35e18939f15ef09b8f7092ccdb0bf0dbb963735"], + ["d62f183e037e0d52dcf73f9b31f70554bce4f693d36d17552d0e217041e01f15ad3840c838000000000963acac6a6a6a63ab63ffffffffabdfb395b6b4e63e02a763830f536fc09a35ff8a0cf604021c3c751fe4c88f4d0300000006ab63ab65ac53aa4d30de95a2327bccf9039fb1ad976f84e0b4a0936d82e67eafebc108993f1e57d8ae39000000000165ffffffff04364ad30500000000036a005179fd84010000000007ab636aac6363519b9023030000000008510065006563ac6acd2a4a02000000000000000000", "52", 1, 595020383, "acfa64c18a807386a27be94786b6cc2729bfcdddd54b312063e05bcb4837e0f1"], ["44c200a5021238de8de7d80e7cce905606001524e21c8d8627e279335554ca886454d692e6000000000500acac52abbb8d1dc876abb1f514e96b21c6e83f429c66accd961860dc3aed5071e153e556e6cf076d02000000056553526a51870a928d0360a580040000000004516a535290e1e302000000000851ab6a00510065acdd7fc5040000000007515363ab65636abb1ec182", "6363", 0, -785766894, "ed53cc766cf7cb8071cec9752460763b504b2183442328c5a9761eb005c69501"], ["d682d52d034e9b062544e5f8c60f860c18f029df8b47716cabb6c1b4a4b310a0705e754556020000000400656a0016eeb88eef6924fed207fba7ddd321ff3d84f09902ff958c815a2bf2bb692eb52032c4d803000000076365ac516a520099788831f8c8eb2552389839cfb81a9dc55ecd25367acad4e03cfbb06530f8cccf82802701000000085253655300656a53ffffffff02d543200500000000056a510052ac03978b05000000000700ac51525363acfdc4f784", "", 2, -696035135, "e1a256854099907050cfee7778f2018082e735a1f1a3d91437584850a74c87bb"], ["e8c0dec5026575ddf31343c20aeeca8770afb33d4e562aa8ee52eeda6b88806fdfd4fe0a97030000000953acabab65ab516552ffffffffdde122c2c3e9708874286465f8105f43019e837746686f442666629088a970e0010000000153ffffffff01f98eee0100000000025251fe87379a", "63", 1, 633826334, "abe441209165d25bc6d8368f2e7e7dc21019056719fef1ace45542aa2ef282e2"], ["b288c331011c17569293c1e6448e33a64205fc9dc6e35bc756a1ac8b97d18e912ea88dc0770200000007635300ac6aacabfc3c890903a3ccf8040000000004656500ac9c65c9040000000009ab6a6aabab65abac63ac5f7702000000000365005200000000", "526a63", 0, 1574937329, "0dd1bd5c25533bf5f268aa316ce40f97452cca2061f0b126a59094ca5b65f7a0"], - ["fc0a092003cb275fa9a25a72cf85d69c19e4590bfde36c2b91cd2c9c56385f51cc545530210000000004ab530063ffffffff729b006eb6d14d6e5e32b1c376acf1c62830a5d9246da38dbdb4db9f51fd1c74020000000463636500ffffffff0ae695c6d12ab7dcb8d3d4b547b03f178c7268765d1de9af8523d244e3836b12030000000151ffffffff0115c1e20100000000066a6aabac6a6a1ff59aec", "ab0053ac", 0, 931831026, "73fe22099c826c34a74edf45591f5d7b3a888c8178cd08facdfd96a9a681261c"], + ["fc0a092003cb275fa9a25a72cf85d69c19e4590bfde36c2b91cd2c9c56385f51cc545530210000000004ab530063ffffffff729b006eb6d14d6e5e32b1c376acf1c62830a5d9246da38dbdb4db9f51fd1c74020000000463636500ffffffff0ae695c6d12ab7dcb8d3d4b547b03f178c7268765d1de9af8523d244e3836b12030000000151ffffffff0115c1e20100000000066a6aabac6a6a1ff59aec", "ab0053ac", 0, 931831026, "8da7c3252803031fb5c0f152a12896536d6a6f2a6ee6b6d8badad9b6aaa20e88"], ["0fcae7e004a71a4a7c8f66e9450c0c1785268679f5f1a2ee0fb3e72413d70a9049ecff75de020000000452005251ffffffff99c8363c4b95e7ec13b8c017d7bb6e80f7c04b1187d6072961e1c2479b1dc0320200000000ffffffff7cf03b3d66ab53ed740a70c5c392b84f780fff5472aee82971ac3bfeeb09b2df0200000006ab5265636a0058e4fe9257d7c7c7e82ff187757c6eadc14cceb6664dba2de03a018095fd3006682a5b9600000000056353536a636de26b2303ff76de010000000001acdc0a2e020000000001ab0a53ed020000000007530063ab51510088417307", "ac6aacab5165535253", 2, -902160694, "eea96a48ee572aea33d75d0587ce954fcfb425531a7da39df26ef9a6635201be"], - ["612701500414271138e30a46b7a5d95c70c78cc45bf8e40491dac23a6a1b65a51af04e6b94020000000451655153ffffffffeb72dc0e49b2fad3075c19e1e6e4b387f1365dca43d510f6a02136318ddecb7f0200000003536352e115ffc4f9bae25ef5baf534a890d18106fb07055c4d7ec9553ba89ed1ac2101724e507303000000080063006563acabac2ff07f69a080cf61a9d19f868239e6a4817c0eeb6a4f33fe254045d8af2bca289a8695de0300000000430736c404d317840500000000086a00abac5351ab65306e0503000000000963ab0051536aabab6a6c8aca01000000000565516351ab5dcf960100000000016a00000000", "ab", 2, -604581431, "5ec805e74ee934aa815ca5f763425785ae390282d46b5f6ea076b6ad6255a842"], - ["6b68ba00023bb4f446365ea04d68d48539aae66f5b04e31e6b38b594d2723ab82d44512460000000000200acffffffff5dfc6febb484fff69c9eeb7c7eb972e91b6d949295571b8235b1da8955f3137b020000000851ac6352516a535325828c8a03365da801000000000800636aabac6551ab0f594d03000000000963ac536365ac63636a45329e010000000005abac53526a00000000", "005151", 0, 1317038910, "42f5ba6f5fe1e00e652a08c46715871dc4b40d89d9799fd7c0ea758f86eab6a7"], + ["612701500414271138e30a46b7a5d95c70c78cc45bf8e40491dac23a6a1b65a51af04e6b94020000000451655153ffffffffeb72dc0e49b2fad3075c19e1e6e4b387f1365dca43d510f6a02136318ddecb7f0200000003536352e115ffc4f9bae25ef5baf534a890d18106fb07055c4d7ec9553ba89ed1ac2101724e507303000000080063006563acabac2ff07f69a080cf61a9d19f868239e6a4817c0eeb6a4f33fe254045d8af2bca289a8695de0300000000430736c404d317840500000000086a00abac5351ab65306e0503000000000963ab0051536aabab6a6c8aca01000000000565516351ab5dcf960100000000016a00000000", "ab", 2, -604581431, "7eeb6302baf1cd5695ee3a866ef5df849c060bf589ce7c9da1ab357c7d8b2553"], + ["6b68ba00023bb4f446365ea04d68d48539aae66f5b04e31e6b38b594d2723ab82d44512460000000000200acffffffff5dfc6febb484fff69c9eeb7c7eb972e91b6d949295571b8235b1da8955f3137b020000000851ac6352516a535325828c8a03365da801000000000800636aabac6551ab0f594d03000000000963ac536365ac63636a45329e010000000005abac53526a00000000", "005151", 0, 1317038910, "49ae5bb61dbc82cf2ee8ad703bfc2b1771ec9fc18a7318654191532840ee70d5"], ["aff5850c0168a67296cc790c1b04a9ed9ad1ba0469263a9432fcb53676d1bb4e0eea8ea1410100000005ac65526a537d5fcb1d01d9c26d0200000000065265ab5153acc0617ca1", "51ab650063", 0, 1712981774, "8449d5247071325e5f8edcc93cb9666c0fecabb130ce0e5bef050575488477eb"], ["e6d6b9d8042c27aec99af8c12b6c1f7a80453e2252c02515e1f391da185df0874e133696b50300000006ac5165650065ffffffff6a4b60a5bfe7af72b198eaa3cde2e02aa5fa36bdf5f24ebce79f6ecb51f3b554000000000652656aababac2ec4c5a6cebf86866b1fcc4c5bd5f4b19785a8eea2cdfe58851febf87feacf6f355324a80100000001537100145149ac1e287cef62f6f5343579189fad849dd33f25c25bfca841cb696f10c5a34503000000046a636a63df9d7c4c018d96e20100000000015100000000", "53ab", 1, -1924777542, "f98f95d0c5ec3ac3e699d81f6c440d2e7843eab15393eb023bc5a62835d6dcea"], - ["046ac25e030a344116489cc48025659a363da60bc36b3a8784df137a93b9afeab91a04c1ed020000000951ab0000526a65ac51ffffffff6c094a03869fde55b9a8c4942a9906683f0a96e2d3e5a03c73614ea3223b2c29020000000500ab636a6affffffff3da7aa5ecef9071600866267674b54af1740c5aeb88a290c459caa257a2683cb0000000004ab6565ab7e2a1b900301b916030000000005abac63656308f4ed03000000000852ab53ac63ac51ac73d620020000000003ab00008deb1285", "6a", 2, 1299505108, "f79e6b776e2592bad45ca328c54abf14050c241d8f822d982c36ea890fd45757"], - ["bd515acd0130b0ac47c2d87f8d65953ec7d657af8d96af584fc13323d0c182a2e5f9a96573000000000652ac51acac65ffffffff0467aade000000000003655363dc577d050000000006515252ab5300137f60030000000007535163530065004cdc860500000000036a5265241bf53e", "acab", 0, 621090621, "771d4d87f1591a13d77e51858c16d78f1956712fe09a46ff1abcabbc1e7af711"], - ["ff1ae37103397245ac0fa1c115b079fa20930757f5b6623db3579cb7663313c2dc4a3ffdb300000000076353656a000053ffffffff83c59e38e5ad91216ee1a312d15b4267bae2dd2e57d1a3fd5c2f0f809eeb5d46010000000800abab6a6a53ab51ffffffff9d5e706c032c1e0ca75915f8c6686f64ec995ebcd2539508b7dd8abc3e4d7d2a01000000006b2bdcda02a8fe070500000000045253000019e31d04000000000700ab63acab526a00000000", "53656aab6a525251", 0, 881938872, "726bb88cdf3af2f7603a31f33d2612562306d08972a4412a55dbbc0e3363721c"], - ["ff5400dd02fec5beb9a396e1cbedc82bedae09ed44bae60ba9bef2ff375a6858212478844b03000000025253ffffffff01e46c203577a79d1172db715e9cc6316b9cfc59b5e5e4d9199fef201c6f9f0f000000000900ab6552656a5165acffffffff02e8ce62040000000002515312ce3e00000000000251513f119316", "", 0, 1541581667, "1e0da47eedbbb381b0e0debbb76e128d042e02e65b11125e17fd127305fc65cd"], + ["046ac25e030a344116489cc48025659a363da60bc36b3a8784df137a93b9afeab91a04c1ed020000000951ab0000526a65ac51ffffffff6c094a03869fde55b9a8c4942a9906683f0a96e2d3e5a03c73614ea3223b2c29020000000500ab636a6affffffff3da7aa5ecef9071600866267674b54af1740c5aeb88a290c459caa257a2683cb0000000004ab6565ab7e2a1b900301b916030000000005abac63656308f4ed03000000000852ab53ac63ac51ac73d620020000000003ab00008deb1285", "6a", 2, 1299505108, "a0b2e00b71de2a5c06c86e3e88ae08ea9360a9929545ebf14ad411099b419379"], + ["bd515acd0130b0ac47c2d87f8d65953ec7d657af8d96af584fc13323d0c182a2e5f9a96573000000000652ac51acac65ffffffff0467aade000000000003655363dc577d050000000006515252ab5300137f60030000000007535163530065004cdc860500000000036a5265241bf53e", "acab", 0, 621090621, "1d588a83452cbe7438add7d1644746d629fc36e074c63870ad8bd06edae0fdea"], + ["ff1ae37103397245ac0fa1c115b079fa20930757f5b6623db3579cb7663313c2dc4a3ffdb300000000076353656a000053ffffffff83c59e38e5ad91216ee1a312d15b4267bae2dd2e57d1a3fd5c2f0f809eeb5d46010000000800abab6a6a53ab51ffffffff9d5e706c032c1e0ca75915f8c6686f64ec995ebcd2539508b7dd8abc3e4d7d2a01000000006b2bdcda02a8fe070500000000045253000019e31d04000000000700ab63acab526a00000000", "53656aab6a525251", 0, 881938872, "a7bb42ba2f02f25d2235687a54942899c06b2d37625ed74ca3c207ca6277a0df"], + ["ff5400dd02fec5beb9a396e1cbedc82bedae09ed44bae60ba9bef2ff375a6858212478844b03000000025253ffffffff01e46c203577a79d1172db715e9cc6316b9cfc59b5e5e4d9199fef201c6f9f0f000000000900ab6552656a5165acffffffff02e8ce62040000000002515312ce3e00000000000251513f119316", "", 0, 1541581667, "d890d1cf9f1a8f048331e2d446f9f2eece4981f1917e6ab9356ab2f4447193c7"], ["28e3daa603c03626ad91ffd0ff927a126e28d29db5012588b829a06a652ea4a8a5732407030200000004ab6552acffffffff8e643146d3d0568fc2ad854fd7864d43f6f16b84e395db82b739f6f5c84d97b40000000004515165526b01c2dc1469db0198bd884e95d8f29056c48d7e74ff9fd37a9dec53e44b8769a6c99c030200000009ab006a516a53630065eea8738901002398000000000007ac5363516a51abeaef12f5", "52ab52515253ab", 2, 1687390463, "55591346aec652980885a558cc5fc2e3f8d21cbd09f314a798e5a7ead5113ea6"], - ["b54bf5ac043b62e97817abb892892269231b9b220ba08bc8dbc570937cd1ea7cdc13d9676c010000000451ab5365a10adb7b35189e1e8c00b86250f769319668189b7993d6bdac012800f1749150415b2deb0200000003655300ffffffff60b9f4fb9a7e17069fd00416d421f804e2ef2f2c67de4ca04e0241b9f9c1cc5d0200000003ab6aacfffffffff048168461cce1d40601b42fbc5c4f904ace0d35654b7cc1937ccf53fe78505a0100000008526563525265abacffffffff01dbf4e6040000000007acac656553636500000000", "63", 2, 882302077, "f5b38b0f06e246e47ce622e5ee27d5512c509f8ac0e39651b3389815eff2ab93"], + ["b54bf5ac043b62e97817abb892892269231b9b220ba08bc8dbc570937cd1ea7cdc13d9676c010000000451ab5365a10adb7b35189e1e8c00b86250f769319668189b7993d6bdac012800f1749150415b2deb0200000003655300ffffffff60b9f4fb9a7e17069fd00416d421f804e2ef2f2c67de4ca04e0241b9f9c1cc5d0200000003ab6aacfffffffff048168461cce1d40601b42fbc5c4f904ace0d35654b7cc1937ccf53fe78505a0100000008526563525265abacffffffff01dbf4e6040000000007acac656553636500000000", "63", 2, 882302077, "3838dc0a8cc2dddb6e268e879585ca5b315d0e487b54996961a69eac14cf7135"], ["ebf628b30360bab3fa4f47ce9e0dcbe9ceaf6675350e638baff0c2c197b2419f8e4fb17e16000000000452516365ac4d909a79be207c6e5fb44fbe348acc42fc7fe7ef1d0baa0e4771a3c4a6efdd7e2c118b0100000003acacacffffffffa6166e9101f03975721a3067f1636cc390d72617be72e5c3c4f73057004ee0ee010000000863636a6a516a5252c1b1e82102d8d54500000000000153324c900400000000015308384913", "0063516a51", 1, -1658428367, "eb2d8dea38e9175d4d33df41f4087c6fea038a71572e3bad1ea166353bf22184"], ["d6a8500303f1507b1221a91adb6462fb62d741b3052e5e7684ea7cd061a5fc0b0e93549fa50100000004acab65acfffffffffdec79bf7e139c428c7cfd4b35435ae94336367c7b5e1f8e9826fcb0ebaaaea30300000000ffffffffd115fdc00713d52c35ea92805414bd57d1e59d0e6d3b79a77ee18a3228278ada020000000453005151ffffffff040231510300000000085100ac6a6a000063c6041c0400000000080000536a6563acac138a0b04000000000263abd25fbe03000000000900656a00656aac510000000000", "ac526aac6a00", 1, -2007972591, "13d12a51598b34851e7066cd93ab8c5212d60c6ed2dae09d91672c10ccd7f87c"], ["658cb1c1049564e728291a56fa79987a4ed3146775fce078bd2e875d1a5ca83baf6166a82302000000056a656351ab2170e7d0826cbdb45fda0457ca7689745fd70541e2137bb4f52e7b432dcfe2112807bd720300000007006a0052536351ffffffff8715ca2977696abf86d433d5c920ef26974f50e9f4a20c584fecbb68e530af5101000000009e49d864155bf1d3c757186d29f3388fd89c7f55cc4d9158b4cf74ca27a35a1dd93f945502000000096a535353ac656351510d29fa870230b809040000000006ab6a6a526a633b41da050000000004ab6a6a65ed63bf62", "52acabac", 2, -1774073281, "53ab197fa7e27b8a3f99ff48305e67081eb90e95d89d7e92d80cee25a03a6689"], - ["e92492cc01aec4e62df67ea3bc645e2e3f603645b3c5b353e4ae967b562d23d6e043badecd0100000003acab65ffffffff02c7e5ea040000000002ab52e1e584010000000005536365515195d16047", "6551", 0, -424930556, "93c34627f526d73f4bea044392d1a99776b4409f7d3d835f23b03c358f5a61c2"], + ["e92492cc01aec4e62df67ea3bc645e2e3f603645b3c5b353e4ae967b562d23d6e043badecd0100000003acab65ffffffff02c7e5ea040000000002ab52e1e584010000000005536365515195d16047", "6551", 0, -424930556, "22bfefd68263fae9e1b60f0420c3e4b374b1206f4b09b58ea608cdf6bc7c246e"], ["02e242db04be2d8ced9179957e98cee395d4767966f71448dd084426844cbc6d15f2182e85030000000200650c8ffce3db9de9c3f9cdb9104c7cb26647a7531ad1ebf7591c259a9c9985503be50f8de30000000007ac6a51636a6353ffffffffa2e33e7ff06fd6469987ddf8a626853dbf30c01719efb259ae768f051f803cd30300000000fffffffffd69d8aead941683ca0b1ee235d09eade960e0b1df3cd99f850afc0af1b73e070300000001ab60bb602a011659670100000000076363526300acac00000000", "6353ab515251", 3, 1451100552, "bbc9069b8615f3a52ac8a77359098dcc6c1ba88c8372d5d5fe080b99eb781e55"], ["b28d5f5e015a7f24d5f9e7b04a83cd07277d452e898f78b50aae45393dfb87f94a26ef57720200000008ababac630053ac52ffffffff046475ed040000000008ab5100526363ac65c9834a04000000000251abae26b30100000000040000ac65ceefb900000000000000000000", "ac6551ac6a536553", 0, -1756558188, "5848d93491044d7f21884eef7a244fe7d38886f8ae60df49ce0dfb2a342cd51a"], ["efb8b09801f647553b91922a5874f8e4bb2ed8ddb3536ed2d2ed0698fac5e0e3a298012391030000000952ac005263ac52006affffffff04cdfa0f050000000007ac53ab51abac65b68d1b02000000000553ab65ac00d057d50000000000016a9e1fda010000000007ac63ac536552ac00000000", "6aac", 0, 1947322973, "603a9b61cd30fcea43ef0a5c18b88ca372690b971b379ee9e01909c336280511"], ["68a59fb901c21946797e7d07a4a3ea86978ce43df0479860d7116ac514ba955460bae78fff0000000001abffffffff03979be80100000000036553639300bc040000000008006552006a656565cfa78d0000000000076552acab63ab5100000000", "ab65ab", 0, 995583673, "3b320dd47f2702452a49a1288bdc74a19a4b849b132b6cad9a1d945d87dfbb23"], - ["67761f2a014a16f3940dcb14a22ba5dc057fcffdcd2cf6150b01d516be00ef55ef7eb07a830100000004636a6a51ffffffff01af67bd050000000008526553526300510000000000", "6a00", 0, 1570943676, "079fa62e9d9d7654da8b74b065da3154f3e63c315f25751b4d896733a1d67807"], - ["e20fe96302496eb436eee98cd5a32e1c49f2a379ceb71ada8a48c5382df7c8cd88bdc47ced03000000016556aa0e180660925a841b457aed0aae47fca2a92fa1d7afeda647abf67198a3902a7c80dd00000000085152ac636a535265bd18335e01803c810100000000046500ac52f371025e", "6363ab", 1, -651254218, "2921a0e5e3ba83c57ba57c25569380c17986bf34c366ec216d4188d5ba8b0b47"], - ["4e1bd9fa011fe7aa14eee8e78f27c9fde5127f99f53d86bc67bdab23ca8901054ee8a8b6eb0300000009ac535153006a6a0063ffffffff044233670500000000000a667205000000000652ab636a51abe5bf35030000000003535351d579e505000000000700630065ab51ac3419ac30", "52abac52", 0, -1807563680, "4aae6648f856994bed252d319932d78db55da50d32b9008216d5366b44bfdf8a"], - ["ec02fbee03120d02fde12574649660c441b40d330439183430c6feb404064d4f507e704f3c0100000000ffffffffe108d99c7a4e5f75cc35c05debb615d52fac6e3240a6964a29c1704d98017fb60200000002ab63fffffffff726ec890038977adfc9dadbeaf5e486d5fcb65dc23acff0dd90b61b8e2773410000000002ac65e9dace55010f881b010000000005ac00ab650000000000", "51ac525152ac6552", 2, -1564046020, "3f988922d8cd11c7adff1a83ce9499019e5ab5f424752d8d361cf1762e04269b"], + ["67761f2a014a16f3940dcb14a22ba5dc057fcffdcd2cf6150b01d516be00ef55ef7eb07a830100000004636a6a51ffffffff01af67bd050000000008526553526300510000000000", "6a00", 0, 1570943676, "87c181e8a1c80a803ac4f1d322fde62653347ab6a7fcabd25de54961dfe30863"], + ["e20fe96302496eb436eee98cd5a32e1c49f2a379ceb71ada8a48c5382df7c8cd88bdc47ced03000000016556aa0e180660925a841b457aed0aae47fca2a92fa1d7afeda647abf67198a3902a7c80dd00000000085152ac636a535265bd18335e01803c810100000000046500ac52f371025e", "6363ab", 1, -651254218, "81a4abcc10c7dbda50643b052b0d7d19a09d4db832884588ba0451ff021e4f69"], + ["4e1bd9fa011fe7aa14eee8e78f27c9fde5127f99f53d86bc67bdab23ca8901054ee8a8b6eb0300000009ac535153006a6a0063ffffffff044233670500000000000a667205000000000652ab636a51abe5bf35030000000003535351d579e505000000000700630065ab51ac3419ac30", "52abac52", 0, -1807563680, "55b2530c99ec1881fc9d99c221fef82f403cf1e579f8964ca566212dc05a69a0"], + ["ec02fbee03120d02fde12574649660c441b40d330439183430c6feb404064d4f507e704f3c0100000000ffffffffe108d99c7a4e5f75cc35c05debb615d52fac6e3240a6964a29c1704d98017fb60200000002ab63fffffffff726ec890038977adfc9dadbeaf5e486d5fcb65dc23acff0dd90b61b8e2773410000000002ac65e9dace55010f881b010000000005ac00ab650000000000", "51ac525152ac6552", 2, -1564046020, "88ce30c36f5adc3bacce14d136e37a07a7e100f65248648244ccf9fde6138a9d"], ["23dbdcc1039c99bf11938d8e3ccec53b60c6c1d10c8eb6c31197d62c6c4e2af17f52115c3a0300000008636352000063ababffffffff17823880e1df93e63ad98c29bfac12e36efd60254346cac9d3f8ada020afc0620300000003ab63631c26f002ac66e86cd22a25e3ed3cb39d982f47c5118f03253054842daadc88a6c41a2e1500000000096a00ab636a53635163195314de015570fd0100000000096a5263acab5200005300000000", "ababac6a6553", 1, 11586329, "bd36a50e0e0a4ecbf2709e68daef41eddc1c0c9769efaee57910e99c0a1d1343"], ["33b03bf00222c7ca35c2f8870bbdef2a543b70677e413ce50494ac9b22ea673287b6aa55c50000000005ab00006a52ee4d97b527eb0b427e4514ea4a76c81e68c34900a23838d3e57d0edb5410e62eeb8c92b6000000000553ac6aacac42e59e170326245c000000000009656553536aab516aabb1a10603000000000852ab52ab6a516500cc89c802000000000763ac6a63ac516300000000", "", 0, 557416556, "41bead1b073e1e9fee065dd612a617ca0689e8f9d3fed9d0acfa97398ebb404c"], - ["813eda1103ac8159850b4524ef65e4644e0fc30efe57a5db0c0365a30446d518d9b9aa8fdd0000000003656565c2f1e89448b374b8f12055557927d5b33339c52228f7108228149920e0b77ef0bcd69da60000000006abac00ab63ab82cdb7978d28630c5e1dc630f332c4245581f787936f0b1e84d38d33892141974c75b4750300000004ac53ab65ffffffff0137edfb02000000000000000000", "0063", 1, -1948560575, "71dfcd2eb7f2e6473aed47b16a6d5fcbd0af22813d892e9765023151e07771ec"], - ["9e45d9aa0248c16dbd7f435e8c54ae1ad086de50c7b25795a704f3d8e45e1886386c653fbf01000000025352fb4a1acefdd27747b60d1fb79b96d14fb88770c75e0da941b7803a513e6d4c908c6445c7010000000163ffffffff014069a8010000000001520a794fb3", "51ac005363", 1, -719113284, "0d31a221c69bd322ef7193dd7359ddfefec9e0a1521d4a8740326d46e44a5d6a"], + ["813eda1103ac8159850b4524ef65e4644e0fc30efe57a5db0c0365a30446d518d9b9aa8fdd0000000003656565c2f1e89448b374b8f12055557927d5b33339c52228f7108228149920e0b77ef0bcd69da60000000006abac00ab63ab82cdb7978d28630c5e1dc630f332c4245581f787936f0b1e84d38d33892141974c75b4750300000004ac53ab65ffffffff0137edfb02000000000000000000", "0063", 1, -1948560575, "af1583a5d0c62214f9d034c249b4807e5936599e6482bed1891eb2e6f9e3a385"], + ["9e45d9aa0248c16dbd7f435e8c54ae1ad086de50c7b25795a704f3d8e45e1886386c653fbf01000000025352fb4a1acefdd27747b60d1fb79b96d14fb88770c75e0da941b7803a513e6d4c908c6445c7010000000163ffffffff014069a8010000000001520a794fb3", "51ac005363", 1, -719113284, "22cc3d6b268676b3525df39015fc0d65e99e74f2b36e00fb602500e1142abbac"], ["36e42018044652286b19a90e5dd4f8d9f361d0760d080c5c5add1970296ff0f1de630233c8010000000200ac39260c7606017d2246ee14ddb7611586178067e6a4be38e788e33f39a3a95a55a13a6775010000000352ac638bea784f7c2354ed02ea0b93f0240cdfb91796fa77649beee6f7027caa70778b091deee700000000066a65ac656363ffffffff4d9d77ab676d711267ef65363f2d192e1bd55d3cd37f2280a34c72e8b4c559d700000000056a006aab00001764e1020d30220100000000085252516aacab0053472097040000000009635353ab6a636a5100a56407a1", "006a536551ab53ab", 0, 827296034, "daec2af5622bbe220c762da77bab14dc75e7d28aa1ade9b7f100798f7f0fd97a"], - ["5e06159a02762b5f3a5edcdfc91fd88c3bff08b202e69eb5ba74743e9f4291c4059ab008200000000001ac348f5446bb069ef977f89dbe925795d59fb5d98562679bafd61f5f5f3150c3559582992d0000000008ab5165515353abac762fc67703847ec6010000000000e200cf040000000002abaca64b86010000000008520000515363acabb82b491b", "ab53525352ab6a", 0, -61819505, "75a7db0df41485a28bf6a77a37ca15fa8eccc95b5d6014a731fd8adb9ada0f12"], + ["5e06159a02762b5f3a5edcdfc91fd88c3bff08b202e69eb5ba74743e9f4291c4059ab008200000000001ac348f5446bb069ef977f89dbe925795d59fb5d98562679bafd61f5f5f3150c3559582992d0000000008ab5165515353abac762fc67703847ec6010000000000e200cf040000000002abaca64b86010000000008520000515363acabb82b491b", "ab53525352ab6a", 0, -61819505, "864251e5f00d5490725ebc533540567058ff6b57c955b14e5236e5e104d70cfa"], ["a1948872013b543d6d902ccdeead231c585195214ccf5d39f136023855958436a43266911501000000086aac006a6a6a51514951c9b2038a538a04000000000452526563c0f345050000000007526a5252ac526af9be8e03000000000752acac51ab006306198db2", "ab6353", 0, -326384076, "ced7ef84aad4097e1eb96310e0d1c8e512cfcb392a01d9010713459b23bc0cf4"], ["c3efabba03cb656f154d1e159aa4a1a4bf9423a50454ebcef07bc3c42a35fb8ad84014864d0000000000d1cc73d260980775650caa272e9103dc6408bdacaddada6b9c67c88ceba6abaa9caa2f7d020000000553536a5265ffffffff9f946e8176d9b11ff854b76efcca0a4c236d29b69fb645ba29d406480427438e01000000066a0065005300ffffffff040419c0010000000003ab6a63cdb5b6010000000009006300ab5352656a63f9fe5e050000000004acac5352611b980100000000086a00acac00006a512d7f0c40", "0053", 0, -59089911, "c503001c16fbff82a99a18d88fe18720af63656fccd8511bca1c3d0d69bd7fc0"], ["efb55c2e04b21a0c25e0e29f6586be9ef09f2008389e5257ebf2f5251051cdc6a79fce2dac020000000351006affffffffaba73e5b6e6c62048ba5676d18c33ccbcb59866470bb7911ccafb2238cfd493802000000026563ffffffffe62d7cb8658a6eca8a8babeb0f1f4fa535b62f5fc0ec70eb0111174e72bbec5e0300000009abababac516365526affffffffbf568789e681032d3e3be761642f25e46c20322fa80346c1146cb47ac999cf1b0300000000b3dbd55902528828010000000001ab0aac7b0100000000015300000000", "acac52", 3, 1638140535, "e84444d91580da41c8a7dcf6d32229bb106f1be0c811b2292967ead5a96ce9d4"], ["91d3b21903629209b877b3e1aef09cd59aca6a5a0db9b83e6b3472aceec3bc2109e64ab85a0200000003530065ffffffffca5f92de2f1b7d8478b8261eaf32e5656b9eabbc58dcb2345912e9079a33c4cd010000000700ab65ab00536ad530611da41bbd51a389788c46678a265fe85737b8d317a83a8ff7a839debd18892ae5c80300000007ab6aac65ab51008b86c501038b8a9a05000000000263525b3f7a040000000007ab535353ab00abd4e3ff04000000000665ac51ab65630b7b656f", "6551525151516a00", 2, 499657927, "ef4bd7622eb7b2bbbbdc48663c1bc90e01d5bde90ff4cb946596f781eb420a0c"], - ["5d5c41ad0317aa7e40a513f5141ad5fc6e17d3916eebee4ddb400ddab596175b41a111ead20100000005536a5265acffffffff900ecb5e355c5c9f278c2c6ea15ac1558b041738e4bffe5ae06a9346d66d5b2b00000000080000ab636a65ab6affffffff99f4e08305fa5bd8e38fb9ca18b73f7a33c61ff7b3c68e696b30a04fea87f3ca000000000163d3d1760d019fc13a00000000000000000000", "ab53acabab6aac6a52", 2, 1007461922, "4012f5ff2f1238a0eb84854074670b4703238ebc15bfcdcd47ffa8498105fcd9"], + ["5d5c41ad0317aa7e40a513f5141ad5fc6e17d3916eebee4ddb400ddab596175b41a111ead20100000005536a5265acffffffff900ecb5e355c5c9f278c2c6ea15ac1558b041738e4bffe5ae06a9346d66d5b2b00000000080000ab636a65ab6affffffff99f4e08305fa5bd8e38fb9ca18b73f7a33c61ff7b3c68e696b30a04fea87f3ca000000000163d3d1760d019fc13a00000000000000000000", "ab53acabab6aac6a52", 2, 1007461922, "03558875a998ddd31a8c7768bdc2b0e6ebcbb330783c1eebc1d1c1fa20ccaa95"], ["ceecfa6c02b7e3345445b82226b15b7a097563fa7d15f3b0c979232b138124b62c0be007890200000009abac51536a63525253ffffffffbae481ccb4f15d94db5ec0d8854c24c1cc8642bd0c6300ede98a91ca13a4539a0200000001ac50b0813d023110f5020000000006acabac526563e2b0d0040000000009656aac0063516a536300000000", "0063526500", 0, -1862053821, "e1600e6df8a6160a79ac32aa40bb4644daa88b5f76c0d7d13bf003327223f70c"], - ["ae62d5fd0380c4083a26642159f51af24bf55dc69008e6b7769442b6a69a603edd980a33000000000005ab5100ab53ffffffff49d048324d899d4b8ed5e739d604f5806a1104fede4cb9f92cc825a7fa7b4bfe0200000005536a000053ffffffff42e5cea5673c650881d0b4005fa4550fd86de5f21509c4564a379a0b7252ac0e0000000007530000526a53525f26a68a03bfacc3010000000000e2496f000000000009ab5253acac52636563b11cc600000000000700510065526a6a00000000", "abab", 1, -1600104856, "05cf0ec9c61f1a15f651a0b3c5c221aa543553ce6c804593f43bb5c50bb91ffb"], - ["f06f64af04fdcb830464b5efdb3d5ee25869b0744005375481d7b9d7136a0eb8828ad1f0240200000003516563fffffffffd3ba192dabe9c4eb634a1e3079fca4f072ee5ceb4b57deb6ade5527053a92c5000000000165ffffffff39f43401a36ba13a5c6dd7f1190e793933ae32ee3bf3e7bfb967be51e681af760300000009650000536552636a528e34f50b21183952cad945a83d4d56294b55258183e1627d6e8fb3beb8457ec36cadb0630000000005abab530052334a7128014bbfd10100000000085352ab006a63656afc424a7c", "53650051635253ac00", 2, 313255000, "d309da5afd91b7afa257cfd62df3ca9df036b6a9f4b38f5697d1daa1f587312b"], + ["ae62d5fd0380c4083a26642159f51af24bf55dc69008e6b7769442b6a69a603edd980a33000000000005ab5100ab53ffffffff49d048324d899d4b8ed5e739d604f5806a1104fede4cb9f92cc825a7fa7b4bfe0200000005536a000053ffffffff42e5cea5673c650881d0b4005fa4550fd86de5f21509c4564a379a0b7252ac0e0000000007530000526a53525f26a68a03bfacc3010000000000e2496f000000000009ab5253acac52636563b11cc600000000000700510065526a6a00000000", "abab", 1, -1600104856, "04e9f74b09741fdf54c3ae4cea07b8ce1fd5635dfc9b7ace0d5faaf69e2c2e1e"], + ["f06f64af04fdcb830464b5efdb3d5ee25869b0744005375481d7b9d7136a0eb8828ad1f0240200000003516563fffffffffd3ba192dabe9c4eb634a1e3079fca4f072ee5ceb4b57deb6ade5527053a92c5000000000165ffffffff39f43401a36ba13a5c6dd7f1190e793933ae32ee3bf3e7bfb967be51e681af760300000009650000536552636a528e34f50b21183952cad945a83d4d56294b55258183e1627d6e8fb3beb8457ec36cadb0630000000005abab530052334a7128014bbfd10100000000085352ab006a63656afc424a7c", "53650051635253ac00", 2, 313255000, "4786c4fa3f47600cc3ad5b3f847e1f76e695f100f777b3285ba659f67dd0c4a4"], ["6dfd2f98046b08e7e2ef5fff153e00545faf7076699012993c7a30cb1a50ec528281a9022f030000000152ffffffff1f535e4851920b968e6c437d84d6ecf586984ebddb7d5db6ae035bd02ba222a8010000000651006a53ab51605072acb3e17939fa0737bc3ee43bc393b4acd58451fc4ffeeedc06df9fc649828822d5010000000253525a4955221715f27788d302382112cf60719be9ae159c51f394519bd5f7e70a4f9816c7020200000009526a6a51636aab656a36d3a5ff0445548e0100000000086a6a00516a52655167030b050000000004ac6a63525cfda8030000000000e158200000000000010000000000", "535263ac6a65515153", 3, 585774166, "72b7da10704c3ca7d1deb60c31b718ee12c70dc9dfb9ae3461edce50789fe2ba"], - ["187eafed01389a45e75e9dda526d3acbbd41e6414936b3356473d1f9793d161603efdb45670100000002ab00ffffffff04371c8202000000000563630063523b3bde02000000000753516563006300e9e765010000000005516aac656a373f9805000000000665525352acab08d46763", "ab", 0, 122457992, "393aa6c758e0eed15fa4af6d9e2d7c63f49057246dbb92b4268ec24fc87301ca"], - ["7d50b977035d50411d814d296da9f7965ddc56f3250961ca5ba805cadd0454e7c521e31b0300000000003d0416c2cf115a397bacf615339f0e54f6c35ffec95aa009284d38390bdde1595cc7aa7c0100000005ab52ac5365ffffffff4232c6e796544d5ac848c9dc8d25cfa74e32e847a5fc74c74d8f38ca51188562030000000653ac51006a51ffffffff016bd8bb00000000000465ab5253163526f3", "51ab526a00005353", 1, -1311316785, "60b7544319b42e4159976c35c32c2644f0adf42eff13be1dc2f726fc0b6bb492"], - ["2a45cd1001bf642a2315d4a427eddcc1e2b0209b1c6abd2db81a800c5f1af32812de42032702000000050051525200ffffffff032177db050000000005530051abac49186f000000000004ab6aab00645c0000000000000765655263acabac00000000", "6a65", 0, -1774715722, "6a9ac3f7da4c7735fbc91f728b52ecbd602233208f96ac5592656074a5db118a"], + ["187eafed01389a45e75e9dda526d3acbbd41e6414936b3356473d1f9793d161603efdb45670100000002ab00ffffffff04371c8202000000000563630063523b3bde02000000000753516563006300e9e765010000000005516aac656a373f9805000000000665525352acab08d46763", "ab", 0, 122457992, "dc8276b71906e9747f5286f61fc082d9191262ac21f6cd97b1eed213674547e1"], + ["7d50b977035d50411d814d296da9f7965ddc56f3250961ca5ba805cadd0454e7c521e31b0300000000003d0416c2cf115a397bacf615339f0e54f6c35ffec95aa009284d38390bdde1595cc7aa7c0100000005ab52ac5365ffffffff4232c6e796544d5ac848c9dc8d25cfa74e32e847a5fc74c74d8f38ca51188562030000000653ac51006a51ffffffff016bd8bb00000000000465ab5253163526f3", "51ab526a00005353", 1, -1311316785, "ab74fe16329b9fc1ffab5fc5dd3769d78277236ec8fe9f6740e4a0700e9ad462"], + ["2a45cd1001bf642a2315d4a427eddcc1e2b0209b1c6abd2db81a800c5f1af32812de42032702000000050051525200ffffffff032177db050000000005530051abac49186f000000000004ab6aab00645c0000000000000765655263acabac00000000", "6a65", 0, -1774715722, "961ef5307ba5ae38ce1f608485fd857e7beb39b28f97070e227f6b6b61209052"], ["479358c202427f3c8d19e2ea3def6d6d3ef2281b4a93cd76214f0c7d8f040aa042fe19f71f0300000001abffffffffa2709be556cf6ecaa5ef530df9e4d056d0ed57ce96de55a5b1f369fa40d4e74a020000000700006a51635365c426be3f02af578505000000000363ab63fd8f590500000000065153abac53632dfb14b3", "520063ab51", 1, -763226778, "cfe147982afacde044ce66008cbc5b1e9f0fd9b8ed52b59fc7c0fecf95a39b0e"], - ["76179a8e03bec40747ad65ab0f8a21bc0d125b5c3c17ad5565556d5cb03ade7c83b4f32d98030000000151ffffffff99b900504e0c02b97a65e24f3ad8435dfa54e3c368f4e654803b756d011d24150200000003ac5353617a04ac61bb6cf697cfa4726657ba35ed0031432da8c0ffb252a190278830f9bd54f0320100000006656551005153c8e8fc8803677c77020000000007ac6553535253ac70f442030000000001535be0f20200000000026300bf46cb3a", "6aab52", 1, -58495673, "35e94b3776a6729d20aa2f3ddeeb06d3aad1c14cc4cde52fd21a4efc212ea16c"], + ["76179a8e03bec40747ad65ab0f8a21bc0d125b5c3c17ad5565556d5cb03ade7c83b4f32d98030000000151ffffffff99b900504e0c02b97a65e24f3ad8435dfa54e3c368f4e654803b756d011d24150200000003ac5353617a04ac61bb6cf697cfa4726657ba35ed0031432da8c0ffb252a190278830f9bd54f0320100000006656551005153c8e8fc8803677c77020000000007ac6553535253ac70f442030000000001535be0f20200000000026300bf46cb3a", "6aab52", 1, -58495673, "129a32d613a0315e603f94fc9309d0f0eefd2847663a0efcc42c319858906e7f"], ["75ae53c2042f7546223ce5d5f9e00a968ddc68d52e8932ef2013fa40ce4e8c6ed0b6195cde01000000056563ac630079da0452c20697382e3dba6f4fc300da5f52e95a9dca379bb792907db872ba751b8024ee0300000009655151536500005163ffffffffe091b6d43f51ff00eff0ccfbc99b72d3aff208e0f44b44dfa5e1c7322cfc0c5f01000000075200005363ab63ffffffff7e96c3b83443260ac5cfd18258574fbc4225c630d3950df812bf51dceaeb0f9103000000065365655165639a6bf70b01b3e14305000000000563530063ac00000000", "6300ab00ac", 2, 982422189, "ee4ea49d2aae0dbba05f0b9785172da54408eb1ec67d36759ff7ed25bfc28766"], ["1cdfa01e01e1b8078e9c2b0ca5082249bd18fdb8b629ead659adedf9a0dd5a04031871ba120200000008525351536565ab6affffffff011e28430200000000076a5363636aac52b2febd4a", "abacac63656300", 0, 387396350, "299dcaac2bdaa627eba0dfd74767ee6c6f27c9200b49da8ff6270b1041669e7e"], - ["cc28c1810113dfa6f0fcd9c7d9c9a30fb6f1d774356abeb527a8651f24f4e6b25cf763c4e00300000003ab636affffffff02dfc6050000000000080053636351ab0052afd56903000000000453ab5265f6c90d99", "006551abacacac", 0, 1299280838, "a4c0773204ab418a939e23f493bd4b3e817375d133d307609e9782f2cc38dbcf"], + ["cc28c1810113dfa6f0fcd9c7d9c9a30fb6f1d774356abeb527a8651f24f4e6b25cf763c4e00300000003ab636affffffff02dfc6050000000000080053636351ab0052afd56903000000000453ab5265f6c90d99", "006551abacacac", 0, 1299280838, "8c2612ef963c5e06c887a6fca8309808fc3e8c11df0e4f0dbb512b00fa976995"], ["ca816e7802cd43d66b9374cd9bf99a8da09402d69c688d8dcc5283ace8f147e1672b757e020200000005516aabab5240fb06c95c922342279fcd88ba6cd915933e320d7becac03192e0941e0345b79223e89570300000004005151ac353ecb5d0264dfbd010000000005ac6aacababd5d70001000000000752ac53ac6a5151ec257f71", "63ac", 1, 774695685, "cc180c4f797c16a639962e7aec58ec4b209853d842010e4d090895b22e7a7863"], - ["b42b955303942fedd7dc77bbd9040aa0de858afa100f399d63c7f167b7986d6c2377f66a7403000000066aac00525100ffffffff0577d04b64880425a3174055f94191031ad6b4ca6f34f6da9be7c3411d8b51fc000000000300526a6391e1cf0f22e45ef1c44298523b516b3e1249df153590f592fcb5c5fc432dc66f3b57cb03000000046a6aac65ffffffff0393a6c9000000000004516a65aca674ac0400000000046a525352c82c370000000000030053538e577f89", "", 1, -1237094944, "566953eb806d40a9fb684d46c1bf8c69dea86273424d562bd407b9461c8509af"], + ["b42b955303942fedd7dc77bbd9040aa0de858afa100f399d63c7f167b7986d6c2377f66a7403000000066aac00525100ffffffff0577d04b64880425a3174055f94191031ad6b4ca6f34f6da9be7c3411d8b51fc000000000300526a6391e1cf0f22e45ef1c44298523b516b3e1249df153590f592fcb5c5fc432dc66f3b57cb03000000046a6aac65ffffffff0393a6c9000000000004516a65aca674ac0400000000046a525352c82c370000000000030053538e577f89", "", 1, -1237094944, "8d3348d0d41e84da9cdaafa1f53732bdc151cee4917d3678e71c1a2b74f3a3a0"], ["92c9fe210201e781b72554a0ed5e22507fb02434ddbaa69aff6e74ea8bad656071f1923f3f02000000056a63ac6a514470cef985ba83dcb8eee2044807bedbf0d983ae21286421506ae276142359c8c6a34d68020000000863ac63525265006aa796dd0102ca3f9d05000000000800abab52ab535353cd5c83010000000007ac00525252005322ac75ee", "5165", 0, 97879971, "6e6307cef4f3a9b386f751a6f40acebab12a0e7e17171d2989293cbec7fd45c2"], ["ccca1d5b01e40fe2c6b3ee24c660252134601dab785b8f55bd6201ffaf2fddc7b3e2192325030000000365535100496d4703b4b66603000000000665535253ac633013240000000000015212d2a502000000000951abac636353636a5337b82426", "0052", 0, -1691630172, "577bf2b3520b40aef44899a20d37833f1cded6b167e4d648fc5abe203e43b649"], - ["bc1a7a3c01691e2d0c4266136f12e391422f93655c71831d90935fbda7e840e50770c61da20000000008635253abac516353ffffffff031f32aa020000000003636563786dbc0200000000003e950f00000000000563516a655184b8a1de", "51536a", 0, -1627072905, "730bc25699b46703d7718fd5f5c34c4b5f00f594a9968ddc247fa7d5175124ed"], - ["076d209e02d904a6c40713c7225d23e7c25d4133c3c3477828f98c7d6dbd68744023dbb66b030000000753ab00536565acffffffff10975f1b8db8861ca94c8cc7c7cff086ddcd83e10b5fffd4fc8f2bdb03f9463c0100000000ffffffff029dff76010000000006526365530051a3be6004000000000000000000", "515253ac65acacac", 1, -1207502445, "66c488603b2bc53f0d22994a1f0f66fb2958203102eba30fe1d37b27a55de7a5"], - ["690fd1f80476db1f9eebe91317f2f130a60cbc1f4feadd9d6474d438e9cb7f91e4994600af0300000004ab536a63a15ce9fa6622d0c4171d895b42bff884dc6e8a7452f827fdc68a29c3c88e6fdee364eaf50000000002ab52ffffffff022dc39d3c0956b24d7f410b1e387859e7a72955f45d6ffb1e884d77888d18fe0300000005ac6a63656afffffffff10b06bce1800f5c49153d24748fdefb0bf514c12863247d1042d56018c3e25c03000000086a63ac6365536a52ffffffff031f162f0500000000060000655265abffbcd40500000000045151ac001a9c8c05000000000652ac53656a6300000000", "ac51ab63acac", 0, -67986012, "051c0df7ac688c2c930808dabde1f50300aea115f2bb3334f4753d5169b51e46"], + ["bc1a7a3c01691e2d0c4266136f12e391422f93655c71831d90935fbda7e840e50770c61da20000000008635253abac516353ffffffff031f32aa020000000003636563786dbc0200000000003e950f00000000000563516a655184b8a1de", "51536a", 0, -1627072905, "5f58a93217721bdfe74729a6fc60533ea1ae4ada4952dc07ded2fde472550131"], + ["076d209e02d904a6c40713c7225d23e7c25d4133c3c3477828f98c7d6dbd68744023dbb66b030000000753ab00536565acffffffff10975f1b8db8861ca94c8cc7c7cff086ddcd83e10b5fffd4fc8f2bdb03f9463c0100000000ffffffff029dff76010000000006526365530051a3be6004000000000000000000", "515253ac65acacac", 1, -1207502445, "92c2bfb3e4b44a367b4d30805734e380dd8a01e56a0964fde9f94ee8a01a4d89"], + ["690fd1f80476db1f9eebe91317f2f130a60cbc1f4feadd9d6474d438e9cb7f91e4994600af0300000004ab536a63a15ce9fa6622d0c4171d895b42bff884dc6e8a7452f827fdc68a29c3c88e6fdee364eaf50000000002ab52ffffffff022dc39d3c0956b24d7f410b1e387859e7a72955f45d6ffb1e884d77888d18fe0300000005ac6a63656afffffffff10b06bce1800f5c49153d24748fdefb0bf514c12863247d1042d56018c3e25c03000000086a63ac6365536a52ffffffff031f162f0500000000060000655265abffbcd40500000000045151ac001a9c8c05000000000652ac53656a6300000000", "ac51ab63acac", 0, -67986012, "9364db14330e1710d7dc8a71bc14b696eea9ceed281dbe346ae983d95c39d32f"], ["49ac2af00216c0307a29e83aa5de19770e6b20845de329290bd69cf0e0db7aed61ae41b39002000000035163ac8b2558ef84635bfc59635150e90b61fc753d34acfd10d97531043053e229cd720133cd95000000000463516a51ffffffff02458471040000000008abab636a51ac0065545aa80000000000096a6553516a5263ac6a00000000", "51526300ab5363", 1, 1449668540, "ddfd902bba312a06197810da96a0ddccb595f96670b28ded7dba88d8cd0469b8"], - ["fa4d868b024b010bd5dce46576c2fb489aa60bb797dac3c72a4836f49812c5c564c258414f03000000007a9b3a585e05027bdd89edbadf3c85ac61f8c3a04c773fa746517ae600ff1a9d6b6c02fb0200000004515163abffffffff01b17d020500000000046a65520000000000", "536565ab65635363", 0, -1718953372, "96c2b32f0a00a5925db7ba72d0b5d39922f30ea0f7443b22bc1b734808513c47"], + ["fa4d868b024b010bd5dce46576c2fb489aa60bb797dac3c72a4836f49812c5c564c258414f03000000007a9b3a585e05027bdd89edbadf3c85ac61f8c3a04c773fa746517ae600ff1a9d6b6c02fb0200000004515163abffffffff01b17d020500000000046a65520000000000", "536565ab65635363", 0, -1718953372, "d02cb155bf7a4e81f04b7b4f861a8dd703e63785fbde0b3e772663b9eaaad486"], ["cac6382d0462375e83b67c7a86c922b569a7473bfced67f17afd96c3cd2d896cf113febf9e0300000003006a53ffffffffaa4913b7eae6821487dd3ca43a514e94dcbbf350f8cc4cafff9c1a88720711b800000000096a6a525300acac6353ffffffff184fc4109c34ea27014cc2c1536ef7ed1821951797a7141ddacdd6e429fae6ff01000000055251655200ffffffff9e7b79b4e6836e290d7b489ead931cba65d1030ccc06f20bd4ca46a40195b33c030000000008f6bc8304a09a2704000000000563655353511dbc73050000000000cf34c500000000000091f76e0000000000085200ab00005100abd07208cb", "0063656a", 2, -1488731031, "bf078519fa87b79f40abc38f1831731422722c59f88d86775535f209cb41b9b1"], - ["1711146502c1a0b82eaa7893976fefe0fb758c3f0e560447cef6e1bde11e42de91a125f71c030000000015bd8c04703b4030496c7461482481f290c623be3e76ad23d57a955807c9e851aaaa20270300000000d04abaf20326dcb7030000000001632225350400000000075263ac00520063dddad9020000000000af23d148", "52520053510063", 0, 1852122830, "e33d5ee08c0f3c130a44d7ce29606450271b676f4a80c52ab9ffab00cecf67f8"], - ["8d5b124d0231fbfc640c706ddb1d57bb49a18ba8ca0e1101e32c7e6e65a0d4c7971d93ea360100000008acabac0000abac65ffffffff8fe0fd7696597b845c079c3e7b87d4a44110c445a330d70342a5501955e17dd70100000004ab525363ef22e8a90346629f030000000009516a00ac63acac51657bd57b05000000000200acfd4288050000000009acab5352ab00ab636300000000", "53ac526553ab65", 0, 1253152975, "8b57a7c3170c6c02dd14ae1d392ce3d828197b20e9145c89c1cfd5de050e1562"], - ["38146dc502c7430e92b6708e9e107b61cd38e5e773d9395e5c8ad8986e7e4c03ee1c1e1e760100000000c8962ce2ac1bb3b1285c0b9ba07f4d2e5ce87c738c42ac0548cd8cec1100e6928cd6b0b6010000000763ab636aab52527cccefbd04e5f6f8020000000006006aabacac65ab2c4a00000000000351635209a6f40100000000026aacce57dc040000000008ab5353ab516a516a00000000", "ab", 0, -1205978252, "3cb5b030e7da0b60ccce5b4a7f3793e6ca56f03e3799fe2d6c3cc22d6d841dcb"], + ["1711146502c1a0b82eaa7893976fefe0fb758c3f0e560447cef6e1bde11e42de91a125f71c030000000015bd8c04703b4030496c7461482481f290c623be3e76ad23d57a955807c9e851aaaa20270300000000d04abaf20326dcb7030000000001632225350400000000075263ac00520063dddad9020000000000af23d148", "52520053510063", 0, 1852122830, "e7f48dfb1914dbbe03df1c769566359d4ce34f99d898d5da8d26b7d02e0b79ff"], + ["8d5b124d0231fbfc640c706ddb1d57bb49a18ba8ca0e1101e32c7e6e65a0d4c7971d93ea360100000008acabac0000abac65ffffffff8fe0fd7696597b845c079c3e7b87d4a44110c445a330d70342a5501955e17dd70100000004ab525363ef22e8a90346629f030000000009516a00ac63acac51657bd57b05000000000200acfd4288050000000009acab5352ab00ab636300000000", "53ac526553ab65", 0, 1253152975, "62499e5c145f110dffde2930f55a87ccc16b3ff42a2587aa95df7296bae07926"], + ["38146dc502c7430e92b6708e9e107b61cd38e5e773d9395e5c8ad8986e7e4c03ee1c1e1e760100000000c8962ce2ac1bb3b1285c0b9ba07f4d2e5ce87c738c42ac0548cd8cec1100e6928cd6b0b6010000000763ab636aab52527cccefbd04e5f6f8020000000006006aabacac65ab2c4a00000000000351635209a6f40100000000026aacce57dc040000000008ab5353ab516a516a00000000", "ab", 0, -1205978252, "1beec5ee02955ebe9d770686f21fbc2e29170c9ac2777b2e4c250e1663a68ecb"], ["22d81c740469695a6a83a9a4824f77ecff8804d020df23713990afce2b72591ed7de98500502000000065352526a6a6affffffff90dc85e118379b1005d7bbc7d2b8b0bab104dad7eaa49ff5bead892f17d8c3ba010000000665656300ab51ffffffff965193879e1d5628b52005d8560a35a2ba57a7f19201a4045b7cbab85133311d0200000003ac005348af21a13f9b4e0ad90ed20bf84e4740c8a9d7129632590349afc03799414b76fd6e826200000000025353ffffffff04a0d40d04000000000060702700000000000652655151516ad31f1502000000000365ac0069a1ac0500000000095100655300ab53525100000000", "51636a52ac", 0, -1644680765, "add7f5da27262f13da6a1e2cc2feafdc809bd66a67fb8ae2a6f5e6be95373b6f"], - ["a27dcbc801e3475174a183586082e0914c314bc9d79d1570f29b54591e5e0dff07fbb45a7f0000000004ac53ab51ffffffff027347f5020000000005535351ab63d0e5c9030000000009ac65ab6a63515200ab7cd632ed", "ac63636553", 0, -686435306, "883a6ea3b2cc53fe8a803c229106366ca14d25ffbab9fef8367340f65b201da6"], - ["b123ed2204410d4e8aaaa8cdb95234ca86dad9ff77fb4ae0fd4c06ebed36794f0215ede0040100000002ac63ffffffff3b58b81b19b90d8f402701389b238c3a84ff9ba9aeea298bbf15b41a6766d27a01000000056a6553ab00151824d401786153b819831fb15926ff1944ea7b03d884935a8bde01ed069d5fd80220310200000000ffffffffa9c9d246f1eb8b7b382a9032b55567e9a93f86c77f4e32c092aa1738f7f756c30100000002ab65ffffffff011a2b48000000000000ed44d1fb", "630051ab63", 2, -1118263883, "b5dab912bcabedff5f63f6dd395fc2cf030d83eb4dd28214baba68a45b4bfff0"], - ["1339051503e196f730955c5a39acd6ed28dec89b4dadc3f7c79b203b344511270e5747fa9900000000045151636affffffff378c6090e08a3895cedf1d25453bbe955a274657172491fd2887ed5c9aceca7b0100000000ffffffffcf7cc3c36ddf9d4749edfa9cefed496d2f86e870deb814bfcd3b5637a5496461030000000451006300ffffffff04dcf3fa010000000008526a63005263acabb41d84040000000004abac5153800eff020000000005656a535365106c5e00000000000000000000", "abac5300", 2, 2013719928, "7fc74de39ce6ca46ca25d760d3cec7bb21fd14f7efe1c443b5aa294f2cb5f546"], - ["0728c606014c1fd6005ccf878196ba71a54e86cc8c53d6db500c3cc0ac369a26fac6fcbc210000000005ab53ac5365ba9668290182d7870100000000066a000053655100000000", "65", 0, 1789961588, "ab6baa6da3b2bc853868d166f8996ad31d63ef981179f9104f49968fd61c8427"], - ["a1134397034bf4067b6c81c581e2b73fb63835a08819ba24e4e92df73074bf773c94577df7000000000465525251ffffffff8b6608feaa3c1f35f49c6330a769716fa01c5c6f6e0cdc2eb10dfc99bbc21e77010000000952656aac005352655180a0bda4bc72002c2ea8262e26e03391536ec36867258cab968a6fd6ec7523b64fa1d8c001000000056a53ac6353ffffffff04dbeeed05000000000553650052abcd5d0e01000000000463abab51104b2e0500000000066aac53ac5165283ca7010000000004535252ab00000000", "ab515151516552ab", 1, -324598676, "91178482112f94d1c8e929de443e4b9c893e18682998d393ca9ca77950412586"], + ["a27dcbc801e3475174a183586082e0914c314bc9d79d1570f29b54591e5e0dff07fbb45a7f0000000004ac53ab51ffffffff027347f5020000000005535351ab63d0e5c9030000000009ac65ab6a63515200ab7cd632ed", "ac63636553", 0, -686435306, "f3c68b72faf0bd51e82b0575497861c13f6ed11c48e5e4b7f256f35c1f032615"], + ["b123ed2204410d4e8aaaa8cdb95234ca86dad9ff77fb4ae0fd4c06ebed36794f0215ede0040100000002ac63ffffffff3b58b81b19b90d8f402701389b238c3a84ff9ba9aeea298bbf15b41a6766d27a01000000056a6553ab00151824d401786153b819831fb15926ff1944ea7b03d884935a8bde01ed069d5fd80220310200000000ffffffffa9c9d246f1eb8b7b382a9032b55567e9a93f86c77f4e32c092aa1738f7f756c30100000002ab65ffffffff011a2b48000000000000ed44d1fb", "630051ab63", 2, -1118263883, "c2701aeb444ea001acfefab13b1a2f9524f2ac712e96a5762466bd504d5bcf8e"], + ["1339051503e196f730955c5a39acd6ed28dec89b4dadc3f7c79b203b344511270e5747fa9900000000045151636affffffff378c6090e08a3895cedf1d25453bbe955a274657172491fd2887ed5c9aceca7b0100000000ffffffffcf7cc3c36ddf9d4749edfa9cefed496d2f86e870deb814bfcd3b5637a5496461030000000451006300ffffffff04dcf3fa010000000008526a63005263acabb41d84040000000004abac5153800eff020000000005656a535365106c5e00000000000000000000", "abac5300", 2, 2013719928, "e00b1d454fcb0b591e990d33a1f91feb289c2201c581839d31c3493de2239a67"], + ["0728c606014c1fd6005ccf878196ba71a54e86cc8c53d6db500c3cc0ac369a26fac6fcbc210000000005ab53ac5365ba9668290182d7870100000000066a000053655100000000", "65", 0, 1789961588, "fa9e9b60adf9dfb5932110aae6a68a720334209d1b0b5a83ae6385e7e08a4c49"], + ["a1134397034bf4067b6c81c581e2b73fb63835a08819ba24e4e92df73074bf773c94577df7000000000465525251ffffffff8b6608feaa3c1f35f49c6330a769716fa01c5c6f6e0cdc2eb10dfc99bbc21e77010000000952656aac005352655180a0bda4bc72002c2ea8262e26e03391536ec36867258cab968a6fd6ec7523b64fa1d8c001000000056a53ac6353ffffffff04dbeeed05000000000553650052abcd5d0e01000000000463abab51104b2e0500000000066aac53ac5165283ca7010000000004535252ab00000000", "ab515151516552ab", 1, -324598676, "039a084a7038fb224416cf92f1b6a63f7b45808ad608bfb0b63f4164c6dd5186"], ["bcdafbae04aa18eb75855aeb1f5124f30044741351b33794254a80070940cb10552fa4fa8e0300000001acd0423fe6e3f3f88ae606f2e8cfab7a5ef87caa2a8f0401765ff9a47d718afcfb40c0099b0000000008ac6565ab53ac6aac645308009d680202d600e492b31ee0ab77c7c5883ebad5065f1ce87e4dfe6453e54023a0010000000151ffffffffb9d818b14245899e1d440152827c95268a676f14c3389fc47f5a11a7b38b1bde03000000026300ffffffff03cda22102000000000751ac535263005100a4d20400000000045200536ac8bef405000000000700ab51ab6563ac00000000", "6553516a526aab", 1, -2111409753, "5e1849e7368cf4f042718586d9bd831d61479b775bab97aba9f450042bd9876a"], - ["ed3bb93802ddbd08cb030ef60a2247f715a0226de390c9c1a81d52e83f8674879065b5f87d0300000003ab6552ffffffff04d2c5e60a21fb6da8de20bf206db43b720e2a24ce26779bca25584c3f765d1e0200000008ab656a6aacab00ab6e946ded025a811d04000000000951abac6352ac00ab5143cfa3030000000005635200636a00000000", "5352ac650065535300", 1, -668727133, "e9995065e1fddef72a796eef5274de62012249660dc9d233a4f24e02a2979c87"], + ["ed3bb93802ddbd08cb030ef60a2247f715a0226de390c9c1a81d52e83f8674879065b5f87d0300000003ab6552ffffffff04d2c5e60a21fb6da8de20bf206db43b720e2a24ce26779bca25584c3f765d1e0200000008ab656a6aacab00ab6e946ded025a811d04000000000951abac6352ac00ab5143cfa3030000000005635200636a00000000", "5352ac650065535300", 1, -668727133, "15a56bb4650b0a9d7157bf49dfd412a399754c3ef4a8408749d06bca289db678"], ["59f4629d030fa5d115c33e8d55a79ea3cba8c209821f979ed0e285299a9c72a73c5bba00150200000002636affffffffd8aca2176df3f7a96d0dc4ee3d24e6cecde1582323eec2ebef9a11f8162f17ac0000000007ab6565acab6553ffffffffeebc10af4f99c7a21cbc1d1074bd9f0ee032482a71800f44f26ee67491208e0403000000065352ac656351ffffffff0434e955040000000004ab515152caf2b305000000000365ac007b1473030000000003ab530033da970500000000060051536a5253bb08ab51", "", 2, 396340944, "0e9c47973ef2c292b2252c623f465bbb92046fe0b893eebf4e1c9e02cb01c397"], - ["286e3eb7043902bae5173ac3b39b44c5950bc363f474386a50b98c7bdab26f98dc83449c4a020000000752ac6a00510051ffffffff4339cd6a07f5a5a2cb5815e5845da70300f5c7833788363bf7fe67595d3225520100000000fffffffff9c2dd8b06ad910365ffdee1a966f124378a2b8021065c8764f6138bb1e951380200000005ab5153ac6affffffff0370202aba7a68df85436ea7c945139513384ef391fa33d16020420b8ad40e9a000000000900ab5165526353abacffffffff020c1907000000000004abac526a1b490b040000000000df1528f7", "5353ab", 3, -1407529517, "32154c09174a9906183abf26538c39e78468344ca0848bbd0785e24a3565d932"], - ["2e245cf80179e2e95cd1b34995c2aff49fe4519cd7cee93ad7587f7f7e8105fc2dff206cd30200000009006a63516a6553ab52350435a201d5ed2d02000000000352ab6558552c89", "00ab53", 0, -233917810, "4605ae5fd3d50f9c45d37db7118a81a9ef6eb475d2333f59df5d3e216f150d49"], + ["286e3eb7043902bae5173ac3b39b44c5950bc363f474386a50b98c7bdab26f98dc83449c4a020000000752ac6a00510051ffffffff4339cd6a07f5a5a2cb5815e5845da70300f5c7833788363bf7fe67595d3225520100000000fffffffff9c2dd8b06ad910365ffdee1a966f124378a2b8021065c8764f6138bb1e951380200000005ab5153ac6affffffff0370202aba7a68df85436ea7c945139513384ef391fa33d16020420b8ad40e9a000000000900ab5165526353abacffffffff020c1907000000000004abac526a1b490b040000000000df1528f7", "5353ab", 3, -1407529517, "448f1f2a15d31fa9075acef45a3567b2931c5b23572041de431505f859ba5683"], + ["2e245cf80179e2e95cd1b34995c2aff49fe4519cd7cee93ad7587f7f7e8105fc2dff206cd30200000009006a63516a6553ab52350435a201d5ed2d02000000000352ab6558552c89", "00ab53", 0, -233917810, "7f30a270184210b119444a92635945779f628d6b322155ce729e90f57a0c1a99"], ["33a98004029d262f951881b20a8d746c8c707ea802cd2c8b02a33b7e907c58699f97e42be80100000007ac53536552abacdee04cc01d205fd8a3687fdf265b064d42ab38046d76c736aad8865ca210824b7c622ecf02000000070065006a536a6affffffff01431c5d010000000000270d48ee", "", 1, 921554116, "ff9d7394002f3f196ea25472ea6c46f753bd879a7244795157bb7235c9322902"], ["aac18f2b02b144ed481557c53f2146ae523f24fcde40f3445ab0193b6b276c315dc2894d2300000000075165650000636a233526947dbffc76aec7db1e1baa6868ad4799c76e14794dcbaaec9e713a83967f6a65170200000005abac6551ab27d518be01b652a30000000000015300000000", "52ac5353", 1, 1559377136, "59fc2959bb7bb24576cc8a237961ed95bbb900679d94da6567734c4390cb6ef5"], ["5ab79881033555b65fe58c928883f70ce7057426fbdd5c67d7260da0fe8b1b9e6a2674cb850300000009ac516aac6aac006a6affffffffa5be9223b43c2b1a4d120b5c5b6ec0484f637952a3252181d0f8e813e76e11580200000000e4b5ceb8118cb77215bbeedc9a076a4d087bb9cd1473ea32368b71daeeeacc451ec209010000000005acac5153aced7dc34e02bc5d11030000000005ac5363006a54185803000000000552ab00636a00000000", "5100", 1, 1927062711, "e9f53d531c12cce1c50abed4ac521a372b4449b6a12f9327c80020df6bff66c0"], - ["6c2c8fac0124b0b7d4b610c3c5b91dee32b7c927ac71abdf2d008990ca1ac40de0dfd530660300000006ababac5253656bd7eada01d847ec000000000004ac52006af4232ec8", "6a6a6a0051", 0, -340809707, "fb51eb9d7e47d32ff2086205214f90c7c139e08c257a64829ae4d2b301071c6a"], - ["6e3880af031735a0059c0bb5180574a7dcc88e522c8b56746d130f8d45a52184045f96793e0100000008acabac6a526a6553fffffffffe05f14cdef7d12a9169ec0fd37524b5fcd3295f73f48ca35a36e671da4a2f560000000008006a526a6351ab63ffffffffdfbd869ac9e472640a84caf28bdd82e8c6797f42d03b99817a705a24fde2736600000000010090a090a503db956b04000000000952ac53ab6a536a63ab358390010000000009656a5200525153ac65353ee204000000000763530052526aaba6ad83fb", "535151ab6300", 2, 222014018, "57a34ddeb1bf36d28c7294dda0432e9228a9c9e5cc5c692db98b6ed2e218d825"], + ["6c2c8fac0124b0b7d4b610c3c5b91dee32b7c927ac71abdf2d008990ca1ac40de0dfd530660300000006ababac5253656bd7eada01d847ec000000000004ac52006af4232ec8", "6a6a6a0051", 0, -340809707, "39ac92cf36646b9ee5ce8d31f3d1d5060ea7f93bb081a485e39d42d0d9f8d83c"], + ["6e3880af031735a0059c0bb5180574a7dcc88e522c8b56746d130f8d45a52184045f96793e0100000008acabac6a526a6553fffffffffe05f14cdef7d12a9169ec0fd37524b5fcd3295f73f48ca35a36e671da4a2f560000000008006a526a6351ab63ffffffffdfbd869ac9e472640a84caf28bdd82e8c6797f42d03b99817a705a24fde2736600000000010090a090a503db956b04000000000952ac53ab6a536a63ab358390010000000009656a5200525153ac65353ee204000000000763530052526aaba6ad83fb", "535151ab6300", 2, 222014018, "5b698a0bf4514ebbf304ebc1c0d7dd09a87b29224f9c7d85ae9e35f0e8f5370f"], ["8df1cd19027db4240718dcaf70cdee33b26ea3dece49ae6917331a028c85c5a1fb7ee3e475020000000865ab6a00510063636157988bc84d8d55a8ba93cdea001b9bf9d0fa65b5db42be6084b5b1e1556f3602f65d4d0100000005ac00ab0052206c852902b2fb54030000000008ac5252536aacac5378c4a5050000000007acabac535163532784439e", "acab6a", 0, 1105620132, "edb7c74223d1f10f9b3b9c1db8064bc487321ff7bb346f287c6bc2fad83682de"], ["0e803682024f79337b25c98f276d412bc27e56a300aa422c42994004790cee213008ff1b8303000000080051ac65ac655165f421a331892b19a44c9f88413d057fea03c3c4a6c7de4911fe6fe79cf2e9b3b10184b1910200000005525163630096cb1c670398277204000000000253acf7d5d502000000000963536a6a636a5363ab381092020000000002ac6a911ccf32", "6565", 1, -1492094009, "f0672638a0e568a919e9d8a9cbd7c0189a3e132940beeb52f111a89dcc2daa2c"], - ["7d71669d03022f9dd90edac323cde9e56354c6804c6b8e687e9ae699f46805aafb8bcaa636000000000253abffffffff698a5fdd3d7f2b8b000c68333e4dd58fa8045b3e2f689b889beeb3156cecdb490300000009525353abab0051acabc53f0aa821cdd69b473ec6e6cf45cf9b38996e1c8f52c27878a01ec8bb02e8cb31ad24e500000000055353ab0052ffffffff0447a23401000000000565ab53ab5133aaa0030000000006515163656563057d110300000000056a6aacac52cf13b5000000000003526a5100000000", "6a6a51", 1, -1349253507, "722efdd69a7d51d3d77bed0ac5544502da67e475ea5857cd5af6bdf640a69945"], + ["7d71669d03022f9dd90edac323cde9e56354c6804c6b8e687e9ae699f46805aafb8bcaa636000000000253abffffffff698a5fdd3d7f2b8b000c68333e4dd58fa8045b3e2f689b889beeb3156cecdb490300000009525353abab0051acabc53f0aa821cdd69b473ec6e6cf45cf9b38996e1c8f52c27878a01ec8bb02e8cb31ad24e500000000055353ab0052ffffffff0447a23401000000000565ab53ab5133aaa0030000000006515163656563057d110300000000056a6aacac52cf13b5000000000003526a5100000000", "6a6a51", 1, -1349253507, "e05cf349f55931268aeb593a6815baa85305be310da7b2df55e1521bcd0924b9"], ["9ff618e60136f8e6bb7eabaaac7d6e2535f5fba95854be6d2726f986eaa9537cb283c701ff02000000026a65ffffffff012d1c0905000000000865ab00ac6a516a652f9ad240", "51515253635351ac", 0, 1571304387, "659cd3203095d4a8672646add7d77831a1926fc5b66128801979939383695a79"], ["9fbd43ac025e1462ecd10b1a9182a8e0c542f6d1089322a41822ab94361e214ed7e1dfdd8a020000000263519d0437581538e8e0b6aea765beff5b4f3a4a202fca6e5d19b34c141078c6688f71ba5b8e0100000003ac6552ffffffff02077774050000000009655153655263acab6a0ae4e10100000000035152524c97136b", "635152ab", 0, 1969622955, "d82d4ccd9b67810f26a378ad9592eb7a30935cbbd27e859b00981aefd0a72e08"], - ["0117c92004314b84ed228fc11e2999e657f953b6de3b233331b5f0d0cf40d5cc149b93c7b30300000005515263516a083e8af1bd540e54bf5b309d36ba80ed361d77bbf4a1805c7aa73667ad9df4f97e2da410020000000600ab6351ab524d04f2179455e794b2fcb3d214670001c885f0802e4b5e015ed13a917514a7618f5f332203000000086a536aab51000063ecf029e65a4a009a5d67796c9f1eb358b0d4bd2620c8ad7330fb98f5a802ab92d0038b1002000000036a6551a184a88804b04490000000000009ab6a5152535165526a33d1ab020000000001518e92320000000000002913df04000000000952abac6353525353ac8b19bfdf", "000051ab0000", 0, 489433059, "8eebac87e60da524bbccaf285a44043e2c9232868dda6c6271a53c153e7f3a55"], + ["0117c92004314b84ed228fc11e2999e657f953b6de3b233331b5f0d0cf40d5cc149b93c7b30300000005515263516a083e8af1bd540e54bf5b309d36ba80ed361d77bbf4a1805c7aa73667ad9df4f97e2da410020000000600ab6351ab524d04f2179455e794b2fcb3d214670001c885f0802e4b5e015ed13a917514a7618f5f332203000000086a536aab51000063ecf029e65a4a009a5d67796c9f1eb358b0d4bd2620c8ad7330fb98f5a802ab92d0038b1002000000036a6551a184a88804b04490000000000009ab6a5152535165526a33d1ab020000000001518e92320000000000002913df04000000000952abac6353525353ac8b19bfdf", "000051ab0000", 0, 489433059, "36ac644c185aa9eb6b107db0101572c3c9aae6bc3bcdb31e7356edac4ba9e336"], ["e7f5482903f98f0299e0984b361efb2fddcd9979869102281e705d3001a9d283fe9f3f3a1e02000000025365ffffffffcc5c7fe82feebad32a22715fc30bc584efc9cd9cadd57e5bc4b6a265547e676e0000000001ab579d21235bc2281e08bf5e7f8f64d3afb552839b9aa5c77cf762ba2366fffd7ebb74e49400000000055263ab63633df82cf40100982e05000000000453ac535300000000", "acacab", 2, -1362931214, "046de666545330e50d53083eb78c9336416902f9b96c77cc8d8e543da6dfc7e4"], ["09adb2e90175ca0e816326ae2dce7750c1b27941b16f6278023dbc294632ab97977852a09d030000000465ab006affffffff027739cf0100000000075151ab63ac65ab8a5bb601000000000653ac5151520011313cdc", "ac", 0, -76831756, "478ee06501b4965b40bdba6cbaad9b779b38555a970912bb791b86b7191c54bc"], - ["f973867602e30f857855cd0364b5bbb894c049f44abbfd661d7ae5dbfeaafca89fac8959c20100000005ab52536a51ffffffffbeceb68a4715f99ba50e131884d8d20f4a179313691150adf0ebf29d05f8770303000000066352ab00ac63ffffffff021fddb90000000000036a656322a177000000000008526500ac5100acac84839083", "52acab53ac", 0, 1407879325, "db0329439490efc64b7104d6d009b03fbc6fac597cf54fd786fbbb5fd73b92b4"], - ["fd22ebaa03bd588ad16795bea7d4aa7f7d48df163d75ea3afebe7017ce2f350f6a0c1cb0bb00000000086aabac5153526363ffffffff488e0bb22e26a565d77ba07178d17d8f85702630ee665ec35d152fa05af3bda10200000004515163abffffffffeb21035849e85ad84b2805e1069a91bb36c425dc9c212d9bae50a95b6bfde1200300000001ab5df262fd02b69848040000000008ab6363636a6363ace23bf2010000000007655263635253534348c1da", "006353526563516a00", 0, -1491036196, "92364ba3c7a85d4e88885b8cb9b520dd81fc29e9d2b750d0790690e9c1246673"], - ["130b462d01dd49fac019dc4442d0fb54eaa6b1c2d1ad0197590b7df26969a67abd7f3fbb4f0100000008ac65abac53ab6563ffffffff0345f825000000000004ac53acac9d5816020000000002ababeff8e90500000000086aab006552ac6a53a892dc55", "ab0065ac530052", 0, 944483412, "1f4209fd4ce7f13d175fdd522474ae9b34776fe11a5f17a27d0796c77a2a7a9d"], + ["f973867602e30f857855cd0364b5bbb894c049f44abbfd661d7ae5dbfeaafca89fac8959c20100000005ab52536a51ffffffffbeceb68a4715f99ba50e131884d8d20f4a179313691150adf0ebf29d05f8770303000000066352ab00ac63ffffffff021fddb90000000000036a656322a177000000000008526500ac5100acac84839083", "52acab53ac", 0, 1407879325, "30f53590a3e9ff4fda72d641436874da88fc8f24e9eb97cb5c8ab302fadccfd9"], + ["fd22ebaa03bd588ad16795bea7d4aa7f7d48df163d75ea3afebe7017ce2f350f6a0c1cb0bb00000000086aabac5153526363ffffffff488e0bb22e26a565d77ba07178d17d8f85702630ee665ec35d152fa05af3bda10200000004515163abffffffffeb21035849e85ad84b2805e1069a91bb36c425dc9c212d9bae50a95b6bfde1200300000001ab5df262fd02b69848040000000008ab6363636a6363ace23bf2010000000007655263635253534348c1da", "006353526563516a00", 0, -1491036196, "027f9e23d0ab4b9e08aaba12da4366b9c55d5af0ed11319416e3ef54c5d4b6e2"], + ["130b462d01dd49fac019dc4442d0fb54eaa6b1c2d1ad0197590b7df26969a67abd7f3fbb4f0100000008ac65abac53ab6563ffffffff0345f825000000000004ac53acac9d5816020000000002ababeff8e90500000000086aab006552ac6a53a892dc55", "ab0065ac530052", 0, 944483412, "58b9909e86fd3da05e43fdc3cda3350510594aa0be5064554445bde5404a5b2b"], ["f8e50c2604609be2a95f6d0f31553081f4e1a49a0a30777fe51eb1c596c1a9a92c053cf28c0300000009656a51ac5252630052fffffffff792ed0132ae2bd2f11d4a2aab9d0c4fbdf9a66d9ae2dc4108afccdc14d2b1700100000007ab6a6563ac636a7bfb2fa116122b539dd6a2ab089f88f3bc5923e5050c8262c112ff9ce0a3cd51c6e3e84f02000000066551ac5352650d5e687ddf4cc9a497087cabecf74d236aa4fc3081c3f67b6d323cba795e10e7a171b725000000000852635351ab635100ffffffff02df5409020000000008ac6a53acab5151004156990200000000045163655200000000", "ac53abac65005300", 0, -173065000, "b596f206d7eba22b7e2d1b7a4f4cf69c7c541b6c84dcc943f84e19a99a923310"], - ["18020dd1017f149eec65b2ec23300d8df0a7dd64fc8558b36907723c03cd1ba672bbb0f51d0300000005ab65ab6a63ffffffff037cd7ae000000000009ab516a65005352ac65f1e4360400000000056353530053f118f0040000000009536363ab006500abac00000000", "63ab51acab52ac", 0, -550412404, "e19b796c14a0373674968e342f2741d8b51092a5f8409e9bff7dcd52e56fcbcb"], - ["b04154610363fdade55ceb6942d5e5a723323863b48a0cb04fdcf56210717955763f56b08d0300000009ac526a525151635151ffffffff93a176e76151a9eabdd7af00ef2af72f9e7af5ecb0aa4d45d00618f394cdd03c030000000074d818b332ebe05dc24c44d776cf9d275c61f471cc01efce12fd5a16464157f1842c65cb00000000066a0000ac6352d3c4134f01d8a1c0030000000005520000005200000000", "5200656a656351", 2, -9757957, "6e3e5ba77f760b6b5b5557b13043f1262418f3dd2ce7f0298b012811fc8ad5bc"], + ["18020dd1017f149eec65b2ec23300d8df0a7dd64fc8558b36907723c03cd1ba672bbb0f51d0300000005ab65ab6a63ffffffff037cd7ae000000000009ab516a65005352ac65f1e4360400000000056353530053f118f0040000000009536363ab006500abac00000000", "63ab51acab52ac", 0, -550412404, "4f918330f4871d19637a21fe11cbd5522f651ee9179006bb84fc01c02d758144"], + ["b04154610363fdade55ceb6942d5e5a723323863b48a0cb04fdcf56210717955763f56b08d0300000009ac526a525151635151ffffffff93a176e76151a9eabdd7af00ef2af72f9e7af5ecb0aa4d45d00618f394cdd03c030000000074d818b332ebe05dc24c44d776cf9d275c61f471cc01efce12fd5a16464157f1842c65cb00000000066a0000ac6352d3c4134f01d8a1c0030000000005520000005200000000", "5200656a656351", 2, -9757957, "00f1c3c4c423e18c083d4b7e0277816906f9e01ab93cae1b4187a469b0bd128c"], ["9794b3ce033df7b1e32db62d2f0906b589eacdacf5743963dc2255b6b9a6cba211fadd0d41020000000600ab00650065ffffffffaae00687a6a4131152bbcaafedfaed461c86754b0bde39e2bef720e6d1860a0302000000070065516aac6552ffffffff50e4ef784d6230df7486e972e8918d919f005025bc2d9aacba130f58bed7056703000000075265ab52656a52ffffffff02c6f1a9000000000006005251006363cf450c040000000008abab63510053abac00000000", "ac0063ababab515353", 1, 2063905082, "fad092fc98f17c2c20e10ba9a8eb44cc2bcc964b006f4da45cb9ceb249c69698"], - ["94533db7015e70e8df715066efa69dbb9c3a42ff733367c18c22ff070392f988f3b93920820000000006535363636300ce4dac3e03169af80300000000080065ac6a53ac65ac39c050020000000006abacab6aacac708a02050000000005ac5251520000000000", "6553", 0, -360458507, "5418cf059b5f15774836edd93571e0eed3855ba67b2b08c99dccab69dc87d3e9"], - ["c8597ada04f59836f06c224a2640b79f3a8a7b41ef3efa2602592ddda38e7597da6c639fee0300000009005251635351acabacffffffff4c518f347ee694884b9d4072c9e916b1a1f0a7fc74a1c90c63fdf8e5a185b6ae02000000007113af55afb41af7518ea6146786c7c726641c68c8829a52925e8d4afd07d8945f68e7230300000008ab00ab65ab650063ffffffffc28e46d7598312c420e11dfaae12add68b4d85adb182ae5b28f8340185394b63000000000165ffffffff04dbabb7010000000000ee2f6000000000000852ab6500ab6a51acb62a27000000000009ac53515300ac006a6345fb7505000000000752516a0051636a00000000", "", 3, 15199787, "0d66003aff5bf78cf492ecbc8fd40c92891acd58d0a271be9062e035897f317e"], - ["1a28c4f702c8efaad96d879b38ec65c5283b5c084b819ad7db1c086e85e32446c7818dc7a90300000008656351536a525165fa78cef86c982f1aac9c5eb8b707aee8366f74574c8f42ef240599c955ef4401cf578be30200000002ab518893292204c430eb0100000000016503138a0300000000040053abac60e0eb010000000005525200ab63567c2d030000000004abab52006cf81e85", "ab51525152", 1, 2118315905, "4e4c9a781f626b59b1d3ad8f2c488eb6dee8bb19b9bc138bf0dc33e7799210d4"], + ["94533db7015e70e8df715066efa69dbb9c3a42ff733367c18c22ff070392f988f3b93920820000000006535363636300ce4dac3e03169af80300000000080065ac6a53ac65ac39c050020000000006abacab6aacac708a02050000000005ac5251520000000000", "6553", 0, -360458507, "3af4aac5d473473ad34a7b1585d55583decb50fec97a07fc30c8ceca76847c74"], + ["c8597ada04f59836f06c224a2640b79f3a8a7b41ef3efa2602592ddda38e7597da6c639fee0300000009005251635351acabacffffffff4c518f347ee694884b9d4072c9e916b1a1f0a7fc74a1c90c63fdf8e5a185b6ae02000000007113af55afb41af7518ea6146786c7c726641c68c8829a52925e8d4afd07d8945f68e7230300000008ab00ab65ab650063ffffffffc28e46d7598312c420e11dfaae12add68b4d85adb182ae5b28f8340185394b63000000000165ffffffff04dbabb7010000000000ee2f6000000000000852ab6500ab6a51acb62a27000000000009ac53515300ac006a6345fb7505000000000752516a0051636a00000000", "", 3, 15199787, "ed6e35a5a873d187933cb6ee5453ac32d9d359836ad6e7b39abfc176d6dbec73"], + ["1a28c4f702c8efaad96d879b38ec65c5283b5c084b819ad7db1c086e85e32446c7818dc7a90300000008656351536a525165fa78cef86c982f1aac9c5eb8b707aee8366f74574c8f42ef240599c955ef4401cf578be30200000002ab518893292204c430eb0100000000016503138a0300000000040053abac60e0eb010000000005525200ab63567c2d030000000004abab52006cf81e85", "ab51525152", 1, 2118315905, "3628fb1c307640b57c9165dd21d8d46437fa0a79d60f2636a4d2ee6830d12ea2"], ["c6c7a87003f772bcae9f3a0ac5e499000b68703e1804b9ddc3e73099663564d53ddc4e1c6e01000000076a536a6aac63636e3102122f4c30056ef8711a6bf11f641ddfa6984c25ac38c3b3e286e74e839198a80a34010000000165867195cd425821dfa2f279cb1390029834c06f018b1e6af73823c867bf3a0524d1d6923b0300000005acab53ab65ffffffff02fa4c49010000000008ab656a0052650053e001100400000000008836d972", "ac526351acab", 1, 978122815, "a869c18a0edf563d6e5eddd5d5ae8686f41d07f394f95c9feb8b7e52761531ca"], ["0ea580ac04c9495ab6af3b8d59108bb4194fcb9af90b3511c83f7bb046d87aedbf8423218e02000000085152acac006363ab9063d7dc25704e0caa5edde1c6f2dd137ded379ff597e055b2977b9c559b07a7134fcef2000000000200aca89e50181f86e9854ae3b453f239e2847cf67300fff802707c8e3867ae421df69274449402000000056365abababffffffff47a4760c881a4d7e51c69b69977707bd2fb3bcdc300f0efc61f5840e1ac72cee0000000000ffffffff0460179a020000000004ab53ab52a5250c0500000000096565acac6365ab52ab6c281e02000000000952635100ac006563654e55070400000000046552526500000000", "ab526563acac53ab", 2, 1426964167, "b1c50d58b753e8f6c7513752158e9802cf0a729ebe432b99acc0fe5d9b4e9980"], - ["c33028b301d5093e1e8397270d75a0b009b2a6509a01861061ab022ca122a6ba935b8513320200000000ffffffff013bcf5a0500000000015200000000", "", 0, -513413204, "6b1459536f51482f5dbf42d7e561896557461e1e3b6bf67871e2b51faae2832c"], + ["c33028b301d5093e1e8397270d75a0b009b2a6509a01861061ab022ca122a6ba935b8513320200000000ffffffff013bcf5a0500000000015200000000", "", 0, -513413204, "4809ea4e929a269b49831b7150285ec39f7c66e81c11b2632084fd3ce4aa3323"], ["43b2727901a7dd06dd2abf690a1ccedc0b0739cb551200796669d9a25f24f71d8d101379f50300000000ffffffff0418e031040000000000863d770000000000085352ac526563ac5174929e040000000004ac65ac00ec31ac0100000000066a51ababab5300000000", "65", 0, -492874289, "154ff7a9f0875edcfb9f8657a0b98dd9600fabee3c43eb88af37cf99286d516c"], - ["4763ed4401c3e6ab204bed280528e84d5288f9cac5fb8a2e7bd699c7b98d4df4ac0c40e55303000000066a6aacab5165ffffffff015b57f80400000000046a63535100000000", "ac51abab53", 0, -592611747, "849033a2321b5755e56ef4527ae6f51e30e3bca50149d5707368479723d744f8"], - ["d24f647b02f71708a880e6819a1dc929c1a50b16447e158f8ff62f9ccd644e0ca3c592593702000000050053536a00ffffffff67868cd5414b6ca792030b18d649de5450a456407242b296d936bcf3db79e07b02000000005af6319c016022f50100000000036a516300000000", "6aab526353516a6a", 0, 1350782301, "8556fe52d1d0782361dc28baaf8774b13f3ce5ed486ae0f124b665111e08e3e3"], - ["fe6ddf3a02657e42a7496ef170b4a8caf245b925b91c7840fd28e4a22c03cb459cb498b8d603000000065263656a650071ce6bf8d905106f9f1faf6488164f3decac65bf3c5afe1dcee20e6bc3cb6d052561985a030000000163295b117601343dbb0000000000026563dba521df", "", 1, -1696179931, "d9684685c99ce48f398fb467a91a1a59629a850c429046fb3071f1fa9a5fe816"], - ["c61523ef0129bb3952533cbf22ed797fa2088f307837dd0be1849f20decf709cf98c6f032f03000000026563c0f1d378044338310400000000066363516a5165a14fcb0400000000095163536a6a00ab53657271d60200000000001d953f0500000000010000000000", "53516353005153", 0, 1141615707, "7e975a72db5adaa3c48d525d9c28ac11cf116d0f8b16ce08f735ad75a80aec66"], - ["ba3dac6c0182562b0a26d475fe1e36315f0913b6869bdad0ecf21f1339a5fcbccd32056c840200000000ffffffff04300351050000000000220ed405000000000851abac636565ac53dbbd19020000000007636363ac6a52acbb005a0500000000016abd0c78a8", "63006a635151005352", 0, 1359658828, "47bc8ab070273e1f4a0789c37b45569a6e16f3f3092d1ce94dddc3c34a28f9f4"], - ["ac27e7f5025fc877d1d99f7fc18dd4cadbafa50e34e1676748cc89c202f93abf36ed46362101000000036300abffffffff958cd5381962b765e14d87fc9524d751e4752dd66471f973ed38b9d562e525620100000003006500ffffffff02b67120050000000004ac51516adc330c0300000000015200000000", "656352", 1, 15049991, "f3374253d64ac264055bdbcc32e27426416bd595b7c7915936c70f839e504010"], + ["4763ed4401c3e6ab204bed280528e84d5288f9cac5fb8a2e7bd699c7b98d4df4ac0c40e55303000000066a6aacab5165ffffffff015b57f80400000000046a63535100000000", "ac51abab53", 0, -592611747, "e994c27222fdb41bf5cb633078a37fa4d56121cab293841737c3641838a7836f"], + ["d24f647b02f71708a880e6819a1dc929c1a50b16447e158f8ff62f9ccd644e0ca3c592593702000000050053536a00ffffffff67868cd5414b6ca792030b18d649de5450a456407242b296d936bcf3db79e07b02000000005af6319c016022f50100000000036a516300000000", "6aab526353516a6a", 0, 1350782301, "69ee727cbffa49b6a6590a9691b91dde601abb65c4db95d37e7ad55125d4c799"], + ["fe6ddf3a02657e42a7496ef170b4a8caf245b925b91c7840fd28e4a22c03cb459cb498b8d603000000065263656a650071ce6bf8d905106f9f1faf6488164f3decac65bf3c5afe1dcee20e6bc3cb6d052561985a030000000163295b117601343dbb0000000000026563dba521df", "", 1, -1696179931, "674466f6a54692d103c2176fb3a9052c4db2ff85f5a050cc80961fe9d38aa94e"], + ["c61523ef0129bb3952533cbf22ed797fa2088f307837dd0be1849f20decf709cf98c6f032f03000000026563c0f1d378044338310400000000066363516a5165a14fcb0400000000095163536a6a00ab53657271d60200000000001d953f0500000000010000000000", "53516353005153", 0, 1141615707, "79644e1f8285cd9c1a9da229a52bffde1b4417120d3edfa3cc14407246c8b058"], + ["ba3dac6c0182562b0a26d475fe1e36315f0913b6869bdad0ecf21f1339a5fcbccd32056c840200000000ffffffff04300351050000000000220ed405000000000851abac636565ac53dbbd19020000000007636363ac6a52acbb005a0500000000016abd0c78a8", "63006a635151005352", 0, 1359658828, "7d4c3868a0de244176937f91ff3428173f6be7101646c3febd7f8d62e914b906"], + ["ac27e7f5025fc877d1d99f7fc18dd4cadbafa50e34e1676748cc89c202f93abf36ed46362101000000036300abffffffff958cd5381962b765e14d87fc9524d751e4752dd66471f973ed38b9d562e525620100000003006500ffffffff02b67120050000000004ac51516adc330c0300000000015200000000", "656352", 1, 15049991, "345c67ea34252b6aeba6a5bc51db823b19cac2cd044412dbf75355f56ca491b6"], ["edb30140029182b80c8c3255b888f7c7f061c4174d1db45879dca98c9aab8c8fed647a6ffc03000000086a53510052ab6300ffffffff82f65f261db62d517362c886c429c8fbbea250bcaad93356be6f86ba573e9d930100000000ffffffff04daaf150400000000016a86d1300100000000096a6353535252ac5165d4ddaf000000000002abab5f1c6201000000000000000000", "ab6a6a00ac", 0, -2058017816, "8d7794703dad18e2e40d83f3e65269834bb293e2d2b8525932d6921884b8f368"], - ["7e50207303146d1f7ad62843ae8017737a698498d4b9118c7a89bb02e8370307fa4fada41d000000000753006300005152b7afefc85674b1104ba33ef2bf37c6ed26316badbc0b4aa6cb8b00722da4f82ff3555a6c020000000900ac656363ac51ac52ffffffff93fab89973bd322c5d7ad7e2b929315453e5f7ada3072a36d8e33ca8bebee6e0020000000300acab930da52b04384b04000000000004650052ac435e380200000000076a6a515263ab6aa9494705000000000600ab6a525252af8ba90100000000096565acab526353536a279b17ad", "acac005263536aac63", 1, -34754133, "4e6357da0057fb7ff79da2cc0f20c5df27ff8b2f8af4c1709e6530459f7972b0"], - ["c05764f40244fb4ebe4c54f2c5298c7c798aa90e62c29709acca0b4c2c6ec08430b26167440100000008acab6a6565005253ffffffffc02c2418f398318e7f34a3cf669d034eef2111ea95b9f0978b01493293293a870100000000e563e2e00238ee8d040000000002acab03fb060200000000076500ac656a516aa37f5534", "52ab6a0065", 1, -2033176648, "83deef4a698b62a79d4877dd9afebc3011a5275dbe06e89567e9ef84e8a4ee19"], - ["5a59e0b9040654a3596d6dab8146462363cd6549898c26e2476b1f6ae42915f73fd9aedfda00000000036363abffffffff9ac9e9ca90be0187be2214251ff08ba118e6bf5e2fd1ba55229d24e50a510d53010000000165ffffffff41d42d799ac4104644969937522873c0834cc2fcdab7cdbecd84d213c0e96fd60000000000ffffffffd838db2c1a4f30e2eaa7876ef778470f8729fcf258ad228b388df2488709f8410300000000fdf2ace002ceb6d903000000000265654c1310040000000003ac00657e91c0ec", "536a63ac", 0, 82144555, "98ccde2dc14d14f5d8b1eeea5364bd18fc84560fec2fcea8de4d88b49c00695e"], - ["156ebc8202065d0b114984ee98c097600c75c859bfee13af75dc93f57c313a877efb09f230010000000463536a51ffffffff81114e8a697be3ead948b43b5005770dd87ffb1d5ccd4089fa6c8b33d3029e9c03000000066a5251656351ffffffff01a87f140000000000050000ac51ac00000000", "00", 0, -362221092, "a903c84d8c5e71134d1ab6dc1e21ac307c4c1a32c90c90f556f257b8a0ec1bf5"], + ["7e50207303146d1f7ad62843ae8017737a698498d4b9118c7a89bb02e8370307fa4fada41d000000000753006300005152b7afefc85674b1104ba33ef2bf37c6ed26316badbc0b4aa6cb8b00722da4f82ff3555a6c020000000900ac656363ac51ac52ffffffff93fab89973bd322c5d7ad7e2b929315453e5f7ada3072a36d8e33ca8bebee6e0020000000300acab930da52b04384b04000000000004650052ac435e380200000000076a6a515263ab6aa9494705000000000600ab6a525252af8ba90100000000096565acab526353536a279b17ad", "acac005263536aac63", 1, -34754133, "866c1b687ac6f66424d962a8a4887ae615da627c90cbeb7cec73138797c4391d"], + ["c05764f40244fb4ebe4c54f2c5298c7c798aa90e62c29709acca0b4c2c6ec08430b26167440100000008acab6a6565005253ffffffffc02c2418f398318e7f34a3cf669d034eef2111ea95b9f0978b01493293293a870100000000e563e2e00238ee8d040000000002acab03fb060200000000076500ac656a516aa37f5534", "52ab6a0065", 1, -2033176648, "814578d98743bdd0ea6e017455633eb469d4ce4046d50fe8b8a623e3a4413e4a"], + ["5a59e0b9040654a3596d6dab8146462363cd6549898c26e2476b1f6ae42915f73fd9aedfda00000000036363abffffffff9ac9e9ca90be0187be2214251ff08ba118e6bf5e2fd1ba55229d24e50a510d53010000000165ffffffff41d42d799ac4104644969937522873c0834cc2fcdab7cdbecd84d213c0e96fd60000000000ffffffffd838db2c1a4f30e2eaa7876ef778470f8729fcf258ad228b388df2488709f8410300000000fdf2ace002ceb6d903000000000265654c1310040000000003ac00657e91c0ec", "536a63ac", 0, 82144555, "daaf093366695b49dbb9b890304dfc90c884157c8714136f2195bf01a91ac97a"], + ["156ebc8202065d0b114984ee98c097600c75c859bfee13af75dc93f57c313a877efb09f230010000000463536a51ffffffff81114e8a697be3ead948b43b5005770dd87ffb1d5ccd4089fa6c8b33d3029e9c03000000066a5251656351ffffffff01a87f140000000000050000ac51ac00000000", "00", 0, -362221092, "020b59e3a1856c53fb54e9e3499074453a9d2da9cfb0dc72aefcbd3b92b1c72a"], ["15e37793023c7cbf46e073428908fce0331e49550f2a42b92468827852693f0532a01c29f70200000007005353636351acffffffff38426d9cec036f00eb56ec1dcd193647e56a7577278417b8a86a78ac53199bc403000000056353006a53ffffffff04a25ce103000000000900ab5365656a526a63c8eff7030000000004526353537ab6db0200000000016a11a3fa02000000000651acacab526500000000", "53ac6aab6a6551", 0, 1117532791, "83c68b3c5a89260ce16ce8b4dbf02e1f573c532d9a72f5ea57ab419fa2630214"], ["f7a09f10027250fc1b70398fb5c6bffd2be9718d3da727e841a73596fdd63810c9e4520a6a010000000963ac516a636a65acac1d2e2c57ab28d311edc4f858c1663972eebc3bbc93ed774801227fda65020a7ec1965f780200000005ac5252516a8299fddc01dcbf7200000000000463ac6551960fda03", "65acab51", 1, 2017321737, "9c5fa02abfd34d0f9dec32bf3edb1089fca70016debdb41f4f54affcb13a2a2a"], ["6d97a9a5029220e04f4ccc342d8394c751282c328bf1c132167fc05551d4ca4da4795f6d4e02000000076a0052ab525165ffffffff9516a205e555fa2a16b73e6db6c223a9e759a7e09c9a149a8f376c0a7233fa1b0100000007acab51ab63ac6affffffff04868aed04000000000652ac65ac536a396edf01000000000044386c0000000000076aab5363655200894d48010000000001ab8ebefc23", "6351526aac51", 1, 1943666485, "f0bd4ca8e97203b9b4e86bc24bdc8a1a726db5e99b91000a14519dc83fc55c29"], - ["8e3fddfb028d9e566dfdda251cd874cd3ce72e9dde837f95343e90bd2a93fe21c5daeb5eed01000000045151525140517dc818181f1e7564b8b1013fd68a2f9a56bd89469686367a0e72c06be435cf99db750000000003635251ffffffff01c051780300000000096552ababac6a65acab099766eb", "5163ab6a52ababab51", 1, 1296295812, "5509eba029cc11d7dd2808b8c9eb47a19022b8d8b7778893459bbc19ab7ea820"], - ["a603f37b02a35e5f25aae73d0adc0b4b479e68a734cf722723fd4e0267a26644c36faefdab0200000000ffffffff43374ad26838bf733f8302585b0f9c22e5b8179888030de9bdda180160d770650200000001004c7309ce01379099040000000005526552536500000000", "abababab005153", 0, 1409936559, "4ca73da4fcd5f1b10da07998706ffe16408aa5dff7cec40b52081a6514e3827e"], + ["8e3fddfb028d9e566dfdda251cd874cd3ce72e9dde837f95343e90bd2a93fe21c5daeb5eed01000000045151525140517dc818181f1e7564b8b1013fd68a2f9a56bd89469686367a0e72c06be435cf99db750000000003635251ffffffff01c051780300000000096552ababac6a65acab099766eb", "5163ab6a52ababab51", 1, 1296295812, "11ffe5eebbac300948e230c48fb4065b72b494bae5b4d4a806b29518c1925a58"], + ["a603f37b02a35e5f25aae73d0adc0b4b479e68a734cf722723fd4e0267a26644c36faefdab0200000000ffffffff43374ad26838bf733f8302585b0f9c22e5b8179888030de9bdda180160d770650200000001004c7309ce01379099040000000005526552536500000000", "abababab005153", 0, 1409936559, "01024400098aa66d3e1cdb8ff7362bbe09dcecf2f6a3d74c302878a0b1f4475b"], ["9eeedaa8034471a3a0e3165620d1743237986f060c4434f095c226114dcb4b4ec78274729f03000000086a5365510052ac6afb505af3736e347e3f299a58b1b968fce0d78f7457f4eab69240cbc40872fd61b5bf8b120200000002ac52df8247cf979b95a4c97ecb8edf26b3833f967020cd2fb25146a70e60f82c9ee4b14e88b103000000008459e2fa0125cbcd05000000000000000000", "52ab5352006353516a", 0, -1832576682, "fb018ae54206fdd20c83ae5873ec82b8e320a27ed0d0662db09cda8a071f9852"], ["05921d7c048cf26f76c1219d0237c226454c2a713c18bf152acc83c8b0647a94b13477c07f0300000003ac526afffffffff2f494453afa0cabffd1ba0a626c56f90681087a5c1bd81d6adeb89184b27b7402000000036a6352ffffffff0ad10e2d3ce355481d1b215030820da411d3f571c3f15e8daf22fe15342fed04000000000095f29f7b93ff814a9836f54dc6852ec414e9c4e16a506636715f569151559100ccfec1d100000000055263656a53ffffffff04f4ffef010000000008ac6a6aabacabab6a0e6689040000000006ab536a5352abe364d005000000000965536363655251ab53807e00010000000004526aab63f18003e3", "6363ac51", 3, -375891099, "001b0b176f0451dfe2d9787b42097ceb62c70d324e925ead4c58b09eebdf7f67"], ["b9b44d9f04b9f15e787d7704e6797d51bc46382190c36d8845ec68dfd63ee64cf7a467b21e00000000096aac00530052ab636aba1bcb110a80c5cbe073f12c739e3b20836aa217a4507648d133a8eedd3f02cb55c132b203000000076a000063526352b1c288e3a9ff1f2da603f230b32ef7c0d402bdcf652545e2322ac01d725d75f5024048ad0100000000ffffffffffd882d963be559569c94febc0ef241801d09dc69527c9490210f098ed8203c700000000056a006300ab9109298d01719d9a0300000000066a52ab006365d7894c5b", "ac6351650063636a", 3, -622355349, "ac87b1b93a6baab6b2c6624f10e8ebf6849b0378ef9660a3329073e8f5553c8d"], - ["ff60473b02574f46d3e49814c484081d1adb9b15367ba8487291fc6714fd6e3383d5b335f001000000026a6ae0b82da3dc77e5030db23d77b58c3c20fa0b70aa7d341a0f95f3f72912165d751afd57230300000008ac536563516a6363ffffffff04f86c0200000000000553acab636ab13111000000000003510065f0d3f305000000000951ab516a65516aabab730a3a010000000002515200000000", "ac6a", 1, 1895032314, "0767e09bba8cd66d55915677a1c781acd5054f530d5cf6de2d34320d6c467d80"], - ["f218026204f4f4fc3d3bd0eada07c57b88570d544a0436ae9f8b753792c0c239810bb30fbc0200000002536affffffff8a468928d6ec4cc10aa0f73047697970e99fa64ae8a3b4dca7551deb0b639149010000000851ab520052650051ffffffffa98dc5df357289c9f6873d0f5afcb5b030d629e8f23aa082cf06ec9a95f3b0cf0000000000ffffffffea2c2850c5107705fd380d6f29b03f533482fd036db88739122aac9eff04e0aa010000000365536a03bd37db034ac4c4020000000007515152655200ac33b27705000000000151efb71e0000000000007b65425b", "515151", 3, -1772252043, "de35c84a58f2458c33f564b9e58bc57c3e028d629f961ad1b3c10ee020166e5a"], + ["ff60473b02574f46d3e49814c484081d1adb9b15367ba8487291fc6714fd6e3383d5b335f001000000026a6ae0b82da3dc77e5030db23d77b58c3c20fa0b70aa7d341a0f95f3f72912165d751afd57230300000008ac536563516a6363ffffffff04f86c0200000000000553acab636ab13111000000000003510065f0d3f305000000000951ab516a65516aabab730a3a010000000002515200000000", "ac6a", 1, 1895032314, "cf118ba30338cb6c06970d98c7503e04e783a141a5b4d7d18a3df0da8cb67af7"], + ["f218026204f4f4fc3d3bd0eada07c57b88570d544a0436ae9f8b753792c0c239810bb30fbc0200000002536affffffff8a468928d6ec4cc10aa0f73047697970e99fa64ae8a3b4dca7551deb0b639149010000000851ab520052650051ffffffffa98dc5df357289c9f6873d0f5afcb5b030d629e8f23aa082cf06ec9a95f3b0cf0000000000ffffffffea2c2850c5107705fd380d6f29b03f533482fd036db88739122aac9eff04e0aa010000000365536a03bd37db034ac4c4020000000007515152655200ac33b27705000000000151efb71e0000000000007b65425b", "515151", 3, -1772252043, "2f3bc009ff560f7114010e1ca566e7840469ab255769ce96f430c3b6e212a87f"], ["48e7d42103b260b27577b70530d1ac2fed2551e9dd607cbcf66dca34bb8c03862cf8f5fd5401000000075151526aacab00ffffffff1e3d3b841552f7c6a83ee379d9d66636836673ce0b0eda95af8f2d2523c91813030000000665acac006365ffffffff388b3c386cd8c9ef67c83f3eaddc79f1ff910342602c9152ffe8003bce51b28b0100000008636363006a636a52ffffffff04b8f67703000000000852005353ac6552520cef720200000000085151ab6352ab00ab5096d6030000000005516a005100662582020000000001ac6c137280", "6a65", 1, 1513618429, "e2fa3e1976aed82c0987ab30d4542da2cb1cffc2f73be13480132da8c8558d5c"], ["91ebc4cf01bc1e068d958d72ee6e954b196f1d85b3faf75a521b88a78021c543a06e056279000000000265ab7c12df0503832121030000000000cc41a6010000000005ab5263516540a951050000000006ab63ab65acac00000000", "526a0065636a6a6aac", 0, -614046478, "7de4ba875b2e584a7b658818c112e51ee5e86226f5a80e5f6b15528c86400573"], ["3cd4474201be7a6c25403bf00ca62e2aa8f8f4f700154e1bb4d18c66f7bb7f9b975649f0dc0100000006535151535153ffffffff01febbeb000000000006005151006aac00000000", "", 0, -1674687131, "6b77ca70cc452cc89acb83b69857cda98efbfc221688fe816ef4cb4faf152f86"], ["92fc95f00307a6b3e2572e228011b9c9ed41e58ddbaefe3b139343dbfb3b34182e9fcdc3f50200000002acab847bf1935fde8bcfe41c7dd99683289292770e7f163ad09deff0e0665ed473cd2b56b0f40300000006516551ab6351294dab312dd87b9327ce2e95eb44b712cfae0e50fda15b07816c8282e8365b643390eaab01000000026aacffffffff016e0b6b040000000001ac00000000", "650065acac005300", 2, -1885164012, "bd7d26bb3a98fc8c90c972500618bf894cb1b4fe37bf5481ff60eef439d3b970"], ["4db591ab018adcef5f4f3f2060e41f7829ce3a07ea41d681e8cb70a0e37685561e4767ac3b0000000005000052acabd280e63601ae6ef20000000000036a636326c908f7", "ac6a51526300630052", 0, 862877446, "355ccaf30697c9c5b966e619a554d3323d7494c3ea280a9b0dfb73f953f5c1cb"], - ["503fd5ef029e1beb7b242d10032ac2768f9a1aca0b0faffe51cec24770664ec707ef7ede4f01000000045253ac53375e350cc77741b8e96eb1ce2d3ca91858c052e5f5830a0193200ae2a45b413dda31541f0000000003516553ffffffff0175a5ba0500000000015200000000", "6aab65510053ab65", 1, 1603081205, "353ca9619ccb0210ae18b24d0e57efa7abf8e58fa6f7102738e51e8e72c9f0c4"], - ["c80abebd042cfec3f5c1958ee6970d2b4586e0abec8305e1d99eb9ee69ecc6c2cbd76374380000000007ac53006300ac510acee933b44817db79320df8094af039fd82111c7726da3b33269d3820123694d849ee5001000000056a65ab526562699bea8530dc916f5d61f0babea709dac578774e8a4dcd9c640ec3aceb6cb2443f24f302000000020063ea780e9e57d1e4245c1e5df19b4582f1bf704049c5654f426d783069bcc039f2d8fa659f030000000851ab53635200006a8d00de0b03654e8500000000000463ab635178ebbb0400000000055100636aab239f1d030000000006ab006300536500000000", "6565ac515100", 3, 1460851377, "b35bb1b72d02fab866ed6bbbea9726ab32d968d33a776686df3ac16aa445871e"], - ["0337b2d5043eb6949a76d6632b8bb393efc7fe26130d7409ef248576708e2d7f9d0ced9d3102000000075352636a5163007034384dfa200f52160690fea6ce6c82a475c0ef1caf5c9e5a39f8f9ddc1c8297a5aa0eb02000000026a51ffffffff38e536298799631550f793357795d432fb2d4231f4effa183c4e2f61a816bcf0030000000463ac5300706f1cd3454344e521fde05b59b96e875c8295294da5d81d6cc7efcfe8128f150aa54d6503000000008f4a98c704c1561600000000000072cfa6000000000000e43def01000000000100cf31cc0500000000066365526a6500cbaa8e2e", "", 3, 2029506437, "7615b4a7b3be865633a31e346bc3db0bcc410502c8358a65b8127089d81b01f8"], + ["503fd5ef029e1beb7b242d10032ac2768f9a1aca0b0faffe51cec24770664ec707ef7ede4f01000000045253ac53375e350cc77741b8e96eb1ce2d3ca91858c052e5f5830a0193200ae2a45b413dda31541f0000000003516553ffffffff0175a5ba0500000000015200000000", "6aab65510053ab65", 1, 1603081205, "b50b37c663ee44cb411bebe3815b74423dda1856345b22308daeffe5a536e851"], + ["c80abebd042cfec3f5c1958ee6970d2b4586e0abec8305e1d99eb9ee69ecc6c2cbd76374380000000007ac53006300ac510acee933b44817db79320df8094af039fd82111c7726da3b33269d3820123694d849ee5001000000056a65ab526562699bea8530dc916f5d61f0babea709dac578774e8a4dcd9c640ec3aceb6cb2443f24f302000000020063ea780e9e57d1e4245c1e5df19b4582f1bf704049c5654f426d783069bcc039f2d8fa659f030000000851ab53635200006a8d00de0b03654e8500000000000463ab635178ebbb0400000000055100636aab239f1d030000000006ab006300536500000000", "6565ac515100", 3, 1460851377, "110961f59dbb6b83661e23ad7c685d8a0a4bfe49c9746b53a32dc89665551288"], + ["0337b2d5043eb6949a76d6632b8bb393efc7fe26130d7409ef248576708e2d7f9d0ced9d3102000000075352636a5163007034384dfa200f52160690fea6ce6c82a475c0ef1caf5c9e5a39f8f9ddc1c8297a5aa0eb02000000026a51ffffffff38e536298799631550f793357795d432fb2d4231f4effa183c4e2f61a816bcf0030000000463ac5300706f1cd3454344e521fde05b59b96e875c8295294da5d81d6cc7efcfe8128f150aa54d6503000000008f4a98c704c1561600000000000072cfa6000000000000e43def01000000000100cf31cc0500000000066365526a6500cbaa8e2e", "", 3, 2029506437, "6b15462e8696111c7c714c0e8878467c3044dc545736a9cbad0c0a76853a626a"], ["59f6cffd034733f4616a20fe19ea6aaf6abddb30b408a3a6bd86cd343ab6fe90dc58300cc90200000000ffffffffc835430a04c3882066abe7deeb0fa1fdaef035d3233460c67d9eabdb05e95e5a02000000080065ac535353ab00ffffffff4b9a043e89ad1b4a129c8777b0e8d87a014a0ab6a3d03e131c27337bbdcb43b402000000066a5100abac6ad9e9bf62014bb118010000000001526cbe484f", "ab526352ab65", 0, 2103515652, "4f2ccf981598639bec57f885b4c3d8ea8db445ea6e61cfd45789c69374862e5e"], ["cbc79b10020b15d605680a24ee11d8098ad94ae5203cb6b0589e432832e20c27b72a926af20300000006ab65516a53acbb854f3146e55c508ece25fa3d99dbfde641a58ed88c051a8a51f3dacdffb1afb827814b02000000026352c43e6ef30302410a020000000000ff4bd90100000000065100ab63000008aa8e0400000000095265526565ac5365abc52c8a77", "53526aac0051", 0, 202662340, "984efe0d8d12e43827b9e4b27e97b3777ece930fd1f589d616c6f9b71dab710e"], - ["7c07419202fa756d29288c57b5c2b83f3c847a807f4a9a651a3f6cd6c46034ae0aa3a7446b0200000004ab6a6365ffffffff9da83cf4219bb96c76f2d77d5df31c1411a421171d9b59ec02e5c1218f29935403000000008c13879002f8b1ac0400000000086a63536a636553653c584f02000000000000000000", "abac53ab656363", 1, -1038419525, "4a74f365a161bc6c9bddd249cbd70f5dadbe3de70ef4bd745dcb6ee1cd299fbd"], - ["351cbb57021346e076d2a2889d491e9bfa28c54388c91b46ee8695874ad9aa576f1241874d0200000008ab6563525300516affffffffe13e61b8880b8cd52be4a59e00f9723a4722ea58013ec579f5b3693b9e115b1100000000096363abac5252635351ffffffff027fee02040000000008ab6a5200ab006a65b85f130200000000086a52630053ab52ab00000000", "ab6aab65", 1, 586415826, "08bbb746a596991ab7f53a76e19acad087f19cf3e1db54054aab403c43682d09"], - ["a8252ea903f1e8ff953adb16c1d1455a5036222c6ea98207fc21818f0ece2e1fac310f9a0100000000095163ac635363ac0000be6619e9fffcde50a0413078821283ce3340b3993ad00b59950bae7a9f931a9b0a3a035f010000000463005300b8b0583fbd6049a1715e7adacf770162811989f2be20af33f5f60f26eba653dc26b024a00000000006525351636552ffffffff046d2acc030000000002636a9a2d430500000000080065005165ab53abecf63204000000000052b9ed050000000008acacac53ab65656500000000", "65ab53635253636a51", 2, 1442639059, "8ca11838775822f9a5beee57bdb352f4ee548f122de4a5ca61c21b01a1d50325"], - ["2f1a425c0471a5239068c4f38f9df135b1d24bf52d730d4461144b97ea637504495aec360801000000055300515365c71801dd1f49f376dd134a9f523e0b4ae611a4bb122d8b26de66d95203f181d09037974300000000025152ffffffff9bdcea7bc72b6e5262e242c94851e3a5bf8f314b3e5de0e389fc9e5b3eadac030000000009525265655151005153ffffffffdbb53ce99b5a2320a4e6e2d13b01e88ed885a0957d222e508e9ec8e4f83496cb0200000007635200abac63ac04c96237020cc5490100000000080000516a51ac6553074a360200000000025152225520ca", "6551ab65ac65516a", 1, -489869549, "9bc5bb772c553831fb40abe466074e59a469154679c7dee042b8ea3001c20393"], - ["ef3acfd4024defb48def411b8f8ba2dc408dc9ee97a4e8bde4d6cb8e10280f29c98a6e8e9103000000035100513d5389e3d67e075469dfd9f204a7d16175653a149bd7851619610d7ca6eece85a516b2df0300000005516aac6552ca678bdf02f477f003000000000057e45b0300000000055252525252af35c20a", "5165ac53ab", 1, -1900839569, "78eb6b24365ac1edc386aa4ffd15772f601059581c8776c34f92f8a7763c9ccf"], - ["ff4468dc0108475fc8d4959a9562879ce4ab4867a419664bf6e065f17ae25043e6016c70480100000000ffffffff02133c6f0400000000000bd0a8020000000004006a520035afa4f6", "51ac65ab", 0, -537664660, "f6da59b9deac63e83728850ac791de61f5dfcaeed384ebcbb20e44afcd8c8910"], + ["7c07419202fa756d29288c57b5c2b83f3c847a807f4a9a651a3f6cd6c46034ae0aa3a7446b0200000004ab6a6365ffffffff9da83cf4219bb96c76f2d77d5df31c1411a421171d9b59ec02e5c1218f29935403000000008c13879002f8b1ac0400000000086a63536a636553653c584f02000000000000000000", "abac53ab656363", 1, -1038419525, "950be4f7de96cbeeea1a6a1a219c316e14156d02d76ce3343eb3c40840878bd2"], + ["351cbb57021346e076d2a2889d491e9bfa28c54388c91b46ee8695874ad9aa576f1241874d0200000008ab6563525300516affffffffe13e61b8880b8cd52be4a59e00f9723a4722ea58013ec579f5b3693b9e115b1100000000096363abac5252635351ffffffff027fee02040000000008ab6a5200ab006a65b85f130200000000086a52630053ab52ab00000000", "ab6aab65", 1, 586415826, "735783bd6b186cb880f60534a48a05a9217c4f2d90e65b5d7c5d078938be00bb"], + ["a8252ea903f1e8ff953adb16c1d1455a5036222c6ea98207fc21818f0ece2e1fac310f9a0100000000095163ac635363ac0000be6619e9fffcde50a0413078821283ce3340b3993ad00b59950bae7a9f931a9b0a3a035f010000000463005300b8b0583fbd6049a1715e7adacf770162811989f2be20af33f5f60f26eba653dc26b024a00000000006525351636552ffffffff046d2acc030000000002636a9a2d430500000000080065005165ab53abecf63204000000000052b9ed050000000008acacac53ab65656500000000", "65ab53635253636a51", 2, 1442639059, "3bb2733bfcecdcd363c57ecc96512c63f38d9681db04caa72de278e94fa1c43a"], + ["2f1a425c0471a5239068c4f38f9df135b1d24bf52d730d4461144b97ea637504495aec360801000000055300515365c71801dd1f49f376dd134a9f523e0b4ae611a4bb122d8b26de66d95203f181d09037974300000000025152ffffffff9bdcea7bc72b6e5262e242c94851e3a5bf8f314b3e5de0e389fc9e5b3eadac030000000009525265655151005153ffffffffdbb53ce99b5a2320a4e6e2d13b01e88ed885a0957d222e508e9ec8e4f83496cb0200000007635200abac63ac04c96237020cc5490100000000080000516a51ac6553074a360200000000025152225520ca", "6551ab65ac65516a", 1, -489869549, "b88ebd4ffd61d3f3b33b67f49fbefbe6b43db1bc0f0b2c619f29eb3f3ffb9bd0"], + ["ef3acfd4024defb48def411b8f8ba2dc408dc9ee97a4e8bde4d6cb8e10280f29c98a6e8e9103000000035100513d5389e3d67e075469dfd9f204a7d16175653a149bd7851619610d7ca6eece85a516b2df0300000005516aac6552ca678bdf02f477f003000000000057e45b0300000000055252525252af35c20a", "5165ac53ab", 1, -1900839569, "b2be8b069f14c3c84f4e30b69c7c9059ac80d27fbd0dee9708a4eeb2d75f23cb"], + ["ff4468dc0108475fc8d4959a9562879ce4ab4867a419664bf6e065f17ae25043e6016c70480100000000ffffffff02133c6f0400000000000bd0a8020000000004006a520035afa4f6", "51ac65ab", 0, -537664660, "1c2b6d7b9a956e531d340ac306a7fd5da0e8fd403cded00b073678f13dec3b2d"], ["4e8594d803b1d0a26911a2bcdd46d7cbc987b7095a763885b1a97ca9cbb747d32c5ab9aa91030000000353ac53a0cc4b215e07f1d648b6eeb5cdbe9fa32b07400aa773b9696f582cebfd9930ade067b2b200000000060065abab6500fc99833216b8e27a02defd9be47fafae4e4a97f52a9d2a210d08148d2a4e5d02730bcd460100000004516351ac37ce3ae1033baa55040000000006006a636a63acc63c990400000000025265eb1919030000000005656a6a516a00000000", "", 1, -75217178, "04c5ee48514cd033b82a28e336c4d051074f477ef2675ce0ce4bafe565ee9049"], ["a88830a7023f13ed19ab14fd757358eb6af10d6520f9a54923a6d613ac4f2c11e249cda8aa030000000851630065abababacffffffff8f5fe0bc04a33504c4b47e3991d25118947a0261a9fa520356731eeabd561dd3020000000363ababffffffff038404bd010000000008ab5153516aab6a63d33a5601000000000263004642dc020000000009655152acac636352004be6f3af", "5253536565006aab6a", 0, 1174417836, "2e42ead953c9f4f81b72c27557e6dc7d48c37ff2f5c46c1dbe9778fb0d79f5b2"], ["44e1a2b4010762af23d2027864c784e34ef322b6e24c70308a28c8f2157d90d17b99cd94a401000000085163656565006300ffffffff0198233d020000000002000000000000", "52525153656365", 0, 1119696980, "d9096de94d70c6337da6202e6e588166f31bff5d51bb5adc9468594559d65695"], @@ -212,291 +212,291 @@ ["cfa147d2017fe84122122b4dda2f0d6318e59e60a7207a2d00737b5d89694d480a2c26324b0000000006006351526552ffffffff0456b5b804000000000800516aab525363ab166633000000000004655363ab254c0e02000000000952ab6a6a00ab525151097c1b020000000009656a52ac6300530065ad0d6e50", "6a535165ac6a536500", 0, -574683184, "f926d4036eac7f019a2b0b65356c4ee2fe50e089dd7a70f1843a9f7bc6997b35"], ["91c5d5f6022fea6f230cc4ae446ce040d8313071c5ac1749c82982cc1988c94cb1738aa48503000000016a19e204f30cb45dd29e68ff4ae160da037e5fc93538e21a11b92d9dd51cf0b5efacba4dd70000000005656a6aac51ffffffff03db126905000000000953006a53ab6563636a36a273030000000006656a52656552b03ede00000000000352516500000000", "530052526a00", 1, 1437328441, "255c125b60ee85f4718b2972174c83588ee214958c3627f51f13b5fb56c8c317"], ["03f20dc202c886907b607e278731ebc5d7373c348c8c66cac167560f19b341b782dfb634cb03000000076a51ac6aab63abea3e8de7adb9f599c9caba95aa3fa852e947fc88ed97ee50e0a0ec0d14d164f44c0115c10100000004ab5153516fdd679e0414edbd000000000005ac636a53512021f2040000000007006a0051536a52c73db2050000000005525265ac5369046e000000000003ab006a1ef7bd1e", "52656a", 0, 1360223035, "5a0a05e32ce4cd0558aabd5d79cd5fcbffa95c07137506e875a9afcba4bef5a2"], - ["d9611140036881b61e01627078512bc3378386e1d4761f959d480fdb9d9710bebddba2079d020000000763536aab5153ab819271b41e228f5b04daa1d4e72c8e1955230accd790640b81783cfc165116a9f535a74c000000000163ffffffffa2e7bb9a28e810624c251ff5ba6b0f07a356ac082048cf9f39ec036bba3d431a02000000076a000000ac65acffffffff01678a820000000000085363515153ac635100000000", "535353", 2, -82213851, "52b9e0778206af68998cbc4ebdaad5a9469e04d0a0a6cef251abfdbb74e2f031"], + ["d9611140036881b61e01627078512bc3378386e1d4761f959d480fdb9d9710bebddba2079d020000000763536aab5153ab819271b41e228f5b04daa1d4e72c8e1955230accd790640b81783cfc165116a9f535a74c000000000163ffffffffa2e7bb9a28e810624c251ff5ba6b0f07a356ac082048cf9f39ec036bba3d431a02000000076a000000ac65acffffffff01678a820000000000085363515153ac635100000000", "535353", 2, -82213851, "b90ebc230be0974c5eb856263342ee038b1f4257ae9d5b324e41ced41bc18b03"], ["98b3a0bf034233afdcf0df9d46ac65be84ef839e58ee9fa59f32daaa7d684b6bdac30081c60200000007636351acabababffffffffc71cf82ded4d1593e5825618dc1d5752ae30560ecfaa07f192731d68ea768d0f0100000006650052636563f3a2888deb5ddd161430177ce298242c1a86844619bc60ca2590d98243b5385bc52a5b8f00000000095365acacab520052ac50d4722801c3b8a60300000000035165517e563b65", "51", 1, -168940690, "b6b684e2d2ecec8a8dce4ed3fc1147f8b2e45732444222aa8f52d860c2a27a9d"], ["97be4f7702dc20b087a1fdd533c7de762a3f2867a8f439bddf0dcec9a374dfd0276f9c55cc0300000000cdfb1dbe6582499569127bda6ca4aaff02c132dc73e15dcd91d73da77e92a32a13d1a0ba0200000002ab51ffffffff048cfbe202000000000900516351515363ac535128ce0100000000076aac5365ab6aabc84e8302000000000863536a53ab6a6552f051230500000000066aac535153510848d813", "ac51", 0, 229541474, "e5da9a416ea883be1f8b8b2d178463633f19de3fa82ae25d44ffb531e35bdbc8"], - ["085b6e04040b5bff81e29b646f0ed4a45e05890a8d32780c49d09643e69cdccb5bd81357670100000001abffffffffa5c981fe758307648e783217e3b4349e31a557602225e237f62b636ec26df1a80300000004650052ab4792e1da2930cc90822a8d2a0a91ea343317bce5356b6aa8aae6c3956076aa33a5351a9c0300000004abac5265e27ddbcd472a2f13325cc6be40049d53f3e266ac082172f17f6df817db1936d9ff48c02b000000000152ffffffff021aa7670500000000085353635163ab51ac14d584000000000001aca4d136cc", "6a525300536352536a", 0, -1398925877, "41ecca1e8152ec55074f4c39f8f2a7204dda48e9ec1e7f99d5e7e4044d159d43"], + ["085b6e04040b5bff81e29b646f0ed4a45e05890a8d32780c49d09643e69cdccb5bd81357670100000001abffffffffa5c981fe758307648e783217e3b4349e31a557602225e237f62b636ec26df1a80300000004650052ab4792e1da2930cc90822a8d2a0a91ea343317bce5356b6aa8aae6c3956076aa33a5351a9c0300000004abac5265e27ddbcd472a2f13325cc6be40049d53f3e266ac082172f17f6df817db1936d9ff48c02b000000000152ffffffff021aa7670500000000085353635163ab51ac14d584000000000001aca4d136cc", "6a525300536352536a", 0, -1398925877, "efbf18ebc6c7f0a1a51455c983a7ba3ed95da532f68e1c8b693f0a895c0685ae"], ["eec32fff03c6a18b12cd7b60b7bdc2dd74a08977e53fdd756000af221228fe736bd9c42d870100000007005353ac515265ffffffff037929791a188e9980e8b9cc154ad1b0d05fb322932501698195ab5b219488fc02000000070063510065ab6a0bfc176aa7e84f771ea3d45a6b9c24887ceea715a0ff10ede63db8f089e97d927075b4f1000000000551abab63abffffffff02eb933c000000000000262c420000000000036563632549c2b6", "6352", 2, 1480445874, "ff8a4016dfdd918f53a45d3a1f62b12c407cd147d68ca5c92b7520e12c353ff5"], ["98ea7eac0313d9fb03573fb2b8e718180c70ce647bebcf49b97a8403837a2556cb8c9377f30000000004ac53ac65ffffffff8caac77a5e52f0d8213ef6ce998bedbb50cfdf108954771031c0e0cd2a78423900000000010066e99a44937ebb37015be3693761078ad5c73aa73ec623ac7300b45375cc8eef36087eb80000000007515352acac5100ffffffff0114a51b02000000000000000000", "6aacab", 0, 243527074, "bad77967f98941af4dd52a8517d5ad1e32307c0d511e15461e86465e1b8b5273"], ["3ab70f4604e8fc7f9de395ec3e4c3de0d560212e84a63f8d75333b604237aa52a10da17196000000000763526a6553ac63a25de6fd66563d71471716fe59087be0dde98e969e2b359282cf11f82f14b00f1c0ac70f02000000050052516aacdffed6bb6889a13e46956f4b8af20752f10185838fd4654e3191bf49579c961f5597c36c0100000005ac636363abc3a1785bae5b8a1b4be5d0cbfadc240b4f7acaa7dfed6a66e852835df5eb9ac3c553766801000000036a65630733b7530218569602000000000952006a6a6a51acab52777f06030000000007ac0063530052abc08267c9", "000000536aac0000", 1, 1919096509, "df1c87cf3ba70e754d19618a39fdbd2970def0c1bfc4576260cba5f025b87532"], ["bdb6b4d704af0b7234ced671c04ba57421aba7ead0a117d925d7ebd6ca078ec6e7b93eea6600000000026565ffffffff3270f5ad8f46495d69b9d71d4ab0238cbf86cc4908927fbb70a71fa3043108e6010000000700516a65655152ffffffff6085a0fdc03ae8567d0562c584e8bfe13a1bd1094c518690ebcb2b7c6ce5f04502000000095251530052536a53aba576a37f2c516aad9911f687fe83d0ae7983686b6269b4dd54701cb5ce9ec91f0e6828390300000000ffffffff04cc76cc020000000002656a01ffb702000000000253ab534610040000000009acab006565516a00521f55f5040000000000389dfee9", "6a525165", 0, 1336204763, "71c294523c48fd7747eebefbf3ca06e25db7b36bff6d95b41c522fecb264a919"], - ["54258edd017d22b274fbf0317555aaf11318affef5a5f0ae45a43d9ca4aa652c6e85f8a040010000000953ac65ab5251656500ffffffff03321d450000000000085265526a51526a529ede8b030000000003635151ce6065020000000001534c56ec1b", "acac", 0, 2094130012, "110d90fea9470dfe6c5048f45c3af5e8cc0cb77dd58fd13d338268e1c24b1ccc"], - ["ce0d322e04f0ffc7774218b251530a7b64ebefca55c90db3d0624c0ff4b3f03f918e8cf6f60300000003656500ffffffff9cce943872da8d8af29022d0b6321af5fefc004a281d07b598b95f6dcc07b1830200000007abab515351acab8d926410e69d76b7e584aad1470a97b14b9c879c8b43f9a9238e52a2c2fefc2001c56af8010000000400ab5253cd2cd1fe192ce3a93b5478af82fa250c27064df82ba416dfb0debf4f0eb307a746b6928901000000096500abacac6a0063514214524502947efc0200000000035251652c40340100000000096a6aab52000052656a5231c54c", "51", 2, -2090320538, "0322ca570446869ec7ec6ad66d9838cff95405002d474c0d3c17708c7ee039c6"], + ["54258edd017d22b274fbf0317555aaf11318affef5a5f0ae45a43d9ca4aa652c6e85f8a040010000000953ac65ab5251656500ffffffff03321d450000000000085265526a51526a529ede8b030000000003635151ce6065020000000001534c56ec1b", "acac", 0, 2094130012, "60fda3472cf68d0f692c7632daf5233fe7893d44d7c8291b09678175e624a92f"], + ["ce0d322e04f0ffc7774218b251530a7b64ebefca55c90db3d0624c0ff4b3f03f918e8cf6f60300000003656500ffffffff9cce943872da8d8af29022d0b6321af5fefc004a281d07b598b95f6dcc07b1830200000007abab515351acab8d926410e69d76b7e584aad1470a97b14b9c879c8b43f9a9238e52a2c2fefc2001c56af8010000000400ab5253cd2cd1fe192ce3a93b5478af82fa250c27064df82ba416dfb0debf4f0eb307a746b6928901000000096500abacac6a0063514214524502947efc0200000000035251652c40340100000000096a6aab52000052656a5231c54c", "51", 2, -2090320538, "2224c718246b33b1f22dbd456f16f9eedd3eafe964ffb98ef1f89ea04e4957e9"], ["47ac54940313430712ebb32004679d3a512242c2b33d549bf5bbc8420ec1fd0850ed50eb6d0300000009536aac6a65acacab51ffffffffb843e44266ce2462f92e6bff54316661048c8c17ecb092cb493b39bfca9117850000000001519ab348c05e74ebc3f67423724a3371dd99e3bceb4f098f8860148f48ad70000313c4c223000000000653006565656512c2d8dc033f3c97010000000002636aa993aa010000000006526365ab526ab7cf560300000000076a0065ac6a526500000000", "005352535300ab6a", 2, 59531991, "8b5b3d00d9c658f062fe6c5298e54b1fe4ed3a3eab2a87af4f3119edc47b1691"], - ["233cd90b043916fc41eb870c64543f0111fb31f3c486dc72457689dea58f75c16ae59e9eb2000000000500536a6a6affffffff9ae30de76be7cd57fb81220fce78d74a13b2dbcad4d023f3cadb3c9a0e45a3ce000000000965ac6353ac5165515130834512dfb293f87cb1879d8d1b20ebad9d7d3d5c3e399a291ce86a3b4d30e4e32368a9020000000453005165ffffffff26d84ae93eb58c81158c9b3c3cbc24a84614d731094f38d0eea8686dec02824d0300000005636a65abacf02c784001a0bd5d03000000000900655351ab65ac516a416ef503", "", 1, -295106477, "b79f31c289e95d9dadec48ebf88e27c1d920661e50d090e422957f90ff94cb6e"], - ["9200e26b03ff36bc4bf908143de5f97d4d02358db642bd5a8541e6ff709c420d1482d471b70000000008abab65536a636553ffffffff61ba6d15f5453b5079fb494af4c48de713a0c3e7f6454d7450074a2a80cb6d880300000007ac6a00ab5165515dfb7574fbce822892c2acb5d978188b1d65f969e4fe874b08db4c791d176113272a5cc10100000000ffffffff0420958d000000000009ac63516a0063516353dd885505000000000465ac00007b79e901000000000066d8bf010000000005525252006a00000000", "ac5152", 0, 2089531339, "89ec7fab7cfe7d8d7d96956613c49dc48bf295269cfb4ea44f7333d88c170e62"], + ["233cd90b043916fc41eb870c64543f0111fb31f3c486dc72457689dea58f75c16ae59e9eb2000000000500536a6a6affffffff9ae30de76be7cd57fb81220fce78d74a13b2dbcad4d023f3cadb3c9a0e45a3ce000000000965ac6353ac5165515130834512dfb293f87cb1879d8d1b20ebad9d7d3d5c3e399a291ce86a3b4d30e4e32368a9020000000453005165ffffffff26d84ae93eb58c81158c9b3c3cbc24a84614d731094f38d0eea8686dec02824d0300000005636a65abacf02c784001a0bd5d03000000000900655351ab65ac516a416ef503", "", 1, -295106477, "d121887095451c7c203bec756e4cd8b14d92a1cbbe6a6efc8e68be3aca6cddf4"], + ["9200e26b03ff36bc4bf908143de5f97d4d02358db642bd5a8541e6ff709c420d1482d471b70000000008abab65536a636553ffffffff61ba6d15f5453b5079fb494af4c48de713a0c3e7f6454d7450074a2a80cb6d880300000007ac6a00ab5165515dfb7574fbce822892c2acb5d978188b1d65f969e4fe874b08db4c791d176113272a5cc10100000000ffffffff0420958d000000000009ac63516a0063516353dd885505000000000465ac00007b79e901000000000066d8bf010000000005525252006a00000000", "ac5152", 0, 2089531339, "a6a74cf1f2cdc7fa3513dfc35feec3f67c256df574659355f4fea02591d70aac"], ["45f335ba01ce2073a8b0273884eb5b48f56df474fc3dff310d9706a8ac7202cf5ac188272103000000025363ffffffff049d859502000000000365ab6a8e98b1030000000002ac51f3a80603000000000752535151ac00000306e30300000000020051b58b2b3a", "", 0, 1899564574, "78e01310a228f645c23a2ad0acbb8d91cedff4ecdf7ca997662c6031eb702b11"], ["d8f652a6043b4faeada05e14b81756cd6920cfcf332e97f4086961d49232ad6ffb6bc6c097000000000453526563ffffffff1ea4d60e5e91193fbbc1a476c8785a79a4c11ec5e5d6c9950c668ceacfe07a15020000000352ab51fffffffffe029a374595c4edd382875a8dd3f20b9820abb3e93f877b622598d11d0b09e503000000095351000052ac515152ffffffff9d65fea491b979699ceb13caf2479cd42a354bd674ded3925e760758e85a756803000000046365acabffffffff0169001d00000000000651636a65656300000000", "ab0063630000ac", 3, 1050965951, "4cc85cbc2863ee7dbce15490d8ca2c5ded61998257b9eeaff968fe38e9f009ae"], ["718662be026e1dcf672869ac658fd0c87d6835cfbb34bd854c44e577d5708a7faecda96e260300000004526a636a489493073353b678549adc7640281b9cbcb225037f84007c57e55b874366bb7b0fa03bdc00000000095165ababac65ac00008ab7f2a802eaa53d000000000007acac516aac526ae92f380100000000056aac00536500000000", "ab00", 1, 43296088, "2d642ceee910abff0af2116af75b2e117ffb7469b2f19ad8fef08f558416d8f7"], - ["94083c840288d40a6983faca876d452f7c52a07de9268ad892e70a81e150d602a773c175ad03000000007ec3637d7e1103e2e7e0c61896cbbf8d7e205b2ecc93dd0d6d7527d39cdbf6d335789f660300000000ffffffff019e1f7b03000000000800ac0051acac0053539cb363", "", 1, -183614058, "a17b66d6bb427f42653d08207a22b02353dd19ccf2c7de6a9a3a2bdb7c49c9e7"], + ["94083c840288d40a6983faca876d452f7c52a07de9268ad892e70a81e150d602a773c175ad03000000007ec3637d7e1103e2e7e0c61896cbbf8d7e205b2ecc93dd0d6d7527d39cdbf6d335789f660300000000ffffffff019e1f7b03000000000800ac0051acac0053539cb363", "", 1, -183614058, "bf92930a9ad29d174dc6daddada2b60ec2edd523df067b36746787a52cfcc83f"], ["30e0d4d20493d0cd0e640b757c9c47a823120e012b3b64c9c1890f9a087ae4f2001ca22a61010000000152f8f05468303b8fcfaad1fb60534a08fe90daa79bff51675472528ebe1438b6f60e7f60c10100000009526aab6551ac510053ffffffffaaab73957ea2133e32329795221ed44548a0d3a54d1cf9c96827e7cffd1706df0200000009ab00526a005265526affffffffd19a6fe54352015bf170119742821696f64083b5f14fb5c7d1b5a721a3d7786801000000085265abababac53abffffffff020f39bd030000000004ab6aac52049f6c050000000004ab52516aba5b4c60", "6a6365516a6a655253", 0, -624256405, "8e221a6c4bf81ca0d8a0464562674dcd14a76a32a4b7baf99450dd9195d411e6"], ["f9c69d940276ec00f65f9fe08120fc89385d7350388508fd80f4a6ba2b5d4597a9e21c884f010000000663ab63ababab15473ae6d82c744c07fc876ecd53bd0f3018b2dbedad77d757d5bdf3811b23d294e8c0170000000001abafababe00157ede2050000000006ac6a5263635300000000", "ab53", 1, 606547088, "714d8b14699835b26b2f94c58b6ea4c53da3f7adf0c62ea9966b1e1758272c47"], - ["5c0ac112032d6885b7a9071d3c5f493aa16c610a4a57228b2491258c38de8302014276e8be030000000300ab6a17468315215262ad5c7393bb5e0c5a6429fd1911f78f6f72dafbbbb78f3149a5073e24740300000003ac5100ffffffff33c7a14a062bdea1be3c9c8e973f54ade53fe4a69dcb5ab019df5f3345050be00100000008ac63655163526aab428defc0033ec36203000000000765516365536a00ae55b2000000000002ab53f4c0080400000000095265516a536563536a00000000", "6a005151006a", 2, 272749594, "91082410630337a5d89ff19145097090f25d4a20bdd657b4b953927b2f62c73b"], - ["e3683329026720010b08d4bec0faa244f159ae10aa582252dd0f3f80046a4e145207d54d31000000000852acac52656aacac3aaf2a5017438ad6adfa3f9d05f53ebed9ceb1b10d809d507bcf75e0604254a8259fc29c020000000653526552ab51f926e52c04b44918030000000000f7679c0100000000090000525152005365539e3f48050000000009516500ab635363ab008396c905000000000253650591024f", "6a6365", 0, 908746924, "458aec3b5089a585b6bad9f99fd37a2b443dc5a2eefac2b7e8c5b06705efc9db"], + ["5c0ac112032d6885b7a9071d3c5f493aa16c610a4a57228b2491258c38de8302014276e8be030000000300ab6a17468315215262ad5c7393bb5e0c5a6429fd1911f78f6f72dafbbbb78f3149a5073e24740300000003ac5100ffffffff33c7a14a062bdea1be3c9c8e973f54ade53fe4a69dcb5ab019df5f3345050be00100000008ac63655163526aab428defc0033ec36203000000000765516365536a00ae55b2000000000002ab53f4c0080400000000095265516a536563536a00000000", "6a005151006a", 2, 272749594, "675deadc2168678fafb2f1bc06e15baf2618714a35da806ed56207046d06b128"], + ["e3683329026720010b08d4bec0faa244f159ae10aa582252dd0f3f80046a4e145207d54d31000000000852acac52656aacac3aaf2a5017438ad6adfa3f9d05f53ebed9ceb1b10d809d507bcf75e0604254a8259fc29c020000000653526552ab51f926e52c04b44918030000000000f7679c0100000000090000525152005365539e3f48050000000009516500ab635363ab008396c905000000000253650591024f", "6a6365", 0, 908746924, "2c890f48049bef3f5530134956fe02b85457cd422953f8d5d28946b7d046070e"], ["48c4afb204204209e1df6805f0697edaa42c0450bbbd767941fe125b9bc40614d63d757e2203000000066a5363005152dc8b6a605a6d1088e631af3c94b8164e36e61445e2c60130292d81dabd30d15f54b355a802000000036a6353ffffffff1d05dcec4f3dedcfd02c042ce5d230587ee92cb22b52b1e59863f3717df2362f0300000005536552ac52ffffffffd4d71c4f0a7d53ba47bb0289ca79b1e33d4c569c1e951dd611fc9c9c1ca8bc6c030000000865536a65ab51abacffffffff042f9aa905000000000753655153656351ab93d8010000000002655337440e0300000000005d4c690000000000015278587acb", "ab006565526a51", 0, 1502064227, "bbed77ff0f808aa8abd946ba9e7ec1ddb003a969fa223dee0af779643cb841a9"], ["00b20fd104dd59705b84d67441019fa26c4c3dec5fd3b50eca1aa549e750ef9ddb774dcabe000000000651ac656aac65ffffffff52d4246f2db568fc9eea143e4d260c698a319f0d0670f84c9c83341204fde48b0200000000ffffffffb8aeabb85d3bcbc67b132f1fd815b451ea12dcf7fc169c1bc2e2cf433eb6777a03000000086a51ac6aab6563acd510d209f413da2cf036a31b0def1e4dcd8115abf2e511afbcccb5ddf41d9702f28c52900100000006ac52ab6a0065ffffffff039c8276000000000008ab53655200656a52401561010000000003acab0082b7160100000000035100ab00000000", "535265", 1, -947367579, "3212c6d6dd8d9d3b2ac959dec11f4638ccde9be6ed5d36955769294e23343da0"], - ["455131860220abbaa72015519090a666faf137a0febce7edd49da1eada41feab1505a0028b02000000036365ab453ead4225724eb69beb590f2ec56a7693a608871e0ab0c34f5e96157f90e0a96148f3c502000000085251ab51535163acffffffff022d1249040000000009abac00acac6565630088b310040000000000e3920e59", "5152ab6a52ac5152", 0, 294375737, "c40fd7dfa72321ac79516502500478d09a35cc22cc264d652c7d18b14400b739"], - ["624d28cb02c8747915e9af2b13c79b417eb34d2fa2a73547897770ace08c6dd9de528848d3030000000651ab63abab533c69d3f9b75b6ef8ed2df50c2210fd0bf4e889c42477d58682f711cbaece1a626194bb85030000000765acab53ac5353ffffffff018cc280040000000009abacabac52636352ac6859409e", "ac51ac", 1, 1005144875, "919144aada50db8675b7f9a6849c9d263b86450570293a03c245bd1e3095e292"], - ["8f28471d02f7d41b2e70e9b4c804f2d90d23fb24d53426fa746bcdcfffea864925bdeabe3e0200000001acffffffff76d1d35d04db0e64d65810c808fe40168f8d1f2143902a1cc551034fd193be0e0000000001acffffffff048a5565000000000005005151516afafb610400000000045263ac53648bb30500000000086363516a6a5165513245de01000000000000000000", "6a0053510053", 1, -1525137460, "305fc8ff5dc04ebd9b6448b03c9a3d945a11567206c8d5214666b30ec6d0d6cc"], + ["455131860220abbaa72015519090a666faf137a0febce7edd49da1eada41feab1505a0028b02000000036365ab453ead4225724eb69beb590f2ec56a7693a608871e0ab0c34f5e96157f90e0a96148f3c502000000085251ab51535163acffffffff022d1249040000000009abac00acac6565630088b310040000000000e3920e59", "5152ab6a52ac5152", 0, 294375737, "ad3389ff518bcd715e3cfd98b14d6e7f3ce3f6853d80176b2d6a3a559fe8a3fc"], + ["624d28cb02c8747915e9af2b13c79b417eb34d2fa2a73547897770ace08c6dd9de528848d3030000000651ab63abab533c69d3f9b75b6ef8ed2df50c2210fd0bf4e889c42477d58682f711cbaece1a626194bb85030000000765acab53ac5353ffffffff018cc280040000000009abacabac52636352ac6859409e", "ac51ac", 1, 1005144875, "41281ab75c475ed58e76dc9b69a3e9f67d5fb33db9e342d27f74b5753b54bbb9"], + ["8f28471d02f7d41b2e70e9b4c804f2d90d23fb24d53426fa746bcdcfffea864925bdeabe3e0200000001acffffffff76d1d35d04db0e64d65810c808fe40168f8d1f2143902a1cc551034fd193be0e0000000001acffffffff048a5565000000000005005151516afafb610400000000045263ac53648bb30500000000086363516a6a5165513245de01000000000000000000", "6a0053510053", 1, -1525137460, "55078f8943ba047136bcd3ebad9743894d9c049d87cc511ce6ded395d7904d06"], ["10ec50d7046b8b40e4222a3c6449490ebe41513aad2eca7848284a08f3069f3352c2a9954f0000000009526aac656352acac53ffffffff0d979f236155aa972472d43ee6f8ce22a2d052c740f10b59211454ff22cb7fd00200000007acacacab63ab53ffffffffbbf97ebde8969b35725b2e240092a986a2cbfd58de48c4475fe077bdd493a20c010000000663ab5365ababffffffff4600722d33b8dba300d3ad037bcfc6038b1db8abfe8008a15a1de2da2264007302000000035351ac6dbdafaf020d0ccf04000000000663ab6a51ab6ae06e5e0200000000036aabab00000000", "", 0, -1658960232, "2420dd722e229eccafae8508e7b8d75c6920bfdb3b5bac7cb8e23419480637c2"], ["fef98b7101bf99277b08a6eff17d08f3fcb862e20e13138a77d66fba55d54f26304143e5360100000006515365abab00ffffffff04265965030000000004655252ace2c775010000000001002b23b4040000000007516a5153ab53ac456a7a00000000000753ab525251acacba521291", "526aacacab00abab53", 0, -1614097109, "4370d05c07e231d6515c7e454a4e401000b99329d22ed7def323976fa1d2eeb5"], ["34a2b8830253661b373b519546552a2c3bff7414ea0060df183b1052683d78d8f54e842442000000000152ffffffffd961a8e34cf374151058dfcddc86509b33832bc57267c63489f69ff01199697c0300000002abacba856cfb01b17c2f050000000008515365ac53ab000000000000", "5263ab656a", 1, -2104480987, "2f9993e0a84a6ca560d6d1cc2b63ffe7fd71236d9cfe7d809491cef62bbfad84"], - ["43559290038f32fda86580dd8a4bc4422db88dd22a626b8bd4f10f1c9dd325c8dc49bf479f01000000026351ffffffff401339530e1ed3ffe996578a17c3ec9d6fccb0723dd63e7b3f39e2c44b976b7b0300000006ab6a65656a51ffffffff6fb9ba041c96b886482009f56c09c22e7b0d33091f2ac5418d05708951816ce7000000000551ac525100ffffffff020921e40500000000035365533986f40500000000016a00000000", "52ac51", 0, 1769771809, "02040283ef2291d8e1f79bb71bdabe7c1546c40d7ed615c375643000a8b9600d"], - ["6878a6bd02e7e1c8082d5e3ee1b746cfebfac9e8b97e61caa9e0759d8a8ecb3743e36a30de0100000002ab532a911b0f12b73e0071f5d50b6bdaf783f4b9a6ce90ec0cad9eecca27d5abae188241ddec0200000001651c7758d803f7457b0500000000036551515f4e90000000000001007022080200000000035365acc86b6946", "6351ab", 0, -1929374995, "f24be499c58295f3a07f5f1c6e5084496ae160450bd61fdb2934e615289448f1"], + ["43559290038f32fda86580dd8a4bc4422db88dd22a626b8bd4f10f1c9dd325c8dc49bf479f01000000026351ffffffff401339530e1ed3ffe996578a17c3ec9d6fccb0723dd63e7b3f39e2c44b976b7b0300000006ab6a65656a51ffffffff6fb9ba041c96b886482009f56c09c22e7b0d33091f2ac5418d05708951816ce7000000000551ac525100ffffffff020921e40500000000035365533986f40500000000016a00000000", "52ac51", 0, 1769771809, "ad6776049f0d4908820be7b68bbce40dc1e346856a92c1b04e0c96e3f93b1a34"], + ["6878a6bd02e7e1c8082d5e3ee1b746cfebfac9e8b97e61caa9e0759d8a8ecb3743e36a30de0100000002ab532a911b0f12b73e0071f5d50b6bdaf783f4b9a6ce90ec0cad9eecca27d5abae188241ddec0200000001651c7758d803f7457b0500000000036551515f4e90000000000001007022080200000000035365acc86b6946", "6351ab", 0, -1929374995, "4b49a564a2db5b79ecd07ac7b62c088bd5bf929cf70da640525698cecd1db4fb"], ["35b6fc06047ebad04783a5167ab5fc9878a00c4eb5e7d70ef297c33d5abd5137a2dea9912402000000036aacacffffffff21dc291763419a584bdb3ed4f6f8c60b218aaa5b99784e4ba8acfec04993e50c03000000046a00ac6affffffff69e04d77e4b662a82db71a68dd72ef0af48ca5bebdcb40f5edf0caf591bb41020200000000b5db78a16d93f5f24d7d932f93a29bb4b784febd0cbb1943f90216dc80bba15a0567684b000000000853ab52ab5100006a1be2208a02f6bdc103000000000265ab8550ea04000000000365636a00000000", "", 0, -1114114836, "1c8655969b241e717b841526f87e6bd68b2329905ba3fc9e9f72526c0b3ea20c"], ["bebb90c302bf91fd4501d33555a5fc5f2e1be281d9b7743680979b65c3c919108cc2f517510100000003abab00ffffffff969c30053f1276550532d0aa33cfe80ca63758cd215b740448a9c08a84826f3303000000056565ab5153ffffffff04bf6f2a04000000000565ab5265ab903e760100000000026a6a7103fa020000000006526553525365b05b2c000000000006ab000000535300000000", "51510053ab63635153", 1, 1081291172, "94338cd47a4639be30a71e21a7103cee4c99ef7297e0edd56aaf57a068b004de"], - ["af48319f031b4eeb4319714a285f44244f283cbff30dcb9275b06f2348ccd0d7f015b54f8500000000066363ac65ac6affffffff2560a9817ebbc738ad01d0c9b9cf657b8f9179b1a7f073eb0b67517409d108180200000005ac6365ab52ffffffff0bdd67cd4ecae96249a2e2a96db1490ee645f042fd9d5579de945e22b799f4d003000000086552ab515153ab00cf187c8202e51abf0300000000066552006a00abadf37d000000000004ac6a535100000000", "63ab65", 1, -1855554446, "60caf46a7625f303c04706cec515a44b68ec319ee92273acb566cca4f66861c1"], - ["f35befbc03faf8c25cc4bc0b92f6239f477e663b44b83065c9cb7cf231243032cf367ce3130000000005ab65526a517c4c334149a9c9edc39e29276a4b3ffbbab337de7908ea6f88af331228bd90086a6900ba020000000151279d19950d2fe81979b72ce3a33c6d82ebb92f9a2e164b6471ac857f3bbd3c0ea213b542010000000953ab51635363520065052657c20300a9ba04000000000452636a6a0516ea020000000008535253656365ababcfdd3f01000000000865ac516aac00530000000000", "", 2, -99793521, "c834a5485e68dc13edb6c79948784712122440d7fa5bbaa5cd2fc3d4dac8185d"], + ["af48319f031b4eeb4319714a285f44244f283cbff30dcb9275b06f2348ccd0d7f015b54f8500000000066363ac65ac6affffffff2560a9817ebbc738ad01d0c9b9cf657b8f9179b1a7f073eb0b67517409d108180200000005ac6365ab52ffffffff0bdd67cd4ecae96249a2e2a96db1490ee645f042fd9d5579de945e22b799f4d003000000086552ab515153ab00cf187c8202e51abf0300000000066552006a00abadf37d000000000004ac6a535100000000", "63ab65", 1, -1855554446, "780826b944f775f187052d2b953f6e122bedbbff06f86bf9424543ebc8ea622d"], + ["f35befbc03faf8c25cc4bc0b92f6239f477e663b44b83065c9cb7cf231243032cf367ce3130000000005ab65526a517c4c334149a9c9edc39e29276a4b3ffbbab337de7908ea6f88af331228bd90086a6900ba020000000151279d19950d2fe81979b72ce3a33c6d82ebb92f9a2e164b6471ac857f3bbd3c0ea213b542010000000953ab51635363520065052657c20300a9ba04000000000452636a6a0516ea020000000008535253656365ababcfdd3f01000000000865ac516aac00530000000000", "", 2, -99793521, "9809bf12aa93abdde985e3ce1a62d427ba1c654b4a66561b7c112822472afae0"], ["d3da18520216601acf885414538ce2fb4d910997eeb91582cac42eb6982c9381589587794f0300000000fffffffff1b1c9880356852e10cf41c02e928748dd8fae2e988be4e1c4cb32d0bfaea6f7000000000465ab6aabffffffff02fb0d69050000000002ababeda8580500000000085163526565ac52522b913c95", "ac", 1, -1247973017, "99b32b5679d91e0f9cdd6737afeb07459806e5acd7630c6a3b9ab5d550d0c003"], - ["8218eb740229c695c252e3630fc6257c42624f974bc856b7af8208df643a6c520ef681bfd00000000002510066f30f270a09b2b420e274c14d07430008e7886ec621ba45665057120afce58befca96010300000004525153ab84c380a9015d96100000000000076a5300acac526500000000", "ac005263", 0, -1855679695, "5071f8acf96aea41c7518bd1b5b6bbe16258b529df0c03f9e374b83c66b742c6"], - ["1123e7010240310013c74e5def60d8e14dd67aedff5a57d07a24abc84d933483431b8cf8ea0300000003530051fc6775ff1a23c627a2e605dd2560e84e27f4208300071e90f4589e762ad9c9fe8d0da95e020000000465655200ffffffff04251598030000000004ab65ab639d28d90400000000096563636aacac525153474df801000000000851525165ac51006a75e23b040000000000e5bd3a4a", "6363636565", 0, -467124448, "9cb0dd04e9fe287b112e94a1647590d27e8b164ca13c4fe70c610fd13f82c2fd"], + ["8218eb740229c695c252e3630fc6257c42624f974bc856b7af8208df643a6c520ef681bfd00000000002510066f30f270a09b2b420e274c14d07430008e7886ec621ba45665057120afce58befca96010300000004525153ab84c380a9015d96100000000000076a5300acac526500000000", "ac005263", 0, -1855679695, "97cb9f71049354f7ccc617355d8802fcf104afb81939dfab2c049cda11b2d2cb"], + ["1123e7010240310013c74e5def60d8e14dd67aedff5a57d07a24abc84d933483431b8cf8ea0300000003530051fc6775ff1a23c627a2e605dd2560e84e27f4208300071e90f4589e762ad9c9fe8d0da95e020000000465655200ffffffff04251598030000000004ab65ab639d28d90400000000096563636aacac525153474df801000000000851525165ac51006a75e23b040000000000e5bd3a4a", "6363636565", 0, -467124448, "3a71333970188006f4da878d97d396df5f80ece7dd9d8d3c3dbef5b1cdc15016"], ["fd92fe1003083c5179f97e77bf7d71975788138147adbdb283306802e261c0aee080fa22630200000000860c643ba9a1816b9badf36077b4554d11720e284e395a1121bc45279e148b2064c65e49020000000651ab6a53636a2c713088d20f4bc4001264d972cce05b9fe004dc33376ad24d0d013e417b91a5f1b6734e000000000100ffffffff02e3064c0500000000066552006a5165b86e8705000000000665ab65ab53522052eadb", "00ab53525265", 0, 776203277, "47207b48777727532f62e09afcd4104ea6687e723c7657c30504fa2081331cc8"], ["d1b6a703038f14d41fcc5cc45455faa135a5322be4bf0f5cbcd526578fc270a236cacb853f0200000001abffffffff135aeff902fa38f202ccf5bd34437ff89c9dc57a028b62447a0a38579383e8ef0000000000ffffffffadf398d2c818d0b90bc474f540c3618a4a643482eeab73d36101987e2ec0335900000000004bd3323504e69fc10000000000055151535251790ada02000000000563ab6aab521337a704000000000963ac63abacac52656a1e9862010000000007656500ac51ab6a8f4ee672", "ab5251656565ac63", 2, 82008394, "b8f3d255549909c07588ecba10a02e55a2d6f2206d831af9da1a7dae64cfbc8b"], ["81dadaa7011556683db3fe95262f4fdb20391b7e75b7ffcee51b176af64d83c06f85545d620200000005ab5151ab52ffffffff044805ef0300000000065353516352639702c802000000000900516351515252ab5270db08040000000009ac516aab526553abac4aabc90500000000096365ab0052636a525100000000", "6565ab6a5152", 0, -2126294159, "ad01ec9d6dbae325ec3a8e1fd98e2d03b1188378210efef093dd8b0b0ef3f19d"], ["3b937e05032b8895d2f4945cb7e3679be2fbd15311e2414f4184706dbfc0558cf7de7b4d000000000001638b91a12668a3c3ce349788c961c26aa893c862f1e630f18d80e7843686b6e1e6fc396310000000000852635353ab65ac51eeb09dd1c9605391258ee6f74b9ae17b5e8c2ef010dc721c5433dcdc6e93a1593e3b6d1700000000085365ac6553526351ffffffff0308b18e04000000000253acb6dd00040000000008536aac5153ac516ab0a88201000000000500ac006500804e3ff2", "", 0, 416167343, "595a3c02254564634e8085283ec4ea7c23808da97ce9c5da7aecd7b553e7fd7f"], ["a48f27ca047997470da74c8ee086ddad82f36d9c22e790bd6f8603ee6e27ad4d3174ea875403000000095153ac636aab6aacabffffffffefc936294e468d2c9a99e09909ba599978a8c0891ad47dc00ba424761627cef202000000056a51630053ffffffff304cae7ed2d3dbb4f2fbd679da442aed06221ffda9aee460a28ceec5a9399f4e0200000000f5bddf82c9c25fc29c5729274c1ff0b43934303e5f595ce86316fc66ad263b96ca46ab8d0100000003536500d7cf226b0146b00c04000000000200ac5c2014ce", "515100636563", 0, 1991799059, "9c051a7092fe17fa62b1720bc2c4cb2ffc1527d9fb0b006d2e142bb8fe07bf3c"], - ["180cd53101c5074cf0b7f089d139e837fe49932791f73fa2342bd823c6df6a2f72fe6dba1303000000076a6a63ac53acabffffffff03853bc1020000000007ac526a6a6a6a003c4a8903000000000453515163a0fbbd030000000005ab656a5253253d64cf", "ac65", 0, -1548453970, "4d8efb3b99b9064d2f6be33b194a903ffabb9d0e7baa97a48fcec038072aac06"], - ["c21ec8b60376c47e057f2c71caa90269888d0ffd5c46a471649144a920d0b409e56f190b700000000008acac6a526a536365ffffffff5d315d9da8bf643a9ba11299450b1f87272e6030fdb0c8adc04e6c1bfc87de9a0000000000ea43a9a142e5830c96b0ce827663af36b23b0277244658f8f606e95384574b91750b8e940000000007516a63ac0063acffffffff023c61be0400000000055165ab5263313cc8020000000006006a53526551ed8c3d56", "6a", 1, 1160627414, "a638cc17fd91f4b1e77877e8d82448c84b2a4e100df1373f779de7ad32695112"], + ["180cd53101c5074cf0b7f089d139e837fe49932791f73fa2342bd823c6df6a2f72fe6dba1303000000076a6a63ac53acabffffffff03853bc1020000000007ac526a6a6a6a003c4a8903000000000453515163a0fbbd030000000005ab656a5253253d64cf", "ac65", 0, -1548453970, "84025532e557b91166bdf568abc3ce8c3c86d6deb0af1fa50df7d965c9894c6f"], + ["c21ec8b60376c47e057f2c71caa90269888d0ffd5c46a471649144a920d0b409e56f190b700000000008acac6a526a536365ffffffff5d315d9da8bf643a9ba11299450b1f87272e6030fdb0c8adc04e6c1bfc87de9a0000000000ea43a9a142e5830c96b0ce827663af36b23b0277244658f8f606e95384574b91750b8e940000000007516a63ac0063acffffffff023c61be0400000000055165ab5263313cc8020000000006006a53526551ed8c3d56", "6a", 1, 1160627414, "06c15fe47ad322c6c0f84826eb10ff267ae7acd1ca023147586478b689e8bf74"], ["128cd90f04b66a4cbc78bf48748f6eec0f08d5193ee8d0a6f2e8d3e5f138ed12c2c87d01a301000000085200ab6aac00ab00ffffffff09fc88bb1851e3dfb3d30179c38e15aeb1b39929c7c74f6acd071994ed4806490300000000e7fc5ea12ec56f56c0d758ecf4bb88aa95f3b08176b336db3b9bec2f6e27336dce28adbe030000000400530051fffffffffd6ff1adcf1fbe0d883451ee46904f1b7e8820243d395559b2d4ee8190a6e891000000000080fb1ae702f85b400000000000035200ab8d9651010000000006ab6a52536aab00000000", "ab", 1, 1667598199, "c10ccc9db8a92d7d4b133a2980782dab9d9d1d633d0dde9f9612ada57771fd89"], ["da9695a403493d3511c10e1fe1286f954db0366b7667c91ef18ae4578056c1bf752114ac5901000000035351519788d91dd1f9c62dc005d80ea54eb13f7131ca5aace3d5d29f9b58ccc5fbc9a27e779950010000000453ac6a00ffffffffe2556ff29ebe83eb42a32c7a8d93bc598043578f491b5935805a33608538845a030000000252ab65d21b3b018f26c4030000000006acab51535352e1cbcb10", "006565ab52", 2, -1550927794, "0ca673a1ee66f9625ceb9ab278ebef772c113c188112b02824570c17fdf48194"], - ["b240517501334021240427adb0b413433641555424f6d24647211e3e6bfbb22a8045cbda2f000000000071bac8630112717802000000000000000000", "6a5165abac52656551", 0, 1790414254, "2c8be597620d95abd88f9c1cf4967c1ae3ca2309f3afec8928058c9598660e9e"], + ["b240517501334021240427adb0b413433641555424f6d24647211e3e6bfbb22a8045cbda2f000000000071bac8630112717802000000000000000000", "6a5165abac52656551", 0, 1790414254, "b23bd3e4115aaf084d9642315df6d27b8b56cc5ac5987323cfd76f55695b1281"], ["96bac43903044a199b4b3efeeec5d196ee23fb05495541fa2cd6fb6405a9432d1723363660010000000151ffffffffe6ce2b66ce1488918a3e880bebb0e750123f007c7bcbac8fcd67ce75cb6fbae80300000000ffffffff9c0955aa07f506455834895c0c56be5a095398f47c62a3d431fe125b161d666a0200000005520000abac7ffdbc540216f2f004000000000165a26dce010000000001ab00000000", "5151ab656a656a6a63", 0, -707123065, "26b22e18d5d9081fde9631594a4f7c49069ed2e429f3d08caf9d834f685ccab2"], ["b8fd394001ed255f49ad491fecc990b7f38688e9c837ccbc7714ddbbf5404f42524e68c18f0000000007ab6353535363ab081e15ee02706f7d050000000008515200535351526364c7ec040000000005636a53acac9206cbe1", "655352ac", 0, -1251578838, "8e0697d8cd8a9ccea837fd798cc6c5ed29f6fbd1892ee9bcb6c944772778af19"], - ["e42a76740264677829e30ed610864160c7f97232c16528fe5610fc08814b21c34eefcea69d010000000653006a6a0052ffffffff647046cf44f217d040e6a8ff3f295312ab4dd5a0df231c66968ad1c6d8f4428000000000025352ffffffff0199a7f900000000000000000000", "655263006a005163", 1, 1122505713, "7cda43f1ff9191c646c56a4e29b1a8c6cb3f7b331da6883ef2f0480a515d0861"], - ["0f034f32027a8e094119443aa9cfe11737c6d7dda9a52b839bc073dcc0235b847b28e0fab60200000006ac53ac536a63eee63447dfdad80476994b68706e916df1bd9d7cb4f3a4f6b14369de84564bea2e8688bd030000000565636a65acf8434663020b35fe01000000000800abab655163acabb3d6a103000000000353acab345eeda0", "526a51ac63ab51", 1, 66020215, "4435e62ff6531ac73529aac9cf878a7219e0b6e6cac79af8487c5355d1ad6d43"], + ["e42a76740264677829e30ed610864160c7f97232c16528fe5610fc08814b21c34eefcea69d010000000653006a6a0052ffffffff647046cf44f217d040e6a8ff3f295312ab4dd5a0df231c66968ad1c6d8f4428000000000025352ffffffff0199a7f900000000000000000000", "655263006a005163", 1, 1122505713, "bdb0e9056ca128f43908960d90d6bd02454ceb06ff62715061e660d6af4ef0b1"], + ["0f034f32027a8e094119443aa9cfe11737c6d7dda9a52b839bc073dcc0235b847b28e0fab60200000006ac53ac536a63eee63447dfdad80476994b68706e916df1bd9d7cb4f3a4f6b14369de84564bea2e8688bd030000000565636a65acf8434663020b35fe01000000000800abab655163acabb3d6a103000000000353acab345eeda0", "526a51ac63ab51", 1, 66020215, "732fd659980e31b22359ab4c63fa655da0a51c6414c31ec46ec1569ddc890674"], ["a2dfa4690214c1ab25331815a5128f143219de51a47abdc7ce2d367e683eeb93960a31af9f010000000363636affffffff8be0628abb1861b078fcc19c236bc4cc726fa49068b88ad170adb2a97862e7460200000004ac655363ffffffff0441f11103000000000153dbab0c000000000009ab53ac5365526aab63abbb95050000000004ab52516a29a029040000000003ac526a00000000", "6a52ac63", 1, -1302210567, "913060c7454e6c80f5ba3835454b54db2188e37dc4ce72a16b37d11a430b3d23"], ["9dbc591f04521670af83fb3bb591c5d4da99206f5d38e020289f7db95414390dddbbeb56680100000004ac5100acffffffffb6a40b5e29d5e459f8e72d39f800089529f0889006cad3d734011991da8ef09d0100000009526a5100acab536a515fc427436df97cc51dc8497642ffc868857ee245314d28b356bd70adba671bd6071301fc0000000000ffffffff487efde2f620566a9b017b2e6e6d42525e4070f73a602f85c6dfd58304518db30000000005516353006a8d8090180244904a0200000000046a65656ab1e9c203000000000451ab63aba06a5449", "", 0, -1414953913, "bae189eb3d64aedbc28a6c28f6c0ccbd58472caaf0cf45a5aabae3e031dd1fea"], - ["1345fb2c04bb21a35ae33a3f9f295bece34650308a9d8984a989dfe4c977790b0c21ff9a7f0000000006ac52ac6a0053ffffffff7baee9e8717d81d375a43b691e91579be53875350dfe23ba0058ea950029fcb7020000000753ab53ab63ab52ffffffff684b6b3828dfb4c8a92043b49b8cb15dd3a7c98b978da1d314dce5b9570dadd202000000086353ab6a5200ac63d1a8647bf667ceb2eae7ec75569ca249fbfd5d1b582acfbd7e1fcf5886121fca699c011d0100000003ac006affffffff049b1eb00300000000001e46dc0100000000080065ab6a6a630065ca95b40300000000030051520c8499010000000006ab6aac526a6500000000", "53526aac636300", 2, 1809978100, "cfeaa36790bc398783d4ca45e6354e1ea52ee74e005df7f9ebd10a680e9607bf"], - ["7d75dc8f011e5f9f7313ba6aedef8dbe10d0a471aca88bbfc0c4a448ce424a2c5580cda1560300000003ab5152ffffffff01997f8e0200000000096552ac6a65656563530d93bbcc", "00656a6563", 0, 1414485913, "ec91eda1149f75bffb97612569a78855498c5d5386d473752a2c81454f297fa7"], - ["1459179504b69f01c066e8ade5e124c748ae5652566b34ed673eea38568c483a5a4c4836ca0100000008ac5352006563656affffffff5d4e037880ab1975ce95ea378d2874dcd49d5e01e1cdbfae3343a01f383fa35800000000095251ac52ac6aac6500ffffffff7de3ae7d97373b7f2aeb4c55137b5e947b2d5fb325e892530cb589bc4f92abd503000000086563ac53ab520052ffffffffb4db36a32d6e543ef49f4bafde46053cb85b2a6c4f0e19fa0860d9083901a1190300000003ab51531bbcfe5504a6dbda040000000008536a5365abac6500d660c80300000000096565abab6a53536a6a54e84e010000000003acac52df2ccf0500000000025351220c857e", "", 2, 1879181631, "3aad18a209fab8db44954eb55fd3cc7689b5ec9c77373a4d5f4dae8f7ae58d14"], + ["1345fb2c04bb21a35ae33a3f9f295bece34650308a9d8984a989dfe4c977790b0c21ff9a7f0000000006ac52ac6a0053ffffffff7baee9e8717d81d375a43b691e91579be53875350dfe23ba0058ea950029fcb7020000000753ab53ab63ab52ffffffff684b6b3828dfb4c8a92043b49b8cb15dd3a7c98b978da1d314dce5b9570dadd202000000086353ab6a5200ac63d1a8647bf667ceb2eae7ec75569ca249fbfd5d1b582acfbd7e1fcf5886121fca699c011d0100000003ac006affffffff049b1eb00300000000001e46dc0100000000080065ab6a6a630065ca95b40300000000030051520c8499010000000006ab6aac526a6500000000", "53526aac636300", 2, 1809978100, "fa499aca6fc05e9434e72289170d30a840cc7825eab6d6e06cec45bbab843278"], + ["7d75dc8f011e5f9f7313ba6aedef8dbe10d0a471aca88bbfc0c4a448ce424a2c5580cda1560300000003ab5152ffffffff01997f8e0200000000096552ac6a65656563530d93bbcc", "00656a6563", 0, 1414485913, "6b4aac21ee91ac57f8462a01bcb0d10cc87da9c852ea0841f3040c8dbf2c2e85"], + ["1459179504b69f01c066e8ade5e124c748ae5652566b34ed673eea38568c483a5a4c4836ca0100000008ac5352006563656affffffff5d4e037880ab1975ce95ea378d2874dcd49d5e01e1cdbfae3343a01f383fa35800000000095251ac52ac6aac6500ffffffff7de3ae7d97373b7f2aeb4c55137b5e947b2d5fb325e892530cb589bc4f92abd503000000086563ac53ab520052ffffffffb4db36a32d6e543ef49f4bafde46053cb85b2a6c4f0e19fa0860d9083901a1190300000003ab51531bbcfe5504a6dbda040000000008536a5365abac6500d660c80300000000096565abab6a53536a6a54e84e010000000003acac52df2ccf0500000000025351220c857e", "", 2, 1879181631, "1a31593e5339f2cdf083a8a358e0752516972bff7269c3b5c8685dc03dee30fa"], ["d98b777f04b1b3f4de16b07a05c31d79965579d0edda05600c118908d7cf642c9cd670093f020000000953005351ac65ab5363a268caad6733b7d1718008997f249e1375eb3ab9fe68ab0fe170d8e745ea24f54ce67f9b00000000066500516a5151ffffffff7ef8040dfcc86a0651f5907e8bfd1017c940f51cf8d57e3d3fe78d57e40b1e610200000003535263ffffffff39846cfed4babc098ff465256ba3820c30d710581316afcb67cd31c623b703360300000001acffffffff03d405120100000000056300006a5201a73d050000000004ab636a6a294c8c000000000006ac65536553ac00000000", "63525351abac", 1, 2018694761, "86970af23c89b72a4f9d6281e46b9ef5220816bed71ebf1ae20df53f38fe16ff"], ["cabb1b06045a895e6dcfc0c1e971e94130c46feace286759f69a16d298c8b0f6fd0afef8f20300000004ac006352ffffffffa299f5edac903072bfb7d29b663c1dd1345c2a33546a508ba5cf17aab911234602000000056a65515365ffffffff89a20dc2ee0524b361231092a070ace03343b162e7162479c96b757739c8394a0300000002abab92ec524daf73fabee63f95c1b79fa8b84e92d0e8bac57295e1d0adc55dc7af5534ebea410200000001534d70e79b04674f6f00000000000600abacab53517d60cc0200000000035265ab96c51d040000000004ac6300ac62a787050000000008006a516563ab63639e2e7ff7", "6551ac6351ac", 3, 1942663262, "d0c4a780e4e0bc22e2f231e23f01c9d536b09f6e5be51c123d218e906ec518be"], ["8b96d7a30132f6005b5bd33ea82aa325e2bcb441f46f63b5fca159ac7094499f380f6b7e2e00000000076aacabac6300acffffffff0158056700000000000465005100c319e6d0", "52006a", 0, -1100733473, "fb4bd26a91b5cf225dd3f170eb09bad0eac314bc1e74503cc2a3f376833f183e"], - ["112191b7013cfbe18a175eaf09af7a43cbac2c396f3695bbe050e1e5f4250603056d60910e02000000001c8a5bba03738a22010000000005525352656a77a149010000000002510003b52302000000000351ac52722be8e6", "65ac6565", 0, -1847972737, "8e795aeef18f510d117dfa2b9f4a2bd2e2847a343205276cedd2ba14548fd63f"], - ["ce6e1a9e04b4c746318424705ea69517e5e0343357d131ad55d071562d0b6ebfedafd6cb840100000003656553ffffffff67bd2fa78e2f52d9f8900c58b84c27ef9d7679f67a0a6f78645ce61b883fb8de000000000100d699a56b9861d99be2838e8504884af4d30b909b1911639dd0c5ad47c557a0773155d4d303000000046a5151abffffffff9fdb84b77c326921a8266854f7bbd5a71305b54385e747fe41af8a397e78b7fa010000000863acac6a51ab00ac0d2e9b9d049b8173010000000007ac53526a650063ba9b7e010000000008526a00525263acac0ab3fd030000000000ea8a0303000000000200aca61a97b9", "", 1, -1276952681, "b6ed4a3721be3c3c7305a5128c9d418efa58e419580cec0d83f133a93e3a22c5"], - ["a7721d94021652d90c79aaf5022d98219337d50f836382403ed313adb1116ba507ac28b0b0010000000551ac6300ab89e6d64a7aa81fb9595368f04d1b36d7020e7adf5807535c80d015f994cce29554fe869b01000000065353ab636500ffffffff024944c90100000000046300635369df9f01000000000000000000", "656a536551ab", 0, -1740151687, "935892c6f02948f3b08bcd463b6acb769b02c1912be4450126768b055e8f183a"], - ["2f7353dd02e395b0a4d16da0f7472db618857cd3de5b9e2789232952a9b154d249102245fd030000000151617fd88f103280b85b0a198198e438e7cab1a4c92ba58409709997cc7a65a619eb9eec3c0200000003636aabffffffff0397481c0200000000045300636a0dc97803000000000009d389030000000003ac6a53134007bb", "0000536552526a", 0, -1912746174, "30c4cd4bd6b291f7e9489cc4b4440a083f93a7664ea1f93e77a9597dab8ded9c"], + ["112191b7013cfbe18a175eaf09af7a43cbac2c396f3695bbe050e1e5f4250603056d60910e02000000001c8a5bba03738a22010000000005525352656a77a149010000000002510003b52302000000000351ac52722be8e6", "65ac6565", 0, -1847972737, "d11478faaec60eb23bdc655e64abcde03975db567b8acadb84819d7f98cfd8d2"], + ["ce6e1a9e04b4c746318424705ea69517e5e0343357d131ad55d071562d0b6ebfedafd6cb840100000003656553ffffffff67bd2fa78e2f52d9f8900c58b84c27ef9d7679f67a0a6f78645ce61b883fb8de000000000100d699a56b9861d99be2838e8504884af4d30b909b1911639dd0c5ad47c557a0773155d4d303000000046a5151abffffffff9fdb84b77c326921a8266854f7bbd5a71305b54385e747fe41af8a397e78b7fa010000000863acac6a51ab00ac0d2e9b9d049b8173010000000007ac53526a650063ba9b7e010000000008526a00525263acac0ab3fd030000000000ea8a0303000000000200aca61a97b9", "", 1, -1276952681, "c9c45c6e38b772bed6aff62747b7bbb49ec621e5e01aa175bf3e6e23abc3b206"], + ["a7721d94021652d90c79aaf5022d98219337d50f836382403ed313adb1116ba507ac28b0b0010000000551ac6300ab89e6d64a7aa81fb9595368f04d1b36d7020e7adf5807535c80d015f994cce29554fe869b01000000065353ab636500ffffffff024944c90100000000046300635369df9f01000000000000000000", "656a536551ab", 0, -1740151687, "4ea55da32cd3766a701f91acfd1ed5f0ad2a2197cb204996b4034cb2b136e41e"], + ["2f7353dd02e395b0a4d16da0f7472db618857cd3de5b9e2789232952a9b154d249102245fd030000000151617fd88f103280b85b0a198198e438e7cab1a4c92ba58409709997cc7a65a619eb9eec3c0200000003636aabffffffff0397481c0200000000045300636a0dc97803000000000009d389030000000003ac6a53134007bb", "0000536552526a", 0, -1912746174, "c8944902de3349e81170308e129d4e71dba3f2ffbbfc1b0cc84e94d620e1cf83"], ["7d95473604fd5267d0e1bb8c9b8be06d7e83ff18ad597e7a568a0aa033fa5b4e1e2b6f1007020000000465006a6affffffffaee008503bfc5708bd557c7e78d2eab4878216a9f19daa87555f175490c40aaf000000000263abffffffffabd74f0cff6e7ceb9acc2ee25e65af1abcebb50c08306e6c78fa8171c37613dd010000000552acacababffffffff54a3069393f7930fa1b331cdff0cb945ec21c11d4605d8eedba1d3e094c6ae1f01000000026300ffffffff0182edeb050000000009526353ab5153530065a247e8cd", "51516aab00", 2, -426210430, "2707ca714af09494bb4cf0794abe33c6cba5f29891d619e76070269d1fa8e690"], - ["221d4718023d9ca9fe1af178dbfce02b2b369bf823ea3f43f00891b7fef98e215c06b94fdd000000000951005153ab000051acffffffffb1c7ad1c64b7441bf5e70cd0f6eb4ec96821d67fc4997d9e6dfdceadecd36dde01000000070051536a635153ffffffff04e883cd00000000000851ab536553ab0052bbb2f70400000000002f1b2e03000000000165259fcb00000000000010dbde99", "ab", 1, 665721280, "4abce77432a86dfe608e7c1646c18b5253a373392ff962e288e3ab96bba1ba1d"], - ["6f66c0b3013e6ae6aabae9382a4326df31c981eac169b6bc4f746edaa7fc1f8c796ef4e374000000000665ab6aabac6affffffff0191c8d6030000000002525300000000", "6a5352516a635352ab", 0, -1299629906, "48411efeb133c6b7fec4e7bdbe613f827093cb06ea0dbcc2ffcfde3a9ac4356c"], + ["221d4718023d9ca9fe1af178dbfce02b2b369bf823ea3f43f00891b7fef98e215c06b94fdd000000000951005153ab000051acffffffffb1c7ad1c64b7441bf5e70cd0f6eb4ec96821d67fc4997d9e6dfdceadecd36dde01000000070051536a635153ffffffff04e883cd00000000000851ab536553ab0052bbb2f70400000000002f1b2e03000000000165259fcb00000000000010dbde99", "ab", 1, 665721280, "ac6b9f2d873e4aa05417892589eac78a7865c33f1d5126cbfac5224d27c62274"], + ["6f66c0b3013e6ae6aabae9382a4326df31c981eac169b6bc4f746edaa7fc1f8c796ef4e374000000000665ab6aabac6affffffff0191c8d6030000000002525300000000", "6a5352516a635352ab", 0, -1299629906, "d3164bdc7c712e8f38809e8777d936a9ac8e70f2ab2ea42469123ce281931d76"], ["89e7928c04363cb520eff4465251fd8e41550cbd0d2cdf18c456a0be3d634382abcfd4a2130200000006ac516a6a656355042a796061ed72db52ae47d1607b1ceef6ca6aea3b7eea48e7e02429f382b378c4e51901000000085351ab6352ab5252ffffffff53631cbda79b40183000d6ede011c778f70147dc6fa1aed3395d4ce9f7a8e69701000000096a6553ab52516a52abad0de418d80afe059aab5da73237e0beb60af4ac490c3394c12d66665d1bac13bdf29aa8000000000153f2b59ab6027a33eb040000000007005351ac5100ac88b941030000000003ab0052e1e8a143", "63656a", 0, 1258533326, "b575a04b0bb56e38bbf26e1a396a76b99fb09db01527651673a073a75f0a7a34"], - ["ca356e2004bea08ec2dd2df203dc275765dc3f6073f55c46513a588a7abcc4cbde2ff011c7020000000553525100003aefec4860ef5d6c1c6be93e13bd2d2a40c6fb7361694136a7620b020ecbaca9413bcd2a030000000965ac00536352535100ace4289e00e97caaea741f2b89c1143060011a1f93090dc230bee3f05e34fbd8d8b6c399010000000365526affffffff48fc444238bda7a757cb6a98cb89fb44338829d3e24e46a60a36d4e24ba05d9002000000026a53ffffffff03d70b440200000000056a6a526aac853c97010000000002515335552202000000000351635300000000", "0052", 3, -528192467, "fc93cc056c70d5e033933d730965f36ad81ef64f1762e57f0bc5506c5b507e24"], + ["ca356e2004bea08ec2dd2df203dc275765dc3f6073f55c46513a588a7abcc4cbde2ff011c7020000000553525100003aefec4860ef5d6c1c6be93e13bd2d2a40c6fb7361694136a7620b020ecbaca9413bcd2a030000000965ac00536352535100ace4289e00e97caaea741f2b89c1143060011a1f93090dc230bee3f05e34fbd8d8b6c399010000000365526affffffff48fc444238bda7a757cb6a98cb89fb44338829d3e24e46a60a36d4e24ba05d9002000000026a53ffffffff03d70b440200000000056a6a526aac853c97010000000002515335552202000000000351635300000000", "0052", 3, -528192467, "2d1889398e50eddc8be07e4b3ceb85fcce646dc83b7884fcbf4dedcbe7a55601"], ["82d4fa65017958d53e562fac073df233ab154bd0cf6e5a18f57f4badea8200b217975e31030200000004636aab51ac0891a204227cc9050000000006635200655365bfef8802000000000865650051635252acfc2d09050000000006ab65ac51516380195e030000000007ac52525352510063d50572", "53", 0, -713567171, "e095003ca82af89738c1863f0f5488ec56a96fb81ea7df334f9344fcb1d0cf40"], ["75f6949503e0e47dd70426ef32002d6cdb564a45abedc1575425a18a8828bf385fa8e808e600000000036aabab82f9fd14e9647d7a1b5284e6c55169c8bd228a7ea335987cef0195841e83da45ec28aa2e0300000002516350dc6fe239d150efdb1b51aa288fe85f9b9f741c72956c11d9dcd176889963d699abd63f0000000001ab429a63f502777d20010000000007abac52ac516a53d081d9020000000003acac630c3cc3a8", "535152516551510000", 1, 973814968, "c6ec1b7cb5c16a1bfd8a3790db227d2acc836300534564252b57bd66acf95092"], ["24f24cd90132b2162f938f1c22d3ca5e7daa83515883f31a61a5177aebf99d7db6bdfc398c010000000163ffffffff01d5562d0100000000016300000000", "5265ac5165ac5252ab", 0, 1055129103, "5eeb03e03806cd7bfd44bbba69c30f84c2c5120df9e68cd8facc605fcfbc9693"], ["5ff2cac201423064a4d87a96b88f1669b33adddc6fa9acdc840c0d8a243671e0e6de49a5b00300000005ac6353655353b91db50180db5a03000000000663535151006a047a3aff", "52ab51ab5365005163", 0, -1336626596, "b8db8d57fe40ab3a99cf2f8ed57da7a65050fcc1d34d4280e25faf10108d3110"], - ["10011f150220ad76a50ccc7bb1a015eda0ff987e64cd447f84b0afb8dc3060bdae5b36a6900200000000ffffffff1e92dd814dfafa830187bc8e5b9258de2445ec07b02c420ee5181d0b203bb334000000000565ab536a65ffffffff0124e65401000000000800ab636553ab53ac00000000", "53abab0051", 0, 440222748, "c6675bf229737e005b5c8ffa6f81d9e2c4396840921b6151316f67c4315a4270"], + ["10011f150220ad76a50ccc7bb1a015eda0ff987e64cd447f84b0afb8dc3060bdae5b36a6900200000000ffffffff1e92dd814dfafa830187bc8e5b9258de2445ec07b02c420ee5181d0b203bb334000000000565ab536a65ffffffff0124e65401000000000800ab636553ab53ac00000000", "53abab0051", 0, 440222748, "89c6ba621686c9a4ceffd4ec7d28223f0592c1a2d4bb3ebfb6d088017dbfd6dd"], ["8b95ec900456648d820a9b8df1d8f816db647df8a8dc9f6e7151ebf6079d90ee3f6861352a02000000085200ab00ac535151ffffffff039b10b845f961225ac0bcaac4f5fe1991029a051aa3d06a3811b5762977a67403000000035252abffffffff8559d65f40d5e261f45aec8aad3d2c56c6114b22b26f7ee54a06f0881be3a7f5010000000765635252536363ffffffff38f8b003b50f6412feb2322b06b270197f81ad69c36af02ca5008b94eee5f650020000000165ffffffff01ae2b00010000000001638eb153a2", "0053ab5300ac53", 2, 1266056769, "205f3653f0142b35ce3ef39625442efebae98cde8cbf0516b97b51073bb0479f"], ["babbb7ea01ab5d584727cb44393b17cf66521606dc81e25d85273be0d57bad43e8f6b6d43501000000036a656aba83a68803fb0f4a000000000005536353ab633fcfe4020000000009ac00acab6351006a65182a0c03000000000453ac5363bee74f44", "536a6a6a6365ac51ab", 0, -799187625, "3275e98dca37243b977525a07b5d8e369d6c3bdc08cb948029a635547d0d1a4e"], - ["e86a24bc03e4fae784cdf81b24d120348cb5e52d937cd9055402fdba7e43281e482e77a1c100000000046363006affffffffa5447e9bdcdab22bd20d88b19795d4c8fb263fbbf7ce8f4f9a85f865953a6325020000000663ac53535253ffffffff9f8b693bc84e0101fc73748e0513a8cecdc264270d8a4ee1a1b6717607ee1eaa00000000026a513417bf980158d82c020000000009005253005351acac5200000000", "6353516365536a6a", 2, -563792735, "508129278ef07b43112ac32faf00170ad38a500eed97615a860fd58baaad174b"], + ["e86a24bc03e4fae784cdf81b24d120348cb5e52d937cd9055402fdba7e43281e482e77a1c100000000046363006affffffffa5447e9bdcdab22bd20d88b19795d4c8fb263fbbf7ce8f4f9a85f865953a6325020000000663ac53535253ffffffff9f8b693bc84e0101fc73748e0513a8cecdc264270d8a4ee1a1b6717607ee1eaa00000000026a513417bf980158d82c020000000009005253005351acac5200000000", "6353516365536a6a", 2, -563792735, "4db19acbd7ad629a5974a3363271a104fa13b044fddb5855424ff9ed95a5817d"], ["53bd749603798ed78798ef0f1861b498fc61dcee2ee0f2b37cddb115b118e73bc6a5a47a0201000000096a63656a6aab6a000007ff674a0d74f8b4be9d2e8e654840e99d533263adbdd0cf083fa1d5dd38e44d2d163d900100000007abab5251ac6a51c8b6b63f744a9b9273ccfdd47ceb05d3be6400c1ed0f7283d32b34a7f4f0889cccf06be30000000009516a52636551ab516a9ac1fe63030c677e05000000000027bc610000000000086565636a635100526e2dc60200000000015300000000", "6552536a515351ab", 1, -1617066878, "fe516df92299e995b8e6489be824c6839543071ec5e9286060b2600935bf1f20"], - ["691bf9fc028ca3099020b79184e70039cf53b3c7b3fe695d661fd62d7b433e65feda2150610000000003ac63abffffffff2c814c15b142bc944192bddccb90a392cd05b968b599c1d8cd99a55a28a243fd0100000009ab5300526a5200abac98516a5803dfd3540500000000046552ac522838120100000000040053ab6a4409a903000000000665636a5300658759621b", "65ac5165ab", 0, -359941441, "d582c442e0ecc400c7ba33a56c93ad9c8cfd45af820350a13623594b793486f0"], - ["536bc5e60232eb60954587667d6bcdd19a49048d67a027383cc0c2a29a48b960dc38c5a0370300000005ac636300abffffffff8f1cfc102f39b1c9348a2195d496e602c77d9f57e0769dabde7eaaedf9c69e250100000006acabab6a6351ffffffff0432f56f0400000000046a5365517fd54b0400000000035265539484e4050000000003536a5376dc25020000000008ac536aab6aab536ab978e686", "ac0051006a006a006a", 0, -273074082, "f151f1ec305f698d9fdce18ea292b145a58d931f1518cf2a4c83484d9a429638"], - ["74606eba01c2f98b86c29ba5a32dc7a7807c2abe6ed8d89435b3da875d87c12ae05329e6070200000003510052ffffffff02a1e2c4020000000006516563526a63c68bae04000000000952ab6363ab00006363fe19ae4f", "63ababacac5365", 0, 112323400, "d1b1d79001b4a0324962607b739972d6f39c1493c4500ce814fd3bd72d32a5a0"], + ["691bf9fc028ca3099020b79184e70039cf53b3c7b3fe695d661fd62d7b433e65feda2150610000000003ac63abffffffff2c814c15b142bc944192bddccb90a392cd05b968b599c1d8cd99a55a28a243fd0100000009ab5300526a5200abac98516a5803dfd3540500000000046552ac522838120100000000040053ab6a4409a903000000000665636a5300658759621b", "65ac5165ab", 0, -359941441, "673ba82eee90644fb626037974515b6a27b76306f8656149f84520269fa60fa7"], + ["536bc5e60232eb60954587667d6bcdd19a49048d67a027383cc0c2a29a48b960dc38c5a0370300000005ac636300abffffffff8f1cfc102f39b1c9348a2195d496e602c77d9f57e0769dabde7eaaedf9c69e250100000006acabab6a6351ffffffff0432f56f0400000000046a5365517fd54b0400000000035265539484e4050000000003536a5376dc25020000000008ac536aab6aab536ab978e686", "ac0051006a006a006a", 0, -273074082, "31c025f4a9b773c7995cdaf093724fd6aead7dc76ea61856864b7279b2094946"], + ["74606eba01c2f98b86c29ba5a32dc7a7807c2abe6ed8d89435b3da875d87c12ae05329e6070200000003510052ffffffff02a1e2c4020000000006516563526a63c68bae04000000000952ab6363ab00006363fe19ae4f", "63ababacac5365", 0, 112323400, "4a236757379b2573a010948e0aea247819c792b29604e020201900d3416e238c"], ["2ed805e20399e52b5bcc9dc075dad5cf19049ff5d7f3de1a77aee9288e59c5f4986751483f020000000165ffffffff967531a5726e7a653a9db75bd3d5208fa3e2c5e6cd5970c4d3aba84eb644c72c0300000000ffffffffd79030d20c65e5f8d3c55b5692e5bdaa2ae78cfa1935a0282efb97515feac43f030000000400006365261ab88c02bdf66a000000000003ab6351d6ad8b000000000005525152abac00000000", "630053ab5265", 0, 2072814938, "1d25d16d84d5793be1ad5cda2de9c9cf70e04a66c3dae618f1a7ca4026198e7f"], ["fab796ee03f737f07669160d1f1c8bf0800041157e3ac7961fea33a293f976d79ce49c02ab0200000003ac5252eb097ea1a6d1a7ae9dace338505ba559e579a1ee98a2e9ad96f30696d6337adcda5a85f403000000096500abab656a6a656396d5d41a9b11f571d91e4242ddc0cf2420eca796ad4882ef1251e84e42b930398ec69dd80100000005526551ac6a8e5d0de804f763bb0400000000015288271a010000000001acf2bf2905000000000300ab51c9641500000000000952655363636365ac5100000000", "00ac536552", 0, -1854521113, "f3bbab70b759fe6cfae1bf349ce10716dbc64f6e9b32916904be4386eb461f1f"], ["f2b539a401e4e8402869d5e1502dbc3156dbce93583f516a4947b333260d5af1a34810c6a00200000003525363ffffffff01d305e2000000000005acab535200a265fe77", "", 0, -1435650456, "41617b27321a830c712638dbb156dae23d4ef181c7a06728ccbf3153ec53d7dd"], - ["9f10b1d8033aee81ac04d84ceee0c03416a784d1017a2af8f8a34d2f56b767aea28ff88c8f02000000025352ffffffff748cb29843bea8e9c44ed5ff258df1faf55fbb9146870b8d76454786c4549de100000000016a5ba089417305424d05112c0ca445bc7107339083e7da15e430050d578f034ec0c589223b0200000007abac53ac6565abffffffff025a4ecd010000000006636563ab65ab40d2700000000000056a6553526333fa296c", "", 0, -395044364, "20fd0eee5b5716d6cbc0ddf852614b686e7a1534693570809f6719b6fcb0a626"], + ["9f10b1d8033aee81ac04d84ceee0c03416a784d1017a2af8f8a34d2f56b767aea28ff88c8f02000000025352ffffffff748cb29843bea8e9c44ed5ff258df1faf55fbb9146870b8d76454786c4549de100000000016a5ba089417305424d05112c0ca445bc7107339083e7da15e430050d578f034ec0c589223b0200000007abac53ac6565abffffffff025a4ecd010000000006636563ab65ab40d2700000000000056a6553526333fa296c", "", 0, -395044364, "2b824d540c6c24d6f31ba0245895b7a74fa6ac1632913c8a1dcffa44d8183fc7"], ["ab81755f02b325cbd2377acd416374806aa51482f9cc5c3b72991e64f459a25d0ddb52e66703000000036a00ab8727056d48c00cc6e6222be6608c721bc2b1e69d0ffbadd51d131f05ec54bcd83003aac5000000000003f2cdb60454630e020000000007526aac63000000e9e25c040000000003516a0088c97e0000000000076a535265655263771b5805000000000851ab00ac6565515100000000", "5151ab00ac", 0, -230931127, "ba0a2c987fcdd74b6915f6462f62c3f126a0750aa70048f7aa20f70726e6a20b"], - ["7a17e0ef0378dab4c601240639139335da3b7d684600fa682f59b7346ef39386fe9abd69350000000004ac5252ab807f26fb3249326813e18260a603b9ad66f41f05eaa8146f66bcca452162a502aac4aa8b02000000026a534ea460faa7e3d7854ec6c70d7e797025697b547ec500b2c09c873b4d5517767d3f3720660300000000ffffffff01b12e7a02000000000900ab006aab65656a63991c03e2", "6aab6a", 1, -1577994103, "62cd3413d9d819fb7355336365cf8a2a997f7436cc050a7143972044343b3281"], - ["ff2ecc09041b4cf5abb7b760e910b775268abee2792c7f21cc5301dd3fecc1b4233ee70a2c0200000009acac5300006a51526affffffffeb39c195a5426afff38379fc85369771e4933587218ef4968f3f05c51d6b7c92000000000165453a5f039b8dbef7c1ffdc70ac383b481f72f99f52b0b3a5903c825c45cfa5d2c0642cd50200000001654b5038e6c49daea8c0a9ac8611cfe904fc206dad03a41fb4e5b1d6d85b1ecad73ecd4c0102000000096a51000053ab656565bdb5548302cc719200000000000452655265214a3603000000000300ab6a00000000", "52516a006a63", 1, -2113289251, "37ed6fae36fcb3360c69cac8b359daa62230fc1419b2cf992a32d8f3e079dcff"], + ["7a17e0ef0378dab4c601240639139335da3b7d684600fa682f59b7346ef39386fe9abd69350000000004ac5252ab807f26fb3249326813e18260a603b9ad66f41f05eaa8146f66bcca452162a502aac4aa8b02000000026a534ea460faa7e3d7854ec6c70d7e797025697b547ec500b2c09c873b4d5517767d3f3720660300000000ffffffff01b12e7a02000000000900ab006aab65656a63991c03e2", "6aab6a", 1, -1577994103, "99f82a6611cd076a5b7a6b041015f0262673f498905d7067e44e9406fde457e3"], + ["ff2ecc09041b4cf5abb7b760e910b775268abee2792c7f21cc5301dd3fecc1b4233ee70a2c0200000009acac5300006a51526affffffffeb39c195a5426afff38379fc85369771e4933587218ef4968f3f05c51d6b7c92000000000165453a5f039b8dbef7c1ffdc70ac383b481f72f99f52b0b3a5903c825c45cfa5d2c0642cd50200000001654b5038e6c49daea8c0a9ac8611cfe904fc206dad03a41fb4e5b1d6d85b1ecad73ecd4c0102000000096a51000053ab656565bdb5548302cc719200000000000452655265214a3603000000000300ab6a00000000", "52516a006a63", 1, -2113289251, "726dac35bebcf1e13f3da16695e9e8155afdb03514ee70bc265e4b68c4a41677"], ["70a8577804e553e462a859375957db68cfdf724d68caeacf08995e80d7fa93db7ebc04519d02000000045352ab53619f4f2a428109c5fcf9fee634a2ab92f4a09dc01a5015e8ecb3fc0d9279c4a77fb27e900000000006ab6a51006a6affffffff3ed1a0a0d03f25c5e8d279bb5d931b7eb7e99c8203306a6c310db113419a69ad010000000565516300abffffffff6bf668d4ff5005ef73a1b0c51f32e8235e67ab31fe019bf131e1382050b39a630000000004536a6563ffffffff02faf0bb00000000000163cf2b4b05000000000752ac635363acac15ab369f", "ac", 0, -1175809030, "1c9d6816c20865849078f9777544b5ddf37c8620fe7bd1618e4b72fb72dddca1"], - ["a3604e5304caa5a6ba3c257c20b45dcd468f2c732a8ca59016e77b6476ac741ce8b16ca8360200000004acac6553ffffffff695e7006495517e0b79bd4770f955040610e74d35f01e41c9932ab8ccfa3b55d0300000007ac5253515365acffffffff6153120efc5d73cd959d72566fc829a4eb00b3ef1a5bd3559677fb5aae116e38000000000400abab52c29e7abd06ff98372a3a06227386609adc7665a602e511cadcb06377cc6ac0b8f63d4fdb03000000055100acabacffffffff04209073050000000009ab5163ac525253ab6514462e05000000000952abacab636300656a20672c0400000000025153b276990000000000056565ab6a5300000000", "5351", 0, 1460890590, "249c4513a49076c6618aabf736dfd5ae2172be4311844a62cf313950b4ba94be"], + ["a3604e5304caa5a6ba3c257c20b45dcd468f2c732a8ca59016e77b6476ac741ce8b16ca8360200000004acac6553ffffffff695e7006495517e0b79bd4770f955040610e74d35f01e41c9932ab8ccfa3b55d0300000007ac5253515365acffffffff6153120efc5d73cd959d72566fc829a4eb00b3ef1a5bd3559677fb5aae116e38000000000400abab52c29e7abd06ff98372a3a06227386609adc7665a602e511cadcb06377cc6ac0b8f63d4fdb03000000055100acabacffffffff04209073050000000009ab5163ac525253ab6514462e05000000000952abacab636300656a20672c0400000000025153b276990000000000056565ab6a5300000000", "5351", 0, 1460890590, "f3beebe3bef34e46c515cdffe324e5ff4a2a348fa64015432b09389772ac96fb"], ["c6a72ed403313b7d027f6864e705ec6b5fa52eb99169f8ea7cd884f5cdb830a150cebade870100000009ac63ab516565ab6a51ffffffff398d5838735ff43c390ca418593dbe43f3445ba69394a6d665b5dc3b4769b5d700000000075265acab515365ffffffff7ee5616a1ee105fd18189806a477300e2a9cf836bf8035464e8192a0d785eea3030000000700ac6a51516a52ffffffff018075fd0000000000015100000000", "005251acac5252", 2, -656067295, "2cc1c7514fdc512fd45ca7ba4f7be8a9fe6d3318328bc1a61ae6e7675047e654"], ["93c12cc30270fc4370c960665b8f774e07942a627c83e58e860e38bd6b0aa2cb7a2c1e060901000000036300abffffffff4d9b618035f9175f564837f733a2b108c0f462f28818093372eec070d9f0a5440300000001acffffffff039c2137020000000001525500990100000000055265ab636a07980e0300000000005ba0e9d1", "656a5100", 1, 18954182, "6beca0e0388f824ca33bf3589087a3c8ad0857f9fe7b7609ae3704bef0eb83e2"], ["97bddc63015f1767619d56598ad0eb5c7e9f880b24a928fea1e040e95429c930c1dc653bdb0100000008ac53acac00005152aaa94eb90235ed10040000000000287bdd0400000000016a8077673a", "acac6a536352655252", 0, -813649781, "5990b139451847343c9bb89cdba0e6daee6850b60e5b7ea505b04efba15f5d92"], - ["cc3c9dd303637839fb727270261d8e9ddb8a21b7f6cbdcf07015ba1e5cf01dc3c3a327745d0300000000d2d7804fe20a9fca9659a0e49f258800304580499e8753046276062f69dbbde85d17cd2201000000096352536a520000acabffffffffbc75dfa9b5f81f3552e4143e08f485dfb97ae6187330e6cd6752de6c21bdfd21030000000600ab53650063ffffffff0313d0140400000000096565515253526aacac167f0a040000000008acab00535263536a9a52f8030000000006abab5151ab63f75b66f2", "6a635353636a65ac65", 1, 377286607, "dbc7935d718328d23d73f8a6dc4f53a267b8d4d9816d0091f33823bd1f0233e9"], - ["236f91b702b8ffea3b890700b6f91af713480769dda5a085ae219c8737ebae90ff25915a3203000000056300ac6300811a6a10230f12c9faa28dae5be2ebe93f37c06a79e76214feba49bb017fb25305ff84eb020000000100ffffffff041e351703000000000351ac004ff53e050000000003ab53636c1460010000000000cb55f701000000000651520051ab0000000000", "acac636a6aac5300", 0, 406448919, "793a3d3c37f6494fab79ff10c16702de002f63e34be25dd8561f424b0ea938c4"], + ["cc3c9dd303637839fb727270261d8e9ddb8a21b7f6cbdcf07015ba1e5cf01dc3c3a327745d0300000000d2d7804fe20a9fca9659a0e49f258800304580499e8753046276062f69dbbde85d17cd2201000000096352536a520000acabffffffffbc75dfa9b5f81f3552e4143e08f485dfb97ae6187330e6cd6752de6c21bdfd21030000000600ab53650063ffffffff0313d0140400000000096565515253526aacac167f0a040000000008acab00535263536a9a52f8030000000006abab5151ab63f75b66f2", "6a635353636a65ac65", 1, 377286607, "fe14a27ba6babec2e0a6769d1b726351d468718dc8f10333cd8912dfba405df8"], + ["236f91b702b8ffea3b890700b6f91af713480769dda5a085ae219c8737ebae90ff25915a3203000000056300ac6300811a6a10230f12c9faa28dae5be2ebe93f37c06a79e76214feba49bb017fb25305ff84eb020000000100ffffffff041e351703000000000351ac004ff53e050000000003ab53636c1460010000000000cb55f701000000000651520051ab0000000000", "acac636a6aac5300", 0, 406448919, "3e2c7212678c970210f6579394d32d355eb982112d062fd46f62df7fe551c6af"], ["22e10d2003ab4ea9849a2801921113583b7c35c3710ff49a6003489395789a7cfb1e6051900100000006526a65535151ffffffff82f21e249ec60db33831d33b9ead0d56f6496db64337dcb7f1c3327c47729c4a020000000253abffffffff138f098f0e6a4cf51dc3e7a3b749f487d1ebde71b73b731d1d02ad1180ac7b8c02000000036563acda215011027a9484020000000007635165530000ac4bf6cb0400000000066aacabab65ab3ce3f32c", "ab0052ab", 2, 1136359457, "b5bd080bbcb8cd652f440484311d7a3cb6a973cd48f03c5c00fd6beb52dfc061"], - ["c47d5ad60485cb2f7a825587b95ea665a593769191382852f3514a486d7a7a11d220b62c54000000000663655253acab8c3cf32b0285b040e50dcf6987ddf7c385b3665048ad2f9317b9e0c5ba0405d8fde4129b00000000095251ab00ac65635300ffffffff549fe963ee410d6435bb2ed3042a7c294d0c7382a83edefba8582a2064af3265000000000152fffffffff7737a85e0e94c2d19cd1cde47328ece04b3e33cd60f24a8a345da7f2a96a6d0000000000865ab6a0051656aab28ff30d5049613ea020000000005ac51000063f06df1050000000008ac63516aabac5153afef5901000000000700656500655253688bc00000000000086aab5352526a53521ff1d5ff", "51ac52", 2, -1296011911, "0c1fd44476ff28bf603ad4f306e8b6c7f0135a441dc3194a6f227cb54598642a"], - ["0b43f122032f182366541e7ee18562eb5f39bc7a8e5e0d3c398f7e306e551cdef773941918030000000863006351ac51acabffffffffae586660c8ff43355b685dfa8676a370799865fbc4b641c5a962f0849a13d8250100000005abab63acabffffffff0b2b6b800d8e77807cf130de6286b237717957658443674df047a2ab18e413860100000008ab6aac655200ab63ffffffff04f1dbca03000000000800635253ab656a52a6eefd0300000000036365655d8ca90200000000005a0d530400000000015300000000", "65ac65acac", 0, 351448685, "86f26e23822afd1bdfc9fff92840fc1e60089f12f54439e3ab9e5167d0361dcf"], - ["4b0ecc0c03ba35700d2a30a71f28e432ff6ac7e357533b49f4e97cf28f1071119ad6b97f3e0300000008acab516363ac63acffffffffcd6a2019d99b5c2d639ddca0b1aa5ea7c1326a071255ea226960bd88f45ca57d00000000085253655363005353ffffffffba257635191c9f216de3277be548cb5a2313114cb1a4c563b03b4ef6c0f4f7040300000001abda542edf0495cdc40100000000026353c049e903000000000752516a53ab65512b0f9304000000000963ab516aac65516552fa9ece050000000009acab6500005152530000000000", "65ab51525352510052", 1, -1355414590, "3cd85f84aae6d702436f3f9b8980adcc1f8f202e957759540a27da0a32fc6c87"], + ["c47d5ad60485cb2f7a825587b95ea665a593769191382852f3514a486d7a7a11d220b62c54000000000663655253acab8c3cf32b0285b040e50dcf6987ddf7c385b3665048ad2f9317b9e0c5ba0405d8fde4129b00000000095251ab00ac65635300ffffffff549fe963ee410d6435bb2ed3042a7c294d0c7382a83edefba8582a2064af3265000000000152fffffffff7737a85e0e94c2d19cd1cde47328ece04b3e33cd60f24a8a345da7f2a96a6d0000000000865ab6a0051656aab28ff30d5049613ea020000000005ac51000063f06df1050000000008ac63516aabac5153afef5901000000000700656500655253688bc00000000000086aab5352526a53521ff1d5ff", "51ac52", 2, -1296011911, "b8d85b43a85e25105074af365363a19534326d62f07b99ddc794bb5bdef92bae"], + ["0b43f122032f182366541e7ee18562eb5f39bc7a8e5e0d3c398f7e306e551cdef773941918030000000863006351ac51acabffffffffae586660c8ff43355b685dfa8676a370799865fbc4b641c5a962f0849a13d8250100000005abab63acabffffffff0b2b6b800d8e77807cf130de6286b237717957658443674df047a2ab18e413860100000008ab6aac655200ab63ffffffff04f1dbca03000000000800635253ab656a52a6eefd0300000000036365655d8ca90200000000005a0d530400000000015300000000", "65ac65acac", 0, 351448685, "035388c00dd1840d395c2b73707e1a2411b877b7ac1589b4207648803be39390"], + ["4b0ecc0c03ba35700d2a30a71f28e432ff6ac7e357533b49f4e97cf28f1071119ad6b97f3e0300000008acab516363ac63acffffffffcd6a2019d99b5c2d639ddca0b1aa5ea7c1326a071255ea226960bd88f45ca57d00000000085253655363005353ffffffffba257635191c9f216de3277be548cb5a2313114cb1a4c563b03b4ef6c0f4f7040300000001abda542edf0495cdc40100000000026353c049e903000000000752516a53ab65512b0f9304000000000963ab516aac65516552fa9ece050000000009acab6500005152530000000000", "65ab51525352510052", 1, -1355414590, "0e6ec42adb32d0ad3463b31da25d821b12d60ce0c9e666d3cb23cf0dab318267"], ["adaac0a803f66811346271c733036d6e0d45e15a9b602092e2e04ad93564f196e7f020b088000000000600526a636a00700ec3f9db07a3a6ce910bf318c7ec87a876e1f2a3366cc69f20cde09203b99c1cb9d15800000000050000ac636a4d0de554ebe95c6cc14faf5ff6361d1deba9474b8b0fd3b93c011cd96aec783abb3f36830200000005ab65005251ffffffff0464eb10050000000007520000ab6a65ab1beaa80300000000005a2f31050000000006526aab65ac52ba7db10000000000045251ab6a0cfb46e7", "ab0051ac52636a", 1, -184733716, "961ff413850336d3987c550404fc1d923266ca36cc9ffee7113edb3a9fea7f30"], - ["af1c4ab301ec462f76ee69ba419b1b2557b7ded639f3442a3522d4f9170b2d6859765c3df402000000016affffffff01a5ca6c000000000008ab52536aab00005300000000", "6a6351", 0, 110304602, "e88ed2eea9143f2517b15c03db00767eb01a5ce12193b99b964a35700607e5f4"], + ["af1c4ab301ec462f76ee69ba419b1b2557b7ded639f3442a3522d4f9170b2d6859765c3df402000000016affffffff01a5ca6c000000000008ab52536aab00005300000000", "6a6351", 0, 110304602, "3abad943fc33ea26fb1eefbe6a73a4e62572d37954d9a0bd160463f69948b267"], ["0bfd34210451c92cdfa02125a62ba365448e11ff1db3fb8bc84f1c7e5615da40233a8cd368010000000252ac9a070cd88dec5cf9aed1eab10d19529720e12c52d3a21b92c6fdb589d056908e43ea910e0200000009ac516a52656a6a5165ffffffffc3edcca8d2f61f34a5296c405c5f6bc58276416c720c956ff277f1fb81541ddd00000000030063abffffffff811247905cdfc973d179c03014c01e37d44e78f087233444dfdce1d1389d97c302000000065163000063ab1724a26e02ca37c902000000000851ab53525352ac529012a90100000000085200525253535353fa32575b", "5352ac6351", 1, -1087700448, "b8f1e1f35e3e1368bd17008c756e59cced216b3c699bcd7bebdb5b6c8eec4697"], ["2c84c0640487a4a695751d3e4be48019dbaea85a6e854f796881697383ea455347d2b2769001000000055265526500ffffffff6aac176d8aa00778d496a7231eeb7d3334f20c512d3db1683276402100d98de5030000000700536a5263526ac1ee9ceb171c0c984ebaf12c234fd1487fbf3b3d73aa0756907f26837efba78d1bed33200300000001ab4d9e8ec0bed837cb929bbed76ee848959cec59de44bd7667b7631a744f880d5c71a20cfd0100000007005363515300abffffffff023753fb0000000000036565532d3873050000000009005152ab6a63acab5200000000", "ab650053ab", 0, -877941183, "c49af297dffe2d80deddf10ceea84b99f8554bd2d55bbdc34e449728c31f0835"], - ["1f7e4b1b045d3efa6cd7a11d7873a8bab886c19bd11fcb6712f0948f2db3a7be76ff76c8f100000000095265ab6a0065ac5363ffffffffdaafcfa6029336c997680a541725190f09a6f6da21e54560eca4b5b8ae987da1000000000952ac52acac52515165ffffffff825a38d3b1e5bb4d10f33653ab3ab6882c7abdaec74460257d1528ce7be3f98e0100000007526a006a656a63c14adc8f04953a5d3d3f89237f38b857dd357713896d36215f7e8b77b11d98ea3cdc93df02000000015212484f6104bfafae0300000000025263a2b0120000000000056563ab00516c4d2605000000000653ac6500655301cc93030000000002acab14643b1f", "63acac53ab", 0, 333824258, "18da6ceb011cd36f15ad7dd6c55ef07e6f6ed48881ce3bb31416d3c290d9a0e9"], - ["467a3e7602e6d1a7a531106791845ec3908a29b833598e41f610ef83d02a7da3a1900bf2960000000005ab6a636353ffffffff031db6dac6f0bafafe723b9199420217ad2c94221b6880654f2b35114f44b1df010000000965ab52636a63ac6352ffffffff02b3b95c0100000000026300703216030000000001ab3261c0aa", "6a", 0, 2110869267, "3078b1d1a7713c6d101c64afe35adfae0977a5ab4c7e07a0b170b041258adbf2"], - ["8713bc4f01b411149d575ebae575f5dd7e456198d61d238695df459dd9b86c4e3b2734b62e0300000004abac6363ffffffff03b58049050000000002ac653c714c04000000000953656a005151526a527b5a9e03000000000652ac5100525300000000", "52", 0, -647281251, "0e0bed1bf2ff255aef6e5c587f879ae0be6222ab33bd75ee365ec6fbb8acbe38"], + ["1f7e4b1b045d3efa6cd7a11d7873a8bab886c19bd11fcb6712f0948f2db3a7be76ff76c8f100000000095265ab6a0065ac5363ffffffffdaafcfa6029336c997680a541725190f09a6f6da21e54560eca4b5b8ae987da1000000000952ac52acac52515165ffffffff825a38d3b1e5bb4d10f33653ab3ab6882c7abdaec74460257d1528ce7be3f98e0100000007526a006a656a63c14adc8f04953a5d3d3f89237f38b857dd357713896d36215f7e8b77b11d98ea3cdc93df02000000015212484f6104bfafae0300000000025263a2b0120000000000056563ab00516c4d2605000000000653ac6500655301cc93030000000002acab14643b1f", "63acac53ab", 0, 333824258, "3820cdcf1f0009851235a3af446fef2b26d73dbb11091d9626c5a3a6168268b4"], + ["467a3e7602e6d1a7a531106791845ec3908a29b833598e41f610ef83d02a7da3a1900bf2960000000005ab6a636353ffffffff031db6dac6f0bafafe723b9199420217ad2c94221b6880654f2b35114f44b1df010000000965ab52636a63ac6352ffffffff02b3b95c0100000000026300703216030000000001ab3261c0aa", "6a", 0, 2110869267, "0f6d9d80eb7b17395569f07674f13b6b3f80dafb23ded6a964575ae4c5b08262"], + ["8713bc4f01b411149d575ebae575f5dd7e456198d61d238695df459dd9b86c4e3b2734b62e0300000004abac6363ffffffff03b58049050000000002ac653c714c04000000000953656a005151526a527b5a9e03000000000652ac5100525300000000", "52", 0, -647281251, "78e291970aeb0a6a2af296270bc20ca55a0bd512ae10baf49a0e92d4dffe4e0a"], ["f2ba8a8701b9c401efe3dd0695d655e20532b90ac0142768cee4a3bb0a89646758f544aa8102000000036a52527899f4e4040c6f0b030000000008636565ab530051ab52b60c000000000009515200ab630053ac53a49c5f040000000008ab53ab516300ab63fa27340300000000015100000000", "ac63abab5251", 0, -1328936437, "ab61497afd39e61fe06bc5677326919716f9b20083c9f3417dcea905090e0411"], ["b5a7df6102107beded33ae7f1dec0531d4829dff7477260925aa2cba54119b7a07d92d5a1d02000000046a516a52803b625c334c1d2107a326538a3db92c6c6ae3f7c3516cd90a09b619ec6f58d10e77bd6703000000056563006a63ffffffff0117484b03000000000853acab52526a65abc1b548a1", "ac006a525100", 0, 2074359913, "680336db57347d8183b8898cd27a83f1ba5884155aeae5ce20b4840b75e12871"], ["278cb16204b9dadf400266106392c4aa9df01ba03af988c8139dae4c1818ac009f13fc5f1a00000000065200ac656a52ffffffffd006bbebd8cbd7bdead24cddc9badfcc6bc0c2e63c037e5c29aa858f5d0f3e7d01000000046a0051acffffffffbc62a5f57e58da0b67956003ae81ac97cb4cbd1d694c914fc41515c008c4d8fd020000000165e329c844bcc16164be64b64a81cbf4ffd41ed2934e0daa0040ccb8365bab0b2a9e401c180300000003ab52abffffffff02588460030000000000a25a12030000000005535100005300000000", "6553ab6a5300acab51", 3, 989407546, "1c29f110576f4a3b257f67454d99dfc0dee62ef5517ca702848ce4bd2ea1a1d7"], ["49eb2178020a04fca08612c34959fd41447319c190fb7ffed9f71c235aa77bec28703aa1820200000003ac6353abaff326071f07ec6b77fb651af06e8e8bd171068ec96b52ed584de1d71437fed186aecf0300000001acffffffff03da3dbe02000000000652ac63ac6aab8f3b680400000000096a536a65636a53516a5175470100000000016500000000", "6a536365", 0, 1283691249, "c670219a93234929f662ecb9aa148a85a2d281e83f4e53d10509461cdea47979"], ["0f96cea9019b4b3233c0485d5b1bad770c246fe8d4a58fb24c3b7dfdb3b0fd90ea4e8e947f0300000006006a5163515303571e1e01906956030000000005ab635353abadc0fbbe", "acac", 0, -1491469027, "716a8180e417228f769dcb49e0491e3fda63badf3d5ea0ceeac7970d483dd7e2"], - ["9a7d858604577171f5fe3f3fd3e5e039c4b0a06717a5381e9977d80e9f53e025e0f16d2877020000000752636565536353ffffffff5862bd028e8276e63f044be1dddcbb8d0c3fa097678308abf2b0f45104a93dbd0100000001531200667ba8fdd3b28e98a35da73d3ddfe51e210303d8eb580f923de988ee632d77793892030000000752526363526563ffffffffe9744eb44db2658f120847c77f47786d268c302120d269e6004455aa3ea5f5e20200000009ab6300636aab656551ffffffff03c61a3c020000000009ab516a6aab6aab53ab737f1a05000000000853acabab655365ab92a4a00400000000016367edf6c8", "535352ab", 3, 659348595, "d36ee79fc80db2e63e05cdc50357d186181b40ae20e3720878284228a13ee8b3"], + ["9a7d858604577171f5fe3f3fd3e5e039c4b0a06717a5381e9977d80e9f53e025e0f16d2877020000000752636565536353ffffffff5862bd028e8276e63f044be1dddcbb8d0c3fa097678308abf2b0f45104a93dbd0100000001531200667ba8fdd3b28e98a35da73d3ddfe51e210303d8eb580f923de988ee632d77793892030000000752526363526563ffffffffe9744eb44db2658f120847c77f47786d268c302120d269e6004455aa3ea5f5e20200000009ab6300636aab656551ffffffff03c61a3c020000000009ab516a6aab6aab53ab737f1a05000000000853acabab655365ab92a4a00400000000016367edf6c8", "535352ab", 3, 659348595, "c3c0665fe14a3d8a309d6fd92f6d7c3241c1a580586ccceb28dabf56390abc34"], ["148e68480196eb52529af8e83e14127cbfdbd4a174e60a86ac2d86eac9665f46f4447cf7aa01000000045200ac538f8f871401cf240c0300000000065252ab52656a5266cf61", "", 0, -344314825, "eacc47c5a53734d6ae3aedbc6a7c0a75a1565310851b29ef0342dc4745ceb607"], ["e2bc29d4013660631ba14ecf75c60ec5e9bed7237524d8c10f66d0675daa66d1492cb834530200000004ac510065e42d0c9e04f2b26c01000000000951525152acac65ababa35b7504000000000953ac6aac00650053ab94688c0400000000056365526553a1bced0300000000016a00000000", "65ab0063655353", 0, -888431789, "59a34b3ed3a1cce0b104de8f7d733f2d386ffc7445efae67680cd90bc915f7e0"], ["0c8a70d70494dca6ab05b2bc941b5b431c43a292bd8f2f02eab5e240a408ca73a676044a4103000000056a51ab006affffffff84496004e54836c035821f14439149f22e1db834f315b24588ba2f031511926c0100000000ffffffffbbc5e70ed1c3060ba1bfe99c1656a3158a7307c3ce8eb362ec32c668596d2bd30000000009636563635351abab00b039344c6fc4f9bec24322e45407af271b2d3dfec5f259ee2fc7227bc5285e22b3be85b40100000009ac00ab53abac6a5352e5ddfcff02d50231020000000005006a51536ab086d9020000000006ababac51ac6a00000000", "abab636565acac6a", 3, 241546088, "643a7b4c8d832e14d5c10762e74ec84f2c3f7ed96c03053157f1bed226614911"], ["f98f79cf0274b745e1d6f36da7cbe205a79132a7ad462bdc434cfb1dcd62a6977c3d2a5dbc010000000553516a5365ffffffff4f89f485b53cdad7fb80cc1b7e314b9735b9383bc92c1248bb0e5c6173a55c0d010000000353655293f9b014045ad96d02000000000963ac526a53ac636365f4c27904000000000952536563635152526a2788f0030000000002516aff5add01000000000863530051655351abd04716ba", "ab6552536a53", 1, -2128899945, "56d29f5e300ddfed2cd8dcce5d79826e193981d0b70dc7487772c8a0b3b8d7b1"], - ["6c7913f902aa3f5f939dd1615114ce961beda7c1e0dd195be36a2f0d9d047c28ac62738c3a020000000453abac00ffffffff477bf2c5b5c6733881447ac1ecaff3a6f80d7016eee3513f382ad7f554015b970100000007ab6563acab5152ffffffff04e58fe1040000000009ab00526aabab526553e59790010000000002ab525a834b03000000000035fdaf0200000000086551ac65515200ab00000000", "63ac53", 1, 1285478169, "1536da582a0b6de017862445e91ba14181bd6bf953f4de2f46b040d351a747c9"], - ["4624aa9204584f06a8a325c84e3b108cafb97a387af62dc9eab9afd85ae5e2c71e593a3b690200000003636a005eb2b44eabbaeca6257c442fea00107c80e32e8715a1293cc164a42e62ce14fea146220c020000000090b9ee38106e3310037bfc519fd209bdbd21c588522a0e96df5fba4e979392bc993bfe9f01000000086363636a635353ab6f1907d218ef6f3c729d9200e23c1dbff2df58b8b1282c6717b26cf760ee4c880d23f4d100000000086a516a536a525163ffffffff01d6f162050000000000ebbab208", "525365ab0053", 1, -1515409325, "6cf9cd409b7185b1f118171f0a34217af5b612ea54195ea186505b667c19337f"], - ["16562fc503f1cf9113987040c408bfd4523f1512da699a2ca6ba122dc65677a4c9bf7763830000000003636552ffffffff1ec1fab5ff099d1c8e6b068156f4e39b5543286bab53c6d61e2582d1e07c96cf02000000045163656affffffffd0ef40003524d54c08cb4d13a5ee61c84fbb28cde9eca7a6d11ba3a9335d8c620100000007635153536a6300fbb84fc2012003a601000000000363ab6a00000000", "63636a006a6aab", 0, -1310262675, "1efbf3d37a92bc03d9eb950b792f307e95504f7c4998f668aa250707ebb752ac"], - ["531665d701f86bacbdb881c317ef60d9cd1baeffb2475e57d3b282cd9225e2a3bf9cbe0ded01000000086300ac515263acabffffffff0453a8500100000000086353acab516a6565e5e9200500000000026a52a44caa00000000000453ac000065e41b0500000000076500ac0065526ab4476f4d", "006563006aab00636a", 0, 1770013777, "0898b26dd3ca08632a5131fa48eb55b44386d0c5070c24d6e329673d5e3693b8"], - ["0f1227a20140655a3da36e413b9b5d108a866f6f147eb4940f032f5a89854eae6d7c3a91600100000009525363515153515253e37a79480161ab61020000000001ab00000000", "ab65005200", 0, -1996383599, "979782dc3f36d908d37d7e4046a38d306b4b08ddc60a5eba355fe3d6da1b29a9"], - ["063ff6eb01aff98d0d2a6db224475010edb634c2f3b46257084676adeb84165a4ff8558d7601000000066353006a5165deb3262c042d109c0000000000076363ab52ac005200b9c4050000000007516300ac510063cfffc800000000000200639e815501000000000700526a52ac6365ac7b07b8", "656552abac6500", 0, -1559847112, "674a4bcb04247f8dc98780f1792cac86b8aee41a800fc1e6f5032f6e1dccde65"], - ["3320f6730132f830c4681d0cae542188e4177cad5d526fae84565c60ceb5c0118e844f90bd030000000163ffffffff0257ec5a040000000005525251ac6538344d000000000002515200000000", "5352656a53ac516a65", 0, 788050308, "3afacaca0ef6be9d39e71d7b1b118994f99e4ea5973c9107ca687d28d8eba485"], - ["c13aa4b702eedd7cde09d0416e649a890d40e675aa9b5b6d6912686e20e9b9e10dbd40abb1000000000863ab6353515351ac11d24dc4cc22ded7cdbc13edd3f87bd4b226eda3e4408853a57bcd1becf2df2a1671fd1600000000045165516affffffff01baea300100000000076aab52ab53005300000000", "0065", 0, -1195908377, "241a23e7b1982d5f78917ed97a8678087acbbffe7f624b81df78a5fe5e41e754"], + ["6c7913f902aa3f5f939dd1615114ce961beda7c1e0dd195be36a2f0d9d047c28ac62738c3a020000000453abac00ffffffff477bf2c5b5c6733881447ac1ecaff3a6f80d7016eee3513f382ad7f554015b970100000007ab6563acab5152ffffffff04e58fe1040000000009ab00526aabab526553e59790010000000002ab525a834b03000000000035fdaf0200000000086551ac65515200ab00000000", "63ac53", 1, 1285478169, "ff94797b8b53c0c3d39af28e211bf42ceb35ee392ce3f19bfb34eb2cbb2c1756"], + ["4624aa9204584f06a8a325c84e3b108cafb97a387af62dc9eab9afd85ae5e2c71e593a3b690200000003636a005eb2b44eabbaeca6257c442fea00107c80e32e8715a1293cc164a42e62ce14fea146220c020000000090b9ee38106e3310037bfc519fd209bdbd21c588522a0e96df5fba4e979392bc993bfe9f01000000086363636a635353ab6f1907d218ef6f3c729d9200e23c1dbff2df58b8b1282c6717b26cf760ee4c880d23f4d100000000086a516a536a525163ffffffff01d6f162050000000000ebbab208", "525365ab0053", 1, -1515409325, "9d989d2cb5e01a173a6f950602213c2d202ee5a3212bae0fbee6635818ea3afa"], + ["16562fc503f1cf9113987040c408bfd4523f1512da699a2ca6ba122dc65677a4c9bf7763830000000003636552ffffffff1ec1fab5ff099d1c8e6b068156f4e39b5543286bab53c6d61e2582d1e07c96cf02000000045163656affffffffd0ef40003524d54c08cb4d13a5ee61c84fbb28cde9eca7a6d11ba3a9335d8c620100000007635153536a6300fbb84fc2012003a601000000000363ab6a00000000", "63636a006a6aab", 0, -1310262675, "5e36f68d3cd6c493ea4992fc7451d322bdc6125e67d458d36cfe514742396e62"], + ["531665d701f86bacbdb881c317ef60d9cd1baeffb2475e57d3b282cd9225e2a3bf9cbe0ded01000000086300ac515263acabffffffff0453a8500100000000086353acab516a6565e5e9200500000000026a52a44caa00000000000453ac000065e41b0500000000076500ac0065526ab4476f4d", "006563006aab00636a", 0, 1770013777, "77c116260c8703910069c0702e5378f99bad7025eeedb51a9e784eaf87e1576f"], + ["0f1227a20140655a3da36e413b9b5d108a866f6f147eb4940f032f5a89854eae6d7c3a91600100000009525363515153515253e37a79480161ab61020000000001ab00000000", "ab65005200", 0, -1996383599, "49f3abe02a588e28009ed7661468c05261c99643e7bf0af79449c29c3d18bd12"], + ["063ff6eb01aff98d0d2a6db224475010edb634c2f3b46257084676adeb84165a4ff8558d7601000000066353006a5165deb3262c042d109c0000000000076363ab52ac005200b9c4050000000007516300ac510063cfffc800000000000200639e815501000000000700526a52ac6365ac7b07b8", "656552abac6500", 0, -1559847112, "9f9404c13e60a68f12e38cbbd28994930a9f8448640f323b8a5c401afbc1bdda"], + ["3320f6730132f830c4681d0cae542188e4177cad5d526fae84565c60ceb5c0118e844f90bd030000000163ffffffff0257ec5a040000000005525251ac6538344d000000000002515200000000", "5352656a53ac516a65", 0, 788050308, "4c6d0094aaa8edb62a404f47238cf433a5b49e736b68350e1862fec018ca9c50"], + ["c13aa4b702eedd7cde09d0416e649a890d40e675aa9b5b6d6912686e20e9b9e10dbd40abb1000000000863ab6353515351ac11d24dc4cc22ded7cdbc13edd3f87bd4b226eda3e4408853a57bcd1becf2df2a1671fd1600000000045165516affffffff01baea300100000000076aab52ab53005300000000", "0065", 0, -1195908377, "305a6c22d487fcec7a0164a8887be775a236f9e13d715110a2ebac85faab0aaf"], ["d9a6f20e019dd1b5fae897fb472843903f9c3c2293a0ffb59cff2b413bae6eceab574aaf9d030000000663ab006a515102f54939032df5100100000000056a51ab65530ec28f010000000004ac5100007e874905000000000651005265ac6a00000000", "abacab63acacabab", 0, 271463254, "1326a46f4c21e7619f30a992719a905aa1632aaf481a57e1cbd7d7c22139b41e"], - ["157c81bf0490432b3fcb3f9a5b79e5f91f67f05efb89fa1c8740a3fe7e9bdc18d7cb6acd2203000000026351ffffffff912e48e72bbcf8a540b693cf8b028e532a950e6e63a28801f6eaad1afcc52ad00000000000b1a4b170a2b9e60e0cad88a0085137309f6807d25d5afb5c1e1d32aa10ba1cdf7df596dd0000000009525165656a51ab65ab3674fba32a76fe09b273618d5f14124465933f4190ba4e0fd09d838daafc6223b31642ac00000000086a53536551ac6565ffffffff01fe9fb6030000000008ab51656a5165636a00000000", "ab00ab6a6551", 3, -64357617, "1ddaab7f973551d71f16bd70c4c4edbf7225e64e784a6da0ee7f7a9fe4f12a0b"], - ["a2692fff03b2387f5bacd5640c86ba7df574a0ee9ed7f66f22c73cccaef3907eae791cbd230200000004536363abffffffff4d9fe7e5b375de88ba48925d9b2005447a69ea2e00495a96eafb2f144ad475b40000000008000053000052636537259bee3cedd3dcc07c8f423739690c590dc195274a7d398fa196af37f3e9b4a1413f810000000006ac63acac52abffffffff04c65fe60200000000075151536365ab657236fc020000000009005263ab00656a6a5195b8b6030000000007ac5165636aac6a7d7b66010000000002acab00000000", "51", 2, -826546582, "925037c7dc7625f3f12dc83904755a37016560de8e1cdd153c88270a7201cf15"], - ["2c5b003201b88654ac2d02ff6762446cb5a4af77586f05e65ee5d54680cea13291efcf930d0100000005ab536a006a37423d2504100367000000000004536a515335149800000000000152166aeb03000000000452510063226c8e03000000000000000000", "635251", 0, 1060344799, "7e058ca5dd07640e4aae7dea731cfb7d7fef1bfd0d6d7b6ce109d041f4ca2a31"], + ["157c81bf0490432b3fcb3f9a5b79e5f91f67f05efb89fa1c8740a3fe7e9bdc18d7cb6acd2203000000026351ffffffff912e48e72bbcf8a540b693cf8b028e532a950e6e63a28801f6eaad1afcc52ad00000000000b1a4b170a2b9e60e0cad88a0085137309f6807d25d5afb5c1e1d32aa10ba1cdf7df596dd0000000009525165656a51ab65ab3674fba32a76fe09b273618d5f14124465933f4190ba4e0fd09d838daafc6223b31642ac00000000086a53536551ac6565ffffffff01fe9fb6030000000008ab51656a5165636a00000000", "ab00ab6a6551", 3, -64357617, "ccee25e29ee917500ca42781ac3bb8ab2aeb0089a7f063f5e005665d7303ac88"], + ["a2692fff03b2387f5bacd5640c86ba7df574a0ee9ed7f66f22c73cccaef3907eae791cbd230200000004536363abffffffff4d9fe7e5b375de88ba48925d9b2005447a69ea2e00495a96eafb2f144ad475b40000000008000053000052636537259bee3cedd3dcc07c8f423739690c590dc195274a7d398fa196af37f3e9b4a1413f810000000006ac63acac52abffffffff04c65fe60200000000075151536365ab657236fc020000000009005263ab00656a6a5195b8b6030000000007ac5165636aac6a7d7b66010000000002acab00000000", "51", 2, -826546582, "060c9a7c9295307c2fc4ea5cf0ef1695b7f2e88739ff9bb2d450ccf04fe46073"], + ["2c5b003201b88654ac2d02ff6762446cb5a4af77586f05e65ee5d54680cea13291efcf930d0100000005ab536a006a37423d2504100367000000000004536a515335149800000000000152166aeb03000000000452510063226c8e03000000000000000000", "635251", 0, 1060344799, "a16c2c6da082d122e9d40128aab5b52cd8e38e2260512906dac829172a0374b2"], ["f981b9e104acb93b9a7e2375080f3ea0e7a94ce54cd8fb25c57992fa8042bdf4378572859f0100000002630008604febba7e4837da77084d5d1b81965e0ea0deb6d61278b6be8627b0d9a2ecd7aeb06a0300000005ac5353536a42af3ef15ce7a2cd60482fc0d191c4236e66b4b48c9018d7dbe4db820f5925aad0e8b52a0300000008ab0063510052516301863715efc8608bf69c0343f18fb81a8b0c720898a3563eca8fe630736c0440a179129d03000000086aac6a52ac6a63ac44fec4c00408320a03000000000062c21c030000000007ac6a655263006553835f0100000000015303cd60000000000005535263536558b596e0", "00", 0, -2140385880, "49870a961263354c9baf108c6979b28261f99b374e97605baa532d9fa3848797"], - ["e7416df901269b7af14a13d9d0507709b3cd751f586ce9d5da8d16a121e1bd481f5a086e1103000000056aab005200ffffffff01aa269c040000000006acac6a6a5263ee718de6", "ab525363", 0, 1309186551, "eea7d2212bda2d408fff146f9ae5e85e6b640a93b9362622bb9d5e6e36798389"], - ["402a815902193073625ab13d876190d1bbb72aecb0ea733c3330f2a4c2fe6146f322d8843a0300000008656aab0000535363fffffffff9dccdec5d8509d9297d26dfcb1e789cf02236c77dc4b90ebccbf94d1b5821150300000001510bf1f96a03c5c145000000000002ac6ae11b1c0100000000055163516a5239c8a600000000000365636300000000", "63536aacab", 0, -1811424955, "0090803a20102a778ab967a74532faee13e03b702083b090b1497bc2267ee2fe"], + ["e7416df901269b7af14a13d9d0507709b3cd751f586ce9d5da8d16a121e1bd481f5a086e1103000000056aab005200ffffffff01aa269c040000000006acac6a6a5263ee718de6", "ab525363", 0, 1309186551, "6553374929c642dc99f5ec9b8fac5693831af14934e7b68b7e54ad81cc1c183b"], + ["402a815902193073625ab13d876190d1bbb72aecb0ea733c3330f2a4c2fe6146f322d8843a0300000008656aab0000535363fffffffff9dccdec5d8509d9297d26dfcb1e789cf02236c77dc4b90ebccbf94d1b5821150300000001510bf1f96a03c5c145000000000002ac6ae11b1c0100000000055163516a5239c8a600000000000365636300000000", "63536aacab", 0, -1811424955, "477e0f6042fe38603d0cf98b8e12ffdcec561154e0d1751bfa44d9f0bbc1ea99"], ["c4b702e502f1a54f235224f0e6de961d2e53b506ab45b9a40805d1dacd35148f0acf24ca5e00000000085200ac65ac53acabf34ba6099135658460de9d9b433b84a8562032723635baf21ca1db561dce1c13a06f4407000000000851ac006a63516aabffffffff02a853a603000000000163d17a67030000000005ab63006a5200000000", "ac5363515153", 1, 480734903, "5c46f7ac3d6460af0da28468fcc5b3c87f2b9093d0f837954b7c8174b4d7b6e7"], ["9b83f78704f492b9b353a3faad8d93f688e885030c274856e4037818848b99e490afef27770200000000ffffffff36b60675a5888c0ef4d9e11744ecd90d9fe9e6d8abb4cff5666c898fdce98d9e00000000056aab656352596370fca7a7c139752971e169a1af3e67d7656fc4fc7fd3b98408e607c2f2c836c9f27c030000000653ac51ab6300a0761de7e158947f401b3595b7dc0fe7b75fa9c833d13f1af57b9206e4012de0c41b8124030000000953656a53ab53510052242e5f5601bf83b301000000000465516a6300000000", "63515200ac656365", 3, -150879312, "9cf05990421ea853782e4a2c67118e03434629e7d52ab3f1d55c37cf7d72cdc4"], ["f492a9da04f80b679708c01224f68203d5ea2668b1f442ebba16b1aa4301d2fe5b4e2568f3010000000953005351525263ab65ffffffff93b34c3f37d4a66df255b514419105b56d7d60c24bf395415eda3d3d8aa5cd0101000000020065ffffffff9dba34dabdc4f1643b372b6b77fdf2b482b33ed425914bb4b1a61e4fad33cf390000000002ab52ffffffffbbf3dc82f397ef3ee902c5146c8a80d9a1344fa6e38b7abce0f157be7adaefae0000000009515351005365006a51ffffffff021359ba010000000000403fea0200000000095200ac6353abac635300000000", "00ac51acacac", 0, -2115078404, "fd44fc98639ca32c927929196fc3f3594578f4c4bd248156a25c04a65bf3a9f3"], - ["2f73e0b304f154d3a00fde2fdd40e791295e28d6cb76af9c0fd8547acf3771a02e3a92ba37030000000852ac6351ab6565639aa95467b065cec61b6e7dc4d6192b5536a7c569315fb43f470078b31ed22a55dab8265f02000000080065636a6aab6a53ffffffff9e3addbff52b2aaf9fe49c67017395198a9b71f0aa668c5cb354d06c295a691a0100000000ffffffff45c2b4019abaf05c5e484df982a4a07459204d1343a6ee5badade358141f8f990300000007ac516a6aacac6308655cd601f3bc2f0000000000015200000000", "", 0, -2082053939, "9a95e692e1f78efd3e46bb98f178a1e3a0ef60bd0301d9f064c0e5703dc879c2"], - ["5a60b9b503553f3c099f775db56af3456330f1e44e67355c4ab290d22764b9144a7b5f959003000000030052acbd63e0564decc8659aa53868be48c1bfcda0a8c9857b0db32a217bc8b46d9e7323fe9649020000000553ac6551abd0ecf806211db989bead96c09c7f3ec5f73c1411d3329d47d12f9e46678f09bac0dc383e0200000000ffffffff01494bb202000000000500516551ac00000000", "ac", 0, 1169947809, "62a36c6e8da037202fa8aeae03e533665376d5a4e0a854fc4624a75ec52e4eb1"], + ["2f73e0b304f154d3a00fde2fdd40e791295e28d6cb76af9c0fd8547acf3771a02e3a92ba37030000000852ac6351ab6565639aa95467b065cec61b6e7dc4d6192b5536a7c569315fb43f470078b31ed22a55dab8265f02000000080065636a6aab6a53ffffffff9e3addbff52b2aaf9fe49c67017395198a9b71f0aa668c5cb354d06c295a691a0100000000ffffffff45c2b4019abaf05c5e484df982a4a07459204d1343a6ee5badade358141f8f990300000007ac516a6aacac6308655cd601f3bc2f0000000000015200000000", "", 0, -2082053939, "f95e6fbe828974591ddc255f760f47f9d033446bd95257b4acd7de8a03723304"], + ["5a60b9b503553f3c099f775db56af3456330f1e44e67355c4ab290d22764b9144a7b5f959003000000030052acbd63e0564decc8659aa53868be48c1bfcda0a8c9857b0db32a217bc8b46d9e7323fe9649020000000553ac6551abd0ecf806211db989bead96c09c7f3ec5f73c1411d3329d47d12f9e46678f09bac0dc383e0200000000ffffffff01494bb202000000000500516551ac00000000", "ac", 0, 1169947809, "6111fb04930a7a7fdeb1194dc39f4199c594f4ba725839ea94ee5653b588de72"], ["7e98d353045569c52347ca0ff2fdba608829e744f61eb779ffdb5830aae0e6d6857ab2690e03000000075365acab656352ffffffffa890dd37818776d12da8dca53d02d243ef23b4535c67016f4c58103eed85360f030000000093dbacdc25ca65d2951e047d6102c4a7da5e37f3d5e3c8b87c29b489360725dcd117ee2003000000056a6300ac53c7e99fa1dc2b8b51733034e6555f6d6de47dbbf1026effac7db80cb2080678687380dc1e02000000075352005263516affffffff04423272040000000008ab6353ab65510051e0f53b0500000000086300516552635152f74a5f04000000000853acab0053ab52ab0e8e5f00000000000951ac5363516a6aabab00000000", "6a5163ab52", 3, 890006103, "476868cecd1763c91dade98f17defa42d31049547df45acffa1cc5ae5c3d75d6"], - ["e3649aa40405e6ffe377dbb1bbbb672a40d8424c430fa6512c6165273a2b9b6afa9949ec430200000007630052ab655153a365f62f2792fa90c784efe3f0981134d72aac0b1e1578097132c7f0406671457c332b84020000000353ab6ad780f40cf51be22bb4ff755434779c7f1def4999e4f289d2bd23d142f36b66fbe5cfbb4b01000000076a5252abac52ab1430ffdc67127c9c0fc97dcd4b578dab64f4fb9550d2b59d599773962077a563e8b6732c02000000016affffffff04cb2687000000000002ab636e320904000000000252acf70e9401000000000100dc3393050000000006ab0063536aacbc231765", "65520053", 3, -2016196547, "f64f805f0ff7f237359fa6b0e58085f3c766d1859003332223444fd29144112a"], - ["1d033569040700441686672832b531ab55db89b50dc1f9fc00fb72218b652da9dcfbc83be901000000066551ac526a632b390f9ad068e5fdee6563e88e2a8e4e09763c861072713dc069893dc6bbc9db3f00e26502000000096a5363526565525252ffffffff8a36bdd0aaf38f6707592d203e14476ca9f259021e487135c7e8324244057ed90300000000ed3fb2a3dfd4d46b5f3603fe0148653911988457bd0ed7f742b07c452f5476c228ff9f600200000007526aac00525152ffffffff04b88e48030000000000c753d602000000000853510000006553518fda2603000000000853ac52acac5263534839f1030000000006ac006aacac5300000000", "516553635300ab0052", 1, 2075958316, "c2cefaec2293134acbcf6d2a8bf2b3eb42e4ec04ee8f8bf30ff23e65680677c1"], - ["4c4be7540344050e3044f0f1d628039a334a7c1f7b4573469cfea46101d6888bb6161fe9710200000000ffffffffac85a4fdad641d8e28523f78cf5b0f4dc74e6c5d903c10b358dd13a5a1fd8a06000000000163e0ae75d05616b72467b691dc207fe2e65ea35e2eadb7e06ea442b2adb9715f212c0924f10200000000ffffffff0194ddfe02000000000265ac00000000", "00006500", 1, -479922562, "d66924d49f03a6960d3ca479f3415d638c45889ce9ab05e25b65ac260b51d634"], - ["202c18eb012bc0a987e69e205aea63f0f0c089f96dd8f0e9fcde199f2f37892b1d4e6da90302000000055352ac6565ffffffff0257e5450100000000025300ad257203000000000000000000", "520052ac6a005265", 0, 168054797, "502967a6f999f7ee25610a443caf8653dda288e6d644a77537bcc115a8a29894"], + ["e3649aa40405e6ffe377dbb1bbbb672a40d8424c430fa6512c6165273a2b9b6afa9949ec430200000007630052ab655153a365f62f2792fa90c784efe3f0981134d72aac0b1e1578097132c7f0406671457c332b84020000000353ab6ad780f40cf51be22bb4ff755434779c7f1def4999e4f289d2bd23d142f36b66fbe5cfbb4b01000000076a5252abac52ab1430ffdc67127c9c0fc97dcd4b578dab64f4fb9550d2b59d599773962077a563e8b6732c02000000016affffffff04cb2687000000000002ab636e320904000000000252acf70e9401000000000100dc3393050000000006ab0063536aacbc231765", "65520053", 3, -2016196547, "8c7f4c5f488b7d5237374196cdb86ea1ebb824b93e67205e1fa5df6472bc7bf2"], + ["1d033569040700441686672832b531ab55db89b50dc1f9fc00fb72218b652da9dcfbc83be901000000066551ac526a632b390f9ad068e5fdee6563e88e2a8e4e09763c861072713dc069893dc6bbc9db3f00e26502000000096a5363526565525252ffffffff8a36bdd0aaf38f6707592d203e14476ca9f259021e487135c7e8324244057ed90300000000ed3fb2a3dfd4d46b5f3603fe0148653911988457bd0ed7f742b07c452f5476c228ff9f600200000007526aac00525152ffffffff04b88e48030000000000c753d602000000000853510000006553518fda2603000000000853ac52acac5263534839f1030000000006ac006aacac5300000000", "516553635300ab0052", 1, 2075958316, "c75b0bbafe92c01294c9cbfb8380de6732f665ca58b967338b27600e68127f30"], + ["4c4be7540344050e3044f0f1d628039a334a7c1f7b4573469cfea46101d6888bb6161fe9710200000000ffffffffac85a4fdad641d8e28523f78cf5b0f4dc74e6c5d903c10b358dd13a5a1fd8a06000000000163e0ae75d05616b72467b691dc207fe2e65ea35e2eadb7e06ea442b2adb9715f212c0924f10200000000ffffffff0194ddfe02000000000265ac00000000", "00006500", 1, -479922562, "61b2673a3506e4a80120e980fa5e98d5aaa2adc20a8680aa7bb1859aa4d70515"], + ["202c18eb012bc0a987e69e205aea63f0f0c089f96dd8f0e9fcde199f2f37892b1d4e6da90302000000055352ac6565ffffffff0257e5450100000000025300ad257203000000000000000000", "520052ac6a005265", 0, 168054797, "bdf7403b0c72d0f349faec315abb233d376b3dabb570e330bb6496bad34c9875"], ["32fa0b0804e6ea101e137665a041cc2350b794e59bf42d9b09088b01cde806ec1bbea077df0200000008515153650000006506a11c55904258fa418e57b88b12724b81153260d3f4c9f080439789a391ab147aabb0fa0000000007000052ac51ab510986f2a15c0d5e05d20dc876dd2dafa435276d53da7b47c393f20900e55f163b97ce0b800000000008ab526a520065636a8087df7d4d9c985fb42308fb09dce704650719140aa6050e8955fa5d2ea46b464a333f870000000009636300636a6565006affffffff01994a0d040000000002536500000000", "516563530065", 2, -163068286, "f58637277d2bc42e18358dc55f7e87e7043f5e33f4ce1fc974e715ef0d3d1c2a"], - ["ae23424d040cd884ebfb9a815d8f17176980ab8015285e03fdde899449f4ae71e04275e9a80100000007ab006553530053ffffffff018e06db6af519dadc5280c07791c0fd33251500955e43fe4ac747a4df5c54df020000000251ac330e977c0fec6149a1768e0d312fdb53ed9953a3737d7b5d06aad4d86e9970346a4feeb5030000000951ab51ac6563ab526a67cabc431ee3d8111224d5ecdbb7d717aa8fe82ce4a63842c9bd1aa848f111910e5ae1eb0100000004ac515300bfb7e0d7048acddc030000000009636a5253636a655363a3428e040000000001525b99c6050000000004655265ab717e6e020000000000d99011eb", "ac6a6a516565", 1, -716251549, "b098eb9aff1bbd375c70a0cbb9497882ab51f3abfebbf4e1f8d74c0739dc7717"], - ["030f44fc01b4a9267335a95677bd190c1c12655e64df74addc53b753641259af1a54146baa020000000152e004b56c04ba11780300000000026a53f125f001000000000251acd2cc7c03000000000763536563655363c9b9e50500000000015200000000", "ac", 0, -1351818298, "19dd32190ed2a37be22f0224a9b55b91e37290577c6c346d36d32774db0219a3"], - ["c05f448f02817740b30652c5681a3b128322f9dc97d166bd4402d39c37c0b14506d8adb5890300000003536353ffffffffa188b430357055ba291c648f951cd2f9b28a2e76353bef391b71a889ba68d5fc02000000056565526a6affffffff02745f73010000000001ab3ec34c0400000000036aac5200000000", "516551510053", 0, -267877178, "3a1c6742d4c374f061b1ebe330b1e169a113a19792a1fdde979b53e094cc4a3c"], - ["163ba45703dd8c2c5a1c1f8b806afdc710a2a8fc40c0138e2d83e329e0e02a9b6c837ff6b8000000000700655151ab6a522b48b8f134eb1a7e6f5a6fa319ce9d11b36327ba427b7d65ead3b4a6a69f85cda8bbcd22030000000563656552acffffffffdbcf4955232bd11eef0cc6954f3f6279675b2956b9bcc24f08c360894027a60201000000066500006500abffffffff04d0ce9d0200000000008380650000000000015233f360040000000003006aabedcf0801000000000000000000", "000065006500ac", 0, 216965323, "9afe3f4978df6a86e9a8ebd62ef6a9d48a2203f02629349f1864ef2b8b92fd55"], + ["ae23424d040cd884ebfb9a815d8f17176980ab8015285e03fdde899449f4ae71e04275e9a80100000007ab006553530053ffffffff018e06db6af519dadc5280c07791c0fd33251500955e43fe4ac747a4df5c54df020000000251ac330e977c0fec6149a1768e0d312fdb53ed9953a3737d7b5d06aad4d86e9970346a4feeb5030000000951ab51ac6563ab526a67cabc431ee3d8111224d5ecdbb7d717aa8fe82ce4a63842c9bd1aa848f111910e5ae1eb0100000004ac515300bfb7e0d7048acddc030000000009636a5253636a655363a3428e040000000001525b99c6050000000004655265ab717e6e020000000000d99011eb", "ac6a6a516565", 1, -716251549, "425e40ec2ea15d0acc3d30b2744add2df430459ad2e39a35ce090b664d85ecc5"], + ["030f44fc01b4a9267335a95677bd190c1c12655e64df74addc53b753641259af1a54146baa020000000152e004b56c04ba11780300000000026a53f125f001000000000251acd2cc7c03000000000763536563655363c9b9e50500000000015200000000", "ac", 0, -1351818298, "4255e335b4a52484dc8e341e460141e2cd55782f4a38d32b150c3f74de080c0f"], + ["c05f448f02817740b30652c5681a3b128322f9dc97d166bd4402d39c37c0b14506d8adb5890300000003536353ffffffffa188b430357055ba291c648f951cd2f9b28a2e76353bef391b71a889ba68d5fc02000000056565526a6affffffff02745f73010000000001ab3ec34c0400000000036aac5200000000", "516551510053", 0, -267877178, "8be6dc2c76fe09ff63ab831907e1f33e1aef9f92bcd9605a8b31401e106b914b"], + ["163ba45703dd8c2c5a1c1f8b806afdc710a2a8fc40c0138e2d83e329e0e02a9b6c837ff6b8000000000700655151ab6a522b48b8f134eb1a7e6f5a6fa319ce9d11b36327ba427b7d65ead3b4a6a69f85cda8bbcd22030000000563656552acffffffffdbcf4955232bd11eef0cc6954f3f6279675b2956b9bcc24f08c360894027a60201000000066500006500abffffffff04d0ce9d0200000000008380650000000000015233f360040000000003006aabedcf0801000000000000000000", "000065006500ac", 0, 216965323, "4a10da1495eb3e3b5ecb475c829c025260ec0eb51a2ccef12120d9d1fc1c42be"], ["07f7f5530453a12ad0c7eb8fbc3f140c7ab6818144d67d2d8752600ca5d9a9358e2dff87d4000000000663526aab526a9e599c379d455e2da36d0cde88d931a863a3e97e01e93b9edb65856f3d958dc08b92b720000000000165bbc8d66dae3b1b170a6e2457f5b161465cb8706e0e6ffc6af55deb918365f14c5f40d4890100000000a7bd77c069ee4b48638e2363fcf2a86b02bea022047bd9fcb16d2b94ad068308d19b31cb00000000066aab5300ab529672aa8f01dbd8a205000000000663536353006a02e99901", "ac006351006a63ab63", 1, 119789359, "6629a1e75c6ae8f4f9d5f734246b6a71682a5ea57246040ef0584f6b97916175"], - ["fe647f950311bf8f3a4d90afd7517df306e04a344d2b2a2fea368935faf11fa6882505890d0000000005ab5100516affffffff43c140947d9778718919c49c0535667fc6cc727f5876851cb8f7b6460710c7f60100000000ffffffffce4aa5d90d7ab93cbec2e9626a435afcf2a68dd693c15b0e1ece81a9fcbe025e0300000000ffffffff02f34806020000000002515262e54403000000000965635151ac655363636de5ce24", "6a005100ac516351", 2, 989643518, "818a7ceaf963f52b5c48a7f01681ac6653c26b63a9f491856f090d9d60f2ffe3"], - ["a1050f8604d0f9d2feefcdb5051ae0052f38e21bf39daf583fd0c3900faa3eab5d431c0bbe030000000653536a005151683d27e5c6e0da8f22125823f32d5d98477d8098ef36263b9694d61d4d85d3f2ac02b7570200000007000052005165abffffffff0cad981542bcb54a87d9400aa63e514c7c6fab7158c2b1fb37821ea755eb162a0200000000b94feb5100e5ef3bf8ed8d43356c8a8d5ac6c7e80d7ff6040f4f0aa19abbe783f4f461240200000007636500000052655686fd70042be3ad02000000000465ab636a15680b000000000004acac53511277c705000000000452635252d27a0102000000000000000000", "6a6aacab65655251", 1, -982144648, "dfcf484111801989eb6df8dc2bafb944d7365ffeb36a575a08f3270d3ef24c9f"], + ["fe647f950311bf8f3a4d90afd7517df306e04a344d2b2a2fea368935faf11fa6882505890d0000000005ab5100516affffffff43c140947d9778718919c49c0535667fc6cc727f5876851cb8f7b6460710c7f60100000000ffffffffce4aa5d90d7ab93cbec2e9626a435afcf2a68dd693c15b0e1ece81a9fcbe025e0300000000ffffffff02f34806020000000002515262e54403000000000965635151ac655363636de5ce24", "6a005100ac516351", 2, 989643518, "b5f47e5dd072e4bc6679455ad66b687bb79d49e138ebdf2adbbc1d73476d160f"], + ["a1050f8604d0f9d2feefcdb5051ae0052f38e21bf39daf583fd0c3900faa3eab5d431c0bbe030000000653536a005151683d27e5c6e0da8f22125823f32d5d98477d8098ef36263b9694d61d4d85d3f2ac02b7570200000007000052005165abffffffff0cad981542bcb54a87d9400aa63e514c7c6fab7158c2b1fb37821ea755eb162a0200000000b94feb5100e5ef3bf8ed8d43356c8a8d5ac6c7e80d7ff6040f4f0aa19abbe783f4f461240200000007636500000052655686fd70042be3ad02000000000465ab636a15680b000000000004acac53511277c705000000000452635252d27a0102000000000000000000", "6a6aacab65655251", 1, -982144648, "d61f5f7ec31a030036af80c45d0b2d977892dcffbfa3654ee7450f82e29b10f0"], ["cef7316804c3e77fe67fc6207a1ea6ae6eb06b3bf1b3a4010a45ae5c7ad677bb8a4ebd16d90200000009ac536a5152ac5263005301ab8a0da2b3e0654d31a30264f9356ba1851c820a403be2948d35cafc7f9fe67a06960300000006526a63636a53ffffffffbada0d85465199fa4232c6e4222df790470c5b7afd54704595a48eedd7a4916b030000000865ab63ac006a006ab28dba4ad55e58b5375053f78b8cdf4879f723ea4068aed3dd4138766cb4d80aab0aff3d0300000003ac6a00ffffffff010f5dd6010000000006ab006aab51ab00000000", "", 1, 889284257, "d0f32a6db43378af84b063a6706d614e2d647031cf066997c48c04de3b493a94"], - ["7b3ff28004ba3c7590ed6e36f45453ebb3f16636fe716acb2418bb2963df596a50ed954d2e03000000065251515265abffffffff706ee16e32e22179400c9841013971645dabf63a3a6d2d5feb42f83aa468983e030000000653ac51ac5152ffffffffa03a16e5e5de65dfa848b9a64ee8bf8656cc1f96b06a15d35bd5f3d32629876e020000000043c1a3965448b3b46f0f0689f1368f3b2981208a368ec5c30defb35595ef9cf95ffd10e902000000036aac65253a5bbe042e907204000000000800006565656352634203b4020000000002656336b3b7010000000001ab7a063f0100000000026500a233cb76", "006551636a53ac5251", 1, -1144216171, "68c7bd717b399b1ee33a6562a916825a2fed3019cdf4920418bb72ffd7403c8c"], + ["7b3ff28004ba3c7590ed6e36f45453ebb3f16636fe716acb2418bb2963df596a50ed954d2e03000000065251515265abffffffff706ee16e32e22179400c9841013971645dabf63a3a6d2d5feb42f83aa468983e030000000653ac51ac5152ffffffffa03a16e5e5de65dfa848b9a64ee8bf8656cc1f96b06a15d35bd5f3d32629876e020000000043c1a3965448b3b46f0f0689f1368f3b2981208a368ec5c30defb35595ef9cf95ffd10e902000000036aac65253a5bbe042e907204000000000800006565656352634203b4020000000002656336b3b7010000000001ab7a063f0100000000026500a233cb76", "006551636a53ac5251", 1, -1144216171, "e3b49f393e2a7095b775d61360d3b72ae30badeb92df1d1e1ccb37a9d6ef9b8a"], ["d5c1b16f0248c60a3ddccf7ebd1b3f260360bbdf2230577d1c236891a1993725e262e1b6cb000000000363636affffffff0a32362cfe68d25b243a015fc9aa172ea9c6b087c9e231474bb01824fd6bd8bc0300000005ab52ab516affffffff0420d9a70200000000045152656a45765d0000000000055252536a5277bad100000000000252ab3f3f3803000000000463acac5200000000", "52636a52ab65", 1, 1305123906, "978dc178ecd03d403b048213d904653979d11c51730381c96c4208e3ea24243a"], ["1be8ee5604a9937ebecffc832155d9ba7860d0ca451eaced58ca3688945a31d93420c27c460100000006abac5300535288b65458af2f17cbbf7c5fbcdcfb334ffd84c1510d5500dc7d25a43c36679b702e850f7c0200000003005300ffffffff7c237281cb859653eb5bb0a66dbb7aeb2ac11d99ba9ed0f12c766a8ae2a2157203000000086aabac526365acabfffffffff09d3d6639849f442a6a52ad10a5d0e4cb1f4a6b22a98a8f442f60280c9e5be80200000007ab00ab6565ab52ffffffff0398fe83030000000005526aababacbdd6ec010000000005535252ab6a82c1e6040000000001652b71c40c", "6563526353656351", 2, -853634888, "0d936cceda2f56c7bb87d90a7b508f6208577014ff280910a710580357df25f3"], - ["9e0f99c504fbca858c209c6d9371ddd78985be1ab52845db0720af9ae5e2664d352f5037d4010000000552ac53636affffffff0e0ce866bc3f5b0a49748f597c18fa47a2483b8a94cef1d7295d9a5d36d31ae7030000000663515263ac635bb5d1698325164cdd3f7f3f7831635a3588f26d47cc30bf0fefd56cd87dc4e84f162ab702000000036a6365ffffffff85c2b1a61de4bcbd1d5332d5f59f338dd5e8accbc466fd860f96eef1f54c28ec030000000165ffffffff04f5cabd010000000007000052ac526563c18f1502000000000465510051dc9157050000000008655363ac525253ac506bb600000000000865656a53ab63006a00000000", "006a6a0052", 0, 1186324483, "2f9b7348600336512686e7271c53015d1cb096ab1a5e0bce49acd35bceb42bc8"], + ["9e0f99c504fbca858c209c6d9371ddd78985be1ab52845db0720af9ae5e2664d352f5037d4010000000552ac53636affffffff0e0ce866bc3f5b0a49748f597c18fa47a2483b8a94cef1d7295d9a5d36d31ae7030000000663515263ac635bb5d1698325164cdd3f7f3f7831635a3588f26d47cc30bf0fefd56cd87dc4e84f162ab702000000036a6365ffffffff85c2b1a61de4bcbd1d5332d5f59f338dd5e8accbc466fd860f96eef1f54c28ec030000000165ffffffff04f5cabd010000000007000052ac526563c18f1502000000000465510051dc9157050000000008655363ac525253ac506bb600000000000865656a53ab63006a00000000", "006a6a0052", 0, 1186324483, "4e17ecf9015a73c8b902790941cdd6976de553f865c8151a2f59fcaa4476f81d"], ["11ce51f90164b4b54b9278f0337d95c50d16f6828fcb641df9c7a041a2b274aa70b1250f2b0000000008ab6a6a65006551524c9fe7f604af44be050000000005525365006521f79a0300000000015306bb4e04000000000265ac99611a05000000000765acab656500006dc866d0", "", 0, -1710478768, "cfa4b7573559b3b199478880c8013fa713ca81ca8754a3fd68a6d7ee6147dc5a"], ["86bc233e02ba3c647e356558e7252481a7769491fb46e883dd547a4ce9898fc9a1ca1b77790000000006ab5351abab51f0c1d09c37696d5c7c257788f5dff5583f4700687bcb7d4acfb48521dc953659e325fa390300000003acac5280f29523027225af03000000000963abac0065ab65acab7e59d90400000000016549dac846", "53006aac52acac", 0, 711159875, "880330ccde00991503ea598a6dfd81135c6cda9d317820352781417f89134d85"], ["beac155d03a853bf18cd5c490bb2a245b3b2a501a3ce5967945b0bf388fec2ba9f04c03d68030000000012fe96283aec4d3aafed8f888b0f1534bd903f9cd1af86a7e64006a2fa0d2d30711af770010000000163ffffffffd963a19d19a292104b9021c535d3e302925543fb3b5ed39fb2124ee23a9db00302000000056500ac63acffffffff01ad67f503000000000300ac5189f78db2", "53536a636500", 2, 748992863, "bde3dd0575164d7ece3b5783ce0783ffddb7df98f178fe6468683230314f285a"], ["81dab34a039c9e225ba8ef421ec8e0e9d46b5172e892058a9ade579fe0eb239f7d9c97d45b0300000009ac65655351ab526363ffffffff10c0faaf7f597fc8b00bbc67c3fd4c6b70ca6b22718d15946bf6b032e62dae570000000005536a00ab6a02cddec3acf985bbe62c96fccf17012a87026ed63fc6756fa39e286eb4c2dd79b59d37400300000002516affffffff04f18b8d03000000000753abab5152636564411c02000000000400ab6300e965750300000000001bd2cf02000000000565ab526aab00000000", "006551ab", 0, -1488174485, "a3d65a8cd0c1eea8558d01396b929520a2221c29d9f25f29035b8abae874447f"], ["489ebbf10478e260ba88c0168bd7509a651b36aaee983e400c7063da39c93bf28100011f280100000004abab63ab2fc856f05f59b257a4445253e0d91b6dffe32302d520ac8e7f6f2467f7f6b4b65f2f59e903000000096353abacab6351656affffffff0122d9480db6c45a2c6fd68b7bc57246edffbf6330c39ccd36aa3aa45ec108fc030000000265ab9a7e78a69aadd6b030b12602dff0739bbc346b466c7c0129b34f50ae1f61e634e11e9f3d0000000006516a53525100ffffffff011271070000000000086563ab6353536352c4dd0e2c", "", 0, -293358504, "4eba3055bc2b58765593ec6e11775cea4b6493d8f785e28d01e2d5470ea71575"], - ["6911195d04f449e8eade3bc49fd09b6fb4b7b7ec86529918b8593a9f6c34c2f2d301ec378b000000000263ab49162266af054643505b572c24ff6f8e4c920e601b23b3c42095881857d00caf56b28acd030000000565525200ac3ac4d24cb59ee8cfec0950312dcdcc14d1b360ab343e834004a5628d629642422f3c5acc02000000035100accf99b663e3c74787aba1272129a34130668a877cc6516bfb7574af9fa6d07f9b4197303400000000085351ab5152635252ffffffff042b3c95000000000000ff92330200000000046a5252ab884a2402000000000853530065520063000d78be03000000000953abab52ab53ac65aba72cb34b", "6a", 2, -637739405, "6b80d74eb0e7ee59d14f06f30ba7d72a48d3a8ff2d68d3b99e770dec23e9284f"], - ["746347cf03faa548f4c0b9d2bd96504d2e780292730f690bf0475b188493fb67ca58dcca4f0000000002005336e3521bfb94c254058e852a32fc4cf50d99f9cc7215f7c632b251922104f638aa0b9d080100000008656aac5351635251ffffffff4da22a678bb5bb3ad1a29f97f6f7e5b5de11bb80bcf2f7bb96b67b9f1ac44d09030000000365ababffffffff036f02b30000000000076353ab6aac63ac50b72a050000000002acaba8abf804000000000663006a6a6353797eb999", "acac5100", 1, -1484493812, "164c32a263f357e385bd744619b91c3f9e3ce6c256d6a827d6defcbdff38fa75"], - ["e17149010239dd33f847bf1f57896db60e955117d8cf013e7553fae6baa9acd3d0f1412ad90200000006516500516500cb7b32a8a67d58dddfb6ceb5897e75ef1c1ff812d8cd73875856487826dec4a4e2d2422a0100000004ac525365196dbb69039229270400000000070000535351636a8b7596020000000006ab51ac52655131e99d040000000003516551ee437f5c", "ac656a53", 1, 1102662601, "8858bb47a042243f369f27d9ab4a9cd6216adeac1c1ac413ed0890e46f23d3f3"], - ["144971940223597a2d1dec49c7d4ec557e4f4bd207428618bafa3c96c411752d494249e1fb0100000004526a5151ffffffff340a545b1080d4f7e2225ff1c9831f283a7d4ca4d3d0a29d12e07d86d6826f7f0200000003006553ffffffff03c36965000000000000dfa9af00000000000451636aac7f7d140300000000016300000000", "", 1, -108117779, "c84fcaf9d779df736a26cc3cabd04d0e61150d4d5472dd5358d6626e610be57f"], - ["b11b6752044e650b9c4744fb9c930819227d2ac4040d8c91a133080e090b042a142e93906e0000000003650053ffffffff6b9ce7e29550d3c1676b702e5e1537567354b002c8b7bb3d3535e63ad03b50ea01000000055100516300fffffffffcf7b252fea3ad5a108af3640a9bc2cd724a7a3ce22a760fba95496e88e2f2e801000000036a00ac7c58df5efba193d33d9549547f6ca839f93e14fa0e111f780c28c60cc938f785b363941b000000000863ab51516552ac5265e51fcd0308e9830400000000036a00abab72190300000000016a63d0710000000000050051ab6a6300000000", "53005165ac51ab65", 0, 229563932, "e562579d1a2b10d1c5e45c06513456002a6bec157d7eb42511d30b118103c052"], + ["6911195d04f449e8eade3bc49fd09b6fb4b7b7ec86529918b8593a9f6c34c2f2d301ec378b000000000263ab49162266af054643505b572c24ff6f8e4c920e601b23b3c42095881857d00caf56b28acd030000000565525200ac3ac4d24cb59ee8cfec0950312dcdcc14d1b360ab343e834004a5628d629642422f3c5acc02000000035100accf99b663e3c74787aba1272129a34130668a877cc6516bfb7574af9fa6d07f9b4197303400000000085351ab5152635252ffffffff042b3c95000000000000ff92330200000000046a5252ab884a2402000000000853530065520063000d78be03000000000953abab52ab53ac65aba72cb34b", "6a", 2, -637739405, "f6d02ade3fa7359cb2e470c0c0f86b2d293ee94f38239998cff0330fd76de34d"], + ["746347cf03faa548f4c0b9d2bd96504d2e780292730f690bf0475b188493fb67ca58dcca4f0000000002005336e3521bfb94c254058e852a32fc4cf50d99f9cc7215f7c632b251922104f638aa0b9d080100000008656aac5351635251ffffffff4da22a678bb5bb3ad1a29f97f6f7e5b5de11bb80bcf2f7bb96b67b9f1ac44d09030000000365ababffffffff036f02b30000000000076353ab6aac63ac50b72a050000000002acaba8abf804000000000663006a6a6353797eb999", "acac5100", 1, -1484493812, "b9991f55e69f67bb816a2c1e9976e29063ea7da4f9498f98170121b3df04d40c"], + ["e17149010239dd33f847bf1f57896db60e955117d8cf013e7553fae6baa9acd3d0f1412ad90200000006516500516500cb7b32a8a67d58dddfb6ceb5897e75ef1c1ff812d8cd73875856487826dec4a4e2d2422a0100000004ac525365196dbb69039229270400000000070000535351636a8b7596020000000006ab51ac52655131e99d040000000003516551ee437f5c", "ac656a53", 1, 1102662601, "6ce14ddc4ac4b84cb42c33a0d9c610c69b1b4f2af6c65fafa0047342aa00b7fd"], + ["144971940223597a2d1dec49c7d4ec557e4f4bd207428618bafa3c96c411752d494249e1fb0100000004526a5151ffffffff340a545b1080d4f7e2225ff1c9831f283a7d4ca4d3d0a29d12e07d86d6826f7f0200000003006553ffffffff03c36965000000000000dfa9af00000000000451636aac7f7d140300000000016300000000", "", 1, -108117779, "207e90c486997578c173f97eedfa866608f996874dc34d711bab9dd505a6fb3a"], + ["b11b6752044e650b9c4744fb9c930819227d2ac4040d8c91a133080e090b042a142e93906e0000000003650053ffffffff6b9ce7e29550d3c1676b702e5e1537567354b002c8b7bb3d3535e63ad03b50ea01000000055100516300fffffffffcf7b252fea3ad5a108af3640a9bc2cd724a7a3ce22a760fba95496e88e2f2e801000000036a00ac7c58df5efba193d33d9549547f6ca839f93e14fa0e111f780c28c60cc938f785b363941b000000000863ab51516552ac5265e51fcd0308e9830400000000036a00abab72190300000000016a63d0710000000000050051ab6a6300000000", "53005165ac51ab65", 0, 229563932, "5edf83aa44952076fa9e622290b8ca234475b5261eaa7e8db57e7e1d8df07dde"], ["2aee6b9a02172a8288e02fac654520c9dd9ab93cf514d73163701f4788b4caeeb9297d2e250300000004ab6363008fb36695528d7482710ea2926412f877a3b20acae31e9d3091406bfa6b62ebf9d9d2a6470100000009535165536a63520065ffffffff03f7b560050000000003acab6a9a8338050000000000206ce90000000000056552516a5100000000", "5252", 1, -1102319963, "fa4676c374ae3a417124b4c970d1ed3319dc3ac91fb36efca1aa9ed981a8aa1b"], - ["9554595203ad5d687f34474685425c1919e3d2cd05cf2dac89d5f33cd3963e5bb43f8706480100000000ffffffff9de2539c2fe3000d59afbd376cb46cefa8bd01dbc43938ff6089b63d68acdc2b02000000096553655251536a6500fffffffff9695e4016cd4dfeb5f7dadf00968e6a409ef048f81922cec231efed4ac78f5d010000000763abab6a5365006caaf0070162cc640200000000045163ab5100000000", "", 0, -1105256289, "e8e10ed162b1a43bfd23bd06b74a6c2f138b8dc1ab094ffb2fa11d5b22869bee"], + ["9554595203ad5d687f34474685425c1919e3d2cd05cf2dac89d5f33cd3963e5bb43f8706480100000000ffffffff9de2539c2fe3000d59afbd376cb46cefa8bd01dbc43938ff6089b63d68acdc2b02000000096553655251536a6500fffffffff9695e4016cd4dfeb5f7dadf00968e6a409ef048f81922cec231efed4ac78f5d010000000763abab6a5365006caaf0070162cc640200000000045163ab5100000000", "", 0, -1105256289, "8a6f88686c6508046545cad2439a3a1d6e50c495c8044b2684dac0dd808f8c7e"], ["04f51f2a0484cba53d63de1cb0efdcb222999cdf2dd9d19b3542a896ca96e23a643dfc45f00200000007acac53510063002b091fd0bfc0cfb386edf7b9e694f1927d7a3cf4e1d2ce937c1e01610313729ef6419ae7030000000165a3372a913c59b8b3da458335dc1714805c0db98992fd0d93f16a7f28c55dc747fe66a5b503000000095351ab65ab52536351ffffffff5650b318b3e236802a4e41ed9bc0a19c32b7aa3f9b2cda1178f84499963a0cde000000000165ffffffff0383954f04000000000553ac536363a8fc90030000000000a2e315000000000005acab00ab5100000000", "0053", 2, -1424653648, "a5bc0356f56b2b41a2314ec05bee7b91ef57f1074bcd2efc4da442222269d1a3"], - ["5e4fab42024a27f0544fe11abc781f46596f75086730be9d16ce948b04cc36f86db7ad50fd01000000026a00613330f4916285b5305cc2d3de6f0293946aa6362fc087727e5203e558c676b314ef8dd401000000001af590d202ba496f040000000001009e3c9604000000000351ac51943d64d3", "51acabab5100ab52", 1, -129301207, "556c3f90aa81f9b4df5b92a23399fe6432cf8fecf7bba66fd8fdb0246440036c"], - ["a115284704b88b45a5f060af429a3a8eab10b26b7c15ed421258f5320fa22f4882817d6c2b0300000003005300ffffffff4162f4d738e973e5d26991452769b2e1be4b2b5b7e8cbeab79b9cf9df2882c040000000006636aac63ac5194abc8aa22f8ddc8a7ab102a58e39671683d1891799d19bd1308d24ea6d365e571172f1e030000000700515352515153ffffffff4da7ad75ce6d8541acbb0226e9818a1784e9c97c54b7d1ff82f791df1c6578f60000000000ffffffff01b1f265040000000009ab0051ac656a516a5300000000", "51abab6352535265", 0, -1269106800, "0ef7b6e87c782fa33fe109aab157a2d9cddc4472864f629510a1c92fa1fe7fc1"], + ["5e4fab42024a27f0544fe11abc781f46596f75086730be9d16ce948b04cc36f86db7ad50fd01000000026a00613330f4916285b5305cc2d3de6f0293946aa6362fc087727e5203e558c676b314ef8dd401000000001af590d202ba496f040000000001009e3c9604000000000351ac51943d64d3", "51acabab5100ab52", 1, -129301207, "0949062eb1717274dd4ae68f870d9c96891d36cf73dc7b909ade5900f12c3492"], + ["a115284704b88b45a5f060af429a3a8eab10b26b7c15ed421258f5320fa22f4882817d6c2b0300000003005300ffffffff4162f4d738e973e5d26991452769b2e1be4b2b5b7e8cbeab79b9cf9df2882c040000000006636aac63ac5194abc8aa22f8ddc8a7ab102a58e39671683d1891799d19bd1308d24ea6d365e571172f1e030000000700515352515153ffffffff4da7ad75ce6d8541acbb0226e9818a1784e9c97c54b7d1ff82f791df1c6578f60000000000ffffffff01b1f265040000000009ab0051ac656a516a5300000000", "51abab6352535265", 0, -1269106800, "f0ab68e484291fa58ec9e57d1b37b2566ac61f207e0c4360d0691360372fc917"], ["f3f771ae02939752bfe309d6c652c0d271b7cab14107e98032f269d92b2a8c8853ab057da8010000000563ab6a6365670c305c38f458e30a7c0ab45ee9abd9a8dc03bae1860f965ffced879cb2e5d0bb156821020000000153ffffffff025dc619050000000002ac51ec0d250100000000076a5200636a6363333aecd8", "650053ac515100ab", 1, 1812404608, "a7aa34bf8a5644f03c6dd8801f9b15ba2e07e07256dbf1e02dad59f0d3e17ea9"], - ["fd3e267203ae7d6d3975e738ca84f12540229bb237dd228d5f688e9d5ba53fce4302b0334d01000000026353ffffffff602a3ab75af7aa951d93093e345ef0037a2863f3f580a9b1a575fffe68e677450300000000239e476d1e8f81e8b6313880d8a49b27c1b00af467f29756e76f675f084a5676539636ab030000000765ab6351acac52d9217747044d773204000000000752ac51526353acc33e45050000000005516500005115d889040000000004ab5163510cbbbd0200000000016500000000", "65ac526aac6a53ab52", 2, -886179388, "bc46f3f83058ddf5bebd9e1f2c117a673847c4dc5e31cfb24bac91adf30877cf"], + ["fd3e267203ae7d6d3975e738ca84f12540229bb237dd228d5f688e9d5ba53fce4302b0334d01000000026353ffffffff602a3ab75af7aa951d93093e345ef0037a2863f3f580a9b1a575fffe68e677450300000000239e476d1e8f81e8b6313880d8a49b27c1b00af467f29756e76f675f084a5676539636ab030000000765ab6351acac52d9217747044d773204000000000752ac51526353acc33e45050000000005516500005115d889040000000004ab5163510cbbbd0200000000016500000000", "65ac526aac6a53ab52", 2, -886179388, "a03de768f816572e44d358bf51a9fe02a5c68c1ea3d9bbc695b1674683aaea43"], ["f380ae23033646af5dfc186f6599098015139e961919aea28502ea2d69474413d94a555ea2000000000853635265abacac5314da394b99b07733341ddba9e86022637be3b76492992fb0f58f23c915098979250a96620300000003ab6300ffffffff4bb6d1c0a0d84eac7f770d3ad0fdc5369ae42a21bbe4c06e0b5060d5990776220300000000ffffffff0486fd70020000000007ac6500635252acf3fd72010000000005656a6a6551212de90500000000096365006a63635153000fa33100000000000600535151656300000000", "ab52", 2, -740890152, "f804fc4d81f039009ed1f2cccb5c91da797543f235ac71b214c20e763a6d86d7"], - ["5c45d09801bb4d8e7679d857b86b97697472d514f8b76d862460e7421e8617b15a2df217c6010000000863acacab6565006affffffff01156dbc03000000000952ac63516551ac6aac00000000", "6aabac", 0, 1310125891, "270445ab77258ced2e5e22a6d0d8c36ac7c30fff9beefa4b3e981867b03fa0ad"], + ["5c45d09801bb4d8e7679d857b86b97697472d514f8b76d862460e7421e8617b15a2df217c6010000000863acacab6565006affffffff01156dbc03000000000952ac63516551ac6aac00000000", "6aabac", 0, 1310125891, "652dc65297a1ed9240abf7a911a9948c9161b7645962c1852f2e7b3c67656a4e"], ["4ecc6bde030ca0f83c0ed3d4b777f94c0c88708c6c933fe1df6874f296d425cac95355c23d0000000006ac6a51536a52f286a0969d6170e20f2a8000193807f5bc556770e9d82341ef8e17b0035eace89c76edd50200000007ac65525100656affffffff5bade6e462fac1927f078d69d3a981f5b4c1e59311a38efcb9a910aa436afaa80000000007ac6a006352ab52ffffffff0331e58902000000000763ac53636352abb8b3ca000000000001637a1d26040000000009535263ac6a5352ab655ae34a39", "6a65ab", 2, 2142728517, "4a3415eb1677ae4e0c939644a4cfd5dc6299780b55cd0dc735967057b6b1526a"], ["a59484b501eb50114be0fc79e72ab9bc9f4a5f7acdf274a56d6b68684eb68cf8b07ec5d1c2000000000765abab00ab00639e09aa940141e3530200000000046500ac6500000000", "00516565ab", 0, -1561622405, "d60bbadd2cc0674100baa08d0e0493ee4248f0304b3eb778da942041f503a896"], ["53dc1a88046531c7b57a35f4d9adf101d068bf8d63fbbedaf4741dba8bc5e92c8725def571030000000453655251fcdf116a226b3ec240739c4c7493800e4edfe67275234e371a227721eac43d3d9ecaf1b50300000003ac0052ffffffff2c9279ffeea4718d167e9499bd067600715c14484e373ef93ae4a31d2f5671ab0000000009516553ac636a6a65001977752eeba95a8f16b88c571a459c2f2a204e23d48cc7090e4f4cc35846ca7fc0a455ce00000000055165ac0063188143f80205972902000000000765ac63ac516353c7b6a50000000000036a510000000000", "655351536a", 0, 103806788, "b276584d3514e5b4e058167c41dc02915b9d97f6795936a51f40e894ed8508bc"], ["53f8959f01ddb36afdcd20167edcbb75a63d18654fdcf10bc0004c761ab450fe236d79cb2702000000065151650063653435003a033a5e34050000000009ac52516a630000516ab86db3030000000002006344ac090500000000046363ab00f3644537", "5263abab63ac656353", 0, -218513553, "f1f2a489682e42a6fc20025dfc89584d17f150b2d7ae3ddedd2bf43d5e24f37f"], - ["5a06cb4602dcfc85f49b8d14513f33c48f67146f2ee44959bbca092788e6823b2719f3160b0200000001ab3c013f2518035b9ea635f9a1c74ec1a3fb7496a160f46aae2e09bfc5cd5111a0f20969e003000000015158c89ab7049f20d6010000000008ac6a52abac53515349765e00000000000300ab638292630100000000045351ab0086da09010000000006656a6365525300000000", "526a63", 1, 1502936586, "bdfaff8a4e775379c5dc26e024968efa805f923de53fa8272dd53ec582afa0c5"], + ["5a06cb4602dcfc85f49b8d14513f33c48f67146f2ee44959bbca092788e6823b2719f3160b0200000001ab3c013f2518035b9ea635f9a1c74ec1a3fb7496a160f46aae2e09bfc5cd5111a0f20969e003000000015158c89ab7049f20d6010000000008ac6a52abac53515349765e00000000000300ab638292630100000000045351ab0086da09010000000006656a6365525300000000", "526a63", 1, 1502936586, "b2c94d77f2f4a06f57eb0ec030665edf79724fa4d4cb2a6356149c66e5e08b6a"], ["ca9d84fa0129011e1bf27d7cb71819650b59fb292b053d625c6f02b0339249b498ff7fd4b601000000025352ffffffff032173a0040000000008525253abab5152639473bb030000000009005153526a53535151d085bd0000000000086a5365ab5165655300000000", "005152ac51", 0, 580353445, "c629d93b02037f40aa110e46d903edb34107f64806aa0c418d435926feef68b8"], ["e3cdbfb4014d90ae6a4401e85f7ac717adc2c035858bf6ff48979dd399d155bce1f150daea0300000002ac51a67a0d39017f6c71040000000005535200535200000000", "", 0, -1899950911, "c1c7df8206e661d593f6455db1d61a364a249407f88e99ecad05346e495b38d7"], ["b2b6b9ab0283d9d73eeae3d847f41439cd88279c166aa805e44f8243adeb3b09e584efb1df00000000026300ffffffff7dfe653bd67ca094f8dab51007c6adaced09de2af745e175b9714ca1f5c68d050000000003ac6500aa8e596903fd3f3204000000000553ac6a6a533a2e210500000000075253acabab526392d0ee020000000008520065635200ab5200000000", "65acacac65005365", 0, 28298553, "39c2aaa2496212b3ab120ab7d7f37c5e852bfe38d20f5226413a2268663eeae8"], - ["f30c5c3d01a6edb9e10fafaf7e85db14e7fec558b9dca4a80b05d7c3a2944d282c5018f4680200000003005263ffffffff04aac3530300000000026551bc2419010000000009005163acab6a5100658e7085050000000000c5e4ec050000000007656a6a635365ab2d8e8882", "abac53ab005251ac52", 0, -490287546, "877e347ec7487497769e2581142276d1a8d813b652e4483cf9cc993d16354417"], - ["4314339e01de40faabcb1b970245a7f19eedbc17c507dac86cf986c2973715035cf95736ae0200000007abababababab65bde67b900151510b04000000000853ac00655200535300000000", "52", 0, 399070095, "47585dc25469d04ff3a60939d0a03779e3e81a411bf0ca18b91bb925ebd30718"], - ["2d4cf4e9031b3e175b2ff18cd933151379d9cfac4713d8bd0e63b70bd4a92277aa7af901ab000000000565515353abffffffff557666c7f3be9cdecdad44c3df206eb63a2da4ed1f159d21193882a9f0340081020000000963ab53ab5252ac63abffffffff8a8c897bdb87e93886aad5ded9d82a13101d5476554386373646ca5e23612e450300000009006a526552abab6a635ac03fc00198bb02040000000009525100526a6563636a1d052834", "ab52ac00acac6a", 0, -1469882480, "09ed6563a454814ab7e3b4c28d56d8751162b77df1825b37ba66c6147750b2a3"], - ["f063171b03e1830fdc1d685a30a377537363ccafdc68b42bf2e3acb908dac61ee24b37595c020000000765ac5100ab6aacf447bc8e037b89d6cadd62d960cc442d5ced901d188867b5122b42a862929ce45e7b628d010000000253aba009a1ba42b00f1490b0b857052820976c675f335491cda838fb7934d5eea0257684a2a202000000001e83cf2401a7f777030000000008ab6553526a53526a00000000", "", 2, 1984790332, "c19caada8e71535e29a86fa29cfd9b74a0c7412003fc722a121005e461e01636"], - ["cf7bdc250249e22cbe23baf6b648328d31773ea0e771b3b76a48b4748d7fbd390e88a004d30000000003ac536a4ab8cce0e097136c90b2037f231b7fde2063017facd40ed4e5896da7ad00e9c71dd70ae600000000096a0063516352525365ffffffff01b71e3e00000000000300536a00000000", "", 1, 546970113, "6a815ba155270af102322c882f26d22da11c5330a751f520807936b320b9af5d"], - ["ac7a125a0269d35f5dbdab9948c48674616e7507413cd10e1acebeaf85b369cd8c88301b7c030000000963656aac6a530053abffffffffed94c39a582e1a46ce4c6bffda2ccdb16cda485f3a0d94b06206066da12aecfe010000000752abab63536363ef71dcfb02ee07fa0400000000016a6908c802000000000751656a6551abac688c2c2d", "6a6351526551", 0, 858400684, "552ff97d7924f51cda6d1b94be53483153ef725cc0a3a107adbef220c753f9a6"], - ["3a1f454a03a4591e46cf1f7605a3a130b631bf4dfd81bd2443dc4fac1e0a224e74112884fe0000000005516aac6a53a87e78b55548601ffc941f91d75eab263aa79cd498c88c37fdf275a64feff89fc1710efe03000000016a39d7ef6f2a52c00378b4f8f8301853b61c54792c0f1c4e2cd18a08cb97a7668caa008d970200000002656affffffff017642b20100000000096a63535253abac6a6528271998", "51", 2, 1459585400, "e9a7f21fc2d38be7be47095fbc8f1bf8923660aa4d71df6d797ae0ba5ca4d5b0"], + ["f30c5c3d01a6edb9e10fafaf7e85db14e7fec558b9dca4a80b05d7c3a2944d282c5018f4680200000003005263ffffffff04aac3530300000000026551bc2419010000000009005163acab6a5100658e7085050000000000c5e4ec050000000007656a6a635365ab2d8e8882", "abac53ab005251ac52", 0, -490287546, "2ec7fb769099873497613cb8c9bae418e1d807a09337814149adc20ce74ca1b2"], + ["4314339e01de40faabcb1b970245a7f19eedbc17c507dac86cf986c2973715035cf95736ae0200000007abababababab65bde67b900151510b04000000000853ac00655200535300000000", "52", 0, 399070095, "75da1834e056723f5f1dcd2b708714a6126c719727d06f65f49db6251d4a80ff"], + ["2d4cf4e9031b3e175b2ff18cd933151379d9cfac4713d8bd0e63b70bd4a92277aa7af901ab000000000565515353abffffffff557666c7f3be9cdecdad44c3df206eb63a2da4ed1f159d21193882a9f0340081020000000963ab53ab5252ac63abffffffff8a8c897bdb87e93886aad5ded9d82a13101d5476554386373646ca5e23612e450300000009006a526552abab6a635ac03fc00198bb02040000000009525100526a6563636a1d052834", "ab52ac00acac6a", 0, -1469882480, "707b35e3aa4558d67590f4ac9e90f6d05a2ce2c0800729eabae2da8fe2a421dd"], + ["f063171b03e1830fdc1d685a30a377537363ccafdc68b42bf2e3acb908dac61ee24b37595c020000000765ac5100ab6aacf447bc8e037b89d6cadd62d960cc442d5ced901d188867b5122b42a862929ce45e7b628d010000000253aba009a1ba42b00f1490b0b857052820976c675f335491cda838fb7934d5eea0257684a2a202000000001e83cf2401a7f777030000000008ab6553526a53526a00000000", "", 2, 1984790332, "c6865e3dc270e7bd8a1e53c740d70120e4d8d51facb9510b1d0db7903adcc979"], + ["cf7bdc250249e22cbe23baf6b648328d31773ea0e771b3b76a48b4748d7fbd390e88a004d30000000003ac536a4ab8cce0e097136c90b2037f231b7fde2063017facd40ed4e5896da7ad00e9c71dd70ae600000000096a0063516352525365ffffffff01b71e3e00000000000300536a00000000", "", 1, 546970113, "f3cbb49f94d17c9ae8042bee6086e6fc17cd9159b2745072b2187f808d9e85b8"], + ["ac7a125a0269d35f5dbdab9948c48674616e7507413cd10e1acebeaf85b369cd8c88301b7c030000000963656aac6a530053abffffffffed94c39a582e1a46ce4c6bffda2ccdb16cda485f3a0d94b06206066da12aecfe010000000752abab63536363ef71dcfb02ee07fa0400000000016a6908c802000000000751656a6551abac688c2c2d", "6a6351526551", 0, 858400684, "700bc39dce08709805a77c92569f5520f27fa168b87d84402e54f773d6e98ef9"], + ["3a1f454a03a4591e46cf1f7605a3a130b631bf4dfd81bd2443dc4fac1e0a224e74112884fe0000000005516aac6a53a87e78b55548601ffc941f91d75eab263aa79cd498c88c37fdf275a64feff89fc1710efe03000000016a39d7ef6f2a52c00378b4f8f8301853b61c54792c0f1c4e2cd18a08cb97a7668caa008d970200000002656affffffff017642b20100000000096a63535253abac6a6528271998", "51", 2, 1459585400, "3b6a6305d98284ae2504ceb745bec7b90afb8f763754aa6a0b52613c5b68cd66"], ["f59366cc0114c2a18e6bd1347ed9470f2522284e9e835dd5c5f7ef243639ebea95d9b232b6020000000153474b62eb045c00170500000000096352ab516352ab5200038a520400000000086aab5253656a63005b968904000000000963536353ac0053635387106002000000000000000000", "ab52526300ab51", 0, 1834116153, "cdf51f6e3a9dc2be5a59ea4c00f5aac1e1426a5202c325e6cf2567d07d8d8de4"], - ["6269e0fa0173e76e89657ca495913f1b86af5b8f1c1586bcd6c960aede9bc759718dfd5044000000000352ac530e2c7bd90219849b000000000007ab00ab6a53006319f281000000000007ab00515165ac5200000000", "6a", 0, -2039568300, "62094f98234a05bf1b9c7078c5275ed085656856fb5bdfd1b48090e86b53dd85"], - ["eb2bc00604815b9ced1c604960d54beea4a3a74b5c0035d4a8b6bfec5d0c9108f143c0e99a0000000000ffffffff22645b6e8da5f11d90e5130fd0a0df8cf79829b2647957471d881c2372c527d8010000000263acffffffff1179dbaf17404109f706ae27ad7ba61e860346f63f0c81cb235d2b05d14f2c1003000000025300264cb23aaffdc4d6fa8ec0bb94eff3a2e50a83418a8e9473a16aaa4ef8b855625ed77ef40100000003ac51acf8414ad404dd328901000000000652526500006ab6261c000000000002526a72a4c9020000000006ac526500656586d2e7000000000006656aac00ac5279cd8908", "51", 1, -399279379, "d37532e7b2b8e7db5c7c534197600397ebcc15a750e3af07a3e2d2e4f84b024f"], + ["6269e0fa0173e76e89657ca495913f1b86af5b8f1c1586bcd6c960aede9bc759718dfd5044000000000352ac530e2c7bd90219849b000000000007ab00ab6a53006319f281000000000007ab00515165ac5200000000", "6a", 0, -2039568300, "af87be8c66e0fecd86a2fb64188eccc19a3a7bf06943d7a579e6f8fb190e8d6c"], + ["eb2bc00604815b9ced1c604960d54beea4a3a74b5c0035d4a8b6bfec5d0c9108f143c0e99a0000000000ffffffff22645b6e8da5f11d90e5130fd0a0df8cf79829b2647957471d881c2372c527d8010000000263acffffffff1179dbaf17404109f706ae27ad7ba61e860346f63f0c81cb235d2b05d14f2c1003000000025300264cb23aaffdc4d6fa8ec0bb94eff3a2e50a83418a8e9473a16aaa4ef8b855625ed77ef40100000003ac51acf8414ad404dd328901000000000652526500006ab6261c000000000002526a72a4c9020000000006ac526500656586d2e7000000000006656aac00ac5279cd8908", "51", 1, -399279379, "6cb091edda8cb28ca0755fd45ba57b546d74024b941bb6e45096b2f8fcf0e807"], ["dc9fe6a8038b84209bbdae5d848e8c040433237f415437592907aa798bf30d9dbbddf0ff85010000000153ffffffff23269a7ea29fcf788db483b8d4c4b35669e582608644259e950ce152b0fa6e050000000003acababffffffff65de94857897ae9ea3aa0b938ba6e5adf374d48469922d2b36dbb83d3b8c8261010000000452ac5200ffffffff02856e9b0300000000026a51980c8e02000000000365ab63d2648db4", "00ab0051ac526565", 2, 1562581941, "5cef9d8e18a2d5a70448f17b465d411a19dab78f0ddf1672ffd518b188f52433"], ["eba8b0de04ac276293c272d0d3636e81400b1aaa60db5f11561480592f99e6f6fa13ad387002000000070053acab536563bebb23d66fd17d98271b182019864a90e60a54f5a615e40b643a54f8408fa8512cfac927030000000963ac6a6aabac65ababffffffff890a72192bc01255058314f376bab1dc72b5fea104c154a15d6faee75dfa5dba020000000100592b3559b0085387ac7575c05b29b1f35d9a2c26a0c27903cc0f43e7e6e37d5a60d8305a030000000252abffffffff0126518f05000000000000000000", "005300635252635351", 1, 664344756, "26dc2cba4bd5334e5c0b3a520b44cc1640c6b923d10e576062f1197171724097"], ["91bd040802c92f6fe97411b159df2cd60fb9571764b001f31657f2d616964637605875c2a901000000055263006a65ffffffff3651df372645f50cf4e32fdf6e61c766e912e16335db2b40c5d52fe89eefe7cd00000000040065ab65ffffffff03ca8625030000000009ab51ac63530052ab52c6bf14020000000006ab00ab52005167d270000000000007ab53525351636a00000000", "5151ab63005252ac", 1, 1983087664, "3e5aa0200248d8d86ede3b315ca1b857018b89184a4bd023bd88ab12e499f6e1"], - ["185cda1a01ecf7a8a8c28466725b60431545fc7a3367ab68e34d486e8ea85ee3128e0d8384000000000465ac63abec88b7bb031c56eb04000000000965636a51005252006a7c78d5040000000007acac63abac51ac3024a40500000000086300526a51abac51464c0e8c", "0065535265515352", 0, 1594558917, "b5280b9610c0625a65b36a8c2402a95019a7bbb9dd3de77f7c3cb1d82c3263ba"], - ["a9531f07034091668b65fea8b1a79700d586ac9e2f42ca0455a26abe41f9e1805d009a0f5702000000096365516365ac5263ab3619bac643a9e28ee47855118cf80c3a74531cdf198835d206d0fe41804e325a4f9f105e03000000016a58e3ab0d46375d98994daf0fa7c600d2bb4669e726fca0e3a3f21ea0d9e777396740328f0100000008636a5363ab526a538d3ea7700304cb66030000000007515163ab52ab510184030500000000085353636565ac0051d9cff402000000000751ab52ab5352abf0e36254", "ab5353ac5365acab", 2, 1633101834, "04c9ef72f33668ca449c0415becf62cc0b8e0c75f9c8813852d42a58acf107c8"], - ["6b5ecc7903fe0ba37ea551df92a59e12bad0a3065846ba69179a8f4a741a2b4fcf679aac810200000004535263529a3d343293b99ab425e7ef8529549d84f480bcd92472bab972ea380a302128ae14dfcd0200000000025163ffffffff24636e4545cab9bf87009119b7fc3ec4d5ee9e206b90f35d1df8a563b6cd097a010000000852abac53005153abc64467860406e832020000000009526300006a53ac6352ac1395010000000002ac53b117f300000000000863655351acab00651edf02030000000008ab51ac6353535252628ef71d", "ab63ab6a52ac526563", 2, -1559697626, "8f07ece7d65e509f1e0780584ef8d271c1c61a13b10335d5faafc7afc8b5b8ec"], + ["185cda1a01ecf7a8a8c28466725b60431545fc7a3367ab68e34d486e8ea85ee3128e0d8384000000000465ac63abec88b7bb031c56eb04000000000965636a51005252006a7c78d5040000000007acac63abac51ac3024a40500000000086300526a51abac51464c0e8c", "0065535265515352", 0, 1594558917, "12ef318e88f334cd5a206a993d7a7f402810586e65d6c1b5d57de7149015a9cb"], + ["a9531f07034091668b65fea8b1a79700d586ac9e2f42ca0455a26abe41f9e1805d009a0f5702000000096365516365ac5263ab3619bac643a9e28ee47855118cf80c3a74531cdf198835d206d0fe41804e325a4f9f105e03000000016a58e3ab0d46375d98994daf0fa7c600d2bb4669e726fca0e3a3f21ea0d9e777396740328f0100000008636a5363ab526a538d3ea7700304cb66030000000007515163ab52ab510184030500000000085353636565ac0051d9cff402000000000751ab52ab5352abf0e36254", "ab5353ac5365acab", 2, 1633101834, "564578a16ebc181cc2d0ace352b8e1dda988f5587f3d3339decf4e6e7b266fd8"], + ["6b5ecc7903fe0ba37ea551df92a59e12bad0a3065846ba69179a8f4a741a2b4fcf679aac810200000004535263529a3d343293b99ab425e7ef8529549d84f480bcd92472bab972ea380a302128ae14dfcd0200000000025163ffffffff24636e4545cab9bf87009119b7fc3ec4d5ee9e206b90f35d1df8a563b6cd097a010000000852abac53005153abc64467860406e832020000000009526300006a53ac6352ac1395010000000002ac53b117f300000000000863655351acab00651edf02030000000008ab51ac6353535252628ef71d", "ab63ab6a52ac526563", 2, -1559697626, "cf5c0d030524ef60cead26198b3ff7e247da8377a41f80636b631804f8bf10fb"], ["92c9fb780138abc472e589d5b59489303f234acc838ca66ffcdf0164517a8679bb622a4267020000000153468e373d04de03fa020000000009ac006a5265ab5163006af649050000000007515153006a00658ceb59030000000001ac36afa0020000000009ab53006351ab51000000000000", "6a", 0, 2059357502, "e2358dfb51831ee81d7b0bc602a65287d6cd2dbfacf55106e2bf597e22a4b573"], - ["6f62138301436f33a00b84a26a0457ccbfc0f82403288b9cbae39986b34357cb2ff9b889b302000000045253655335a7ff6701bac9960400000000086552ab656352635200000000", "6aac51", 0, 1444414211, "502a2435fd02898d2ff3ab08a3c19078414b32ec9b73d64a944834efc9dae10c"], + ["6f62138301436f33a00b84a26a0457ccbfc0f82403288b9cbae39986b34357cb2ff9b889b302000000045253655335a7ff6701bac9960400000000086552ab656352635200000000", "6aac51", 0, 1444414211, "5630446770dfdeb6050dc14f2ea911eae54db33207764c1b83db55fbaf379a94"], ["9981143a040a88c2484ac3abe053849e72d04862120f424f373753161997dd40505dcb4783030000000700536365536565a2e10da3f4b1c1ad049d97b33f0ae0ea48c5d7c30cc8810e144ad93be97789706a5ead180100000003636a00ffffffffbdcbac84c4bcc87f03d0ad83fbe13b369d7e42ddb3aecf40870a37e814ad8bb5010000000963536a5100636a53abffffffff883609905a80e34202101544f69b58a0b4576fb7391e12a769f890eef90ffb72020000000651656352526affffffff04243660000000000004ab5352534a9ce001000000000863656363ab6a53652df19d030000000003ac65acedc51700000000000000000000", "ac6300acac", 2, 293672388, "7ba99b289c04718a7283f150d831175ed6303081e191a0608ea81f78926c5bdf"], ["a2bb630b01989bc5d643f2da4fb9b55c0cdf846ba06d1dbe372893024dbbe5b9b8a1900af802000000055265ac63aca7a68d2f04916c74010000000003abac007077f0040000000001007d4127010000000005ac516aac000f31e8030000000000571079c9", "65ab0051ac", 0, -1103627693, "92d53b4390262e6b288e8a32e0cfc36cd5adfdfabfe96c7bfd4a19d65e233761"], ["58a4fed801fbd8d92db9dfcb2e26b6ff10b120204243fee954d7dcb3b4b9b53380e7bb8fb60100000003006351ffffffff02a0795b050000000006536351ac6aac2718d00200000000075151acabac515354d21ba1", "005363515351", 0, -1322430665, "bbee941bbad950424bf40e3623457db47f60ed29deaa43c99dec702317cb3326"], - ["32765a0b02e455793d9ce530e9f6a44bcbc612e893a875b5da61d822dc56d8245166c398b403000000085353abac6300006a6bdee2a78d0d0b6a5ea666eed70b9bfea99d1d612ba3878f615c4da10d4a521cba27155002000000035363abffffffff043cd42401000000000551656a53653685320100000000030000511881bc0500000000065165abab636a20169f010000000007acab656aac63acdb0706a8", "65ac53ab53", 0, 1936499176, "5c5a9c3a5de7dc7a82bc171c9d3505913b8bcc450bc8b2d11772c1a1d781210b"], + ["32765a0b02e455793d9ce530e9f6a44bcbc612e893a875b5da61d822dc56d8245166c398b403000000085353abac6300006a6bdee2a78d0d0b6a5ea666eed70b9bfea99d1d612ba3878f615c4da10d4a521cba27155002000000035363abffffffff043cd42401000000000551656a53653685320100000000030000511881bc0500000000065165abab636a20169f010000000007acab656aac63acdb0706a8", "65ac53ab53", 0, 1936499176, "b631415df820b941676be11b06d487fd71aee352c85ee255f856b415da411392"], ["17fad0d303da0d764fedf9f2887a91ea625331b28704940f41e39adf3903d8e75683ef6d46020000000151ffffffffff376eea4e880bcf0f03d33999104aafed2b3daf4907950bb06496af6b51720a020000000900636a63525253525196521684f3b08497bad2c660b00b43a6a517edc58217876eb5e478aa3b5fda0f29ee1bea00000000046aacab6affffffff03dde8e2050000000007ac5365ac51516a14772e000000000005630000abacbbb360010000000006ab5251ab656a50f180f0", "0053", 0, -1043701251, "a3bdf8771c8990971bff9b4e7d59b7829b067ed0b8d3ac1ec203429811384668"], - ["236c32850300045e292c84ede2b9ab5733ba08315a2bb09ab234c4b4e8894808edbdac0d3b020000000653635363abacffffffffd3f696bb31fdd18a72f3fc2bb9ae54b416a253fc37c1a0f0180b52d35bad49440100000004650053abffffffffa85c75a2406d82a93b12e555b66641c1896a4e83ae41ef1038218311e38ace060200000006abab006a51ac104b5e6701e2842c04000000000800630051ac0000ab00000000", "ab63ac6a516a", 1, -1709887524, "8c29ea8ef60c5a927fccdba8ea385db6b6b84d98e891db45f5d4ee3148d3f5a7"], + ["236c32850300045e292c84ede2b9ab5733ba08315a2bb09ab234c4b4e8894808edbdac0d3b020000000653635363abacffffffffd3f696bb31fdd18a72f3fc2bb9ae54b416a253fc37c1a0f0180b52d35bad49440100000004650053abffffffffa85c75a2406d82a93b12e555b66641c1896a4e83ae41ef1038218311e38ace060200000006abab006a51ac104b5e6701e2842c04000000000800630051ac0000ab00000000", "ab63ac6a516a", 1, -1709887524, "e2449ff023771349ed872b4544a4f030bb21be498087d31f2f361cc7e65f211c"], ["b78d5fd601345f3100af494cdf447e7d4076179f940035b0ebe8962587d4d0c9c6c9fc34ee0300000003516a6affffffff03dc5c890100000000085353ac53ac6a52534ac941040000000007ac63656a51ab51d4266b0100000000036aacac70731f2d", "005351ab0053", 0, -1789071265, "d5f1c1cb35956a5711d67bfb4cedbc67e77c089b912d688ad440ff735adb390d"], - ["5a2257df03554550b774e677f348939b37f8e765a212e566ce6b60b4ea8fed4c9504b7f7d1000000000653655265ab5258b67bb931df15b041177cf9599b0604160b79e30f3d7a594e7826bae2c29700f6d8f8f40300000005515300ac6a159cf8808a41f504eb5c2e0e8a9279f3801a5b5d7bc6a70515fbf1c5edc875bb4c9ffac500000000050063510052ffffffff0422a90105000000000965006a650000516a006417d2020000000006526363ab00524d969d0100000000035153acc4f077040000000005ac5200636500000000", "6a52", 1, -1482463464, "37b794b05d0687c9b93d5917ab068f6b2f0e38406ff04e7154d104fc1fb14cdc"], - ["e0032ad601269154b3fa72d3888a3151da0aed32fb2e1a15b3ae7bee57c3ddcffff76a1321010000000100110d93ae03f5bd080100000000075263516a6551002871e60100000000046a005252eaa753040000000004ab6aab526e325c71", "630052", 0, -1857873018, "ea117348e94de86381bb8ad1c7f93b8c623f0272104341701bb54e6cb433596c"], - ["014b2a5304d46764817aca180dca50f5ab25f2e0d5749f21bb74a2f8bf6b8b7b3fa8189cb7030000000965ac5165ab6a51ac6360ecd91e8abc7e700a4c36c1a708a494c94bb20cbe695c408543146566ab22be43beae9103000000045163ab00ffffffffffa48066012829629a9ec06ccd4905a05df0e2b745b966f6a269c9c8e13451fc00000000026565ffffffffc40ccadc21e65fe8a4b1e072f4994738ccaf4881ae6fede2a2844d7da4d199ab02000000065152ab536aabffffffff01b6e054030000000004515352ab3e063432", "", 0, 1056459916, "a7aff48f3b8aeb7a4bfe2e6017c80a84168487a69b69e46681e0d0d8e63a84b6"], + ["5a2257df03554550b774e677f348939b37f8e765a212e566ce6b60b4ea8fed4c9504b7f7d1000000000653655265ab5258b67bb931df15b041177cf9599b0604160b79e30f3d7a594e7826bae2c29700f6d8f8f40300000005515300ac6a159cf8808a41f504eb5c2e0e8a9279f3801a5b5d7bc6a70515fbf1c5edc875bb4c9ffac500000000050063510052ffffffff0422a90105000000000965006a650000516a006417d2020000000006526363ab00524d969d0100000000035153acc4f077040000000005ac5200636500000000", "6a52", 1, -1482463464, "dd766ce83a78dad270d3a00cf100ed1ed2f6208297dc24631c0186ff273fc7c9"], + ["e0032ad601269154b3fa72d3888a3151da0aed32fb2e1a15b3ae7bee57c3ddcffff76a1321010000000100110d93ae03f5bd080100000000075263516a6551002871e60100000000046a005252eaa753040000000004ab6aab526e325c71", "630052", 0, -1857873018, "b2b9ebfd2f40127304a8336c5ec78f3c76537fb0f2b5c70bd5caaf42679bf7d8"], + ["014b2a5304d46764817aca180dca50f5ab25f2e0d5749f21bb74a2f8bf6b8b7b3fa8189cb7030000000965ac5165ab6a51ac6360ecd91e8abc7e700a4c36c1a708a494c94bb20cbe695c408543146566ab22be43beae9103000000045163ab00ffffffffffa48066012829629a9ec06ccd4905a05df0e2b745b966f6a269c9c8e13451fc00000000026565ffffffffc40ccadc21e65fe8a4b1e072f4994738ccaf4881ae6fede2a2844d7da4d199ab02000000065152ab536aabffffffff01b6e054030000000004515352ab3e063432", "", 0, 1056459916, "bc276137c08f08e5aeefa8128786efb21261344551204e43da232298ccf1446e"], ["c4ef04c103c5dde65410fced19bf6a569549ecf01ceb0db4867db11f2a3a3eef0320c9e8e001000000085100536a53516aabffffffff2a0354fa5bd96f1e28835ffe30f52e19bd7d5150c687d255021a6bec03cf4cfd03000000056a006300514900c5b01d3d4ae1b97370ff1155b9dd0510e198d266c356d6168109c54c11b4c283dca00300000002ababffffffff02e19e3003000000000451655351fa5c0003000000000163ef1fc64b", "51636a51ab630065", 1, -1754709177, "0a281172d306b6a32e166e6fb2a2cc52c505c5d60ea448e9ba7029aa0a2211e1"], - ["29083fe00398bd2bb76ceb178f22c51b49b5c029336a51357442ed1bac35b67e1ae6fdf13100000000066a6500acab51ffffffffe4ca45c9dc84fd2c9c47c7281575c2ba4bf33b0b45c7eca8a2a483f9e3ebe4b3010000000200abffffffffdf47ad2b8c263fafb1e3908158b18146357c3a6e0832f718cd464518a219d18303000000096352ac656351ac0052daddfb3b0231c36f00000000000400526a5275c7e0020000000001ab00000000", "acab536aac52", 2, 300802386, "82ebc07b16cff0077e9c1a279373185b3494e39d08fd3194aae6a4a019377509"], - ["1201ab5d04f89f07c0077abd009762e59db4bb0d86048383ba9e1dad2c9c2ad96ef660e6d00200000007ab6a65ac5200652466fa5143ab13d55886b6cdc3d0f226f47ec1c3020c1c6e32602cd3428aceab544ef43e00000000086a6a6a526a6a5263ffffffffd5be0b0be13ab75001243749c839d779716f46687e2e9978bd6c9e2fe457ee48020000000365abab1e1bac0f72005cf638f71a3df2e3bbc0fa35bf00f32d9c7dc9c39a5e8909f7d53170c8ae0200000008ab6a51516363516affffffff02f0a6210500000000036300ac867356010000000009acab65ac6353536a659356d367", "ac53535252", 0, 917543338, "418acc156c2bc76a5d7baa58db29f1b4cf6c266c9222ed167ef5b4d47f0e0f41"], - ["344fa11e01c19c4dd232c77742f0dd0aeb3695f18f76da627628741d0ee362b0ea1fb3a2180200000007635151005100529bab25af01937c1f0500000000055153ab53656e7630af", "6351005163ac51", 0, -629732125, "228ca52a0a376fe0527a61cfa8da6d7baf87486bba92d49dfd3899cac8a1034f"], + ["29083fe00398bd2bb76ceb178f22c51b49b5c029336a51357442ed1bac35b67e1ae6fdf13100000000066a6500acab51ffffffffe4ca45c9dc84fd2c9c47c7281575c2ba4bf33b0b45c7eca8a2a483f9e3ebe4b3010000000200abffffffffdf47ad2b8c263fafb1e3908158b18146357c3a6e0832f718cd464518a219d18303000000096352ac656351ac0052daddfb3b0231c36f00000000000400526a5275c7e0020000000001ab00000000", "acab536aac52", 2, 300802386, "9896487772f83241ec63e9e6a0069a6f8c72cd40d604f4d171c1a0c9c5672727"], + ["1201ab5d04f89f07c0077abd009762e59db4bb0d86048383ba9e1dad2c9c2ad96ef660e6d00200000007ab6a65ac5200652466fa5143ab13d55886b6cdc3d0f226f47ec1c3020c1c6e32602cd3428aceab544ef43e00000000086a6a6a526a6a5263ffffffffd5be0b0be13ab75001243749c839d779716f46687e2e9978bd6c9e2fe457ee48020000000365abab1e1bac0f72005cf638f71a3df2e3bbc0fa35bf00f32d9c7dc9c39a5e8909f7d53170c8ae0200000008ab6a51516363516affffffff02f0a6210500000000036300ac867356010000000009acab65ac6353536a659356d367", "ac53535252", 0, 917543338, "61626da3c34f78cdeb3d2a530571320c154f2cadde7130973fbef2d90a1846d1"], + ["344fa11e01c19c4dd232c77742f0dd0aeb3695f18f76da627628741d0ee362b0ea1fb3a2180200000007635151005100529bab25af01937c1f0500000000055153ab53656e7630af", "6351005163ac51", 0, -629732125, "4e91a33c31916fd0aeb1e752b126485904838c5a29751c56083029b53e8db5b0"], ["b2fda1950191358a2b855f5626a0ebc830ab625bea7480f09f9cd3b388102e35c0f303124c030000000565ac65ab53ffffffff03f9c5ec04000000000765ab51516551650e2b9f0500000000045365525284e8f6040000000001ac00000000", "ac51655253", 0, 1433027632, "d2fa7e13c34cecda5105156bd2424c9b84ee0a07162642b0706f83243ff811a8"], ["a4a6bbd201aa5d882957ac94f2c74d4747ae32d69fdc765add4acc2b68abd1bdb8ee333d6e0300000008516a6552515152abffffffff02c353cb040000000007ac6351ab51536588bd320500000000066552525253ac00000000", "", 0, 1702060459, "499da7d74032388f820645191ac3c8d20f9dba8e8ded7fa3a5401ea2942392a1"], - ["584e8d6c035a6b2f9dac2791b980a485994bf38e876d9dda9b77ad156eee02fa39e19224a60300000003ab636529db326cc8686a339b79ab6b6e82794a18e0aabc19d9ad13f31dee9d7aad8eff38288588020000000452530052ffffffff09a41f07755c16cea1c7e193c765807d18cadddca6ec1c2ed7f5dcdca99e90e80000000001acffffffff01cba62305000000000451ac63acccdf1f67", "ab536a6363", 2, -27393461, "1125645b49202dca2df2d76dae51877387903a096a9d3f66b5ac80e042c95788"], + ["584e8d6c035a6b2f9dac2791b980a485994bf38e876d9dda9b77ad156eee02fa39e19224a60300000003ab636529db326cc8686a339b79ab6b6e82794a18e0aabc19d9ad13f31dee9d7aad8eff38288588020000000452530052ffffffff09a41f07755c16cea1c7e193c765807d18cadddca6ec1c2ed7f5dcdca99e90e80000000001acffffffff01cba62305000000000451ac63acccdf1f67", "ab536a6363", 2, -27393461, "4438a694e879649c2e36a881111a12a1dd89f9d4564b7b4e5bed375e58a56a6b"], ["83a583d204d926f2ee587a83dd526cf1e25a44bb668e45370798f91a2907d184f7cddcbbc7030000000700ab6565536a539f71d3776300dffdfa0cdd1c3784c9a1f773e34041ca400193612341a9c42df64e3f550e01000000050052515251ffffffff52dab2034ab0648553a1bb8fc4e924b2c89ed97c18dfc8a63e248b454035564b01000000015139ab54708c7d4d2c2886290f08a5221cf69592a810fd1979d7b63d35c271961e710424fd0300000005ac65ac5251ffffffff01168f7c030000000000a85e5fb0", "6a536353656a00", 0, 179595345, "5350a31ac954a0b49931239d0ecafbf34d035a537fd0c545816b8fdc355e9961"], ["ffd35d51042f290108fcb6ea49a560ba0a6560f9181da7453a55dfdbdfe672dc800b39e7320200000006630065516a65f2166db2e3827f44457e86dddfd27a8af3a19074e216348daa0204717d61825f198ec0030100000006ab51abab00abffffffffdf41807adb7dff7db9f14d95fd6dc4e65f8402c002d009a3f1ddedf6f4895fc8030000000500ab006a65a5a848345052f860620abd5fcd074195548ce3bd0839fa9ad8642ed80627bf43a0d47dbd010000000765ab006a656a53b38cdd6502a186da05000000000765ab00ab006a53527c0e0100000000085365ab51acacac52534bd1b1", "6a635253ac0000", 0, 1095082149, "3c05473a816621a3613f0e903faa1a1e44891dd40862b029e41fc520776350fa"], ["6c9a4b98013c8f1cae1b1df9f0f2de518d0c50206a0ab871603ac682155504c0e0ce946f460100000000ffffffff04e9266305000000000753535100ac6aacded39e04000000000365ac6ab93ccd010000000002515397bf3d050000000003ab636300000000", "63520052ac656353", 0, -352633155, "936eff8cdfd771be24124da87c7b24feb48da7cbc2c25fb5ba13d1a23255d902"], - ["e01dc7f0021dc07928906b2946ca3e9ac95f14ad4026887101e2d722c26982c27dc2b59fdb0000000005ac5200516ab5a31ffadcbe74957a5a3f97d7f1475cc6423fc6dbc4f96471bd44c70cc736e7dec0d1ea020000000951636a526a52abac53ffffffff04bc2edd05000000000252ab528c7b02000000000952ac51526500525353324820040000000002005380c713000000000009630065ab00ac525252451bbb48", "53ab65ac", 0, -552384418, "69c0b30f4c630a6c878fde6ea6b74dae94f4eb3bcfbde2dc3649e1a9ada00757"], + ["e01dc7f0021dc07928906b2946ca3e9ac95f14ad4026887101e2d722c26982c27dc2b59fdb0000000005ac5200516ab5a31ffadcbe74957a5a3f97d7f1475cc6423fc6dbc4f96471bd44c70cc736e7dec0d1ea020000000951636a526a52abac53ffffffff04bc2edd05000000000252ab528c7b02000000000952ac51526500525353324820040000000002005380c713000000000009630065ab00ac525252451bbb48", "53ab65ac", 0, -552384418, "7861edea5c210f804e4f32cad19cf69a3275f9a4ae5e974e0e15b9274a95be80"], ["009046a1023f266d0113556d604931374d7932b4d6a7952d08fbd9c9b87cbd83f4f4c178b4030000000452ac526346e73b438c4516c60edd5488023131f07acb5f9ea1540b3e84de92f4e3c432289781ea4900000000046500655357dfd6da02baef910100000000026a007d101703000000000800516500abacac5100000000", "6aab6553ac", 0, -802456605, "f8757fbb4448ca34e0cd41b997685b37238d331e70316659a9cc9087d116169d"], - ["df76ec0801a3fcf3d18862c5f686b878266dd5083f16cf655facab888b4cb3123b3ce5db7e01000000010010e7ac6a0233c83803000000000365ac51faf14a040000000004ac51655100000000", "6353acab", 0, 15705861, "e7d873aa079a19ec712b269a37d2670f60d8cb334c4f97e2e3fd10eeb8ee5f5e"], + ["df76ec0801a3fcf3d18862c5f686b878266dd5083f16cf655facab888b4cb3123b3ce5db7e01000000010010e7ac6a0233c83803000000000365ac51faf14a040000000004ac51655100000000", "6353acab", 0, 15705861, "78d70ca0969e4d10be7f599d24fa8f4b3a837e76a2b920bd98219f830bd4286d"], ["828fd3e0031084051ccef9cfdd97fae4d9cc50c0dae36bd22a3ff332881f17e9756c3e288e0200000004ab535363961a2ccccaf0218ec6a16ba0c1d8b5e93cfd025c95b6e72bc629ec0a3f47da7a4c396dad01000000025353ffffffff19ad28747fb32b4caf7b5dbd9b2da5a264bedb6c86d3a4805cd294ae53a86ac40200000009ab53535351ab6551abffffffff04a41650030000000005656aab6aab8331a304000000000700516365ac516a0d2a47010000000007abac516353abacdebc19040000000006ab5300636a6300000000", "51ab52ab53ac52", 0, 1866105980, "311094b4d73e31aefc77e97859ef07ca2f07a7b7e4d7def80c69d3f5d58527e5"], ["c4b80f850323022205b3e1582f1ed097911a81be593471a8dce93d5c3a7bded92ef6c7c1260100000002006affffffff70294d62f37c3da7c5eae5d67dce6e1b28fedd7316d03f4f48e1829f78a88ae801000000096a5200530000516351f6b7b544f7c39189d3a2106ca58ce4130605328ce7795204be592a90acd81bef517d6f170200000000ffffffff012ab8080000000000075100006365006335454c1e", "53ac6a536aacac", 0, -1124103895, "06277201504e6bf8b8c94136fad81b6e3dadacb9d4a2c21a8e10017bfa929e0e"], ["8ab69ed50351b47b6e04ac05e12320984a63801716739ed7a940b3429c9c9fed44d3398ad40300000006536a516a52638171ef3a46a2adb8025a4884b453889bc457d63499971307a7e834b0e76eec69c943038a0300000000ffffffff566bb96f94904ed8d43d9d44a4a6301073cef2c011bf5a12a89bedbaa03e4724030000000265acb606affd01edea38050000000008515252516aacac6300000000", "65000000006365ac53", 0, -1338942849, "7912573937824058103cb921a59a7f910a854bf2682f4116a393a2045045a8c3"], ["2484991e047f1cf3cfe38eab071f915fe86ebd45d111463b315217bf9481daf0e0d10902a402000000006e71a424eb1347ffa638363604c0d5eccbc90447ff371e000bf52fc743ec832851bb564a0100000001abffffffffef7d014fad3ae7927948edbbb3afe247c1bcbe7c4c8f5d6cf97c799696412612020000000851536a5353006a001dfee0d7a0dd46ada63b925709e141863f7338f34f7aebde85d39268ae21b77c3068c01d0000000008535151ab00636563ffffffff018478070200000000095200635365ac52ab5341b08cd3", "", 3, 265623923, "24cb420a53b4f8bb477f7cbb293caabfd2fc47cc400ce37dbbab07f92d3a9575"], ["54839ef9026f65db30fc9cfcb71f5f84d7bb3c48731ab9d63351a1b3c7bc1e7da22bbd508e0300000000442ad138f170e446d427d1f64040016032f36d8325c3b2f7a4078766bdd8fb106e52e8d20000000003656500ffffffff02219aa101000000000851ababac52ab00659646bd02000000000552acacabac24c394a5", "ac", 0, 906807497, "69264faadcd1a581f7000570a239a0a26b82f2ad40374c5b9c1f58730514de96"], - ["5036d7080434eb4eef93efda86b9131b0b4c6a0c421e1e5feb099a28ff9dd8477728639f77030000000951516aab535152ab5391429be9cce85d9f3d358c5605cf8c3666f034af42740e94d495e28b9aaa1001ba0c87580300000008006552ab00ab006affffffffd838978e10c0c78f1cd0a0830d6815f38cdcc631408649c32a25170099669daa0000000002acab8984227e804ad268b5b367285edcdf102d382d027789250a2c0641892b480c21bf84e3fb0100000000b518041e023d8653010000000001004040fb0100000000080051ac5200636a6300000000", "52ac", 0, 366357656, "bd0e88829afa6bdc1e192bb8b2d9d14db69298a4d81d464cbd34df0302c634c6"], + ["5036d7080434eb4eef93efda86b9131b0b4c6a0c421e1e5feb099a28ff9dd8477728639f77030000000951516aab535152ab5391429be9cce85d9f3d358c5605cf8c3666f034af42740e94d495e28b9aaa1001ba0c87580300000008006552ab00ab006affffffffd838978e10c0c78f1cd0a0830d6815f38cdcc631408649c32a25170099669daa0000000002acab8984227e804ad268b5b367285edcdf102d382d027789250a2c0641892b480c21bf84e3fb0100000000b518041e023d8653010000000001004040fb0100000000080051ac5200636a6300000000", "52ac", 0, 366357656, "fe23dd9c5571d69788e90fe7f1e60722a6dc36ab30e916f16e188b48c05d6cbd"], ["9ad5ccf503fa4facf6a27b538bc910cce83c118d6dfd82f3fb1b8ae364a1aff4dcefabd38f03000000096365655263ac655300807c48130c5937190a996105a69a8eba585e0bd32fadfc57d24029cbed6446d30ebc1f100100000004000053650f0ccfca1356768df7f9210cbf078a53c72e0712736d9a7a238e0115faac0ca383f219d0010000000600ab536552002799982b0221b8280000000000000c41320000000000086552ac6365636a6595f233a3", "6a5152", 2, 553208588, "f99c29a79f1d73d2a69c59abbb5798e987639e36d4c44125d8dc78a94ddcfb13"], ["669538a204047214ce058aed6a07ca5ad4866c821c41ac1642c7d63ed0054f84677077a84f030000000853abacab6a655353ffffffff70c2a071c115282924e3cb678b13800c1d29b6a028b3c989a598c491bc7c76c5030000000752ac52ac5163ac80420e8a6e43d39af0163271580df6b936237f15de998e9589ec39fe717553d415ac02a4030000000463635153184ad8a5a4e69a8969f71288c331aff3c2b7d1b677d2ebafad47234840454b624bf7ac1d03000000056a63abab63df38c24a02fbc63a040000000002ab535ec3dc050000000002536500000000", "635153", 3, -190399351, "9615541884dfb1feeb08073a6a6aa73ef694bc5076e52187fdf4138a369f94d9"], ["a7f139e502af5894be88158853b7cbea49ba08417fbbca876ca6614b5a41432be34499987b000000000765635165abac63ffffffff8b8d70e96c7f54eb70da0229b548ced438e1ca2ba5ddd648a027f72277ee1efc0100000001abffffffff044f2c4204000000000165e93f550100000000050000526a6a94550304000000000365536aadc21c0300000000016300000000", "6aacac6363ab5265ac", 1, 2143189425, "6e3f97955490d93d6a107c18d7fe402f1cada79993bb0ff0d096357261b3a724"], ["3b94438f0366f9f53579a9989b86a95d134256ce271da63ca7cd16f7dd5e4bffa17d35133f010000000100ffffffff1aaad0c721e06ec00d07e61a84fb6dc840b9a968002ce7e142f943f06fd143a10100000008535151ac51ab0053b68b8e9c672daf66041332163e04db3f6048534bd718e1940b3fc3811c4eef5b7a56888b01000000001d58e38c012e38e700000000000852ab53ac6365536a00000000", "ab655352", 1, -935223304, "b3b336de141d4f071313a2207b2a0c7cf54a070dd8d234a511b7f1d13e23b0c4"], ["e5dca8a20456de0a67e185fa6ea94085ceae478d2c15c73cb931a500db3a1b6735dd1649ec0200000005ab536aabab32d11bbdcb81361202681df06a6b824b12b5cb40bb1a672cf9af8f2a836e4d95b7839327030000000951005365ab65abacabb345085932939eef0c724adef8a57f9e1bf5813852d957c039b6a12d9c2f201ea520fb030000000009ac5352005165acac6a5efc6072f1a421dc7dc714fc6368f6d763a5d76d0278b95fc0503b9268ccfadb48213a2500000000026a53ffffffff039ee1c4020000000009ac5353ab6353535163184018000000000005655265526a9a4a8a050000000001ac00000000", "65ab53ab6a00ab6553", 2, 1902561212, "7928ae8e86c0b0cad1b2c120ea313087437974382ee6d46443ca5ac3f5878b88"], - ["972128b904e7b673517e96e98d80c0c8ceceae76e2f5c126d63da77ffd7893fb53308bb2da0300000006ac6552ab52acffffffff4cac767c797d297c079a93d06dc8569f016b4bf7a7d79b605c526e1d36a40e2202000000095365ab636aac6a6a6a69928d2eddc836133a690cfb72ec2d3115bf50fb3b0d10708fa5d2ebb09b4810c426a1db01000000060052526300001e8e89585da7e77b2dd2e30625887f0660accdf29e53a614d23cf698e6fc8ab03310e87700000000076a520051acac6555231ddb0330ec2d03000000000200abfaf457040000000004ab6a6352bdc42400000000000153d6dd2f04", "", 0, 209234698, "4a92fec1eb03f5bd754ee9bfd70707dc4420cc13737374f4675f48529be518e4"], + ["972128b904e7b673517e96e98d80c0c8ceceae76e2f5c126d63da77ffd7893fb53308bb2da0300000006ac6552ab52acffffffff4cac767c797d297c079a93d06dc8569f016b4bf7a7d79b605c526e1d36a40e2202000000095365ab636aac6a6a6a69928d2eddc836133a690cfb72ec2d3115bf50fb3b0d10708fa5d2ebb09b4810c426a1db01000000060052526300001e8e89585da7e77b2dd2e30625887f0660accdf29e53a614d23cf698e6fc8ab03310e87700000000076a520051acac6555231ddb0330ec2d03000000000200abfaf457040000000004ab6a6352bdc42400000000000153d6dd2f04", "", 0, 209234698, "49a693f6c80452db2700cb59cd1f3f937e9277767a36c6100df37f06b1fd8809"], ["1fb4085b022c6cfb848f8af7ba3ba8d21bd23ffa9f0bfd181cb68bcaaf2074e66d4974a31602000000090000006a6a6500acab6c12c07d9f3dbd2d93295c3a49e3757119767097e7fd5371f7d1ba9ba32f1a67a5a426f00000000000ffffffff018fd2fc04000000000363ac5100000000", "65ab006a6aab526a", 0, 1431502299, "8b7dd0ff12ca0d8f4dbf9abf0abba00e897c2f6fd3b92c79f5f6a534e0b33b32"], - ["5374f0c603d727f63006078bd6c3dce48bd5d0a4b6ea00a47e5832292d86af258ea0825c260000000009655353636352526a6af2221067297d42a9f8933dfe07f61a574048ff9d3a44a3535cd8eb7de79fb7c45b6f47320200000003ac006affffffff153d917c447d367e75693c5591e0abf4c94bbdd88a98ab8ad7f75bfe69a08c470200000005ac65516365ffffffff037b5b7b000000000001515dc4d904000000000004bb26010000000004536a6aac00000000", "516552516352ac", 2, 328538756, "8bb7a0129eaf4b8fc23e911c531b9b7637a21ab11a246352c6c053ff6e93fcb6"], - ["c441132102cc82101b6f31c1025066ab089f28108c95f18fa67db179610247086350c163bd010000000651525263ab00ffffffff9b8d56b1f16746f075249b215bdb3516cbbe190fef6292c75b1ad8a8988897c3000000000751ab6553abab00ffffffff02f9078b000000000009ab0053ac51ac00ab51c0422105000000000651006563525200000000", "ac51", 0, -197051790, "55acd8293ed0be6792150a3d7ced6c5ccd153ca7daf09cee035c1b0dac92bb96"], + ["5374f0c603d727f63006078bd6c3dce48bd5d0a4b6ea00a47e5832292d86af258ea0825c260000000009655353636352526a6af2221067297d42a9f8933dfe07f61a574048ff9d3a44a3535cd8eb7de79fb7c45b6f47320200000003ac006affffffff153d917c447d367e75693c5591e0abf4c94bbdd88a98ab8ad7f75bfe69a08c470200000005ac65516365ffffffff037b5b7b000000000001515dc4d904000000000004bb26010000000004536a6aac00000000", "516552516352ac", 2, 328538756, "02853dd37aac1a9bc6206147257b300863ca8f79527201d8a58bd2e9ba3a3fa0"], + ["c441132102cc82101b6f31c1025066ab089f28108c95f18fa67db179610247086350c163bd010000000651525263ab00ffffffff9b8d56b1f16746f075249b215bdb3516cbbe190fef6292c75b1ad8a8988897c3000000000751ab6553abab00ffffffff02f9078b000000000009ab0053ac51ac00ab51c0422105000000000651006563525200000000", "ac51", 0, -197051790, "fc453b17d50b5751f103d33c5fac3cb6a51e8a7d453d19629fcba154b5ccc38e"], ["ab82ad3b04545bd86b3bb937eb1af304d3ef1a6d1343ed809b4346cafb79b7297c09e1648202000000086351ac5200535353ffffffff95d32795bbaaf5977a81c2128a9ec0b3c7551b9b1c3d952876fcb423b2dfb9e80000000005515363acac47a7d050ec1a603627ce6cd606b3af314fa7964abcc579d92e19c7aba00cf6c3090d6d4601000000056a516551633e794768bfe39277ebc0db18b5afb5f0c8117dde9b4dfd5697e9027210eca76a9be20d63000000000700520063ab6aacffffffff01ec2ddc050000000008ac52ac65ac65ac5100000000", "536300abab", 1, -2070209841, "b362da5634f20be7267de78b545d81773d711b82fe9310f23cd0414a8280801d"], ["8bff9d170419fa6d556c65fa227a185fe066efc1decf8a1c490bc5cbb9f742d68da2ab7f320100000007ab000053525365a7a43a80ab9593b9e8b6130a7849603b14b5c9397a190008d89d362250c3a2257504eb810200000007acabacac00ab51ee141be418f003e75b127fd3883dbf4e8c3f6cd05ca4afcaac52edd25dd3027ae70a62a00000000008ac52526a5200536affffffffb8058f4e1d7f220a1d1fa17e96d81dfb9a304a2de4e004250c9a576963a586ae0300000005abacac5363b9bc856c039c01d804000000000951656aac53005365acb0724e00000000000565abab63acea7c7a0000000000036a00ac00000000", "6565", 1, -1349282084, "2b822737c2affeefae13451d7c9db22ff98e06490005aba57013f6b9bbc97250"], - ["0e1633b4041c50f656e882a53fde964e7f0c853b0ada0964fc89ae124a2b7ffc5bc97ea6230100000006ac6aacacabacffffffff2e35f4dfcad2d53ea1c8ada8041d13ea6c65880860d96a14835b025f76b1fbd9000000000351515121270867ef6bf63a91adbaf790a43465c61a096acc5a776b8e5215d4e5cd1492e611f761000000000600ac6aab5265ffffffff63b5fc39bcac83ca80ac36124abafc5caee608f9f63a12479b68473bd4bae769000000000965ac52acac5263acabffffffff0163153e020000000008ab005165ab65515300000000", "6a6aac00", 0, -968477862, "20732d5073805419f275c53784e78db45e53332ee618a9fcf60a3417a6e2ca69"], - ["2b052c24022369e956a8d318e38780ef73b487ba6a8f674a56bdb80a9a63634c6110fb5154010000000251acffffffff48fe138fb7fdaa014d67044bc05940f4127e70c113c6744fbd13f8d51d45143e01000000005710db3804e01aa9030000000008acac6a516a5152abfd55aa01000000000751ab510000ac636d6026010000000000b97da9000000000000fddf3b53", "006552", 0, 595461670, "685d67d84755906d67a007a7d4fa311519467b9bdc6a351913246a41e082a29f"], - ["073bc856015245f03b2ea2da62ccedc44ecb99e4250c7042f596bcb23b294c9dc92cfceb6b02000000095163abab52abab636afe292fb303b7c3f001000000000352636af3c49502000000000400ac6a535851850100000000066aac6553ab6500000000", "ab6aab53006aab52", 0, 247114317, "123916c6485cf23bfea95654a8815fbf04ce4d21a3b7f862805c241472906658"], + ["0e1633b4041c50f656e882a53fde964e7f0c853b0ada0964fc89ae124a2b7ffc5bc97ea6230100000006ac6aacacabacffffffff2e35f4dfcad2d53ea1c8ada8041d13ea6c65880860d96a14835b025f76b1fbd9000000000351515121270867ef6bf63a91adbaf790a43465c61a096acc5a776b8e5215d4e5cd1492e611f761000000000600ac6aab5265ffffffff63b5fc39bcac83ca80ac36124abafc5caee608f9f63a12479b68473bd4bae769000000000965ac52acac5263acabffffffff0163153e020000000008ab005165ab65515300000000", "6a6aac00", 0, -968477862, "3f5f9bdd90266c6d9060e1999d634c7d6352a2964705f9971a02f2192b4dbd17"], + ["2b052c24022369e956a8d318e38780ef73b487ba6a8f674a56bdb80a9a63634c6110fb5154010000000251acffffffff48fe138fb7fdaa014d67044bc05940f4127e70c113c6744fbd13f8d51d45143e01000000005710db3804e01aa9030000000008acac6a516a5152abfd55aa01000000000751ab510000ac636d6026010000000000b97da9000000000000fddf3b53", "006552", 0, 595461670, "b1fb32beaa4dd7bd4c84d5dff4c6a997848d8a37bc5d727ff88fb7167c49a597"], + ["073bc856015245f03b2ea2da62ccedc44ecb99e4250c7042f596bcb23b294c9dc92cfceb6b02000000095163abab52abab636afe292fb303b7c3f001000000000352636af3c49502000000000400ac6a535851850100000000066aac6553ab6500000000", "ab6aab53006aab52", 0, 247114317, "d80045fcd4989e391859858155ed32ed557dd8f783731bbc1d432a475d8de7af"], ["7888b71403f6d522e414d4ca2e12786247acf3e78f1918f6d727d081a79813d129ee8befce0100000009ab516a6353ab6365abffffffff4a882791bf6400fda7a8209fb2c83c6eef51831bdf0f5dacde648859090797ec030000000153ffffffffbb08957d59fa15303b681bad19ccf670d7d913697a2f4f51584bf85fcf91f1f30200000008526565ac52ac63acffffffff0227c0e8050000000001ac361dc801000000000800515165ab00ab0000000000", "656a", 2, 1869281295, "f43378a0b7822ad672773944884e866d7a46579ee34f9afc17b20afc1f6cf197"], - ["cc4dda57047bd0ca6806243a6a4b108f7ced43d8042a1acaa28083c9160911cf47eab910c40200000007526a0000ab6a63e4154e581fcf52567836c9a455e8b41b162a78c85906ccc1c2b2b300b4c69caaaa2ba0230300000008ab5152ac5100ab65ffffffff69696b523ed4bd41ecd4d65b4af73c9cf77edf0e066138712a8e60a04614ea1c0300000004ab6a000016c9045c7df7836e05ac4b2e397e2dd72a5708f4a8bf6d2bc36adc5af3cacefcf074b8b403000000065352ac5252acffffffff01d7e380050000000000cf4e699a", "525163656351", 1, -776533694, "ff18c5bffd086e00917c2234f880034d24e7ea2d1e1933a28973d134ca9e35d2"], + ["cc4dda57047bd0ca6806243a6a4b108f7ced43d8042a1acaa28083c9160911cf47eab910c40200000007526a0000ab6a63e4154e581fcf52567836c9a455e8b41b162a78c85906ccc1c2b2b300b4c69caaaa2ba0230300000008ab5152ac5100ab65ffffffff69696b523ed4bd41ecd4d65b4af73c9cf77edf0e066138712a8e60a04614ea1c0300000004ab6a000016c9045c7df7836e05ac4b2e397e2dd72a5708f4a8bf6d2bc36adc5af3cacefcf074b8b403000000065352ac5252acffffffff01d7e380050000000000cf4e699a", "525163656351", 1, -776533694, "4500cef406f3d4e6342ed8b557bfce165b8649beaba8b70b58129560e570aa5e"], ["b7877f82019c832707a60cf14fba44cfa254d787501fdd676bd58c744f6e951dbba0b3b77f0200000009ac515263ac53525300a5a36e500148f89c0500000000085265ac6a6a65acab00000000", "6563", 0, -1785108415, "cb6e4322955af12eb29613c70e1a00ddbb559c887ba844df0bcdebed736dffbd"], ["aeb14046045a28cc59f244c2347134d3434faaf980961019a084f7547218785a2bd03916f3000000000165f852e6104304955bda5fa0b75826ee176211acc4a78209816bbb4419feff984377b2352200000000003a94a5032df1e0d60390715b4b188c330e4bb7b995f07cdef11ced9d17ee0f60bb7ffc8e0100000002516513e343a5c1dc1c80cd4561e9dddad22391a2dbf9c8d2b6048e519343ca1925a9c6f0800a020000000665516365ac513180144a0290db27000000000006ab655151ab5138b187010000000007ab5363abac516a9e5cd98a", "53ac", 0, 478591320, "e8d89a302ae626898d4775d103867a8d9e81f4fd387af07212adab99946311ef"], - ["c9270fe004c7911b791a00999d108ce42f9f1b19ec59143f7b7b04a67400888808487bd59103000000066a0052ac6565b905e76687be2dd7723b22c5e8269bc0f2000a332a289cfc40bc0d617cfe3214a61a85a30300000007ac63ac00635251560871209f21eb0268f175b8b4a06edd0b04162a974cf8b5dada43e499a1f22380d35ede0300000000792213fc58b6342cc8100079f9f5f046fb89f2d92cf0a2cb6d07304d32d9da858757037c0000000008abab51636565516affffffff02c72a8b03000000000452acac530dfb9f05000000000096f94307", "5253ab536351", 3, 543688436, "0278adbcc476d135493ae9bdcd7b3c2002df17f2d81c17d631c50c73e546c264"], + ["c9270fe004c7911b791a00999d108ce42f9f1b19ec59143f7b7b04a67400888808487bd59103000000066a0052ac6565b905e76687be2dd7723b22c5e8269bc0f2000a332a289cfc40bc0d617cfe3214a61a85a30300000007ac63ac00635251560871209f21eb0268f175b8b4a06edd0b04162a974cf8b5dada43e499a1f22380d35ede0300000000792213fc58b6342cc8100079f9f5f046fb89f2d92cf0a2cb6d07304d32d9da858757037c0000000008abab51636565516affffffff02c72a8b03000000000452acac530dfb9f05000000000096f94307", "5253ab536351", 3, 543688436, "5f147490689bf9271227459785c7fab5b4ba563326bbeaf85d1f4953fa9caa67"], ["57a5a04c0278c8c8e243d2df4bb716f81d41ac41e2df153e7096f5682380c4f441888d9d260300000004ab63ab6afdbe4203525dff42a7b1e628fe22bccaa5edbb34d8ab02faff198e085580ea5fcdb0c61b0000000002ac6affffffff03375e6c05000000000663ab516a6a513cb6260400000000007ca328020000000006516a636a52ab94701cc7", "0053ac5152", 0, -550925626, "b7ca991ab2e20d0158168df2d3dd842a57ab4a3b67cca8f45b07c4b7d1d11126"], - ["072b75a504ad2550c2e9a02614bc9b2a2f50b5b553af7b87c0ef07c64ddc8d8934c96d216401000000036aabaca1387242a5bcd21099b016ad6045bed7dce603472757d9822cc5f602caa4ae20414d378b02000000026a63e4ac816734acdc969538d6f70b8ab43a2589f55e0177a4dc471bdd0eb61d59f0f46f6bb801000000065351526aab52d9f2977be76a492c3a7617b7a16dc29a3b0a7618f328c2f7d4fd9bafe760dc427a5066ef000000000465635165ffffffff02c5793600000000000165296820050000000002ac6300000000", "53006a6aac0052ab", 2, 66084636, "437e89bb6f70fd2ed2feef33350b6f6483b891305e574da03e580b3efd81ae13"], - ["7e27c42d0279c1a05eeb9b9faedcc9be0cab6303bde351a19e5cbb26dd0d594b9d74f40d2b020000000200518c8689a08a01e862d5c4dcb294a2331912ff11c13785be7dce3092f154a005624970f84e0200000000500cf5a601e74c1f0000000000076aab52636a6a5200000000", "6500006a5351", 0, 449533391, "535ba819d74770d4d613ee19369001576f98837e18e1777b8246238ff2381dd0"], - ["11414de403d7f6c0135a9df01cb108c1359b8d4e105be50a3dcba5e6be595c8817217490b20000000003005263ffffffff0c6becb9c3ad301c8dcd92f5cbc07c8bed7973573806d1489316fc77a829da03030000000700005253535352ffffffff2346d74ff9e12e5111aa8779a2025981850d4bf788a48de72baa2e321e4bc9ca00000000056352acab63cc585b64045e0385050000000009ab5253ab516aacac00efa9cf0300000000065200635151acbe80330400000000070063635100ab000be159050000000007525300655300ac00000000", "51656a0051ab", 0, 683137826, "d4737f3b58f3e5081b35f36f91acde89dda00a6a09d447e516b523e7a99264d5"], - ["1c6b5f29033fc139338658237a42456123727c8430019ca25bd71c6168a9e35a2bf54538d80100000008536aac52ac6a6a52ffffffff3fb36be74036ff0c940a0247c451d923c65f826793d0ac2bb3f01ecbec8033290100000007ab000051ab6363ffffffff5d9eca0cf711685105bd060bf7a67321eaef95367acffab36ce8dedddd632ee2000000000652ac6a63ac517167319e032d26de040000000003516363dc38fb010000000000b37b00000000000006ab520051ac534baba51f", "636300ababac6563", 0, -2049129935, "3282a2ec6b8c87c9303e6060c17b421687db1bd35fbfa0345b48f2490e15b6cc"], + ["072b75a504ad2550c2e9a02614bc9b2a2f50b5b553af7b87c0ef07c64ddc8d8934c96d216401000000036aabaca1387242a5bcd21099b016ad6045bed7dce603472757d9822cc5f602caa4ae20414d378b02000000026a63e4ac816734acdc969538d6f70b8ab43a2589f55e0177a4dc471bdd0eb61d59f0f46f6bb801000000065351526aab52d9f2977be76a492c3a7617b7a16dc29a3b0a7618f328c2f7d4fd9bafe760dc427a5066ef000000000465635165ffffffff02c5793600000000000165296820050000000002ac6300000000", "53006a6aac0052ab", 2, 66084636, "5c366fef959d82bb50b5ae1277412853944d5377cb69f4d6745a1af30d7e5963"], + ["7e27c42d0279c1a05eeb9b9faedcc9be0cab6303bde351a19e5cbb26dd0d594b9d74f40d2b020000000200518c8689a08a01e862d5c4dcb294a2331912ff11c13785be7dce3092f154a005624970f84e0200000000500cf5a601e74c1f0000000000076aab52636a6a5200000000", "6500006a5351", 0, 449533391, "93b2366b3346cc2c95c67b4c9a5cfcfb5b0d805aa39e2bfad326904b726f7ca1"], + ["11414de403d7f6c0135a9df01cb108c1359b8d4e105be50a3dcba5e6be595c8817217490b20000000003005263ffffffff0c6becb9c3ad301c8dcd92f5cbc07c8bed7973573806d1489316fc77a829da03030000000700005253535352ffffffff2346d74ff9e12e5111aa8779a2025981850d4bf788a48de72baa2e321e4bc9ca00000000056352acab63cc585b64045e0385050000000009ab5253ab516aacac00efa9cf0300000000065200635151acbe80330400000000070063635100ab000be159050000000007525300655300ac00000000", "51656a0051ab", 0, 683137826, "62d73da7b1f61e4dcf7d9b7ecddd0a6ae1be48213242c2e1f5beaa700eae2a42"], + ["1c6b5f29033fc139338658237a42456123727c8430019ca25bd71c6168a9e35a2bf54538d80100000008536aac52ac6a6a52ffffffff3fb36be74036ff0c940a0247c451d923c65f826793d0ac2bb3f01ecbec8033290100000007ab000051ab6363ffffffff5d9eca0cf711685105bd060bf7a67321eaef95367acffab36ce8dedddd632ee2000000000652ac6a63ac517167319e032d26de040000000003516363dc38fb010000000000b37b00000000000006ab520051ac534baba51f", "636300ababac6563", 0, -2049129935, "ce63e9b00e1801b6d3d7526927c6cb65f6f4bab3df69ca33c42d3d7bba05e573"], ["978b9dad0214cfc7ce392d74d9dcc507350dc34007d72e4125861c63071ebf2cc0a6fd4856020000000651ac6a6aab52ffffffff47f20734e3370e733f87a6edab95a7a268ae44db7a8974e255614836b22938720200000008635265ac51516553ffffffff0137b2560100000000035252ac2f3363e9", "006aab6352", 1, 2014249801, "55611a5fb1483bce4c14c33ed15198130e788b72cd8929b2ceef4dd68b1806bf"], - ["442f1c8703ab39876153c241ab3d69f432ba6db4732bea5002be45c8ca10c3a2356fe0e9590300000001accb2b679cab7c58a660cb6d4b3452c21cd7251a1b77a52c300f655f5baeb6fa27ff5b79880300000003005252e5ccf55712bc8ed6179f6726f8a78f3018a7a0391594b7e286ef5ee99efdcde302a102cc0200000009006352526351536a63ffffffff04443f63030000000006536a63ab63651405fb020000000009ac535351525300ab6a9f172b000000000004ab535263ad5c50050000000008656a65ab630000ac00000000", "65636aab006552", 2, 2125838294, "b3ff10f21e71ebc8b25fe058c4074c42f08617e0dcc03f9e75d20539d3242644"], - ["2b3470dd028083910117f86614cdcfb459ee56d876572510be4df24c72e8f58c70d5f5948b03000000066aab65635265da2c3aac9d42c9baafd4b655c2f3efc181784d8cba5418e053482132ee798408ba43ccf90300000000ffffffff047dda4703000000000765516a52ac53009384a603000000000651636a63ab6a8cf57a03000000000352ab6a8cf6a405000000000952636a6a6565525100661e09cb", "ac520063ac6a6a52", 1, 1405647183, "9b360c3310d55c845ef537125662b9fe56840c72136891274e9fedfef56f9bb5"], - ["d74282b501be95d3c19a5d9da3d49c8a88a7049c573f3788f2c42fc6fa594f59715560b9b00000000009655353525265ac52ac9772121f028f8303030000000003510065af5f47040000000007ac516a6551630000000000", "acab53006363ac", 0, -1113209770, "2f482b97178f17286f693796a756f4d7bd2dfcdbecd4142528eec1c7a3e5101a"], - ["3a5644a9010f199f253f858d65782d3caec0ac64c3262b56893022b9796086275c9d4d097b02000000009d168f7603a67b30050000000007ac51536a0053acd9d88a050000000007655363535263ab3cf1f403000000000352ac6a00000000", "005363536565acac6a", 0, -1383947195, "6390ab0963cf611e0cea35a71dc958b494b084e6fd71d22217fdc5524787ade6"], + ["442f1c8703ab39876153c241ab3d69f432ba6db4732bea5002be45c8ca10c3a2356fe0e9590300000001accb2b679cab7c58a660cb6d4b3452c21cd7251a1b77a52c300f655f5baeb6fa27ff5b79880300000003005252e5ccf55712bc8ed6179f6726f8a78f3018a7a0391594b7e286ef5ee99efdcde302a102cc0200000009006352526351536a63ffffffff04443f63030000000006536a63ab63651405fb020000000009ac535351525300ab6a9f172b000000000004ab535263ad5c50050000000008656a65ab630000ac00000000", "65636aab006552", 2, 2125838294, "93a0db38ca83228f45724fc595d649bb9bf610be7c8ce2da896ef483ac853ec7"], + ["2b3470dd028083910117f86614cdcfb459ee56d876572510be4df24c72e8f58c70d5f5948b03000000066aab65635265da2c3aac9d42c9baafd4b655c2f3efc181784d8cba5418e053482132ee798408ba43ccf90300000000ffffffff047dda4703000000000765516a52ac53009384a603000000000651636a63ab6a8cf57a03000000000352ab6a8cf6a405000000000952636a6a6565525100661e09cb", "ac520063ac6a6a52", 1, 1405647183, "880c348da64bfcebc0a24c9f09c6a4649c183fddbc4ae33f2cd21589f19f94a4"], + ["d74282b501be95d3c19a5d9da3d49c8a88a7049c573f3788f2c42fc6fa594f59715560b9b00000000009655353525265ac52ac9772121f028f8303030000000003510065af5f47040000000007ac516a6551630000000000", "acab53006363ac", 0, -1113209770, "cadead2ea3e9149773a7765cddd7fc9f4ddb96e12233001eda10e8358986195b"], + ["3a5644a9010f199f253f858d65782d3caec0ac64c3262b56893022b9796086275c9d4d097b02000000009d168f7603a67b30050000000007ac51536a0053acd9d88a050000000007655363535263ab3cf1f403000000000352ac6a00000000", "005363536565acac6a", 0, -1383947195, "1488a81b2c3271123e08fa401294b1286448c8c61a92fdd5c532bcbc8944e9af"], ["67b3cc43049d13007485a8133b90d94648bcf30e83ba174f5486ab42c9107c69c5530c5e1f0000000003005100ffffffff9870ebb65c14263282ea8d41e4f4f40df16b565c2cf86f1d22a9494cad03a67f01000000016a5a121bee5e359da548e808ae1ad6dfccae7c67cbb8898d811638a1f455a671e822f228ef030000000151c1fcc9f9825f27c0dde27ea709da62a80a2ff9f6b1b86a5874c50d6c37d39ae31fb6c8a0030000000163553b8786020ca74a00000000000665635153ab5275c0760000000000020052e659b05d", "636aab6a6a", 0, -342795451, "f77c3322c97b1681c17b1eba461fa27b07e04c1534e8aaf735a49cab72c7c2e2"], ["bda1ff6804a3c228b7a12799a4c20917301dd501c67847d35da497533a606701ad31bf9d5e0300000001ac16a6c5d03cf516cd7364e4cbbf5aeccd62f8fd03cb6675883a0636a7daeb650423cb1291010000000500656553ac4a63c30b6a835606909c9efbae1b2597e9db020c5ecfc0642da6dc583fba4e84167539a8020000000865525353515200acffffffff990807720a5803c305b7da08a9f24b92abe343c42ac9e917a84e1f335aad785d00000000026a52ffffffff04981f20030000000001ab8c762200000000000253ab690b9605000000000151ce88b301000000000753526a6a51006500000000", "000052ac52530000", 1, -1809193140, "5299b0fb7fc16f40a5d6b337e71fcd1eb04d2600aefd22c06fe9c71fe0b0ba54"], ["2ead28ff0243b3ab285e5d1067f0ec8724224402b21b9cef9be962a8b0d153d401be99bbee0000000004ac635153ffffffff6985987b7c1360c9fa8406dd6e0a61141709f0d5195f946da55ed83be4e3895301000000020053ffffffff016503d20500000000085251ac6a65656a6a00000000", "51abab", 1, 1723793403, "67483ee62516be17a2431a163e96fd88a08ff2ce8634a52e42c1bc04e30f3f8a"], - ["db4904e6026b6dd8d898f278c6428a176410d1ffbde75a4fa37cda12263108ccd4ca6137440100000007656a0000515263ffffffff1db7d5005c1c40da0ed17b74cf6b2a6ee2c33c9e0bacda76c0da2017dcac2fc70200000004abab6a53ffffffff0454cf2103000000000153463aef000000000009ab6a630065ab52636387e0ed050000000000e8d16f05000000000352ac63e4521b22", "", 1, 1027042424, "48315a95e49277ab6a2d561ee4626820b7bab919eea372b6bf4e9931ab221d04"], + ["db4904e6026b6dd8d898f278c6428a176410d1ffbde75a4fa37cda12263108ccd4ca6137440100000007656a0000515263ffffffff1db7d5005c1c40da0ed17b74cf6b2a6ee2c33c9e0bacda76c0da2017dcac2fc70200000004abab6a53ffffffff0454cf2103000000000153463aef000000000009ab6a630065ab52636387e0ed050000000000e8d16f05000000000352ac63e4521b22", "", 1, 1027042424, "443e518e4989d3f9f35b4909664b151e7c61c5041582355005cdb81d252dcd45"], ["dca31ad10461ead74751e83d9a81dcee08db778d3d79ad9a6d079cfdb93919ac1b0b61871102000000086500525365ab51ac7f7e9aed78e1ef8d213d40a1c50145403d196019985c837ffe83836222fe3e5955e177e70100000006525152525300ffffffff5e98482883cc08a6fe946f674cca479822f0576a43bf4113de9cbf414ca628060100000006ac53516a5253ffffffff07490b0b898198ec16c23b75d606e14fa16aa3107ef9818594f72d5776805ec502000000036a0052ffffffff01932a2803000000000865ab6551ac6a516a2687aa06", "635300ac", 2, -1880362326, "74d6a2fa7866fd8b74b2e34693e2d6fd690410384b7afdcd6461b1ae71d265ce"], - ["e14e1a9f0442ab44dfc5f6d945ad1ff8a376bc966aad5515421e96ddbe49e529614995cafc03000000055165515165fffffffff97582b8290e5a5cfeb2b0f018882dbe1b43f60b7f45e4dd21dbd3a8b0cfca3b0200000000daa267726fe075db282d694b9fee7d6216d17a8c1f00b2229085495c5dc5b260c8f8cd5d000000000363ac6affffffffaab083d22d0465471c896a438c6ac3abf4d383ae79420617a8e0ba8b9baa872b010000000963526563ac5363ababd948b5ce022113440200000000076a636552006a53229017040000000000e6f62ac8", "526353636a65", 3, -485265025, "1bc8ad76f9b7c366c5d052dc479d6a8a2015566d3a42e93ab12f727692c89d65"], - ["720d4693025ca3d347360e219e9bc746ef8f7bc88e8795162e5e2f0b0fc99dc17116fc937100000000046353520045cb1fd79824a100d30b6946eab9b219daea2b0cdca6c86367c0c36af98f19ac64f3575002000000008a1c881003ed16f3050000000008536a63630000abac45e0e704000000000151f6551a05000000000963536565515363abab00000000", "6553ab6a6a510000ab", 1, 1249091393, "a575fa4f59a8e90cd07de012c78fe8f981183bb170b9c50fcc292b8c164cbc3b"], + ["e14e1a9f0442ab44dfc5f6d945ad1ff8a376bc966aad5515421e96ddbe49e529614995cafc03000000055165515165fffffffff97582b8290e5a5cfeb2b0f018882dbe1b43f60b7f45e4dd21dbd3a8b0cfca3b0200000000daa267726fe075db282d694b9fee7d6216d17a8c1f00b2229085495c5dc5b260c8f8cd5d000000000363ac6affffffffaab083d22d0465471c896a438c6ac3abf4d383ae79420617a8e0ba8b9baa872b010000000963526563ac5363ababd948b5ce022113440200000000076a636552006a53229017040000000000e6f62ac8", "526353636a65", 3, -485265025, "66d3bb494bd96770976a07635c70ba1d8f00d7649c8c6a23516d9459e5c0b869"], + ["720d4693025ca3d347360e219e9bc746ef8f7bc88e8795162e5e2f0b0fc99dc17116fc937100000000046353520045cb1fd79824a100d30b6946eab9b219daea2b0cdca6c86367c0c36af98f19ac64f3575002000000008a1c881003ed16f3050000000008536a63630000abac45e0e704000000000151f6551a05000000000963536565515363abab00000000", "6553ab6a6a510000ab", 1, 1249091393, "de45e6389bb5bbdcc8f631283c1fcd13c1a0d24bf65a5415c261cf2fade7801c"], ["69df842a04c1410bfca10896467ce664cfa31c681a5dac10106b34d4b9d4d6d0dc1eac01c1000000000551536a5165269835ca4ad7268667b16d0a2df154ec81e304290d5ed69e0069b43f8c89e673328005e200000000076a5153006aacabffffffffc9314bd80b176488f3d634360fcba90c3a659e74a52e100ac91d3897072e3509010000000765abac51636363ffffffff0e0768b13f10f0fbd2fa3f68e4b4841809b3b5ba0e53987c3aaffcf09eee12bf0300000008ac535263526a53ac514f4c2402da8fab0400000000001ef15201000000000451526a52d0ec9aca", "525365ac52", 1, 313967049, "a72a760b361af41832d2c667c7488dc9702091918d11e344afc234a4aea3ec44"], ["adf2340d03af5c589cb5d28c06635ac07dd0757b884d4777ba85a6a7c410408ad5efa8b19001000000045100ab00ffffffff808dc0231c96e6667c04786865727013922bcb7db20739b686f0c17f5ba70e8f0300000000fd2332a654b580881a5e2bfec8313f5aa878ae94312f37441bf2d226e7fc953dcf0c77ab000000000163aa73dc580412f8c2050000000005636aacac63da02d502000000000153e74b52020000000001536b293d030000000009636552ababacab526500000000", "000052ab52ababab", 0, -568651175, "2c45d021db545df7167ac03c9ee56473f2398d9b2b739cf3ff3e074501d324f8"], ["e4fec9f10378a95199c1dd23c6228732c9de0d7997bf1c83918a5cfd36012476c0c3cba24002000000085165536500ac0000ad08ab93fb49d77d12a7ccdbb596bc5110876451b53a79fdce43104ff1c316ad63501de801000000046a6352ab76af9908463444aeecd32516a04dd5803e02680ed7f16307242a794024d93287595250f4000000000089807279041a82e603000000000200521429100200000000055253636a63f20b940400000000004049ed04000000000500ab5265ab43dfaf7d", "6563526aac", 2, -1923470368, "32f3c012eca9a823bebb9b282240aec40ca65df9f38da43b1dcfa0cac0c0df7e"], - ["4000d3600100b7a3ff5b41ec8d6ccdc8b2775ad034765bad505192f05d1f55d2bc39d0cbe10100000007ab5165ac6a5163ffffffff034949150100000000026a6a92c9f6000000000008ab6553ab6aab635200e697040000000007636a5353525365237ae7d2", "52000063", 0, -880046683, "c76146f68f43037289aaeb2bacf47408cddc0fb326b350eb4f5ef6f0f8564793"], + ["4000d3600100b7a3ff5b41ec8d6ccdc8b2775ad034765bad505192f05d1f55d2bc39d0cbe10100000007ab5165ac6a5163ffffffff034949150100000000026a6a92c9f6000000000008ab6553ab6aab635200e697040000000007636a5353525365237ae7d2", "52000063", 0, -880046683, "6de4d730f90e1343a56640fa7ed6863230cb39a92f9a1e90729959e04b36d406"], ["eabc0aa701fe489c0e4e6222d72b52f083166b49d63ad1410fb98caed027b6a71c02ab830c03000000075253ab63530065ffffffff01a5dc0b05000000000253533e820177", "", 0, 954499283, "1d849b92eedb9bf26bd4ced52ce9cb0595164295b0526842ab1096001fcd31b1"], ["d48d55d304aad0139783b44789a771539d052db565379f668def5084daba0dfd348f7dcf6b00000000006826f59e5ffba0dd0ccbac89c1e2d69a346531d7f995dea2ca6d7e6d9225d81aec257c6003000000096a655200ac656552acffffffffa188ffbd5365cae844c8e0dea6213c4d1b2407274ae287b769ab0bf293e049eb0300000005ac6a6aab51ad1c407c5b116ca8f65ed496b476183f85f072c5f8a0193a4273e2015b1cc288bf03e9e2030000000252abffffffff04076f44040000000006655353abab53be6500050000000003ac65ac3c15040500000000095100ab536353516a52ed3aba04000000000900ac53ab53636aabac00000000", "5253526563acac", 2, -1506108646, "bbee17c8582514744bab5df50012c94b0db4aff5984d2e13a8d09421674404e2"], - ["9746f45b039bfe723258fdb6be77eb85917af808211eb9d43b15475ee0b01253d33fc3bfc502000000065163006a655312b12562dc9c54e11299210266428632a7d0ee31d04dfc7375dcad2da6e9c11947ced0e000000000009074095a5ac4df057554566dd04740c61490e1d3826000ad9d8f777a93373c8dddc4918a00000000025351ffffffff01287564030000000004636a00ab00000000", "52", 2, -1380411075, "84af1623366c4db68d81f452b86346832344734492b9c23fbb89015e516c60b2"], - ["8731b64903d735ba16da64af537eaf487b57d73977f390baac57c7b567cb2770dfa2ef65870100000001635aedd990c42645482340eacb0bfa4a0a9e888057389c728b5b6a8691cdeb1a6a67b45e140200000008ac53526a52516551ffffffff45c4f567c47b8d999916fd49642cbc5d10d43c304b99e32d044d35091679cb860100000003006a51ffffffff0176d6c200000000000000000000", "ab6a65ab53", 2, -1221546710, "ccfdba36d9445f4451fb7cbf0752cc89c23d4fc6fff0f3930d20e116f9db0b95"], + ["9746f45b039bfe723258fdb6be77eb85917af808211eb9d43b15475ee0b01253d33fc3bfc502000000065163006a655312b12562dc9c54e11299210266428632a7d0ee31d04dfc7375dcad2da6e9c11947ced0e000000000009074095a5ac4df057554566dd04740c61490e1d3826000ad9d8f777a93373c8dddc4918a00000000025351ffffffff01287564030000000004636a00ab00000000", "52", 2, -1380411075, "51766da64c87306b05ecbc022313e48deff7760f9823b57bb6c5921479520e3b"], + ["8731b64903d735ba16da64af537eaf487b57d73977f390baac57c7b567cb2770dfa2ef65870100000001635aedd990c42645482340eacb0bfa4a0a9e888057389c728b5b6a8691cdeb1a6a67b45e140200000008ac53526a52516551ffffffff45c4f567c47b8d999916fd49642cbc5d10d43c304b99e32d044d35091679cb860100000003006a51ffffffff0176d6c200000000000000000000", "ab6a65ab53", 2, -1221546710, "114d23384ff69b3a7499d139e7c6cce3ac32a8255c569d3ceecb72cf6f838826"], ["f5cfc52f016209ab1385e890c2865a74e93076595d1ca77cbe8fbf2022a2f2061a90fb0f3e010000000253acffffffff027de73f0200000000085252ac510052acac49cd6a020000000000e6c2cb56", "516552535300ab63", 0, -1195302704, "5532717402a2da01a1da912d824964024185ca7e8d4ad1748659dc393a14182b"], - ["df0a32ae01c4672fd1abd0b2623aae0a1a8256028df57e532f9a472d1a9ceb194267b6ee190200000009536a6a51516a525251b545f9e803469a2302000000000465526500810631040000000000441f5b050000000006530051006aaceb183c76", "536a635252ac6a", 0, 1601138113, "9a0435996cc58bdba09643927fe48c1fc908d491a050abbef8daec87f323c58f"], - ["d102d10c028b9c721abb259fe70bc68962f6cae384dabd77477c59cbeb1fb26266e091ba3e0100000002516affffffffe8d7305a74f43e30c772109849f4cd6fb867c7216e6d92e27605e69a0818899700000000026a65ecf82d58027db4620500000000026552c28ed3010000000001ab00000000", "0051ab515365", 1, -131815460, "1d1757a782cb5860302128bcbe9398243124a2f82d671a113f74f8e582c7a182"], + ["df0a32ae01c4672fd1abd0b2623aae0a1a8256028df57e532f9a472d1a9ceb194267b6ee190200000009536a6a51516a525251b545f9e803469a2302000000000465526500810631040000000000441f5b050000000006530051006aaceb183c76", "536a635252ac6a", 0, 1601138113, "1c4a4feafad3d5e47f00f71d339ebb750b848887c53fbe0e2893ea748db481d2"], + ["d102d10c028b9c721abb259fe70bc68962f6cae384dabd77477c59cbeb1fb26266e091ba3e0100000002516affffffffe8d7305a74f43e30c772109849f4cd6fb867c7216e6d92e27605e69a0818899700000000026a65ecf82d58027db4620500000000026552c28ed3010000000001ab00000000", "0051ab515365", 1, -131815460, "398996ed7f857e00e14fb7f5992d9a2be5faf9624c128fd093fbc8ae38918855"], ["cef930ed01c36fcb1d62ceef931bef57098f27a77a4299904cc0cbb44504802d535fb11557010000000153ffffffff02c8657403000000000863ac655253520063d593380400000000046aab536a00000000", "656a0051ab6365ab53", 0, -351313308, "e69dba3efb5c02af2ab1087d0a990678784671f4744d01ca097d71aec14dd8e9"], ["b1c0b71804dff30812b92eefb533ac77c4b9fdb9ab2f77120a76128d7da43ad70c20bbfb990200000002536392693e6001bc59411aebf15a3dc62a6566ec71a302141b0c730a3ecc8de5d76538b30f55010000000665535252ac514b740c6271fb9fe69fdf82bf98b459a7faa8a3b62f3af34943ad55df4881e0d93d3ce0ac0200000000c4158866eb9fb73da252102d1e64a3ce611b52e873533be43e6883137d0aaa0f63966f060000000001abffffffff04a605b604000000000851006a656a630052f49a0300000000000252515a94e1050000000009abac65ab0052abab00fd8dd002000000000651535163526a2566852d", "ac5363", 0, -1718831517, "b0dc030661783dd9939e4bf1a6dfcba809da2017e1b315a6312e5942d714cf05"], - ["6a270ee404ebc8d137cfd4bb6b92aa3702213a3139a579c1fc6f56fbc7edd9574ef17b13f30100000009ab00ab656565ababacffffffffaa65b1ab6c6d87260d9e27a472edceb7dd212483e72d90f08857abf1dbfd46d10100000000fffffffff93c4c9c84c4dbbe8a912b99a2830cfe3401aebc919041de063d660e585fc9f002000000096aabacab52ac6a53acfa6dcef3f28355a8d98eee53839455445eeee83eecd2c854e784efa53cee699dbfecaebd0100000003ab6a51ffffffff04f7d71b050000000009ac6a536aac6a6365513c37650500000000065265abab6a53fa742002000000000039ed82030000000009516aac635165ab51ab2fdabd17", "ab535252526563", 1, -1326210506, "1dec0d5eb921bf5b2df39c8576e19c38d0c17254a4a0b78ac4b5422bcc426258"], - ["3657e4260304ccdc19936e47bdf058d36167ee3d4eb145c52b224eff04c9eb5d1b4e434dfc0000000001ab58aefe57707c66328d3cceef2e6f56ab6b7465e587410c5f73555a513ace2b232793a74400000000036a006522e69d3a785b61ad41a635d59b3a06b2780a92173f85f8ed428491d0aaa436619baa9c4501000000046351abab2609629902eb7793050000000000a1b967040000000003525353a34d6192", "516a", 0, -1761874713, "0a2ff41f6d155d8d0e37cd9438f3b270df9f9214cda8e95c76d5a239ca189df2"], + ["6a270ee404ebc8d137cfd4bb6b92aa3702213a3139a579c1fc6f56fbc7edd9574ef17b13f30100000009ab00ab656565ababacffffffffaa65b1ab6c6d87260d9e27a472edceb7dd212483e72d90f08857abf1dbfd46d10100000000fffffffff93c4c9c84c4dbbe8a912b99a2830cfe3401aebc919041de063d660e585fc9f002000000096aabacab52ac6a53acfa6dcef3f28355a8d98eee53839455445eeee83eecd2c854e784efa53cee699dbfecaebd0100000003ab6a51ffffffff04f7d71b050000000009ac6a536aac6a6365513c37650500000000065265abab6a53fa742002000000000039ed82030000000009516aac635165ab51ab2fdabd17", "ab535252526563", 1, -1326210506, "2251ec973215dd9bcd2d40c8bdf3ccf1bb11054ae3ac30ee6c4004342e9fb8b8"], + ["3657e4260304ccdc19936e47bdf058d36167ee3d4eb145c52b224eff04c9eb5d1b4e434dfc0000000001ab58aefe57707c66328d3cceef2e6f56ab6b7465e587410c5f73555a513ace2b232793a74400000000036a006522e69d3a785b61ad41a635d59b3a06b2780a92173f85f8ed428491d0aaa436619baa9c4501000000046351abab2609629902eb7793050000000000a1b967040000000003525353a34d6192", "516a", 0, -1761874713, "ff9a423fb63c26cf425babddf959e9c206c14b4f70f91f85572d5add633b5321"], ["a0eb6dc402994e493c787b45d1f946d267b09c596c5edde043e620ce3d59e95b2b5b93d43002000000096a5252526aac63ab6555694287a279e29ee491c177a801cd685b8744a2eab83824255a3bcd08fc0e3ea13fb8820000000009abab6365ab52ab0063ffffffff029e424a040000000008acab53ab516a636a23830f0400000000016adf49c1f9", "ac0065ac6500005252", 1, 669294500, "e05e3d383631a7ed1b78210c13c2eb26564e5577db7ddfcea2583c7c014091d4"], - ["6e67c0d3027701ef71082204c85ed63c700ef1400c65efb62ce3580d187fb348376a23e9710200000001655b91369d3155ba916a0bc6fe4f5d94cad461d899bb8aaac3699a755838bfc229d6828920010000000765536353526a52ffffffff04c0c792000000000005650052535372f79e000000000001527fc0ee010000000005ac5300ab65d1b3e902000000000251aba942b278", "6a5151", 0, 1741407676, "e657e2c8ec4ebc769ddd3198a83267b47d4f2a419fc737e813812acefad92ff7"], - ["8f53639901f1d643e01fc631f632b7a16e831d846a0184cdcda289b8fa7767f0c292eb221a00000000046a53abacffffffff037a2daa01000000000553ac6a6a51eac349020000000005ac526552638421b3040000000007006a005100ac63048a1492", "ac65", 0, 1033685559, "da86c260d42a692358f46893d6f91563985d86eeb9ea9e21cd38c2d8ffcfcc4d"], - ["491f99cb01bdfba1aa235e5538dac081fae9ce55f9622de483afe7e65105c2b0db75d360d200000000045251636340b60f0f041421330300000000096351ac000051636553ce2822040000000005516a00ac5180c8e40300000000025100caa8570400000000020000cfdc8da6", "6a5100516aab655365", 0, -953727341, "397c68803b7ce953666830b0221a5e2bcf897aa2ded8e36a6b76c497dcb1a2e1"], + ["6e67c0d3027701ef71082204c85ed63c700ef1400c65efb62ce3580d187fb348376a23e9710200000001655b91369d3155ba916a0bc6fe4f5d94cad461d899bb8aaac3699a755838bfc229d6828920010000000765536353526a52ffffffff04c0c792000000000005650052535372f79e000000000001527fc0ee010000000005ac5300ab65d1b3e902000000000251aba942b278", "6a5151", 0, 1741407676, "e89895407c9775ff686c36dd6f90806f58ff6f886cce233f8ecc7b622cf4a355"], + ["8f53639901f1d643e01fc631f632b7a16e831d846a0184cdcda289b8fa7767f0c292eb221a00000000046a53abacffffffff037a2daa01000000000553ac6a6a51eac349020000000005ac526552638421b3040000000007006a005100ac63048a1492", "ac65", 0, 1033685559, "a89202277c5cfa17686f1b57e9a8a66beca589b4aad76ffef9ec4bc3aa5712aa"], + ["491f99cb01bdfba1aa235e5538dac081fae9ce55f9622de483afe7e65105c2b0db75d360d200000000045251636340b60f0f041421330300000000096351ac000051636553ce2822040000000005516a00ac5180c8e40300000000025100caa8570400000000020000cfdc8da6", "6a5100516aab655365", 0, -953727341, "12a718bac9fb12823431e5c79b86bcb10d8e4f62375789a6ae106d3193f94168"], ["b3cad3a7041c2c17d90a2cd994f6c37307753fa3635e9ef05ab8b1ff121ca11239a0902e700300000009ab635300006aac5163ffffffffcec91722c7468156dce4664f3c783afef147f0e6f80739c83b5f09d5a09a57040200000004516a6552ffffffff969d1c6daf8ef53a70b7cdf1b4102fb3240055a8eaeaed2489617cd84cfd56cf020000000352ab53ffffffff46598b6579494a77b593681c33422a99559b9993d77ca2fa97833508b0c169f80200000009655300655365516351ffffffff04d7ddf800000000000853536a65ac6351ab09f3420300000000056aab65abac33589d04000000000952656a65655151acac944d6f0400000000006a8004ba", "005165", 1, 1035865506, "fe1dc9e8554deecf8f50c417c670b839cc9d650722ebaaf36572418756075d58"], ["e1cfd73b0125add9e9d699f5a45dca458355af175a7bd4486ebef28f1928d87864384d02df02000000036a0051ffffffff0357df030100000000036a5365777e2d04000000000763ab6a00005265f434a601000000000351655100000000", "ab53ab", 0, -1936500914, "950f4b4f72ccdf8a6a0f381265d6c8842fdb7e8b3df3e9742905f643b2432b69"], - ["cf781855040a755f5ba85eef93837236b34a5d3daeb2dbbdcf58bb811828d806ed05754ab8010000000351ac53ffffffffda1e264727cf55c67f06ebcc56dfe7fa12ac2a994fecd0180ce09ee15c480f7d00000000096351516a51acac00ab53dd49ff9f334befd6d6f87f1a832cddfd826a90b78fd8cf19a52cb8287788af94e939d6020000000700525251ac526310d54a7e8900ed633f0f6f0841145aae7ee0cbbb1e2a0cae724ee4558dbabfdc58ba6855010000000552536a53abfd1b101102c51f910500000000096300656a525252656a300bee010000000009ac52005263635151abe19235c9", "53005365", 2, 1422854188, "d5981bd4467817c1330da72ddb8760d6c2556cd809264b2d85e6d274609fc3a3"], + ["cf781855040a755f5ba85eef93837236b34a5d3daeb2dbbdcf58bb811828d806ed05754ab8010000000351ac53ffffffffda1e264727cf55c67f06ebcc56dfe7fa12ac2a994fecd0180ce09ee15c480f7d00000000096351516a51acac00ab53dd49ff9f334befd6d6f87f1a832cddfd826a90b78fd8cf19a52cb8287788af94e939d6020000000700525251ac526310d54a7e8900ed633f0f6f0841145aae7ee0cbbb1e2a0cae724ee4558dbabfdc58ba6855010000000552536a53abfd1b101102c51f910500000000096300656a525252656a300bee010000000009ac52005263635151abe19235c9", "53005365", 2, 1422854188, "47dfd7edfcc7045a7e02772c09b13c108b8bb1432c56daf086e90e2b407c4625"], ["fea256ce01272d125e577c0a09570a71366898280dda279b021000db1325f27edda41a53460100000002ab53c752c21c013c2b3a01000000000000000000", "65", 0, 1145543262, "076b9f844f6ae429de228a2c337c704df1652c292b6c6494882190638dad9efd"] ] diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp index b6432480bf681..26834e412d72c 100644 --- a/src/test/sighash_tests.cpp +++ b/src/test/sighash_tests.cpp @@ -201,9 +201,6 @@ BOOST_AUTO_TEST_CASE(sighash_test) // TODO: Update with Sapling transactions.. BOOST_AUTO_TEST_CASE(sighash_from_data) { - /* TODO: update with proper signatures of saplingVersion txes - * - UniValue tests = read_json(std::string(json_tests::sighash, json_tests::sighash + sizeof(json_tests::sighash))); for (unsigned int idx = 0; idx < tests.size(); idx++) { @@ -248,8 +245,5 @@ BOOST_AUTO_TEST_CASE(sighash_from_data) sh = SignatureHash(scriptCode, tx, nIn, nHashType, 0, tx.GetRequiredSigVersion()); BOOST_CHECK_MESSAGE(sh.GetHex() == sigHashHex, strTest); } - - * - */ } BOOST_AUTO_TEST_SUITE_END() From ee5306fd4c521c29be7018001bac6c72d67a3ea3 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 19:04:13 +0100 Subject: [PATCH 43/86] Tests: Update sapling_malleable-sigs test, now failing Github-Pull: #2064 Rebased-From: e5b8dbafaa4b726315360b76256df56153940788 --- test/functional/sapling_malleable_sigs.py | 26 ++++------------------- test/functional/test_runner.py | 1 + 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/test/functional/sapling_malleable_sigs.py b/test/functional/sapling_malleable_sigs.py index 553dea15854db..75c0bb275a1d8 100755 --- a/test/functional/sapling_malleable_sigs.py +++ b/test/functional/sapling_malleable_sigs.py @@ -11,7 +11,7 @@ ) from test_framework.util import ( assert_equal, - assert_greater_than, + assert_raises_rpc_error, bytes_to_hex_str, hex_str_to_bytes, ) @@ -31,9 +31,6 @@ def run_test(self): node.generate(2) assert_equal(node.getblockcount(), 202) - t_balance = node.getbalance() - z_balance = node.getshieldedbalance() - z_addr = node.getnewshieldedaddress() shield_to = [{"address": z_addr, "amount": Decimal('10')}] @@ -49,24 +46,9 @@ def run_test(self): new_tx.sapData = b"" new_rawtx = bytes_to_hex_str(new_tx.serialize()) self.log.info("Sending malleated tx...") - txid = node.sendrawtransaction(new_rawtx, True) - assert(txid is not None) - self.log.info("Tx accepted in mempool") - - # No notes minted - assert_equal(node.getshieldedbalance(), z_balance) - # But 10 PIV have been effectively burned - fee = - Decimal(node.gettransaction(txid)['fee']) - assert_greater_than(fee, Decimal('10')) - assert_equal(node.getbalance(), t_balance - fee) - - hashes = node.generate(1) - assert_equal(len(hashes), 1) - chain_tx = node.gettransaction(txid) - assert_equal(chain_tx['confirmations'], 1) - self.log.info("Malleated Tx accepted on chain") - - + assert_raises_rpc_error(-26, "mandatory-script-verify-flag-failed", + node.sendrawtransaction, new_rawtx, True) + self.log.info("Good. Tx NOT accepted in mempool") diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 7bc1f58f80f63..c22016503107f 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -154,6 +154,7 @@ 'sapling_mempool.py', # ~ 98 sec 'sapling_wallet_persistence.py', # ~ 90 sec 'sapling_supply.py', # ~ 58 sec + 'sapling_malleable_sigs.py', # ~ 44 sec ] EXTENDED_SCRIPTS = [ From a46f00dad3a6ffe3bcafb0fd03448727d3fcc8d4 Mon Sep 17 00:00:00 2001 From: furszy Date: Mon, 14 Dec 2020 16:55:00 -0300 Subject: [PATCH 44/86] [Cleanup] Remove unused global fields from util.h/cpp Github-Pull: #2063 Rebased-From: 0b620155d6c038a01b5fe62a3af14b89a5400a51 --- src/util.cpp | 6 +----- src/util.h | 3 --- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/util.cpp b/src/util.cpp index 0ef573ca4913f..c69810c0224cc 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -92,11 +92,7 @@ const char * const PIVX_MASTERNODE_CONF_FILENAME = "masternode.conf"; std::atomic fMasterNode{false}; std::string strMasterNodeAddr = ""; bool fLiteMode = false; - - -/** Spork enforcement enabled time */ -int64_t enforceMasternodePaymentsTime = 4085657524; -bool fSucessfullyLoaded = false; +// budget finalization std::string strBudgetMode = ""; ArgsManager gArgs; diff --git a/src/util.h b/src/util.h index 00b927910e626..a596ac376bf48 100644 --- a/src/util.h +++ b/src/util.h @@ -43,10 +43,7 @@ extern const char * const DEFAULT_DEBUGLOGFILE; extern std::atomic fMasterNode; extern bool fLiteMode; -extern int64_t enforceMasternodePaymentsTime; extern std::string strMasterNodeAddr; -extern int keysLoaded; -extern bool fSucessfullyLoaded; extern std::string strBudgetMode; extern std::string strMiscWarning; From 0ece82d867473d54e137c6f0725752e881315d98 Mon Sep 17 00:00:00 2001 From: furszy Date: Mon, 14 Dec 2020 17:02:04 -0300 Subject: [PATCH 45/86] Separate CTranslationInterface from CClientUIInterface Coming from btc@b74dcb3b4aa29958d22135f2d6c015578069e83c Github-Pull: #2063 Rebased-From: c684718c383a0fe291b7a57dc5f4b2c4369d1580 --- src/guiinterface.h | 13 ------------- src/init.cpp | 2 +- src/pivx-cli.cpp | 2 -- src/pivx-tx.cpp | 2 -- src/pivxd.cpp | 7 ++----- src/qt/pivx.cpp | 2 +- src/rpc/client.cpp | 4 ---- src/test/test_pivx.cpp | 2 +- src/util.cpp | 1 + src/util.h | 21 +++++++++++++++++++++ 10 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/guiinterface.h b/src/guiinterface.h index cc1a0cc087f81..03307315948e9 100644 --- a/src/guiinterface.h +++ b/src/guiinterface.h @@ -85,9 +85,6 @@ class CClientUIInterface /** Progress message during initialization. */ boost::signals2::signal InitMessage; - /** Translate a message to the native language of the user. */ - boost::signals2::signal Translate; - /** Number of network connections changed. */ boost::signals2::signal NotifyNumConnectionsChanged; @@ -112,14 +109,4 @@ class CClientUIInterface extern CClientUIInterface uiInterface; -/** - * Translation function: Call Translate signal on UI interface, which returns a boost::optional result. - * If no translation slot is registered, nothing is returned, and simply return the input. - */ -inline std::string _(const char* psz) -{ - Optional rv = uiInterface.Translate(psz); - return rv ? (*rv) : psz; -} - #endif // BITCOIN_GUIINTERFACE_H diff --git a/src/init.cpp b/src/init.cpp index e287b3091711f..6e4c9b6d395e3 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -125,7 +125,7 @@ enum BindFlags { }; static const char* FEE_ESTIMATES_FILENAME = "fee_estimates.dat"; -CClientUIInterface uiInterface; +CClientUIInterface uiInterface; // Declared but not defined in guiinterface.h ////////////////////////////////////////////////////////////////////////////// // diff --git a/src/pivx-cli.cpp b/src/pivx-cli.cpp index b5913b3aeabb3..fa9a3636621a9 100644 --- a/src/pivx-cli.cpp +++ b/src/pivx-cli.cpp @@ -22,8 +22,6 @@ #include -#define _(x) std::string(x) /* Keep the _() around in case gettext or such will be used later to translate non-UI */ - static const char DEFAULT_RPCCONNECT[] = "127.0.0.1"; static const int DEFAULT_HTTP_CLIENT_TIMEOUT=900; diff --git a/src/pivx-tx.cpp b/src/pivx-tx.cpp index c1283f3d808b2..e662c11a0f912 100644 --- a/src/pivx-tx.cpp +++ b/src/pivx-tx.cpp @@ -13,7 +13,6 @@ #include "primitives/transaction.h" #include "script/script.h" #include "script/sign.h" -#include "guiinterface.h" // for _(...) #include #include "util.h" #include "utilmoneystr.h" @@ -27,7 +26,6 @@ static bool fCreateBlank; static std::map registers; -CClientUIInterface uiInterface; static bool AppInitRawTx(int argc, char* argv[]) { diff --git a/src/pivxd.cpp b/src/pivxd.cpp index 03048071ebc2f..e864228ef0370 100644 --- a/src/pivxd.cpp +++ b/src/pivxd.cpp @@ -3,19 +3,16 @@ // Copyright (c) 2014-2015 The Dash developers // Copyright (c) 2015-2019 The PIVX developers // Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// file COPYING or https://www.opensource.org/licenses/mit-license.php. +#include "chainparams.h" #include "clientversion.h" #include "fs.h" #include "init.h" #include "masternodeconfig.h" #include "noui.h" #include "rpc/server.h" -#include "guiinterface.h" #include "util.h" -#include "httpserver.h" -#include "httprpc.h" -#include "validation.h" #include diff --git a/src/qt/pivx.cpp b/src/qt/pivx.cpp index c414c5fe3b795..056e0ac30a668 100644 --- a/src/qt/pivx.cpp +++ b/src/qt/pivx.cpp @@ -567,7 +567,7 @@ int main(int argc, char* argv[]) // Now that QSettings are accessible, initialize translations //initTranslations(qtTranslatorBase, qtTranslator, translatorBase, translator); app.updateTranslation(); - uiInterface.Translate.connect(Translate); + translationInterface.Translate.connect(Translate); // Show help message immediately after parsing command-line options (for "-lang") and setting locale, // but before showing splash screen. diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index 66d171794e46f..69862e3ff33fe 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -7,10 +7,6 @@ #include "rpc/client.h" -#include "rpc/protocol.h" -#include "guiinterface.h" -#include "util.h" - #include #include diff --git a/src/test/test_pivx.cpp b/src/test/test_pivx.cpp index a307bc12626d9..c483520f10ee3 100644 --- a/src/test/test_pivx.cpp +++ b/src/test/test_pivx.cpp @@ -21,7 +21,7 @@ std::unique_ptr g_connman; -CClientUIInterface uiInterface; +CClientUIInterface uiInterface; // Declared but not defined in guiinterface.h uint256 insecure_rand_seed = GetRandHash(); FastRandomContext insecure_rand_ctx(insecure_rand_seed); diff --git a/src/util.cpp b/src/util.cpp index c69810c0224cc..26c8c50dc2a90 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -99,6 +99,7 @@ ArgsManager gArgs; bool fDaemon = false; std::string strMiscWarning; +CTranslationInterface translationInterface; /** Init OpenSSL library multithreading support */ static RecursiveMutex** ppmutexOpenSSL; diff --git a/src/util.h b/src/util.h index a596ac376bf48..10e8434c67f3a 100644 --- a/src/util.h +++ b/src/util.h @@ -32,8 +32,17 @@ #include #include +#include #include // for boost::thread_interrupted +/** Signals for translation. */ +class CTranslationInterface +{ +public: + /** Translate a message to the native language of the user. */ + boost::signals2::signal Translate; +}; + extern const char * const PIVX_CONF_FILENAME; extern const char * const PIVX_PID_FILENAME; extern const char * const PIVX_MASTERNODE_CONF_FILENAME; @@ -47,6 +56,18 @@ extern std::string strMasterNodeAddr; extern std::string strBudgetMode; extern std::string strMiscWarning; +extern CTranslationInterface translationInterface; + +/** + * Translation function: Call Translate signal on UI interface, which returns a Optional result. + * If no translation slot is registered, nothing is returned, and simply return the input. + */ +inline std::string _(const char* psz) +{ + // todo: this boost::optional is needed for now. Will get removed moving forward + boost::optional rv = translationInterface.Translate(psz); + return rv ? (*rv) : psz; +} void SetupEnvironment(); From 3fc15971c4ec66f9379ca664ad4e7a55d3bbdfe5 Mon Sep 17 00:00:00 2001 From: furszy Date: Mon, 14 Dec 2020 18:16:06 -0300 Subject: [PATCH 46/86] Make QT runawayException call GetWarnings instead of directly access strMiscWarning. This is a first step in avoiding racy accesses to strMiscWarning. The change required moving GetWarnings and related globals to util. Coming from btc@c63198f1c787d69052d6332c5e52118f58eacf56 Github-Pull: #2063 Rebased-From: 5fdd73efa899621ae2cb5ce505814ae9b5e660b1 --- src/qt/pivx.cpp | 6 +++--- src/util.cpp | 35 ++++++++++++++++++++++++++++++++++- src/util.h | 8 +++++++- src/validation.cpp | 33 --------------------------------- src/validation.h | 4 ---- 5 files changed, 44 insertions(+), 42 deletions(-) diff --git a/src/qt/pivx.cpp b/src/qt/pivx.cpp index 056e0ac30a668..5d186792001bd 100644 --- a/src/qt/pivx.cpp +++ b/src/qt/pivx.cpp @@ -247,7 +247,7 @@ BitcoinCore::BitcoinCore() : QObject() void BitcoinCore::handleRunawayException(const std::exception* e) { PrintExceptionContinue(e, "Runaway exception"); - Q_EMIT runawayException(QString::fromStdString(strMiscWarning)); + Q_EMIT runawayException(QString::fromStdString(GetWarnings("gui"))); } void BitcoinCore::initialize() @@ -696,10 +696,10 @@ int main(int argc, char* argv[]) app.exec(); } catch (const std::exception& e) { PrintExceptionContinue(&e, "Runaway exception"); - app.handleRunawayException(QString::fromStdString(strMiscWarning)); + app.handleRunawayException(QString::fromStdString(GetWarnings("gui"))); } catch (...) { PrintExceptionContinue(NULL, "Runaway exception"); - app.handleRunawayException(QString::fromStdString(strMiscWarning)); + app.handleRunawayException(QString::fromStdString(GetWarnings("gui"))); } return app.getReturnValue(); } diff --git a/src/util.cpp b/src/util.cpp index 26c8c50dc2a90..860884b2c9f31 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -98,9 +98,12 @@ std::string strBudgetMode = ""; ArgsManager gArgs; bool fDaemon = false; -std::string strMiscWarning; CTranslationInterface translationInterface; +std::string strMiscWarning; +bool fLargeWorkForkFound = false; +bool fLargeWorkInvalidChainFound = false; + /** Init OpenSSL library multithreading support */ static RecursiveMutex** ppmutexOpenSSL; void locking_callback(int mode, int i, const char* file, int line) NO_THREAD_SAFETY_ANALYSIS @@ -839,3 +842,33 @@ int GetNumCores() { return std::thread::hardware_concurrency(); } + +std::string GetWarnings(const std::string& strFor) +{ + std::string strStatusBar; + std::string strRPC; + + if (!CLIENT_VERSION_IS_RELEASE) + strStatusBar = _("This is a pre-release test build - use at your own risk - do not use for staking or merchant applications!"); + + if (gArgs.GetBoolArg("-testsafemode", DEFAULT_TESTSAFEMODE)) + strStatusBar = strRPC = "testsafemode enabled"; + + // Misc warnings like out of disk space and clock is wrong + if (strMiscWarning != "") { + strStatusBar = strMiscWarning; + } + + if (fLargeWorkForkFound) { + strStatusBar = strRPC = _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."); + } else if (fLargeWorkInvalidChainFound) { + strStatusBar = strRPC = _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); + } + + if (strFor == "statusbar") + return strStatusBar; + else if (strFor == "rpc") + return strRPC; + assert(!"GetWarnings() : invalid parameter"); + return "error"; +} diff --git a/src/util.h b/src/util.h index 10e8434c67f3a..ef0d17eecd392 100644 --- a/src/util.h +++ b/src/util.h @@ -55,9 +55,13 @@ extern bool fLiteMode; extern std::string strMasterNodeAddr; extern std::string strBudgetMode; -extern std::string strMiscWarning; extern CTranslationInterface translationInterface; +static const bool DEFAULT_TESTSAFEMODE = false; +extern std::string strMiscWarning; +extern bool fLargeWorkForkFound; +extern bool fLargeWorkInvalidChainFound; + /** * Translation function: Call Translate signal on UI interface, which returns a Optional result. * If no translation slot is registered, nothing is returned, and simply return the input. @@ -262,4 +266,6 @@ void TraceThread(const char* name, Callable func) fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific = true); +std::string GetWarnings(const std::string& strFor); + #endif // BITCOIN_UTIL_H diff --git a/src/validation.cpp b/src/validation.cpp index f8e0edbda9459..42921b165538a 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -836,8 +836,6 @@ bool IsInitialBlockDownload() return state; } -bool fLargeWorkForkFound = false; -bool fLargeWorkInvalidChainFound = false; CBlockIndex *pindexBestForkTip = NULL, *pindexBestForkBase = NULL; static void AlertNotify(const std::string& strMessage) @@ -4087,37 +4085,6 @@ void static CheckBlockIndex() assert(nNodes == forward.size()); } - -std::string GetWarnings(std::string strFor) -{ - std::string strStatusBar; - std::string strRPC; - - if (!CLIENT_VERSION_IS_RELEASE) - strStatusBar = _("This is a pre-release test build - use at your own risk - do not use for staking or merchant applications!"); - - if (gArgs.GetBoolArg("-testsafemode", DEFAULT_TESTSAFEMODE)) - strStatusBar = strRPC = "testsafemode enabled"; - - // Misc warnings like out of disk space and clock is wrong - if (strMiscWarning != "") { - strStatusBar = strMiscWarning; - } - - if (fLargeWorkForkFound) { - strStatusBar = strRPC = _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."); - } else if (fLargeWorkInvalidChainFound) { - strStatusBar = strRPC = _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); - } - - if (strFor == "statusbar") - return strStatusBar; - else if (strFor == "rpc") - return strRPC; - assert(!"GetWarnings() : invalid parameter"); - return "error"; -} - // Note: whenever a protocol update is needed toggle between both implementations (comment out the formerly active one) // so we can leave the existing clients untouched (old SPORK will stay on so they don't see even older clients). // Those old clients won't react to the changes of the other (new) SPORK because at the time of their implementation diff --git a/src/validation.h b/src/validation.h index cd19d4db5dcb3..9715c02a087f3 100644 --- a/src/validation.h +++ b/src/validation.h @@ -66,8 +66,6 @@ static const unsigned int DEFAULT_MEMPOOL_EXPIRY = 72; /** Default for -txindex */ static const bool DEFAULT_TXINDEX = true; static const bool DEFAULT_CHECKPOINTS_ENABLED = true; -/** Default for -testsafemode */ -static const bool DEFAULT_TESTSAFEMODE = false; /** Default for -relaypriority */ static const bool DEFAULT_RELAYPRIORITY = true; /** Default for -limitfeerelay */ @@ -200,8 +198,6 @@ void ThreadScriptCheck(); /** Check whether we are doing an initial block download (synchronizing from disk or network) */ bool IsInitialBlockDownload(); -/** Format a string that describes several potential problems detected by the core */ -std::string GetWarnings(std::string strFor); /** Retrieve a transaction (from memory pool, or from disk, if possible) */ bool GetTransaction(const uint256& hash, CTransaction& tx, uint256& hashBlock, bool fAllowSlow = false, CBlockIndex* blockIndex = nullptr); /** Retrieve an output (from memory pool, or from disk, if possible) */ From 60cc6f237bd89af417d4709ef581bbbba508df6a Mon Sep 17 00:00:00 2001 From: furszy Date: Mon, 14 Dec 2020 19:05:15 -0300 Subject: [PATCH 47/86] Eliminate data races for strMiscWarning and fLargeWork*Found. This moves all access to these datastructures through accessor functions and protects them with a lock. Coming from btc@e3ba0ef95636290a3bb597ddd25d13ea13b034aa Github-Pull: #2063 Rebased-From: e074feb3e563191fbbc038adfa88e486ae944969 --- src/timedata.cpp | 4 ++-- src/util.cpp | 33 +++++++++++++++++++++++++++++++++ src/util.h | 8 +++++--- src/validation.cpp | 22 ++++++++++++---------- 4 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/timedata.cpp b/src/timedata.cpp index 1d80b9551efc8..f1adc750a8d7e 100644 --- a/src/timedata.cpp +++ b/src/timedata.cpp @@ -74,11 +74,11 @@ void AddTimeData(const CNetAddr& ip, int64_t nOffsetSample, int nOffsetLimit) // Only let other nodes change our time by so much if (abs64(nMedian) < nOffsetLimit) { nTimeOffset = nMedian; - strMiscWarning = ""; + SetMiscWarning(""); } else { nTimeOffset = (nMedian > 0 ? 1 : -1) * nOffsetLimit; std::string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong PIVX Core will not work properly."); - strMiscWarning = strMessage; + SetMiscWarning(strMessage); LogPrintf("*** %s\n", strMessage); uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_ERROR); } diff --git a/src/util.cpp b/src/util.cpp index 860884b2c9f31..080cac8210c73 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -100,6 +100,7 @@ ArgsManager gArgs; bool fDaemon = false; CTranslationInterface translationInterface; +RecursiveMutex cs_warnings; std::string strMiscWarning; bool fLargeWorkForkFound = false; bool fLargeWorkInvalidChainFound = false; @@ -843,11 +844,43 @@ int GetNumCores() return std::thread::hardware_concurrency(); } +void SetMiscWarning(const std::string& strWarning) +{ + LOCK(cs_warnings); + strMiscWarning = strWarning; +} + +void SetfLargeWorkForkFound(bool flag) +{ + LOCK(cs_warnings); + fLargeWorkForkFound = flag; +} + +bool GetfLargeWorkForkFound() +{ + LOCK(cs_warnings); + return fLargeWorkForkFound; +} + +void SetfLargeWorkInvalidChainFound(bool flag) +{ + LOCK(cs_warnings); + fLargeWorkInvalidChainFound = flag; +} + +bool GetfLargeWorkInvalidChainFound() +{ + LOCK(cs_warnings); + return fLargeWorkInvalidChainFound; +} + std::string GetWarnings(const std::string& strFor) { std::string strStatusBar; std::string strRPC; + LOCK(cs_warnings); + if (!CLIENT_VERSION_IS_RELEASE) strStatusBar = _("This is a pre-release test build - use at your own risk - do not use for staking or merchant applications!"); diff --git a/src/util.h b/src/util.h index ef0d17eecd392..3ba401a46a87f 100644 --- a/src/util.h +++ b/src/util.h @@ -58,9 +58,6 @@ extern std::string strBudgetMode; extern CTranslationInterface translationInterface; static const bool DEFAULT_TESTSAFEMODE = false; -extern std::string strMiscWarning; -extern bool fLargeWorkForkFound; -extern bool fLargeWorkInvalidChainFound; /** * Translation function: Call Translate signal on UI interface, which returns a Optional result. @@ -266,6 +263,11 @@ void TraceThread(const char* name, Callable func) fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific = true); +void SetMiscWarning(const std::string& strWarning); +void SetfLargeWorkForkFound(bool flag); +bool GetfLargeWorkForkFound(); +void SetfLargeWorkInvalidChainFound(bool flag); +bool GetfLargeWorkInvalidChainFound(); std::string GetWarnings(const std::string& strFor); #endif // BITCOIN_UTIL_H diff --git a/src/validation.cpp b/src/validation.cpp index 42921b165538a..652aad132280f 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -874,7 +874,7 @@ void CheckForkWarningConditions() pindexBestForkTip = nullptr; if (pindexBestForkTip || (pindexBestInvalid && pindexBestInvalid->nChainWork > pChainTip->nChainWork + (GetBlockProof(*pChainTip) * 6))) { - if (!fLargeWorkForkFound && pindexBestForkBase) { + if (!GetfLargeWorkForkFound() && pindexBestForkBase) { if (pindexBestForkBase->phashBlock) { std::string warning = std::string("'Warning: Large-work fork detected, forking after block ") + pindexBestForkBase->phashBlock->ToString() + std::string("'"); @@ -886,15 +886,15 @@ void CheckForkWarningConditions() LogPrintf("CheckForkWarningConditions: Warning: Large valid fork found\n forking the chain at height %d (%s)\n lasting to height %d (%s).\nChain state database corruption likely.\n", pindexBestForkBase->nHeight, pindexBestForkBase->phashBlock->ToString(), pindexBestForkTip->nHeight, pindexBestForkTip->phashBlock->ToString()); - fLargeWorkForkFound = true; + SetfLargeWorkForkFound(true); } } else { LogPrintf("CheckForkWarningConditions: Warning: Found invalid chain at least ~6 blocks longer than our best chain.\nChain state database corruption likely.\n"); - fLargeWorkInvalidChainFound = true; + SetfLargeWorkInvalidChainFound(true); } } else { - fLargeWorkForkFound = false; - fLargeWorkInvalidChainFound = false; + SetfLargeWorkForkFound(false); + SetfLargeWorkInvalidChainFound(false); } } @@ -1184,7 +1184,7 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi /** Abort with a message */ static bool AbortNode(const std::string& strMessage, const std::string& userMessage="") { - strMiscWarning = strMessage; + SetMiscWarning(strMessage); LogPrintf("*** %s\n", strMessage); uiInterface.ThreadSafeMessageBox( userMessage.empty() ? _("Error: A fatal internal error occured, see debug.log for details") : userMessage, @@ -1924,10 +1924,12 @@ void static UpdateTip(CBlockIndex* pindexNew) if (nUpgraded > 0) LogPrintf("SetBestChain: %d of last 100 blocks above version %d\n", nUpgraded, (int)CBlock::CURRENT_VERSION); if (nUpgraded > 100 / 2) { - // strMiscWarning is read by GetWarnings(), called by Qt and the JSON-RPC code to warn the user: - strMiscWarning = _("Warning: This version is obsolete, upgrade required!"); - AlertNotify(strMiscWarning); - fWarned = true; + std::string strWarning = _("Warning: This version is obsolete, upgrade required!"); + SetMiscWarning(strWarning); + if (!fWarned) { + AlertNotify(strWarning); + fWarned = true; + } } } } From edf51b38ac02358125d520a9d3da79eb54bf00c6 Mon Sep 17 00:00:00 2001 From: furszy Date: Mon, 14 Dec 2020 19:09:55 -0300 Subject: [PATCH 48/86] util GetWarnings, adding "gui" parameter type. Github-Pull: #2063 Rebased-From: 3fee80882808dafaf5909e803ef7c587b60d54c6 --- src/util.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/util.cpp b/src/util.cpp index 080cac8210c73..9f928521eca92 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -878,27 +878,36 @@ std::string GetWarnings(const std::string& strFor) { std::string strStatusBar; std::string strRPC; + std::string strGUI; + const std::string uiAlertSeperator = "
"; LOCK(cs_warnings); - if (!CLIENT_VERSION_IS_RELEASE) - strStatusBar = _("This is a pre-release test build - use at your own risk - do not use for staking or merchant applications!"); + if (!CLIENT_VERSION_IS_RELEASE) { + strStatusBar = "This is a pre-release test build - use at your own risk - do not use for staking or merchant applications"; + strGUI = _("This is a pre-release test build - use at your own risk - do not use for staking or merchant applications"); + } if (gArgs.GetBoolArg("-testsafemode", DEFAULT_TESTSAFEMODE)) - strStatusBar = strRPC = "testsafemode enabled"; + strStatusBar = strRPC = strGUI = "testsafemode enabled"; // Misc warnings like out of disk space and clock is wrong - if (strMiscWarning != "") { + if (!strMiscWarning.empty()) { strStatusBar = strMiscWarning; + strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + strMiscWarning; } if (fLargeWorkForkFound) { - strStatusBar = strRPC = _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."); + strStatusBar = strRPC = "Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."; + strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."); } else if (fLargeWorkInvalidChainFound) { - strStatusBar = strRPC = _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); + strStatusBar = strRPC = "Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."; + strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); } - if (strFor == "statusbar") + if (strFor == "gui") + return strGUI; + else if (strFor == "statusbar") return strStatusBar; else if (strFor == "rpc") return strRPC; From 6850224be2ec30c328341b64f1bb1eaf36f6063a Mon Sep 17 00:00:00 2001 From: furszy Date: Mon, 14 Dec 2020 19:18:53 -0300 Subject: [PATCH 49/86] Move GetWarnings() into its own file. Github-Pull: #2063 Rebased-From: ce58263c50a34595472f0c3934c066b515145479 --- CMakeLists.txt | 1 + src/Makefile.am | 2 ++ src/init.cpp | 1 + src/qt/pivx.cpp | 1 + src/rpc/mining.cpp | 1 + src/rpc/misc.cpp | 1 + src/timedata.cpp | 2 +- src/util.cpp | 76 ---------------------------------------- src/util.h | 9 ----- src/validation.cpp | 1 + src/warnings.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++++++ src/warnings.h | 21 +++++++++++ 12 files changed, 117 insertions(+), 86 deletions(-) create mode 100644 src/warnings.cpp create mode 100644 src/warnings.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a95b7bc5c63c5..00de5c2a91281 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -400,6 +400,7 @@ set(COMMON_SOURCES ./src/script/script_error.cpp ./src/spork.cpp ./src/sporkdb.cpp + ./src/warnings.cpp ) add_library(COMMON_A STATIC ${BitcoinHeaders} ${COMMON_SOURCES}) target_include_directories(COMMON_A PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src diff --git a/src/Makefile.am b/src/Makefile.am index a0b0dff5f6a93..513a08125860d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -289,6 +289,7 @@ BITCOIN_CORE_H = \ destination_io.h \ wallet/wallet.h \ wallet/walletdb.h \ + warnings.h \ zpivchain.h \ zpiv/deterministicmint.h \ zpiv/mintpool.h \ @@ -511,6 +512,7 @@ libbitcoin_common_a_SOURCES = \ script/script.cpp \ script/sign.cpp \ script/standard.cpp \ + warnings.cpp \ script/script_error.cpp \ spork.cpp \ sporkdb.cpp \ diff --git a/src/init.cpp b/src/init.cpp index 6e4c9b6d395e3..01bd0f90963e3 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -66,6 +66,7 @@ #include "wallet/rpcwallet.h" #endif +#include "warnings.h" #include #include diff --git a/src/qt/pivx.cpp b/src/qt/pivx.cpp index 5d186792001bd..bb0c07decb0ec 100644 --- a/src/qt/pivx.cpp +++ b/src/qt/pivx.cpp @@ -33,6 +33,7 @@ #include "rpc/server.h" #include "guiinterface.h" #include "util.h" +#include "warnings.h" #ifdef ENABLE_WALLET #include "wallet/wallet.h" diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 04923d2570bf4..6ae4b3e37d402 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -20,6 +20,7 @@ #include "wallet/db.h" #include "wallet/wallet.h" #endif +#include "warnings.h" #include diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index 94c9fc48cbabc..ae6f48292e33f 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -21,6 +21,7 @@ #include "wallet/wallet.h" #include "wallet/walletdb.h" #endif +#include "warnings.h" #include diff --git a/src/timedata.cpp b/src/timedata.cpp index f1adc750a8d7e..4963fbdeaac68 100644 --- a/src/timedata.cpp +++ b/src/timedata.cpp @@ -10,7 +10,7 @@ #include "netaddress.h" #include "sync.h" #include "util.h" -#include "utilstrencodings.h" +#include "warnings.h" static RecursiveMutex cs_nTimeOffset; diff --git a/src/util.cpp b/src/util.cpp index 9f928521eca92..ab06638a9932d 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -100,11 +100,6 @@ ArgsManager gArgs; bool fDaemon = false; CTranslationInterface translationInterface; -RecursiveMutex cs_warnings; -std::string strMiscWarning; -bool fLargeWorkForkFound = false; -bool fLargeWorkInvalidChainFound = false; - /** Init OpenSSL library multithreading support */ static RecursiveMutex** ppmutexOpenSSL; void locking_callback(int mode, int i, const char* file, int line) NO_THREAD_SAFETY_ANALYSIS @@ -346,7 +341,6 @@ void PrintExceptionContinue(const std::exception* pex, const char* pszThread) std::string message = FormatException(pex, pszThread); LogPrintf("\n\n************************\n%s\n", message); fprintf(stderr, "\n\n************************\n%s\n", message.c_str()); - strMiscWarning = message; } fs::path GetDefaultDataDir() @@ -844,73 +838,3 @@ int GetNumCores() return std::thread::hardware_concurrency(); } -void SetMiscWarning(const std::string& strWarning) -{ - LOCK(cs_warnings); - strMiscWarning = strWarning; -} - -void SetfLargeWorkForkFound(bool flag) -{ - LOCK(cs_warnings); - fLargeWorkForkFound = flag; -} - -bool GetfLargeWorkForkFound() -{ - LOCK(cs_warnings); - return fLargeWorkForkFound; -} - -void SetfLargeWorkInvalidChainFound(bool flag) -{ - LOCK(cs_warnings); - fLargeWorkInvalidChainFound = flag; -} - -bool GetfLargeWorkInvalidChainFound() -{ - LOCK(cs_warnings); - return fLargeWorkInvalidChainFound; -} - -std::string GetWarnings(const std::string& strFor) -{ - std::string strStatusBar; - std::string strRPC; - std::string strGUI; - const std::string uiAlertSeperator = "
"; - - LOCK(cs_warnings); - - if (!CLIENT_VERSION_IS_RELEASE) { - strStatusBar = "This is a pre-release test build - use at your own risk - do not use for staking or merchant applications"; - strGUI = _("This is a pre-release test build - use at your own risk - do not use for staking or merchant applications"); - } - - if (gArgs.GetBoolArg("-testsafemode", DEFAULT_TESTSAFEMODE)) - strStatusBar = strRPC = strGUI = "testsafemode enabled"; - - // Misc warnings like out of disk space and clock is wrong - if (!strMiscWarning.empty()) { - strStatusBar = strMiscWarning; - strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + strMiscWarning; - } - - if (fLargeWorkForkFound) { - strStatusBar = strRPC = "Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."; - strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."); - } else if (fLargeWorkInvalidChainFound) { - strStatusBar = strRPC = "Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."; - strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); - } - - if (strFor == "gui") - return strGUI; - else if (strFor == "statusbar") - return strStatusBar; - else if (strFor == "rpc") - return strRPC; - assert(!"GetWarnings() : invalid parameter"); - return "error"; -} diff --git a/src/util.h b/src/util.h index 3ba401a46a87f..6f159f0cb3953 100644 --- a/src/util.h +++ b/src/util.h @@ -57,8 +57,6 @@ extern std::string strBudgetMode; extern CTranslationInterface translationInterface; -static const bool DEFAULT_TESTSAFEMODE = false; - /** * Translation function: Call Translate signal on UI interface, which returns a Optional result. * If no translation slot is registered, nothing is returned, and simply return the input. @@ -263,11 +261,4 @@ void TraceThread(const char* name, Callable func) fs::path AbsPathForConfigVal(const fs::path& path, bool net_specific = true); -void SetMiscWarning(const std::string& strWarning); -void SetfLargeWorkForkFound(bool flag); -bool GetfLargeWorkForkFound(); -void SetfLargeWorkInvalidChainFound(bool flag); -bool GetfLargeWorkInvalidChainFound(); -std::string GetWarnings(const std::string& strFor); - #endif // BITCOIN_UTIL_H diff --git a/src/validation.cpp b/src/validation.cpp index 652aad132280f..712c813141953 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -48,6 +48,7 @@ #include "util.h" #include "utilmoneystr.h" #include "validationinterface.h" +#include "warnings.h" #include "zpivchain.h" #include "zpiv/zerocoin.h" #include "zpiv/zpivmodule.h" diff --git a/src/warnings.cpp b/src/warnings.cpp new file mode 100644 index 0000000000000..9be652d5c53ce --- /dev/null +++ b/src/warnings.cpp @@ -0,0 +1,87 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2016 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "warnings.h" + +#include "sync.h" +#include "clientversion.h" +#include "util.h" + +RecursiveMutex cs_warnings; +std::string strMiscWarning; +bool fLargeWorkForkFound = false; +bool fLargeWorkInvalidChainFound = false; + +void SetMiscWarning(const std::string& strWarning) +{ + LOCK(cs_warnings); + strMiscWarning = strWarning; +} + +void SetfLargeWorkForkFound(bool flag) +{ + LOCK(cs_warnings); + fLargeWorkForkFound = flag; +} + +bool GetfLargeWorkForkFound() +{ + LOCK(cs_warnings); + return fLargeWorkForkFound; +} + +void SetfLargeWorkInvalidChainFound(bool flag) +{ + LOCK(cs_warnings); + fLargeWorkInvalidChainFound = flag; +} + +bool GetfLargeWorkInvalidChainFound() +{ + LOCK(cs_warnings); + return fLargeWorkInvalidChainFound; +} + +std::string GetWarnings(const std::string& strFor) +{ + std::string strStatusBar; + std::string strRPC; + std::string strGUI; + const std::string uiAlertSeperator = "\n"; + + LOCK(cs_warnings); + + if (!CLIENT_VERSION_IS_RELEASE) { + strStatusBar = "This is a pre-release test build - use at your own risk - do not use for staking or merchant applications!"; + strGUI = _("This is a pre-release test build - use at your own risk - do not use for staking or merchant applications!"); + } + + if (gArgs.GetBoolArg("-testsafemode", DEFAULT_TESTSAFEMODE)) + strStatusBar = strRPC = strGUI = "testsafemode enabled"; + + // Misc warnings like out of disk space and clock is wrong + if (!strMiscWarning.empty()) { + strStatusBar = strMiscWarning; + strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + strMiscWarning; + } + + if (fLargeWorkForkFound) { + strStatusBar = strRPC = "Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."; + strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + _("Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues."); + } else if (fLargeWorkInvalidChainFound) { + strStatusBar = strRPC = "Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."; + strGUI += (strGUI.empty() ? "" : uiAlertSeperator) + _("Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade."); + } + + if (strFor == "gui") + return strGUI; + else if (strFor == "statusbar") + return strStatusBar; + else if (strFor == "rpc") + return strRPC; + assert(!"GetWarnings() : invalid parameter"); + return "error"; +} + diff --git a/src/warnings.h b/src/warnings.h new file mode 100644 index 0000000000000..f3c5d2944a654 --- /dev/null +++ b/src/warnings.h @@ -0,0 +1,21 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2016 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or https://www.opensource.org/licenses/mit-license.php. + +#ifndef PIVX_WARNINGS_H +#define PIVX_WARNINGS_H + +#include +#include + +void SetMiscWarning(const std::string& strWarning); +void SetfLargeWorkForkFound(bool flag); +bool GetfLargeWorkForkFound(); +void SetfLargeWorkInvalidChainFound(bool flag); +bool GetfLargeWorkInvalidChainFound(); +std::string GetWarnings(const std::string& strFor); + +static const bool DEFAULT_TESTSAFEMODE = false; + +#endif //PIVX_WARNINGS_H From 1466f0bf54771662616dd193a264e3c1c734d5bf Mon Sep 17 00:00:00 2001 From: furszy Date: Tue, 15 Dec 2020 13:18:04 -0300 Subject: [PATCH 50/86] [GUI] Connect alert signal Github-Pull: #2063 Rebased-From: 97a85eb70bb077a1c2cac3708c58e9eae720b05c --- src/qt/clientmodel.cpp | 1 + src/qt/pivx/pivxgui.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index 67c9a7d6ec5b1..6756008e4a222 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -20,6 +20,7 @@ #include "netbase.h" #include "guiinterface.h" #include "util.h" +#include "warnings.h" #include diff --git a/src/qt/pivx/pivxgui.cpp b/src/qt/pivx/pivxgui.cpp index 73debdf62a85f..08b79a36f64a6 100644 --- a/src/qt/pivx/pivxgui.cpp +++ b/src/qt/pivx/pivxgui.cpp @@ -239,9 +239,9 @@ void PIVXGUI::handleRestart(QStringList args) } -void PIVXGUI::setClientModel(ClientModel* clientModel) +void PIVXGUI::setClientModel(ClientModel* _clientModel) { - this->clientModel = clientModel; + this->clientModel = _clientModel; if (this->clientModel) { // Create system tray menu (or setup the dock menu) that late to prevent users from calling actions, // while the client has not yet fully loaded @@ -254,6 +254,9 @@ void PIVXGUI::setClientModel(ClientModel* clientModel) // Receive and report messages from client model connect(clientModel, &ClientModel::message, this, &PIVXGUI::message); + connect(clientModel, &ClientModel::alertsChanged, [this](const QString& _alertStr) { + message(tr("Alert!"), _alertStr, CClientUIInterface::MSG_WARNING); + }); connect(topBar, &TopBar::walletSynced, dashboard, &DashboardWidget::walletSynced); connect(topBar, &TopBar::walletSynced, coldStakingWidget, &ColdStakingWidget::walletSynced); From 25e2816af7b4b3b9dbbf30559b9ade2f903916e5 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 16:05:43 +0100 Subject: [PATCH 51/86] BUG: Fix TestBlockValidity for PoW blocks Especially in CreateNewBlock, where the proper nonce hasn't been mined yet Github-Pull: #2067 Rebased-From: a6ea4e13bba18a4c83510ff792f056bb397c8cbc --- src/validation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validation.cpp b/src/validation.cpp index 712c813141953..675997e322d00 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2703,7 +2703,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo // Check that the header is valid (particularly PoW). This is mostly // redundant with the call in AcceptBlockHeader. - if (!CheckBlockHeader(block, state, !IsPoS)) + if (!CheckBlockHeader(block, state, !IsPoS && fCheckPOW)) return false; // All potential-corruption validation must be done before we do any From 8e0a9d949a12edad5449db4655b84ae8e173b7ac Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 16:09:30 +0100 Subject: [PATCH 52/86] Consensus: reject blocks with outdated version (<8) after v5 enforcement Github-Pull: #2067 Rebased-From: a2e446f39437657398903500d3e7ee6259ad3903 --- src/validation.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 675997e322d00..225e90ebc0d53 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2953,11 +2953,12 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta return state.DoS(0, error("%s : forked chain older than last checkpoint (height %d)", __func__, nHeight)); // Reject outdated version blocks - if((block.nVersion < 3 && nHeight >= 1) || + if ((block.nVersion < 3 && nHeight >= 1) || (block.nVersion < 4 && consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_ZC)) || (block.nVersion < 5 && consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_BIP65)) || (block.nVersion < 6 && consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_V3_4)) || - (block.nVersion < 7 && consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_V4_0))) + (block.nVersion < 7 && consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_V4_0)) || + (block.nVersion < 8 && consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_V5_0))) { std::string stringErr = strprintf("rejected block version %d at height %d", block.nVersion, nHeight); return state.Invalid(false, REJECT_OBSOLETE, "bad-version", stringErr); From a29f1e3144570141f42c5454f4742fbc0707a63e Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 16:38:14 +0100 Subject: [PATCH 53/86] Miner: set proper block version based on upgrade enforcements Github-Pull: #2067 Rebased-From: c0819f8a9d234ff965611f24b6894f4515d91534 --- src/miner.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index fb77c93fb269f..03e9075e07b8a 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -169,8 +169,16 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn, CWallet* pwallet, if (fSaplingActive) { //!> Block v8: Sapling / tx v2 pblock->nVersion = CBlockHeader::CURRENT_VERSION; - } else { + } else if (consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_V4_0)) { pblock->nVersion = 7; + } else if (consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_V3_4)) { + pblock->nVersion = 6; + } else if (consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_BIP65)) { + pblock->nVersion = 5; + } else if (consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_ZC)) { + pblock->nVersion = 4; + } else { + pblock->nVersion = 3; } // -regtest only: allow overriding block.nVersion with // -blockversion=N to test forking scenarios From 05fe877ef3988f8653970f80b835737b5933e65c Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 16:54:51 +0100 Subject: [PATCH 54/86] Cleanup: remove unneeded check (time-based) for version 4 header thus remove !CheckBlockHeader and directly use (fCheckPOW && !CheckProofOfWork) Github-Pull: #2067 Rebased-From: a4ef257afa9fee744c32d7a4b3ccadd291ffc159 --- src/validation.cpp | 28 ++-------------------------- src/validation.h | 1 - 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 225e90ebc0d53..bdbac4e384450 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2617,26 +2617,6 @@ bool FindUndoPos(CValidationState& state, int nFile, CDiskBlockPos& pos, unsigne return true; } -bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW) -{ - // Check proof of work matches claimed amount - if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits)) - return state.DoS(50, false, REJECT_INVALID, "high-hash", false, "proof of work failed"); - - if (Params().IsRegTestNet()) return true; - - // Version 4 header must be used after consensus.ZC_TimeStart. And never before. - if (block.GetBlockTime() > Params().GetConsensus().ZC_TimeStart) { - if(block.nVersion < 4) - return state.DoS(50,false, REJECT_INVALID, "block-version", "must be above 4 after ZC_TimeStart"); - } else { - if (block.nVersion >= 4) - return state.DoS(50,false, REJECT_INVALID, "block-version", "must be below 4 before ZC_TimeStart"); - } - - return true; -} - bool CheckColdStakeFreeOutput(const CTransaction& tx, const int nHeight) { if (!tx.HasP2CSOutputs()) @@ -2703,8 +2683,8 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo // Check that the header is valid (particularly PoW). This is mostly // redundant with the call in AcceptBlockHeader. - if (!CheckBlockHeader(block, state, !IsPoS && fCheckPOW)) - return false; + if (!IsPoS && fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits)) + return state.DoS(50, false, REJECT_INVALID, "high-hash", false, "proof of work failed"); // All potential-corruption validation must be done before we do any // transaction validation, as otherwise we may mark the header as invalid @@ -3070,10 +3050,6 @@ bool AcceptBlockHeader(const CBlock& block, CValidationState& state, CBlockIndex return true; } - if (!CheckBlockHeader(block, state, false)) { - return error("%s: CheckBlockHeader failed for block %s: %s", __func__, hash.ToString(), FormatStateMessage(state)); - } - // Get prev block index if (pindexPrev == nullptr && !GetPrevIndex(block, &pindexPrev, state)) { return false; diff --git a/src/validation.h b/src/validation.h index 9715c02a087f3..06713a60f3b6e 100644 --- a/src/validation.h +++ b/src/validation.h @@ -323,7 +323,6 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex); bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck, bool fAlreadyChecked = false); /** Context-independent validity checks */ -bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW = true); bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW = true, bool fCheckMerkleRoot = true, bool fCheckSig = true); bool CheckWork(const CBlock block, CBlockIndex* const pindexPrev); From 7c8724116eeeb0e15efe95fa3a2426b88f3db7e9 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Wed, 9 Dec 2020 17:24:22 +0100 Subject: [PATCH 55/86] [Consensus] Bump TxVersion::SAPLING to 3 Github-Pull: #2051 Rebased-From: 3dfd8132404ee9f6fafc068764907d0e0e65aa5a --- src/consensus/upgrades.cpp | 2 +- src/init.cpp | 3 --- src/primitives/transaction.h | 2 +- src/sapling/sapling_validation.cpp | 4 ++-- src/sapling/sapling_validation.h | 2 +- src/wallet/wallet.cpp | 7 +++++++ 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/consensus/upgrades.cpp b/src/consensus/upgrades.cpp index e5693729fd47a..2de9cc45f37f6 100644 --- a/src/consensus/upgrades.cpp +++ b/src/consensus/upgrades.cpp @@ -51,7 +51,7 @@ const struct NUInfo NetworkUpgradeInfo[Consensus::MAX_NETWORK_UPGRADES] = { }, { /*.strName =*/ "v5_shield", - /*.strInfo =*/ "Sapling Shield - start block v8 - start transaction v2", + /*.strInfo =*/ "Sapling Shield - start block v8 - start transaction v3", }, { /*.strName =*/ "Test_dummy", diff --git a/src/init.cpp b/src/init.cpp index 01bd0f90963e3..fd7a20ea4679c 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1465,9 +1465,6 @@ bool AppInit2() fReindex = gArgs.GetBoolArg("-reindex", false); - // Assume sapling active during reindex for proper v2 deserialization when loading the wallet - if (fReindex) g_IsSaplingActive = true; - // Create blocks directory if it doesn't already exist fs::create_directories(GetDataDir() / "blocks"); diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 64eeb5be22aba..a8a1ecf483029 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -235,7 +235,7 @@ class CTransaction /** Transaction Versions */ enum TxVersion: int16_t { LEGACY = 1, - SAPLING = 2, + SAPLING = 3, TOOHIGH }; diff --git a/src/sapling/sapling_validation.cpp b/src/sapling/sapling_validation.cpp index e8037beded412..7e6c277f1326c 100644 --- a/src/sapling/sapling_validation.cpp +++ b/src/sapling/sapling_validation.cpp @@ -32,7 +32,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState& state, CAmount& return true; } - // From here, all of the checks are done in +v2 transactions. + // From here, all of the checks are done in v3+ transactions. // if the tx has shielded data, cannot be a coinstake, coinbase, zcspend and zcmint if (tx.IsCoinStake() || tx.IsCoinBase() || tx.HasZerocoinSpendInputs() || tx.HasZerocoinMintOutputs()) @@ -53,7 +53,7 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio { // Basic checks that don't depend on any context const Consensus::Params& consensus = Params().GetConsensus(); - // If the tx got to this point, must be +v2. + // If the tx got to this point, must be v3+. assert(tx.isSaplingVersion()); // Check for non-zero valueBalance when there are no Sapling inputs or outputs diff --git a/src/sapling/sapling_validation.h b/src/sapling/sapling_validation.h index a3e21603e7a3f..d670f0be9e8d8 100644 --- a/src/sapling/sapling_validation.h +++ b/src/sapling/sapling_validation.h @@ -14,7 +14,7 @@ class CValidationState; namespace SaplingValidation { /** Context-independent validity checks */ -// Note: for +v2, if the tx has no shielded data, this method returns true. +// Note: for v3+, if the tx has no shielded data, this method returns true. // Note2: This function only performs shielded data related checks, it does NOT checks regular inputs and outputs. bool CheckTransaction(const CTransaction& tx, CValidationState& state, CAmount& nValueOut, bool fIsSaplingActive); bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidationState &state, CAmount& nValueOut); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 416504017d364..e344bf525e9b5 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -4130,6 +4130,11 @@ bool CWallet::InitLoadWallet() return true; } + // Assume sapling active during initialization of the wallet for proper v3 deserialization + // before reindex/resync + const bool wasSaplingActive = g_IsSaplingActive; + if (!wasSaplingActive) g_IsSaplingActive = true; + std::string walletFile = gArgs.GetArg("-wallet", DEFAULT_WALLET_DAT); CWallet * const pwallet = CreateWalletFromFile(walletFile); @@ -4138,6 +4143,8 @@ bool CWallet::InitLoadWallet() } pwalletMain = pwallet; + // restore global flag to previous state + g_IsSaplingActive = wasSaplingActive; return true; } From 5b7e86df9d13998447b0907e3e55cce6540b6e14 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 10:27:16 +0100 Subject: [PATCH 56/86] [Wallet] Do not perform ECDSA signing in the fee calculation inner loop >>> based on bitcoin/bitcoin@b3d7b1cbe7afdc6a63bbcbe938e8639deedb04a1 Performing signing in the inner loop has terrible performance when many passes through are needed to complete the selection. Signing before the algorithm is complete also gets in the way of correctly setting the fee (e.g. preventing over-payment when the fee required goes down on the final selection.) Use of the dummy might overpay on the signatures by a couple bytes in uncommon cases where the signatures' DER encoding is smaller than the dummy: Who cares? Github-Pull: #2065 Rebased-From: 44620de508fab004b7c4c5b03367d52e50d67172 --- src/wallet/wallet.cpp | 80 +++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index e344bf525e9b5..01dbb057cf1a7 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2697,6 +2697,7 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, coinFilter.nCoinType = coin_type; { + std::set > setCoins; LOCK2(cs_main, cs_wallet); { std::vector vAvailableCoins; @@ -2722,8 +2723,8 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, } // Choose coins to use - std::set > setCoins; CAmount nValueIn = 0; + setCoins.clear(); if (!SelectCoinsToSpend(vAvailableCoins, nTotalValue, setCoins, nValueIn, coinControl)) { if (coin_type == ALL_COINS) { @@ -2809,29 +2810,12 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, txNew.vin.emplace_back(coin.first->GetHash(), coin.second); } - // Sign + // Fill in dummy signatures for fee calculation. int nIn = 0; - CTransaction txNewConst(txNew); - SigVersion sigversion = txNewConst.GetRequiredSigVersion(); - for (const std::pair & coin : setCoins) { - bool signSuccess; + for (const auto & coin : setCoins) { const CScript& scriptPubKey = coin.first->vout[coin.second].scriptPubKey; SignatureData sigdata; - bool haveKey = coin.first->GetStakeDelegationCredit() > 0; - if (sign) { - signSuccess = ProduceSignature( - TransactionSignatureCreator(this, &txNewConst, nIn, coin.first->vout[coin.second].nValue, SIGHASH_ALL), - scriptPubKey, - sigdata, - sigversion, - !haveKey // fColdStake = false - ); - } else { - signSuccess = ProduceSignature( - DummySignatureCreator(this), scriptPubKey, sigdata, sigversion, false); - } - - if (!signSuccess) { + if (!ProduceSignature(DummySignatureCreator(this), scriptPubKey, sigdata, txNew.GetRequiredSigVersion(), false)) { strFailReason = _("Signing transaction failed"); return false; } else { @@ -2840,25 +2824,14 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, nIn++; } - unsigned int nBytes = ::GetSerializeSize(txNew, SER_NETWORK, PROTOCOL_VERSION); - - // Remove scriptSigs if we used dummy signatures for fee calculation - if (!sign) { - for (CTxIn& vin : txNew.vin) - vin.scriptSig = CScript(); - } - - // Embed the constructed transaction data in wtxNew. - *static_cast(wtxNew) = CTransaction(txNew); + const unsigned int nBytes = ::GetSerializeSize(txNew, SER_NETWORK, PROTOCOL_VERSION); + CAmount nFeeNeeded = std::max(nFeePay, GetMinimumFee(nBytes, nTxConfirmTarget, mempool)); - // Limit size - if (nBytes >= MAX_STANDARD_TX_SIZE) { - strFailReason = _("Transaction too large"); - return false; + // Remove scriptSigs to eliminate the fee calculation dummy signatures + for (CTxIn& vin : txNew.vin) { + vin.scriptSig = CScript(); } - CAmount nFeeNeeded = std::max(nFeePay, GetMinimumFee(nBytes, nTxConfirmTarget, mempool)); - if (coinControl && nFeeNeeded > 0 && coinControl->nMinimumTotalFee > nFeeNeeded) { nFeeNeeded = coinControl->nMinimumTotalFee; } @@ -2885,6 +2858,39 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, return false; } } + + if (sign) { + CTransaction txNewConst(txNew); + int nIn = 0; + for (const auto& coin : setCoins) { + const CScript& scriptPubKey = coin.first->vout[coin.second].scriptPubKey; + SignatureData sigdata; + bool haveKey = coin.first->GetStakeDelegationCredit() > 0; + + if (!ProduceSignature( + TransactionSignatureCreator(this, &txNewConst, nIn, coin.first->vout[coin.second].nValue, SIGHASH_ALL), + scriptPubKey, + sigdata, + txNewConst.GetRequiredSigVersion(), + !haveKey // fColdStake + )) { + strFailReason = _("Signing transaction failed"); + return false; + } else { + UpdateTransaction(txNew, nIn, sigdata); + } + nIn++; + } + } + + // Limit size + if (::GetSerializeSize(txNew, SER_NETWORK, PROTOCOL_VERSION) >= MAX_STANDARD_TX_SIZE) { + strFailReason = _("Transaction too large"); + return false; + } + + // Embed the constructed transaction data in wtxNew. + *static_cast(wtxNew) = CTransaction(txNew); } return true; } From ff2dec22c8e85b915d164b8b28ebdc9596364be1 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 11:27:41 +0100 Subject: [PATCH 57/86] Sapling: Decouple ProveAndSign from Build Github-Pull: #2065 Rebased-From: efd7139fe48e8e0003788d7df6db958a3f269185 --- src/sapling/transaction_builder.cpp | 143 ++++++++++++++-------------- src/sapling/transaction_builder.h | 2 + 2 files changed, 76 insertions(+), 69 deletions(-) diff --git a/src/sapling/transaction_builder.cpp b/src/sapling/transaction_builder.cpp index 97203338d56f5..41bd0530dfc3d 100644 --- a/src/sapling/transaction_builder.cpp +++ b/src/sapling/transaction_builder.cpp @@ -209,66 +209,31 @@ void TransactionBuilder::SendChangeTo(CTxDestination& changeAddr) saplingChangeAddr = nullopt; } -TransactionBuilderResult TransactionBuilder::Build() +TransactionBuilderResult TransactionBuilder::ProveAndSign() { // - // Consistency checks + // Sapling spend descriptions // - // Valid fee - if (fee < 0) { - return TransactionBuilderResult("Fee cannot be negative"); - } - - // Valid change - CAmount change = mtx.sapData->valueBalance - fee; - for (auto& tIn : tIns) { - change += tIn.value; - } - for (auto& tOut : mtx.vout) { - change -= tOut.nValue; - } - if (change < 0) { - return TransactionBuilderResult("Change cannot be negative"); - } + if (!spends.empty() || !outputs.empty()) { - // - // Change output - // + auto ctx = librustzcash_sapling_proving_ctx_init(); - if (change > 0) { - // If we get here and the change is dust, add it to the fee - CAmount dustThreshold = (spends.empty() && outputs.empty()) ? GetDustThreshold(minRelayTxFee) : - GetShieldedDustThreshold(minRelayTxFee); - if (change > dustThreshold) { - // Send change to the specified change address. If no change address - // was set, send change to the first Sapling address given as input - // (A t-address can only be used as the change address if explicitly set.) - if (saplingChangeAddr) { - AddSaplingOutput(saplingChangeAddr->first, saplingChangeAddr->second, change); - } else if (tChangeAddr) { - // tChangeAddr has already been validated. - AddTransparentOutput(*tChangeAddr, change); - } else if (!spends.empty()) { - auto fvk = spends[0].expsk.full_viewing_key(); - auto note = spends[0].note; - libzcash::SaplingPaymentAddress changeAddr(note.d, note.pk_d); - AddSaplingOutput(fvk.ovk, changeAddr, change); - } else { - return TransactionBuilderResult("Could not determine change address"); + // Create Sapling OutputDescriptions + for (auto output : outputs) { + // Check this out here as well to provide better logging. + if (!output.note.cmu()) { + librustzcash_sapling_proving_ctx_free(ctx); + return TransactionBuilderResult("Output is invalid"); } - } else { - // Not used after, but update for consistency - fee += change; - change = 0; - } - } - // - // Sapling spends and outputs - // - if (!spends.empty() || !outputs.empty()) { + auto odesc = output.Build(ctx); + if (!odesc) { + librustzcash_sapling_proving_ctx_free(ctx); + return TransactionBuilderResult("Failed to create output description"); + } - auto ctx = librustzcash_sapling_proving_ctx_init(); + mtx.sapData->vShieldedOutput.push_back(odesc.get()); + } // Create Sapling SpendDescriptions for (auto spend : spends) { @@ -307,23 +272,6 @@ TransactionBuilderResult TransactionBuilder::Build() mtx.sapData->vShieldedSpend.push_back(sdesc); } - // Create Sapling OutputDescriptions - for (auto output : outputs) { - // Check this out here as well to provide better logging. - if (!output.note.cmu()) { - librustzcash_sapling_proving_ctx_free(ctx); - return TransactionBuilderResult("Output is invalid"); - } - - auto odesc = output.Build(ctx); - if (!odesc) { - librustzcash_sapling_proving_ctx_free(ctx); - return TransactionBuilderResult("Failed to create output description"); - } - - mtx.sapData->vShieldedOutput.push_back(odesc.get()); - } - // // Signatures // @@ -375,3 +323,60 @@ TransactionBuilderResult TransactionBuilder::Build() return TransactionBuilderResult(CTransaction(mtx)); } + +TransactionBuilderResult TransactionBuilder::Build() +{ + // + // Consistency checks + // + // Valid fee + if (fee < 0) { + return TransactionBuilderResult("Fee cannot be negative"); + } + + // Valid change + CAmount change = mtx.sapData->valueBalance - fee; + for (auto& tIn : tIns) { + change += tIn.value; + } + for (auto& tOut : mtx.vout) { + change -= tOut.nValue; + } + if (change < 0) { + return TransactionBuilderResult("Change cannot be negative"); + } + + // + // Change output + // + + if (change > 0) { + // If we get here and the change is dust, add it to the fee + CAmount dustThreshold = (spends.empty() && outputs.empty()) ? GetDustThreshold(minRelayTxFee) : + GetShieldedDustThreshold(minRelayTxFee); + if (change > dustThreshold) { + // Send change to the specified change address. If no change address + // was set, send change to the first Sapling address given as input + // (A t-address can only be used as the change address if explicitly set.) + if (saplingChangeAddr) { + AddSaplingOutput(saplingChangeAddr->first, saplingChangeAddr->second, change); + } else if (tChangeAddr) { + // tChangeAddr has already been validated. + AddTransparentOutput(*tChangeAddr, change); + } else if (!spends.empty()) { + auto fvk = spends[0].expsk.full_viewing_key(); + auto note = spends[0].note; + libzcash::SaplingPaymentAddress changeAddr(note.d, note.pk_d); + AddSaplingOutput(fvk.ovk, changeAddr, change); + } else { + return TransactionBuilderResult("Could not determine change address"); + } + } else { + // Not used after, but update for consistency + fee += change; + change = 0; + } + } + + return ProveAndSign(); +} diff --git a/src/sapling/transaction_builder.h b/src/sapling/transaction_builder.h index 164a3ed05d105..257baa34823b4 100644 --- a/src/sapling/transaction_builder.h +++ b/src/sapling/transaction_builder.h @@ -121,6 +121,8 @@ class TransactionBuilder void SendChangeTo(CTxDestination& changeAddr); TransactionBuilderResult Build(); + // Add Sapling Spend/Output descriptions, binding sig, and transparent signatures + TransactionBuilderResult ProveAndSign(); }; #endif /* TRANSACTION_BUILDER_H */ From 0aa9439e9b8c60a6a0bfaa6161e8c1cc50ccdbf9 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 12:29:31 +0100 Subject: [PATCH 58/86] Sapling: add option to skip ProveAndSing in TransactionBuilder::Build adding dummy proofs and signatures instead Github-Pull: #2065 Rebased-From: 5d8ba3d7008ffa2cb45c98a346e46fcf9b00469f --- src/sapling/transaction_builder.cpp | 63 ++++++++++++++++++++++++++++- src/sapling/transaction_builder.h | 6 ++- src/uint256.h | 1 + 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/sapling/transaction_builder.cpp b/src/sapling/transaction_builder.cpp index 41bd0530dfc3d..71e5b362b8b14 100644 --- a/src/sapling/transaction_builder.cpp +++ b/src/sapling/transaction_builder.cpp @@ -324,7 +324,66 @@ TransactionBuilderResult TransactionBuilder::ProveAndSign() return TransactionBuilderResult(CTransaction(mtx)); } -TransactionBuilderResult TransactionBuilder::Build() +TransactionBuilderResult TransactionBuilder::AddDummySignatures() +{ + if (!spends.empty() || !outputs.empty()) { + // Add Dummy Sapling OutputDescriptions + OutputDescription dummyOD; + dummyOD.cv = UINT256_MAX; + dummyOD.cmu = UINT256_MAX; + dummyOD.ephemeralKey = UINT256_MAX; + dummyOD.encCiphertext = {{0xff}}; + dummyOD.outCiphertext = {{0xff}}; + dummyOD.zkproof = {{0xff}}; + for (unsigned int i = 0; i < outputs.size(); i++) { + mtx.sapData->vShieldedOutput.push_back(dummyOD); + } + // Add Dummy Sapling SpendDescriptions + SpendDescription dummySD; + dummySD.cv = UINT256_MAX; + dummySD.anchor = UINT256_MAX; + dummySD.nullifier = UINT256_MAX; + dummySD.rk = UINT256_MAX; + dummySD.zkproof = {{0xff}}; + dummySD.spendAuthSig = {{0xff}}; + for (unsigned int i = 0; i < spends.size(); i++) { + mtx.sapData->vShieldedSpend.push_back(dummySD); + } + // Add Dummy Binding sig + mtx.sapData->bindingSig = {{0xff}}; + } + + // Add Dummmy Transparent signatures + CTransaction txNewConst(mtx); + for (int nIn = 0; nIn < (int) mtx.vin.size(); nIn++) { + auto tIn = tIns[nIn]; + SignatureData sigdata; + if (!ProduceSignature(DummySignatureCreator(keystore), tIn.scriptPubKey, sigdata, SIGVERSION_SAPLING, false)) { + return TransactionBuilderResult("Failed to sign transaction"); + } else { + UpdateTransaction(mtx, nIn, sigdata); + } + } + + return TransactionBuilderResult(CTransaction(mtx)); +} + +void TransactionBuilder::ClearProofsAndSignatures() +{ + // Clear Sapling output descriptions + mtx.sapData->vShieldedOutput.clear(); + + // Clear Sapling spend descriptions + mtx.sapData->vShieldedSpend.clear(); + + // Clear Binding sig + mtx.sapData->bindingSig = {{0}}; + + // Clear Transparent signatures + for (CTxIn& in : mtx.vin) in.scriptSig = CScript(); +} + +TransactionBuilderResult TransactionBuilder::Build(bool fDummySig) { // // Consistency checks @@ -378,5 +437,5 @@ TransactionBuilderResult TransactionBuilder::Build() } } - return ProveAndSign(); + return fDummySig ? AddDummySignatures() : ProveAndSign(); } diff --git a/src/sapling/transaction_builder.h b/src/sapling/transaction_builder.h index 257baa34823b4..0073fb3ca7b3b 100644 --- a/src/sapling/transaction_builder.h +++ b/src/sapling/transaction_builder.h @@ -120,9 +120,13 @@ class TransactionBuilder void SendChangeTo(CTxDestination& changeAddr); - TransactionBuilderResult Build(); + TransactionBuilderResult Build(bool fDummySig = false); // Add Sapling Spend/Output descriptions, binding sig, and transparent signatures TransactionBuilderResult ProveAndSign(); + // Add dummy Sapling Spend/Output descriptions, binding sig, and transparent signatures + TransactionBuilderResult AddDummySignatures(); + // Remove Sapling Spend/Output descriptions, binding sig, and transparent signatures + void ClearProofsAndSignatures(); }; #endif /* TRANSACTION_BUILDER_H */ diff --git a/src/uint256.h b/src/uint256.h index 85a58c6878357..5c690c79fd6b5 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -139,5 +139,6 @@ arith_uint512 UintToArith512(const uint512 &); /** constant uint256 instances */ const uint256 UINT256_ZERO = uint256(); const uint256 UINT256_ONE = uint256("0000000000000000000000000000000000000000000000000000000000000001"); +const uint256 UINT256_MAX = uint256("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); #endif // PIVX_UINT256_H From 6ea78ad9222af1e2f173b3c9ca2daecc830a13ae Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 12:35:01 +0100 Subject: [PATCH 59/86] Sapling: Skip proofs and signatures during fee calculation loop Github-Pull: #2065 Rebased-From: 6099737168b3769c65d999dc3fb5b38a44eed909 --- src/sapling/sapling_operation.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/sapling/sapling_operation.cpp b/src/sapling/sapling_operation.cpp index 4315fcc90207b..8754bc4e9940d 100644 --- a/src/sapling/sapling_operation.cpp +++ b/src/sapling/sapling_operation.cpp @@ -170,7 +170,7 @@ OperationResult SaplingOperation::build() // Build the transaction txBuilder.SetFee(nFeeRet); - TransactionBuilderResult txResult = txBuilder.Build(); + TransactionBuilderResult txResult = txBuilder.Build(true); auto opTx = txResult.GetTx(); // Check existent tx @@ -213,6 +213,16 @@ OperationResult SaplingOperation::build() } // Done fee = nFeeRet; + + // Clear dummy signatures/proofs and add real ones + txBuilder.ClearProofsAndSignatures(); + TransactionBuilderResult txResult = txBuilder.ProveAndSign(); + auto opTx = txResult.GetTx(); + // Check existent tx + if (!opTx) { + return errorOut("Failed to build transaction: " + txResult.GetError()); + } + finalTx = *opTx; return OperationResult(true); } From 40e320309fe8a161f487cc75535ff1a7eaa562cc Mon Sep 17 00:00:00 2001 From: random-zebra Date: Fri, 18 Dec 2020 17:28:43 +0100 Subject: [PATCH 60/86] Refactor: initialize dummy Spend/Output descriptions only once Github-Pull: #2065 Rebased-From: e5aab5364bab8448c9b67b33477b080143686bbd --- src/sapling/transaction_builder.cpp | 49 +++++++++++++++++++---------- src/sapling/transaction_builder.h | 5 +++ 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/sapling/transaction_builder.cpp b/src/sapling/transaction_builder.cpp index 71e5b362b8b14..8cb3addd398e4 100644 --- a/src/sapling/transaction_builder.cpp +++ b/src/sapling/transaction_builder.cpp @@ -68,6 +68,35 @@ Optional OutputDescriptionInfo::Build(void* ctx) { return odesc; } +// Dummy constants used during fee-calculation loop +static OutputDescription CreateDummyOD() +{ + OutputDescription dummyOD; + dummyOD.cv = UINT256_MAX; + dummyOD.cmu = UINT256_MAX; + dummyOD.ephemeralKey = UINT256_MAX; + dummyOD.encCiphertext = {{0xff}}; + dummyOD.outCiphertext = {{0xff}}; + dummyOD.zkproof = {{0xff}}; + return dummyOD; +} +static SpendDescription CreateDummySD() +{ + SpendDescription dummySD; + dummySD.cv = UINT256_MAX; + dummySD.anchor = UINT256_MAX; + dummySD.nullifier = UINT256_MAX; + dummySD.rk = UINT256_MAX; + dummySD.zkproof = {{0xff}}; + dummySD.spendAuthSig = {{0xff}}; + return dummySD; +} + +const OutputDescription DUMMY_SHIELD_OUT = CreateDummyOD(); +const SpendDescription DUMMY_SHIELD_SPEND = CreateDummySD(); +const SaplingTxData::binding_sig_t DUMMY_SHIELD_BINDSIG = {{0xff}}; + + TransactionBuilderResult::TransactionBuilderResult(const CTransaction& tx) : maybeTx(tx) {} TransactionBuilderResult::TransactionBuilderResult(const std::string& error) : maybeError(error) {} @@ -328,29 +357,15 @@ TransactionBuilderResult TransactionBuilder::AddDummySignatures() { if (!spends.empty() || !outputs.empty()) { // Add Dummy Sapling OutputDescriptions - OutputDescription dummyOD; - dummyOD.cv = UINT256_MAX; - dummyOD.cmu = UINT256_MAX; - dummyOD.ephemeralKey = UINT256_MAX; - dummyOD.encCiphertext = {{0xff}}; - dummyOD.outCiphertext = {{0xff}}; - dummyOD.zkproof = {{0xff}}; for (unsigned int i = 0; i < outputs.size(); i++) { - mtx.sapData->vShieldedOutput.push_back(dummyOD); + mtx.sapData->vShieldedOutput.push_back(DUMMY_SHIELD_OUT); } // Add Dummy Sapling SpendDescriptions - SpendDescription dummySD; - dummySD.cv = UINT256_MAX; - dummySD.anchor = UINT256_MAX; - dummySD.nullifier = UINT256_MAX; - dummySD.rk = UINT256_MAX; - dummySD.zkproof = {{0xff}}; - dummySD.spendAuthSig = {{0xff}}; for (unsigned int i = 0; i < spends.size(); i++) { - mtx.sapData->vShieldedSpend.push_back(dummySD); + mtx.sapData->vShieldedSpend.push_back(DUMMY_SHIELD_SPEND); } // Add Dummy Binding sig - mtx.sapData->bindingSig = {{0xff}}; + mtx.sapData->bindingSig = DUMMY_SHIELD_BINDSIG; } // Add Dummmy Transparent signatures diff --git a/src/sapling/transaction_builder.h b/src/sapling/transaction_builder.h index 0073fb3ca7b3b..c4557ff963a35 100644 --- a/src/sapling/transaction_builder.h +++ b/src/sapling/transaction_builder.h @@ -55,6 +55,11 @@ struct TransparentInputInfo { CAmount value) : scriptPubKey(scriptPubKey), value(value) {} }; +// Dummy constants used during fee-calculation loop +extern const OutputDescription DUMMY_SHIELD_OUT; +extern const SpendDescription DUMMY_SHIELD_SPEND; +extern const SaplingTxData::binding_sig_t DUMMY_SHIELD_BINDSIG; + class TransactionBuilderResult { private: Optional maybeTx; From 0d0fe24eb46be16bbcb01b6b7982727fb5aa5032 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Tue, 15 Dec 2020 22:04:11 +0100 Subject: [PATCH 61/86] [BUG][GUI] Receive widget: check typeRole before refreshing view Github-Pull: #2066 Rebased-From: 9949d905075586ffe9d8750e938373822100249a --- src/qt/pivx/receivewidget.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qt/pivx/receivewidget.cpp b/src/qt/pivx/receivewidget.cpp index 200694bd355e2..f9717dd4fa548 100644 --- a/src/qt/pivx/receivewidget.cpp +++ b/src/qt/pivx/receivewidget.cpp @@ -135,6 +135,9 @@ void ReceiveWidget::loadWalletModel() void ReceiveWidget::refreshView(const QModelIndex& tl, const QModelIndex& br) { const QModelIndex& index = tl.sibling(tl.row(), AddressTableModel::Address); + const QString& typeRole = index.data(AddressTableModel::TypeRole).toString(); + if (shieldedMode && typeRole != AddressTableModel::ShieldedReceive) return; + if (!shieldedMode && typeRole != AddressTableModel::Receive) return; return refreshView(index.data(Qt::DisplayRole).toString()); } From f3b01bae34f7f6b31f33792c49dfe5b366c33710 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 17:58:48 +0100 Subject: [PATCH 62/86] Consensus: Budget: Fix instant killing of proposals - raise the threshold required to 30% - never kill a proposal before its start Github-Pull: #2068 Rebased-From: b0c6dc1f75f2d2ff7564cc918359e2f19a5c40d9 --- src/budget/budgetproposal.cpp | 14 +++++++++----- src/budget/budgetproposal.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/budget/budgetproposal.cpp b/src/budget/budgetproposal.cpp index 17516c71061f0..f04e2cc9b45db 100644 --- a/src/budget/budgetproposal.cpp +++ b/src/budget/budgetproposal.cpp @@ -79,10 +79,10 @@ void CBudgetProposal::SyncVotes(CNode* pfrom, bool fPartial, int& nInvCount) con } } -bool CBudgetProposal::IsHeavilyDownvoted() +bool CBudgetProposal::IsHeavilyDownvoted(bool fNewRules) { - if (GetNays() - GetYeas() > mnodeman.CountEnabled(ActiveProtocol()) / 10) { - strInvalid = "Active removal"; + if (GetNays() - GetYeas() > (fNewRules ? 3 : 1) * mnodeman.CountEnabled(ActiveProtocol()) / 10) { + strInvalid = "Heavily Downvoted"; return true; } return false; @@ -162,8 +162,12 @@ bool CBudgetProposal::UpdateValid(int nCurrentHeight) { fValid = false; - if (IsHeavilyDownvoted()) { - return false; + // !TODO: remove after v5 enforcement and use fixed multiplier (3) + bool fNewRules = Params().GetConsensus().NetworkUpgradeActive(nCurrentHeight, Consensus::UPGRADE_V5_0); + + // Never kill a proposal before the first superblock + if (!fNewRules || nCurrentHeight > nBlockStart) { + if (IsHeavilyDownvoted(fNewRules)) return false; } if (IsExpired(nCurrentHeight)) { diff --git a/src/budget/budgetproposal.h b/src/budget/budgetproposal.h index d419a62de0ddc..2f1824925c31d 100644 --- a/src/budget/budgetproposal.h +++ b/src/budget/budgetproposal.h @@ -27,7 +27,7 @@ class CBudgetProposal std::string strInvalid; // Functions used inside UpdateValid()/IsWellFormed - setting strInvalid - bool IsHeavilyDownvoted(); + bool IsHeavilyDownvoted(bool fNewRules); bool IsExpired(int nCurrentHeight); bool CheckStartEnd(); bool CheckAmount(const CAmount& nTotalBudget); From 2444e54ade76cb3af6af392a72ad3c3553dd6f1b Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 16:57:56 +0100 Subject: [PATCH 63/86] BUG: Miner don't check for PoS activation at negative height Github-Pull: #2069 Rebased-From: 763b531befd3091937d23924a387b04b95d5708d --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 03e9075e07b8a..c3ae0a0ebfb71 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -604,7 +604,7 @@ void BitcoinMiner(CWallet* pwallet, bool fProofOfStake) continue; } - } else if (consensus.NetworkUpgradeActive(pindexPrev->nHeight - 6, Consensus::UPGRADE_POS)) { + } else if (pindexPrev->nHeight > 6 && consensus.NetworkUpgradeActive(pindexPrev->nHeight - 6, Consensus::UPGRADE_POS)) { // Late PoW: run for a little while longer, just in case there is a rewind on the chain. LogPrintf("%s: Exiting PoW Mining Thread at height: %d\n", __func__, pindexPrev->nHeight); return; From f2ea00dbeb5495dfe8e42cb119809e7832bce689 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 13:55:43 +0100 Subject: [PATCH 64/86] Params: change testnet datadir to testnet5 Github-Pull: #2069 Rebased-From: cb1f9a07c8308c9242811c146e78e6347834d87c --- src/chainparamsbase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index eba0cc62119e6..7601f190020b1 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -28,7 +28,7 @@ class CBaseMainParams : public CBaseChainParams static CBaseMainParams mainParams; /** - * Testnet (v3) + * Testnet (v5) */ class CBaseTestNetParams : public CBaseMainParams { @@ -37,7 +37,7 @@ class CBaseTestNetParams : public CBaseMainParams { networkID = CBaseChainParams::TESTNET; nRPCPort = 51475; - strDataDir = "testnet4"; + strDataDir = "testnet5"; } }; static CBaseTestNetParams testNetParams; From 4c847eb64f866a1b4f94f60570ee7c42603ea7e8 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 14:17:15 +0100 Subject: [PATCH 65/86] Params: Update testnet params - remove unused ones Github-Pull: #2069 Rebased-From: b05ed1c935be4e7f5cfd2a1f48a3daa3d906d64b --- src/chainparams.cpp | 62 ++++++++++----------------------------------- 1 file changed, 14 insertions(+), 48 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 874e501abffa8..9a0ddb3ca01e3 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -256,7 +256,7 @@ class CMainParams : public CChainParams static CMainParams mainParams; /** - * Testnet (v3) + * Testnet (v5) */ class CTestNetParams : public CMainParams { @@ -278,11 +278,6 @@ class CTestNetParams : public CMainParams consensus.nBudgetCycleBlocks = 144; // approx 10 cycles per day consensus.nBudgetFeeConfirmations = 3; // (only 8-blocks window for finalization on testnet) consensus.nCoinbaseMaturity = 15; - consensus.nFutureTimeDriftPoW = 7200; - consensus.nFutureTimeDriftPoS = 180; - consensus.nMasternodeCountDrift = 4; // num of MN we allow the see-saw payments to be off by - consensus.nMaxMoneyOut = 43199500 * COIN; - consensus.nPoolMaxTransactions = 2; consensus.nProposalEstablishmentTime = 60 * 5; // at least 5 min old to make it into a budget consensus.nStakeMinAge = 60 * 60; consensus.nStakeMinDepth = 100; @@ -298,56 +293,27 @@ class CTestNetParams : public CMainParams consensus.nTime_RejectOldSporkKey = 1569538800; //!> September 26, 2019 11:00:00 PM GMT // height based activations - consensus.height_last_ZC_AccumCheckpoint = 1106090; + consensus.height_last_ZC_AccumCheckpoint = -1; consensus.height_last_ZC_WrappedSerials = -1; consensus.height_start_InvalidUTXOsCheck = 999999999; consensus.height_start_ZC_InvalidSerials = 999999999; consensus.height_start_ZC_SerialRangeCheck = 1; consensus.height_ZC_RecalcAccumulators = 999999999; - // validation by-pass - consensus.nPivxBadBlockTime = 1489001494; // Skip nBit validation of Block 201 per PR #915 - consensus.nPivxBadBlockBits = 0x1e0a20bd; // Skip nBit validation of Block 201 per PR #915 - - // Zerocoin-related params - consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784" - "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911" - "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363" - "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133" - "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548" - "31438167899885040445364023527381951378636564391212010397122822120720357"; - consensus.ZC_MaxPublicSpendsPerTx = 637; // Assume about 220 bytes each input - consensus.ZC_MaxSpendsPerTx = 7; // Assume about 20kb each input - consensus.ZC_MinMintConfirmations = 20; - consensus.ZC_MinMintFee = 1 * CENT; - consensus.ZC_MinStakeDepth = 200; - consensus.ZC_TimeStart = 1501776000; - // Network upgrades consensus.vUpgrades[Consensus::BASE_NETWORK].nActivationHeight = Consensus::NetworkUpgrade::ALWAYS_ACTIVE; consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight = Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT; consensus.vUpgrades[Consensus::UPGRADE_POS].nActivationHeight = 201; - consensus.vUpgrades[Consensus::UPGRADE_POS_V2].nActivationHeight = 51197; - consensus.vUpgrades[Consensus::UPGRADE_ZC].nActivationHeight = 201576; - consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight = 444020; - consensus.vUpgrades[Consensus::UPGRADE_BIP65].nActivationHeight = 851019; - consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].nActivationHeight = 1106100; - consensus.vUpgrades[Consensus::UPGRADE_V3_4].nActivationHeight = 1214000; - consensus.vUpgrades[Consensus::UPGRADE_V4_0].nActivationHeight = 1347000; - consensus.vUpgrades[Consensus::UPGRADE_V5_0].nActivationHeight = 1873550; - - consensus.vUpgrades[Consensus::UPGRADE_ZC].hashActivationBlock = - uint256S("0x258c489f42f03cb97db2255e47938da4083eee4e242853c2d48bae2b1d0110a6"); - consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].hashActivationBlock = - uint256S("0xfcc6a4c1da22e4db2ada87d257d6eef5e6922347ca1bb7879edfee27d24f64b5"); - consensus.vUpgrades[Consensus::UPGRADE_BIP65].hashActivationBlock = - uint256S("0xc54b3e7e8b710e4075da1806adf2d508ae722627d5bcc43f594cf64d5eef8b30"); - consensus.vUpgrades[Consensus::UPGRADE_V3_4].hashActivationBlock = - uint256S("0x1822577176173752aea33d1f60607cefe9e0b1c54ebaa77eb40201a385506199"); - consensus.vUpgrades[Consensus::UPGRADE_V4_0].hashActivationBlock = - uint256S("0x30c173ffc09a13f288bf6e828216107037ce5b79536b1cebd750a014f4939882"); + consensus.vUpgrades[Consensus::UPGRADE_POS_V2].nActivationHeight = 201; + consensus.vUpgrades[Consensus::UPGRADE_ZC].nActivationHeight = 201; + consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight = 201; + consensus.vUpgrades[Consensus::UPGRADE_BIP65].nActivationHeight = 201; + consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].nActivationHeight = 201; + consensus.vUpgrades[Consensus::UPGRADE_V3_4].nActivationHeight = 201; + consensus.vUpgrades[Consensus::UPGRADE_V4_0].nActivationHeight = 201; + consensus.vUpgrades[Consensus::UPGRADE_V5_0].nActivationHeight = 201; /** * The message start string is designed to be unlikely to occur in normal data. @@ -355,10 +321,10 @@ class CTestNetParams : public CMainParams * a large 4-byte int at any alignment. */ - pchMessageStart[0] = 0x45; - pchMessageStart[1] = 0x76; - pchMessageStart[2] = 0x65; - pchMessageStart[3] = 0xba; + pchMessageStart[0] = 0xf5; + pchMessageStart[1] = 0xe6; + pchMessageStart[2] = 0xd5; + pchMessageStart[3] = 0xca; nDefaultPort = 51474; vFixedSeeds.clear(); From 5b809b295f6c01b7f903bda21c7a8b77391a9032 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 14:57:11 +0100 Subject: [PATCH 66/86] Params: Fix PoS block value for testnet to 5 (ZC_V2 upgrade activated with POS at block 201) Github-Pull: #2069 Rebased-From: 2ebb9864fd3cc2bd10246ecb0ea98c54fc360950 --- src/validation.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index bdbac4e384450..34e58963b2b98 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -792,7 +792,7 @@ CAmount GetBlockValue(int nHeight) return 250000 * COIN; } // Mainnet/Testnet block reward reduction schedule - const int nLast = isTestnet ? 648000 : Params().GetConsensus().vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight; + const int nLast = Params().GetConsensus().vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight; if (nHeight > nLast) return 5 * COIN; if (nHeight > 648000) return 4.5 * COIN; if (nHeight > 604800) return 9 * COIN; @@ -803,8 +803,7 @@ CAmount GetBlockValue(int nHeight) if (nHeight > 388800) return 31.5 * COIN; if (nHeight > 345600) return 36 * COIN; if (nHeight > 302400) return 40.5 * COIN; - const int nSecond = isTestnet ? 145000 : 151200; - if (nHeight > nSecond) return 45 * COIN; + if (nHeight > 151200) return 45 * COIN; if (nHeight > 86400) return 225 * COIN; if (nHeight !=1) return 250 * COIN; // Premine for 6 masternodes at block 1 From 1f2855110a3f3ad7761d3d44153ee0174bbdeb60 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Thu, 17 Dec 2020 15:06:00 +0100 Subject: [PATCH 67/86] Params: clear testnet checkpoints Github-Pull: #2069 Rebased-From: ff8217407c3818d13cf0f11707e3b33b45dc7b6a --- src/chainparams.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 9a0ddb3ca01e3..174df87adae91 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -99,16 +99,12 @@ static const Checkpoints::CCheckpointData data = { static Checkpoints::MapCheckpoints mapCheckpointsTestnet = boost::assign::map_list_of - (0, uint256S("0x001")) - (1016800, uint256S("6ae7d52092fd918c8ac8d9b1334400387d3057997e6e927a88e57186dc395231")) - (1106100, uint256S("c54b3e7e8b710e4075da1806adf2d508ae722627d5bcc43f594cf64d5eef8b30")) //!< zc public spend activation height - (1112700, uint256S("2ad8d507dbe3d3841b9f8a29c3878d570228e9361c3e057362d7915777bbc849")) - (1347000, uint256S("30c173ffc09a13f288bf6e828216107037ce5b79536b1cebd750a014f4939882")) //!< First v7 block - (1608352, uint256S("34a1ae222b2794f34b13e87b34c6ab1b0849c80c372ca0070ceab77a83534f15")); //!< PIVX v4.1.1 enforced + (0, uint256S("0x001")); + //(201, uint256S("6ae7d52092fd918c8ac8d9b1334400387d3057997e6e927a88e57186dc395231")); // v5 activation (PoS/Sapling) static const Checkpoints::CCheckpointData dataTestnet = { &mapCheckpointsTestnet, - 1591225230, - 3501914, + 1454124731, + 0, 3000}; static Checkpoints::MapCheckpoints mapCheckpointsRegtest = From 60f15358874aeec73ee49b4b31210c824be06dc1 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 18 Dec 2020 11:11:35 -0300 Subject: [PATCH 68/86] GUI: Dashboard, fix type filtering disappearance. The combobox shouldn't get hide when there are transactions in the wallet, independently on the selected filter. If the user selects a type that it isn't in the wallet, the filter combobox will disappear, leaving the tx list empty and not allowing any other movement. Github-Pull: #2073 Rebased-From: 6dbe9ad1eadc5fee65a71d68a78aef38f6d5cce4 --- src/qt/pivx/dashboardwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/pivx/dashboardwidget.cpp b/src/qt/pivx/dashboardwidget.cpp index 0c1b8513ffc74..f1fc56fc24856 100644 --- a/src/qt/pivx/dashboardwidget.cpp +++ b/src/qt/pivx/dashboardwidget.cpp @@ -242,7 +242,7 @@ void DashboardWidget::onTxArrived(const QString& hash, const bool& isCoinStake, void DashboardWidget::showList() { - if (filter->rowCount() == 0) { + if (txModel->size() == 0) { ui->emptyContainer->setVisible(true); ui->listTransactions->setVisible(false); ui->comboBoxSortType->setVisible(false); From c5abbdab4609ab7e6e73c9fa5731fc2cd1a4b8be Mon Sep 17 00:00:00 2001 From: random-zebra Date: Fri, 18 Dec 2020 13:50:06 +0100 Subject: [PATCH 69/86] Consensus: update spork keys for v5 Github-Pull: #2071 Rebased-From: 2e6f856822e4cc69a9bdf40e48eaea353fed2f04 --- src/chainparams.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 174df87adae91..3bf95f645e828 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -149,10 +149,10 @@ class CMainParams : public CChainParams consensus.nTimeSlotLength = 15; // spork keys - consensus.strSporkPubKey = "040F129DE6546FE405995329A887329BED4321325B1A73B0A257423C05C1FCFE9E40EF0678AEF59036A22C42E61DFD29DF7EFB09F56CC73CADF64E05741880E3E7"; - consensus.strSporkPubKeyOld = "0499A7AF4806FC6DE640D23BC5936C29B77ADF2174B4F45492727F897AE63CF8D27B2F05040606E0D14B547916379FA10716E344E745F880EDC037307186AA25B7"; - consensus.nTime_EnforceNewSporkKey = 1566860400; //!> August 26, 2019 11:00:00 PM GMT - consensus.nTime_RejectOldSporkKey = 1569538800; //!> September 26, 2019 11:00:00 PM GMT + consensus.strSporkPubKey = "0410050aa740d280b134b40b40658781fc1116ba7700764e0ce27af3e1737586b3257d19232e0cb5084947f5107e44bcd577f126c9eb4a30ea2807b271d2145298"; + consensus.strSporkPubKeyOld = "040F129DE6546FE405995329A887329BED4321325B1A73B0A257423C05C1FCFE9E40EF0678AEF59036A22C42E61DFD29DF7EFB09F56CC73CADF64E05741880E3E7"; + consensus.nTime_EnforceNewSporkKey = 1608512400; //!> December 21, 2020 01:00:00 AM GMT + consensus.nTime_RejectOldSporkKey = 1614560400; //!> March 1, 2021 01:00:00 AM GMT // height-based activations consensus.height_last_ZC_AccumCheckpoint = 1686240; @@ -283,10 +283,8 @@ class CTestNetParams : public CMainParams consensus.nTimeSlotLength = 15; // spork keys - consensus.strSporkPubKey = "04E88BB455E2A04E65FCC41D88CD367E9CCE1F5A409BE94D8C2B4B35D223DED9C8E2F4E061349BA3A38839282508066B6DC4DB72DD432AC4067991E6BF20176127"; - consensus.strSporkPubKeyOld = "04A8B319388C0F8588D238B9941DC26B26D3F9465266B368A051C5C100F79306A557780101FE2192FE170D7E6DEFDCBEE4C8D533396389C0DAFFDBC842B002243C"; - consensus.nTime_EnforceNewSporkKey = 1566860400; //!> August 26, 2019 11:00:00 PM GMT - consensus.nTime_RejectOldSporkKey = 1569538800; //!> September 26, 2019 11:00:00 PM GMT + consensus.strSporkPubKey = "04677c34726c491117265f4b1c83cef085684f36c8df5a97a3a42fc499316d0c4e63959c9eca0dba239d9aaaf72011afffeb3ef9f51b9017811dec686e412eb504"; + consensus.strSporkPubKeyOld = "04E88BB455E2A04E65FCC41D88CD367E9CCE1F5A409BE94D8C2B4B35D223DED9C8E2F4E061349BA3A38839282508066B6DC4DB72DD432AC4067991E6BF20176127"; // height based activations consensus.height_last_ZC_AccumCheckpoint = -1; From e9a9d549e64d99ef4e585d0d3592469d76e1ec55 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Fri, 18 Dec 2020 14:03:38 +0100 Subject: [PATCH 70/86] Consensus: Allow setting old spork key before its expiration Github-Pull: #2071 Rebased-From: 2fc2d8fb221f2beb4bf8114811eed2e52a726c99 --- src/spork.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/spork.cpp b/src/spork.cpp index 45ab0243b96f2..10894f0c7e1c9 100644 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -268,9 +268,8 @@ bool CSporkManager::SetPrivKey(std::string strPrivKey) spork.Sign(strPrivKey); - const bool fRequireNew = GetTime() >= Params().GetConsensus().nTime_EnforceNewSporkKey; bool fValidSig = spork.CheckSignature(); - if (!fValidSig && !fRequireNew) { + if (!fValidSig) { // See if window is open that allows for old spork key to sign messages if (GetAdjustedTime() < Params().GetConsensus().nTime_RejectOldSporkKey) { CPubKey pubkeyold = spork.GetPublicKeyOld(); From 03ec6bb77fbcee3a11b9e57d92aad0fa6f94408a Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sat, 19 Dec 2020 13:56:15 +0100 Subject: [PATCH 71/86] Wallet: return unconfirmed balance for all spendable coins by default (including delegated). This way, delegations are reflected under "Pending balance" in the GUI (owner-side), before being included in a block. Github-Pull: #2080 Rebased-From: d1f30ff5c636817a5d52faf3e10984b078c2dfdb --- src/wallet/wallet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 8d63b44856639..104063b0cad78 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -606,7 +606,7 @@ class CWallet : public CCryptoKeyStore, public CValidationInterface CAmount GetDelegatedBalance() const; // delegated coins for which we have the spending key CAmount GetImmatureDelegatedBalance() const; CAmount GetLockedCoins() const; - CAmount GetUnconfirmedBalance(isminetype filter = ISMINE_SPENDABLE) const; + CAmount GetUnconfirmedBalance(isminetype filter = ISMINE_SPENDABLE_ALL) const; CAmount GetImmatureBalance() const; CAmount GetWatchOnlyBalance() const; CAmount GetUnconfirmedWatchOnlyBalance() const; From dabe9959a77190a09bc12d5b6a9c4ebbf6b3ea16 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sat, 19 Dec 2020 17:43:51 +0100 Subject: [PATCH 72/86] Tests: minor fixes for mining_pos_reorg_py - no need to check "spendable" utxos (as we are not dealing with watch-only). - no need to catch `bad-txns-inputs-spent` exception with sendrawtransaction (as we are not dealing with zPIVs anymore) - double check that the double-spend is not on chain/mempool with getrawtransaction Github-Pull: #2081 Rebased-From: 554642249c4c0a72791eadd6857e04f12a1c7d4f --- test/functional/mining_pos_reorg.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/test/functional/mining_pos_reorg.py b/test/functional/mining_pos_reorg.py index c0323e4df230a..831b8c3c4ef93 100755 --- a/test/functional/mining_pos_reorg.py +++ b/test/functional/mining_pos_reorg.py @@ -96,9 +96,9 @@ def findUtxoInList(txid, vout, utxo_list): # The stake input was unspent 1 block ago, now it's not res, utxo = findUtxoInList(stakeinput["txid"], stakeinput["vout"], initial_unspent_0) - assert (res and utxo["spendable"]) + assert (res) res, utxo = findUtxoInList(stakeinput["txid"], stakeinput["vout"], self.nodes[0].listunspent()) - assert (not res or not utxo["spendable"]) + assert (not res) self.log.info("Coinstake input %s...%s-%d is no longer spendable." % ( stakeinput["txid"][:9], stakeinput["txid"][-4:], stakeinput["vout"])) @@ -123,17 +123,11 @@ def findUtxoInList(txid, vout, utxo_list): {"xxncEuJK27ygNh7imNfaX8JV6ZQUnoBqzN": (stakeinput_amount-0.01)}) rawtx = self.nodes[0].signrawtransaction(rawtx_unsigned) assert(rawtx["complete"]) - try: - self.nodes[0].sendrawtransaction(rawtx["hex"]) - except JSONRPCException as e: - # JSONRPCException was thrown as expected. Check the code and message values are correct. - if e.error["code"] not in [-26, -25]: - raise AssertionError("Unexpected JSONRPC error code %i" % e.error["code"]) - if ([x for x in ["bad-txns-inputs-spent", "Missing inputs"] if x in e.error['message']] == []): - raise e - except Exception as e: - raise AssertionError("Unexpected exception raised: " + type(e).__name__) - self.log.info("GOOD: v2 spend was not possible.") + assert_raises_rpc_error(-25, "Missing inputs", self.nodes[0].sendrawtransaction, rawtx["hex"]) + txid = self.nodes[0].decoderawtransaction(rawtx["hex"])["txid"] + assert_raises_rpc_error(-5, "No such mempool or blockchain transaction", + self.nodes[0].getrawtransaction, txid) + self.log.info("GOOD: spending the stake input was not possible.") # Stake 12 blocks with node-1 set_node_times(self.nodes, block_time_1) From 411edeef9d3c427e34e387e4153959e11d7874a0 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 20 Dec 2020 02:50:40 +0100 Subject: [PATCH 73/86] [BUG] Miner not paying valid finalized budget if <20 active masternodes Verifier: (`CheckBlock` --> `IsBlockPayeeValid` --> `IsBudgetPaymentBlock`) expects a payment to a budget even with the case of N<20 active masternodes on the network, provided that all N voted on the finalized budget (the threshold is N-1). Also remove the extra call to `IsBudgetPaymentBlock` directly from `FillBlockPayee` (it is already called by `CBudgetManager::FillBlockPayee` --> `GetPayeeAndAmount`). Github-Pull: #2084 Rebased-From: 16455e0796f358b007777a37fd01a736642b890a --- src/budget/budgetmanager.cpp | 13 ++++--------- src/masternode-payments.cpp | 7 +++---- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/budget/budgetmanager.cpp b/src/budget/budgetmanager.cpp index d04bb2e29ed77..87228855a3540 100644 --- a/src/budget/budgetmanager.cpp +++ b/src/budget/budgetmanager.cpp @@ -401,17 +401,12 @@ int CBudgetManager::GetHighestVoteCount(int chainHeight) const bool CBudgetManager::GetPayeeAndAmount(int chainHeight, CScript& payeeRet, CAmount& nAmountRet) const { - const CFinalizedBudget* pfb = GetBudgetWithHighestVoteCount(chainHeight); - if (!pfb) return false; - - // Check that there are enough votes - int mnCount = mnodeman.CountEnabled(ActiveProtocol()); - int nFivePercent = mnCount / 20; - if ((nFivePercent == 0 && !(Params().IsRegTestNet() && mnCount > 0) ) || - pfb->GetVoteCount() < nFivePercent) + int nCountThreshold; + if (!IsBudgetPaymentBlock(chainHeight, nCountThreshold)) return false; - return pfb->GetPayeeAndAmount(chainHeight, payeeRet, nAmountRet); + const CFinalizedBudget* pfb = GetBudgetWithHighestVoteCount(chainHeight); + return pfb && pfb->GetPayeeAndAmount(chainHeight, payeeRet, nAmountRet) && pfb->GetVoteCount() > nCountThreshold; } bool CBudgetManager::FillBlockPayee(CMutableTransaction& txNew, const int nHeight, bool fProofOfStake) const diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index 5c283ece3c80d..f084a967615c0 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -295,10 +295,9 @@ void FillBlockPayee(CMutableTransaction& txNew, const int nHeight, bool fProofOf { if (nHeight == 0) return; - if (!sporkManager.IsSporkActive(SPORK_13_ENABLE_SUPERBLOCKS) || // if superblocks are not enabled - !g_budgetman.IsBudgetPaymentBlock(nHeight) || // or this is not a superblock - !g_budgetman.FillBlockPayee(txNew, nHeight, fProofOfStake) ) { // or there's no budget with enough votes - // pay a masternode + if (!sporkManager.IsSporkActive(SPORK_13_ENABLE_SUPERBLOCKS) || // if superblocks are not enabled + !g_budgetman.FillBlockPayee(txNew, nHeight, fProofOfStake) ) { // or this is not a superblock, + // ... or there's no budget with enough votes, then pay a masternode masternodePayments.FillBlockPayee(txNew, nHeight, fProofOfStake); } } From 87c4d21cab66d29fea34760d9198a71a486730af Mon Sep 17 00:00:00 2001 From: Fuzzbawls Date: Sun, 20 Dec 2020 00:58:05 -0800 Subject: [PATCH 74/86] [Build] Unify header file extensions We adopted a global `.h` header file extension convention from bitcoin, this renames a number of header files coming from ZCash's sapling base to conform to that convention. Github-Pull: #2087 Rebased-From: 47ce2269621b89fa6b7ef104f815ff66e18ec367 --- src/Makefile.am | 10 +++++----- src/coins.h | 6 +++--- src/keystore.h | 2 +- src/rpc/rawtransaction.cpp | 2 +- src/sapling/address.cpp | 4 ++-- src/sapling/{address.hpp => address.h} | 0 src/sapling/incrementalmerkletree.cpp | 2 +- ...crementalmerkletree.hpp => incrementalmerkletree.h} | 0 src/sapling/note.cpp | 2 +- src/sapling/{note.hpp => note.h} | 6 +++--- src/sapling/noteencryption.cpp | 2 +- src/sapling/{noteencryption.hpp => noteencryption.h} | 2 +- src/sapling/proof.cpp | 2 +- src/sapling/{proof.hpp => proof.h} | 0 src/sapling/sapling_transaction.h | 4 ++-- src/sapling/saplingscriptpubkeyman.h | 4 ++-- src/sapling/transaction_builder.h | 8 ++++---- src/sapling/zip32.h | 2 +- src/test/coins_tests.cpp | 2 +- src/test/librust/merkletree_tests.cpp | 2 +- src/test/librust/noteencryption_tests.cpp | 8 ++++---- src/test/librust/sapling_key_tests.cpp | 4 +++- src/test/librust/sapling_keystore_tests.cpp | 3 ++- src/test/librust/sapling_note_tests.cpp | 5 +++-- src/test/librust/sapling_rpc_wallet_tests.cpp | 2 +- src/test/librust/sapling_wallet_tests.cpp | 4 ++-- src/test/librust/utiltest.h | 8 ++++---- src/test/librust/wallet_zkeys_tests.cpp | 2 +- src/validationinterface.h | 2 +- src/wallet/test/wallet_shielded_balances_tests.cpp | 4 ++-- src/wallet/wallet.h | 2 +- 31 files changed, 55 insertions(+), 51 deletions(-) rename src/sapling/{address.hpp => address.h} (100%) rename src/sapling/{incrementalmerkletree.hpp => incrementalmerkletree.h} (100%) rename src/sapling/{note.hpp => note.h} (98%) rename src/sapling/{noteencryption.hpp => noteencryption.h} (98%) rename src/sapling/{proof.hpp => proof.h} (100%) diff --git a/src/Makefile.am b/src/Makefile.am index 513a08125860d..edc4f1a6e97f4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -131,13 +131,13 @@ LIBSAPLING_H = \ sapling/sapling_core_write.h \ sapling/sapling_util.h \ sapling/prf.h \ - sapling/noteencryption.hpp \ - sapling/address.hpp \ - sapling/note.hpp \ + sapling/noteencryption.h \ + sapling/address.h \ + sapling/note.h \ sapling/zip32.h \ sapling/saplingscriptpubkeyman.h \ - sapling/incrementalmerkletree.hpp \ - sapling/proof.hpp \ + sapling/incrementalmerkletree.h \ + sapling/proof.h \ sapling/sapling_transaction.h \ sapling/transaction_builder.h \ sapling/sapling_operation.h diff --git a/src/coins.h b/src/coins.h index 43e36c5c77265..15e7e2281fcb2 100644 --- a/src/coins.h +++ b/src/coins.h @@ -8,10 +8,10 @@ #define BITCOIN_COINS_H #include "compressor.h" +#include "consensus/consensus.h" // can be removed once policy/ established #include "memusage.h" -#include "consensus/consensus.h" // can be removed once policy/ established +#include "sapling/incrementalmerkletree.h" #include "script/standard.h" -#include "sapling/incrementalmerkletree.hpp" #include "serialize.h" #include "uint256.h" @@ -277,7 +277,7 @@ class CCoinsViewCache : public CCoinsViewBacked protected: /** * Make mutable so that we can "fill the cache" even from Get-methods - * declared as "const". + * declared as "const". */ mutable uint256 hashBlock; mutable CCoinsMap cacheCoins; diff --git a/src/keystore.h b/src/keystore.h index 8987b3c288092..9d7d526fdc0ed 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -9,7 +9,7 @@ #include "key.h" #include "pubkey.h" -#include "sapling/address.hpp" +#include "sapling/address.h" #include "sapling/zip32.h" #include "sync.h" diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp index 9c49202518472..35c674a9c1c76 100644 --- a/src/rpc/rawtransaction.cpp +++ b/src/rpc/rawtransaction.cpp @@ -20,8 +20,8 @@ #include "uint256.h" #include "utilmoneystr.h" #ifdef ENABLE_WALLET +#include "sapling/address.h" #include "sapling/key_io_sapling.h" -#include "sapling/address.hpp" #include "wallet/wallet.h" #endif diff --git a/src/sapling/address.cpp b/src/sapling/address.cpp index b1cccca558a5b..253759a387adf 100644 --- a/src/sapling/address.cpp +++ b/src/sapling/address.cpp @@ -1,5 +1,5 @@ -#include "sapling/address.hpp" -#include "sapling/noteencryption.hpp" +#include "sapling/address.h" +#include "sapling/noteencryption.h" #include "sapling/prf.h" #include "sapling/sapling_util.h" diff --git a/src/sapling/address.hpp b/src/sapling/address.h similarity index 100% rename from src/sapling/address.hpp rename to src/sapling/address.h diff --git a/src/sapling/incrementalmerkletree.cpp b/src/sapling/incrementalmerkletree.cpp index 1a2856560e004..60f333eee4fec 100644 --- a/src/sapling/incrementalmerkletree.cpp +++ b/src/sapling/incrementalmerkletree.cpp @@ -5,8 +5,8 @@ #include -#include "sapling/incrementalmerkletree.hpp" #include "crypto/sha256.h" +#include "sapling/incrementalmerkletree.h" #include namespace libzcash { diff --git a/src/sapling/incrementalmerkletree.hpp b/src/sapling/incrementalmerkletree.h similarity index 100% rename from src/sapling/incrementalmerkletree.hpp rename to src/sapling/incrementalmerkletree.h diff --git a/src/sapling/note.cpp b/src/sapling/note.cpp index eef7bfd94d044..a21ebc2166eb8 100644 --- a/src/sapling/note.cpp +++ b/src/sapling/note.cpp @@ -1,4 +1,4 @@ -#include "sapling/note.hpp" +#include "sapling/note.h" #include "sapling/prf.h" #include "sapling/sapling_util.h" diff --git a/src/sapling/note.hpp b/src/sapling/note.h similarity index 98% rename from src/sapling/note.hpp rename to src/sapling/note.h index ddeb148a49923..deb3731993051 100644 --- a/src/sapling/note.hpp +++ b/src/sapling/note.h @@ -1,10 +1,10 @@ #ifndef ZC_NOTE_H_ #define ZC_NOTE_H_ -#include "uint256.h" +#include "sapling/address.h" +#include "sapling/noteencryption.h" #include "sapling/sapling.h" -#include "sapling/address.hpp" -#include "sapling/noteencryption.hpp" +#include "uint256.h" #include #include diff --git a/src/sapling/noteencryption.cpp b/src/sapling/noteencryption.cpp index 42e3e30433805..2daa5ccf5b8ab 100644 --- a/src/sapling/noteencryption.cpp +++ b/src/sapling/noteencryption.cpp @@ -3,7 +3,7 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include "sapling/noteencryption.hpp" +#include "sapling/noteencryption.h" #include "sapling/prf.h" #include "sapling/sapling_util.h" diff --git a/src/sapling/noteencryption.hpp b/src/sapling/noteencryption.h similarity index 98% rename from src/sapling/noteencryption.hpp rename to src/sapling/noteencryption.h index fd0a7d74a0599..e34175bbd281c 100644 --- a/src/sapling/noteencryption.hpp +++ b/src/sapling/noteencryption.h @@ -13,8 +13,8 @@ See the Zcash protocol specification for more information. #include "uint256.h" +#include "sapling/address.h" #include "sapling/sapling.h" -#include "sapling/address.hpp" #include diff --git a/src/sapling/proof.cpp b/src/sapling/proof.cpp index 20c585af72a77..04db5a947722d 100644 --- a/src/sapling/proof.cpp +++ b/src/sapling/proof.cpp @@ -1,4 +1,4 @@ -#include "sapling/proof.hpp" +#include "sapling/proof.h" namespace libzcash { diff --git a/src/sapling/proof.hpp b/src/sapling/proof.h similarity index 100% rename from src/sapling/proof.hpp rename to src/sapling/proof.h diff --git a/src/sapling/sapling_transaction.h b/src/sapling/sapling_transaction.h index d5c4a54743125..e6e8201722b20 100644 --- a/src/sapling/sapling_transaction.h +++ b/src/sapling/sapling_transaction.h @@ -11,9 +11,9 @@ #include "uint256.h" #include "consensus/consensus.h" -#include "sapling/noteencryption.hpp" +#include "sapling/noteencryption.h" #include "sapling/sapling.h" -#include "sapling/proof.hpp" +#include "sapling/proof.h" #include diff --git a/src/sapling/saplingscriptpubkeyman.h b/src/sapling/saplingscriptpubkeyman.h index 07515575d5122..dec4b7b3abaca 100644 --- a/src/sapling/saplingscriptpubkeyman.h +++ b/src/sapling/saplingscriptpubkeyman.h @@ -6,11 +6,11 @@ #define PIVX_SAPLINGSCRIPTPUBKEYMAN_H #include "consensus/consensus.h" -#include "sapling/note.hpp" +#include "sapling/note.h" #include "wallet/hdchain.h" #include "wallet/wallet.h" #include "wallet/walletdb.h" -#include "sapling/incrementalmerkletree.hpp" +#include "sapling/incrementalmerkletree.h" //! Size of witness cache // Should be large enough that we can expect not to reorg beyond our cache diff --git a/src/sapling/transaction_builder.h b/src/sapling/transaction_builder.h index c4557ff963a35..e3841983f57c5 100644 --- a/src/sapling/transaction_builder.h +++ b/src/sapling/transaction_builder.h @@ -14,10 +14,10 @@ #include "script/script.h" #include "script/standard.h" #include "uint256.h" -#include "sapling/address.hpp" -#include "sapling/incrementalmerkletree.hpp" -#include "sapling/note.hpp" -#include "sapling/noteencryption.hpp" +#include "sapling/address.h" +#include "sapling/incrementalmerkletree.h" +#include "sapling/note.h" +#include "sapling/noteencryption.h" struct SpendDescriptionInfo { libzcash::SaplingExpandedSpendingKey expsk; diff --git a/src/sapling/zip32.h b/src/sapling/zip32.h index 83a407b13f421..03b0e96ca51ed 100644 --- a/src/sapling/zip32.h +++ b/src/sapling/zip32.h @@ -10,7 +10,7 @@ #include "blob_uint256.h" #include "key.h" #include "uint256.h" -#include "sapling/address.hpp" +#include "sapling/address.h" #include diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp index 78ae93d9420d5..a57735a7d237a 100644 --- a/src/test/coins_tests.cpp +++ b/src/test/coins_tests.cpp @@ -12,7 +12,7 @@ #include "utilstrencodings.h" #include "random.h" -#include "sapling/incrementalmerkletree.hpp" +#include "sapling/incrementalmerkletree.h" #include #include diff --git a/src/test/librust/merkletree_tests.cpp b/src/test/librust/merkletree_tests.cpp index 8ae48f64dd66d..460133251c030 100644 --- a/src/test/librust/merkletree_tests.cpp +++ b/src/test/librust/merkletree_tests.cpp @@ -19,7 +19,7 @@ #include "serialize.h" #include "streams.h" -#include "sapling/incrementalmerkletree.hpp" +#include "sapling/incrementalmerkletree.h" #include "sapling/sapling_util.h" #include "json_test_vectors.h" diff --git a/src/test/librust/noteencryption_tests.cpp b/src/test/librust/noteencryption_tests.cpp index 3073b2612b82d..b12d6b5295626 100644 --- a/src/test/librust/noteencryption_tests.cpp +++ b/src/test/librust/noteencryption_tests.cpp @@ -8,12 +8,12 @@ #include #include -#include "sapling/address.hpp" -#include "sapling/note.hpp" -#include "sapling/noteencryption.hpp" +#include "crypto/sha256.h" +#include "sapling/address.h" +#include "sapling/note.h" +#include "sapling/noteencryption.h" #include "sapling/prf.h" #include "sapling/sapling_util.h" -#include "crypto/sha256.h" #include #include diff --git a/src/test/librust/sapling_key_tests.cpp b/src/test/librust/sapling_key_tests.cpp index 9b857a12cbadc..5221dd8a485bc 100644 --- a/src/test/librust/sapling_key_tests.cpp +++ b/src/test/librust/sapling_key_tests.cpp @@ -5,10 +5,12 @@ #include "test/test_pivx.h" -#include "sapling/address.hpp" +#include "sapling/address.h" #include "sapling/key_io_sapling.h" + #include #include + #include diff --git a/src/test/librust/sapling_keystore_tests.cpp b/src/test/librust/sapling_keystore_tests.cpp index cbbc38d135b68..215c77987d053 100644 --- a/src/test/librust/sapling_keystore_tests.cpp +++ b/src/test/librust/sapling_keystore_tests.cpp @@ -6,8 +6,9 @@ #include "test/test_pivx.h" #include "test/librust/utiltest.h" -#include "sapling/address.hpp" +#include "sapling/address.h" #include "sapling/sapling_util.h" + #include #include diff --git a/src/test/librust/sapling_note_tests.cpp b/src/test/librust/sapling_note_tests.cpp index 4a6f1bea5cefd..46226b3f9e91a 100644 --- a/src/test/librust/sapling_note_tests.cpp +++ b/src/test/librust/sapling_note_tests.cpp @@ -5,8 +5,8 @@ #include "test/test_pivx.h" -#include "sapling/address.hpp" -#include "sapling/note.hpp" +#include "sapling/address.h" +#include "sapling/note.h" #include "sapling/sapling_util.h" #include "amount.h" @@ -14,6 +14,7 @@ #include #include + #include BOOST_FIXTURE_TEST_SUITE(sapling_note_tests, BasicTestingSetup) diff --git a/src/test/librust/sapling_rpc_wallet_tests.cpp b/src/test/librust/sapling_rpc_wallet_tests.cpp index 630ace9499c53..d87203dd35de5 100644 --- a/src/test/librust/sapling_rpc_wallet_tests.cpp +++ b/src/test/librust/sapling_rpc_wallet_tests.cpp @@ -16,7 +16,7 @@ #include "wallet/wallet.h" #include "sapling/key_io_sapling.h" -#include "sapling/address.hpp" +#include "sapling/address.h" #include "sapling/sapling_operation.h" #include diff --git a/src/test/librust/sapling_wallet_tests.cpp b/src/test/librust/sapling_wallet_tests.cpp index e8ff87637cf1b..e25392bcad2a0 100644 --- a/src/test/librust/sapling_wallet_tests.cpp +++ b/src/test/librust/sapling_wallet_tests.cpp @@ -18,8 +18,8 @@ #include "test/librust/utiltest.h" #include "wallet/wallet.h" #include "consensus/merkle.h" -#include "sapling/note.hpp" -#include "sapling/noteencryption.hpp" +#include "sapling/note.h" +#include "sapling/noteencryption.h" #include diff --git a/src/test/librust/utiltest.h b/src/test/librust/utiltest.h index 74c60229395e0..df2e69d17e5d5 100644 --- a/src/test/librust/utiltest.h +++ b/src/test/librust/utiltest.h @@ -6,10 +6,10 @@ #ifndef PIVX_UTIL_TEST_H #define PIVX_UTIL_TEST_H -#include "sapling/address.hpp" -#include "sapling/incrementalmerkletree.hpp" -#include "sapling/note.hpp" -#include "sapling/noteencryption.hpp" +#include "sapling/address.h" +#include "sapling/incrementalmerkletree.h" +#include "sapling/note.h" +#include "sapling/noteencryption.h" #include "wallet/wallet.h" struct TestSaplingNote { diff --git a/src/test/librust/wallet_zkeys_tests.cpp b/src/test/librust/wallet_zkeys_tests.cpp index 0256f0300e01d..2382d431ef282 100644 --- a/src/test/librust/wallet_zkeys_tests.cpp +++ b/src/test/librust/wallet_zkeys_tests.cpp @@ -6,7 +6,7 @@ #include "wallet/test/wallet_test_fixture.h" #include "sapling/sapling_util.h" -#include "sapling/address.hpp" +#include "sapling/address.h" #include "wallet/wallet.h" #include "wallet/walletdb.h" #include "util.h" diff --git a/src/validationinterface.h b/src/validationinterface.h index f50349eb645be..ad353dfe29968 100644 --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -8,7 +8,7 @@ #define BITCOIN_VALIDATIONINTERFACE_H #include "optional.h" -#include "sapling/incrementalmerkletree.hpp" +#include "sapling/incrementalmerkletree.h" #include diff --git a/src/wallet/test/wallet_shielded_balances_tests.cpp b/src/wallet/test/wallet_shielded_balances_tests.cpp index 490e492e5da36..a6dff16969f97 100644 --- a/src/wallet/test/wallet_shielded_balances_tests.cpp +++ b/src/wallet/test/wallet_shielded_balances_tests.cpp @@ -7,8 +7,8 @@ #include "consensus/merkle.h" #include "primitives/block.h" #include "random.h" -#include "sapling/note.hpp" -#include "sapling/noteencryption.hpp" +#include "sapling/note.h" +#include "sapling/noteencryption.h" #include "sapling/transaction_builder.h" #include "test/librust/utiltest.h" #include "wallet/wallet.h" diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 104063b0cad78..686e7571b1c25 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -22,7 +22,7 @@ #include "policy/feerate.h" #include "primitives/block.h" #include "primitives/transaction.h" -#include "sapling/address.hpp" +#include "sapling/address.h" #include "guiinterface.h" #include "util.h" #include "util/memory.h" From bbbc7c982ff3825e459eb30380a03eba7eb8bcad Mon Sep 17 00:00:00 2001 From: Fuzzbawls Date: Sun, 20 Dec 2020 01:04:45 -0800 Subject: [PATCH 75/86] Fix typo in `getsaplingnotescount` help text Github-Pull: #2088 Rebased-From: 87c12e52f84ef518199d11cb8b40db7b8dd510dd --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 53b0301aa83a6..3a07a8fe76d29 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4050,7 +4050,7 @@ UniValue getsaplingnotescount(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() > 1) throw std::runtime_error( - "getsaplingnodescount ( minconf )\n" + "getsaplingnotescount ( minconf )\n" "Returns the number of sapling notes available in the wallet.\n" "\nArguments:\n" "1. minconf (numeric, optional, default=1) Only include notes in transactions confirmed at least this many times.\n" From 41fc19201be866c63521384721c50bfec674e177 Mon Sep 17 00:00:00 2001 From: Fuzzbawls Date: Sun, 20 Dec 2020 01:10:29 -0800 Subject: [PATCH 76/86] Don't bother registering the `multisend` command This command has been disabled since v4.1.0, don't bother registering it anymore so that the runtime error message isn't shown when using the `help` RPC command Github-Pull: #2088 Rebased-From: 2dd232d20507c436c0fc11b429c119340e269238 --- src/wallet/rpcwallet.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 3a07a8fe76d29..1083904f7cc48 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3890,10 +3890,10 @@ unsigned int sumMultiSend() return sum; } +/* disable multisend UniValue multisend(const JSONRPCRequest& request) { throw std::runtime_error("Multisend is disabled in this wallet version"); - /* disable multisend CWalletDB walletdb(pwalletMain->strWalletFile); bool fFileBacked; //MultiSend Commands @@ -4042,8 +4042,8 @@ UniValue multisend(const JSONRPCRequest& request) } } return printMultiSend(); - */ } +*/ UniValue getsaplingnotescount(const JSONRPCRequest& request) @@ -4145,7 +4145,7 @@ static const CRPCCommand commands[] = { "wallet", "delegatorremove", &delegatorremove, true }, { "wallet", "bip38encrypt", &bip38encrypt, true }, { "wallet", "bip38decrypt", &bip38decrypt, true }, - { "wallet", "multisend", &multisend, false }, + //{ "wallet", "multisend", &multisend, false }, /** Sapling functions */ { "wallet", "getnewshieldedaddress", &getnewshieldedaddress, true }, From 04756ee6d2254cd20e32103b46b1f225927bb3d2 Mon Sep 17 00:00:00 2001 From: Fuzzbawls Date: Sun, 20 Dec 2020 01:32:36 -0800 Subject: [PATCH 77/86] Fixup various formatting inconsistencies with RPC help output Github-Pull: #2088 Rebased-From: fd5843ecb7828d8733dd15f434331d240aa05816 --- src/rpc/mining.cpp | 6 +++--- src/rpc/misc.cpp | 17 ++++++++++++----- src/rpc/net.cpp | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 6ae4b3e37d402..ee8463c21dd14 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -324,15 +324,15 @@ UniValue prioritisetransaction(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() != 3) throw std::runtime_error( - "prioritisetransaction \n" + "prioritisetransaction \"txid\" priority_delta fee_delta\n" "Accepts the transaction into mined blocks at a higher (or lower) priority\n" "\nArguments:\n" "1. \"txid\" (string, required) The transaction id.\n" - "2. priority delta (numeric, required) The priority to add or subtract.\n" + "2. priority_delta (numeric, required) The priority to add or subtract.\n" " The transaction selection algorithm considers the tx as it would have a higher priority.\n" " (priority of a transaction is calculated: coinage * value_in_upiv / txsize) \n" - "3. fee delta (numeric, required) The fee value (in upiv) to add (or subtract, if negative).\n" + "3. fee_delta (numeric, required) The fee value (in upiv) to add (or subtract, if negative).\n" " The fee is not actually paid, only the algorithm for selecting transactions into a block\n" " considers the transaction as it would have paid a higher (or lower) fee.\n" diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index ae6f48292e33f..9f9eddf51f3a7 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -548,8 +548,8 @@ UniValue verifymessage(const JSONRPCRequest& request) "\nArguments:\n" "1. \"pivxaddress\" (string, required) The pivx address to use for the signature.\n" - "2. \"signature\" (string, required) The signature provided by the signer in base 64 encoding (see signmessage).\n" - "3. \"message\" (string, required) The message that was signed.\n" + "2. \"signature\" (string, required) The signature provided by the signer in base 64 encoding (see signmessage).\n" + "3. \"message\" (string, required) The message that was signed.\n" "\nResult:\n" "true|false (boolean) If the signature is verified or not.\n" @@ -604,7 +604,7 @@ UniValue setmocktime(const JSONRPCRequest& request) "\nSet the local time to given timestamp (-regtest only)\n" "\nArguments:\n" - "1. timestamp (integer, required) Unix seconds-since-epoch timestamp\n" + "1. timestamp (numeric, required) Unix seconds-since-epoch timestamp\n" " Pass 0 to go back to using the system time."); if (!Params().IsRegTestNet()) @@ -646,16 +646,23 @@ UniValue logging(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() > 2) { throw std::runtime_error( - "logging [include,...] \n" + "logging [include,...] ( [exclude,...] )\n" "Gets and sets the logging configuration.\n" "When called without an argument, returns the list of categories that are currently being debug logged.\n" "When called with arguments, adds or removes categories from debug logging.\n" "The valid logging categories are: " + ListLogCategories() + "\n" "libevent logging is configured on startup and cannot be modified by this RPC during runtime." + "Arguments:\n" "1. \"include\" (array of strings) add debug logging for these categories.\n" "2. \"exclude\" (array of strings) remove debug logging for these categories.\n" - "\nResult: (string): a list of the logging categories that are active.\n" + + "\nResult:\n" + "{ (object): a JSON object of the logging categories that are active.\n" + " \"category\": fEnabled, (key/value) Key is the category name, value is a boolean of it's active state.\n" + " ...,\n" + "}\n" + "\nExamples:\n" + HelpExampleCli("logging", "\"[\\\"all\\\"]\" \"[\\\"http\\\"]\"") + HelpExampleRpc("logging", "[\"all\"], \"[libevent]\"") diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index c448262c06e3e..110fae7148706 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -431,7 +431,7 @@ UniValue setban(const JSONRPCRequest& request) if (request.fHelp || request.params.size() < 2 || (strCommand != "add" && strCommand != "remove")) throw std::runtime_error( - "setban \"ip(/netmask)\" \"add|remove\" (bantime) (absolute)\n" + "setban \"ip(/netmask)\" \"add|remove\" ( bantime absolute )\n" "\nAttempts add or remove a IP/Subnet from the banned list.\n" "\nArguments:\n" From e6ffe2aa67fd1d2832f1cccc36e959e0dd9c5961 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sat, 19 Dec 2020 18:25:37 +0100 Subject: [PATCH 78/86] Add new prevector benchmarks. >>> backports bitcoin/bitcoin@f0e7aa702095b22ba57a763c5c093e15d41586d1 This prepares for a series of two additional commits which optimize prevector performance. Github-Pull: #2083 Rebased-From: e6741d080dc5a694f58ec1c14bfea331a756fc1a --- src/Makefile.bench.include | 2 +- src/bench/prevector.cpp | 77 ++++++++++++++++++++++++++++++ src/bench/prevector_destructor.cpp | 36 -------------- src/compat.h | 10 ++++ 4 files changed, 88 insertions(+), 37 deletions(-) create mode 100644 src/bench/prevector.cpp delete mode 100644 src/bench/prevector_destructor.cpp diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include index 2ea719861a19d..480aa5c8d92c7 100644 --- a/src/Makefile.bench.include +++ b/src/Makefile.bench.include @@ -13,7 +13,7 @@ bench_bench_pivx_SOURCES = \ bench/crypto_hash.cpp \ bench/perf.cpp \ bench/perf.h \ - bench/prevector_destructor.cpp + bench/prevector.cpp bench_bench_pivx_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/ bench_bench_pivx_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) diff --git a/src/bench/prevector.cpp b/src/bench/prevector.cpp new file mode 100644 index 0000000000000..48d63172b026c --- /dev/null +++ b/src/bench/prevector.cpp @@ -0,0 +1,77 @@ +// Copyright (c) 2015-2017 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "bench/bench.h" + +#include "compat.h" +#include "prevector.h" + +struct nontrivial_t { + int x; + nontrivial_t() :x(-1) {} +}; +static_assert(!IS_TRIVIALLY_CONSTRUCTIBLE::value, + "expected nontrivial_t to not be trivially constructible"); + +typedef unsigned char trivial_t; +static_assert(IS_TRIVIALLY_CONSTRUCTIBLE::value, + "expected trivial_t to be trivially constructible"); + +template +static void PrevectorDestructor(benchmark::State& state) +{ + while (state.KeepRunning()) { + for (auto x = 0; x < 1000; ++x) { + prevector<28, T> t0; + prevector<28, T> t1; + t0.resize(28); + t1.resize(29); + } + } +} + +template +static void PrevectorClear(benchmark::State& state) +{ + + while (state.KeepRunning()) { + for (auto x = 0; x < 1000; ++x) { + prevector<28, T> t0; + prevector<28, T> t1; + t0.resize(28); + t0.clear(); + t1.resize(29); + t0.clear(); + } + } +} + +template +void PrevectorResize(benchmark::State& state) +{ + while (state.KeepRunning()) { + prevector<28, T> t0; + prevector<28, T> t1; + for (auto x = 0; x < 1000; ++x) { + t0.resize(28); + t0.resize(0); + t1.resize(29); + t1.resize(0); + } + } +} + +#define PREVECTOR_TEST(name) \ + static void Prevector ## name ## Nontrivial(benchmark::State& state) { \ + PrevectorResize(state); \ + } \ + BENCHMARK(Prevector ## name ## Nontrivial); \ + static void Prevector ## name ## Trivial(benchmark::State& state) { \ + PrevectorResize(state); \ + } \ + BENCHMARK(Prevector ## name ## Trivial); + +PREVECTOR_TEST(Clear) +PREVECTOR_TEST(Destructor) +PREVECTOR_TEST(Resize) diff --git a/src/bench/prevector_destructor.cpp b/src/bench/prevector_destructor.cpp deleted file mode 100644 index aa178e6ad4043..0000000000000 --- a/src/bench/prevector_destructor.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2015-2017 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "bench.h" -#include "prevector.h" - -static void PrevectorDestructor(benchmark::State& state) -{ - while (state.KeepRunning()) { - for (auto x = 0; x < 1000; ++x) { - prevector<28, unsigned char> t0; - prevector<28, unsigned char> t1; - t0.resize(28); - t1.resize(29); - } - } -} - -static void PrevectorClear(benchmark::State& state) -{ - - while (state.KeepRunning()) { - for (auto x = 0; x < 1000; ++x) { - prevector<28, unsigned char> t0; - prevector<28, unsigned char> t1; - t0.resize(28); - t0.clear(); - t1.resize(29); - t0.clear(); - } - } -} - -BENCHMARK(PrevectorDestructor); -BENCHMARK(PrevectorClear); \ No newline at end of file diff --git a/src/compat.h b/src/compat.h index f51f9df965201..57e7dd2d0f6d6 100644 --- a/src/compat.h +++ b/src/compat.h @@ -11,6 +11,16 @@ #include "config/pivx-config.h" #endif +#include + +// GCC 4.8 is missing some C++11 type_traits, +// https://www.gnu.org/software/gcc/gcc-5/changes.html +#if defined(__GNUC__) && __GNUC__ < 5 +#define IS_TRIVIALLY_CONSTRUCTIBLE std::is_trivial +#else +#define IS_TRIVIALLY_CONSTRUCTIBLE std::is_trivially_constructible +#endif + #ifdef WIN32 #ifdef _WIN32_WINNT #undef _WIN32_WINNT From 9675199942679dc7c674fc867d0a03b073336f6a Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sat, 19 Dec 2020 18:51:36 +0100 Subject: [PATCH 79/86] Reduce redundant code of prevector and speed it up >>> based on bitcoin/bitcoin@e46be25f0e19d574157752a5c0b674907a1578e6 (updated with more recent changes) In prevector.h, the code which like item_ptr(size()) apears in the loop. Both item_ptr() and size() judge whether values are held directly or indirectly, but in most cases it is sufficient to make that judgement once outside the loop. This PR adds 2 private function fill() which has the loop to initialize by specified value (or iterator of the other prevector's element), but don't call item_ptr() in their loop. Other functions(assign(), constructor, operator=(), insert()) that has similar loop, call fill() instead of original loop. Also, resize() was changed like fill(), but it calls the default constructor for that element each time. Github-Pull: #2083 Rebased-From: c412d5fa6cc4a91a314d124350b5d1256962f98f --- src/prevector.h | 87 ++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/src/prevector.h b/src/prevector.h index 14aa1ea8c9a29..a02afd37a7f04 100644 --- a/src/prevector.h +++ b/src/prevector.h @@ -194,16 +194,27 @@ class prevector { T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); } const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); } + void fill(T* dst, ptrdiff_t count, const T& value = T{}) { + std::fill_n(dst, count, value); + } + + template + void fill(T* dst, InputIterator first, InputIterator last) { + while (first != last) { + new(static_cast(dst)) T(*first); + ++dst; + ++first; + } + } + public: void assign(size_type n, const T& val) { clear(); if (capacity() < n) { change_capacity(n); } - while (size() < n) { - _size++; - new(static_cast(item_ptr(size() - 1))) T(val); - } + _size += n; + fill(item_ptr(0), n, val); } template @@ -213,11 +224,8 @@ class prevector { if (capacity() < n) { change_capacity(n); } - while (first != last) { - _size++; - new(static_cast(item_ptr(size() - 1))) T(*first); - ++first; - } + _size += n; + fill(item_ptr(0), first, last); } prevector() {} @@ -228,31 +236,23 @@ class prevector { explicit prevector(size_type n, const T& val = T()) { change_capacity(n); - while (size() < n) { - _size++; - new(static_cast(item_ptr(size() - 1))) T(val); - } + _size += n; + fill(item_ptr(0), n, val); } template prevector(InputIterator first, InputIterator last) { size_type n = last - first; change_capacity(n); - while (first != last) { - _size++; - new(static_cast(item_ptr(size() - 1))) T(*first); - ++first; - } + _size += n; + fill(item_ptr(0), first, last); } prevector(const prevector& other) { - change_capacity(other.size()); - const_iterator it = other.begin(); - while (it != other.end()) { - _size++; - new(static_cast(item_ptr(size() - 1))) T(*it); - ++it; - } + size_type n = other.size(); + change_capacity(n); + _size += n; + fill(item_ptr(0), other.begin(), other.end()); } prevector(prevector&& other) { @@ -263,14 +263,7 @@ class prevector { if (&other == this) { return *this; } - resize(0); - change_capacity(other.size()); - const_iterator it = other.begin(); - while (it != other.end()) { - _size++; - new(static_cast(item_ptr(size() - 1))) T(*it); - ++it; - } + assign(other.begin(), other.end()); return *this; } @@ -314,16 +307,20 @@ class prevector { } void resize(size_type new_size) { - if (size() > new_size) { + size_type cur_size = size(); + if (cur_size == new_size) { + return; + } + if (cur_size > new_size) { erase(item_ptr(new_size), end()); + return; } if (new_size > capacity()) { change_capacity(new_size); } - while (size() < new_size) { - _size++; - new(static_cast(item_ptr(size() - 1))) T(); - } + ptrdiff_t increase = new_size - cur_size; + fill(item_ptr(cur_size), increase); + _size += increase; } void reserve(size_type new_capacity) { @@ -346,10 +343,11 @@ class prevector { if (capacity() < new_size) { change_capacity(new_size + (new_size >> 1)); } - memmove(item_ptr(p + 1), item_ptr(p), (size() - p) * sizeof(T)); + T* ptr = item_ptr(p); + memmove(ptr + 1, ptr, (size() - p) * sizeof(T)); _size++; - new(static_cast(item_ptr(p))) T(value); - return iterator(item_ptr(p)); + new(static_cast(ptr)) T(value); + return iterator(ptr); } void insert(iterator pos, size_type count, const T& value) { @@ -358,11 +356,10 @@ class prevector { if (capacity() < new_size) { change_capacity(new_size + (new_size >> 1)); } - memmove(item_ptr(p + count), item_ptr(p), (size() - p) * sizeof(T)); + T* ptr = item_ptr(p); + memmove(ptr + count, ptr, (size() - p) * sizeof(T)); _size += count; - for (size_type i = 0; i < count; i++) { - new(static_cast(item_ptr(p + i))) T(value); - } + fill(item_ptr(p), count, value); } template From 359f0c66ab3a1187357e80b18e29d32f2207a61c Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Tue, 13 Nov 2018 04:15:09 -0500 Subject: [PATCH 80/86] Drop defunct IS_TRIVIALLY_CONSTRUCTIBLE handling from prevector.h It's now only referenced from the bench, so leave it there. This allows us to drop the associated includes as well. Github-Pull: #2083 Rebased-From: 4cb188ecb8b359aac888f1719fae0ece0345a5a7 --- src/bench/prevector.cpp | 12 ++++++++++++ src/compat.h | 10 ---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/bench/prevector.cpp b/src/bench/prevector.cpp index 48d63172b026c..f192fc370ff64 100644 --- a/src/bench/prevector.cpp +++ b/src/bench/prevector.cpp @@ -6,6 +6,18 @@ #include "compat.h" #include "prevector.h" +#include "serialize.h" +#include "streams.h" + +#include + +// GCC 4.8 is missing some C++11 type_traits, +// https://www.gnu.org/software/gcc/gcc-5/changes.html +#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 5 +#define IS_TRIVIALLY_CONSTRUCTIBLE std::has_trivial_default_constructor +#else +#define IS_TRIVIALLY_CONSTRUCTIBLE std::is_trivially_default_constructible +#endif struct nontrivial_t { int x; diff --git a/src/compat.h b/src/compat.h index 57e7dd2d0f6d6..f51f9df965201 100644 --- a/src/compat.h +++ b/src/compat.h @@ -11,16 +11,6 @@ #include "config/pivx-config.h" #endif -#include - -// GCC 4.8 is missing some C++11 type_traits, -// https://www.gnu.org/software/gcc/gcc-5/changes.html -#if defined(__GNUC__) && __GNUC__ < 5 -#define IS_TRIVIALLY_CONSTRUCTIBLE std::is_trivial -#else -#define IS_TRIVIALLY_CONSTRUCTIBLE std::is_trivially_constructible -#endif - #ifdef WIN32 #ifdef _WIN32_WINNT #undef _WIN32_WINNT From 1555406fc201d01180d57626b97eaf6d9fba45b7 Mon Sep 17 00:00:00 2001 From: Lenny Maiorani Date: Sat, 3 Nov 2018 21:15:05 -0600 Subject: [PATCH 81/86] warnings: Compiler warning on memset usage for non-trivial type Problem: - IS_TRIVIALLY_CONSTRUCTIBLE macro does not work correctly resulting in `memset()` usage to set a non-trivial type to 0 when `nontrivial_t` is passed in from the tests. - Warning reported by GCC when compiling with `--enable-werror`. Solution: - Use the standard algorithm `std::fill_n()` and let the compiler determine the optimal way of looping or using `memset()`. Github-Pull: #2083 Rebased-From: d856989513cafc9bb2292cbffc3a109c530de7de --- src/prevector.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/prevector.h b/src/prevector.h index a02afd37a7f04..f3294870b46fe 100644 --- a/src/prevector.h +++ b/src/prevector.h @@ -10,6 +10,8 @@ #include #include +#include +#include #include #include From 20bd97a101e6c82585abb47138323734080737f9 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Fri, 18 Dec 2020 11:46:02 +0100 Subject: [PATCH 82/86] GUI: ccontrol: remove column checkbox extra whitespace in tree mode Github-Pull: #2070 Rebased-From: fe4f5562c8a5409013e7ad098736a834b8ed7e92 --- src/qt/coincontroldialog.cpp | 9 ++++++++- src/qt/coincontroldialog.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index 2e2022c5a1766..1eefd9b2580a4 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -165,7 +165,7 @@ CoinControlDialog::CoinControlDialog(QWidget* parent, bool _forDelegation) : QDi // Toggle lock state connect(ui->pushButtonToggleLock, &QPushButton::clicked, this, &CoinControlDialog::buttonToggleLockClicked); - ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, 100); + ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, colCheckBoxWidth_treeMode); ui->treeWidget->setColumnWidth(COLUMN_AMOUNT, 110); ui->treeWidget->setColumnWidth(COLUMN_LABEL, 160); ui->treeWidget->setColumnWidth(COLUMN_ADDRESS, 310); @@ -795,6 +795,13 @@ void CoinControlDialog::updateView() for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) if (ui->treeWidget->topLevelItem(i)->checkState(COLUMN_CHECKBOX) == Qt::PartiallyChecked) ui->treeWidget->topLevelItem(i)->setExpanded(true); + // restore saved width for COLUMN_CHECKBOX + ui->treeWidget->setColumnWidth(COLUMN_CHECKBOX, colCheckBoxWidth_treeMode); + } else { + // save COLUMN_CHECKBOX width for tree-mode + colCheckBoxWidth_treeMode = std::max(110, ui->treeWidget->columnWidth(COLUMN_CHECKBOX)); + // minimize COLUMN_CHECKBOX width in list-mode (need to display only the check box) + ui->treeWidget->resizeColumnToContents(COLUMN_CHECKBOX); } // sort view diff --git a/src/qt/coincontroldialog.h b/src/qt/coincontroldialog.h index 041553261b2ab..9d95f3a287839 100644 --- a/src/qt/coincontroldialog.h +++ b/src/qt/coincontroldialog.h @@ -64,6 +64,7 @@ class CoinControlDialog : public QDialog int sortColumn; Qt::SortOrder sortOrder; bool forDelegation; + int colCheckBoxWidth_treeMode{110}; // pair (recipient amount, ishielded recipient) std::vector> payAmounts{}; unsigned int nSelectableInputs{0}; From 0cb01c935bd8ccedbeeb509163abfbd12d55ce5f Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 18 Dec 2020 11:26:14 -0300 Subject: [PATCH 83/86] GUI: settings information, fix missing initial masternodes count value. The count isn't updated on every widget show, only via the event. Github-Pull: #2075 Rebased-From: 164d6aa7ce3946e34f00d8993da81a3e6cd81953 --- src/qt/clientmodel.cpp | 19 +++++++++++------ src/qt/clientmodel.h | 3 +++ .../settings/settingsinformationwidget.cpp | 21 ++++++++++++++++++- .../pivx/settings/settingsinformationwidget.h | 7 +++++-- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index 6756008e4a222..699a004ed5f65 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -83,6 +83,17 @@ QString ClientModel::getMasternodeCountString() const return tr("Total: %1 (IPv4: %2 / IPv6: %3 / Tor: %4 / Unknown: %5)").arg(QString::number(total)).arg(QString::number((int)ipv4)).arg(QString::number((int)ipv6)).arg(QString::number((int)onion)).arg(QString::number((int)nUnknown)); } +QString ClientModel::getMasternodesCount() +{ + if (!cachedMasternodeCountString.isEmpty()) { + return cachedMasternodeCountString; + } + + // Force an update + cachedMasternodeCountString = getMasternodeCountString(); + return cachedMasternodeCountString; +} + int ClientModel::getNumBlocks() { if (!cacheTip) { @@ -139,12 +150,8 @@ void ClientModel::updateTimer() void ClientModel::updateMnTimer() { - // Get required lock upfront. This avoids the GUI from getting stuck on - // periodical polls if the core is holding the locks for a longer time - - // for example, during a wallet rescan. - TRY_LOCK(cs_main, lockMain); - if (!lockMain) - return; + // Following method is locking the mnmanager mutex for now, + // future: move to an event based update. QString newMasternodeCountString = getMasternodeCountString(); if (cachedMasternodeCountString != newMasternodeCountString) { diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h index 9940aeb406052..cc495f65b6cef 100644 --- a/src/qt/clientmodel.h +++ b/src/qt/clientmodel.h @@ -89,6 +89,9 @@ class ClientModel : public QObject // Start/Stop the masternode polling timer void startMasternodesTimer(); void stopMasternodesTimer(); + // Force a MN count update calling mnmanager directly locking its internal mutex. + // Future todo: implement an event based update and remove the lock requirement. + QString getMasternodesCount(); private: QString getMasternodeCountString() const; diff --git a/src/qt/pivx/settings/settingsinformationwidget.cpp b/src/qt/pivx/settings/settingsinformationwidget.cpp index 458d0441412c1..af536782402e7 100644 --- a/src/qt/pivx/settings/settingsinformationwidget.cpp +++ b/src/qt/pivx/settings/settingsinformationwidget.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2019-2020 The PIVX developers // Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// file COPYING or https://www.opensource.org/licenses/mit-license.php. #include "qt/pivx/settings/settingsinformationwidget.h" #include "qt/pivx/settings/forms/ui_settingsinformationwidget.h" @@ -14,6 +14,8 @@ #include +#define REQUEST_UPDATE_MN_COUNT 0 + SettingsInformationWidget::SettingsInformationWidget(PIVXGUI* _window,QWidget *parent) : PWidget(_window,parent), ui(new Ui::SettingsInformationWidget) @@ -165,6 +167,8 @@ void SettingsInformationWidget::showEvent(QShowEvent *event) QWidget::showEvent(event); if (clientModel) { clientModel->startMasternodesTimer(); + // Initial masternodes count value, running in a worker thread to not lock mnmanager mutex in the main thread. + execute(REQUEST_UPDATE_MN_COUNT); } } @@ -175,6 +179,21 @@ void SettingsInformationWidget::hideEvent(QHideEvent *event) { } } +void SettingsInformationWidget::run(int type) +{ + if (type == REQUEST_UPDATE_MN_COUNT) { + QMetaObject::invokeMethod(this, "setMasternodeCount", + Qt::QueuedConnection, Q_ARG(QString, clientModel->getMasternodesCount())); + } +} + +void SettingsInformationWidget::onError(QString error, int type) +{ + if (type == REQUEST_UPDATE_MN_COUNT) { + setMasternodeCount(tr("No available data")); + } +} + SettingsInformationWidget::~SettingsInformationWidget() { delete ui; diff --git a/src/qt/pivx/settings/settingsinformationwidget.h b/src/qt/pivx/settings/settingsinformationwidget.h index 5e071b9bdea4c..c29caf8aed139 100644 --- a/src/qt/pivx/settings/settingsinformationwidget.h +++ b/src/qt/pivx/settings/settingsinformationwidget.h @@ -19,19 +19,22 @@ class SettingsInformationWidget : public PWidget public: explicit SettingsInformationWidget(PIVXGUI* _window, QWidget *parent = nullptr); - ~SettingsInformationWidget(); + ~SettingsInformationWidget() override; void loadClientModel() override; + void run(int type) override; + void onError(QString error, int type) override; + private Q_SLOTS: void setNumConnections(int count); void setNumBlocks(int count); - void setMasternodeCount(const QString& strMasternodes); void showEvent(QShowEvent* event) override; void hideEvent(QHideEvent* event) override; public Q_SLOTS: void openNetworkMonitor(); + void setMasternodeCount(const QString& strMasternodes); private: Ui::SettingsInformationWidget *ui; From 19f5eaed698e770673622723cd426e8db95ff37c Mon Sep 17 00:00:00 2001 From: Fuzzbawls Date: Sat, 19 Dec 2020 18:06:52 -0800 Subject: [PATCH 84/86] [RPC] Use "shield" nomenclature instead of "shielded" Drop the "ed" suffix in the RPC scope, changes commands like `getnewshieldedaddress` to `getnewshieldaddress`. Also in blockchain informational calls; `shielded_pool_value` and `shieldedsupply` become `shield_pool_value` and `shieldsupply` respectively. Github-Pull: #2086 Rebased-From: b38077a0be1c43df869dc221a16f205c62605742 --- src/rpc/blockchain.cpp | 18 +- src/rpc/client.cpp | 26 +-- src/rpc/misc.cpp | 4 +- src/sapling/saplingscriptpubkeyman.cpp | 4 +- src/test/librust/sapling_rpc_wallet_tests.cpp | 106 ++++----- src/wallet/rpcwallet.cpp | 210 +++++++++--------- test/functional/mining_pos_coldStaking.py | 8 +- test/functional/sapling_changeaddresses.py | 16 +- test/functional/sapling_fillblock.py | 4 +- test/functional/sapling_key_import_export.py | 18 +- test/functional/sapling_malleable_sigs.py | 4 +- test/functional/sapling_mempool.py | 16 +- test/functional/sapling_supply.py | 26 +-- test/functional/sapling_wallet.py | 104 ++++----- test/functional/sapling_wallet_anchorfork.py | 12 +- .../functional/sapling_wallet_listreceived.py | 28 +-- test/functional/sapling_wallet_nullifiers.py | 72 +++--- test/functional/sapling_wallet_persistence.py | 6 +- 18 files changed, 341 insertions(+), 341 deletions(-) diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index a04851aaa35d8..697779071bca1 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -106,8 +106,8 @@ UniValue blockheaderToJSON(const CBlockIndex* blockindex) result.pushKV("difficulty", GetDifficulty(blockindex)); result.pushKV("chainwork", blockindex->nChainWork.GetHex()); result.pushKV("acc_checkpoint", blockindex->nAccumulatorCheckpoint.GetHex()); - // Sapling shielded pool value - result.pushKV("shielded_pool_value", ValuePoolDesc(blockindex->nChainSaplingValue, blockindex->nSaplingValue)); + // Sapling shield pool value + result.pushKV("shield_pool_value", ValuePoolDesc(blockindex->nChainSaplingValue, blockindex->nSaplingValue)); if (blockindex->pprev) result.pushKV("previousblockhash", blockindex->pprev->GetBlockHash().GetHex()); CBlockIndex *pnext = chainActive.Next(blockindex); @@ -594,7 +594,7 @@ UniValue getblockheader(const JSONRPCRequest& request) " \"mediantime\" : ttt, (numeric) The median block time in seconds since epoch (Jan 1 1970 GMT)\n" " \"nonce\" : n, (numeric) The nonce\n" " \"bits\" : \"1d00ffff\", (string) The bits\n" - " \"shielded_pool_value\": (object) Block shielded pool value\n" + " \"shield_pool_value\": (object) Block shield pool value\n" " {\n" " \"chainValue\": (numeric) Total value held by the Sapling circuit up to and including this block\n" " \"valueDelta\": (numeric) Change in value held by the Sapling circuit over this block\n" @@ -650,8 +650,8 @@ UniValue getsupplyinfo(const JSONRPCRequest& request) "{\n" " \"updateheight\" : n, (numeric) The chain height when the transparent supply was updated\n" " \"transparentsupply\" : n (numeric) The sum of all spendable transaction outputs at height updateheight\n" - " \"shieldedsupply\": n (numeric) Chain tip shielded pool value\n" - " \"totalsupply\": n (numeric) The sum of transparentsupply and shieldedsupply\n" + " \"shieldsupply\": n (numeric) Chain tip shield pool value\n" + " \"totalsupply\": n (numeric) The sum of transparentsupply and shieldsupply\n" "}\n" "\nExamples:\n" + @@ -670,7 +670,7 @@ UniValue getsupplyinfo(const JSONRPCRequest& request) ret.pushKV("updateheight", MoneySupply.GetCacheHeight()); ret.pushKV("transparentsupply", ValueFromAmount(tSupply)); Optional shieldedPoolValue = WITH_LOCK(cs_main, return (chainActive.Tip() ? chainActive.Tip()->nChainSaplingValue : nullopt); ); - ret.pushKV("shieldedsupply", ValuePoolDesc(shieldedPoolValue, nullopt)["chainValue"]); + ret.pushKV("shieldsupply", ValuePoolDesc(shieldedPoolValue, nullopt)["chainValue"]); const CAmount totalSupply = tSupply + (shieldedPoolValue ? *shieldedPoolValue : 0); ret.pushKV("totalsupply", ValueFromAmount(totalSupply)); @@ -980,7 +980,7 @@ UniValue getblockchaininfo(const JSONRPCRequest& request) " \"difficulty\": xxxxxx, (numeric) the current difficulty\n" " \"verificationprogress\": xxxx, (numeric) estimate of verification progress [0..1]\n" " \"chainwork\": \"xxxx\" (string) total amount of work in active chain, in hexadecimal\n" - " \"shielded_pool_value\": (object) Chain tip shielded pool value\n" + " \"shield_pool_value\": (object) Chain tip shield pool value\n" " \"initial_block_downloading\" (boolean) whether the node is in initial block downloading state or not" " {\n" " \"chainValue\": (numeric) Total value held by the Sapling circuit up to and including the chain tip\n" @@ -1020,8 +1020,8 @@ UniValue getblockchaininfo(const JSONRPCRequest& request) obj.pushKV("difficulty", (double)GetDifficulty()); obj.pushKV("verificationprogress", Checkpoints::GuessVerificationProgress(pChainTip)); obj.pushKV("chainwork", pChainTip ? pChainTip->nChainWork.GetHex() : ""); - // Sapling shielded pool value - obj.pushKV("shielded_pool_value", ValuePoolDesc(pChainTip->nChainSaplingValue, pChainTip->nSaplingValue)); + // Sapling shield pool value + obj.pushKV("shield_pool_value", ValuePoolDesc(pChainTip->nChainSaplingValue, pChainTip->nSaplingValue)); obj.pushKV("initial_block_downloading", IsInitialBlockDownload()); UniValue softforks(UniValue::VARR); softforks.push_back(SoftForkDesc("bip65", 5, pChainTip)); diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp index 69862e3ff33fe..e74732d70bb22 100644 --- a/src/rpc/client.cpp +++ b/src/rpc/client.cpp @@ -39,7 +39,7 @@ static const CRPCConvertParam vRPCConvertParams[] = { { "sendtoaddress", 1 }, { "settxfee", 0 }, { "getreceivedbyaddress", 1 }, - { "listreceivedbyshieldedaddress", 1 }, + { "listreceivedbyshieldaddress", 1 }, { "getreceivedbylabel", 1 }, { "listcoldutxos", 0 }, { "listdelegators", 0 }, @@ -54,14 +54,14 @@ static const CRPCConvertParam vRPCConvertParams[] = { { "getbalance", 2 }, { "getbalance", 3 }, { "getbalance", 4 }, - { "getshieldedbalance", 1 }, - { "getshieldedbalance", 2 }, - { "rawshieldedsendmany", 1 }, - { "rawshieldedsendmany", 2 }, - { "rawshieldedsendmany", 3 }, - { "shieldedsendmany", 1 }, - { "shieldedsendmany", 2 }, - { "shieldedsendmany", 3 }, + { "getshieldbalance", 1 }, + { "getshieldbalance", 2 }, + { "rawshieldsendmany", 1 }, + { "rawshieldsendmany", 2 }, + { "rawshieldsendmany", 3 }, + { "shieldsendmany", 1 }, + { "shieldsendmany", 2 }, + { "shieldsendmany", 3 }, { "getblockhash", 0 }, { "waitforblockheight", 0 }, { "waitforblockheight", 1 }, @@ -89,10 +89,10 @@ static const CRPCConvertParam vRPCConvertParams[] = { { "listunspent", 1 }, { "listunspent", 2 }, { "listunspent", 3 }, - { "listshieldedunspent", 0 }, - { "listshieldedunspent", 1 }, - { "listshieldedunspent", 2 }, - { "listshieldedunspent", 3 }, + { "listshieldunspent", 0 }, + { "listshieldunspent", 1 }, + { "listshieldunspent", 2 }, + { "listshieldunspent", 3 }, { "logging", 0 }, { "logging", 1 }, { "getblock", 1 }, diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index 9f9eddf51f3a7..44c768dc7afe0 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -71,7 +71,7 @@ UniValue getinfo(const JSONRPCRequest& request) " \"transparentsupply\" : n (numeric) The sum of the value of all unspent outputs when the chainstate was\n" " last flushed to disk (use getsupplyinfo to know the update-height, or\n" " to trigger the money supply update/recalculation)" - " \"shieldedsupply\": n (numeric) Chain tip shielded pool value\n" + " \"shieldsupply\": n (numeric) Chain tip shield pool value\n" " \"keypoololdest\": xxxxxx, (numeric) the timestamp (seconds since GMT epoch) of the oldest pre-generated key in the key pool\n" " \"keypoolsize\": xxxx, (numeric) how many new keys are pre-generated\n" " \"unlocked_until\": ttt, (numeric) the timestamp in seconds since epoch (midnight Jan 1 1970 GMT) that the wallet is unlocked for transfers, or 0 if the wallet is locked\n" @@ -133,7 +133,7 @@ UniValue getinfo(const JSONRPCRequest& request) UniValue supply_info = getsupplyinfo(JSONRPCRequest()); obj.pushKV("moneysupply", supply_info["totalsupply"]); obj.pushKV("transparentsupply", supply_info["transparentsupply"]); - obj.pushKV("shieldedsupply", supply_info["shieldedsupply"]); + obj.pushKV("shieldsupply", supply_info["shieldsupply"]); #ifdef ENABLE_WALLET if (pwalletMain) { diff --git a/src/sapling/saplingscriptpubkeyman.cpp b/src/sapling/saplingscriptpubkeyman.cpp index 6498affc4e3d2..8053cecff0ec5 100644 --- a/src/sapling/saplingscriptpubkeyman.cpp +++ b/src/sapling/saplingscriptpubkeyman.cpp @@ -634,7 +634,7 @@ OptionalvShieldedSpend) { @@ -762,7 +762,7 @@ bool SaplingScriptPubKeyMan::IsNoteSaplingChange(const std::setmapWallet[op.hash]; if (tx.sapData) { diff --git a/src/test/librust/sapling_rpc_wallet_tests.cpp b/src/test/librust/sapling_rpc_wallet_tests.cpp index d87203dd35de5..b173ffa372d0e 100644 --- a/src/test/librust/sapling_rpc_wallet_tests.cpp +++ b/src/test/librust/sapling_rpc_wallet_tests.cpp @@ -89,24 +89,24 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_getbalance) LOCK2(cs_main, pwalletMain->cs_wallet); - BOOST_CHECK_THROW(CallRPC("getshieldedbalance too many args"), std::runtime_error); - BOOST_CHECK_THROW(CallRPC("getshieldedbalance invalidaddress"), std::runtime_error); - BOOST_CHECK_THROW(CallRPC("getshieldedbalance tmC6YZnCUhm19dEXxh3Jb7srdBJxDawaCab"), std::runtime_error); - BOOST_CHECK_NO_THROW(CallRPC("getshieldedbalance ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh")); - BOOST_CHECK_THROW(CallRPC("getshieldedbalance ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh -1"), std::runtime_error); - BOOST_CHECK_NO_THROW(CallRPC("getshieldedbalance ptestsapling1nrn6exksuqtpld9gu6fwdz4hwg54h2x37gutdds89pfyg6mtjf63km45a8eare5qla45cj75vs8 0")); - BOOST_CHECK_THROW(CallRPC("getshieldedbalance tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), std::runtime_error); - BOOST_CHECK_NO_THROW(CallRPC("getshieldedbalance *")); - BOOST_CHECK_NO_THROW(CallRPC("getshieldedbalance * 6")); - BOOST_CHECK_THROW(CallRPC("getshieldedbalance * -1"), std::runtime_error); - - BOOST_CHECK_THROW(CallRPC("listreceivedbyshieldedaddress too many args"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("getshieldbalance too many args"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("getshieldbalance invalidaddress"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("getshieldbalance tmC6YZnCUhm19dEXxh3Jb7srdBJxDawaCab"), std::runtime_error); + BOOST_CHECK_NO_THROW(CallRPC("getshieldbalance ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh")); + BOOST_CHECK_THROW(CallRPC("getshieldbalance ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh -1"), std::runtime_error); + BOOST_CHECK_NO_THROW(CallRPC("getshieldbalance ptestsapling1nrn6exksuqtpld9gu6fwdz4hwg54h2x37gutdds89pfyg6mtjf63km45a8eare5qla45cj75vs8 0")); + BOOST_CHECK_THROW(CallRPC("getshieldbalance tnRZ8bPq2pff3xBWhTJhNkVUkm2uhzksDeW5PvEa7aFKGT9Qi3YgTALZfjaY4jU3HLVKBtHdSXxoPoLA3naMPcHBcY88FcF 1"), std::runtime_error); + BOOST_CHECK_NO_THROW(CallRPC("getshieldbalance *")); + BOOST_CHECK_NO_THROW(CallRPC("getshieldbalance * 6")); + BOOST_CHECK_THROW(CallRPC("getshieldbalance * -1"), std::runtime_error); + + BOOST_CHECK_THROW(CallRPC("listreceivedbyshieldaddress too many args"), std::runtime_error); // negative minconf not allowed - BOOST_CHECK_THROW(CallRPC("listreceivedbyshieldedaddress yBYhwgzufrZ6F5VVuK9nEChENArq934mqC -1"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listreceivedbyshieldaddress yBYhwgzufrZ6F5VVuK9nEChENArq934mqC -1"), std::runtime_error); // invalid zaddr, taddr not allowed - BOOST_CHECK_THROW(CallRPC("listreceivedbyshieldedaddress yBYhwgzufrZ6F5VVuK9nEChENArq934mqC 0"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listreceivedbyshieldaddress yBYhwgzufrZ6F5VVuK9nEChENArq934mqC 0"), std::runtime_error); // don't have the spending key - BOOST_CHECK_THROW(CallRPC("listreceivedbyshieldedaddress ptestsapling1nrn6exksuqtpld9gu6fwdz4hwg54h2x37gutdds89pfyg6mtjf63km45a8eare5qla45cj75vs8 1"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listreceivedbyshieldaddress ptestsapling1nrn6exksuqtpld9gu6fwdz4hwg54h2x37gutdds89pfyg6mtjf63km45a8eare5qla45cj75vs8 1"), std::runtime_error); } BOOST_AUTO_TEST_CASE(rpc_wallet_sapling_importkey_paymentaddress) { @@ -183,7 +183,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_sapling_importexport) } // Verify we can list the keys imported - BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldedaddresses")); + BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldaddresses")); UniValue arr = retValue.get_array(); BOOST_CHECK((int) arr.size() == n1); @@ -205,7 +205,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_sapling_importexport) BOOST_CHECK((int) saplingAddrs.size() == numAddrs); // Ask wallet to list addresses - BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldedaddresses")); + BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldaddresses")); arr = retValue.get_array(); BOOST_CHECK((int) arr.size() == numAddrs); @@ -230,7 +230,7 @@ void CheckHaveAddr(const libzcash::PaymentAddress& addr) { BOOST_CHECK(pwalletMain->HaveSpendingKeyForPaymentAddress(*addr_of_type)); } -BOOST_AUTO_TEST_CASE(rpc_wallet_getnewshieldedaddress) { +BOOST_AUTO_TEST_CASE(rpc_wallet_getnewshieldaddress) { UniValue addr; { LOCK(pwalletMain->cs_wallet); @@ -239,57 +239,57 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_getnewshieldedaddress) { } // No parameter defaults to sapling address - addr = CallRPC("getnewshieldedaddress"); + addr = CallRPC("getnewshieldaddress"); CheckHaveAddr(KeyIO::DecodePaymentAddress(addr.get_str())); // Too many arguments will throw with the help - BOOST_CHECK_THROW(CallRPC("getnewshieldedaddress many args"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("getnewshieldaddress many args"), std::runtime_error); } -BOOST_AUTO_TEST_CASE(rpc_shieldedsendmany_parameters) +BOOST_AUTO_TEST_CASE(rpc_shieldsendmany_parameters) { SelectParams(CBaseChainParams::TESTNET); LOCK2(cs_main, pwalletMain->cs_wallet); - BOOST_CHECK_THROW(CallRPC("shieldedsendmany"), std::runtime_error); - BOOST_CHECK_THROW(CallRPC("shieldedsendmany toofewargs"), std::runtime_error); - BOOST_CHECK_THROW(CallRPC("shieldedsendmany just too many args here"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("shieldsendmany"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("shieldsendmany toofewargs"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("shieldsendmany just too many args here"), std::runtime_error); // bad from address - BOOST_CHECK_THROW(CallRPC("shieldedsendmany " + BOOST_CHECK_THROW(CallRPC("shieldsendmany " "INVALIDyBYhwgzufrZ6F5VVuK9nEChENArq934mqC []"), std::runtime_error); // empty amounts - BOOST_CHECK_THROW(CallRPC("shieldedsendmany " + BOOST_CHECK_THROW(CallRPC("shieldsendmany " "yBYhwgzufrZ6F5VVuK9nEChENArq934mqC []"), std::runtime_error); // don't have the spending key for this address - BOOST_CHECK_THROW(CallRPC("shieldedsendmany " + BOOST_CHECK_THROW(CallRPC("shieldsendmany " "ptestsapling1wpurflqllgkcs48m46yu9ktlfe3ahndely20dpaanqq3lw9l5xw7yfehst68yclvlpz7x8cltxe" "UkJ1oSfbhTJhm72WiZizvkZz5aH1 []"), std::runtime_error); // duplicate address - BOOST_CHECK_THROW(CallRPC("shieldedsendmany " + BOOST_CHECK_THROW(CallRPC("shieldsendmany " "yBYhwgzufrZ6F5VVuK9nEChENArq934mqC " "[{\"address\":\"yAJ4bGeDFcEtx24kbr413fBLpWQcdR5F2z\", \"amount\":50.0}," " {\"address\":\"yAJ4bGeDFcEtx24kbr413fBLpWQcdR5F2z\", \"amount\":12.0} ]" ), std::runtime_error); // invalid fee amount, cannot be negative - BOOST_CHECK_THROW(CallRPC("shieldedsendmany " + BOOST_CHECK_THROW(CallRPC("shieldsendmany " "yBYhwgzufrZ6F5VVuK9nEChENArq934mqC " "[{\"address\":\"yAJ4bGeDFcEtx24kbr413fBLpWQcdR5F2z\", \"amount\":50.0}] " "1 -0.0001" ), std::runtime_error); // invalid fee amount, bigger than MAX_MONEY - BOOST_CHECK_THROW(CallRPC("shieldedsendmany " + BOOST_CHECK_THROW(CallRPC("shieldsendmany " "yBYhwgzufrZ6F5VVuK9nEChENArq934mqC " "[{\"address\":\"yAJ4bGeDFcEtx24kbr413fBLpWQcdR5F2z\", \"amount\":50.0}] " "1 21000001" ), std::runtime_error); // fee amount is bigger than sum of outputs - BOOST_CHECK_THROW(CallRPC("shieldedsendmany " + BOOST_CHECK_THROW(CallRPC("shieldsendmany " "yBYhwgzufrZ6F5VVuK9nEChENArq934mqC " "[{\"address\":\"yAJ4bGeDFcEtx24kbr413fBLpWQcdR5F2z\", \"amount\":50.0}] " "1 50.00000001" @@ -302,7 +302,7 @@ BOOST_AUTO_TEST_CASE(rpc_shieldedsendmany_parameters) pwalletMain->SetupSPKM(false); auto pa = pwalletMain->GenerateNewSaplingZKey(); std::string zaddr1 = KeyIO::EncodePaymentAddress(pa); - BOOST_CHECK_THROW(CallRPC(std::string("shieldedsendmany yBYhwgzufrZ6F5VVuK9nEChENArq934mqC ") + BOOST_CHECK_THROW(CallRPC(std::string("shieldsendmany yBYhwgzufrZ6F5VVuK9nEChENArq934mqC ") + "[{\"address\":\"" + zaddr1 + "\", \"amount\":123.456}]"), std::runtime_error); } @@ -385,7 +385,7 @@ BOOST_AUTO_TEST_CASE(saplingOperationTests) { } -BOOST_AUTO_TEST_CASE(rpc_shieldedsendmany_taddr_to_sapling) +BOOST_AUTO_TEST_CASE(rpc_shieldsendmany_taddr_to_sapling) { SelectParams(CBaseChainParams::REGTEST); RegtestActivateSapling(); @@ -427,7 +427,7 @@ BOOST_AUTO_TEST_CASE(rpc_shieldedsendmany_taddr_to_sapling) wtx.SetMerkleBranch(blockHash, 0); pwalletMain->LoadToWallet(wtx); - // Context that shieldedsendmany requires + // Context that shieldsendmany requires auto builder = TransactionBuilder(consensusParams, nextBlockHeight, pwalletMain); std::vector recipients = { SendManyRecipient(zaddr1, 1 * COIN, "ABCD") }; @@ -494,11 +494,11 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_encrypted_wallet_sapzkeys) // create keys for (int i = 0; i < n; i++) { - CallRPC("getnewshieldedaddress"); + CallRPC("getnewshieldaddress"); } // Verify we can list the keys imported - BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldedaddresses")); + BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldaddresses")); UniValue arr = retValue.get_array(); BOOST_CHECK((int) arr.size() == n); @@ -515,22 +515,22 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_encrypted_wallet_sapzkeys) BOOST_CHECK(pwalletMain->EncryptWallet(strWalletPass)); // Verify we can still list the keys imported - BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldedaddresses")); + BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldaddresses")); arr = retValue.get_array(); BOOST_CHECK((int) arr.size() == n); // Try to add a new key, but we can't as the wallet is locked - BOOST_CHECK_THROW(CallRPC("getnewshieldedaddress"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("getnewshieldaddress"), std::runtime_error); // We can't call RPC walletpassphrase as that invokes RPCRunLater which breaks tests. // So we manually unlock. BOOST_CHECK(pwalletMain->Unlock(strWalletPass)); // Now add a key - BOOST_CHECK_NO_THROW(CallRPC("getnewshieldedaddress")); + BOOST_CHECK_NO_THROW(CallRPC("getnewshieldaddress")); // Verify the key has been added - BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldedaddresses")); + BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldaddresses")); arr = retValue.get_array(); BOOST_CHECK((int) arr.size() == n+1); @@ -538,7 +538,7 @@ BOOST_AUTO_TEST_CASE(rpc_wallet_encrypted_wallet_sapzkeys) // but there are tests for this in gtest. } -BOOST_AUTO_TEST_CASE(rpc_listshieldedunspent_parameters) +BOOST_AUTO_TEST_CASE(rpc_listshieldunspent_parameters) { SelectParams(CBaseChainParams::TESTNET); @@ -548,43 +548,43 @@ BOOST_AUTO_TEST_CASE(rpc_listshieldedunspent_parameters) UniValue retValue; // too many args - BOOST_CHECK_THROW(CallRPC("listshieldedunspent 1 2 3 4 5"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent 1 2 3 4 5"), std::runtime_error); // minconf must be >= 0 - BOOST_CHECK_THROW(CallRPC("listshieldedunspent -1"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent -1"), std::runtime_error); // maxconf must be > minconf - BOOST_CHECK_THROW(CallRPC("listshieldedunspent 2 1"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent 2 1"), std::runtime_error); // maxconf must not be out of range - BOOST_CHECK_THROW(CallRPC("listshieldedunspent 1 9999999999"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent 1 9999999999"), std::runtime_error); // must be an array of addresses - BOOST_CHECK_THROW(CallRPC("listshieldedunspent 1 999 false ptestsapling1wpurflqllgkcs48m46yu9ktlfe3ahndely20dpaanqq3lw9l5xw7yfehst68yclvlpz7x8cltxe"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent 1 999 false ptestsapling1wpurflqllgkcs48m46yu9ktlfe3ahndely20dpaanqq3lw9l5xw7yfehst68yclvlpz7x8cltxe"), std::runtime_error); // address must be string - BOOST_CHECK_THROW(CallRPC("listshieldedunspent 1 999 false [123456]"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent 1 999 false [123456]"), std::runtime_error); // no spending key - BOOST_CHECK_THROW(CallRPC("listshieldedunspent 1 999 false [\"ptestsapling1wpurflqllgkcs48m46yu9ktlfe3ahndely20dpaanqq3lw9l5xw7yfehst68yclvlpz7x8cltxe\"]"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent 1 999 false [\"ptestsapling1wpurflqllgkcs48m46yu9ktlfe3ahndely20dpaanqq3lw9l5xw7yfehst68yclvlpz7x8cltxe\"]"), std::runtime_error); // allow watch only - BOOST_CHECK_NO_THROW(CallRPC("listshieldedunspent 1 999 true [\"ptestsapling1wpurflqllgkcs48m46yu9ktlfe3ahndely20dpaanqq3lw9l5xw7yfehst68yclvlpz7x8cltxe\"]")); + BOOST_CHECK_NO_THROW(CallRPC("listshieldunspent 1 999 true [\"ptestsapling1wpurflqllgkcs48m46yu9ktlfe3ahndely20dpaanqq3lw9l5xw7yfehst68yclvlpz7x8cltxe\"]")); // wrong network, mainnet instead of testnet - BOOST_CHECK_THROW(CallRPC("listshieldedunspent 1 999 true [\"ps1qenk9kapr0crx7lmdl4yclx78spc36wh7d5hm9hglp85f43k9dupyf0c5836h42wq2ejv0ef2v3\"]"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent 1 999 true [\"ps1qenk9kapr0crx7lmdl4yclx78spc36wh7d5hm9hglp85f43k9dupyf0c5836h42wq2ejv0ef2v3\"]"), std::runtime_error); // create shielded address so we have the spending key - BOOST_CHECK_NO_THROW(retValue = CallRPC("getnewshieldedaddress")); + BOOST_CHECK_NO_THROW(retValue = CallRPC("getnewshieldaddress")); std::string myzaddr = retValue.get_str(); // return empty array for this address - BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldedunspent 1 999 false [\"" + myzaddr + "\"]")); + BOOST_CHECK_NO_THROW(retValue = CallRPC("listshieldunspent 1 999 false [\"" + myzaddr + "\"]")); UniValue arr = retValue.get_array(); BOOST_CHECK_EQUAL(0, arr.size()); // duplicate address error - BOOST_CHECK_THROW(CallRPC("listshieldedunspent 1 999 false [\"" + myzaddr + "\", \"" + myzaddr + "\"]"), std::runtime_error); + BOOST_CHECK_THROW(CallRPC("listshieldunspent 1 999 false [\"" + myzaddr + "\", \"" + myzaddr + "\"]"), std::runtime_error); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1083904f7cc48..2d06d3131c972 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -501,18 +501,18 @@ UniValue getnewstakingaddress(const JSONRPCRequest& request) return EncodeDestination(GetNewAddressFromLabel("coldstaking", request.params, CChainParams::STAKING_ADDRESS), CChainParams::STAKING_ADDRESS); } -UniValue getnewshieldedaddress(const JSONRPCRequest& request) +UniValue getnewshieldaddress(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() > 1) throw std::runtime_error( - "getnewshieldedaddress\n" - "\nReturns a new shielded address for receiving payments.\n" + "getnewshieldaddress\n" + "\nReturns a new shield address for receiving payments.\n" "\nArguments:\n" "\nResult:\n" - "\"address\" (string) The new shielded address.\n" + "\"address\" (string) The new shield address.\n" "\nExamples:\n" - + HelpExampleCli("getnewshieldedaddress", "") - + HelpExampleRpc("getnewshieldedaddress", "") + + HelpExampleCli("getnewshieldaddress", "") + + HelpExampleRpc("getnewshieldaddress", "") ); EnsureWallet(); @@ -524,21 +524,21 @@ UniValue getnewshieldedaddress(const JSONRPCRequest& request) return KeyIO::EncodePaymentAddress(pwalletMain->GenerateNewSaplingZKey()); } -UniValue listshieldedunspent(const JSONRPCRequest& request) +UniValue listshieldunspent(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() > 4) throw std::runtime_error( - "listshieldedunspent ( minconf maxconf includeWatchonly [\"shield_addr\",...] )\n" - "\nReturns array of unspent shielded notes with between minconf and maxconf (inclusive) confirmations.\n" + "listshieldunspent ( minconf maxconf includeWatchonly [\"shield_addr\",...] )\n" + "\nReturns array of unspent shield notes with between minconf and maxconf (inclusive) confirmations.\n" "Optionally filter to only include notes sent to specified addresses.\n" "When minconf is 0, unspent notes with zero confirmations are returned, even though they are not immediately spendable.\n" "\nArguments:\n" "1. minconf (numeric, optional, default=1) The minimum confirmations to filter\n" "2. maxconf (numeric, optional, default=9999999) The maximum confirmations to filter\n" "3. includeWatchonly (bool, optional, default=false) Also include watchonly addresses (see 'importsaplingviewingkey')\n" - "4. \"addresses\" (string) A json array of shielded addrs to filter on. Duplicate addresses not allowed.\n" + "4. \"addresses\" (string) A json array of shield addrs to filter on. Duplicate addresses not allowed.\n" " [\n" - " \"address\" (string) shielded addr\n" + " \"address\" (string) shield addr\n" " ,...\n" " ]\n" "\nResult:\n" @@ -548,7 +548,7 @@ UniValue listshieldedunspent(const JSONRPCRequest& request) " \"outindex\" (sapling) : n, (numeric) the output index\n" " \"confirmations\" : n, (numeric) the number of confirmations\n" " \"spendable\" : true|false, (boolean) true if note can be spent by wallet, false if address is watchonly\n" - " \"address\" : \"address\", (string) the shielded address\n" + " \"address\" : \"address\", (string) the shield address\n" " \"amount\": xxxxx, (numeric) the amount of value in the note\n" " \"memo\": xxxxx, (string) hexademical string representation of memo field\n" " \"change\": true|false, (boolean) true if the address that received the note is also one of the sending addresses\n" @@ -558,9 +558,9 @@ UniValue listshieldedunspent(const JSONRPCRequest& request) "]\n" "\nExamples\n" - + HelpExampleCli("listshieldedunspent", "") - + HelpExampleCli("listshieldedunspent", "6 9999999 false \"[\\\"ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh\\\",\\\"ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh\\\"]\"") - + HelpExampleRpc("listshieldedunspent", "6 9999999 false \"[\\\"ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh\\\",\\\"ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh\\\"]\"") + + HelpExampleCli("listshieldunspent", "") + + HelpExampleCli("listshieldunspent", "6 9999999 false \"[\\\"ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh\\\",\\\"ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh\\\"]\"") + + HelpExampleRpc("listshieldunspent", "6 9999999 false \"[\\\"ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh\\\",\\\"ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh\\\"]\"") ); EnsureWallet(); @@ -582,7 +582,7 @@ UniValue listshieldedunspent(const JSONRPCRequest& request) LOCK2(cs_main, pwalletMain->cs_wallet); - // User has supplied shielded addrs to filter on + // User has supplied shield addrs to filter on if (request.params.size() > 3) { UniValue addresses = request.params[3].get_array(); if (addresses.size()==0) @@ -614,7 +614,7 @@ UniValue listshieldedunspent(const JSONRPCRequest& request) setAddress.insert(address); } } else { - // User did not provide shielded addrs, so use default i.e. all addresses + // User did not provide shield addrs, so use default i.e. all addresses std::set saplingzaddrs = {}; pwalletMain->GetSaplingPaymentAddresses(saplingzaddrs); shieldAddrs.insert(saplingzaddrs.begin(), saplingzaddrs.end()); @@ -802,22 +802,22 @@ UniValue liststakingaddresses(const JSONRPCRequest& request) return ListaddressesForPurpose(AddressBook::AddressBookPurpose::COLD_STAKING); } -UniValue listshieldedaddresses(const JSONRPCRequest& request) +UniValue listshieldaddresses(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() > 1) throw std::runtime_error( - "listshieldedaddresses ( includeWatchonly )\n" - "\nReturns the list of shielded addresses belonging to the wallet.\n" + "listshieldaddresses ( includeWatchonly )\n" + "\nReturns the list of shield addresses belonging to the wallet.\n" "\nArguments:\n" "1. includeWatchonly (bool, optional, default=false) Also include watchonly addresses (see 'importviewingkey')\n" "\nResult:\n" "[ (json array of string)\n" - " \"addr\" (string) a shielded address belonging to the wallet\n" + " \"addr\" (string) a shield address belonging to the wallet\n" " ,...\n" "]\n" "\nExamples:\n" - + HelpExampleCli("listshieldedaddresses", "") - + HelpExampleRpc("listshieldedaddresses", "") + + HelpExampleCli("listshieldaddresses", "") + + HelpExampleRpc("listshieldaddresses", "") ); EnsureWallet(); @@ -941,15 +941,15 @@ void SendMoney(const CTxDestination& address, CAmount nValue, CWalletTx& wtxNew) static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request); /* - * redirect sendtoaddress/sendmany inputs to shieldedsendmany implementation (CreateShieldedTransaction) + * redirect sendtoaddress/sendmany inputs to shieldsendmany implementation (CreateShieldedTransaction) */ -static UniValue ShieldedSendManyTo(const UniValue& sendTo, +static UniValue ShieldSendManyTo(const UniValue& sendTo, const std::string& commentStr, const std::string& toStr, int nMinDepth, bool fIncludeDelegated) { - // convert params to 'shieldedsendmany' format + // convert params to 'shieldsendmany' format JSONRPCRequest req; req.params = UniValue(UniValue::VARR); if (!fIncludeDelegated) { @@ -1025,7 +1025,7 @@ UniValue sendtoaddress(const JSONRPCRequest& request) if (isShielded) { UniValue sendTo(UniValue::VOBJ); sendTo.pushKV(addrStr, request.params[1]); - return ShieldedSendManyTo(sendTo, commentStr, toStr, 1, false); + return ShieldSendManyTo(sendTo, commentStr, toStr, 1, false); } const CTxDestination& address = *Standard::GetTransparentDestination(destination); @@ -1137,7 +1137,7 @@ UniValue CreateColdStakeDelegation(const UniValue& params, CWalletTx& wtxNew, CR throw JSONRPCError(RPC_WALLET_ERROR, strError); } } else { - // Delegate shielded coins + // Delegate shield coins const Consensus::Params& consensus = Params().GetConsensus(); // Check network status int nextBlockHeight = chainActive.Height() + 1; @@ -1164,7 +1164,7 @@ UniValue delegatestake(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 7) throw std::runtime_error( - "delegatestake \"stakingaddress\" amount ( \"owneraddress\" fExternalOwner fUseDelegated fForceNotEnabled )\n" + "delegatestake \"stakingaddress\" amount ( \"owneraddress\" fExternalOwner fUseDelegated fFromShield fForceNotEnabled )\n" "\nDelegate an amount to a given address for cold staking. The amount is a real and is rounded to the nearest 0.00000001\n" + HelpRequiringPassphrase() + "\n" @@ -1176,7 +1176,7 @@ UniValue delegatestake(const JSONRPCRequest& request) "4. \"fExternalOwner\" (boolean, optional, default = false) use the provided 'owneraddress' anyway, even if not present in this wallet.\n" " WARNING: The owner of the keys to 'owneraddress' will be the only one allowed to spend these coins.\n" "5. \"fUseDelegated\" (boolean, optional, default = false) include already delegated inputs if needed.\n" - "6. \"fFromShielded\" (boolean, optional, default = false) delegate shielded funds.\n" + "6. \"fFromShield\" (boolean, optional, default = false) delegate shield funds.\n" "7. \"fForceNotEnabled\" (boolean, optional, default = false) ONLY FOR TESTING: force the creation even if SPORK 17 is disabled.\n" "\nResult:\n" @@ -1209,7 +1209,7 @@ UniValue rawdelegatestake(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 7) throw std::runtime_error( - "rawdelegatestake \"stakingaddress\" amount ( \"owneraddress\" fExternalOwner fUseDelegated )\n" + "rawdelegatestake \"stakingaddress\" amount ( \"owneraddress\" fExternalOwner fUseDelegated fFromShield )\n" "\nDelegate an amount to a given address for cold staking. The amount is a real and is rounded to the nearest 0.00000001\n" "\nDelegate transaction is returned as json object." + HelpRequiringPassphrase() + "\n" @@ -1222,7 +1222,7 @@ UniValue rawdelegatestake(const JSONRPCRequest& request) "4. \"fExternalOwner\" (boolean, optional, default = false) use the provided 'owneraddress' anyway, even if not present in this wallet.\n" " WARNING: The owner of the keys to 'owneraddress' will be the only one allowed to spend these coins.\n" "5. \"fUseDelegated\" (boolean, optional, default = false) include already delegated inputs if needed.\n" - "6. \"fFromShielded\" (boolean, optional, default = false) delegate shielded funds.\n" + "6. \"fFromShield\" (boolean, optional, default = false) delegate shield funds.\n" "7. \"fForceNotEnabled\" (boolean, optional, default = false) ONLY FOR TESTING: force the creation even if SPORK 17 is disabled (for tests).\n" "\nResult:\n" @@ -1295,16 +1295,16 @@ CAmount getBalanceShieldedAddr(Optional& filter return balance; } -UniValue getshieldedbalance(const JSONRPCRequest& request) +UniValue getshieldbalance(const JSONRPCRequest& request) { if (!pwalletMain) return NullUniValue; if (request.fHelp || request.params.size() > 3) throw std::runtime_error( - "getshieldedbalance \"address\" ( minconf includeWatchonly )\n" - "\nReturn the total shielded value of funds stored in the node's wallet or if an address was given," - "\nreturns the balance of the shielded addr belonging to the node's wallet.\n" + "getshieldbalance \"address\" ( minconf includeWatchonly )\n" + "\nReturn the total shield value of funds stored in the node's wallet or if an address was given," + "\nreturns the balance of the shield addr belonging to the node's wallet.\n" "\nCAUTION: If the wallet contains any addresses for which it only has incoming viewing keys," "\nthe returned private balance may be larger than the actual balance, because spends cannot" "\nbe detected with incoming viewing keys.\n" @@ -1313,15 +1313,15 @@ UniValue getshieldedbalance(const JSONRPCRequest& request) "2. minconf (numeric, optional, default=1) Only include private and transparent transactions confirmed at least this many times.\n" "3. includeWatchonly (bool, optional, default=false) Also include balance in watchonly addresses (see 'importaddress' and 'importsaplingviewingkey')\n" "\nResult:\n" - "amount (numeric) the total balance of shielded funds (in Sapling addresses)\n" + "amount (numeric) the total balance of shield funds (in Sapling addresses)\n" "\nExamples:\n" "\nThe total amount in the wallet\n" - + HelpExampleCli("getshieldedbalance", "") - + HelpExampleCli("getshieldedbalance", "ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh") + + + HelpExampleCli("getshieldbalance", "") + + HelpExampleCli("getshieldbalance", "ptestsapling1h0w73csah2aq0a32h42kr7tq4htlt5wfn4ejxfnm56f6ehjvek7k4e244g6v8v3pgylmz5ea8jh") + "\nThe total amount in the wallet at least 5 blocks confirmed\n" - + HelpExampleCli("getshieldedbalance", "\"*\" \"5\"") + + + HelpExampleCli("getshieldbalance", "\"*\" \"5\"") + "\nAs a json rpc call\n" - + HelpExampleRpc("getshieldedbalance", "\"*\" \"5\"") + + HelpExampleRpc("getshieldbalance", "\"*\" \"5\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -1332,7 +1332,7 @@ UniValue getshieldedbalance(const JSONRPCRequest& request) if (addressStr.empty() || addressStr != "*") { address = KeyIO::DecodeSaplingPaymentAddress(addressStr); if (!address) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid shielded address"); + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid shield address"); } } } @@ -1347,12 +1347,12 @@ UniValue getshieldedbalance(const JSONRPCRequest& request) return ValueFromAmount(nBalance); } -UniValue viewshieldedtransaction(const JSONRPCRequest& request) +UniValue viewshieldtransaction(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() != 1) throw std::runtime_error( - "viewshieldedtransaction \"txid\"\n" - "\nGet detailed shielded information about in-wallet transaction \n" + "viewshieldtransaction \"txid\"\n" + "\nGet detailed shield information about in-wallet transaction \n" + HelpRequiringPassphrase() + "\n" "\nArguments:\n" "1. \"txid\" (string, required) The transaction id\n" @@ -1386,8 +1386,8 @@ UniValue viewshieldedtransaction(const JSONRPCRequest& request) "}\n" "\nExamples:\n" - + HelpExampleCli("viewshieldedtransaction", "\"1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d\"") - + HelpExampleRpc("viewshieldedtransaction", "\"1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d\"") + + HelpExampleCli("viewshieldtransaction", "\"1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d\"") + + HelpExampleRpc("viewshieldtransaction", "\"1075db55d416d3ca199f55b6084e2115b9345e16c5cf302fc80e9d5fbf5d48d\"") ); if (!pwalletMain->HasSaplingSPKM()) { @@ -1406,7 +1406,7 @@ UniValue viewshieldedtransaction(const JSONRPCRequest& request) const CWalletTx& wtx = pwalletMain->mapWallet[hash]; if (!wtx.IsShieldedTx()) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid transaction, no shielded data available"); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid transaction, no shield data available"); } entry.pushKV("txid", hash.GetHex()); @@ -1526,7 +1526,7 @@ static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request) SaplingOperation operation(txBuilder); // Param 0: source of funds. Can either be a valid address, sapling address, - // or the string "from_transparent"|"from_trans_cold"|"from_shielded" + // or the string "from_transparent"|"from_trans_cold"|"from_shield" bool fromSapling = false; std::string sendFromStr = request.params[0].get_str(); if (sendFromStr == "from_transparent") { @@ -1535,8 +1535,8 @@ static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request) } else if (sendFromStr == "from_trans_cold") { // send from any transparent address + delegations operation.setSelectTransparentCoins(true, true); - } else if (sendFromStr == "from_shielded") { - // send from any shielded address + } else if (sendFromStr == "from_shield") { + // send from any shield address operation.setSelectShieldedCoins(true); fromSapling = true; } else { @@ -1544,13 +1544,13 @@ static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request) if (!IsValidDestination(fromTAddressDest)) { auto res = KeyIO::DecodePaymentAddress(sendFromStr); if (!IsValidPaymentAddress(res)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid from address, should be a taddr or shielded addr."); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid from address, should be a taddr or shield addr."); } libzcash::SaplingPaymentAddress fromShieldedAddress = *boost::get(&res); if (!pwalletMain->HaveSpendingKeyForPaymentAddress(fromShieldedAddress)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, shielded addr spending key not found."); + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, shield addr spending key not found."); } - // send from user-supplied shielded address + // send from user-supplied shield address operation.setFromAddress(fromShieldedAddress); fromSapling = true; } else { @@ -1604,7 +1604,7 @@ static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request) if (!memoValue.isNull()) { memo = memoValue.get_str(); if (!saddr) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Memo cannot be used with a taddr. It can only be used with a shielded addr."); + throw JSONRPCError(RPC_INVALID_PARAMETER, "Memo cannot be used with a taddr. It can only be used with a shield addr."); } if (memo.length() > ZC_MEMO_SIZE*2) { throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, size of memo is larger than maximum allowed %d", ZC_MEMO_SIZE )); @@ -1658,7 +1658,7 @@ static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request) } if (fromSapling && nMinDepth == 0) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be zero when sending from shielded addr"); + throw JSONRPCError(RPC_INVALID_PARAMETER, "Minconf cannot be zero when sending from shield addr"); } if (nMinDepth < 0) { @@ -1673,37 +1673,37 @@ static SaplingOperation CreateShieldedTransaction(const JSONRPCRequest& request) return operation; } -UniValue shieldedsendmany(const JSONRPCRequest& request) +UniValue shieldsendmany(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 4) throw std::runtime_error( - "shieldedsendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n" + "shieldsendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n" "\nSend to many recipients. Amounts are decimal numbers with at most 8 digits of precision." - "\nChange generated from a transparent addr flows to a new transparent addr address, while change generated from a shielded addr returns to itself." - "\nWhen sending coinbase UTXOs to a shielded addr, change is not allowed. The entire value of the UTXO(s) must be consumed." + "\nChange generated from a transparent addr flows to a new transparent addr address, while change generated from a shield addr returns to itself." + "\nWhen sending coinbase UTXOs to a shield addr, change is not allowed. The entire value of the UTXO(s) must be consumed." + HelpRequiringPassphrase() + "\n" "\nArguments:\n" - "1. \"fromaddress\" (string, required) The transparent addr or shielded addr to send the funds from.\n" - " It can also be the string \"from_transparent\"|\"from_shielded\" to send the funds\n" - " from any transparent|shielded address available.\n" + "1. \"fromaddress\" (string, required) The transparent addr or shield addr to send the funds from.\n" + " It can also be the string \"from_transparent\"|\"from_shield\" to send the funds\n" + " from any transparent|shield address available.\n" " Additionally, it can be the string \"from_trans_cold\" to select transparent funds,\n" " possibly including delegated coins, if needed.\n" "2. \"amounts\" (array, required) An array of json objects representing the amounts to send.\n" " [{\n" - " \"address\":address (string, required) The address is a transparent addr or shielded addr\n" + " \"address\":address (string, required) The address is a transparent addr or shield addr\n" " \"amount\":amount (numeric, required) The numeric amount in " + "PIV" + " is the value\n" - " \"memo\":memo (string, optional) If the address is a shielded addr, message string of max 512 bytes\n" + " \"memo\":memo (string, optional) If the address is a shield addr, message string of max 512 bytes\n" " }, ... ]\n" "3. minconf (numeric, optional, default=1) Only use funds confirmed at least this many times.\n" "4. fee (numeric, optional), The fee amount to attach to this transaction.\n" - " If not specified, the wallet will try to compute the minimum possible fee for a shielded TX,\n" + " If not specified, the wallet will try to compute the minimum possible fee for a shield TX,\n" " based on the expected transaction size and the current value of -minRelayTxFee.\n" "\nResult:\n" "\"id\" (string) transaction hash in the network\n" "\nExamples:\n" - + HelpExampleCli("shieldedsendmany", + + HelpExampleCli("shieldsendmany", "\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\" '[{\"address\": \"ps1ra969yfhvhp73rw5ak2xvtcm9fkuqsnmad7qln79mphhdrst3lwu9vvv03yuyqlh42p42st47qd\" ,\"amount\": 5.0}]'") - + HelpExampleRpc("shieldedsendmany", + + HelpExampleRpc("shieldsendmany", "\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\", [{\"address\": \"ps1ra969yfhvhp73rw5ak2xvtcm9fkuqsnmad7qln79mphhdrst3lwu9vvv03yuyqlh42p42st47qd\" ,\"amount\": 5.0}]") ); @@ -1715,38 +1715,38 @@ UniValue shieldedsendmany(const JSONRPCRequest& request) return txHash; } -UniValue rawshieldedsendmany(const JSONRPCRequest& request) +UniValue rawshieldsendmany(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 4) throw std::runtime_error( - "rawshieldedsendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n" + "rawshieldsendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n" "\nCreates a transaction sending to many recipients (without committing it), and returns the hex string." "\nAmounts are decimal numbers with at most 8 digits of precision." - "\nChange generated from a transparent addr flows to a new transparent addr address, while change generated from a shielded addr returns to itself." - "\nWhen sending coinbase UTXOs to a shielded addr, change is not allowed. The entire value of the UTXO(s) must be consumed." + "\nChange generated from a transparent addr flows to a new transparent addr address, while change generated from a shield addr returns to itself." + "\nWhen sending coinbase UTXOs to a shield addr, change is not allowed. The entire value of the UTXO(s) must be consumed." + HelpRequiringPassphrase() + "\n" "\nArguments:\n" - "1. \"fromaddress\" (string, required) The transparent addr or shielded addr to send the funds from.\n" - " It can also be the string \"from_transparent\"|\"from_shielded\" to send the funds\n" - " from any transparent|shielded address available.\n" + "1. \"fromaddress\" (string, required) The transparent addr or shield addr to send the funds from.\n" + " It can also be the string \"from_transparent\"|\"from_shield\" to send the funds\n" + " from any transparent|shield address available.\n" " Additionally, it can be the string \"from_trans_cold\" to select transparent funds,\n" " possibly including delegated coins, if needed.\n" "2. \"amounts\" (array, required) An array of json objects representing the amounts to send.\n" " [{\n" - " \"address\":address (string, required) The address is a transparent addr or shielded addr\n" + " \"address\":address (string, required) The address is a transparent addr or shield addr\n" " \"amount\":amount (numeric, required) The numeric amount in " + "PIV" + " is the value\n" - " \"memo\":memo (string, optional) If the address is a shielded addr, message string of max 512 bytes\n" + " \"memo\":memo (string, optional) If the address is a shield addr, message string of max 512 bytes\n" " }, ... ]\n" "3. minconf (numeric, optional, default=1) Only use funds confirmed at least this many times.\n" "4. fee (numeric, optional), The fee amount to attach to this transaction.\n" - " If not specified, the wallet will try to compute the minimum possible fee for a shielded TX,\n" + " If not specified, the wallet will try to compute the minimum possible fee for a shield TX,\n" " based on the expected transaction size and the current value of -minRelayTxFee.\n" "\nResult:\n" "{tx_json} (json object) decoded transaction\n" "\nExamples:\n" - + HelpExampleCli("rawshieldedsendmany", + + HelpExampleCli("rawshieldsendmany", "\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\" '[{\"address\": \"ps1ra969yfhvhp73rw5ak2xvtcm9fkuqsnmad7qln79mphhdrst3lwu9vvv03yuyqlh42p42st47qd\" ,\"amount\": 5.0}]'") - + HelpExampleRpc("rawshieldedsendmany", + + HelpExampleRpc("rawshieldsendmany", "\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\", [{\"address\": \"ps1ra969yfhvhp73rw5ak2xvtcm9fkuqsnmad7qln79mphhdrst3lwu9vvv03yuyqlh42p42st47qd\" ,\"amount\": 5.0}]") ); @@ -1970,7 +1970,7 @@ UniValue getbalance(const JSONRPCRequest& request) { if (request.fHelp || (request.params.size() > 4 )) throw std::runtime_error( - "getbalance ( minconf includeWatchonly includeDelegated )\n" + "getbalance ( minconf includeWatchonly includeDelegated includeShield )\n" "\nReturns the server's total available balance.\n" "The available balance is what the wallet considers currently spendable, and is\n" "thus affected by options which limit spendability such as -spendzeroconfchange.\n" @@ -1979,7 +1979,7 @@ UniValue getbalance(const JSONRPCRequest& request) "1. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" "2. includeWatchonly (bool, optional, default=false) Also include balance in watchonly addresses (see 'importaddress')\n" "3. includeDelegated (bool, optional, default=true) Also include balance delegated to cold stakers\n" - "4. includeShielded (bool, optional, default=true) Also include shielded balance\n" + "4. includeShield (bool, optional, default=true) Also include shield balance\n" "\nResult:\n" "amount (numeric) The total amount in PIV received for this wallet.\n" @@ -2134,14 +2134,14 @@ static UniValue legacy_sendmany(const UniValue& sendTo, int nMinDepth, std::stri /* * This function uses [legacy_sendmany] in the background. - * If any recipient is a shielded address, instead it uses [shieldedsendmany "from_transparent"]. + * If any recipient is a shield address, instead it uses [shieldsendmany "from_transparent"]. */ UniValue sendmany(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 5) throw std::runtime_error( "sendmany \"\" {\"address\":amount,...} ( minconf \"comment\" includeDelegated )\n" - "\nSend to multiple destinations. Recipients are transparent or shielded PIVX addresses.\n" + "\nSend to multiple destinations. Recipients are transparent or shield PIVX addresses.\n" "\nAmounts are double-precision floating point numbers.\n" + HelpRequiringPassphrase() + "\n" @@ -2149,7 +2149,7 @@ UniValue sendmany(const JSONRPCRequest& request) "1. \"dummy\" (string, required) Must be set to \"\" for backwards compatibility.\n" "2. \"amounts\" (string, required) A json object with addresses and amounts\n" " {\n" - " \"address\":amount (numeric) The pivx address (either transparent or shielded) is the key,\n" + " \"address\":amount (numeric) The pivx address (either transparent or shield) is the key,\n" " the numeric amount in PIV is the value\n" " ,...\n" " }\n" @@ -2166,7 +2166,7 @@ UniValue sendmany(const JSONRPCRequest& request) HelpExampleCli("sendmany", "\"\" \"{\\\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\\\":0.01,\\\"DAD3Y6ivr8nPQLT1NEPX84DxGCw9jz9Jvg\\\":0.02}\"") + "\nSend two amounts to two different addresses setting the confirmation and comment:\n" + HelpExampleCli("sendmany", "\"\" \"{\\\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\\\":0.01,\\\"DAD3Y6ivr8nPQLT1NEPX84DxGCw9jz9Jvg\\\":0.02}\" 6 \"testing\"") + - "\nSend to shielded address:\n" + + "\nSend to shield address:\n" + HelpExampleCli("sendmany", "\"\" \"{\\\"ps1u87kylcmn28yclnx2uy0psnvuhs2xn608ukm6n2nshrpg2nzyu3n62ls8j77m9cgp40dx40evej\\\":10}\"") + "\nAs a json rpc call\n" + HelpExampleRpc("sendmany", "\"\", \"{\\\"DMJRSsuU9zfyrvxVaAEFQqK4MxZg6vgeS6\\\":0.01,\\\"DAD3Y6ivr8nPQLT1NEPX84DxGCw9jz9Jvg\\\":0.02}\", 6, \"testing\"") @@ -2182,7 +2182,7 @@ UniValue sendmany(const JSONRPCRequest& request) request.params[3].get_str() : ""; const bool fIncludeDelegated = (request.params.size() > 5 && request.params[5].get_bool()); - // Check if any recipient address is shielded + // Check if any recipient address is shield bool fShieldSend = false; for (const std::string& key : sendTo.getKeys()) { bool isStaking = false, isShielded = false; @@ -2194,7 +2194,7 @@ UniValue sendmany(const JSONRPCRequest& request) } if (fShieldSend) { - return ShieldedSendManyTo(sendTo, comment, "", nMinDepth, fIncludeDelegated); + return ShieldSendManyTo(sendTo, comment, "", nMinDepth, fIncludeDelegated); } // All recipients are transparent: use Legacy sendmany t->t @@ -2435,12 +2435,12 @@ UniValue listreceivedbyaddress(const JSONRPCRequest& request) return ListReceived(request.params, false); } -UniValue listreceivedbyshieldedaddress(const JSONRPCRequest& request) +UniValue listreceivedbyshieldaddress(const JSONRPCRequest& request) { if (request.fHelp || request.params.size()==0 || request.params.size() >2) throw std::runtime_error( - "listreceivedbyshieldedaddress \"address\" ( minconf )\n" - "\nReturn a list of amounts received by a shielded addr belonging to the node's wallet.\n" + "listreceivedbyshieldaddress \"address\" ( minconf )\n" + "\nReturn a list of amounts received by a shield addr belonging to the node's wallet.\n" "\nArguments:\n" "1. \"address\" (string) The private address.\n" "2. minconf (numeric, optional, default=1) Only include transactions confirmed at least this many times.\n" @@ -2457,8 +2457,8 @@ UniValue listreceivedbyshieldedaddress(const JSONRPCRequest& request) " \"change\": true|false, (boolean) true if the address that received the note is also one of the sending addresses\n" "}\n" "\nExamples:\n" - + HelpExampleCli("listreceivedbyshieldedaddress", "\"ps1ra969yfhvhp73rw5ak2xvtcm9fkuqsnmad7qln79mphhdrst3lwu9vvv03yuyqlh42p42st47qd\"") - + HelpExampleRpc("listreceivedbyshieldedaddress", "\"ps1ra969yfhvhp73rw5ak2xvtcm9fkuqsnmad7qln79mphhdrst3lwu9vvv03yuyqlh42p42st47qd\"") + + HelpExampleCli("listreceivedbyshieldaddress", "\"ps1ra969yfhvhp73rw5ak2xvtcm9fkuqsnmad7qln79mphhdrst3lwu9vvv03yuyqlh42p42st47qd\"") + + HelpExampleRpc("listreceivedbyshieldaddress", "\"ps1ra969yfhvhp73rw5ak2xvtcm9fkuqsnmad7qln79mphhdrst3lwu9vvv03yuyqlh42p42st47qd\"") ); LOCK2(cs_main, pwalletMain->cs_wallet); @@ -2478,12 +2478,12 @@ UniValue listreceivedbyshieldedaddress(const JSONRPCRequest& request) if (!zaddr) { throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid addr."); } - libzcash::SaplingPaymentAddress shieldedAddr = *zaddr; + libzcash::SaplingPaymentAddress shieldAddr = *zaddr; auto sspkm = pwalletMain->GetSaplingScriptPubKeyMan(); // Visitor to support Sapling addrs - if (!sspkm->PaymentAddressBelongsToWallet(shieldedAddr)) { - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, shielded addr spending key or viewing key not found."); + if (!sspkm->PaymentAddressBelongsToWallet(shieldAddr)) { + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "From address does not belong to this node, shield addr spending key or viewing key not found."); } UniValue result(UniValue::VARR); @@ -2491,7 +2491,7 @@ UniValue listreceivedbyshieldedaddress(const JSONRPCRequest& request) sspkm->GetFilteredNotes(saplingEntries, zaddr, nMinDepth, false, false); std::set> nullifierSet; - bool hasSpendingKey = pwalletMain->HaveSpendingKeyForPaymentAddress(shieldedAddr); + bool hasSpendingKey = pwalletMain->HaveSpendingKeyForPaymentAddress(shieldAddr); if (hasSpendingKey) { nullifierSet = sspkm->GetNullifiersForAddresses({*zaddr}); } @@ -4148,18 +4148,18 @@ static const CRPCCommand commands[] = //{ "wallet", "multisend", &multisend, false }, /** Sapling functions */ - { "wallet", "getnewshieldedaddress", &getnewshieldedaddress, true }, - { "wallet", "listshieldedaddresses", &listshieldedaddresses, false }, + { "wallet", "getnewshieldaddress", &getnewshieldaddress, true }, + { "wallet", "listshieldaddresses", &listshieldaddresses, false }, { "wallet", "exportsaplingkey", &exportsaplingkey, true }, { "wallet", "importsaplingkey", &importsaplingkey, true }, { "wallet", "importsaplingviewingkey", &importsaplingviewingkey, true }, { "wallet", "exportsaplingviewingkey", &exportsaplingviewingkey, true }, - { "wallet", "getshieldedbalance", &getshieldedbalance, false }, - { "wallet", "listshieldedunspent", &listshieldedunspent, false }, - { "wallet", "rawshieldedsendmany", &rawshieldedsendmany, false }, - { "wallet", "shieldedsendmany", &shieldedsendmany, false }, - { "wallet", "listreceivedbyshieldedaddress", &listreceivedbyshieldedaddress, false }, - { "wallet", "viewshieldedtransaction", &viewshieldedtransaction, false }, + { "wallet", "getshieldbalance", &getshieldbalance, false }, + { "wallet", "listshieldunspent", &listshieldunspent, false }, + { "wallet", "rawshieldsendmany", &rawshieldsendmany, false }, + { "wallet", "shieldsendmany", &shieldsendmany, false }, + { "wallet", "listreceivedbyshieldaddress", &listreceivedbyshieldaddress, false }, + { "wallet", "viewshieldtransaction", &viewshieldtransaction, false }, { "wallet", "getsaplingnotescount", &getsaplingnotescount, false }, /** Label functions (to replace non-balance account functions) */ diff --git a/test/functional/mining_pos_coldStaking.py b/test/functional/mining_pos_coldStaking.py index 4d4fb341bfaef..edd459037e4d5 100755 --- a/test/functional/mining_pos_coldStaking.py +++ b/test/functional/mining_pos_coldStaking.py @@ -123,13 +123,13 @@ def run_test(self): assert_equal(self.nodes[1].getstakingstatus()["stakeablecoins"], 0) # create shielded balance for node 0 self.log.info("Shielding some coins for node0...") - self.nodes[0].shieldedsendmany("from_transparent", [{"address": self.nodes[0].getnewshieldedaddress(), + self.nodes[0].shieldsendmany("from_transparent", [{"address": self.nodes[0].getnewshieldaddress(), "amount": Decimal('250.00')}], 1) self.sync_all() for i in range(6): self.mocktime = self.generate_pow(0, self.mocktime) sync_blocks(self.nodes) - assert_equal(self.nodes[0].getshieldedbalance(), 250) + assert_equal(self.nodes[0].getshieldbalance(), 250) # 3) nodes[0] generates a owner address # nodes[1] generates a cold-staking address. @@ -191,7 +191,7 @@ def run_test(self): assert (res != None and res["txid"] != None and res["txid"] != "") assert_equal(res["owner_address"], owner_address) assert_equal(res["staker_address"], staker_address) - fee = self.nodes[0].viewshieldedtransaction(res["txid"])['fee'] + fee = self.nodes[0].viewshieldtransaction(res["txid"])['fee'] # sync and mine 2 blocks sync_mempools(self.nodes) self.mocktime = self.generate_pos(2, self.mocktime) @@ -202,7 +202,7 @@ def run_test(self): self.expected_immature_balance = 0 self.checkBalances() # also shielded balance of node 0 (250 - 249 - fee) - assert_equal(self.nodes[0].getshieldedbalance(), round(Decimal(1)-Decimal(fee), 8)) + assert_equal(self.nodes[0].getshieldbalance(), round(Decimal(1)-Decimal(fee), 8)) # 6) check that the owner (nodes[0]) can spend the coins. # ------------------------------------------------------- diff --git a/test/functional/sapling_changeaddresses.py b/test/functional/sapling_changeaddresses.py index 8c05e43cac014..4f9d3db6966dd 100755 --- a/test/functional/sapling_changeaddresses.py +++ b/test/functional/sapling_changeaddresses.py @@ -22,9 +22,9 @@ def run_test(self): self.nodes[0].generate(110) # Obtain some transparent funds - midAddr = self.nodes[0].getnewshieldedaddress() + midAddr = self.nodes[0].getnewshieldaddress() # Shield almost all the balance - txid = self.nodes[0].shieldedsendmany(get_coinstake_address(self.nodes[0]), [{"address": midAddr, "amount": Decimal(2400)}]) + txid = self.nodes[0].shieldsendmany(get_coinstake_address(self.nodes[0]), [{"address": midAddr, "amount": Decimal(2400)}]) self.sync_all() self.nodes[1].generate(1) @@ -32,7 +32,7 @@ def run_test(self): taddrSource = self.nodes[0].getnewaddress() for _ in range(6): recipients = [{"address": taddrSource, "amount": Decimal('3')}] - txid = self.nodes[0].shieldedsendmany(midAddr, recipients, 1) + txid = self.nodes[0].shieldsendmany(midAddr, recipients, 1) self.sync_all() self.nodes[1].generate(1) self.sync_all() @@ -41,10 +41,10 @@ def check_change_taddr_reuse(target, isTargetShielded): recipients = [{"address": target, "amount": Decimal('1')}] # Send funds to recipient address twice - txid1 = self.nodes[0].shieldedsendmany(taddrSource, recipients, 1) + txid1 = self.nodes[0].shieldsendmany(taddrSource, recipients, 1) self.nodes[1].generate(1) self.sync_all() - txid2 = self.nodes[0].shieldedsendmany(taddrSource, recipients, 1) + txid2 = self.nodes[0].shieldsendmany(taddrSource, recipients, 1) self.nodes[1].generate(1) self.sync_all() @@ -63,13 +63,13 @@ def check_change_taddr_reuse(target, isTargetShielded): assert(tx1OutAddrs != tx2OutAddrs) taddr = self.nodes[0].getnewaddress() - saplingAddr = self.nodes[0].getnewshieldedaddress() + saplingAddr = self.nodes[0].getnewshieldaddress() print() - print('Checking shieldedsendmany(taddr->Sapling)') + print('Checking shieldsendmany(taddr->Sapling)') check_change_taddr_reuse(saplingAddr, True) print() - print('Checking shieldedsendmany(taddr->taddr)') + print('Checking shieldsendmany(taddr->taddr)') check_change_taddr_reuse(taddr, False) if __name__ == '__main__': diff --git a/test/functional/sapling_fillblock.py b/test/functional/sapling_fillblock.py index 0a1d8e504ab10..9dc69af05eaaf 100755 --- a/test/functional/sapling_fillblock.py +++ b/test/functional/sapling_fillblock.py @@ -74,7 +74,7 @@ def mine_and_checkblock(self, miner, alice): def send_shielded(self, node, n_txes, from_address, shield_to): txids = [] for i in range(n_txes): - txids.append(node.shieldedsendmany(from_address, shield_to)) + txids.append(node.shieldsendmany(from_address, shield_to)) if (i + 1) % 200 == 0: self.log.info("...%d Transactions created..." % (i + 1)) return txids @@ -104,7 +104,7 @@ def run_test(self): # Now alice shields the new utxos individually (fixed 0.2 PIV fee --> ~2.3 PIV notes) self.log.info("Shielding utxos...") - alice_z_addr = alice.getnewshieldedaddress() + alice_z_addr = alice.getnewshieldaddress() shield_to = [{"address": alice_z_addr, "amount": new_utxos[0]["amount"] - Decimal("0.2")}] txids = self.send_shielded(alice, UTXOS_TO_SHIELD, "from_transparent", shield_to) diff --git a/test/functional/sapling_key_import_export.py b/test/functional/sapling_key_import_export.py index 4d220120d78ff..1f90b5bdd0b82 100755 --- a/test/functional/sapling_key_import_export.py +++ b/test/functional/sapling_key_import_export.py @@ -22,7 +22,7 @@ def run_test(self): # the sender loses 'amount' plus fee; to_addr receives exactly 'amount' def shielded_send(from_node, from_addr, to_addr, amount): - txid = from_node.shieldedsendmany(from_addr, + txid = from_node.shieldsendmany(from_addr, [{"address": to_addr, "amount": Decimal(amount)}], 1) self.sync_all() miner.generate(1) @@ -31,7 +31,7 @@ def shielded_send(from_node, from_addr, to_addr, amount): def verify_utxos(node, amts, shield_addr): amts.sort(reverse=True) - txs = node.listreceivedbyshieldedaddress(shield_addr) + txs = node.listreceivedbyshieldaddress(shield_addr) txs.sort(key=lambda x: x["amount"], reverse=True) try: @@ -46,7 +46,7 @@ def verify_utxos(node, amts, shield_addr): raise def get_private_balance(node): - return node.getshieldedbalance() + return node.getshieldbalance() # Seed Alice with some funds alice.generate(10) @@ -56,11 +56,11 @@ def get_private_balance(node): fromAddress = alice.listunspent()[0]['address'] amountTo = 10 * 250 - 1 # Shield Alice's coinbase funds to her shield_addr - alice_addr = alice.getnewshieldedaddress() + alice_addr = alice.getnewshieldaddress() txid = shielded_send(alice, fromAddress, alice_addr, amountTo) # Now get a pristine address for receiving transfers: - bob_addr = bob.getnewshieldedaddress() + bob_addr = bob.getnewshieldaddress() verify_utxos(bob, [], bob_addr) # TODO: Verify that charlie doesn't have funds in addr # verify_utxos(charlie, []) @@ -117,18 +117,18 @@ def get_private_balance(node): for amount in amounts[:2]: print("Sending amount from bob to alice: ", amount) txid = shielded_send(bob, bob_addr, alice_addr, amount) - bob_fee += Decimal(bob.viewshieldedtransaction(txid)['fee']) + bob_fee += Decimal(bob.viewshieldtransaction(txid)['fee']) bob_balance = sum(amounts[2:]) - bob_fee - assert_equal(bob.getshieldedbalance(bob_addr), bob_balance) + assert_equal(bob.getshieldbalance(bob_addr), bob_balance) # importsaplingkey onto new node "david" (blockchain rescan, default or True?) d_ipk_addr = david.importsaplingkey(bob_privkey) # Check if amt bob spent is deducted for charlie and david - assert_equal(charlie.getshieldedbalance(ipk_addr["address"]), bob_balance) - assert_equal(david.getshieldedbalance(d_ipk_addr["address"]), bob_balance) + assert_equal(charlie.getshieldbalance(ipk_addr["address"]), bob_balance) + assert_equal(david.getshieldbalance(d_ipk_addr["address"]), bob_balance) if __name__ == '__main__': SaplingkeyImportExportTest().main() diff --git a/test/functional/sapling_malleable_sigs.py b/test/functional/sapling_malleable_sigs.py index 75c0bb275a1d8..e88705e99b2a6 100755 --- a/test/functional/sapling_malleable_sigs.py +++ b/test/functional/sapling_malleable_sigs.py @@ -31,12 +31,12 @@ def run_test(self): node.generate(2) assert_equal(node.getblockcount(), 202) - z_addr = node.getnewshieldedaddress() + z_addr = node.getnewshieldaddress() shield_to = [{"address": z_addr, "amount": Decimal('10')}] # Create rawtx shielding 10 PIV self.log.info("Shielding 10 PIV...") - rawtx = node.rawshieldedsendmany("from_transparent", shield_to)["hex"] + rawtx = node.rawshieldsendmany("from_transparent", shield_to)["hex"] self.log.info("Raw tx created") # Creating malleated tx diff --git a/test/functional/sapling_mempool.py b/test/functional/sapling_mempool.py index 876da3958e557..febc33a629d19 100755 --- a/test/functional/sapling_mempool.py +++ b/test/functional/sapling_mempool.py @@ -35,21 +35,21 @@ def run_test(self): # miner sends a 10 PIV note to Alice self.log.info("Shielding some coins for Alice...") - alice_zaddr = alice.getnewshieldedaddress() - miner.shieldedsendmany("from_transparent", [{"address": alice_zaddr, "amount": Decimal('10.00')}], 1, fee) + alice_zaddr = alice.getnewshieldaddress() + miner.shieldsendmany("from_transparent", [{"address": alice_zaddr, "amount": Decimal('10.00')}], 1, fee) miner.generate(1) self.sync_all() - assert_equal(alice.getshieldedbalance(alice_zaddr), Decimal('10.00')) + assert_equal(alice.getshieldbalance(alice_zaddr), Decimal('10.00')) # Alice creates (but doesn't send) tx_A to transparent address tadd_A self.log.info("Alice creating tx_A...") tadd_A = alice.getnewaddress() - rawTx = alice.rawshieldedsendmany(alice_zaddr, [{"address": tadd_A, "amount": Decimal('9.00')}], 1, fee) + rawTx = alice.rawshieldsendmany(alice_zaddr, [{"address": tadd_A, "amount": Decimal('9.00')}], 1, fee) # Alice creates and sends tx_B, unshielding the same note to tadd_B self.log.info("Alice creating and sending tx_B...") tadd_B = alice.getnewaddress() - txid_B = alice.shieldedsendmany(alice_zaddr, [{"address": tadd_B, "amount": Decimal('9.00')}], 1, fee) + txid_B = alice.shieldsendmany(alice_zaddr, [{"address": tadd_B, "amount": Decimal('9.00')}], 1, fee) # Miner receives tx_B and accepts it in the mempool assert (txid_B in alice.getrawmempool()) @@ -75,15 +75,15 @@ def run_test(self): # miner sends another 10 PIV note to Alice self.log.info("Shielding some more coins for Alice...") - miner.shieldedsendmany("from_transparent", [{"address": alice_zaddr, "amount": Decimal('10.00')}], 1, fee) + miner.shieldsendmany("from_transparent", [{"address": alice_zaddr, "amount": Decimal('10.00')}], 1, fee) miner.generate(1) self.sync_all() - assert_equal(alice.getshieldedbalance(alice_zaddr), Decimal('10.00')) + assert_equal(alice.getshieldbalance(alice_zaddr), Decimal('10.00')) # Alice creates and sends tx_C, unshielding the note to tadd_C self.log.info("Alice creating and sending tx_C...") tadd_C = alice.getnewaddress() - txC_json = alice.rawshieldedsendmany(alice_zaddr, [{"address": tadd_C, "amount": Decimal('9.00')}], 1, fee) + txC_json = alice.rawshieldsendmany(alice_zaddr, [{"address": tadd_C, "amount": Decimal('9.00')}], 1, fee) txid_C = alice.sendrawtransaction(txC_json['hex']) # Miner receives tx_C and accepts it in the mempool diff --git a/test/functional/sapling_supply.py b/test/functional/sapling_supply.py index 2d20a47a01913..2c43272180bea 100755 --- a/test/functional/sapling_supply.py +++ b/test/functional/sapling_supply.py @@ -24,8 +24,8 @@ def generate_and_sync(self, count): def check_shield_supply(self, z_supply): self.log.info("Checking supply...") - assert_equal(self.nodes[0].getsupplyinfo()['shieldedsupply'], z_supply) - self.log.info("OK. Shielded supply is %.8f" % z_supply) + assert_equal(self.nodes[0].getsupplyinfo()['shieldsupply'], z_supply) + self.log.info("OK. Shield supply is %.8f" % z_supply) def run_test(self): fee = 1 @@ -33,20 +33,20 @@ def run_test(self): self.log.info("Generating 101 blocks...") self.generate_and_sync(101) - # Check the shielded supply 0 + # Check the shield supply 0 z_supply = 0 self.check_shield_supply(z_supply) # Send 200 PIV to shield addr1 self.log.info("Shielding 200 PIV...") - z_addr1 = self.nodes[0].getnewshieldedaddress() - txid = self.nodes[0].shieldedsendmany( + z_addr1 = self.nodes[0].getnewshieldaddress() + txid = self.nodes[0].shieldsendmany( "from_transparent", [{'address': z_addr1, 'amount': 200, - 'memo': "first shielded coin!"}], 1, fee) + 'memo': "first shield coin!"}], 1, fee) self.sync_all() # Decrypted transaction details should be correct - pt = self.nodes[0].viewshieldedtransaction(txid) + pt = self.nodes[0].viewshieldtransaction(txid) assert_equal(pt['txid'], txid) assert_equal(len(pt['spends']), 0) assert_equal(len(pt['outputs']), 1) @@ -54,11 +54,11 @@ def run_test(self): assert_equal(out['output'], 0) assert_equal(out['address'], z_addr1) assert_equal(out['outgoing'], False) - assert_equal(out['memoStr'], "first shielded coin!") + assert_equal(out['memoStr'], "first shield coin!") assert_equal(out['value'], Decimal('200')) assert_equal(out['valueSat'], 20000000000) - # Check the shielded supply + # Check the shield supply self.generate_and_sync(5) z_supply += 200 self.check_shield_supply(z_supply) @@ -66,17 +66,17 @@ def run_test(self): # Deshield 100 coins self.log.info("Deshielding 100 PIV...") t_addr1 = self.nodes[0].getnewaddress() - txid = self.nodes[0].shieldedsendmany( - "from_shielded", [{'address': t_addr1, 'amount': 100}], 1, fee) + txid = self.nodes[0].shieldsendmany( + "from_shield", [{'address': t_addr1, 'amount': 100}], 1, fee) self.sync_all() # Decrypted transaction details should be correct - pt = self.nodes[0].viewshieldedtransaction(txid) + pt = self.nodes[0].viewshieldtransaction(txid) assert_equal(pt['txid'], txid) assert_equal(len(pt['spends']), 1) assert_equal(len(pt['outputs']), 1) - # Check the shielded supply + # Check the shield supply self.generate_and_sync(1) z_supply -= (100 + fee) self.check_shield_supply(z_supply) diff --git a/test/functional/sapling_wallet.py b/test/functional/sapling_wallet.py index 85322edd47a6c..b8b02a4b891da 100755 --- a/test/functional/sapling_wallet.py +++ b/test/functional/sapling_wallet.py @@ -44,16 +44,16 @@ def run_test(self): self.sync_all() assert_equal(self.nodes[1].getblockcount(), 202) taddr1 = self.nodes[1].getnewaddress() - saplingAddr0 = self.nodes[0].getnewshieldedaddress() - saplingAddr1 = self.nodes[1].getnewshieldedaddress() + saplingAddr0 = self.nodes[0].getnewshieldaddress() + saplingAddr1 = self.nodes[1].getnewshieldaddress() # Verify addresses - assert(saplingAddr0 in self.nodes[0].listshieldedaddresses()) - assert(saplingAddr1 in self.nodes[1].listshieldedaddresses()) + assert(saplingAddr0 in self.nodes[0].listshieldaddresses()) + assert(saplingAddr1 in self.nodes[1].listshieldaddresses()) # Verify balance - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('0')) - assert_equal(self.nodes[1].getshieldedbalance(saplingAddr1), Decimal('0')) + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('0')) + assert_equal(self.nodes[1].getshieldbalance(saplingAddr1), Decimal('0')) assert_equal(self.nodes[1].getreceivedbyaddress(taddr1), Decimal('0')) recipients = [{"address": saplingAddr0, "amount": Decimal('10')}] @@ -62,20 +62,20 @@ def run_test(self): fee_too_low = 0.001 self.log.info("Trying to send a transaction with fee too low...") assert_raises_rpc_error(-4, "Fee set (%.3f) too low. Must be at least" % fee_too_low, - self.nodes[0].rawshieldedsendmany, + self.nodes[0].rawshieldsendmany, "from_transparent", recipients, 1, fee_too_low) # Try fee too high. fee_too_high = 20 self.log.info("Good. It was not possible. Now try a tx with fee too high...") assert_raises_rpc_error(-4, "The transaction fee is too high: %.2f >" % fee_too_high, - self.nodes[0].rawshieldedsendmany, + self.nodes[0].rawshieldsendmany, "from_transparent", recipients, 1, fee_too_high) # Trying to send a rawtx with low fee directly self.log.info("Good. It was not possible. Now try with a raw tx...") self.restart_node(0, extra_args=self.extra_args[0]+['-minrelaytxfee=0.0000001']) - rawtx = self.nodes[0].rawshieldedsendmany("from_transparent", recipients, 1)["hex"] + rawtx = self.nodes[0].rawshieldsendmany("from_transparent", recipients, 1)["hex"] self.restart_node(0, extra_args=self.extra_args[0]) connect_nodes(self.nodes[0], 1) assert_raises_rpc_error(-26, "insufficient fee", @@ -88,11 +88,11 @@ def run_test(self): # Node 0 shields some funds # taddr -> Sapling self.log.info("TX 1: shield funds from specified transparent address.") - mytxid1 = self.nodes[0].shieldedsendmany(get_coinstake_address(self.nodes[0]), recipients, 1, fee) + mytxid1 = self.nodes[0].shieldsendmany(get_coinstake_address(self.nodes[0]), recipients, 1, fee) # shield more funds automatically selecting the transparent inputs self.log.info("TX 2: shield funds from any transparent address.") - mytxid2 = self.nodes[0].shieldedsendmany("from_transparent", recipients, 1, fee) + mytxid2 = self.nodes[0].shieldsendmany("from_transparent", recipients, 1, fee) # Verify priority of tx is INF_PRIORITY, defined as 1E+25 (10000000000000000000000000) self.check_tx_priority([mytxid1, mytxid2]) @@ -103,7 +103,7 @@ def run_test(self): # shield more funds creating and then sending a raw transaction self.log.info("TX 3: shield funds creating and sending raw transaction.") - tx_json = self.nodes[0].rawshieldedsendmany("from_transparent", recipients, 1, fee) + tx_json = self.nodes[0].rawshieldsendmany("from_transparent", recipients, 1, fee) # Check SPORK_20 for sapling maintenance mode SPORK_20 = "SPORK_20_SAPLING_MAINTENANCE" @@ -115,7 +115,7 @@ def run_test(self): # Try with RPC... assert_raises_rpc_error(-8, "Invalid parameter, Sapling not active yet", - self.nodes[0].shieldedsendmany, "from_transparent", recipients, 1, fee) + self.nodes[0].shieldsendmany, "from_transparent", recipients, 1, fee) # Disable SPORK_20 and retry sleep(5) @@ -132,8 +132,8 @@ def run_test(self): self.sync_all() # Verify balance - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('30')) - assert_equal(self.nodes[1].getshieldedbalance(saplingAddr1), Decimal('0')) + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('30')) + assert_equal(self.nodes[1].getshieldbalance(saplingAddr1), Decimal('0')) assert_equal(self.nodes[1].getreceivedbyaddress(taddr1), Decimal('0')) self.log.info("Balances check out") @@ -142,12 +142,12 @@ def run_test(self): tip_hash = self.nodes[0].getbestblockhash() self.nodes[0].invalidateblock(tip_hash) assert tip_hash != self.nodes[0].getbestblockhash() - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('20')) - self.log.info("Now trying to connect block with shielded tx, when SPORK_20 is active") + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('20')) + self.log.info("Now trying to connect block with shield tx, when SPORK_20 is active") self.activate_spork(0, SPORK_20) self.nodes[0].reconsiderblock(tip_hash) assert tip_hash != self.nodes[0].getbestblockhash() # Block NOT connected - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('20')) + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('20')) self.log.info("Good. Not possible.") # Deactivate SPORK_20 and reconnect @@ -155,33 +155,33 @@ def run_test(self): self.deactivate_spork(0, SPORK_20) self.nodes[0].reconsiderblock(tip_hash) assert_equal(tip_hash, self.nodes[0].getbestblockhash()) # Block connected - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('30')) + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('30')) self.log.info("Reconnected after deactivation of SPORK_20. Balance restored.") connect_nodes(self.nodes[0], 1) - # Node 0 sends some shielded funds to node 1 + # Node 0 sends some shield funds to node 1 # Sapling -> Sapling # -> Sapling (change) - self.log.info("TX 4: shielded transaction from specified sapling address.") + self.log.info("TX 4: shield transaction from specified sapling address.") recipients4 = [{"address": saplingAddr1, "amount": Decimal('10')}] - mytxid4 = self.nodes[0].shieldedsendmany(saplingAddr0, recipients4, 1, fee) + mytxid4 = self.nodes[0].shieldsendmany(saplingAddr0, recipients4, 1, fee) self.check_tx_priority([mytxid4]) self.nodes[2].generate(1) self.sync_all() - # Send more shielded funds (this time with automatic selection of the source) - self.log.info("TX 5: shielded transaction from any sapling address.") + # Send more shield funds (this time with automatic selection of the source) + self.log.info("TX 5: shield transaction from any sapling address.") recipients5 = [{"address": saplingAddr1, "amount": Decimal('5')}] - mytxid5 = self.nodes[0].shieldedsendmany("from_shielded", recipients5, 1, fee) + mytxid5 = self.nodes[0].shieldsendmany("from_shield", recipients5, 1, fee) self.check_tx_priority([mytxid5]) self.nodes[2].generate(1) self.sync_all() - # Send more shielded funds (with create + send raw transaction) - self.log.info("TX 6: shielded raw transaction.") - tx_json = self.nodes[0].rawshieldedsendmany("from_shielded", recipients5, 1, fee) + # Send more shield funds (with create + send raw transaction) + self.log.info("TX 6: shield raw transaction.") + tx_json = self.nodes[0].rawshieldsendmany("from_shield", recipients5, 1, fee) mytxid6 = self.nodes[0].sendrawtransaction(tx_json["hex"]) self.check_tx_priority([mytxid6]) @@ -189,10 +189,10 @@ def run_test(self): self.sync_all() # Shield more funds to a different address to verify multi-source notes spending - saplingAddr2 = self.nodes[0].getnewshieldedaddress() + saplingAddr2 = self.nodes[0].getnewshieldaddress() self.log.info("TX 7: shield funds to later verify multi source notes spending.") recipients = [{"address": saplingAddr2, "amount": Decimal('10')}] - mytxid7 = self.nodes[0].shieldedsendmany(get_coinstake_address(self.nodes[0]), recipients, 1, fee) + mytxid7 = self.nodes[0].shieldsendmany(get_coinstake_address(self.nodes[0]), recipients, 1, fee) self.check_tx_priority([mytxid7]) self.nodes[2].generate(5) @@ -202,42 +202,42 @@ def run_test(self): tAddr0 = self.nodes[0].getnewaddress() self.log.info("TX 8: verifying multi source notes spending.") recipients = [{"address": tAddr0, "amount": Decimal('11')}] - mytxid8 = self.nodes[0].shieldedsendmany("from_shielded", recipients, 1, fee) + mytxid8 = self.nodes[0].shieldsendmany("from_shield", recipients, 1, fee) self.check_tx_priority([mytxid8]) self.nodes[2].generate(1) self.sync_all() # Verify balance - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('3')) # 30 received - (20 sent + 3 fee) - 4 sent - assert_equal(self.nodes[1].getshieldedbalance(saplingAddr1), Decimal('20')) # 20 received - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr2), Decimal('2')) # 10 received - 10 sent + 2 change + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('3')) # 30 received - (20 sent + 3 fee) - 4 sent + assert_equal(self.nodes[1].getshieldbalance(saplingAddr1), Decimal('20')) # 20 received + assert_equal(self.nodes[0].getshieldbalance(saplingAddr2), Decimal('2')) # 10 received - 10 sent + 2 change assert_equal(self.nodes[1].getreceivedbyaddress(taddr1), Decimal('0')) - assert_equal(self.nodes[0].getshieldedbalance(), Decimal('5')) + assert_equal(self.nodes[0].getshieldbalance(), Decimal('5')) self.log.info("Balances check out") - # Node 1 sends some shielded funds to node 0, as well as unshielding + # Node 1 sends some shield funds to node 0, as well as unshielding # Sapling -> Sapling # -> taddr # -> Sapling (change) self.log.info("TX 10: deshield funds from specified sapling address.") recipients7 = [{"address": saplingAddr0, "amount": Decimal('8')}] recipients7.append({"address": taddr1, "amount": Decimal('10')}) - mytxid7 = self.nodes[1].shieldedsendmany(saplingAddr1, recipients7, 1, fee) + mytxid7 = self.nodes[1].shieldsendmany(saplingAddr1, recipients7, 1, fee) self.check_tx_priority([mytxid7]) self.nodes[2].generate(1) self.sync_all() # Verify balance - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('11')) # 3 prev balance + 8 received - assert_equal(self.nodes[1].getshieldedbalance(saplingAddr1), Decimal('1')) # 20 prev balance - (18 sent + 1 fee) + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('11')) # 3 prev balance + 8 received + assert_equal(self.nodes[1].getshieldbalance(saplingAddr1), Decimal('1')) # 20 prev balance - (18 sent + 1 fee) assert_equal(self.nodes[1].getreceivedbyaddress(taddr1), Decimal('10')) self.log.info("Balances check out") # Verify existence of Sapling related JSON fields resp = self.nodes[0].getrawtransaction(mytxid7, 1) - assert_equal(Decimal(resp['valueBalance']), Decimal('11.00')) # 20 shielded input - 8 shielded spend - 1 change + assert_equal(Decimal(resp['valueBalance']), Decimal('11.00')) # 20 shield input - 8 shield spend - 1 change assert_equal(len(resp['vShieldedSpend']), 3) assert_equal(len(resp['vShieldedOutput']), 2) assert('bindingSig' in resp) @@ -262,26 +262,26 @@ def run_test(self): sk0 = self.nodes[0].exportsaplingkey(saplingAddr0) saplingAddrInfo0 = self.nodes[2].importsaplingkey(sk0, "yes") assert_equal(saplingAddrInfo0["address"], saplingAddr0) - assert_equal(self.nodes[2].getshieldedbalance(saplingAddrInfo0["address"]), Decimal('11')) + assert_equal(self.nodes[2].getshieldbalance(saplingAddrInfo0["address"]), Decimal('11')) sk1 = self.nodes[1].exportsaplingkey(saplingAddr1) saplingAddrInfo1 = self.nodes[2].importsaplingkey(sk1, "yes") assert_equal(saplingAddrInfo1["address"], saplingAddr1) - assert_equal(self.nodes[2].getshieldedbalance(saplingAddrInfo1["address"]), Decimal('1')) + assert_equal(self.nodes[2].getshieldbalance(saplingAddrInfo1["address"]), Decimal('1')) # Verify importing a viewing key will update the nullifiers and witnesses correctly self.log.info("Checking exporting/importing a viewing key...") extfvk0 = self.nodes[0].exportsaplingviewingkey(saplingAddr0) saplingAddrInfo0 = self.nodes[3].importsaplingviewingkey(extfvk0, "yes") assert_equal(saplingAddrInfo0["address"], saplingAddr0) - assert_equal(Decimal(self.nodes[3].getshieldedbalance(saplingAddrInfo0["address"], 1, True)), Decimal('11')) + assert_equal(Decimal(self.nodes[3].getshieldbalance(saplingAddrInfo0["address"], 1, True)), Decimal('11')) extfvk1 = self.nodes[1].exportsaplingviewingkey(saplingAddr1) saplingAddrInfo1 = self.nodes[3].importsaplingviewingkey(extfvk1, "yes") assert_equal(saplingAddrInfo1["address"], saplingAddr1) - assert_equal(self.nodes[3].getshieldedbalance(saplingAddrInfo1["address"], 1, True), Decimal('1')) + assert_equal(self.nodes[3].getshieldbalance(saplingAddrInfo1["address"], 1, True), Decimal('1')) # no balance in the wallet - assert_equal(self.nodes[3].getshieldedbalance(), Decimal('0')) + assert_equal(self.nodes[3].getshieldbalance(), Decimal('0')) # watch only balance - assert_equal(self.nodes[3].getshieldedbalance("*", 1, True), Decimal('12.00')) + assert_equal(self.nodes[3].getshieldbalance("*", 1, True), Decimal('12.00')) # Now shield some funds using sendmany self.log.info("TX11: Shielding coins to multiple destinations with sendmany RPC...") @@ -292,7 +292,7 @@ def run_test(self): self.log.info("Done. Checking details and balances...") # Decrypted transaction details should be correct - pt = self.nodes[0].viewshieldedtransaction(mytxid11) + pt = self.nodes[0].viewshieldtransaction(mytxid11) fee = pt["fee"] assert_equal(pt['txid'], mytxid11) assert_equal(len(pt['spends']), 0) @@ -318,9 +318,9 @@ def run_test(self): # Verify balance self.nodes[2].generate(1) self.sync_all() - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('19')) # 11 prev balance + 8 received - assert_equal(self.nodes[1].getshieldedbalance(saplingAddr1), Decimal('2')) # 1 prev balance + 1 received - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr2), Decimal('2.5')) # 2 prev balance + 0.5 received + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('19')) # 11 prev balance + 8 received + assert_equal(self.nodes[1].getshieldbalance(saplingAddr1), Decimal('2')) # 1 prev balance + 1 received + assert_equal(self.nodes[0].getshieldbalance(saplingAddr2), Decimal('2.5')) # 2 prev balance + 0.5 received # Balance of node 0 is: prev_balance - 1 PIV (+fee) sent externally + 250 PIV matured coinbase assert_equal(self.nodes[0].getbalance(), satoshi_round(prev_balance + Decimal('249') - Decimal(fee))) @@ -332,7 +332,7 @@ def run_test(self): self.log.info("Done. Checking details and balances...") # Decrypted transaction details should be correct - pt = self.nodes[0].viewshieldedtransaction(mytxid12) + pt = self.nodes[0].viewshieldtransaction(mytxid12) fee = pt["fee"] assert_equal(pt['txid'], mytxid12) assert_equal(len(pt['spends']), 0) @@ -345,7 +345,7 @@ def run_test(self): # Verify balance self.nodes[2].generate(1) self.sync_all() - assert_equal(self.nodes[0].getshieldedbalance(saplingAddr0), Decimal('29')) # 19 prev balance + 10 received + assert_equal(self.nodes[0].getshieldbalance(saplingAddr0), Decimal('29')) # 19 prev balance + 10 received self.log.info("All good.") diff --git a/test/functional/sapling_wallet_anchorfork.py b/test/functional/sapling_wallet_anchorfork.py index dcf7a25e7a689..3230015a33026 100755 --- a/test/functional/sapling_wallet_anchorfork.py +++ b/test/functional/sapling_wallet_anchorfork.py @@ -37,12 +37,12 @@ def run_test (self): # At this point in time, commitment tree is the empty root - # Node 0 creates a shielded transaction + # Node 0 creates a shield transaction mytaddr0 = get_coinstake_address(self.nodes[0]) - myzaddr0 = self.nodes[0].getnewshieldedaddress() + myzaddr0 = self.nodes[0].getnewshieldaddress() recipients = [] recipients.append({"address":myzaddr0, "amount": Decimal('10.0') - Decimal('0.0001')}) - txid = self.nodes[0].shieldedsendmany(mytaddr0, recipients) + txid = self.nodes[0].shieldsendmany(mytaddr0, recipients) # Sync up mempools and mine the transaction. All nodes have the same anchor. self.sync_all() @@ -69,17 +69,17 @@ def run_test (self): assert_equal(self.nodes[1].getblockcount(), self.nodes[2].getblockcount()) assert(self.nodes[2].getblockcount() != self.nodes[0].getblockcount()) - # Partition A, node 0 creates a shielded transaction + # Partition A, node 0 creates a shield transaction recipients = [] recipients.append({"address":myzaddr0, "amount": Decimal('10.0') - Decimal('0.0001')}) - txid = self.nodes[0].shieldedsendmany(mytaddr0, recipients) + txid = self.nodes[0].shieldsendmany(mytaddr0, recipients) rawhex = self.nodes[0].getrawtransaction(txid) # Partition A, node 0 mines a block with the transaction self.nodes[0].generate(1) self.sync_all([self.nodes[1:3]]) - # Partition B, node 1 mines the same shielded transaction + # Partition B, node 1 mines the same shield transaction txid2 = self.nodes[1].sendrawtransaction(rawhex) assert_equal(txid, txid2) self.nodes[1].generate(1) diff --git a/test/functional/sapling_wallet_listreceived.py b/test/functional/sapling_wallet_listreceived.py index afcf6ff97714d..7c9a20acfe609 100755 --- a/test/functional/sapling_wallet_listreceived.py +++ b/test/functional/sapling_wallet_listreceived.py @@ -37,28 +37,28 @@ def run_test(self): height = 214 self.generate_and_sync(height+1) taddr = self.nodes[1].getnewaddress() - shield_addr1 = self.nodes[1].getnewshieldedaddress() - shield_addrExt = self.nodes[3].getnewshieldedaddress() + shield_addr1 = self.nodes[1].getnewshieldaddress() + shield_addrExt = self.nodes[3].getnewshieldaddress() self.nodes[0].sendtoaddress(taddr, 6.0) # node_1 in taddr with 6 PIV. self.generate_and_sync(height+2) # Try to send with an oversized memo assert_raises_rpc_error(-4, "Memo size of 513 is too big, maximum allowed is 512", - self.nodes[1].shieldedsendmany, taddr, + self.nodes[1].shieldsendmany, taddr, [{'address': shield_addr1, 'amount': 2, 'memo': too_big_memo_str}]) # Fixed fee fee = 0.5 # Send 1 PIV to shield addr1 - txid = self.nodes[1].shieldedsendmany(taddr, [ # node_1 with 6 PIV sending them all (fee is 0.1 PIV) + txid = self.nodes[1].shieldsendmany(taddr, [ # node_1 with 6 PIV sending them all (fee is 0.1 PIV) {'address': shield_addr1, 'amount': 2, 'memo': my_memo_str}, {'address': shield_addrExt, 'amount': 3}, ], 1, fee) self.sync_all() # Decrypted transaction details should be correct - pt = self.nodes[1].viewshieldedtransaction(txid) + pt = self.nodes[1].viewshieldtransaction(txid) assert_equal(pt['txid'], txid) assert_equal(len(pt['spends']), 0) assert_equal(len(pt['outputs']), 2) @@ -82,13 +82,13 @@ def run_test(self): found[1] = True assert_equal(found, [True] * 2) - r = self.nodes[1].listreceivedbyshieldedaddress(shield_addr1) + r = self.nodes[1].listreceivedbyshieldaddress(shield_addr1) assert_true(0 == len(r), "Should have received no confirmed note") c = self.nodes[1].getsaplingnotescount() assert_true(0 == c, "Count of confirmed notes should be 0") # No confirmation required, one note should be present - r = self.nodes[1].listreceivedbyshieldedaddress(shield_addr1, 0) + r = self.nodes[1].listreceivedbyshieldaddress(shield_addr1, 0) assert_true(1 == len(r), "Should have received one (unconfirmed) note") assert_equal(txid, r[0]['txid']) assert_equal(2, r[0]['amount']) @@ -112,7 +112,7 @@ def run_test(self): r[0]['blockheight'] = height + 3 # Require one confirmation, note should be present - r2 = self.nodes[1].listreceivedbyshieldedaddress(shield_addr1) + r2 = self.nodes[1].listreceivedbyshieldaddress(shield_addr1) # As time will be different (tx was included in a block), need to remove it from the dict assert_true(r[0]['blocktime'] != r2[0]['blocktime']) del r[0]['blocktime'] @@ -121,14 +121,14 @@ def run_test(self): assert_equal(r, r2) # Get the note nullifier - lsu = self.nodes[1].listshieldedunspent(); + lsu = self.nodes[1].listshieldunspent(); assert_equal(len(lsu), 1) nullifier = lsu[0]["nullifier"] # Generate some change by sending part of shield_addr1 to shield_addr2 txidPrev = txid - shield_addr2 = self.nodes[1].getnewshieldedaddress() - txid = self.nodes[1].shieldedsendmany(shield_addr1, # shield_addr1 has 2 PIV, send 0.6 PIV + 0.5 PIV fee + shield_addr2 = self.nodes[1].getnewshieldaddress() + txid = self.nodes[1].shieldsendmany(shield_addr1, # shield_addr1 has 2 PIV, send 0.6 PIV + 0.5 PIV fee [{'address': shield_addr2, 'amount': 0.6, "memo": non_ascii_memo_str}], 1, fee) # change 0.9 self.sync_all() @@ -139,7 +139,7 @@ def run_test(self): assert_equal(nullifier, tx_json["vShieldedSpend"][0]["nullifier"]) # Decrypted transaction details should be correct - pt = self.nodes[1].viewshieldedtransaction(txid) + pt = self.nodes[1].viewshieldtransaction(txid) assert_equal(pt['txid'], txid) assert_equal(len(pt['spends']), 1) assert_equal(len(pt['outputs']), 2) @@ -171,7 +171,7 @@ def run_test(self): assert_equal(found, [True] * 2) # shield_addr1 should have a note with change - r = self.nodes[1].listreceivedbyshieldedaddress(shield_addr1, 0) + r = self.nodes[1].listreceivedbyshieldaddress(shield_addr1, 0) r = sorted(r, key = lambda received: received['amount']) assert_true(2 == len(r), "shield_addr1 Should have received 2 notes") @@ -186,7 +186,7 @@ def run_test(self): assert_equal(my_memo_hex, r[1]['memo']) # shield_addr2 should not have change - r = self.nodes[1].listreceivedbyshieldedaddress(shield_addr2, 0) + r = self.nodes[1].listreceivedbyshieldaddress(shield_addr2, 0) r = sorted(r, key = lambda received: received['amount']) assert_true(1 == len(r), "shield_addr2 Should have received 1 notes") assert_equal(txid, r[0]['txid']) diff --git a/test/functional/sapling_wallet_nullifiers.py b/test/functional/sapling_wallet_nullifiers.py index 24345b2b69867..b8d879808adf7 100755 --- a/test/functional/sapling_wallet_nullifiers.py +++ b/test/functional/sapling_wallet_nullifiers.py @@ -22,25 +22,25 @@ def set_test_params(self): def run_test (self): self.nodes[0].generate(1) # activate Sapling - # add shielded addr to node 0 - myzaddr0 = self.nodes[0].getnewshieldedaddress() + # add shield addr to node 0 + myzaddr0 = self.nodes[0].getnewshieldaddress() - # send node 0 taddr to shielded addr to get out of coinbase + # send node 0 taddr to shield addr to get out of coinbase # Tests using the default cached chain have one address per coinbase output mytaddr = get_coinstake_address(self.nodes[0]) recipients = [] recipients.append({"address":myzaddr0, "amount":Decimal('10.0') - Decimal('1')}) # utxo amount less fee - txid = self.nodes[0].shieldedsendmany(mytaddr, recipients) + txid = self.nodes[0].shieldsendmany(mytaddr, recipients) self.sync_all() self.nodes[0].generate(1) self.sync_all() - # add shielded addr to node 2 - myzaddr = self.nodes[2].getnewshieldedaddress() + # add shield addr to node 2 + myzaddr = self.nodes[2].getnewshieldaddress() - # import node 2 shielded addr into node 1 + # import node 2 shield addr into node 1 myzkey = self.nodes[2].exportsaplingkey(myzaddr) self.nodes[1].importsaplingkey(myzkey) @@ -54,43 +54,43 @@ def run_test (self): connect_nodes_bi(self.nodes, 3, 1) self.sync_all() - # send node 0 shielded addr to note 2 zaddr + # send node 0 shield addr to note 2 zaddr recipients = [] recipients.append({"address":myzaddr, "amount":7.0}) - txid = self.nodes[0].shieldedsendmany(myzaddr0, recipients) + txid = self.nodes[0].shieldsendmany(myzaddr0, recipients) self.sync_all() self.nodes[0].generate(1) self.sync_all() - # check shielded addr balance + # check shield addr balance zsendmanynotevalue = Decimal('7.0') - assert_equal(self.nodes[2].getshieldedbalance(myzaddr), zsendmanynotevalue) - assert_equal(self.nodes[1].getshieldedbalance(myzaddr), zsendmanynotevalue) + assert_equal(self.nodes[2].getshieldbalance(myzaddr), zsendmanynotevalue) + assert_equal(self.nodes[1].getshieldbalance(myzaddr), zsendmanynotevalue) - # add shielded addr to node 3 - myzaddr3 = self.nodes[3].getnewshieldedaddress() + # add shield addr to node 3 + myzaddr3 = self.nodes[3].getnewshieldaddress() - # send node 2 shielded addr to note 3 shielded addr + # send node 2 shield addr to note 3 shield addr recipients = [] recipients.append({"address":myzaddr3, "amount":2.0}) - txid = self.nodes[2].shieldedsendmany(myzaddr, recipients) + txid = self.nodes[2].shieldsendmany(myzaddr, recipients) self.sync_all() self.nodes[2].generate(1) self.sync_all() - # check shielded addr balance + # check shield addr balance zsendmany2notevalue = Decimal('2.0') - zsendmanyfee = Decimal(self.nodes[2].viewshieldedtransaction(txid)['fee']) + zsendmanyfee = Decimal(self.nodes[2].viewshieldtransaction(txid)['fee']) zaddrremaining = zsendmanynotevalue - zsendmany2notevalue - zsendmanyfee - assert_equal(self.nodes[3].getshieldedbalance(myzaddr3), zsendmany2notevalue) - assert_equal(self.nodes[2].getshieldedbalance(myzaddr), zaddrremaining) - assert_equal(self.nodes[1].getshieldedbalance(myzaddr), zaddrremaining) + assert_equal(self.nodes[3].getshieldbalance(myzaddr3), zsendmany2notevalue) + assert_equal(self.nodes[2].getshieldbalance(myzaddr), zaddrremaining) + assert_equal(self.nodes[1].getshieldbalance(myzaddr), zaddrremaining) - # send node 2 shielded addr on node 1 to taddr + # send node 2 shield addr on node 1 to taddr # This requires that node 1 be unlocked, which triggers caching of # uncached nullifiers. self.nodes[1].walletpassphrase("test", 600) @@ -98,26 +98,26 @@ def run_test (self): recipients = [] recipients.append({"address":mytaddr1, "amount":1.0}) - txid = self.nodes[1].shieldedsendmany(myzaddr, recipients) + txid = self.nodes[1].shieldsendmany(myzaddr, recipients) self.sync_all() self.nodes[1].generate(1) self.sync_all() - # check shielded addr balance + # check shield addr balance # Now that the encrypted wallet has been unlocked, the note nullifiers # have been cached and spent notes can be detected. Thus the two wallets # are in agreement once more. zsendmany3notevalue = Decimal('1.0') - zsendmanyfee = Decimal(self.nodes[1].viewshieldedtransaction(txid)['fee']) + zsendmanyfee = Decimal(self.nodes[1].viewshieldtransaction(txid)['fee']) zaddrremaining2 = zaddrremaining - zsendmany3notevalue - zsendmanyfee - assert_equal(self.nodes[1].getshieldedbalance(myzaddr), zaddrremaining2) - assert_equal(self.nodes[2].getshieldedbalance(myzaddr), zaddrremaining2) + assert_equal(self.nodes[1].getshieldbalance(myzaddr), zaddrremaining2) + assert_equal(self.nodes[2].getshieldbalance(myzaddr), zaddrremaining2) # Test viewing keys node3mined = Decimal('6250.0') - assert_equal(self.nodes[3].getshieldedbalance(), zsendmany2notevalue) + assert_equal(self.nodes[3].getshieldbalance(), zsendmany2notevalue) assert_equal(self.nodes[3].getbalance(1, False, True, False), node3mined) # Add node 1 address and node 2 viewing key to node 3 @@ -129,8 +129,8 @@ def run_test (self): assert_equal(importvk_result["address"], myzaddr) # Check the address has been imported - assert_equal(myzaddr in self.nodes[3].listshieldedaddresses(), False) - assert_equal(myzaddr in self.nodes[3].listshieldedaddresses(True), True) + assert_equal(myzaddr in self.nodes[3].listshieldaddresses(), False) + assert_equal(myzaddr in self.nodes[3].listshieldaddresses(True), True) # Node 3 should see the same received notes as node 2; however, there are 2 things: # - Some of the notes were change for node 2 but not for node 3. @@ -139,8 +139,8 @@ def run_test (self): # Aside from that the received notes should be the same. So, # group by txid and then check that all properties aside from # change are equal. - node2Received = dict([r['txid'], r] for r in self.nodes[2].listreceivedbyshieldedaddress(myzaddr)) - node3Received = dict([r['txid'], r] for r in self.nodes[3].listreceivedbyshieldedaddress(myzaddr)) + node2Received = dict([r['txid'], r] for r in self.nodes[2].listreceivedbyshieldaddress(myzaddr)) + node3Received = dict([r['txid'], r] for r in self.nodes[3].listreceivedbyshieldaddress(myzaddr)) assert_equal(len(node2Received), len(node2Received)) for txid in node2Received: received2 = node2Received[txid] @@ -154,16 +154,16 @@ def run_test (self): # Node 3's balances should be unchanged without explicitly requesting # to include watch-only balances - assert_equal(self.nodes[3].getshieldedbalance(), zsendmany2notevalue) + assert_equal(self.nodes[3].getshieldbalance(), zsendmany2notevalue) assert_equal(self.nodes[3].getbalance(1, False, True, False), node3mined) - assert_equal(self.nodes[3].getshieldedbalance("*", 1, True), zsendmany2notevalue + zaddrremaining2) + assert_equal(self.nodes[3].getshieldbalance("*", 1, True), zsendmany2notevalue + zaddrremaining2) assert_equal(self.nodes[3].getbalance(1, True, True, False), node3mined + Decimal('1.0')) # Check individual balances reflect the above assert_equal(self.nodes[3].getreceivedbyaddress(mytaddr1), Decimal('1.0')) - assert_equal(self.nodes[3].getshieldedbalance(myzaddr), Decimal('0.0')) - assert_equal(self.nodes[3].getshieldedbalance(myzaddr, 1, True), zaddrremaining2) + assert_equal(self.nodes[3].getshieldbalance(myzaddr), Decimal('0.0')) + assert_equal(self.nodes[3].getshieldbalance(myzaddr, 1, True), zaddrremaining2) if __name__ == '__main__': WalletNullifiersTest().main () diff --git a/test/functional/sapling_wallet_persistence.py b/test/functional/sapling_wallet_persistence.py index 7f8523d634797..61c46530477a4 100755 --- a/test/functional/sapling_wallet_persistence.py +++ b/test/functional/sapling_wallet_persistence.py @@ -14,14 +14,14 @@ def set_test_params(self): self.setup_clean_chain = True def run_test(self): - sapling_addr = self.nodes[0].getnewshieldedaddress() - addresses = self.nodes[0].listshieldedaddresses() + sapling_addr = self.nodes[0].getnewshieldaddress() + addresses = self.nodes[0].listshieldaddresses() # make sure the node has the addresss assert_true(sapling_addr in addresses, "Should contain address before restart") # restart the nodes self.stop_node(0) self.start_node(0) - addresses = self.nodes[0].listshieldedaddresses() + addresses = self.nodes[0].listshieldaddresses() # make sure we still have the address after restarting assert_true(sapling_addr in addresses, "Should contain address after restart") From 7f37d7e6ab7658925081b7cfc160bd63641385f0 Mon Sep 17 00:00:00 2001 From: Fuzzbawls Date: Sun, 20 Dec 2020 01:38:00 -0800 Subject: [PATCH 85/86] Only use one set of parentheses for optional arguments Github-Pull: #2086 Rebased-From: 51db2881d1c8ef424e8010b12975865fa5651a8f --- src/wallet/rpcwallet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 2d06d3131c972..1150fcd47ce3d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -1677,7 +1677,7 @@ UniValue shieldsendmany(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 4) throw std::runtime_error( - "shieldsendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n" + "shieldsendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf fee )\n" "\nSend to many recipients. Amounts are decimal numbers with at most 8 digits of precision." "\nChange generated from a transparent addr flows to a new transparent addr address, while change generated from a shield addr returns to itself." "\nWhen sending coinbase UTXOs to a shield addr, change is not allowed. The entire value of the UTXO(s) must be consumed." @@ -1719,7 +1719,7 @@ UniValue rawshieldsendmany(const JSONRPCRequest& request) { if (request.fHelp || request.params.size() < 2 || request.params.size() > 4) throw std::runtime_error( - "rawshieldsendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf ) ( fee )\n" + "rawshieldsendmany \"fromaddress\" [{\"address\":... ,\"amount\":...},...] ( minconf fee )\n" "\nCreates a transaction sending to many recipients (without committing it), and returns the hex string." "\nAmounts are decimal numbers with at most 8 digits of precision." "\nChange generated from a transparent addr flows to a new transparent addr address, while change generated from a shield addr returns to itself." From 9390f8e7f895e69ecccb06af039241614718f40d Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 20 Dec 2020 17:55:09 +0100 Subject: [PATCH 86/86] [Refactor] Pass caught logic_error by reference in CreateSig Github-Pull: #2091 Rebased-From: 2523f81354f4a5c191273cc8edd4ed9a2aac9cc5 --- src/script/sign.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/script/sign.cpp b/src/script/sign.cpp index 66dc38e95d921..1202df17b136e 100644 --- a/src/script/sign.cpp +++ b/src/script/sign.cpp @@ -27,7 +27,7 @@ bool TransactionSignatureCreator::CreateSig(std::vector& vchSig, uint256 hash; try { hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion); - } catch (std::logic_error ex) { + } catch (const std::logic_error& ex) { return false; }