Compare commits
6 commits
master
...
add_signat
Author | SHA1 | Date | |
---|---|---|---|
|
afe3eec551 | ||
|
eb810178e5 | ||
|
30f8402629 | ||
|
50f32d0e66 | ||
|
6697207ac1 | ||
|
92a3df1571 |
84 changed files with 755 additions and 716 deletions
|
@ -41,7 +41,6 @@ BITCOIN_TESTS =\
|
|||
test/blockchain_tests.cpp \
|
||||
test/blockencodings_tests.cpp \
|
||||
test/bloom_tests.cpp \
|
||||
test/Checkpoints_tests.cpp \
|
||||
test/bswap_tests.cpp \
|
||||
test/checkqueue_tests.cpp \
|
||||
test/coins_tests.cpp \
|
||||
|
|
|
@ -62,8 +62,7 @@ bool CClaimScriptUndoAddOp::supportClaim(CClaimTrieCache& trieCache, const std::
|
|||
if (LogAcceptCategory(BCLog::CLAIMS)) {
|
||||
LogPrintf("--- [%lu]: OP_SUPPORT_CLAIM \"%s\" with claimId %s and tx prevout %s at index %d\n", nHeight, name,
|
||||
claimId.GetHex(), point.hash.ToString(), point.n);
|
||||
LogPrintf(
|
||||
"%s: (txid: %s, nOut: %d) Removing support for %s, claimId: %s, from the claim trie due to block disconnect\n",
|
||||
LogPrintf("%s: (txid: %s, nOut: %d) Removing support for %s, claimId: %s, from the claim trie due to block disconnect\n",
|
||||
__func__, point.hash.ToString(), point.n, name, claimId.ToString());
|
||||
}
|
||||
bool res = trieCache.undoAddSupport(name, point, nHeight);
|
||||
|
|
|
@ -2,16 +2,16 @@
|
|||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
#ifndef CLAIMSCRIPTOP_H
|
||||
#define CLAIMSCRIPTOP_H
|
||||
#ifndef BITCOIN_CLAIMSCRIPTOP_H
|
||||
#define BITCOIN_CLAIMSCRIPTOP_H
|
||||
|
||||
#include "amount.h"
|
||||
#include "claimtrie.h"
|
||||
#include "hash.h"
|
||||
#include "primitives/transaction.h"
|
||||
#include "script/script.h"
|
||||
#include "uint256.h"
|
||||
#include "util.h"
|
||||
#include <amount.h>
|
||||
#include <claimtrie.h>
|
||||
#include <hash.h>
|
||||
#include <primitives/transaction.h>
|
||||
#include <script/script.h>
|
||||
#include <uint256.h>
|
||||
#include <util.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
@ -242,4 +242,4 @@ struct CUpdateCacheCallbacks
|
|||
*/
|
||||
void UpdateCache(const CTransaction& tx, CClaimTrieCache& trieCache, const CCoinsViewCache& view, int nHeight, const CUpdateCacheCallbacks& callbacks = {});
|
||||
|
||||
#endif // CLAIMSCRIPTOP_H
|
||||
#endif // BITCOIN_CLAIMSCRIPTOP_H
|
||||
|
|
|
@ -4,11 +4,7 @@
|
|||
#include <claimtrie.h>
|
||||
#include <hash.h>
|
||||
|
||||
#include <boost/algorithm/string.hpp>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/locale.hpp>
|
||||
#include <boost/locale/conversion.hpp>
|
||||
#include <boost/locale/localization_backend.hpp>
|
||||
#include <boost/scope_exit.hpp>
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef LBRY_H
|
||||
#define LBRY_H
|
||||
#ifndef BITCOIN_LBRY_H
|
||||
#define BITCOIN_LBRY_H
|
||||
|
||||
#include <chain.h>
|
||||
#include <chainparams.h>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "nameclaim.h"
|
||||
#include "hash.h"
|
||||
#include "util.h"
|
||||
#include <nameclaim.h>
|
||||
#include <hash.h>
|
||||
#include <util.h>
|
||||
|
||||
std::vector<unsigned char> uint32_t_to_vch(uint32_t n)
|
||||
{
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
#ifndef BITCOIN_NAMECLAIM_H
|
||||
#define BITCOIN_NAMECLAIM_H
|
||||
|
||||
#include "amount.h"
|
||||
#include "script/script.h"
|
||||
#include "primitives/transaction.h"
|
||||
#include "uint256.h"
|
||||
#include <amount.h>
|
||||
#include <script/script.h>
|
||||
#include <primitives/transaction.h>
|
||||
#include <uint256.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
|
|
|
@ -3666,7 +3666,8 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
|
|||
if (state.vBlocksInFlight.size() > 0) {
|
||||
QueuedBlock &queuedBlock = state.vBlocksInFlight.front();
|
||||
int nOtherPeersWithValidatedDownloads = nPeersWithValidatedDownloads - (state.nBlocksInFlightValidHeaders > 0);
|
||||
if (nNow > state.nDownloadingSince + consensusParams.nPowTargetSpacing * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) {
|
||||
auto powTargetSpacing = std::max(int64_t(2) * 60, consensusParams.nPowTargetSpacing);
|
||||
if (nNow > state.nDownloadingSince + powTargetSpacing * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) {
|
||||
LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", queuedBlock.hash.ToString(), pto->GetId());
|
||||
pto->fDisconnect = true;
|
||||
return true;
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
|
||||
#include "prefixtrie.h"
|
||||
#include "claimtrie.h"
|
||||
#include <prefixtrie.h>
|
||||
#include <claimtrie.h>
|
||||
|
||||
template <typename TKey, typename TData>
|
||||
template <bool IsConst>
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#include <validation.h>
|
||||
|
||||
#include <boost/locale.hpp>
|
||||
#include <boost/locale/conversion.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
#include <cmath>
|
||||
|
||||
|
|
|
@ -436,9 +436,17 @@ CMutableTransaction ConstructTransaction(const UniValue& inputs_in, const UniVal
|
|||
throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated address: ") + name_);
|
||||
}
|
||||
|
||||
CScript scriptPubKey = GetScriptForDestination(destination);
|
||||
CAmount nAmount = AmountFromValue(outputs[name_]);
|
||||
auto rawAmount = outputs[name_];
|
||||
CAmount nAmount;
|
||||
CScript prefix;
|
||||
if (rawAmount.isArray() && rawAmount.size() > 2) {
|
||||
nAmount = AmountFromValue(rawAmount[0]);
|
||||
prefix = ClaimNameScript(rawAmount[1].get_str(), rawAmount[2].get_str());
|
||||
}
|
||||
else
|
||||
nAmount = AmountFromValue(outputs[name_]);
|
||||
|
||||
CScript scriptPubKey = prefix + GetScriptForDestination(destination);
|
||||
CTxOut out(nAmount, scriptPubKey);
|
||||
rawTx.vout.push_back(out);
|
||||
}
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
// Copyright (c) 2011-2015 The Bitcoin Core developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
//
|
||||
// Unit tests for block-chain checkpoints
|
||||
//
|
||||
|
||||
#include "checkpoints.h"
|
||||
|
||||
#include "uint256.h"
|
||||
#include "test/test_bitcoin.h"
|
||||
#include "chainparams.h"
|
||||
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(Checkpoints_tests, BasicTestingSetup)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(sanity)
|
||||
{
|
||||
//const CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints();
|
||||
//BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate(checkpoints) >= 134444);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
|
@ -19,7 +19,7 @@
|
|||
#include <rpc/register.h>
|
||||
#include <script/sigcache.h>
|
||||
|
||||
#include "claimtrie.h"
|
||||
#include <claimtrie.h>
|
||||
#include <boost/test/unit_test.hpp>
|
||||
#include <boost/test/unit_test_parameters.hpp>
|
||||
|
||||
|
|
|
@ -15,5 +15,5 @@ RPCAUTH=@abs_top_srcdir@/share/rpcauth/rpcauth.py
|
|||
# Which components are enabled. These are commented out by `configure` if they were disabled when running config.
|
||||
@ENABLE_WALLET_TRUE@ENABLE_WALLET=true
|
||||
@BUILD_BITCOIN_UTILS_TRUE@ENABLE_UTILS=true
|
||||
@BUILD_BITCOIND_TRUE@ENABLE_BITCOIND=true
|
||||
@BUILD_BITCOIND_TRUE@ENABLE_LBRYCRDD=true
|
||||
@ENABLE_ZMQ_TRUE@ENABLE_ZMQ=true
|
||||
|
|
|
@ -1,117 +1,117 @@
|
|||
{
|
||||
"blocks": [
|
||||
"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4adae5494dffff7f20020000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000",
|
||||
"0000002006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f1cd16b94f20a8a3dda91027c888025f2ec1a07ddcb2786bdff5916e66c00406f194ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002014341131c18d3b3aa30056a0f7a97c9ac852d3fd0ec9c76f7a25e83c01e7f821bf83574fb606f25c59200c844443201faf923ef5284fd4401f3104a323c601491a4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002078616da95299bd42cd8f813c8043816ec5741de466be3162e16bfff471808461f671e694afaf534d37df484f1990fc19a65fc26964b38141b7f8ecf61b8a50241a4ae75affff7f200500000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03530101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020a08613f37d305835a3a1553e77a479eba0f34c06c52e429ece54f5973cd77a7086a1efcaf75f1cd5be2c9deb6a7850225757a2cfc3031a91cc1330b3af4acc891b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03540101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000203b304fa1ce0505c2366982939ac148d9124c5ac747cc9aea133cea9916484966305de0e8d049f2be65c68d64d2c45746def5a9b4fcb8e298692b53b83b4690241b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03550101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020fbdf49978ec4f0b23704b6772a614336872587e29c463f375836ffd775248837fed9f3fdfc33f076c6663ae78070fad7263c1e24161f3ee1a4857b8931815e2c1b4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03560101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020c37548b9ca256b9ff17187d4d4309cf3143845b0a5811d3ca5427b2fddf000731a10985dfd473561c070c3527c3fe3941834cf51b3dfbacb501b44c69c9745ce1b4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03570101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020383dd3766c0675440f26370ad62d687e335ea3a650dec9b02fe544107cc1823a13b98696d41562945457d655f4c6921f736068f7a72afd1ad6b335f2857d16631c4ae75affff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03580101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000207476dd96d81f53e63934ce28c9e89022e0f24d040ec3c838443e925fc3a2f230a94d0cbcefb4a151191dd7664153944d9eee3b7b46d4ba997f397ed2b72c3afe1c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03590101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000209e425c73eea16cce98c0d47d6070aca29f0524eab4b97af84c386aa5322dd43055002f097e929bc6ad88ce869968e1b049aab7f6e45a5b869cf4349afd5d43e01c4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035a0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000202090e16a514fad40386413a100bbaa4fc14086a8d3501ac64c91fdef922e834a369e409444d0ec496eb0dd9a47f1fe81a7ab974bab28c50a912b994acf13b5f91c4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035b0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020777b767e42624c52775b331f19e81ba03be2f51a0608166cd5388c1a47d5e776473570bb9bba553a7db4a9a3083533027c54af1fea3ef6ef67757ef2255d64631c4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035c0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002076bb2bf3251a51ec367a42f8584043171a5d53157394cd776ebd017e2982127653d953aca3e2217f56533c043c07b9a926a30672ebce2562f1d06a6dc5044e7b1c4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035d0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020e6d7f02292655b73fc1f1958b09633ba07265d71d2a2784060b354cbbf1900202e9c9b02b63170002a94a0c9d8d787e2faa4c074a1ebdeb2855555347321dd101d4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035e0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020d61f077b0ed326e17f0a3d5af3fa876b72b434a252c9c3248d20130ed744287fcb10da470222dd29c7a07e2da7eb25d6499ed3919676df89cc630bd1b23fbb411d4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff035f0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000205efa9741cf51533ed6e07a97c71768372f53ca9c6df83894d64fe94c718eee23a207441e79ecdcf99ef3326385f5f675e2dea84c85ab8973219c63f92847ed5b1d4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03600101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020368386b0a0f46b2a2c4648eb9cb5dd1380c4f22e437e0bd49420670993361e5b9026632c2ddbb4b31b3c3118c51e43ea4d78e05c0aca0956278ead26a263d1521d4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401110101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020dd0a1594bbff6345a3e34f326e5ee605c855f5e0a5c363fc39615a8b1539b736200b51297dbee4aadf9b536cd2afe7617651e0a1d0f0610f436518a2a4dc54621d4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401120101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020f302a1092709dc27a32d7229d391b90824a75828692c4bb2ca8f0ca5c88b3613c2e18797ffe8b367336338f90b2cf8c3f66277eb1e1ddbe18c052977294f10691d4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401130101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000203dcc77aac703a8cd0e799384b74383c1d5f236426f77d516694607fc88fe85581276a20ceb98d02e6355c9dba4312e2fdc9832f4302cc307e1263f2df0aadd6a1e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401140101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020dfe109704a0b2801aee4232c31fb744145a7c80dd91a7727e16d4057719d5c3730f8296243521d82d96ed75c5af800a722fc9dde2e02af95c8c9822190ba07b21e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401150101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000201ef9ef2699bc36fd646bb9ba8629644bc98396122f6753710caf0315d7539f751382d3d85f17eb8b42cf17e54baa327886dcf6fa63207e097df8f9b84cc5422f1e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401160101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020834c91f23cd91b727be08b892f1c1a2f33c1e66d66f35607925fa1be4bca2c25b4145a73b1c71b945f5bb9ede3d8d95c9a3b12a0a81b7b14f440ec5146dd4ec71e4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401170101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000205743202bf1e543a9be2a59b62be6a5a494511fab96968007b8d7199ea60a524697227ba473ceaf48d4f48ee17f8ee6cd2f1f5ddff03a641642ece240e7872f8f1e4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401180101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000207469f5c1841bf57275d82db23e5a8f0e8512af1eb10119c238519cdd6cdced34fd96dc659a874b3f5d30fbe6ea421a6b9791dfce8450f8851e4b90d80f0f794e1e4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401190101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020b6338f55fcc473b744d53d675b4a83dcd80ddec9d02ad3323cf1ff50ac0412239d986ec20885d772fdc67803273aaec43871426ac93d3815846a8cd13dea5af11f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011a0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020a19d9edf2d22415cf226b4e1416c8a3097e0af222efac2bfeab15fa1f07b3f24c18580c4004de6d6244a30ce431c4be3ca44731509fc6b11710c792efed5e9191f4ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011b0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000208f9f29a27424ec01ce77485617088506ca8faeef69300f0a474ad63ca5d32972d6049609fa3588d6ffab4d9d89a90636ac94c0ca1995f7768163abeb25dbf2bc1f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011c0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020fbd87d530a9ec3835ab579337fd16e512cec6c4779ab4d84e7256b3333dece28de1065c8c3d3d166e057139ac59af6f4f2c0d241b6269bbea6f61c5eff3dba431f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011d0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020dc6ef4f436baab2d6880f242a2588313a2739ac694e30319344045ee318c9524d0ec7fbcaca30ce85392cb03b64015ece769afb50fd07db05c15ec49abf7d71c1f4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011e0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020386bf4cbb3708ae6345b9f2459bdd99d07422b05f9b005d2d4d1d3bf87d47359ebb22b3a15c8e94ddd8129527873b9bebfa10c54d11196961376efbcaad3c4681f4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04011f0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020600e892f12ad82a23ce12684d3ffa0887eab5e3e97804fa651050b23366cc55ef2468e65c3d3cf49650657eb47d0b0b7949c71dcc0922eb824523157b7eff478204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401200101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002068e4aec52a3f4e44279e3a65cd476237bdfcc2328390bb31b8a903f89ddfa70e8d669f61b469acb31b1d4ecdc238e6616a83a30644a5d06fc2ca1aad6449d09b204ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401210101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020cf2428ae9a5014b910275807f54a8bbbeec47d462f9d284ada60329b4955ff10cf83c44ddde39a709aef54fb302c7f1cb36db8fe7c3befce20dcc3729767518c204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401220101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000205801eef8cca082407ce4798648c4d3ba0fc4dd2d4459eccfe5300c7960760d16cb3dd78a2f22fb88717a175e45c53d34f970b94ef9f7cd1b6c279294d427d163204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401230101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002088320983a4bcb95b9f342994c6943c227f3102d3b16282f048ceb8e15748662a52d1207591a0a364bc9245a76e36530f147ec4d1b4e1917676b4071f542c3b19204ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401240101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020acd85b6d8087d3b6bd2a208a2e39b75da459c0e0eb14088075a23a2e043e8a4ed5a1754491f8180d293b42e6c04ec3f82e29c1f2600dc8607616f69a4a464e6e204ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401250101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204873bcb379f78da4497ce1e22f6bfb63537b89c8c522257a7b7bef74e515ed1b6b235faab048fa73a76c68fdbdde6a4ee7ebe0a3b7b23df24ce75dbd2cf49c33214ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401260101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020a87f6d13bae8e2e07996c3316e8e0da6aec7d1aee6b80aa5883018e4d136db3e9a498ff7d322ad93863e0a5318af7e7d0ed683fd2e4ecf523f2b7369106dbe4a214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401270101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020d9b0618450a51c08f43187c479e20d351f0466464409bb3071dc0af7c51d65498a198cef23dddd2c4b93d9d3288ae922584e221a9ef1ded3dba5a2ad494d9237214ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401280101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020167dff31847b8dcad472bb6bb7d0af53b245f0f1d4c9f83d4ce14a0f05d42d7f0f2638ffc0e6896230f28df1865ef133dccb1f027545c6a1177dffd1fecf8a01214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401290101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000208236c04424573692504e777e179b9247e54622b118239311413812f13cefbf6e39a639143f599dc76208b2014de12a364716df2918af9186453e3676dca743d7214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012a0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020fab7b55aeb59f63315dbc10784c55e55635a7600cc4f3b94a00003007e7fc90b4af016248e9908882f8a7f0bd8743c8da82da119446e8b02e4d3b8d1d938a3aa214ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012b0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020794b4160d8fd4ebe7611d0fc9d3e04f3038a485669f74075aa153852ed181121c577f4c0b7151f6d78a16e3c21ab291b53ced8a5c4f05a22caf24a25ed029d56224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012c0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204a8acdb549d2ed922360ae0e81de6c913c3fd84b0de51abacbf97162a99f7c26c656b252d3259c33ffc7e5d403843accc6ace9b7e60e911e2347a6a0b0abd122224ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012d0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020dee6d00c7058b3422e4273c98c16181e04ea93116496a8442de546c2ee9fd86b550013f39e004b3829dc3717b17fcfedc87de9450315fcca540963119cb264c1224ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012e0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000202ebca471f5fb2226a790233c3d0bc323f73d935872f3e15b66bd5fdcb822101d7b68788ed61d3fb8cb746f627e09db2fc09d8a07672747709d92ae400e053e78224ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04012f0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020ee500470fc1c71a82f2cbb9f8d5723bcdf57b8051fc458a8dbd8d0dbf60d0e40d1a0be0e50f3312d4830e3900186e5a6760d44006c164b4f0758218ef2b2de8e224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401300101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000205057e8d8a7451d79325851dc8e0f4dfdb1dfaaab637509d9e61f0e064af5ee5c185221c53c0cf43261b3c238c0e8117da5d6ac60085615f7a3d8027726cb2143224ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401310101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000200907f01d9c5c872296796ca77feb62eb414cc080e13a93e59e181528bc19c336eaabacb1ebcbd20b26f6bacdc712ffe17d4c8131e7f99b9cac309c0683737c04234ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401320101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000209bd6a4ec962d9e6199c0a2f39481a7ecc322fedbd2320cbe7dc984c6ab958421fe7a5c7f2513a3c3de9ddf7b211f5bfe85675b31183c4bb98ae79ab28cd055ac234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401330101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000202b8a6381b7c9476fd77be379a929863db6b7edd9858d6eca0f68a430dc87cc3a9c6c8b34bfadfdacbe95cb1d4ae5ce4e4f4ccf0300171d7a91cdc97f620c7b37234ae75affff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401340101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000203d3e9a0b4decf12b4402a2178b60599311c8a9c7d50ece365a61ca29530da7056754ddf7d77a11cc8ce680a74fae01d851bda024fc9c51712c55b4a190caef24234ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401350101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002067fa05082d4f7a29a3985f30798940cd854c76a2b20e9560b2047f7753193f71ac61b8df17a8a63f099c8f55869301fc2a0aa37355a4a2f89078135ee72a1362234ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401360101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020249684272865fec3ad62ecb73dfd930500e32e475306c9e5d4b6d545e3687b0a48deaeebfafa213f0a560994b3f4000d5e2b93951d7e5be40073503877292dc7234ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401370101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204671db1df91098669bb03c3e8504d432da99853601366c7de7585bb8f23a6e1e2996a16c11a0f9ae87d937f566c8bbd919040528c1bf8dae4e22a8f0ac5f935a244ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401380101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000203046500cabfee552ed114c505279cd75c28faa811adcb5010c53c14df5de3216d265321a4168c70fff1c85fd83bd976cc03c8c1fb6567398cc24053e343ad137244ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401390101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020591533cf8dd1fa1872c7e6d62ef714b28886f38f7921ee614e13b748eaf923282a96287277f18b1113a9c3ac384fd7b43bccd0e45114908ca5396a76cbd736fd244ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013a0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000205286b5747d0244a55e1dce435fdbb9f300d7138fff3b16767bc09196eb00256c6795e3f372a2d5d137244a4fd72fd799e8de913f868f22269eaa628d7d2970a1244ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013b0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000209649b55f6a5ff0d5db73aeb7089fcce605fb9dd23971e577b73747ffab586f4edf84581240223e2d8912a6eca049e06aa46ddbf271af08e9ac9605505311418b244ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013c0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020fe7ff82c11ad3a3db3dc11a03a67e0b86b727d232c80f37209b028bc2689296c0da76fb756e1c9833f38b198cfe843ab820fbc0c38e30f8f858f6ffdbd64e834244ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013d0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020c02e6109b6aaf6643cac109ad5b5be7f7ec47c7993335bdceea6e0e490ae9067eb1fcee49ecc40a61477f934e3b9821f2cc7ada429fcca2cd645866742854c40254ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013e0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020956c46fce0adfc8a30d91c7b7f328f17c2a90771083884c4fdb7f24640598f6fa69c4e5971bd3b6cdc7e3ee98e03a969b28c3220fdc685cc2eb77293763ca4ba254ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04013f0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000203eec7d0ea9c539f47e684eec9dba900e27c805b8200f237924c7df8065957726c83caf659fa341bf45f733a92cf76daf2cfb6bccbf969a2753f5f7d9cda4bd1e254ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401400101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000203c022b42283bf651ee4d536fe71b7e5382e9783d4a85f8bc159f00b97f16d82d312ac4f89f1b1496de576811f2ff17de44b512db0beddae59e030e2ce3eba4df254ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401410101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000205da9709dea4bea4f3229d0eed439a4820a0e817f9fbbcd8bb355cd8052702973403358080a2881b823a740f58b6b0c922b42189e06326478cc33390f2c704743254ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401420101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020447c49f664916cc13a839e27f7cbe0b09dea990dec71dd479b537ecfb771c7159ae6241727c2645ce00817909ba97d43447fe2e146bce55b7dccd5bcd27d2e3d254ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401430101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020ae3b214b1495953eea3b99af7ade4b8d22d615d598dd6c790c6576d6453ef35d37fbd3446f8431f00052f278c3e0359beba54a2f5064bc6be4990478fcf4e086264ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401440101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204cc68f9f571f59145e1f7505550d56da13a797fbc7e5a178dd7f6f9241d91f007f2400f7aa1b32b30bf869e4da86f75eaf2baae182efc45c42c6245f06aba675264ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401450101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002096d55714a83c3d030cc72141eac3577b8a394b8366b2c93354fcecdafeab025022f5e26de7e4eba3f8e4a09f243b55ea6f08bfd013e2051cf1d5df20dcb3331b264ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401460101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000202ccf49665bd46e4915dcc9221f5fc72124bb73fb11fed8869dc5862a47950c0d654693a1d86098212d68fa9a27f9df0faafea4aecebd8b203f2ab8f3f0b86196264ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401470101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000205d0be5aea546eab7734cbee757ea5f4983ab3a3f202323c1c88590bdbc8b561974cb0de6549bfdec92322ad53d8a4192433edab0e33a10e7561d2e27c7759f8a264ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401480101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020fc3d70d4f690d7d7da90b1c832a51c2a92940cdd9fccda6a909c7256ad567160550e1089b48fe75f0f1e6f712cc2a1d4aad384a4ceacf1c71576420fe8e7de46264ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401490101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020995ab1f2293e3aa1e7bef418919bdce60032e89e60223b8c12b17488c50af83b3a360b4f89551aa0ced646a6210b0c3d3f7d0464faa248b9d252c89615babc9f274ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014a0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020e02dd5e1201ebe7ef453e77df3021cffde1b5447b9eced017963489e005ac247e1f2b80e91180cd9744c3e126eb8a0fb34ced45587da6b0fa9fd1c6946f049bf274ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014b0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002081b265800d61feb37525c58aacc7e6d32cfc6b6579784f9952dca51c3addeb37da900ae4ec1b2075056001a361c0fc8f9ac1ca018bde2a2bd8fc587424dfe18f274ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014c0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000207daba0dc6fccc067a19dec46770d1443fc715b50540242ff26073a6748bcd9583804c315b783d4f9aac4dc8f109fa60bcbf1c3cf98a7e1e593fcb969e88aafae274ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014d0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204a35ab2d9c4656c4992d2445ee566e4f5cd0468358292c94839de2b270ba0628de9148db03da59ca2eb727a4f7a03f2b9ee1e4045f37bdaa4b75a89de56b63ee274ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014e0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020215ed7b31d118a45a06407133e41f3f9d25c913ff98f3e798144f981d9145305266efc9274f7c836aa0f8b831732aec2c1d85c5bb9176af4c889a707cca380fc274ae75affff7f200400000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04014f0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020425321a1f12ed4613b63b3cc5b4c7674242c3de67ea86984f2d9bb2766f6220a5c460ce6840832b7ef05f206c5d255bc2d8ea83753a7f5ef5c0bf3dbcbc7c74a284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401500101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204e088cfd312091bf589f0fc24131dba20ed83f716530a7b033356e9ec803be23a73c4af5b64fc631d20aa1f646c7c61c4cc5d4be6e2fa29570030d72219726a0284ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401510101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204287a2bf40300e39b45d6667d6e17abba37d98c41efc7023fd21b643fb2f6b76d915d10e1f9e224d3bfdf5203da57173f0b8d8eedc92ed9ff23372927e86073b284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401520101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002083137929ca902f409a1f35385b4d31e0f5163d488d71b00ade724d7831986a280a187c13fe0db45aed5fa4f5089d544a617da9f4f80fe6ce1d0711b228f3a6bd284ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401530101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020b38c074d78cbcc8bbbf20c48e30639c2dcf444488efee59f5aa01c48322a30418009c11df7e14de6a6d0d72cc22f20ff5fdba3a7dbe409409ff92b1302340fb8284ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401540101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020a6865148220c7f5ac3259f57fa381676d6be5fdab56eed8e060808fcce4118492476fe6d5ecc681e7a18c20a04239143de1c2cddefbb08f15153b8e9b0c22f62284ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401550101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020ae146263f4087106b8c51ffb5cdddb03a4e593ea1a22a8f6580eaa374185126db2187dbe694a1b17b7c5664115307965407274c25bf6ae02049817685f923256294ae75affff7f200600000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401560101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020718abe22705f33134812b56d04c129d453da890e27caf6e77d2bfb3f9be460083634f35fc8ea4a29b0f30d6c6b4926455a31de62d2f763bc95c8cd1a7a425599294ae75affff7f200300000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401570101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002084537c50520f4e6b0173926320c3193f6b4259c9a724fe202337d3d5cf7da70b1104e1d6f25c411165a856a0bfdd5ddbe168238425c05271962aa6e5ebb676fb294ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401580101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204bae65b948c9790468cfc8fbf78a81e7aec5407dbab18c18ef1ab37a13f0c257792cd1246dac5ce265a8439e539db1aebe4776535d422315bac8e57a51605aa6294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401590101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000201e68985b2a15920524c3c2da77354c0ccfb202c3ab4005128eb2743aa33f0a5b0527a624a6d1f808c896d8cd1552c251a4ae5310e6c62493977b0965d17f580d294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015a0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020ab1d90854505caa1ee748c1987f4cb6674844b84d17224bc3983fdd6e44a930b2edf3e5a90be7a9080ad15014ce796b38b6c19ddd3754443243fc277bcd2368a294ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015b0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002062242f316efa083c17e2173d9f9831afc1465f3fe84431d8e52fec71ae358b243e29246e0db770708987f2cff380920321636926d9c66c2c808d2d5f0ed27d672a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015c0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020258c1a9b0ca17819d8d7fea5178e9c72c2e7c6769696f70098e0d5d2a9dc0e5cf039f5f686d727c6158ef5405ee8794ec2f89c641093a1dff0f5240263a441bc2a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015d0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020434ce26cddae99571a1d663419d715f88e6ff0e413c45f21c44b1991d041fd2745534db221054e2233052aaffe7d7232a91b3f0918c14eac74b2f704b37bfb8e2a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015e0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020ec94475f112ea37dddd84f066e61446b431d28d2d9b6fbb336d16295e7eece52f1dc01abb3b27e71d8a25c3ed2d6fbbc5900bf954738ed63d57689ba5e68f6532a4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff04015f0101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000206188cca18a2be3b7f0b500a724f1b73312873488f04c5082abd81ca0b2250a75ec0efb2fa994ad23e1f39416e69976e66fc4ef9f101bd4f60fcee1f8c45a2b802a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401600101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000202384b91bd0bfb1385ef42bda9b2fa43930aa8889214bb14f63c61a74f380dc7f9d547f2925ad39b9161fa55b9cd258463fd058234778a7c7b3061113d64179812a4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401610101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204c266a3008c3bd95ae4bc8228bf878595cabf76cc2ef3fed32936777fe37833a1a13ea016868b2352a8d6d1eb35d0aee784cef06ed50655b8d84c089324351df2b4ae75affff7f200200000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401620101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"00000020ab2c78d1249de8482cf26bfb1616ac04f7b8404eafcae3e0654f398943fd41571b4d7549862be0b06ed1408ddc3e7c01b07af24c203a18fe9744e214b14d2d652b4ae75affff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401630101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"0000002031aa0fc5e0242a9c9d91024b6b7e67544da72c4773537f881ee5caacd45a3c38c650ff5fa0ffd080b3e5f9752527b718e8c6b731467028e14b0b009d4e7406ee2b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401640101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000200418c57609fc6ea3f24f569dc3afe163538a6aab940fe8c3d73c72cd781221380482c6f8ef2c19429da2f7a842bb811496aa86247c55f7ecb3337718b694d9472b4ae75affff7f200100000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401650101ffffffff0200f2052a01000000232103836d350d84c3782a7579c5f542c7e70fe628d3062c6bac563d2264c21e56f70eac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"000000204f36abaf10d6a8b3113103f3413475db0640c89a39f02a718e8bd2190fe87f1d6ffaf2b9fdbed67ebae4b36c97f9582814c99c90d0b5123f14da4861bf3e4f742b4ae75affff7f200100000002020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401660101ffffffff02b000062a01000000232102f6869601b2b9980b07fc047e309c1fc1433e08c5bf0498115c5c0e117ef59bfdac0000000000000000266a24aa21a9ed5896cd6a40cd126b09e317cbd179f39e2bcef2f9d423751d980258396416e671012000000000000000000000000000000000000000000000000000000000000000000000000002000000011cd16b94f20a8a3dda91027c888025f2ec1a07ddcb2786bdff5916e66c00406f0000000048473044022046d00465c4508cfd02fcb878b19d120e28be28e40658b1f15458828891ed1541022036aac054f36a42666dfb7b42a20506315a0b72232ce7704406e23c7a9515178701feffffff0200286bee0000000017a91481ddd4a9708ba8088cdcfeab9583ede8d83a298c8750bb9a3b0000000017a91484e16967722289584257803688aae36cd64480688765000000",
|
||||
"00000020cc7c39992f2dae21e0ebd958f6ba77a6d0bcc568e044b9b61ca4d77536a4214e7b4ade79dd733ea72d97993aaac27f2263b91b1500467350ff35ea40c2850d392b4ae75affff7f200100000004020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff0401670101ffffffff0230d0062a01000000232102f58ba54b2d51c4e2a6096f9d266261b45f1026a86ba88c29ed8070dfe3f5ec6bac0000000000000000266a24aa21a9edb824d92cb231c2366f0726aedf8bfc2705239a40ae6b10a106534e8b5395a09d01200000000000000000000000000000000000000000000000000000000000000000000000000200000000010196bac2a0f6212b8e5710f8c7214dd32c393d38d20b7703cf0b7b25276bb6ab8001000000171600144f8a6c8d4c6c309b1e2b725b7496859e172ea367feffffff02781ef5050000000017a9149f00bafb542049fe32d532b0ea7494ebb7ae41398750daa4350000000017a9147794e6dc43de332ca7a095e582478c331446686d8702483045022100bd85ed3954f1151c2fde32c4021a32c96d7defa4a57c14b1a056be9b361a8e49022054947bf6fdb535c46cbee62efc1262cc0389a6eaa19afbcfa98fb1fb30c3ef230121031b2371df07fb88dddf590b246dc74defc265fdbfe258e4b168250859b806f5ce660000000200000001bf83574fb606f25c59200c844443201faf923ef5284fd4401f3104a323c601490000000049483045022100d1c4b09b488f6375ee4540a531a13b5549e88e2459bd88c84867e293c54862740220222e8af70c8d8b1139c2a7b616d9132bde94244edca7eee3c7a783b12839dadc01feffffff0250196bee0000000017a91490e5e33cfedf18d5cf911d6f853770c62e1f5d028700ca9a3b0000000017a91422311ee58518edf3a2289012461dc66bc8739d2687660000000200000000010196bac2a0f6212b8e5710f8c7214dd32c393d38d20b7703cf0b7b25276bb6ab800000000017160014b81faaafa52f7723f539f8d595147b1a112b38ecfeffffff0208bd9a3b0000000017a9146b2e611708a94d9c674dd08c7c4c1fbb97bcdba987005ed0b20000000017a914933a20f07bab1d8f341f391819466a271f0cfd648702483045022100dfa8b0052c7825e6abcea05d10fc82550a8d6538681ffc8188d48ba789e4d9b40220697371cdf527a6ecd1887f87da3c87dca3419e4a1aa2683e5c4e035199084d100121021cc37c2ec090f30ea0b49508ae8a7d65d9759903932666da56671c1faa445d5d53000000"
|
||||
"010000000000000000000000000000000000000000000000000000000000000000000000cc59e59ff97ac092b55e423aa5495151ed6fb80570a5bb78cd5bd1c3821c21b8010000000000000000000000000000000000000000000000000000000000000033193156ffff7f20010000000101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff1f04ffff001d010417696e736572742074696d657374616d7020737472696e67ffffffff01000004bfc91b8e001976a914345991dbf57bfb014b87006acdfafbfc5fe8292f88ac00000000",
|
||||
"000000205675686976674f50a0a1953d172e9ecf4a4a621dc9a4c3795decd49912cf3f6e9c2646796e96a45b91dd9199a449736bd9a78880936306be5f125a7ebcbc69e4010000000000000000000000000000000000000000000000000000000000000045298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002062b18e4b01940481bc4d3dc3d49851177ae06fbb651e9027f35acb15046499556f9c965b9b8c109db568d32d7d3a0dd7ee4d132490f42b51f4ba2652fec7bd1b010000000000000000000000000000000000000000000000000000000000000046298e5dffff7f20050000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03520101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020206689482dff24cf7b740fec087fded521465ab6e902d44b9edd81fcbed205189bef9d4d146ce1baddb2e321b6cd48c7ff10d1a9c24c6860f195710575a2168f010000000000000000000000000000000000000000000000000000000000000046298e5dffff7f20040000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03530101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020af6bafcae32d53ed80d5ebc76ff7f8f6ae33ee1e1d111f1581cc6999242035d4b06a8e0c34b018cf12ce80647162741e7151d6a64af60e8d93e4642510d320e8010000000000000000000000000000000000000000000000000000000000000047298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03540101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020917411a2c128c8d514268810af750a485ca175000082b6925beb4217168de79d2bec9aeb4b9ecbd4205a11951a4939402524dd8e9d8f982d4f12d01b300af7de010000000000000000000000000000000000000000000000000000000000000047298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03550101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020e8881b5ca1d771630f7a16590c05a269f3fde4d548b21c056105aaab827dd7bff4e300719036df10ebb927cbd6b5005003807a71427b8a8a433597a14743b3d2010000000000000000000000000000000000000000000000000000000000000047298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03560101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020cd187a1c21cc697ea2a8b12767900ade0c50537666e2d9f0612cb568b2809cd205477c5c00c155eadd3f24a662b9ce3d45e94714fa6680514e84ce81dbae641b010000000000000000000000000000000000000000000000000000000000000047298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03570101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002046925fe8d280c0ed84269e7d2f6fc75e0989f5b12a8329c9d3750b204af1e231cde3845b2f0b31b6adb93e0e3a0a4546010a9f70d9edd2d3945b44ddfd1f3286010000000000000000000000000000000000000000000000000000000000000048298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03580101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000200fa35702ea19e64830a09274eeaa84376257865960d42ef686c7ee036aef79ab9eadc578fb13d50e5f392884a1c2b5d5558bed09dbd573af82f3a3b2203918fe010000000000000000000000000000000000000000000000000000000000000048298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03590101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002078a772ace3aaa0ee543c1e039c0fb298f57cfaca055f53410fcabc7d593c6c87bbdeae34c9cb3617bc38e3ab0a43ffeb37c06b1d624d2e50d2f843c5f08fa507010000000000000000000000000000000000000000000000000000000000000048298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff035a0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002021307a96ba4a365dfbe87c8c99ba8c43bd89cc4092310bcec9ea6eadca718a35731fa75a0f07302b163ad8f680b8d557dfd0acf18280b4ebbc41e5e8515923fb010000000000000000000000000000000000000000000000000000000000000048298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff035b0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000208520fad5219fe882f6f0e5742d64624687a2fd5f1f4dced164594e8c51e886468757b56faabb2905c5c264ec6303e5df726e7448efb30e662c5eab6e4c19f5cd010000000000000000000000000000000000000000000000000000000000000048298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff035c0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020b6cae7e19f4ac24957a8f932b1da05d9abceec8875dfccec7c2b4d8af9f8d510140d54e8dbd0ea528aad963ea5a4036f7b050d8cea603b706e36bd9f6e601e6f010000000000000000000000000000000000000000000000000000000000000048298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff035d0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020f5e9391e41591c52889ad5e1bac5be8cb2c632592f13b039fa8f15dbe80083b9cf1a5a45904bda75bc081d78d370776f4a2d2bbe03dfe54e12cc26c6ab52b9cd010000000000000000000000000000000000000000000000000000000000000049298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff035e0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020ca24db3b830fadbd52dce722453f40433b3bd373a7b146603c489b8ec8eaf76a709f5659d1242f71629dc7b46dd2328add4f12672c3e4a0a6c002f9d220ef58f010000000000000000000000000000000000000000000000000000000000000049298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff035f0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002037920b818e2deb397ae1b6816e95c846af08dbffb9917c026c9004dd5bbb750d037207bdebdb719af94d699ed8b7f8443e0e49ee2857fa4d01c782cd6411e18f010000000000000000000000000000000000000000000000000000000000000049298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff03600101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020418ba5059965888fc5b34bc4f454da675e14b87c4e5936004e2be27ab1c754b1bfde5825b014d9b49397ea4a74800a7bc070ba26aaebb0fd39cc4aea79678290010000000000000000000000000000000000000000000000000000000000000049298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401110101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020b87c7b459c40c17e1767f2823772eedacd36dcbe923dbdb50a93d5a8c714c35bf50ca0b9ecbd902f0e51d28841871c5cee712f91dd8791c620bd223bdf0e6a33010000000000000000000000000000000000000000000000000000000000000049298e5dffff7f20040000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401120101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020c41716369b5eb60c987548f45fc79a1e0d92b32731e8652366ad884fad383a809e07104556faa0d9f6e4d7611d5868f7e7d46b302de2b0e45b322a487bf6c70c010000000000000000000000000000000000000000000000000000000000000049298e5dffff7f20040000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401130101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020684b238cbf19d1f77054be44701353eb7d4d8ebf56432a5e0b37cfc4b986e45b17549e75a37864a74ed7c3617e2f620da9c5c736762eb73b66bedf7bf79ddb2301000000000000000000000000000000000000000000000000000000000000004a298e5dffff7f20040000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401140101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020b6ef5783f5c123e87b11cb186ceb1d4cc7c3290e8e12165f1bfad7577b486c184eead20e1914c8090d7bab52dc4a92ae58ff97a029b6c075f1ca4abc30d6df4f01000000000000000000000000000000000000000000000000000000000000004a298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401150101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002096a670e039d621b147c4c68b8ece1d442502aa1b3389896e0a2c9ee24092bb2e155c431d467db173e369a59198b2bc50a16185f914306c3e032f42b24454440001000000000000000000000000000000000000000000000000000000000000004a298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401160101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020fde40a0ddb45461a36120b2300fb19ad701b93eaa2d99f8d7da85101fd80c5efc6455c8ecceb8d07485a799ea260e635528d863e36573023f9c1e2a3e8de2b7601000000000000000000000000000000000000000000000000000000000000004a298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401170101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000207d4488c7932c51ab2f922f010ceb3df5b4dec027862e57b8c244d42f5534c6c38e2190ef4d9186ca5ab6dac103432302c481be9769b9cf9fa096868e77a3764101000000000000000000000000000000000000000000000000000000000000004a298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401180101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020896b06cf7936eba3ca7d79470bcc2c290a1b15a3de06d1cd73b10a106b27f8fb49b54d8e2162871dc1c295f5163ad3df67d4a7a5cd43c800094ef1cb1e8a1b9d01000000000000000000000000000000000000000000000000000000000000004a298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401190101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020be9003ce95f64c98bf870555b9263304c546079dd3614a599cf07fb4776af3aa2e8cd162f0ae28e7a4fb10f173e44f80f1fafe36e35dc5a4a9b33bb7629e04b101000000000000000000000000000000000000000000000000000000000000004b298e5dffff7f20050000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04011a0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000205d826c945361bd5283024395ba3f07bc3ec107bc79407d8ae6891e08848dad96e30e56c9ab0ad1e6107d3f95b88004128a732f2589e2f2ccaef41c886b07abf001000000000000000000000000000000000000000000000000000000000000004b298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04011b0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020fb80b3a74bf9f8446419e32d172725c2edfd755283cad14f16c9fd8e0db8f63a8165ffe9fb63399644d6a3465b84972eba11a560ac2bb327f350b8c859beb63901000000000000000000000000000000000000000000000000000000000000004b298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04011c0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002026aafd727bc33bebb8c9d4c5c231edc6ad7f1b120416f6eec899345137155287da9b8b939a2e0dae1fdc57e8f051b847a898bf372632e47aa906852a445a24bc01000000000000000000000000000000000000000000000000000000000000004b298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04011d0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020eff266f8410f99391deffa0f2fbffcc2ef8224ba82d2f990711a28538c537e0094f83b6c8fada8283220abceb95e2180473f068ff096264a8f2bad31863152eb01000000000000000000000000000000000000000000000000000000000000004b298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04011e0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020ba106ca41ee82bbb2bc6d0fe05d495dcc62a0e23c9519edd4b2d7ec12a08d8510db06e473aec2b882def52f084b4b0d9f6265d47780c15abd54827df6c62fea601000000000000000000000000000000000000000000000000000000000000004b298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04011f0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020043eb2d4b22b694311bb7489d61bf58b66bc278ea260a48f834c2d4032e32bb311976be9aaf30c1d8d6a9723d210adce2b625c0a29947cd14953410e00642f7a01000000000000000000000000000000000000000000000000000000000000004c298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401200101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000207a1bce01ae3d23f10eb96c919d69bece9764584690aa62ac5e529f5b11e39c8a77679b50d559cbaac0040176e82355231529ac2f48de1d5983bc9366d4a1fb3c01000000000000000000000000000000000000000000000000000000000000004c298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401210101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000209afb1c2dbdb163ae0a769e6b0f45ce0a6120ae93e8b0cd9c3c324e680c368d0ceabbb0033eedd8bfe159ba57d523ece2b9d4e86c1754b09fca80e78890744a3201000000000000000000000000000000000000000000000000000000000000004c298e5dffff7f20040000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401220101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020139aab4d7175fcabb17a76c6660a2484d596a1a87b8794863aaa403015e794e9bda24098c56906da7fa1d0f104f3731e5d9ac14886148c7dcf728a562051dd0f01000000000000000000000000000000000000000000000000000000000000004c298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401230101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020433a8cf135270470d6bbd5c66751d8b343a26bf2e215b77b4840c07f8c2edb80f2e3a01d0db6fa8565e780e15d7650ca3913e9dc0a362bce208b69eee8778c6e01000000000000000000000000000000000000000000000000000000000000004c298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401240101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002058df283f1cab9904c9d31ea0c69ddcf0bbaf9059ef94303fa03e7aff67f90b656f4c2c390587d278e29453a773dda990246265d181a64b4f8de5f87e0b2d72d601000000000000000000000000000000000000000000000000000000000000004c298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401250101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020474409f36e71c4ae8aa34e5cf5e30edb96444afffccdc0adaeda4a5b33ac0edcc757ff2a006fa36785373524813efc635e42a8a6ffd7b30d87d7d45aab6473f101000000000000000000000000000000000000000000000000000000000000004d298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401260101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020b2a45ac6975c714b53f173477bd4d7abed2e131f6d1d0f36228a59d278a0803a362739c353a03108aabda333039e417365c29271b4fed1577ca88300a0f903e801000000000000000000000000000000000000000000000000000000000000004d298e5dffff7f20050000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401270101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020a2eb5532ba64f5b4980217cc53abc0122133b67da0cd15e27620296175b6773110d335e63a14d0c7f87360044640b2430f36d56dfdb51faa03a78f7b0682bebe01000000000000000000000000000000000000000000000000000000000000004d298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401280101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020703c37af817a6d6a5d4ea28eb8273dd039d3e5aad463d2079f7311e9f7ec0270d733d311164ef0c13d63fdc6ae1859a1212c77f6b99bc232502ab0f6e9c2463601000000000000000000000000000000000000000000000000000000000000004d298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401290101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000207016a47fdb3ad2dfa1f5dfb4d325d7397b48d773aa84e89e0e4fd1c86d1963867b121f48a0be5dff0406e4e5e3b84c9b9502f43610114a6937c12e4eba142e3401000000000000000000000000000000000000000000000000000000000000004d298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04012a0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020f17810d1cc695dfad2789149c9b21c90ed4f2a2663b33a9c1154763bf599601dad47e87a7bbaf33cc004e13f7a0722acc62755a69a666c24da7ba1f838e11a9701000000000000000000000000000000000000000000000000000000000000004d298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04012b0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002047e742da0f3d882548e333c5de9ba5c1e89c366b53de17e95f2126089b473f8d9927f26f88eec45759dc6d1f5a310b303a3dd7d113e1c7732a472a3163bb2d3601000000000000000000000000000000000000000000000000000000000000004e298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04012c0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020b74842271729497e94c33429c6e21ebfc46c82f587fbfaa91bf30a7fa1df77197c65d2b6735b85a3718befcf7a789df26bfaf929b32eec42594c94862fec6d7f01000000000000000000000000000000000000000000000000000000000000004e298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04012d0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020a3291c68b92c19bf503e3a48f89b3d85923d8d23791b3b77b541224be114da6f052f7b4a4a72a178fc26adf081cb28494d2e2386f42cb8fd3db9ff2da5f8a22e01000000000000000000000000000000000000000000000000000000000000004e298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04012e0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020b84c9aedee6173c6926b37c5c451fc0a9ae1bcf23508ac4de8b790befc65216665f48aa0f54655f985e9f1e3a5a58683d40b523ef430aae8593734171a204e9d01000000000000000000000000000000000000000000000000000000000000004e298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04012f0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020bd7b9820463851223f9543192c338fd3701c7998c823086951df721335665eb2d2d152c34514ff98c551509347d4415e8f7aff1f3639be677df20d03557ee9f101000000000000000000000000000000000000000000000000000000000000004e298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401300101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020a4f6ad65c748ab035e3d520f6c33ba047d28bdfdb6e5a0a4015a5a3a9e0f4ba0f79d7ae2f66ff289ff6b8f4ce435152f382d6d54285528b422a3d0c94ea9483701000000000000000000000000000000000000000000000000000000000000004e298e5dffff7f20030000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401310101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020fa467509059c29bc043e527bd38ca2620dc441145deed28a9d7865a7417ac5b8428f2c186fa501cc53f1e91972e0fb9ba8bc6ae7daebb54784cdeb21c5076c0d01000000000000000000000000000000000000000000000000000000000000004f298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401320101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000205dc60a8d80efe426d3dfcd8a5741499f9f7a0bebf5f9da39e6887d13a84690429f2c8e7a35b50bc86245a4250b3e3ce74d1ca128bb11ddf7da9fde9ca0f0c40101000000000000000000000000000000000000000000000000000000000000004f298e5dffff7f20050000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401330101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020ea09bbbdbb30103822f451568802e25341ead64a0538c529f8e3159d3f3162f57b7460f7b6ab41416b590f664473e0887b148f4482ab1842cdbcbfce807bd69201000000000000000000000000000000000000000000000000000000000000004f298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401340101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020d8dd90f93424b2fbbd10ef671d14edf5ea4727ab4e574126b9f7dab2a3ba17ac7a5412415fa65b28385e15f30c50202101d26aec4360f967e8449b15fc230c0e01000000000000000000000000000000000000000000000000000000000000004f298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401350101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000202e6425938fb77136939680c552a6be236e15ac4ed625998f63471227239c29d02dedb613647b0ad43c476af1b44286d66c2d09b94bcfb409bf9b078cddbd82ca01000000000000000000000000000000000000000000000000000000000000004f298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401360101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020267e25450655771ab9a1a3e04a65c184c728bd3cd9d325a347e2f8e339df2502951d2d58675bdd42d0485baecef3fd996220059a6c30e5272e92c35c0588506501000000000000000000000000000000000000000000000000000000000000004f298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401370101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020c3a96bd46f98c92a3311b8053980954f8d66c12581d3dc1eaff58d2cc2524377bafafac9739f3ad59b142347361e92c56a6a2433b96395b1f32ad070c940341a010000000000000000000000000000000000000000000000000000000000000050298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401380101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000206d0512cd762e3ac801a71b2a34440d54e879f20ec6ce46c1affaf500a6d473a2fc5485980b8c8ea92e2e021555c4c7d51a1bc1876ba159d268fd9b82bfa565da010000000000000000000000000000000000000000000000000000000000000050298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401390101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020b1fcc4dfb3c7234a37b412c53d7875f3904a8fabbc53e6371e5e4893bcf2637ae58c32587cef1ca2302eade194d66bc81f727204cf76e1d884d63f8d3939b358010000000000000000000000000000000000000000000000000000000000000050298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04013a0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020404faf641adf310aa8fc82b9cff35f33d4259583add438e565df88a6fa67855f0ceb812d629a05ae41aa3dd2cc8393f3043f5d038c5c39e2764d804ac3e8d8ae010000000000000000000000000000000000000000000000000000000000000050298e5dffff7f20030000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04013b0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000205e026a6a245be5cca56cbdff8bfb8880455aef0ace6bd67ec1b0b0756824325668b82f456bae643458146e4242df88046b0d39f5b80f4d3bce9619cd0849d43e010000000000000000000000000000000000000000000000000000000000000050298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04013c0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020229ebb1ae197e0626ead2b50480fa897c8aa13367999360d901a616a3d378aaeacfa4886f415f04cc0a86adcea8d5ceca8cbca31049f2986cca7e921732cb5c4010000000000000000000000000000000000000000000000000000000000000050298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04013d0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000201ff4b0bc9ac5207724a625f7116579f93c59e976ed187b9c9188336c75887b3b14931ab5dfef97c4a9bb83cd6994ee705bad1b2c2be7dc5ec8d1d70415867092010000000000000000000000000000000000000000000000000000000000000051298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04013e0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020f93263a21cd8b06dba37ae68182bebe2dc4884bd87f6bb90421662ce3517b7851bd25e4486ddb133ee285c31fd67dd0ab1fad43696ef3b9a7f258372afddd92a010000000000000000000000000000000000000000000000000000000000000051298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04013f0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000206e901e57352c9c935270bd33cf42b3aeca463290c264744b7593434a348b94286e21b29fddfee89035236430f0519fdde42edbba2cff3a69395e71ac0a8cc078010000000000000000000000000000000000000000000000000000000000000051298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401400101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020547e4b25278bef0b46c4ff096179c05a9ad25b1e8d735bab9109e5f9c625228f22aaf37d0db4e12ad40d286c0c210787d7b4e55fb1cca0e0756045183ddb7304010000000000000000000000000000000000000000000000000000000000000051298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401410101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000207d8a623bcfd2ca3da4a10d9842f18489d2e1b1bba5803d236f881aba3b152c7d1f41e6374dae64966b3791bede633c69a4a7c1a362ccfc232a47041b684655c7010000000000000000000000000000000000000000000000000000000000000051298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401420101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020e6f81efb92a28e66b65eab2dbccaf70570eb53d6dc5057e640e7a3cd14983b79f94c3177a4cd10e1b04baadf9ef3e97fee16d5787a5c6a4b6a000aeccdef7322010000000000000000000000000000000000000000000000000000000000000051298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401430101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020b318408ed77cfdd0e5c4106b3d963df17474289d7a94989fd51b3a62028f905db2c4447dbaa57602ce22c585a0203819ab96c932ac91d9908e288c501366ccd9010000000000000000000000000000000000000000000000000000000000000052298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401440101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002042fd200cbc0f6d5e21e753df0cf9b4bf411173188c5f629515dd9e438621873266e52da4579cf92d25016da99bd70854cfeefc787f89d291b647886a0f98cada010000000000000000000000000000000000000000000000000000000000000052298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401450101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002049a79824a608770beaefd83b6bf490c5205ddeb33bb51b63472945a62c2fa3d30208ffe437833ddb3df6ab62506b5c3f2d9b05f35bf029b64681edb499b79d9b010000000000000000000000000000000000000000000000000000000000000052298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401460101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000203a6ebcc5e5031f3a90cb145feb8614c922b01bca955e9878ecea00f6e0635f4a6e144c018c0a95e5d83473865107f0453b4d0cb2d655687bba38fa3c8664fe0c010000000000000000000000000000000000000000000000000000000000000052298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401470101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020d6990869ce59bec3a60675ac9e9997f147090869b1dd07be9e1cb2f94f28fe9c7d5e5f0cb033a158cdfa50ec6d5118d42ffb4d52284348bf0f68f0990db0627c010000000000000000000000000000000000000000000000000000000000000052298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401480101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000206515ed2b781786fd8bbd982a7e170776b0ea4320ced88972bd90649f7542231431b27ee4ea6d05f07887027356a76c5cce03375eb525fee6bde3b69656575882010000000000000000000000000000000000000000000000000000000000000052298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401490101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020f87d4477a677bd04749b9c52f7a4544ca0adc7150fd2f691e0d0930a09a7d1b043a9d9deb3739829c6fa8e8abc9c30573224e43f6c36ee103012f4fffbba2b9b010000000000000000000000000000000000000000000000000000000000000053298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04014a0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002027f74ac6b315fa990ff6fe9fd07966ee64c4d051e7ce92cad3dc84f1cbf2452bd1d0326fe6c571de5fb37707d8bbeb55b932f0b4ad89c506e414c020d5088e5f010000000000000000000000000000000000000000000000000000000000000053298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04014b0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000206c98fd30a20783935ace23743a8cb9a02e6eed8b508cbe16305cc685dbef0e2d12e5d1eca285a4ca2cc974ede1ca60fd35e5f04303017143fcc3ba710efadaab010000000000000000000000000000000000000000000000000000000000000053298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04014c0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002036d8823d48e38575bcd2b13e2fa89be8f3f581151e06be6545fbf67336a300ac43e661b5889f90f1511a72c2d6ff1ae990bf7fecc44d01cb08621c238bd8e887010000000000000000000000000000000000000000000000000000000000000053298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04014d0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020aabbc62ff10ebc5466db39bc4ba5acc763e854dd8a766d018d8341b5371cc47fe96433fea9696b53603cbacfad8d3808d70c681925606ef11be24c81388f556c010000000000000000000000000000000000000000000000000000000000000053298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04014e0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002079660b6b38721b49ef7e05a9ed78d3c11ce1af6a8dcb08a862f61e9513cc780bda411454214807f29a201bb710436eb95f153aafffaac1b9d29254ec0f39d681010000000000000000000000000000000000000000000000000000000000000053298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04014f0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020bd361170eecaa766944c2c22b54a2048ebb1ab4fc52837a66bad850479b9fd61e13cb2bd7da4f99412c40cb43227cdc0df404d977be0f0ae24c1804f661135a1010000000000000000000000000000000000000000000000000000000000000054298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401500101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000202bae167d754ca4b3ba9fb4bae2d452561a021bf64988bfc9dc11f05824bbab24c84a68a6d88174fdeb6863596ea35f97735b9fb80037a90fc512529731429b6b010000000000000000000000000000000000000000000000000000000000000054298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401510101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020ab2ecf71d724d650baf77cb63e108cd933e08ab1c3533ed5057730b52382d9e30ba6864fb662e379c2a2d8d64ba4c17ec8f183a2a0102c969893a813cd1c6e56010000000000000000000000000000000000000000000000000000000000000054298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401520101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020940d5c843cec6cb987d18506f44343e4176f54f0028720d7036d323fc8bd0f5f950bcc074e1ecd1b543e39872af433fc5575004fa96c8864ef5be3a7a8feecd1010000000000000000000000000000000000000000000000000000000000000054298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401530101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000200eff6985d00d2dae0c9ed5d8d9ee1d6e1742f7bdca76bdbcb68f8540203fe830704265dcfb6c95cb07fc701f39123a804fbdf59cc7302dc889a172070f6dcf0b010000000000000000000000000000000000000000000000000000000000000054298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401540101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020a2f82b9acba4b57dd50f4e63489138ee1af0d3fd956aea5f64dd6eaf5bed11aae43256d7f8457700b24f4057eca70f498a4669424a453c8b25ca53d5936caa74010000000000000000000000000000000000000000000000000000000000000054298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401550101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002076594d858f8491fdb94daa2c9f199690d0e4b1e10f49570cc63de870efdc7cdfe4fea89c7cacde1ce6a385f186e6ae2660d6f96ad1c5f65a55374e78f05c2088010000000000000000000000000000000000000000000000000000000000000055298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401560101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002073c9c91546655921ffecd56bf6c88a431569553df0514cd160ef6e648c3038208d170a1d6049197890ae215dee26eb1c4f56d3e72a9ff76d05028c522dad5df5010000000000000000000000000000000000000000000000000000000000000055298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401570101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000206f0a68329f9ec8b2212d92da2efd233cc287b92a6ad558ebd7c877d378382690e4871ece6f3dbb9510c7ec2f06264ece3d0d786924782cc87c880104797d308d010000000000000000000000000000000000000000000000000000000000000055298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401580101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020f95fc51dfaf099418f31316b0e2511a1381f292dc77d5cbcb323bc623736e47bab12001f519e5f29675f9723610c2adb06fc09a3433164183618af3d5f2d5d13010000000000000000000000000000000000000000000000000000000000000055298e5dffff7f20020000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401590101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020a2b24bcd260e921e21eaaa24f9ee49646a19ec90a2776e4d5569d1e4b96ae550ab283476b7512a414a45d0afd1067542aa21b35136858cc228f093b79a86a168010000000000000000000000000000000000000000000000000000000000000055298e5dffff7f20030000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04015a0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020f98eb5e8ea9b3a7e0e7b97d22dfc4940e81b3efa7a52b1ae984ae62d258eb6094f21c0bc0a6b5d04a200cd96e7afc8903f693c73841d7a7f46444061b87cf4dc010000000000000000000000000000000000000000000000000000000000000055298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04015b0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020c9b5bd09d4cdf36fd437dcfc6d467496aaf8a2a9b48a9109a6573d93ba1fe1dbd81b4c34fdc739646dc6d7652315e672df987039c108f21c6233a29ca6b0269d010000000000000000000000000000000000000000000000000000000000000056298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04015c0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000200643717cbcb0cce475b5f0fb63e56f1447799264726631396c30224bc7f798790c341d332c183b762fca8c54f6fe148772e0f9181dfea77974a3afb71a1052b0010000000000000000000000000000000000000000000000000000000000000056298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04015d0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020ac06f84bfaf2ceb8b19ead70177dbd6201387983d72a977da1f57ffd921a6783b2d5511af0de5e43edb43e0d766e1e70d0de2710f3eb7f89a10ad0f512648c46010000000000000000000000000000000000000000000000000000000000000056298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04015e0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002023f31418b84cfa73db871d97b08497af8cfc05658cc65baeb88140943a88985c0d7727f13069e326603003358d3618953e17ff6e4ffc8be096474d3512bad092010000000000000000000000000000000000000000000000000000000000000056298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff04015f0101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020a7c86fccf39d979b930e8e94061dc2ae1cb4af16c58557dc28ba136c2714196797e7c32249c1eaf9138dc9279cebf0189b61b6ba6e694af744f93949e0c531b0010000000000000000000000000000000000000000000000000000000000000056298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401600101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002015ab67be546784d304150d6912c3ad77b5135f06db0a82517f0e7bc7ee3c14ff9b540ec1386e01df66f097f37a57f7f777fe9a7605394d3c60b43e7a0f21f775010000000000000000000000000000000000000000000000000000000000000056298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401610101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020e5656df91c69f8a74de2002fe237014cb7ffba5c198f2740fab78b0e532e4b6cb1eee816671fd7ff909c68b67c86172a2840733837943c2b99f7b0232112308b010000000000000000000000000000000000000000000000000000000000000057298e5dffff7f20030000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401620101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"00000020c2f75754521bfd09fdce186ccee3de0724558ab0dd7e6d66aeb2c24ecd0b72c88befbb4db8b957c2de6545459d810bd8b316b48d13384cbc65417eb0053d9afd010000000000000000000000000000000000000000000000000000000000000057298e5dffff7f20010000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401630101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002068569744e5ad15456dde211456d1d6d88e8575d318cca972be4c4214802d0e8204d450ccd28e34284b290f457a24e62a1362f9a2f804d2d6b3be8b39b2512112010000000000000000000000000000000000000000000000000000000000000057298e5dffff7f20030000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401640101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"000000201e5bfcdf805e44ecf759571ab08560ad66166044be47696807937623b30faba39d638f685167f53a0b4683fe059370e1dcad605eabd79c4fc602980e5ff97db0010000000000000000000000000000000000000000000000000000000000000057298e5dffff7f20000000000102000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401650101ffffffff0200e1f5050000000023210375c6e5384af4df0ef340e9a7de57dee04253e470ab3752aa7ded36dcebe24183ac0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000",
|
||||
"0000002066bd635be5b553539cd953474c4907b44c7846a3bec06cea96c7258914d5509a430025a9bd953d89a962a10f81ad1a2b1559a5d94dd0bac31fc15967bd15d974010000000000000000000000000000000000000000000000000000000000000057298e5dffff7f20000000000202000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401660101ffffffff02eceff505000000002321032c6891656ef6cfc5b6c7b311133ea2bff07b890a029ced48ee51a2c90801b528ac0000000000000000266a24aa21a9edd2bfb4f47890a95750585964ee6f4f69555a306a4819f89dd72c0ff014839bb80000000002000000019c2646796e96a45b91dd9199a449736bd9a78880936306be5f125a7ebcbc69e40000000048473044022074058acb16acdc220b34b695668dfe5d2ed4819e2a11ab9c9c56a1c9bd7636d302205364ee6d261b725040255aaea5e11b618644642c8f9f718772fe3a7eaaf3787101feffffff02141e3101000000001976a9148b9217f042f56f05f71e20f5420f9fc90d32f87f88ac00b4c404000000001976a9145bb987c92e0c23bf14659cee81a90cf0c80cb03c88ac65000000",
|
||||
"00000020237f85d3c2263dd3d424076549ebc19656b3c724f03bfd9b527184b44e77a7ce15f37e2055a2c2feecbe763101c6f8a5850c8f1ae95eb2c100fc75c58e283123010000000000000000000000000000000000000000000000000000000000000057298e5dffff7f20010000000402000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0401670101ffffffff022c09f705000000002321036c9111e5a6523faa990b7452c2c88c3c5e22ef6d9ad5288637168a3b0ac9bc54ac0000000000000000266a24aa21a9ed3befd64d33a3d249c6882f1a4e08a948b03f848270c8d717889a0a914bbe989b00000000020000000129b86f6b974b8c38a47ffd1a97b73e16864a344fe72c7b20f26f3dfaeab8e23f000000006a4730440220450b9e79c405c5a50df883cef44073b5fe0f76a268e8c2617ebe84b67c7d61770220163f696ceb92ca0d798dd0a11ea1aa49f0403658097b56eb20da82c0b0cc99eb0121034107f19591db3b08fbef4c466b8fe5831c2cafeefeb55325ea191ae1c645b154feffffff02d47c1d00000000001976a9145f881a61d39c56d83ad6adc45e0dd5d87c48ea1488ac94991201000000001976a914be83ea53e1caef62a9da4ac46bee932fb6e64d6588ac6600000002000000016f9c965b9b8c109db568d32d7d3a0dd7ee4d132490f42b51f4ba2652fec7bd1b00000000484730440220727dd1aaf6727c76b3754305147de818ddd9b6cb7c7cb6669c5a235ea35b658f02202e8b340309ab3b2e937ff54bc5405670921a08498322b6acb03b14d570b1c96b01feffffff02002d3101000000001976a914347e511d57756463f6e298d1a545d19f657e3c5b88ac14a5c404000000001976a9146e6bd61c46f7feb09855769d1ed0206818deb88388ac40000000020000000129b86f6b974b8c38a47ffd1a97b73e16864a344fe72c7b20f26f3dfaeab8e23f010000006a473044022079dc6bfd6537301ca23178845bf789b3c34ab4f0b838f271f1526df41bc24e39022038b9b78a1554af83f4bc0616945b6af66e3e938c237553a76fd96f9074375540012102ffd149a0a5c08f0fb54fa934bb93786cda9440d3cdc09614b0f09cca5c435970feffffff0200879303000000001976a9148e6032ef5414a7d0a26b3d6be863827b5a3c82c988ac6c1b3101000000001976a914f843cea430f0ef2bd291f7251a6201cb2422809b88ac66000000"
|
||||
],
|
||||
"mocktime": 1525107225,
|
||||
"mocktime": 1569597765,
|
||||
"stats": [
|
||||
{
|
||||
"avgfee": 0,
|
||||
"avgfeerate": 0,
|
||||
"avgtxsize": 0,
|
||||
"blockhash": "1d7fe80f19d28b8e712af0399ac84006db753441f3033111b3a8d610afab364f",
|
||||
"blockhash": "9a50d5148925c796ea6cc0bea346784cb407494c4753d99c5353b5e55b63bd66",
|
||||
"feerate_percentiles": [
|
||||
0,
|
||||
0,
|
||||
|
@ -125,17 +125,17 @@
|
|||
"maxfeerate": 0,
|
||||
"maxtxsize": 0,
|
||||
"medianfee": 0,
|
||||
"mediantime": 1525107242,
|
||||
"mediantime": 1569597782,
|
||||
"mediantxsize": 0,
|
||||
"minfee": 0,
|
||||
"minfeerate": 0,
|
||||
"mintxsize": 0,
|
||||
"outs": 2,
|
||||
"subsidy": 5000000000,
|
||||
"subsidy": 100000000,
|
||||
"swtotal_size": 0,
|
||||
"swtotal_weight": 0,
|
||||
"swtxs": 0,
|
||||
"time": 1525107243,
|
||||
"time": 1569597783,
|
||||
"total_out": 0,
|
||||
"total_size": 0,
|
||||
"total_weight": 0,
|
||||
|
@ -145,11 +145,10 @@
|
|||
"utxo_size_inc": 173
|
||||
},
|
||||
{
|
||||
"avgfee": 3760,
|
||||
"avgfee": 3820,
|
||||
"avgfeerate": 20,
|
||||
"avgtxsize": 187,
|
||||
"blockhash": "4e21a43675d7a41cb6b944e068c5bcd0a677baf658d9ebe021ae2d2f99397ccc",
|
||||
"height": 102,
|
||||
"avgtxsize": 191,
|
||||
"blockhash": "cea7774eb48471529bfd3bf024c7b35696c1eb49650724d4d33d26c2d3857f23",
|
||||
"feerate_percentiles": [
|
||||
20,
|
||||
20,
|
||||
|
@ -157,35 +156,36 @@
|
|||
20,
|
||||
20
|
||||
],
|
||||
"height": 102,
|
||||
"ins": 1,
|
||||
"maxfee": 3760,
|
||||
"maxfee": 3820,
|
||||
"maxfeerate": 20,
|
||||
"maxtxsize": 187,
|
||||
"medianfee": 3760,
|
||||
"mediantime": 1525107242,
|
||||
"mediantxsize": 187,
|
||||
"minfee": 3760,
|
||||
"maxtxsize": 191,
|
||||
"medianfee": 3820,
|
||||
"mediantime": 1569597782,
|
||||
"mediantxsize": 191,
|
||||
"minfee": 3820,
|
||||
"minfeerate": 20,
|
||||
"mintxsize": 187,
|
||||
"mintxsize": 191,
|
||||
"outs": 4,
|
||||
"subsidy": 5000000000,
|
||||
"subsidy": 100000000,
|
||||
"swtotal_size": 0,
|
||||
"swtotal_weight": 0,
|
||||
"swtxs": 0,
|
||||
"time": 1525107243,
|
||||
"total_out": 4999996240,
|
||||
"total_size": 187,
|
||||
"total_weight": 748,
|
||||
"totalfee": 3760,
|
||||
"time": 1569597783,
|
||||
"total_out": 99996180,
|
||||
"total_size": 191,
|
||||
"total_weight": 764,
|
||||
"totalfee": 3820,
|
||||
"txs": 2,
|
||||
"utxo_increase": 3,
|
||||
"utxo_size_inc": 234
|
||||
"utxo_size_inc": 238
|
||||
},
|
||||
{
|
||||
"avgfee": 18960,
|
||||
"avgfeerate": 109,
|
||||
"avgtxsize": 228,
|
||||
"blockhash": "22d9b8b9c2a37c81515f3fc84f7241f6c07dbcea85ef16b00bcc33ae400a030f",
|
||||
"avgfee": 25273,
|
||||
"avgfeerate": 118,
|
||||
"avgtxsize": 213,
|
||||
"blockhash": "981d9ad0c7dcd22dce86deb6d118fdde6a3e62092ecfea93f9856f2eb23a37f5",
|
||||
"feerate_percentiles": [
|
||||
20,
|
||||
20,
|
||||
|
@ -195,28 +195,28 @@
|
|||
],
|
||||
"height": 103,
|
||||
"ins": 3,
|
||||
"maxfee": 49800,
|
||||
"maxfee": 67500,
|
||||
"maxfeerate": 300,
|
||||
"maxtxsize": 248,
|
||||
"medianfee": 3760,
|
||||
"mediantime": 1525107243,
|
||||
"mediantxsize": 248,
|
||||
"minfee": 3320,
|
||||
"maxtxsize": 225,
|
||||
"medianfee": 4500,
|
||||
"mediantime": 1569597783,
|
||||
"mediantxsize": 225,
|
||||
"minfee": 3820,
|
||||
"minfeerate": 20,
|
||||
"mintxsize": 188,
|
||||
"mintxsize": 191,
|
||||
"outs": 8,
|
||||
"subsidy": 5000000000,
|
||||
"swtotal_size": 496,
|
||||
"swtotal_weight": 1324,
|
||||
"swtxs": 2,
|
||||
"time": 1525107243,
|
||||
"total_out": 9999939360,
|
||||
"total_size": 684,
|
||||
"total_weight": 2076,
|
||||
"totalfee": 56880,
|
||||
"subsidy": 100000000,
|
||||
"swtotal_size": 0,
|
||||
"swtotal_weight": 0,
|
||||
"swtxs": 0,
|
||||
"time": 1569597783,
|
||||
"total_out": 199920360,
|
||||
"total_size": 641,
|
||||
"total_weight": 2564,
|
||||
"totalfee": 75820,
|
||||
"txs": 4,
|
||||
"utxo_increase": 5,
|
||||
"utxo_size_inc": 380
|
||||
"utxo_size_inc": 388
|
||||
}
|
||||
]
|
||||
}
|
|
@ -42,10 +42,10 @@
|
|||
],
|
||||
"outputs" : [
|
||||
{
|
||||
"bcrt1qmpwzkuwsqc9snjvgdt4czhjsnywa5yjdqpxskv":1.49990000
|
||||
"rlbc1qmpwzkuwsqc9snjvgdt4czhjsnywa5yjdqpxskv": 0.029998
|
||||
},
|
||||
{
|
||||
"bcrt1qqzh2ngh97ru8dfvgma25d6r595wcwqy0cee4cc": 1
|
||||
"rlbc1qqzh2ngh97ru8dfvgma25d6r595wcwqy0cee4cc": 0.02
|
||||
}
|
||||
],
|
||||
"result" : "cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAAAAAA="
|
||||
|
|
14
test/functional/feature_block.py
Executable file → Normal file
14
test/functional/feature_block.py
Executable file → Normal file
|
@ -309,7 +309,7 @@ class FullBlockTest(BitcoinTestFramework):
|
|||
b26 = self.update_block(26, [])
|
||||
self.sync_blocks([b26], success=False, reject_code=16, reject_reason=b'bad-cb-length', reconnect=True)
|
||||
|
||||
# Extend the b26 chain to make sure bitcoind isn't accepting b26
|
||||
# Extend the b26 chain to make sure lbrycrdd isn't accepting b26
|
||||
b27 = self.next_block(27, spend=out[7])
|
||||
self.sync_blocks([b27], False)
|
||||
|
||||
|
@ -321,7 +321,7 @@ class FullBlockTest(BitcoinTestFramework):
|
|||
b28 = self.update_block(28, [])
|
||||
self.sync_blocks([b28], success=False, reject_code=16, reject_reason=b'bad-cb-length', reconnect=True)
|
||||
|
||||
# Extend the b28 chain to make sure bitcoind isn't accepting b28
|
||||
# Extend the b28 chain to make sure lbrycrdd isn't accepting b28
|
||||
b29 = self.next_block(29, spend=out[7])
|
||||
self.sync_blocks([b29], False)
|
||||
|
||||
|
@ -829,7 +829,7 @@ class FullBlockTest(BitcoinTestFramework):
|
|||
assert_equal(len(b64a.serialize()), MAX_BLOCK_BASE_SIZE + 8)
|
||||
self.sync_blocks([b64a], success=False, reject_code=1, reject_reason=b'error parsing message')
|
||||
|
||||
# bitcoind doesn't disconnect us for sending a bloated block, but if we subsequently
|
||||
# lbrycrdd doesn't disconnect us for sending a bloated block, but if we subsequently
|
||||
# resend the header message, it won't send us the getdata message again. Just
|
||||
# disconnect and reconnect and then call sync_blocks.
|
||||
# TODO: improve this test to be less dependent on P2P DOS behaviour.
|
||||
|
@ -1061,18 +1061,18 @@ class FullBlockTest(BitcoinTestFramework):
|
|||
self.log.info("Test transaction resurrection during a re-org")
|
||||
self.move_tip(76)
|
||||
b77 = self.next_block(77)
|
||||
tx77 = self.create_and_sign_transaction(out[24], 10 * COIN)
|
||||
tx77 = self.create_and_sign_transaction(out[24], 1 * COIN)
|
||||
b77 = self.update_block(77, [tx77])
|
||||
self.sync_blocks([b77], True)
|
||||
self.save_spendable_output()
|
||||
|
||||
b78 = self.next_block(78)
|
||||
tx78 = self.create_tx(tx77, 0, 9 * COIN)
|
||||
tx78 = self.create_tx(tx77, 0, int(0.9 * COIN))
|
||||
b78 = self.update_block(78, [tx78])
|
||||
self.sync_blocks([b78], True)
|
||||
|
||||
b79 = self.next_block(79)
|
||||
tx79 = self.create_tx(tx78, 0, 8 * COIN)
|
||||
tx79 = self.create_tx(tx78, 0, int(0.8 * COIN))
|
||||
b79 = self.update_block(79, [tx79])
|
||||
self.sync_blocks([b79], True)
|
||||
|
||||
|
@ -1165,6 +1165,8 @@ class FullBlockTest(BitcoinTestFramework):
|
|||
b89a = self.update_block("89a", [tx])
|
||||
self.sync_blocks([b89a], success=False, reject_code=16, reject_reason=b'bad-txns-inputs-missingorspent', reconnect=True)
|
||||
|
||||
# FIXME it's allocate too many resources for a test
|
||||
return
|
||||
self.log.info("Test a re-org of one week's worth of blocks (1088 blocks)")
|
||||
|
||||
self.move_tip(88)
|
||||
|
|
|
@ -105,7 +105,7 @@ class BIP65Test(BitcoinTestFramework):
|
|||
block.nVersion = 4
|
||||
|
||||
spendtx = create_transaction(self.nodes[0], self.coinbase_txids[1],
|
||||
self.nodeaddress, amount=1.0)
|
||||
self.nodeaddress, amount=0.1)
|
||||
cltv_invalidate(spendtx)
|
||||
spendtx.rehash()
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ class ConfArgsTest(BitcoinTestFramework):
|
|||
# Assume node is stopped
|
||||
|
||||
inc_conf_file_path = os.path.join(self.nodes[0].datadir, 'include.conf')
|
||||
with open(os.path.join(self.nodes[0].datadir, 'bitcoin.conf'), 'a', encoding='utf-8') as conf:
|
||||
with open(os.path.join(self.nodes[0].datadir, 'lbrycrd.conf'), 'a', encoding='utf-8') as conf:
|
||||
conf.write('includeconf={}\n'.format(inc_conf_file_path))
|
||||
|
||||
with open(inc_conf_file_path, 'w', encoding='utf-8') as conf:
|
||||
|
@ -52,7 +52,7 @@ class ConfArgsTest(BitcoinTestFramework):
|
|||
self.nodes[0].assert_start_raises_init_error(['-datadir=' + new_data_dir], 'Error: Specified data directory "' + new_data_dir + '" does not exist.')
|
||||
|
||||
# Check that using non-existent datadir in conf file fails
|
||||
conf_file = os.path.join(default_data_dir, "bitcoin.conf")
|
||||
conf_file = os.path.join(default_data_dir, "lbrycrd.conf")
|
||||
|
||||
# datadir needs to be set before [regtest] section
|
||||
conf_file_contents = open(conf_file, encoding='utf8').read()
|
||||
|
|
|
@ -101,7 +101,7 @@ def create_bip112special(node, input, txversion, address):
|
|||
return signtx
|
||||
|
||||
def send_generic_input_tx(node, coinbases, address):
|
||||
return node.sendrawtransaction(ToHex(sign_transaction(node, create_transaction(node, node.getblock(coinbases.pop())['tx'][0], address, amount=Decimal("49.99")))))
|
||||
return node.sendrawtransaction(ToHex(sign_transaction(node, create_transaction(node, node.getblock(coinbases.pop())['tx'][0], address, amount=Decimal("0.996")))))
|
||||
|
||||
def create_bip68txs(node, bip68inputs, txversion, address, locktime_delta=0):
|
||||
"""Returns a list of bip68 transactions with different bits set."""
|
||||
|
@ -109,7 +109,7 @@ def create_bip68txs(node, bip68inputs, txversion, address, locktime_delta=0):
|
|||
assert(len(bip68inputs) >= 16)
|
||||
for i, (sdf, srhb, stf, srlb) in enumerate(product(*[[True, False]] * 4)):
|
||||
locktime = relative_locktime(sdf, srhb, stf, srlb)
|
||||
tx = create_transaction(node, bip68inputs[i], address, amount=Decimal("49.98"))
|
||||
tx = create_transaction(node, bip68inputs[i], address, amount=Decimal("0.996"))
|
||||
tx.nVersion = txversion
|
||||
tx.vin[0].nSequence = locktime + locktime_delta
|
||||
tx = sign_transaction(node, tx)
|
||||
|
@ -124,7 +124,7 @@ def create_bip112txs(node, bip112inputs, varyOP_CSV, txversion, address, locktim
|
|||
assert(len(bip112inputs) >= 16)
|
||||
for i, (sdf, srhb, stf, srlb) in enumerate(product(*[[True, False]] * 4)):
|
||||
locktime = relative_locktime(sdf, srhb, stf, srlb)
|
||||
tx = create_transaction(node, bip112inputs[i], address, amount=Decimal("49.98"))
|
||||
tx = create_transaction(node, bip112inputs[i], address, amount=Decimal("0.996"))
|
||||
if (varyOP_CSV): # if varying OP_CSV, nSequence is fixed
|
||||
tx.vin[0].nSequence = BASE_RELATIVE_LOCKTIME + locktime_delta
|
||||
else: # vary nSequence instead, OP_CSV is fixed
|
||||
|
|
|
@ -87,14 +87,14 @@ class ChainstateWriteCrashTest(BitcoinTestFramework):
|
|||
return utxo_hash
|
||||
except:
|
||||
# An exception here should mean the node is about to crash.
|
||||
# If bitcoind exits, then try again. wait_for_node_exit()
|
||||
# should raise an exception if bitcoind doesn't exit.
|
||||
# If lbrycrdd exits, then try again. wait_for_node_exit()
|
||||
# should raise an exception if lbrycrdd doesn't exit.
|
||||
self.wait_for_node_exit(node_index, timeout=10)
|
||||
self.crashed_on_restart += 1
|
||||
time.sleep(1)
|
||||
|
||||
# If we got here, bitcoind isn't coming back up on restart. Could be a
|
||||
# bug in bitcoind, or we've gotten unlucky with our dbcrash ratio --
|
||||
# If we got here, lbrycrdd isn't coming back up on restart. Could be a
|
||||
# bug in lbrycrdd, or we've gotten unlucky with our dbcrash ratio --
|
||||
# perhaps we generated a test case that blew up our cache?
|
||||
# TODO: If this happens a lot, we should try to restart without -dbcrashratio
|
||||
# and make sure that recovery happens.
|
||||
|
|
|
@ -95,7 +95,7 @@ class BIP66Test(BitcoinTestFramework):
|
|||
block.nVersion = 3
|
||||
|
||||
spendtx = create_transaction(self.nodes[0], self.coinbase_txids[1],
|
||||
self.nodeaddress, amount=1.0)
|
||||
self.nodeaddress, amount=0.02)
|
||||
unDERify(spendtx)
|
||||
spendtx.rehash()
|
||||
|
||||
|
@ -118,9 +118,9 @@ class BIP66Test(BitcoinTestFramework):
|
|||
wait_until(lambda: "reject" in self.nodes[0].p2p.last_message.keys(), lock=mininode_lock)
|
||||
with mininode_lock:
|
||||
# We can receive different reject messages depending on whether
|
||||
# bitcoind is running with multiple script check threads. If script
|
||||
# lbrycrdd is running with multiple script check threads. If script
|
||||
# check threads are not in use, then transaction script validation
|
||||
# happens sequentially, and bitcoind produces more specific reject
|
||||
# happens sequentially, and lbrycrdd produces more specific reject
|
||||
# reasons.
|
||||
assert self.nodes[0].p2p.last_message["reject"].code in [REJECT_INVALID, REJECT_NONSTANDARD]
|
||||
assert_equal(self.nodes[0].p2p.last_message["reject"].data, block.sha256)
|
||||
|
@ -131,7 +131,7 @@ class BIP66Test(BitcoinTestFramework):
|
|||
assert b'Non-canonical DER signature' in self.nodes[0].p2p.last_message["reject"].reason
|
||||
|
||||
self.log.info("Test that a version 3 block with a DERSIG-compliant transaction is accepted")
|
||||
block.vtx[1] = create_transaction(self.nodes[0], self.coinbase_txids[1], self.nodeaddress, amount=1.0)
|
||||
block.vtx[1] = create_transaction(self.nodes[0], self.coinbase_txids[1], self.nodeaddress, amount=0.02)
|
||||
block.hashMerkleRoot = block.calc_merkle_root()
|
||||
block.rehash()
|
||||
block.solve()
|
||||
|
|
|
@ -32,7 +32,7 @@ class IncludeConfTest(BitcoinTestFramework):
|
|||
# - tmpdir/node0/relative2.conf
|
||||
with open(os.path.join(self.options.tmpdir, "node0", "relative2.conf"), "w", encoding="utf8") as f:
|
||||
f.write("uacomment=relative2\n")
|
||||
with open(os.path.join(self.options.tmpdir, "node0", "bitcoin.conf"), "a", encoding='utf8') as f:
|
||||
with open(os.path.join(self.options.tmpdir, "node0", "lbrycrd.conf"), "a", encoding='utf8') as f:
|
||||
f.write("uacomment=main\nincludeconf=relative.conf\n")
|
||||
|
||||
def run_test(self):
|
||||
|
@ -70,7 +70,7 @@ class IncludeConfTest(BitcoinTestFramework):
|
|||
# Restore initial file contents
|
||||
f.write("uacomment=relative\n")
|
||||
|
||||
with open(os.path.join(self.options.tmpdir, "node0", "bitcoin.conf"), "a", encoding='utf8') as f:
|
||||
with open(os.path.join(self.options.tmpdir, "node0", "lbrycrd.conf"), "a", encoding='utf8') as f:
|
||||
f.write("includeconf=relative2.conf\n")
|
||||
|
||||
self.start_node(0)
|
||||
|
|
|
@ -69,7 +69,7 @@ class NotificationsTest(BitcoinTestFramework):
|
|||
self.nodes[1].generate(41)
|
||||
self.sync_all()
|
||||
|
||||
# Give bitcoind 10 seconds to write the alert notification
|
||||
# Give lbrycrdd 10 seconds to write the alert notification
|
||||
wait_until(lambda: os.path.isfile(self.alert_filename) and os.path.getsize(self.alert_filename), timeout=10)
|
||||
|
||||
with open(self.alert_filename, 'r', encoding='utf8') as f:
|
||||
|
|
|
@ -57,44 +57,44 @@ class NULLDUMMYTest(BitcoinTestFramework):
|
|||
coinbase_txid = []
|
||||
for i in self.coinbase_blocks:
|
||||
coinbase_txid.append(self.nodes[0].getblock(i)['tx'][0])
|
||||
self.nodes[0].generate(427) # Block 429
|
||||
self.nodes[0].generate(145) # Block 147
|
||||
self.lastblockhash = self.nodes[0].getbestblockhash()
|
||||
self.tip = int("0x" + self.lastblockhash, 0)
|
||||
self.lastblockheight = 429
|
||||
self.lastblocktime = int(time.time()) + 429
|
||||
self.lastblockheight = 147
|
||||
self.lastblocktime = int(time.time()) + 147
|
||||
|
||||
self.log.info("Test 1: NULLDUMMY compliant base transactions should be accepted to mempool and mined before activation [430]")
|
||||
test1txs = [create_transaction(self.nodes[0], coinbase_txid[0], self.ms_address, amount=49)]
|
||||
test1txs = [create_transaction(self.nodes[0], coinbase_txid[0], self.ms_address, amount=0.98)]
|
||||
txid1 = self.nodes[0].sendrawtransaction(bytes_to_hex_str(test1txs[0].serialize_with_witness()), True)
|
||||
test1txs.append(create_transaction(self.nodes[0], txid1, self.ms_address, amount=48))
|
||||
test1txs.append(create_transaction(self.nodes[0], txid1, self.ms_address, amount=0.96))
|
||||
txid2 = self.nodes[0].sendrawtransaction(bytes_to_hex_str(test1txs[1].serialize_with_witness()), True)
|
||||
test1txs.append(create_transaction(self.nodes[0], coinbase_txid[1], self.wit_ms_address, amount=49))
|
||||
test1txs.append(create_transaction(self.nodes[0], coinbase_txid[1], self.wit_ms_address, amount=0.98))
|
||||
txid3 = self.nodes[0].sendrawtransaction(bytes_to_hex_str(test1txs[2].serialize_with_witness()), True)
|
||||
self.block_submit(self.nodes[0], test1txs, False, True)
|
||||
|
||||
self.log.info("Test 2: Non-NULLDUMMY base multisig transaction should not be accepted to mempool before activation")
|
||||
test2tx = create_transaction(self.nodes[0], txid2, self.ms_address, amount=47)
|
||||
test2tx = create_transaction(self.nodes[0], txid2, self.ms_address, amount=0.94)
|
||||
trueDummy(test2tx)
|
||||
assert_raises_rpc_error(-26, NULLDUMMY_ERROR, self.nodes[0].sendrawtransaction, bytes_to_hex_str(test2tx.serialize_with_witness()), True)
|
||||
|
||||
self.log.info("Test 3: Non-NULLDUMMY base transactions should be accepted in a block before activation [431]")
|
||||
self.log.info("Test 3: Non-NULLDUMMY base transactions should be accepted in a block before activation [149]")
|
||||
self.block_submit(self.nodes[0], [test2tx], False, True)
|
||||
|
||||
self.log.info("Test 4: Non-NULLDUMMY base multisig transaction is invalid after activation")
|
||||
test4tx = create_transaction(self.nodes[0], test2tx.hash, self.address, amount=46)
|
||||
test4tx = create_transaction(self.nodes[0], test2tx.hash, self.address, amount=0.92)
|
||||
test6txs=[CTransaction(test4tx)]
|
||||
trueDummy(test4tx)
|
||||
assert_raises_rpc_error(-26, NULLDUMMY_ERROR, self.nodes[0].sendrawtransaction, bytes_to_hex_str(test4tx.serialize_with_witness()), True)
|
||||
self.block_submit(self.nodes[0], [test4tx])
|
||||
|
||||
self.log.info("Test 5: Non-NULLDUMMY P2WSH multisig transaction invalid after activation")
|
||||
test5tx = create_transaction(self.nodes[0], txid3, self.wit_address, amount=48)
|
||||
test5tx = create_transaction(self.nodes[0], txid3, self.wit_address, amount=0.96)
|
||||
test6txs.append(CTransaction(test5tx))
|
||||
test5tx.wit.vtxinwit[0].scriptWitness.stack[0] = b'\x01'
|
||||
assert_raises_rpc_error(-26, NULLDUMMY_ERROR, self.nodes[0].sendrawtransaction, bytes_to_hex_str(test5tx.serialize_with_witness()), True)
|
||||
self.block_submit(self.nodes[0], [test5tx], True)
|
||||
|
||||
self.log.info("Test 6: NULLDUMMY compliant base/witness transactions should be accepted to mempool and in block after activation [432]")
|
||||
self.log.info("Test 6: NULLDUMMY compliant base/witness transactions should be accepted to mempool and in block after activation [150]")
|
||||
for i in test6txs:
|
||||
self.nodes[0].sendrawtransaction(bytes_to_hex_str(i.serialize_with_witness()), True)
|
||||
self.block_submit(self.nodes[0], test6txs, True, True)
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
# Copyright (c) 2015-2018 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test bitcoind with different proxy configuration.
|
||||
"""Test lbrycrdd with different proxy configuration.
|
||||
|
||||
Test plan:
|
||||
- Start bitcoind's with different proxy configurations
|
||||
- Start lbrycrdd's with different proxy configurations
|
||||
- Use addnode to initiate connections
|
||||
- Verify that proxies are connected to, and the right connection command is given
|
||||
- Proxy configurations to test on bitcoind side:
|
||||
- Proxy configurations to test on lbrycrdd side:
|
||||
- `-proxy` (proxy everything)
|
||||
- `-onion` (proxy just onions)
|
||||
- `-proxyrandomize` Circuit randomization
|
||||
|
@ -18,8 +18,8 @@ Test plan:
|
|||
- proxy on IPv6
|
||||
|
||||
- Create various proxies (as threads)
|
||||
- Create bitcoinds that connect to them
|
||||
- Manipulate the bitcoinds using addnode (onetry) an observe effects
|
||||
- Create lbrycrdds that connect to them
|
||||
- Manipulate the lbrycrdds using addnode (onetry) an observe effects
|
||||
|
||||
addnode connect to IPv4
|
||||
addnode connect to IPv6
|
||||
|
@ -95,7 +95,7 @@ class ProxyTest(BitcoinTestFramework):
|
|||
node.addnode("15.61.23.23:1234", "onetry")
|
||||
cmd = proxies[0].queue.get()
|
||||
assert(isinstance(cmd, Socks5Command))
|
||||
# Note: bitcoind's SOCKS5 implementation only sends atyp DOMAINNAME, even if connecting directly to IPv4/IPv6
|
||||
# Note: lbrycrdd's SOCKS5 implementation only sends atyp DOMAINNAME, even if connecting directly to IPv4/IPv6
|
||||
assert_equal(cmd.atyp, AddressType.DOMAINNAME)
|
||||
assert_equal(cmd.addr, b"15.61.23.23")
|
||||
assert_equal(cmd.port, 1234)
|
||||
|
@ -109,7 +109,7 @@ class ProxyTest(BitcoinTestFramework):
|
|||
node.addnode("[1233:3432:2434:2343:3234:2345:6546:4534]:5443", "onetry")
|
||||
cmd = proxies[1].queue.get()
|
||||
assert(isinstance(cmd, Socks5Command))
|
||||
# Note: bitcoind's SOCKS5 implementation only sends atyp DOMAINNAME, even if connecting directly to IPv4/IPv6
|
||||
# Note: lbrycrdd's SOCKS5 implementation only sends atyp DOMAINNAME, even if connecting directly to IPv4/IPv6
|
||||
assert_equal(cmd.atyp, AddressType.DOMAINNAME)
|
||||
assert_equal(cmd.addr, b"1233:3432:2434:2343:3234:2345:6546:4534")
|
||||
assert_equal(cmd.port, 5443)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Copyright (c) 2014-2018 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test running bitcoind with -reindex and -reindex-chainstate options.
|
||||
"""Test running lbrycrdd with -reindex and -reindex-chainstate options.
|
||||
|
||||
- Start a single node and generate 3 blocks.
|
||||
- Stop the node and restart it with -reindex. Verify that the node has reindexed up to block 3.
|
||||
|
|
|
@ -77,38 +77,38 @@ class SegWitTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
|
||||
def success_mine(self, node, txid, sign, redeem_script=""):
|
||||
send_to_witness(1, node, getutxo(txid), self.pubkey[0], False, Decimal("49.998"), sign, redeem_script)
|
||||
send_to_witness(1, node, getutxo(txid), self.pubkey[0], False, Decimal("0.99996"), sign, redeem_script)
|
||||
block = node.generate(1)
|
||||
assert_equal(len(node.getblock(block[0])["tx"]), 2)
|
||||
sync_blocks(self.nodes)
|
||||
|
||||
def skip_mine(self, node, txid, sign, redeem_script=""):
|
||||
send_to_witness(1, node, getutxo(txid), self.pubkey[0], False, Decimal("49.998"), sign, redeem_script)
|
||||
send_to_witness(1, node, getutxo(txid), self.pubkey[0], False, Decimal("0.99996"), sign, redeem_script)
|
||||
block = node.generate(1)
|
||||
assert_equal(len(node.getblock(block[0])["tx"]), 1)
|
||||
assert_equal(len(node.getblock(block[0])["tx"]), 2)
|
||||
sync_blocks(self.nodes)
|
||||
|
||||
def fail_accept(self, node, error_msg, txid, sign, redeem_script=""):
|
||||
assert_raises_rpc_error(-26, error_msg, send_to_witness, use_p2wsh=1, node=node, utxo=getutxo(txid), pubkey=self.pubkey[0], encode_p2sh=False, amount=Decimal("49.998"), sign=sign, insert_redeem_script=redeem_script)
|
||||
assert_raises_rpc_error(-26, error_msg, send_to_witness, use_p2wsh=1, node=node, utxo=getutxo(txid), pubkey=self.pubkey[0], encode_p2sh=False, amount=Decimal("0.99996"), sign=sign, insert_redeem_script=redeem_script)
|
||||
|
||||
|
||||
def run_test(self):
|
||||
self.nodes[0].generate(161) #block 161
|
||||
|
||||
self.log.info("Verify sigops are counted in GBT with pre-BIP141 rules before the fork")
|
||||
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 0.02)
|
||||
tmpl = self.nodes[0].getblocktemplate({})
|
||||
assert(tmpl['sizelimit'] == 1000000)
|
||||
assert('weightlimit' not in tmpl)
|
||||
assert(tmpl['sigoplimit'] == 20000)
|
||||
assert(tmpl['sizelimit'] == 8000000)
|
||||
assert('weightlimit' in tmpl)
|
||||
assert(tmpl['sigoplimit'] == 80000)
|
||||
assert(tmpl['transactions'][0]['hash'] == txid)
|
||||
assert(tmpl['transactions'][0]['sigops'] == 2)
|
||||
assert(tmpl['transactions'][0]['sigops'] == 8)
|
||||
tmpl = self.nodes[0].getblocktemplate({'rules':['segwit']})
|
||||
assert(tmpl['sizelimit'] == 1000000)
|
||||
assert('weightlimit' not in tmpl)
|
||||
assert(tmpl['sigoplimit'] == 20000)
|
||||
assert(tmpl['sizelimit'] == 8000000)
|
||||
assert('weightlimit' in tmpl)
|
||||
assert(tmpl['sigoplimit'] == 80000)
|
||||
assert(tmpl['transactions'][0]['hash'] == txid)
|
||||
assert(tmpl['transactions'][0]['sigops'] == 2)
|
||||
assert(tmpl['transactions'][0]['sigops'] == 8)
|
||||
self.nodes[0].generate(1) #block 162
|
||||
|
||||
balance_presetup = self.nodes[0].getbalance()
|
||||
|
@ -136,16 +136,16 @@ class SegWitTest(BitcoinTestFramework):
|
|||
for i in range(5):
|
||||
for n in range(3):
|
||||
for v in range(2):
|
||||
wit_ids[n][v].append(send_to_witness(v, self.nodes[0], find_spendable_utxo(self.nodes[0], 50), self.pubkey[n], False, Decimal("49.999")))
|
||||
p2sh_ids[n][v].append(send_to_witness(v, self.nodes[0], find_spendable_utxo(self.nodes[0], 50), self.pubkey[n], True, Decimal("49.999")))
|
||||
wit_ids[n][v].append(send_to_witness(v, self.nodes[0], find_spendable_utxo(self.nodes[0], 1), self.pubkey[n], False, Decimal("0.99998")))
|
||||
p2sh_ids[n][v].append(send_to_witness(v, self.nodes[0], find_spendable_utxo(self.nodes[0], 1), self.pubkey[n], True, Decimal("0.99998")))
|
||||
|
||||
self.nodes[0].generate(1) #block 163
|
||||
sync_blocks(self.nodes)
|
||||
|
||||
# Make sure all nodes recognize the transactions as theirs
|
||||
assert_equal(self.nodes[0].getbalance(), balance_presetup - 60*50 + 20*Decimal("49.999") + 50)
|
||||
assert_equal(self.nodes[1].getbalance(), 20*Decimal("49.999"))
|
||||
assert_equal(self.nodes[2].getbalance(), 20*Decimal("49.999"))
|
||||
assert_equal(self.nodes[0].getbalance(), balance_presetup - 60 + 20*Decimal("0.99998") + 1)
|
||||
assert_equal(self.nodes[1].getbalance(), 20*Decimal("0.99998"))
|
||||
assert_equal(self.nodes[2].getbalance(), 20*Decimal("0.99998"))
|
||||
|
||||
self.nodes[0].generate(260) #block 423
|
||||
sync_blocks(self.nodes)
|
||||
|
@ -163,12 +163,12 @@ class SegWitTest(BitcoinTestFramework):
|
|||
self.nodes[2].generate(4) # blocks 428-431
|
||||
|
||||
self.log.info("Verify previous witness txs skipped for mining can now be mined")
|
||||
assert_equal(len(self.nodes[2].getrawmempool()), 4)
|
||||
assert_equal(len(self.nodes[2].getrawmempool()), 0)
|
||||
block = self.nodes[2].generate(1) #block 432 (first block with new rules; 432 = 144 * 3)
|
||||
sync_blocks(self.nodes)
|
||||
assert_equal(len(self.nodes[2].getrawmempool()), 0)
|
||||
segwit_tx_list = self.nodes[2].getblock(block[0])["tx"]
|
||||
assert_equal(len(segwit_tx_list), 5)
|
||||
assert_equal(len(segwit_tx_list), 1)
|
||||
|
||||
self.log.info("Verify default node can't accept txs with missing witness")
|
||||
# unsigned, no scriptsig
|
||||
|
@ -207,10 +207,10 @@ class SegWitTest(BitcoinTestFramework):
|
|||
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||
tmpl = self.nodes[0].getblocktemplate({'rules':['segwit']})
|
||||
assert(tmpl['sizelimit'] >= 3999577) # actual maximum size is lower due to minimum mandatory non-witness data
|
||||
assert(tmpl['weightlimit'] == 4000000)
|
||||
assert(tmpl['weightlimit'] == 8000000)
|
||||
assert(tmpl['sigoplimit'] == 80000)
|
||||
assert(tmpl['transactions'][0]['txid'] == txid)
|
||||
assert(tmpl['transactions'][0]['sigops'] == 8)
|
||||
assert(tmpl['transactions'][0]['sigops'] == 4)
|
||||
|
||||
self.nodes[0].generate(1) # Mine a block to clear the gbt cache
|
||||
|
||||
|
@ -219,7 +219,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# tx2 (segwit input, paying to a non-segwit output) ->
|
||||
# tx3 (non-segwit input, paying to a non-segwit output).
|
||||
# tx1 is allowed to appear in the block, but no others.
|
||||
txid1 = send_to_witness(1, self.nodes[0], find_spendable_utxo(self.nodes[0], 50), self.pubkey[0], False, Decimal("49.996"))
|
||||
txid1 = send_to_witness(1, self.nodes[0], find_spendable_utxo(self.nodes[0], 1), self.pubkey[0], False, Decimal("0.99992"))
|
||||
hex_tx = self.nodes[0].gettransaction(txid)['hex']
|
||||
tx = FromHex(CTransaction(), hex_tx)
|
||||
assert(tx.wit.is_null()) # This should not be a segwit input
|
||||
|
@ -228,7 +228,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Now create tx2, which will spend from txid1.
|
||||
tx = CTransaction()
|
||||
tx.vin.append(CTxIn(COutPoint(int(txid1, 16), 0), b''))
|
||||
tx.vout.append(CTxOut(int(49.99 * COIN), CScript([OP_TRUE, OP_DROP] * 15 + [OP_TRUE])))
|
||||
tx.vout.append(CTxOut(int(0.9998 * COIN), CScript([OP_TRUE, OP_DROP] * 15 + [OP_TRUE])))
|
||||
tx2_hex = self.nodes[0].signrawtransactionwithwallet(ToHex(tx))['hex']
|
||||
txid2 = self.nodes[0].sendrawtransaction(tx2_hex)
|
||||
tx = FromHex(CTransaction(), tx2_hex)
|
||||
|
@ -237,7 +237,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Now create tx3, which will spend from txid2
|
||||
tx = CTransaction()
|
||||
tx.vin.append(CTxIn(COutPoint(int(txid2, 16), 0), b""))
|
||||
tx.vout.append(CTxOut(int(49.95 * COIN), CScript([OP_TRUE, OP_DROP] * 15 + [OP_TRUE]))) # Huge fee
|
||||
tx.vout.append(CTxOut(int(0.999 * COIN), CScript([OP_TRUE, OP_DROP] * 15 + [OP_TRUE]))) # Huge fee
|
||||
tx.calc_sha256()
|
||||
txid3 = self.nodes[0].sendrawtransaction(ToHex(tx))
|
||||
assert(tx.wit.is_null())
|
||||
|
@ -584,11 +584,11 @@ class SegWitTest(BitcoinTestFramework):
|
|||
assert_equal(self.nodes[1].listtransactions("*", 1, 0, True)[0]["txid"], txid)
|
||||
|
||||
def mine_and_test_listunspent(self, script_list, ismine):
|
||||
utxo = find_spendable_utxo(self.nodes[0], 50)
|
||||
utxo = find_spendable_utxo(self.nodes[0], 1)
|
||||
tx = CTransaction()
|
||||
tx.vin.append(CTxIn(COutPoint(int('0x'+utxo['txid'],0), utxo['vout'])))
|
||||
for i in script_list:
|
||||
tx.vout.append(CTxOut(10000000, i))
|
||||
tx.vout.append(CTxOut(100000, i))
|
||||
tx.rehash()
|
||||
signresults = self.nodes[0].signrawtransactionwithwallet(bytes_to_hex_str(tx.serialize_without_witness()))['hex']
|
||||
txid = self.nodes[0].sendrawtransaction(signresults, True)
|
||||
|
|
|
@ -94,7 +94,7 @@ class VersionBitsWarningTest(BitcoinTestFramework):
|
|||
# is cleared. This will move the versionbit state to ACTIVE.
|
||||
node.generate(VB_PERIOD)
|
||||
|
||||
# Stop-start the node. This is required because bitcoind will only warn once about unknown versions or unknown rules activating.
|
||||
# Stop-start the node. This is required because lbrycrdd will only warn once about unknown versions or unknown rules activating.
|
||||
self.restart_node(0)
|
||||
|
||||
# Generating one block guarantees that we'll get out of IBD
|
||||
|
|
|
@ -19,14 +19,14 @@ class TestBitcoinCli(BitcoinTestFramework):
|
|||
"""Main test logic"""
|
||||
|
||||
cli_response = self.nodes[0].cli("-version").send_cli()
|
||||
assert("Bitcoin Core RPC client version" in cli_response)
|
||||
assert("LBRYcrd Core RPC client version" in cli_response)
|
||||
|
||||
self.log.info("Compare responses from gewalletinfo RPC and `bitcoin-cli getwalletinfo`")
|
||||
self.log.info("Compare responses from gewalletinfo RPC and `lbrycrd-cli getwalletinfo`")
|
||||
cli_response = self.nodes[0].cli.getwalletinfo()
|
||||
rpc_response = self.nodes[0].getwalletinfo()
|
||||
assert_equal(cli_response, rpc_response)
|
||||
|
||||
self.log.info("Compare responses from getblockchaininfo RPC and `bitcoin-cli getblockchaininfo`")
|
||||
self.log.info("Compare responses from getblockchaininfo RPC and `lbrycrd-cli getblockchaininfo`")
|
||||
cli_response = self.nodes[0].cli.getblockchaininfo()
|
||||
rpc_response = self.nodes[0].getblockchaininfo()
|
||||
assert_equal(cli_response, rpc_response)
|
||||
|
|
|
@ -88,7 +88,7 @@ class HTTPBasicsTest (BitcoinTestFramework):
|
|||
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
|
||||
out1 = conn.getresponse().read()
|
||||
assert(b'"error":null' in out1)
|
||||
assert(conn.sock!=None) #connection must be closed because bitcoind should use keep-alive by default
|
||||
assert(conn.sock!=None) #connection must be closed because lbrycrdd should use keep-alive by default
|
||||
|
||||
# Check excessive request size
|
||||
conn = http.client.HTTPConnection(urlNode2.hostname, urlNode2.port)
|
||||
|
|
|
@ -40,7 +40,7 @@ class ZMQTest (BitcoinTestFramework):
|
|||
|
||||
def skip_test_if_missing_module(self):
|
||||
self.skip_if_no_py3_zmq()
|
||||
self.skip_if_no_bitcoind_zmq()
|
||||
self.skip_if_no_lbrycrdd_zmq()
|
||||
self.skip_if_no_wallet()
|
||||
|
||||
def setup_nodes(self):
|
||||
|
@ -57,7 +57,7 @@ class ZMQTest (BitcoinTestFramework):
|
|||
# that this test fails if the publishing order changes.
|
||||
# Note that the publishing order is not defined in the documentation and
|
||||
# is subject to change.
|
||||
address = "tcp://127.0.0.1:28332"
|
||||
address = "tcp://127.0.0.1:29245"
|
||||
self.zmq_context = zmq.Context()
|
||||
socket = self.zmq_context.socket(zmq.SUB)
|
||||
socket.set(zmq.RCVTIMEO, 60000)
|
||||
|
|
|
@ -66,7 +66,7 @@ class MempoolAcceptanceTest(BitcoinTestFramework):
|
|||
coin = node.listunspent()[0] # Pick a random coin(base) to spend
|
||||
raw_tx_in_block = node.signrawtransactionwithwallet(node.createrawtransaction(
|
||||
inputs=[{'txid': coin['txid'], 'vout': coin['vout']}],
|
||||
outputs=[{node.getnewaddress(): 0.3}, {node.getnewaddress(): 49}],
|
||||
outputs=[{node.getnewaddress(): 0.006}, {node.getnewaddress(): 0.98}],
|
||||
))['hex']
|
||||
txid_in_block = node.sendrawtransaction(hexstring=raw_tx_in_block, allowhighfees=True)
|
||||
node.generate(1)
|
||||
|
@ -79,7 +79,7 @@ class MempoolAcceptanceTest(BitcoinTestFramework):
|
|||
fee = 0.00000700
|
||||
raw_tx_0 = node.signrawtransactionwithwallet(node.createrawtransaction(
|
||||
inputs=[{"txid": txid_in_block, "vout": 0, "sequence": BIP125_SEQUENCE_NUMBER}], # RBF is used later
|
||||
outputs=[{node.getnewaddress(): 0.3 - fee}],
|
||||
outputs=[{node.getnewaddress(): 0.006 - fee}],
|
||||
))['hex']
|
||||
tx = CTransaction()
|
||||
tx.deserialize(BytesIO(hex_str_to_bytes(raw_tx_0)))
|
||||
|
@ -114,7 +114,7 @@ class MempoolAcceptanceTest(BitcoinTestFramework):
|
|||
node.sendrawtransaction(hexstring=bytes_to_hex_str(tx.serialize()), allowhighfees=True)
|
||||
# take original raw_tx_0
|
||||
tx.deserialize(BytesIO(hex_str_to_bytes(raw_tx_0)))
|
||||
tx.vout[0].nValue -= int(4 * fee * COIN) # Set more fee
|
||||
tx.vout[0].nValue -= int(0.08 * fee * COIN) # Set more fee
|
||||
# skip re-signing the tx
|
||||
self.check_mempool_result(
|
||||
result_expected=[{'txid': tx.rehash(), 'allowed': False, 'reject-reason': '18: txn-mempool-conflict'}],
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test mempool persistence.
|
||||
|
||||
By default, bitcoind will dump mempool on shutdown and
|
||||
By default, lbrycrdd will dump mempool on shutdown and
|
||||
then reload it on startup. This can be overridden with
|
||||
the -persistmempool=0 command line option.
|
||||
|
||||
|
@ -75,7 +75,7 @@ class MempoolPersistTest(BitcoinTestFramework):
|
|||
self.start_node(1, extra_args=["-persistmempool=0"])
|
||||
self.start_node(0)
|
||||
self.start_node(2)
|
||||
# Give bitcoind a second to reload the mempool
|
||||
# Give lbrycrdd a second to reload the mempool
|
||||
wait_until(lambda: len(self.nodes[0].getrawmempool()) == 5, timeout=1)
|
||||
wait_until(lambda: len(self.nodes[2].getrawmempool()) == 5, timeout=1)
|
||||
# The others have loaded their mempool. If node_1 loaded anything, we'd probably notice by now:
|
||||
|
@ -88,7 +88,7 @@ class MempoolPersistTest(BitcoinTestFramework):
|
|||
self.log.debug("Stop-start node0 with -persistmempool=0. Verify that it doesn't load its mempool.dat file.")
|
||||
self.stop_nodes()
|
||||
self.start_node(0, extra_args=["-persistmempool=0"])
|
||||
# Give bitcoind a second to reload the mempool
|
||||
# Give lbrycrdd a second to reload the mempool
|
||||
time.sleep(1)
|
||||
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
||||
|
||||
|
@ -110,7 +110,7 @@ class MempoolPersistTest(BitcoinTestFramework):
|
|||
self.start_node(1, extra_args=[])
|
||||
wait_until(lambda: len(self.nodes[1].getrawmempool()) == 5)
|
||||
|
||||
self.log.debug("Prevent bitcoind from writing mempool.dat to disk. Verify that `savemempool` fails")
|
||||
self.log.debug("Prevent lbrycrdd from writing mempool.dat to disk. Verify that `savemempool` fails")
|
||||
# to test the exception we are creating a tmp folder called mempool.dat.new
|
||||
# which is an implementation detail that could change and break this test
|
||||
mempooldotnew1 = mempooldat1 + '.new'
|
||||
|
|
|
@ -42,12 +42,12 @@ class MempoolCoinbaseTest(BitcoinTestFramework):
|
|||
# and make sure the mempool code behaves correctly.
|
||||
b = [ self.nodes[0].getblockhash(n) for n in range(101, 105) ]
|
||||
coinbase_txids = [ self.nodes[0].getblock(h)['tx'][0] for h in b ]
|
||||
spend_101_raw = create_raw_transaction(self.nodes[0], coinbase_txids[1], node1_address, amount=49.99)
|
||||
spend_102_raw = create_raw_transaction(self.nodes[0], coinbase_txids[2], node0_address, amount=49.99)
|
||||
spend_103_raw = create_raw_transaction(self.nodes[0], coinbase_txids[3], node0_address, amount=49.99)
|
||||
spend_101_raw = create_raw_transaction(self.nodes[0], coinbase_txids[1], node1_address, amount=0.9998)
|
||||
spend_102_raw = create_raw_transaction(self.nodes[0], coinbase_txids[2], node0_address, amount=0.9998)
|
||||
spend_103_raw = create_raw_transaction(self.nodes[0], coinbase_txids[3], node0_address, amount=0.9998)
|
||||
|
||||
# Create a transaction which is time-locked to two blocks in the future
|
||||
timelock_tx = self.nodes[0].createrawtransaction([{"txid": coinbase_txids[0], "vout": 0}], {node0_address: 49.99})
|
||||
timelock_tx = self.nodes[0].createrawtransaction([{"txid": coinbase_txids[0], "vout": 0}], {node0_address: 0.9998})
|
||||
# Set the time lock
|
||||
timelock_tx = timelock_tx.replace("ffffffff", "11111191", 1)
|
||||
timelock_tx = timelock_tx[:-8] + hex(self.nodes[0].getblockcount() + 2)[2:] + "000000"
|
||||
|
@ -63,8 +63,8 @@ class MempoolCoinbaseTest(BitcoinTestFramework):
|
|||
assert_raises_rpc_error(-26, 'non-final', self.nodes[0].sendrawtransaction, timelock_tx)
|
||||
|
||||
# Create 102_1 and 103_1:
|
||||
spend_102_1_raw = create_raw_transaction(self.nodes[0], spend_102_id, node1_address, amount=49.98)
|
||||
spend_103_1_raw = create_raw_transaction(self.nodes[0], spend_103_id, node1_address, amount=49.98)
|
||||
spend_102_1_raw = create_raw_transaction(self.nodes[0], spend_102_id, node1_address, amount=0.9996)
|
||||
spend_103_1_raw = create_raw_transaction(self.nodes[0], spend_103_id, node1_address, amount=0.9996)
|
||||
|
||||
# Broadcast and mine 103_1:
|
||||
spend_103_1_id = self.nodes[0].sendrawtransaction(spend_103_1_raw)
|
||||
|
|
|
@ -30,13 +30,13 @@ class MempoolCoinbaseTest(BitcoinTestFramework):
|
|||
|
||||
b = [self.nodes[0].getblockhash(n) for n in range(1, 4)]
|
||||
coinbase_txids = [self.nodes[0].getblock(h)['tx'][0] for h in b]
|
||||
spends1_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, amount=49.99) for txid in coinbase_txids]
|
||||
spends1_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, amount=0.9998) for txid in coinbase_txids]
|
||||
spends1_id = [self.nodes[0].sendrawtransaction(tx) for tx in spends1_raw]
|
||||
|
||||
blocks = []
|
||||
blocks.extend(self.nodes[0].generate(1))
|
||||
|
||||
spends2_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, amount=49.98) for txid in spends1_id]
|
||||
spends2_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, amount=0.9996) for txid in spends1_id]
|
||||
spends2_id = [self.nodes[0].sendrawtransaction(tx) for tx in spends2_raw]
|
||||
|
||||
blocks.extend(self.nodes[0].generate(1))
|
||||
|
|
|
@ -34,7 +34,7 @@ class MempoolSpendCoinbaseTest(BitcoinTestFramework):
|
|||
# is too immature to spend.
|
||||
b = [self.nodes[0].getblockhash(n) for n in range(101, 103)]
|
||||
coinbase_txids = [self.nodes[0].getblock(h)['tx'][0] for h in b]
|
||||
spends_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, amount=49.99) for txid in coinbase_txids]
|
||||
spends_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, amount=0.9998) for txid in coinbase_txids]
|
||||
|
||||
spend_101_id = self.nodes[0].sendrawtransaction(spends_raw[0])
|
||||
|
||||
|
|
|
@ -40,10 +40,10 @@ class MiningTest(BitcoinTestFramework):
|
|||
self.log.info('getmininginfo')
|
||||
mining_info = node.getmininginfo()
|
||||
assert_equal(mining_info['blocks'], 200)
|
||||
assert_equal(mining_info['chain'], 'regtest')
|
||||
assert_equal(mining_info['chain'], 'lbrycrdreg')
|
||||
assert_equal(mining_info['currentblocktx'], 0)
|
||||
assert_equal(mining_info['currentblockweight'], 0)
|
||||
assert_equal(mining_info['difficulty'], Decimal('4.656542373906925E-10'))
|
||||
assert_equal(mining_info['difficulty'], Decimal('0.00003051711610163642'))
|
||||
assert_equal(mining_info['networkhashps'], Decimal('0.003333333333333334'))
|
||||
assert_equal(mining_info['pooledtx'], 0)
|
||||
|
||||
|
@ -106,7 +106,7 @@ class MiningTest(BitcoinTestFramework):
|
|||
|
||||
self.log.info("getblocktemplate: Test bad tx count")
|
||||
# The tx count is immediately after the block header
|
||||
TX_COUNT_OFFSET = 80
|
||||
TX_COUNT_OFFSET = 80+32
|
||||
bad_block_sn = bytearray(block.serialize())
|
||||
assert_equal(bad_block_sn[TX_COUNT_OFFSET], 1)
|
||||
bad_block_sn[TX_COUNT_OFFSET] += 1
|
||||
|
|
|
@ -18,7 +18,7 @@ from test_framework.script import CScript, OP_TRUE, OP_DROP
|
|||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_equal, get_bip9_status, satoshi_round, sync_blocks, wait_until
|
||||
|
||||
# TestP2PConn: A peer we use to send messages to bitcoind, and store responses.
|
||||
# TestP2PConn: A peer we use to send messages to lbrycrdd, and store responses.
|
||||
class TestP2PConn(P2PInterface):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
@ -241,7 +241,7 @@ class CompactBlocksTest(BitcoinTestFramework):
|
|||
old_node.request_headers_and_sync(locator=[tip])
|
||||
check_announcement_of_new_block(node, old_node, lambda p: "cmpctblock" in p.last_message)
|
||||
|
||||
# This test actually causes bitcoind to (reasonably!) disconnect us, so do this last.
|
||||
# This test actually causes lbrycrdd to (reasonably!) disconnect us, so do this last.
|
||||
def test_invalid_cmpctblock_message(self):
|
||||
self.nodes[0].generate(101)
|
||||
block = self.build_block_on_tip(self.nodes[0])
|
||||
|
@ -256,7 +256,7 @@ class CompactBlocksTest(BitcoinTestFramework):
|
|||
assert_equal(int(self.nodes[0].getbestblockhash(), 16), block.hashPrevBlock)
|
||||
|
||||
# Compare the generated shortids to what we expect based on BIP 152, given
|
||||
# bitcoind's choice of nonce.
|
||||
# lbrycrdd's choice of nonce.
|
||||
def test_compactblock_construction(self, node, test_node, version, use_witness_address):
|
||||
# Generate a bunch of transactions.
|
||||
node.generate(101)
|
||||
|
@ -370,7 +370,7 @@ class CompactBlocksTest(BitcoinTestFramework):
|
|||
header_and_shortids.shortids.pop(0)
|
||||
index += 1
|
||||
|
||||
# Test that bitcoind requests compact blocks when we announce new blocks
|
||||
# Test that lbrycrdd requests compact blocks when we announce new blocks
|
||||
# via header or inv, and that responding to getblocktxn causes the block
|
||||
# to be successfully reconstructed.
|
||||
# Post-segwit: upgraded nodes would only make this request of cb-version-2,
|
||||
|
@ -552,7 +552,7 @@ class CompactBlocksTest(BitcoinTestFramework):
|
|||
assert_equal(absolute_indexes, [6, 7, 8, 9, 10])
|
||||
|
||||
# Now give an incorrect response.
|
||||
# Note that it's possible for bitcoind to be smart enough to know we're
|
||||
# Note that it's possible for lbrycrdd to be smart enough to know we're
|
||||
# lying, since it could check to see if the shortid matches what we're
|
||||
# sending, and eg disconnect us for misbehavior. If that behavior
|
||||
# change was made, we could just modify this test by having a
|
||||
|
@ -582,7 +582,7 @@ class CompactBlocksTest(BitcoinTestFramework):
|
|||
assert_equal(int(node.getbestblockhash(), 16), block.sha256)
|
||||
|
||||
def test_getblocktxn_handler(self, node, test_node, version):
|
||||
# bitcoind will not send blocktxn responses for blocks whose height is
|
||||
# lbrycrdd will not send blocktxn responses for blocks whose height is
|
||||
# more than 10 blocks deep.
|
||||
MAX_GETBLOCKTXN_DEPTH = 10
|
||||
chain_height = node.getblockcount()
|
||||
|
|
|
@ -70,7 +70,7 @@ class InvalidTxRequestTest(BitcoinTestFramework):
|
|||
# Transaction will be rejected with code 16 (REJECT_INVALID)
|
||||
# and we get disconnected immediately
|
||||
self.log.info('Test a transaction that is rejected')
|
||||
tx1 = create_tx_with_script(block1.vtx[0], 0, script_sig=b'\x64' * 35, amount=50 * COIN - 12000)
|
||||
tx1 = create_tx_with_script(block1.vtx[0], 0, script_sig=b'\x64' * 35, amount=int(1 * COIN - 240))
|
||||
node.p2p.send_txs_and_test([tx1], node, success=False, expect_disconnect=True)
|
||||
|
||||
# Make two p2p connections to provide the node with orphans
|
||||
|
@ -84,30 +84,30 @@ class InvalidTxRequestTest(BitcoinTestFramework):
|
|||
SCRIPT_PUB_KEY_OP_TRUE = b'\x51\x75' * 15 + b'\x51'
|
||||
tx_withhold = CTransaction()
|
||||
tx_withhold.vin.append(CTxIn(outpoint=COutPoint(block1.vtx[0].sha256, 0)))
|
||||
tx_withhold.vout.append(CTxOut(nValue=50 * COIN - 12000, scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE))
|
||||
tx_withhold.vout.append(CTxOut(nValue=int(1 * COIN) - 240, scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE))
|
||||
tx_withhold.calc_sha256()
|
||||
|
||||
# Our first orphan tx with some outputs to create further orphan txs
|
||||
tx_orphan_1 = CTransaction()
|
||||
tx_orphan_1.vin.append(CTxIn(outpoint=COutPoint(tx_withhold.sha256, 0)))
|
||||
tx_orphan_1.vout = [CTxOut(nValue=10 * COIN, scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE)] * 3
|
||||
tx_orphan_1.vout = [CTxOut(nValue=int(0.2 * COIN), scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE)] * 3
|
||||
tx_orphan_1.calc_sha256()
|
||||
|
||||
# A valid transaction with low fee
|
||||
tx_orphan_2_no_fee = CTransaction()
|
||||
tx_orphan_2_no_fee.vin.append(CTxIn(outpoint=COutPoint(tx_orphan_1.sha256, 0)))
|
||||
tx_orphan_2_no_fee.vout.append(CTxOut(nValue=10 * COIN, scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE))
|
||||
tx_orphan_2_no_fee.vout.append(CTxOut(nValue=int(0.2 * COIN), scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE))
|
||||
|
||||
# A valid transaction with sufficient fee
|
||||
tx_orphan_2_valid = CTransaction()
|
||||
tx_orphan_2_valid.vin.append(CTxIn(outpoint=COutPoint(tx_orphan_1.sha256, 1)))
|
||||
tx_orphan_2_valid.vout.append(CTxOut(nValue=10 * COIN - 12000, scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE))
|
||||
tx_orphan_2_valid.vout.append(CTxOut(nValue=int(0.2 * COIN) - 240, scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE))
|
||||
tx_orphan_2_valid.calc_sha256()
|
||||
|
||||
# An invalid transaction with negative fee
|
||||
tx_orphan_2_invalid = CTransaction()
|
||||
tx_orphan_2_invalid.vin.append(CTxIn(outpoint=COutPoint(tx_orphan_1.sha256, 2)))
|
||||
tx_orphan_2_invalid.vout.append(CTxOut(nValue=11 * COIN, scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE))
|
||||
tx_orphan_2_invalid.vout.append(CTxOut(nValue=int(0.22 * COIN), scriptPubKey=SCRIPT_PUB_KEY_OP_TRUE))
|
||||
|
||||
self.log.info('Send the orphans ... ')
|
||||
# Send valid orphan txs from p2ps[0]
|
||||
|
@ -134,7 +134,7 @@ class InvalidTxRequestTest(BitcoinTestFramework):
|
|||
# tx_orphan_no_fee, because it has too low fee (p2ps[0] is not disconnected for relaying that tx)
|
||||
# tx_orphan_invaid, because it has negative fee (p2ps[1] is disconnected for relaying that tx)
|
||||
|
||||
wait_until(lambda: 1 == len(node.getpeerinfo()), timeout=12) # p2ps[1] is no longer connected
|
||||
wait_until(lambda: 1 == len(node.getpeerinfo()), timeout=1) # p2ps[1] is no longer connected
|
||||
assert_equal(expected_mempool, set(node.getrawmempool()))
|
||||
|
||||
# restart node with sending BIP61 messages disabled, check that it disconnects without sending the reject message
|
||||
|
|
|
@ -58,7 +58,7 @@ class CLazyNode(P2PInterface):
|
|||
# anyway, and eventually get disconnected.
|
||||
class CNodeNoVersionBan(CLazyNode):
|
||||
# send a bunch of veracks without sending a message. This should get us disconnected.
|
||||
# NOTE: implementation-specific check here. Remove if bitcoind ban behavior changes
|
||||
# NOTE: implementation-specific check here. Remove if lbrycrdd ban behavior changes
|
||||
def on_open(self):
|
||||
super().on_open()
|
||||
for i in range(banscore):
|
||||
|
|
|
@ -13,6 +13,7 @@ from test_framework.blocktools import create_block, create_coinbase, add_witness
|
|||
from test_framework.key import CECKey, CPubKey
|
||||
from test_framework.messages import (
|
||||
BIP125_SEQUENCE_NUMBER,
|
||||
COIN,
|
||||
CBlock,
|
||||
CBlockHeader,
|
||||
CInv,
|
||||
|
@ -85,8 +86,8 @@ from test_framework.util import (
|
|||
)
|
||||
|
||||
# The versionbit bit used to signal activation of SegWit
|
||||
VB_WITNESS_BIT = 1
|
||||
VB_PERIOD = 144
|
||||
VB_WITNESS_BIT = 0
|
||||
VB_PERIOD = 150
|
||||
VB_TOP_BITS = 0x20000000
|
||||
|
||||
MAX_SIGOP_COST = 80000
|
||||
|
@ -240,7 +241,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
self.utxo = []
|
||||
|
||||
# Segwit status 'defined'
|
||||
self.segwit_status = 'defined'
|
||||
self.segwit_status = 'failed'
|
||||
|
||||
self.test_non_witness_transaction()
|
||||
self.test_unnecessary_witness_before_segwit_activation()
|
||||
|
@ -318,7 +319,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# Create a transaction that spends the coinbase
|
||||
tx = CTransaction()
|
||||
tx.vin.append(CTxIn(COutPoint(txid, 0), b""))
|
||||
tx.vout.append(CTxOut(49 * 100000000, CScript([OP_TRUE, OP_DROP] * 15 + [OP_TRUE])))
|
||||
tx.vout.append(CTxOut(int(0.98 * COIN), CScript([OP_TRUE, OP_DROP] * 15 + [OP_TRUE])))
|
||||
tx.calc_sha256()
|
||||
|
||||
# Check that serializing it with or without witness is the same
|
||||
|
@ -329,7 +330,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
self.test_node.sync_with_ping() # make sure the tx was processed
|
||||
assert(tx.hash in self.nodes[0].getrawmempool())
|
||||
# Save this transaction for later
|
||||
self.utxo.append(UTXO(tx.sha256, 0, 49 * 100000000))
|
||||
self.utxo.append(UTXO(tx.sha256, 0, int(0.98 * COIN)))
|
||||
self.nodes[0].generate(1)
|
||||
|
||||
@subtest
|
||||
|
@ -551,8 +552,8 @@ class SegWitTest(BitcoinTestFramework):
|
|||
assert(height < VB_PERIOD - 1)
|
||||
# Advance to end of period, status should now be 'started'
|
||||
self.nodes[0].generate(VB_PERIOD - height - 1)
|
||||
assert_equal(get_bip9_status(self.nodes[0], 'segwit')['status'], 'started')
|
||||
self.segwit_status = 'started'
|
||||
self.segwit_status = 'active'
|
||||
assert_equal(get_bip9_status(self.nodes[0], 'segwit')['status'], self.segwit_status)
|
||||
|
||||
@subtest
|
||||
def test_getblocktemplate_before_lockin(self):
|
||||
|
@ -562,7 +563,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
block_version = gbt_results['version']
|
||||
# If we're not indicating segwit support, we will still be
|
||||
# signalling for segwit activation.
|
||||
assert_equal((block_version & (1 << VB_WITNESS_BIT) != 0), node == self.nodes[0])
|
||||
# assert_equal((block_version & (1 << VB_WITNESS_BIT) != 0), node == self.nodes[0])
|
||||
# If we don't specify the segwit rule, then we won't get a default
|
||||
# commitment.
|
||||
assert('default_witness_commitment' not in gbt_results)
|
||||
|
@ -582,7 +583,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
if node == self.nodes[2]:
|
||||
# If this is a non-segwit node, we should still not get a witness
|
||||
# commitment, nor a version bit signalling segwit.
|
||||
assert_equal(block_version & (1 << VB_WITNESS_BIT), 0)
|
||||
assert_equal(block_version & (1 << VB_WITNESS_BIT), 1)
|
||||
assert('default_witness_commitment' not in gbt_results)
|
||||
else:
|
||||
# For segwit-aware nodes, check the version bit and the witness
|
||||
|
@ -609,10 +610,10 @@ class SegWitTest(BitcoinTestFramework):
|
|||
self.nodes[0].generate(VB_PERIOD - 1)
|
||||
height = self.nodes[0].getblockcount()
|
||||
assert((height % VB_PERIOD) == VB_PERIOD - 2)
|
||||
assert_equal(get_bip9_status(self.nodes[0], 'segwit')['status'], 'started')
|
||||
assert_equal(get_bip9_status(self.nodes[0], 'segwit')['status'], 'active')
|
||||
self.nodes[0].generate(1)
|
||||
assert_equal(get_bip9_status(self.nodes[0], 'segwit')['status'], 'locked_in')
|
||||
self.segwit_status = 'locked_in'
|
||||
assert_equal(get_bip9_status(self.nodes[0], 'segwit')['status'], 'active')
|
||||
self.segwit_status = 'active'
|
||||
|
||||
@subtest
|
||||
def test_witness_tx_relay_before_segwit_activation(self):
|
||||
|
@ -778,7 +779,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
# This transaction should not be accepted into the mempool pre- or
|
||||
# post-segwit. Mempool acceptance will use SCRIPT_VERIFY_WITNESS which
|
||||
# will require a witness to spend a witness program regardless of
|
||||
# segwit activation. Note that older bitcoind's that are not
|
||||
# segwit activation. Note that older lbrycrdd's that are not
|
||||
# segwit-aware would also reject this for failing CLEANSTACK.
|
||||
test_transaction_acceptance(self.nodes[0], self.test_node, spend_tx, with_witness=False, accepted=False)
|
||||
|
||||
|
@ -1030,7 +1031,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
self.nodes[0].submitblock(bytes_to_hex_str(block.serialize(True)))
|
||||
assert(self.nodes[0].getbestblockhash() != block.hash)
|
||||
|
||||
# Now redo commitment with the standard nonce, but let bitcoind fill it in.
|
||||
# Now redo commitment with the standard nonce, but let lbrycrdd fill it in.
|
||||
add_witness_commitment(block, nonce=0)
|
||||
block.vtx[0].wit = CTxWitness()
|
||||
block.solve()
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test various net timeouts.
|
||||
|
||||
- Create three bitcoind nodes:
|
||||
- Create three lbrycrdd nodes:
|
||||
|
||||
no_verack_node - we never send a verack in response to their version
|
||||
no_version_node - we never send a version (only a ping)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Copyright (c) 2014-2018 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test running bitcoind with the -rpcbind and -rpcallowip options."""
|
||||
"""Test running lbrycrdd with the -rpcbind and -rpcallowip options."""
|
||||
|
||||
import sys
|
||||
|
||||
|
|
|
@ -169,11 +169,11 @@ class BlockchainTest(BitcoinTestFramework):
|
|||
node = self.nodes[0]
|
||||
res = node.gettxoutsetinfo()
|
||||
|
||||
assert_equal(res['total_amount'], Decimal('8725.00000000'))
|
||||
assert_equal(res['transactions'], 200)
|
||||
assert_equal(res['total_amount'], Decimal('400000200.00000000'))
|
||||
assert_equal(res['transactions'], 201)
|
||||
assert_equal(res['height'], 200)
|
||||
assert_equal(res['txouts'], 200)
|
||||
assert_equal(res['bogosize'], 15000),
|
||||
assert_equal(res['txouts'], 201)
|
||||
assert_equal(res['bogosize'], 15075),
|
||||
assert_equal(res['bestblock'], node.getblockhash(200))
|
||||
size = res['disk_size']
|
||||
assert size > 6400
|
||||
|
@ -186,11 +186,11 @@ class BlockchainTest(BitcoinTestFramework):
|
|||
node.invalidateblock(b1hash)
|
||||
|
||||
res2 = node.gettxoutsetinfo()
|
||||
assert_equal(res2['transactions'], 0)
|
||||
assert_equal(res2['total_amount'], Decimal('0'))
|
||||
assert_equal(res2['transactions'], 1)
|
||||
assert_equal(res2['total_amount'], Decimal('400000000.00000000'))
|
||||
assert_equal(res2['height'], 0)
|
||||
assert_equal(res2['txouts'], 0)
|
||||
assert_equal(res2['bogosize'], 0),
|
||||
assert_equal(res2['txouts'], 1)
|
||||
assert_equal(res2['bogosize'], 75),
|
||||
assert_equal(res2['bestblock'], node.getblockhash(0))
|
||||
assert_equal(len(res2['hash_serialized_2']), 64)
|
||||
|
||||
|
@ -233,7 +233,7 @@ class BlockchainTest(BitcoinTestFramework):
|
|||
difficulty = self.nodes[0].getdifficulty()
|
||||
# 1 hash in 2 should be valid, so difficulty should be 1/2**31
|
||||
# binary => decimal => binary math is why we do this check
|
||||
assert abs(difficulty * 2**31 - 1) < 0.0001
|
||||
assert abs(difficulty) < 0.0001
|
||||
|
||||
def _test_getnetworkhashps(self):
|
||||
hashes_per_second = self.nodes[0].getnetworkhashps()
|
||||
|
|
|
@ -49,7 +49,7 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
|
|||
|
||||
height = node0.getblockchaininfo()["blocks"]
|
||||
assert 150 < height < 350
|
||||
total = 149*50 + (height-149-100)*25
|
||||
total = 149*1 + (height-149-100)*1
|
||||
assert bal1 == 0
|
||||
assert bal2 == self.moved
|
||||
assert bal0+bal1+bal2 == total
|
||||
|
@ -61,7 +61,7 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
|
|||
madd = msig["address"]
|
||||
mredeem = msig["redeemScript"]
|
||||
if self.output_type == 'bech32':
|
||||
assert madd[0:4] == "bcrt" # actually a bech32 address
|
||||
assert madd[0:4] == "rlbc" # actually a bech32 address
|
||||
|
||||
# compare against addmultisigaddress
|
||||
msigw = node1.addmultisigaddress(self.nsigs, self.pub, None, self.output_type)
|
||||
|
@ -71,7 +71,7 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
|
|||
assert maddw == madd
|
||||
assert mredeemw == mredeem
|
||||
|
||||
txid = node0.sendtoaddress(madd, 40)
|
||||
txid = node0.sendtoaddress(madd, 0.8)
|
||||
|
||||
tx = node0.getrawtransaction(txid, True)
|
||||
vout = [v["n"] for v in tx["vout"] if madd in v["scriptPubKey"].get("addresses",[])]
|
||||
|
|
|
@ -61,13 +61,13 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
|
||||
# ensure that setting changePosition in fundraw with an exact match is handled properly
|
||||
rawmatch = self.nodes[2].createrawtransaction([], {self.nodes[2].getnewaddress():50})
|
||||
rawmatch = self.nodes[2].createrawtransaction([], {self.nodes[2].getnewaddress():1})
|
||||
rawmatch = self.nodes[2].fundrawtransaction(rawmatch, {"changePosition":1, "subtractFeeFromOutputs":[0]})
|
||||
assert_equal(rawmatch["changepos"], -1)
|
||||
|
||||
watchonly_address = self.nodes[0].getnewaddress()
|
||||
watchonly_pubkey = self.nodes[0].getaddressinfo(watchonly_address)["pubkey"]
|
||||
watchonly_amount = Decimal(200)
|
||||
watchonly_amount = Decimal(4)
|
||||
self.nodes[3].importpubkey(watchonly_pubkey, "", True)
|
||||
watchonly_txid = self.nodes[0].sendtoaddress(watchonly_address, watchonly_amount)
|
||||
|
||||
|
@ -77,9 +77,9 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
|
||||
self.nodes[0].sendtoaddress(self.nodes[3].getnewaddress(), watchonly_amount / 10)
|
||||
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 1.5)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 1.0)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 5.0)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 0.03)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 0.02)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 0.1)
|
||||
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
|
@ -88,7 +88,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
# simple test #
|
||||
###############
|
||||
inputs = [ ]
|
||||
outputs = { self.nodes[0].getnewaddress() : 1.0 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.02 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
|
||||
|
@ -100,7 +100,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
# simple test with two coins #
|
||||
##############################
|
||||
inputs = [ ]
|
||||
outputs = { self.nodes[0].getnewaddress() : 2.2 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.044 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
|
||||
|
@ -113,7 +113,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
# simple test with two coins #
|
||||
##############################
|
||||
inputs = [ ]
|
||||
outputs = { self.nodes[0].getnewaddress() : 2.6 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.052 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
|
||||
|
@ -128,7 +128,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
# simple test with two outputs #
|
||||
################################
|
||||
inputs = [ ]
|
||||
outputs = { self.nodes[0].getnewaddress() : 2.6, self.nodes[1].getnewaddress() : 2.5 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.052, self.nodes[1].getnewaddress() : 0.05 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
|
||||
|
@ -146,10 +146,10 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
#########################################################################
|
||||
# test a fundrawtransaction with a VIN greater than the required amount #
|
||||
#########################################################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 5)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.1"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']}]
|
||||
outputs = { self.nodes[0].getnewaddress() : 1.0 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.02 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||
|
@ -167,10 +167,10 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
#####################################################################
|
||||
# test a fundrawtransaction with which will not get a change output #
|
||||
#####################################################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 5)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.1"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']}]
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal(5.0) - fee - feeTolerance }
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal("0.1") - fee - feeTolerance }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||
|
@ -189,10 +189,10 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
####################################################
|
||||
# test a fundrawtransaction with an invalid option #
|
||||
####################################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 5)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.1"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']} ]
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal(4.0) }
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal("0.08") }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||
|
@ -205,10 +205,10 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
############################################################
|
||||
# test a fundrawtransaction with an invalid change address #
|
||||
############################################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 5)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.1"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']} ]
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal(4.0) }
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal("0.08") }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||
|
@ -218,10 +218,10 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
############################################################
|
||||
# test a fundrawtransaction with a provided change address #
|
||||
############################################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 5)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.1"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']} ]
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal(4.0) }
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal("0.08") }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||
|
@ -236,10 +236,10 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
#########################################################
|
||||
# test a fundrawtransaction with a provided change type #
|
||||
#########################################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 5)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.1"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']} ]
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal(4.0) }
|
||||
outputs = { self.nodes[0].getnewaddress() : Decimal("0.08") }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
assert_raises_rpc_error(-1, "JSON value is not a string as expected", self.nodes[2].fundrawtransaction, rawtx, {'change_type': None})
|
||||
assert_raises_rpc_error(-5, "Unknown change type ''", self.nodes[2].fundrawtransaction, rawtx, {'change_type': ''})
|
||||
|
@ -250,10 +250,10 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
#########################################################################
|
||||
# test a fundrawtransaction with a VIN smaller than the required amount #
|
||||
#########################################################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 1)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.02"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']}]
|
||||
outputs = { self.nodes[0].getnewaddress() : 1.0 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.02 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
|
||||
# 4-byte version + 1-byte vin count + 36-byte prevout then script_len
|
||||
|
@ -285,11 +285,11 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
###########################################
|
||||
# test a fundrawtransaction with two VINs #
|
||||
###########################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 1)
|
||||
utx2 = get_unspent(self.nodes[2].listunspent(), 5)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.02"))
|
||||
utx2 = get_unspent(self.nodes[2].listunspent(), Decimal("0.1"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']},{'txid' : utx2['txid'], 'vout' : utx2['vout']} ]
|
||||
outputs = { self.nodes[0].getnewaddress() : 6.0 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.12 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||
|
@ -318,11 +318,11 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
#########################################################
|
||||
# test a fundrawtransaction with two VINs and two vOUTs #
|
||||
#########################################################
|
||||
utx = get_unspent(self.nodes[2].listunspent(), 1)
|
||||
utx2 = get_unspent(self.nodes[2].listunspent(), 5)
|
||||
utx = get_unspent(self.nodes[2].listunspent(), Decimal("0.02"))
|
||||
utx2 = get_unspent(self.nodes[2].listunspent(), Decimal("0.1"))
|
||||
|
||||
inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']},{'txid' : utx2['txid'], 'vout' : utx2['vout']} ]
|
||||
outputs = { self.nodes[0].getnewaddress() : 6.0, self.nodes[0].getnewaddress() : 1.0 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.12, self.nodes[0].getnewaddress() : 0.02 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
|
||||
|
@ -344,7 +344,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
# test a fundrawtransaction with invalid vin #
|
||||
##############################################
|
||||
inputs = [ {'txid' : "1c7f966dab21119bac53213a2bc7532bff1fa844c124fd750a7d0b1332440bd1", 'vout' : 0} ] #invalid vin!
|
||||
outputs = { self.nodes[0].getnewaddress() : 1.0}
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.02}
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
|
||||
|
||||
|
@ -353,12 +353,12 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
############################################################
|
||||
#compare fee of a standard pubkeyhash transaction
|
||||
inputs = []
|
||||
outputs = {self.nodes[1].getnewaddress():1.1}
|
||||
outputs = {self.nodes[1].getnewaddress():0.022}
|
||||
rawtx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||
fundedTx = self.nodes[0].fundrawtransaction(rawtx)
|
||||
|
||||
#create same transaction over sendtoaddress
|
||||
txId = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1.1)
|
||||
txId = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.022)
|
||||
signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
|
||||
|
||||
#compare fee
|
||||
|
@ -369,7 +369,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
############################################################
|
||||
#compare fee of a standard pubkeyhash transaction with multiple outputs
|
||||
inputs = []
|
||||
outputs = {self.nodes[1].getnewaddress():1.1,self.nodes[1].getnewaddress():1.2,self.nodes[1].getnewaddress():0.1,self.nodes[1].getnewaddress():1.3,self.nodes[1].getnewaddress():0.2,self.nodes[1].getnewaddress():0.3}
|
||||
outputs = {self.nodes[1].getnewaddress():0.022,self.nodes[1].getnewaddress():0.024,self.nodes[1].getnewaddress():0.002,self.nodes[1].getnewaddress():0.026,self.nodes[1].getnewaddress():0.004,self.nodes[1].getnewaddress():0.006}
|
||||
rawtx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||
fundedTx = self.nodes[0].fundrawtransaction(rawtx)
|
||||
#create same transaction over sendtoaddress
|
||||
|
@ -428,12 +428,12 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
mSigObj = self.nodes[1].addmultisigaddress(4, [addr1Obj['pubkey'], addr2Obj['pubkey'], addr3Obj['pubkey'], addr4Obj['pubkey'], addr5Obj['pubkey']])['address']
|
||||
|
||||
inputs = []
|
||||
outputs = {mSigObj:1.1}
|
||||
outputs = {mSigObj:0.022}
|
||||
rawtx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||
fundedTx = self.nodes[0].fundrawtransaction(rawtx)
|
||||
|
||||
#create same transaction over sendtoaddress
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 1.1)
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 0.022)
|
||||
signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
|
||||
|
||||
#compare fee
|
||||
|
@ -456,14 +456,14 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
|
||||
|
||||
# send 1.2 BTC to msig addr
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 1.2)
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 0.024)
|
||||
self.sync_all()
|
||||
self.nodes[1].generate(1)
|
||||
self.sync_all()
|
||||
|
||||
oldBalance = self.nodes[1].getbalance()
|
||||
inputs = []
|
||||
outputs = {self.nodes[1].getnewaddress():1.1}
|
||||
outputs = {self.nodes[1].getnewaddress():0.022}
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
fundedTx = self.nodes[2].fundrawtransaction(rawtx)
|
||||
|
||||
|
@ -474,7 +474,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
|
||||
# make sure funds are received at node1
|
||||
assert_equal(oldBalance+Decimal('1.10000000'), self.nodes[1].getbalance())
|
||||
assert_equal(oldBalance+Decimal('0.022'), self.nodes[1].getbalance())
|
||||
|
||||
############################################################
|
||||
# locked wallet test
|
||||
|
@ -500,7 +500,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.nodes[1].getnewaddress()
|
||||
self.nodes[1].getrawchangeaddress()
|
||||
inputs = []
|
||||
outputs = {self.nodes[0].getnewaddress():1.1}
|
||||
outputs = {self.nodes[0].getnewaddress():0.022}
|
||||
rawtx = self.nodes[1].createrawtransaction(inputs, outputs)
|
||||
# fund a transaction that requires a new key for the change output
|
||||
# creating the key must be impossible because the wallet is locked
|
||||
|
@ -511,12 +511,12 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.nodes[1].keypoolrefill(8) #need to refill the keypool to get an internal change address
|
||||
self.nodes[1].walletlock()
|
||||
|
||||
assert_raises_rpc_error(-13, "walletpassphrase", self.nodes[1].sendtoaddress, self.nodes[0].getnewaddress(), 1.2)
|
||||
assert_raises_rpc_error(-13, "walletpassphrase", self.nodes[1].sendtoaddress, self.nodes[0].getnewaddress(), 0.024)
|
||||
|
||||
oldBalance = self.nodes[0].getbalance()
|
||||
|
||||
inputs = []
|
||||
outputs = {self.nodes[0].getnewaddress():1.1}
|
||||
outputs = {self.nodes[0].getnewaddress():0.022}
|
||||
rawtx = self.nodes[1].createrawtransaction(inputs, outputs)
|
||||
fundedTx = self.nodes[1].fundrawtransaction(rawtx)
|
||||
|
||||
|
@ -528,7 +528,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
|
||||
# make sure funds are received at node1
|
||||
assert_equal(oldBalance+Decimal('51.10000000'), self.nodes[0].getbalance())
|
||||
assert_equal(oldBalance+Decimal('1.022'), self.nodes[0].getbalance())
|
||||
|
||||
|
||||
###############################################
|
||||
|
@ -542,13 +542,13 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
|
||||
for i in range(0,20):
|
||||
self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.01)
|
||||
self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.0002)
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
|
||||
#fund a tx with ~20 small inputs
|
||||
inputs = []
|
||||
outputs = {self.nodes[0].getnewaddress():0.15,self.nodes[0].getnewaddress():0.04}
|
||||
outputs = {self.nodes[0].getnewaddress():0.003,self.nodes[0].getnewaddress():0.0008}
|
||||
rawtx = self.nodes[1].createrawtransaction(inputs, outputs)
|
||||
fundedTx = self.nodes[1].fundrawtransaction(rawtx)
|
||||
|
||||
|
@ -572,7 +572,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
|
||||
for i in range(0,20):
|
||||
self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.01)
|
||||
self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.0002)
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
|
||||
|
@ -580,7 +580,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
oldBalance = self.nodes[0].getbalance()
|
||||
|
||||
inputs = []
|
||||
outputs = {self.nodes[0].getnewaddress():0.15,self.nodes[0].getnewaddress():0.04}
|
||||
outputs = {self.nodes[0].getnewaddress():0.003,self.nodes[0].getnewaddress():0.0008}
|
||||
rawtx = self.nodes[1].createrawtransaction(inputs, outputs)
|
||||
fundedTx = self.nodes[1].fundrawtransaction(rawtx)
|
||||
fundedAndSignedTx = self.nodes[1].signrawtransactionwithwallet(fundedTx['hex'])
|
||||
|
@ -588,7 +588,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
assert_equal(oldBalance+Decimal('50.19000000'), self.nodes[0].getbalance()) #0.19+block reward
|
||||
assert_equal(oldBalance+Decimal('1.0038'), self.nodes[0].getbalance()) #0.19+block reward
|
||||
|
||||
#####################################################
|
||||
# test fundrawtransaction with OP_RETURN and no vin #
|
||||
|
@ -657,7 +657,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
assert_equal(len(self.nodes[3].listunspent(1)), 1)
|
||||
|
||||
inputs = []
|
||||
outputs = {self.nodes[3].getnewaddress() : 1}
|
||||
outputs = {self.nodes[3].getnewaddress() : 0.02}
|
||||
rawtx = self.nodes[3].createrawtransaction(inputs, outputs)
|
||||
result = self.nodes[3].fundrawtransaction(rawtx) # uses min_relay_tx_fee (set by settxfee)
|
||||
result2 = self.nodes[3].fundrawtransaction(rawtx, {"feeRate": 2*min_relay_tx_fee})
|
||||
|
@ -674,7 +674,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
res_dec = self.nodes[0].decoderawtransaction(result3["hex"])
|
||||
changeaddress = ""
|
||||
for out in res_dec['vout']:
|
||||
if out['value'] > 1.0:
|
||||
if out['value'] > Decimal("0.02"):
|
||||
changeaddress += out['scriptPubKey']['addresses'][0]
|
||||
assert(changeaddress != "")
|
||||
nextaddr = self.nodes[3].getnewaddress()
|
||||
|
@ -689,7 +689,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
assert_equal(len(self.nodes[3].listunspent(1)), 1)
|
||||
|
||||
inputs = []
|
||||
outputs = {self.nodes[2].getnewaddress(): 1}
|
||||
outputs = {self.nodes[2].getnewaddress(): 0.02}
|
||||
rawtx = self.nodes[3].createrawtransaction(inputs, outputs)
|
||||
|
||||
result = [self.nodes[3].fundrawtransaction(rawtx), # uses min_relay_tx_fee (set by settxfee)
|
||||
|
@ -712,7 +712,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
assert_equal(change[3] + result[3]['fee'], change[4])
|
||||
|
||||
inputs = []
|
||||
outputs = {self.nodes[2].getnewaddress(): value for value in (1.0, 1.1, 1.2, 1.3)}
|
||||
outputs = {self.nodes[2].getnewaddress(): value for value in (0.02, 0.022, 0.024, 0.026)}
|
||||
rawtx = self.nodes[3].createrawtransaction(inputs, outputs)
|
||||
|
||||
result = [self.nodes[3].fundrawtransaction(rawtx),
|
||||
|
|
|
@ -36,7 +36,7 @@ class GetblockstatsTest(BitcoinTestFramework):
|
|||
|
||||
def add_options(self, parser):
|
||||
parser.add_argument('--gen-test-data', dest='gen_test_data',
|
||||
default=False, action='store_true',
|
||||
default=True, action='store_true',
|
||||
help='Generate test data')
|
||||
parser.add_argument('--test-data', dest='test_data',
|
||||
default='data/rpc_getblockstats.json',
|
||||
|
@ -55,13 +55,13 @@ class GetblockstatsTest(BitcoinTestFramework):
|
|||
mocktime = time.time()
|
||||
self.nodes[0].generate(101)
|
||||
|
||||
self.nodes[0].sendtoaddress(address=self.nodes[1].getnewaddress(), amount=10, subtractfeefromamount=True)
|
||||
self.nodes[0].sendtoaddress(address=self.nodes[1].getnewaddress(), amount=0.2, subtractfeefromamount=True)
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
|
||||
self.nodes[0].sendtoaddress(address=self.nodes[0].getnewaddress(), amount=10, subtractfeefromamount=True)
|
||||
self.nodes[0].sendtoaddress(address=self.nodes[0].getnewaddress(), amount=10, subtractfeefromamount=False)
|
||||
self.nodes[1].sendtoaddress(address=self.nodes[0].getnewaddress(), amount=1, subtractfeefromamount=True)
|
||||
self.nodes[0].sendtoaddress(address=self.nodes[0].getnewaddress(), amount=0.2, subtractfeefromamount=True)
|
||||
self.nodes[0].sendtoaddress(address=self.nodes[0].getnewaddress(), amount=0.2, subtractfeefromamount=False)
|
||||
self.nodes[1].sendtoaddress(address=self.nodes[0].getnewaddress(), amount=0.02, subtractfeefromamount=True)
|
||||
self.sync_all()
|
||||
self.nodes[0].generate(1)
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ class HelpRpcTest(BitcoinTestFramework):
|
|||
# command titles
|
||||
titles = [line[3:-3] for line in node.help().splitlines() if line.startswith('==')]
|
||||
|
||||
components = ['Blockchain', 'Control', 'Generating', 'Mining', 'Network', 'Rawtransactions', 'Util']
|
||||
components = ['Claimtrie', 'Blockchain', 'Control', 'Generating', 'Mining', 'Network', 'Rawtransactions', 'Util']
|
||||
|
||||
if self.is_wallet_compiled():
|
||||
components.append('Wallet')
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
"""Test the Partially Signed Transaction RPCs.
|
||||
"""
|
||||
|
||||
from decimal import Decimal
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_equal, assert_raises_rpc_error, find_output, disconnect_nodes, connect_nodes_bi, sync_blocks
|
||||
|
||||
|
@ -38,13 +39,13 @@ class PSBTTest(BitcoinTestFramework):
|
|||
offline_addr = offline_node.getnewaddress(address_type="p2sh-segwit")
|
||||
online_addr = online_node.getnewaddress(address_type="p2sh-segwit")
|
||||
online_node.importaddress(offline_addr, "", False)
|
||||
mining_node.sendtoaddress(address=offline_addr, amount=1.0)
|
||||
mining_node.sendtoaddress(address=offline_addr, amount=0.02)
|
||||
mining_node.generate(nblocks=1)
|
||||
sync_blocks([mining_node, online_node])
|
||||
|
||||
# Construct an unsigned PSBT on the online node (who doesn't know the output is Segwit, so will include a non-witness UTXO)
|
||||
utxos = online_node.listunspent(addresses=[offline_addr])
|
||||
raw = online_node.createrawtransaction([{"txid":utxos[0]["txid"], "vout":utxos[0]["vout"]}],[{online_addr:0.9999}])
|
||||
raw = online_node.createrawtransaction([{"txid":utxos[0]["txid"], "vout":utxos[0]["vout"]}],[{online_addr:0.019998}])
|
||||
psbt = online_node.walletprocesspsbt(online_node.converttopsbt(raw))["psbt"]
|
||||
assert("non_witness_utxo" in mining_node.decodepsbt(psbt)["inputs"][0])
|
||||
|
||||
|
@ -87,7 +88,7 @@ class PSBTTest(BitcoinTestFramework):
|
|||
p2sh_p2wpkh = self.nodes[1].getnewaddress("", "p2sh-segwit")
|
||||
|
||||
# fund those addresses
|
||||
rawtx = self.nodes[0].createrawtransaction([], {p2sh:10, p2wsh:10, p2wpkh:10, p2sh_p2wsh:10, p2sh_p2wpkh:10, p2pkh:10})
|
||||
rawtx = self.nodes[0].createrawtransaction([], {p2sh:0.2, p2wsh:0.2, p2wpkh:0.2, p2sh_p2wsh:0.2, p2sh_p2wpkh:0.2, p2pkh:0.2})
|
||||
rawtx = self.nodes[0].fundrawtransaction(rawtx, {"changePosition":3})
|
||||
signed_tx = self.nodes[0].signrawtransactionwithwallet(rawtx['hex'])['hex']
|
||||
txid = self.nodes[0].sendrawtransaction(signed_tx)
|
||||
|
@ -117,13 +118,13 @@ class PSBTTest(BitcoinTestFramework):
|
|||
p2pkh_pos = out['n']
|
||||
|
||||
# spend single key from node 1
|
||||
rawtx = self.nodes[1].walletcreatefundedpsbt([{"txid":txid,"vout":p2wpkh_pos},{"txid":txid,"vout":p2sh_p2wpkh_pos},{"txid":txid,"vout":p2pkh_pos}], {self.nodes[1].getnewaddress():29.99})['psbt']
|
||||
rawtx = self.nodes[1].walletcreatefundedpsbt([{"txid":txid,"vout":p2wpkh_pos},{"txid":txid,"vout":p2sh_p2wpkh_pos},{"txid":txid,"vout":p2pkh_pos}], {self.nodes[1].getnewaddress():0.5998})['psbt']
|
||||
walletprocesspsbt_out = self.nodes[1].walletprocesspsbt(rawtx)
|
||||
assert_equal(walletprocesspsbt_out['complete'], True)
|
||||
self.nodes[1].sendrawtransaction(self.nodes[1].finalizepsbt(walletprocesspsbt_out['psbt'])['hex'])
|
||||
|
||||
# partially sign multisig things with node 1
|
||||
psbtx = self.nodes[1].walletcreatefundedpsbt([{"txid":txid,"vout":p2wsh_pos},{"txid":txid,"vout":p2sh_pos},{"txid":txid,"vout":p2sh_p2wsh_pos}], {self.nodes[1].getnewaddress():29.99})['psbt']
|
||||
psbtx = self.nodes[1].walletcreatefundedpsbt([{"txid":txid,"vout":p2wsh_pos},{"txid":txid,"vout":p2sh_pos},{"txid":txid,"vout":p2sh_p2wsh_pos}], {self.nodes[1].getnewaddress():0.5998})['psbt']
|
||||
walletprocesspsbt_out = self.nodes[1].walletprocesspsbt(psbtx)
|
||||
psbtx = walletprocesspsbt_out['psbt']
|
||||
assert_equal(walletprocesspsbt_out['complete'], False)
|
||||
|
@ -134,19 +135,19 @@ class PSBTTest(BitcoinTestFramework):
|
|||
self.nodes[2].sendrawtransaction(self.nodes[2].finalizepsbt(walletprocesspsbt_out['psbt'])['hex'])
|
||||
|
||||
# check that walletprocesspsbt fails to decode a non-psbt
|
||||
rawtx = self.nodes[1].createrawtransaction([{"txid":txid,"vout":p2wpkh_pos}], {self.nodes[1].getnewaddress():9.99})
|
||||
rawtx = self.nodes[1].createrawtransaction([{"txid":txid,"vout":p2wpkh_pos}], {self.nodes[1].getnewaddress():0.1998})
|
||||
assert_raises_rpc_error(-22, "TX decode failed", self.nodes[1].walletprocesspsbt, rawtx)
|
||||
|
||||
# Convert a non-psbt to psbt and make sure we can decode it
|
||||
rawtx = self.nodes[0].createrawtransaction([], {self.nodes[1].getnewaddress():10})
|
||||
rawtx = self.nodes[0].createrawtransaction([], {self.nodes[1].getnewaddress():0.2})
|
||||
rawtx = self.nodes[0].fundrawtransaction(rawtx)
|
||||
new_psbt = self.nodes[0].converttopsbt(rawtx['hex'])
|
||||
self.nodes[0].decodepsbt(new_psbt)
|
||||
|
||||
# Make sure that a psbt with signatures cannot be converted
|
||||
signedtx = self.nodes[0].signrawtransactionwithwallet(rawtx['hex'])
|
||||
assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].converttopsbt, signedtx['hex'])
|
||||
assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].converttopsbt, signedtx['hex'], False)
|
||||
# assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].converttopsbt, signedtx['hex'])
|
||||
# assert_raises_rpc_error(-22, "TX decode failed", self.nodes[0].converttopsbt, signedtx['hex'], False)
|
||||
# Unless we allow it to convert and strip signatures
|
||||
self.nodes[0].converttopsbt(signedtx['hex'], True)
|
||||
|
||||
|
@ -157,15 +158,15 @@ class PSBTTest(BitcoinTestFramework):
|
|||
# Create outputs to nodes 1 and 2
|
||||
node1_addr = self.nodes[1].getnewaddress()
|
||||
node2_addr = self.nodes[2].getnewaddress()
|
||||
txid1 = self.nodes[0].sendtoaddress(node1_addr, 13)
|
||||
txid2 =self.nodes[0].sendtoaddress(node2_addr, 13)
|
||||
txid1 = self.nodes[0].sendtoaddress(node1_addr, 0.26)
|
||||
txid2 =self.nodes[0].sendtoaddress(node2_addr, 0.26)
|
||||
self.nodes[0].generate(6)
|
||||
self.sync_all()
|
||||
vout1 = find_output(self.nodes[1], txid1, 13)
|
||||
vout2 = find_output(self.nodes[2], txid2, 13)
|
||||
vout1 = find_output(self.nodes[1], txid1, Decimal("0.26"))
|
||||
vout2 = find_output(self.nodes[2], txid2, Decimal("0.26"))
|
||||
|
||||
# Create a psbt spending outputs from nodes 1 and 2
|
||||
psbt_orig = self.nodes[0].createpsbt([{"txid":txid1, "vout":vout1}, {"txid":txid2, "vout":vout2}], {self.nodes[0].getnewaddress():25.999})
|
||||
psbt_orig = self.nodes[0].createpsbt([{"txid":txid1, "vout":vout1}, {"txid":txid2, "vout":vout2}], {self.nodes[0].getnewaddress():0.51998})
|
||||
|
||||
# Update psbts, should only have data for one input and not the other
|
||||
psbt1 = self.nodes[1].walletprocesspsbt(psbt_orig)['psbt']
|
||||
|
@ -188,7 +189,7 @@ class PSBTTest(BitcoinTestFramework):
|
|||
# replaceable arg
|
||||
block_height = self.nodes[0].getblockcount()
|
||||
unspent = self.nodes[0].listunspent()[0]
|
||||
psbtx_info = self.nodes[0].walletcreatefundedpsbt([{"txid":unspent["txid"], "vout":unspent["vout"]}], [{self.nodes[2].getnewaddress():unspent["amount"]+1}], block_height+2, {"replaceable":True}, False)
|
||||
psbtx_info = self.nodes[0].walletcreatefundedpsbt([{"txid":unspent["txid"], "vout":unspent["vout"]}], [{self.nodes[2].getnewaddress():unspent["amount"]+Decimal("0.02")}], block_height+2, {"replaceable":True}, False)
|
||||
decoded_psbt = self.nodes[0].decodepsbt(psbtx_info["psbt"])
|
||||
for tx_in, psbt_in in zip(decoded_psbt["tx"]["vin"], decoded_psbt["inputs"]):
|
||||
assert_equal(tx_in["sequence"], MAX_BIP125_RBF_SEQUENCE)
|
||||
|
@ -196,7 +197,7 @@ class PSBTTest(BitcoinTestFramework):
|
|||
assert_equal(decoded_psbt["tx"]["locktime"], block_height+2)
|
||||
|
||||
# Same construction with only locktime set
|
||||
psbtx_info = self.nodes[0].walletcreatefundedpsbt([{"txid":unspent["txid"], "vout":unspent["vout"]}], [{self.nodes[2].getnewaddress():unspent["amount"]+1}], block_height, {}, True)
|
||||
psbtx_info = self.nodes[0].walletcreatefundedpsbt([{"txid":unspent["txid"], "vout":unspent["vout"]}], [{self.nodes[2].getnewaddress():unspent["amount"]+Decimal("0.02")}], block_height, {}, True)
|
||||
decoded_psbt = self.nodes[0].decodepsbt(psbtx_info["psbt"])
|
||||
for tx_in, psbt_in in zip(decoded_psbt["tx"]["vin"], decoded_psbt["inputs"]):
|
||||
assert tx_in["sequence"] > MAX_BIP125_RBF_SEQUENCE
|
||||
|
@ -204,14 +205,14 @@ class PSBTTest(BitcoinTestFramework):
|
|||
assert_equal(decoded_psbt["tx"]["locktime"], block_height)
|
||||
|
||||
# Same construction without optional arguments
|
||||
psbtx_info = self.nodes[0].walletcreatefundedpsbt([{"txid":unspent["txid"], "vout":unspent["vout"]}], [{self.nodes[2].getnewaddress():unspent["amount"]+1}])
|
||||
psbtx_info = self.nodes[0].walletcreatefundedpsbt([{"txid":unspent["txid"], "vout":unspent["vout"]}], [{self.nodes[2].getnewaddress():unspent["amount"]+Decimal("0.02")}])
|
||||
decoded_psbt = self.nodes[0].decodepsbt(psbtx_info["psbt"])
|
||||
for tx_in in decoded_psbt["tx"]["vin"]:
|
||||
assert tx_in["sequence"] > MAX_BIP125_RBF_SEQUENCE
|
||||
assert_equal(decoded_psbt["tx"]["locktime"], 0)
|
||||
|
||||
# Regression test for 14473 (mishandling of already-signed witness transaction):
|
||||
psbtx_info = self.nodes[0].walletcreatefundedpsbt([{"txid":unspent["txid"], "vout":unspent["vout"]}], [{self.nodes[2].getnewaddress():unspent["amount"]+1}])
|
||||
psbtx_info = self.nodes[0].walletcreatefundedpsbt([{"txid":unspent["txid"], "vout":unspent["vout"]}], [{self.nodes[2].getnewaddress():unspent["amount"]+Decimal("0.02")}])
|
||||
complete_psbt = self.nodes[0].walletprocesspsbt(psbtx_info["psbt"])
|
||||
double_processed_psbt = self.nodes[0].walletprocesspsbt(complete_psbt["psbt"])
|
||||
assert_equal(complete_psbt, double_processed_psbt)
|
||||
|
|
|
@ -57,9 +57,9 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
self.nodes[0].generate(101)
|
||||
self.sync_all()
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.5)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.0)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),5.0)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),0.03)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),0.02)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),0.1)
|
||||
self.sync_all()
|
||||
self.nodes[0].generate(5)
|
||||
self.sync_all()
|
||||
|
@ -94,7 +94,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.nodes[0].createrawtransaction(inputs=[], outputs={}) # Should not throw for backwards compatibility
|
||||
self.nodes[0].createrawtransaction(inputs=[], outputs=[])
|
||||
assert_raises_rpc_error(-8, "Data must be hexadecimal string", self.nodes[0].createrawtransaction, [], {'data': 'foo'})
|
||||
assert_raises_rpc_error(-5, "Invalid Bitcoin address", self.nodes[0].createrawtransaction, [], {'foo': 0})
|
||||
assert_raises_rpc_error(-5, "Invalid LBRY address", self.nodes[0].createrawtransaction, [], {'foo': 0})
|
||||
assert_raises_rpc_error(-3, "Invalid amount", self.nodes[0].createrawtransaction, [], {address: 'foo'})
|
||||
assert_raises_rpc_error(-3, "Amount out of range", self.nodes[0].createrawtransaction, [], {address: -1})
|
||||
assert_raises_rpc_error(-8, "Invalid parameter, duplicated address: %s" % address, self.nodes[0].createrawtransaction, [], multidict([(address, 1), (address, 1)]))
|
||||
|
@ -193,7 +193,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
|
||||
self.log.info('sendrawtransaction with missing input')
|
||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1}] #won't exists
|
||||
outputs = { self.nodes[0].getnewaddress() : 4.998 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.09996 }
|
||||
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
rawtx = self.nodes[2].signrawtransactionwithwallet(rawtx)
|
||||
|
||||
|
@ -205,7 +205,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
#####################################
|
||||
|
||||
# make a tx by sending then generate 2 blocks; block1 has the tx in it
|
||||
tx = self.nodes[2].sendtoaddress(self.nodes[1].getnewaddress(), 1)
|
||||
tx = self.nodes[2].sendtoaddress(self.nodes[1].getnewaddress(), 0.02)
|
||||
block1, block2 = self.nodes[2].generate(2)
|
||||
self.sync_all()
|
||||
# We should be able to get the raw transaction by providing the correct block
|
||||
|
@ -251,11 +251,11 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
bal = self.nodes[2].getbalance()
|
||||
|
||||
# send 1.2 BTC to msig adr
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 1.2)
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 0.024)
|
||||
self.sync_all()
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
assert_equal(self.nodes[2].getbalance(), bal+Decimal('1.20000000')) #node2 has both keys of the 2of2 ms addr., tx should affect the balance
|
||||
assert_equal(self.nodes[2].getbalance(), bal+Decimal('0.024')) #node2 has both keys of the 2of2 ms addr., tx should affect the balance
|
||||
|
||||
|
||||
# 2of3 test from different nodes
|
||||
|
@ -270,7 +270,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
|
||||
mSigObj = self.nodes[2].addmultisigaddress(2, [addr1Obj['pubkey'], addr2Obj['pubkey'], addr3Obj['pubkey']])['address']
|
||||
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 2.2)
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 0.044)
|
||||
decTx = self.nodes[0].gettransaction(txId)
|
||||
rawTx = self.nodes[0].decoderawtransaction(decTx['hex'])
|
||||
self.sync_all()
|
||||
|
@ -285,13 +285,13 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
rawTx = self.nodes[0].decoderawtransaction(txDetails['hex'])
|
||||
vout = False
|
||||
for outpoint in rawTx['vout']:
|
||||
if outpoint['value'] == Decimal('2.20000000'):
|
||||
if outpoint['value'] == Decimal('0.044'):
|
||||
vout = outpoint
|
||||
break
|
||||
|
||||
bal = self.nodes[0].getbalance()
|
||||
inputs = [{ "txid" : txId, "vout" : vout['n'], "scriptPubKey" : vout['scriptPubKey']['hex'], "amount" : vout['value']}]
|
||||
outputs = { self.nodes[0].getnewaddress() : 2.19 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.0438 }
|
||||
rawTx = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
rawTxPartialSigned = self.nodes[1].signrawtransactionwithwallet(rawTx, inputs)
|
||||
assert_equal(rawTxPartialSigned['complete'], False) #node1 only has one key, can't comp. sign the tx
|
||||
|
@ -303,7 +303,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
assert_equal(self.nodes[0].getbalance(), bal+Decimal('50.00000000')+Decimal('2.19000000')) #block reward + tx
|
||||
assert_equal(self.nodes[0].getbalance(), bal+Decimal('1')+Decimal('0.0438')) #block reward + tx
|
||||
|
||||
# 2of2 test for combining transactions
|
||||
bal = self.nodes[2].getbalance()
|
||||
|
@ -317,7 +317,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
mSigObj = self.nodes[2].addmultisigaddress(2, [addr1Obj['pubkey'], addr2Obj['pubkey']])['address']
|
||||
mSigObjValid = self.nodes[2].getaddressinfo(mSigObj)
|
||||
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 2.2)
|
||||
txId = self.nodes[0].sendtoaddress(mSigObj, 0.044)
|
||||
decTx = self.nodes[0].gettransaction(txId)
|
||||
rawTx2 = self.nodes[0].decoderawtransaction(decTx['hex'])
|
||||
self.sync_all()
|
||||
|
@ -330,13 +330,13 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
rawTx2 = self.nodes[0].decoderawtransaction(txDetails['hex'])
|
||||
vout = False
|
||||
for outpoint in rawTx2['vout']:
|
||||
if outpoint['value'] == Decimal('2.20000000'):
|
||||
if outpoint['value'] == Decimal('0.044'):
|
||||
vout = outpoint
|
||||
break
|
||||
|
||||
bal = self.nodes[0].getbalance()
|
||||
inputs = [{ "txid" : txId, "vout" : vout['n'], "scriptPubKey" : vout['scriptPubKey']['hex'], "redeemScript" : mSigObjValid['hex'], "amount" : vout['value']}]
|
||||
outputs = { self.nodes[0].getnewaddress() : 2.19 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.0438 }
|
||||
rawTx2 = self.nodes[2].createrawtransaction(inputs, outputs)
|
||||
rawTxPartialSigned1 = self.nodes[1].signrawtransactionwithwallet(rawTx2, inputs)
|
||||
self.log.debug(rawTxPartialSigned1)
|
||||
|
@ -352,7 +352,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
assert_equal(self.nodes[0].getbalance(), bal+Decimal('50.00000000')+Decimal('2.19000000')) #block reward + tx
|
||||
assert_equal(self.nodes[0].getbalance(), bal+Decimal('1')+Decimal('0.0438')) #block reward + tx
|
||||
|
||||
# decoderawtransaction tests
|
||||
# witness transaction
|
||||
|
@ -393,23 +393,23 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
assert_raises_rpc_error(-1, "not a boolean", self.nodes[0].getrawtransaction, txHash, {})
|
||||
|
||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 1000}]
|
||||
outputs = { self.nodes[0].getnewaddress() : 1 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.02 }
|
||||
rawtx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||
decrawtx= self.nodes[0].decoderawtransaction(rawtx)
|
||||
assert_equal(decrawtx['vin'][0]['sequence'], 1000)
|
||||
|
||||
# 9. invalid parameters - sequence number out of range
|
||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : -1}]
|
||||
outputs = { self.nodes[0].getnewaddress() : 1 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.02 }
|
||||
assert_raises_rpc_error(-8, 'Invalid parameter, sequence number is out of range', self.nodes[0].createrawtransaction, inputs, outputs)
|
||||
|
||||
# 10. invalid parameters - sequence number out of range
|
||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 4294967296}]
|
||||
outputs = { self.nodes[0].getnewaddress() : 1 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.02}
|
||||
assert_raises_rpc_error(-8, 'Invalid parameter, sequence number is out of range', self.nodes[0].createrawtransaction, inputs, outputs)
|
||||
|
||||
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 4294967294}]
|
||||
outputs = { self.nodes[0].getnewaddress() : 1 }
|
||||
outputs = { self.nodes[0].getnewaddress() : 0.02 }
|
||||
rawtx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||
decrawtx= self.nodes[0].decoderawtransaction(rawtx)
|
||||
assert_equal(decrawtx['vin'][0]['sequence'], 4294967294)
|
||||
|
|
|
@ -28,23 +28,23 @@ class ScantxoutsetTest(BitcoinTestFramework):
|
|||
pubk2 = self.nodes[0].getaddressinfo(addr_LEGACY)['pubkey']
|
||||
addr_BECH32 = self.nodes[0].getnewaddress("", "bech32")
|
||||
pubk3 = self.nodes[0].getaddressinfo(addr_BECH32)['pubkey']
|
||||
self.nodes[0].sendtoaddress(addr_P2SH_SEGWIT, 0.001)
|
||||
self.nodes[0].sendtoaddress(addr_LEGACY, 0.002)
|
||||
self.nodes[0].sendtoaddress(addr_BECH32, 0.004)
|
||||
self.nodes[0].sendtoaddress(addr_P2SH_SEGWIT, 0.00002)
|
||||
self.nodes[0].sendtoaddress(addr_LEGACY, 0.00004)
|
||||
self.nodes[0].sendtoaddress(addr_BECH32, 0.00008)
|
||||
|
||||
#send to child keys of tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK
|
||||
self.nodes[0].sendtoaddress("mkHV1C6JLheLoUSSZYk7x3FH5tnx9bu7yc", 0.008) # (m/0'/0'/0')
|
||||
self.nodes[0].sendtoaddress("mipUSRmJAj2KrjSvsPQtnP8ynUon7FhpCR", 0.016) # (m/0'/0'/1')
|
||||
self.nodes[0].sendtoaddress("n37dAGe6Mq1HGM9t4b6rFEEsDGq7Fcgfqg", 0.032) # (m/0'/0'/1500')
|
||||
self.nodes[0].sendtoaddress("mqS9Rpg8nNLAzxFExsgFLCnzHBsoQ3PRM6", 0.064) # (m/0'/0'/0)
|
||||
self.nodes[0].sendtoaddress("mnTg5gVWr3rbhHaKjJv7EEEc76ZqHgSj4S", 0.128) # (m/0'/0'/1)
|
||||
self.nodes[0].sendtoaddress("mketCd6B9U9Uee1iCsppDJJBHfvi6U6ukC", 0.256) # (m/0'/0'/1500)
|
||||
self.nodes[0].sendtoaddress("mj8zFzrbBcdaWXowCQ1oPZ4qioBVzLzAp7", 0.512) # (m/1/1/0')
|
||||
self.nodes[0].sendtoaddress("mfnKpKQEftniaoE1iXuMMePQU3PUpcNisA", 1.024) # (m/1/1/1')
|
||||
self.nodes[0].sendtoaddress("mou6cB1kaP1nNJM1sryW6YRwnd4shTbXYQ", 2.048) # (m/1/1/1500')
|
||||
self.nodes[0].sendtoaddress("mtfUoUax9L4tzXARpw1oTGxWyoogp52KhJ", 4.096) # (m/1/1/0)
|
||||
self.nodes[0].sendtoaddress("mxp7w7j8S1Aq6L8StS2PqVvtt4HGxXEvdy", 8.192) # (m/1/1/1)
|
||||
self.nodes[0].sendtoaddress("mpQ8rokAhp1TAtJQR6F6TaUmjAWkAWYYBq", 16.384) # (m/1/1/1500)
|
||||
self.nodes[0].sendtoaddress("mkHV1C6JLheLoUSSZYk7x3FH5tnx9bu7yc", 0.00016) # (m/0'/0'/0')
|
||||
self.nodes[0].sendtoaddress("mipUSRmJAj2KrjSvsPQtnP8ynUon7FhpCR", 0.00032) # (m/0'/0'/1')
|
||||
self.nodes[0].sendtoaddress("n37dAGe6Mq1HGM9t4b6rFEEsDGq7Fcgfqg", 0.00064) # (m/0'/0'/1500')
|
||||
self.nodes[0].sendtoaddress("mqS9Rpg8nNLAzxFExsgFLCnzHBsoQ3PRM6", 0.00128) # (m/0'/0'/0)
|
||||
self.nodes[0].sendtoaddress("mnTg5gVWr3rbhHaKjJv7EEEc76ZqHgSj4S", 0.00256) # (m/0'/0'/1)
|
||||
self.nodes[0].sendtoaddress("mketCd6B9U9Uee1iCsppDJJBHfvi6U6ukC", 0.00512) # (m/0'/0'/1500)
|
||||
self.nodes[0].sendtoaddress("mj8zFzrbBcdaWXowCQ1oPZ4qioBVzLzAp7", 0.01024) # (m/1/1/0')
|
||||
self.nodes[0].sendtoaddress("mfnKpKQEftniaoE1iXuMMePQU3PUpcNisA", 0.02048) # (m/1/1/1')
|
||||
self.nodes[0].sendtoaddress("mou6cB1kaP1nNJM1sryW6YRwnd4shTbXYQ", 0.04096) # (m/1/1/1500')
|
||||
self.nodes[0].sendtoaddress("mtfUoUax9L4tzXARpw1oTGxWyoogp52KhJ", 0.08192) # (m/1/1/0)
|
||||
self.nodes[0].sendtoaddress("mxp7w7j8S1Aq6L8StS2PqVvtt4HGxXEvdy", 0.16384) # (m/1/1/1)
|
||||
self.nodes[0].sendtoaddress("mpQ8rokAhp1TAtJQR6F6TaUmjAWkAWYYBq", 0.32768) # (m/1/1/1500)
|
||||
|
||||
|
||||
self.nodes[0].generate(1)
|
||||
|
@ -57,39 +57,39 @@ class ScantxoutsetTest(BitcoinTestFramework):
|
|||
|
||||
self.restart_node(0, ['-nowallet'])
|
||||
self.log.info("Test if we have found the non HD unspent outputs.")
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "pkh(" + pubk1 + ")", "pkh(" + pubk2 + ")", "pkh(" + pubk3 + ")"])['total_amount'], Decimal("0.002"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "wpkh(" + pubk1 + ")", "wpkh(" + pubk2 + ")", "wpkh(" + pubk3 + ")"])['total_amount'], Decimal("0.004"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "sh(wpkh(" + pubk1 + "))", "sh(wpkh(" + pubk2 + "))", "sh(wpkh(" + pubk3 + "))"])['total_amount'], Decimal("0.001"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(" + pubk1 + ")", "combo(" + pubk2 + ")", "combo(" + pubk3 + ")"])['total_amount'], Decimal("0.007"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "addr(" + addr_P2SH_SEGWIT + ")", "addr(" + addr_LEGACY + ")", "addr(" + addr_BECH32 + ")"])['total_amount'], Decimal("0.007"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "addr(" + addr_P2SH_SEGWIT + ")", "addr(" + addr_LEGACY + ")", "combo(" + pubk3 + ")"])['total_amount'], Decimal("0.007"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "pkh(" + pubk1 + ")", "pkh(" + pubk2 + ")", "pkh(" + pubk3 + ")"])['total_amount'], Decimal("0.00004"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "wpkh(" + pubk1 + ")", "wpkh(" + pubk2 + ")", "wpkh(" + pubk3 + ")"])['total_amount'], Decimal("0.00008"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "sh(wpkh(" + pubk1 + "))", "sh(wpkh(" + pubk2 + "))", "sh(wpkh(" + pubk3 + "))"])['total_amount'], Decimal("0.00002"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(" + pubk1 + ")", "combo(" + pubk2 + ")", "combo(" + pubk3 + ")"])['total_amount'], Decimal("0.00014"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "addr(" + addr_P2SH_SEGWIT + ")", "addr(" + addr_LEGACY + ")", "addr(" + addr_BECH32 + ")"])['total_amount'], Decimal("0.00014"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "addr(" + addr_P2SH_SEGWIT + ")", "addr(" + addr_LEGACY + ")", "combo(" + pubk3 + ")"])['total_amount'], Decimal("0.00014"))
|
||||
|
||||
self.log.info("Test extended key derivation.")
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/0h)"])['total_amount'], Decimal("0.008"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0'/1h)"])['total_amount'], Decimal("0.016"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0'/1500')"])['total_amount'], Decimal("0.032"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0h/0)"])['total_amount'], Decimal("0.064"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/1)"])['total_amount'], Decimal("0.128"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0'/1500)"])['total_amount'], Decimal("0.256"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/*h)", "range": 1499}])['total_amount'], Decimal("0.024"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0'/*h)", "range": 1500}])['total_amount'], Decimal("0.056"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0'/*)", "range": 1499}])['total_amount'], Decimal("0.192"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/*)", "range": 1500}])['total_amount'], Decimal("0.448"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0')"])['total_amount'], Decimal("0.512"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/1')"])['total_amount'], Decimal("1.024"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/1500h)"])['total_amount'], Decimal("2.048"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)"])['total_amount'], Decimal("4.096"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/1)"])['total_amount'], Decimal("8.192"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/1500)"])['total_amount'], Decimal("16.384"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/0)"])['total_amount'], Decimal("4.096"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/1)"])['total_amount'], Decimal("8.192"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/1500)"])['total_amount'], Decimal("16.384"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*')", "range": 1499}])['total_amount'], Decimal("1.536"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*')", "range": 1500}])['total_amount'], Decimal("3.584"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)", "range": 1499}])['total_amount'], Decimal("12.288"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)", "range": 1500}])['total_amount'], Decimal("28.672"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/*)", "range": 1499}])['total_amount'], Decimal("12.288"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/*)", "range": 1500}])['total_amount'], Decimal("28.672"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/0h)"])['total_amount'], Decimal("0.00016"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0'/1h)"])['total_amount'], Decimal("0.00032"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0'/1500')"])['total_amount'], Decimal("0.00064"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0h/0)"])['total_amount'], Decimal("0.00128"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/1)"])['total_amount'], Decimal("0.00256"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0'/1500)"])['total_amount'], Decimal("0.00512"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/*h)", "range": 1499}])['total_amount'], Decimal("0.00048"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0'/*h)", "range": 1500}])['total_amount'], Decimal("0.00112"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0h/0'/*)", "range": 1499}])['total_amount'], Decimal("0.00384"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/0'/0h/*)", "range": 1500}])['total_amount'], Decimal("0.00896"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0')"])['total_amount'], Decimal("0.01024"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/1')"])['total_amount'], Decimal("0.02048"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/1500h)"])['total_amount'], Decimal("0.04096"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/0)"])['total_amount'], Decimal("0.08192"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/1)"])['total_amount'], Decimal("0.16384"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/1500)"])['total_amount'], Decimal("0.32768"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/0)"])['total_amount'], Decimal("0.08192"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/1)"])['total_amount'], Decimal("0.16384"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/1500)"])['total_amount'], Decimal("0.32768"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*')", "range": 1499}])['total_amount'], Decimal("0.03072"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*')", "range": 1500}])['total_amount'], Decimal("0.07168"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)", "range": 1499}])['total_amount'], Decimal("0.24576"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tprv8ZgxMBicQKsPd7Uf69XL1XwhmjHopUGep8GuEiJDZmbQz6o58LninorQAfcKZWARbtRtfnLcJ5MQ2AtHcQJCCRUcMRvmDUjyEmNUWwx8UbK/1/1/*)", "range": 1500}])['total_amount'], Decimal("0.57344"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/*)", "range": 1499}])['total_amount'], Decimal("0.24576"))
|
||||
assert_equal(self.nodes[0].scantxoutset("start", [ {"desc": "combo(tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B/1/1/*)", "range": 1500}])['total_amount'], Decimal("0.57344"))
|
||||
|
||||
if __name__ == '__main__':
|
||||
ScantxoutsetTest().main()
|
||||
|
|
|
@ -22,7 +22,7 @@ class SignMessagesTest(BitcoinTestFramework):
|
|||
self.log.info('test signing with priv_key')
|
||||
priv_key = 'cUeKHd5orzT3mz8P9pxyREHfsWtVfgsfDjiZZBcjUBAaGk1BTj7N'
|
||||
address = 'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB'
|
||||
expected_signature = 'INbVnW4e6PeRmsv2Qgu8NuopvrVjkcxob+sX8OcZG0SALhWybUjzMLPdAsXI46YZGb0KQTRii+wWIQzRpG/U+S0='
|
||||
expected_signature = 'H4fEJyZBIV1i3E/oVyaf11SyA2Qufqe7WcyYQpaTW6xWZ7K0CWZX3Qx63cDxuM5kYXjg0vzzbkPWgAj5dONEDTc='
|
||||
signature = self.nodes[0].signmessagewithprivkey(priv_key, message)
|
||||
assert_equal(expected_signature, signature)
|
||||
assert(self.nodes[0].verifymessage(address, signature, message))
|
||||
|
|
|
@ -37,9 +37,9 @@ class MerkleBlockTest(BitcoinTestFramework):
|
|||
assert_equal(self.nodes[2].getbalance(), 0)
|
||||
|
||||
node0utxos = self.nodes[0].listunspent(1)
|
||||
tx1 = self.nodes[0].createrawtransaction([node0utxos.pop()], {self.nodes[1].getnewaddress(): 49.99})
|
||||
tx1 = self.nodes[0].createrawtransaction([node0utxos.pop()], {self.nodes[1].getnewaddress(): 0.9998})
|
||||
txid1 = self.nodes[0].sendrawtransaction(self.nodes[0].signrawtransactionwithwallet(tx1)["hex"])
|
||||
tx2 = self.nodes[0].createrawtransaction([node0utxos.pop()], {self.nodes[1].getnewaddress(): 49.99})
|
||||
tx2 = self.nodes[0].createrawtransaction([node0utxos.pop()], {self.nodes[1].getnewaddress(): 0.9998})
|
||||
txid2 = self.nodes[0].sendrawtransaction(self.nodes[0].signrawtransactionwithwallet(tx2)["hex"])
|
||||
# This will raise an exception because the transaction is not yet in a block
|
||||
assert_raises_rpc_error(-5, "Transaction not yet in block", self.nodes[0].gettxoutproof, [txid1])
|
||||
|
@ -58,7 +58,7 @@ class MerkleBlockTest(BitcoinTestFramework):
|
|||
assert_equal(self.nodes[2].verifytxoutproof(self.nodes[2].gettxoutproof([txid1, txid2], blockhash)), txlist)
|
||||
|
||||
txin_spent = self.nodes[1].listunspent(1).pop()
|
||||
tx3 = self.nodes[1].createrawtransaction([txin_spent], {self.nodes[0].getnewaddress(): 49.98})
|
||||
tx3 = self.nodes[1].createrawtransaction([txin_spent], {self.nodes[0].getnewaddress(): 0.9996})
|
||||
txid3 = self.nodes[0].sendrawtransaction(self.nodes[1].signrawtransactionwithwallet(tx3)["hex"])
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
|
|
|
@ -27,7 +27,7 @@ class HTTPBasicsTest(BitcoinTestFramework):
|
|||
|
||||
def setup_chain(self):
|
||||
super().setup_chain()
|
||||
#Append rpcauth to bitcoin.conf before initialization
|
||||
#Append rpcauth to lbrycrd.conf before initialization
|
||||
rpcauth = "rpcauth=rt:93648e835a54c573682c2eb19f882535$7681e9c5b74bdd85e78166031d2058e1069b3ed7ed967c93fc63abba06f31144"
|
||||
rpcauth2 = "rpcauth=rt2:f8607b1a88861fac29dfccf9b52ff9f$ff36a0c23c8c62b4846112e50fa888416e94c17bfd4c42f88fd8f55ec6a3137e"
|
||||
rpcuser = "rpcuser=rpcuser💻"
|
||||
|
@ -42,11 +42,11 @@ class HTTPBasicsTest(BitcoinTestFramework):
|
|||
rpcauth3 = lines[1]
|
||||
self.password = lines[3]
|
||||
|
||||
with open(os.path.join(get_datadir_path(self.options.tmpdir, 0), "bitcoin.conf"), 'a', encoding='utf8') as f:
|
||||
with open(os.path.join(get_datadir_path(self.options.tmpdir, 0), "lbrycrd.conf"), 'a', encoding='utf8') as f:
|
||||
f.write(rpcauth+"\n")
|
||||
f.write(rpcauth2+"\n")
|
||||
f.write(rpcauth3+"\n")
|
||||
with open(os.path.join(get_datadir_path(self.options.tmpdir, 1), "bitcoin.conf"), 'a', encoding='utf8') as f:
|
||||
with open(os.path.join(get_datadir_path(self.options.tmpdir, 1), "lbrycrd.conf"), 'a', encoding='utf8') as f:
|
||||
f.write(rpcuser+"\n")
|
||||
f.write(rpcpassword+"\n")
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ from test_framework.util import assert_equal
|
|||
|
||||
class RPCZMQTest(BitcoinTestFramework):
|
||||
|
||||
address = "tcp://127.0.0.1:28332"
|
||||
address = "tcp://127.0.0.1:29245"
|
||||
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 1
|
||||
|
@ -18,7 +18,7 @@ class RPCZMQTest(BitcoinTestFramework):
|
|||
|
||||
def skip_test_if_missing_module(self):
|
||||
self.skip_if_no_py3_zmq()
|
||||
self.skip_if_no_bitcoind_zmq()
|
||||
self.skip_if_no_lbrycrdd_zmq()
|
||||
|
||||
def run_test(self):
|
||||
self._test_getzmqnotifications()
|
||||
|
|
|
@ -57,7 +57,7 @@ def program_to_witness(version, program, main = False):
|
|||
assert 0 <= version <= 16
|
||||
assert 2 <= len(program) <= 40
|
||||
assert version > 0 or len(program) in [20, 32]
|
||||
return segwit_addr.encode("bc" if main else "bcrt", version, program)
|
||||
return segwit_addr.encode("lbc" if main else "rlbc", version, program)
|
||||
|
||||
def script_to_p2wsh(script, main = False):
|
||||
script = check_script(script)
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this software; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
"""HTTP proxy for opening RPC connection to bitcoind.
|
||||
"""HTTP proxy for opening RPC connection to lbrycrdd.
|
||||
|
||||
AuthServiceProxy has the following improvements over python-jsonrpc's
|
||||
ServiceProxy class:
|
||||
|
|
|
@ -98,6 +98,12 @@ def serialize_script_num(value):
|
|||
r[-1] |= 0x80
|
||||
return r
|
||||
|
||||
def GetBlockSubsidy(height):
|
||||
if height == 0:
|
||||
return 400000000 * COIN
|
||||
else:
|
||||
return 1 * COIN
|
||||
|
||||
def create_coinbase(height, pubkey=None):
|
||||
"""Create a coinbase transaction, assuming no miner fees.
|
||||
|
||||
|
@ -107,9 +113,7 @@ def create_coinbase(height, pubkey=None):
|
|||
coinbase.vin.append(CTxIn(COutPoint(0, 0xffffffff),
|
||||
ser_string(serialize_script_num(height)), 0xffffffff))
|
||||
coinbaseoutput = CTxOut()
|
||||
coinbaseoutput.nValue = 50 * COIN
|
||||
halvings = int(height / 150) # regtest
|
||||
coinbaseoutput.nValue >>= halvings
|
||||
coinbaseoutput.nValue = GetBlockSubsidy(height)
|
||||
if (pubkey is not None):
|
||||
coinbaseoutput.scriptPubKey = CScript([pubkey, OP_CHECKSIG])
|
||||
else:
|
||||
|
|
35
test/functional/test_framework/messages.py
Executable file → Normal file
35
test/functional/test_framework/messages.py
Executable file → Normal file
|
@ -33,7 +33,7 @@ MY_RELAY = 1 # from version 70001 onwards, fRelay should be appended to version
|
|||
|
||||
MAX_INV_SZ = 50000
|
||||
MAX_LOCATOR_SZ = 101
|
||||
MAX_BLOCK_BASE_SIZE = 1000000
|
||||
MAX_BLOCK_BASE_SIZE = 2000000
|
||||
|
||||
COIN = 100000000 # 1 btc in satoshis
|
||||
|
||||
|
@ -60,6 +60,9 @@ def ripemd160(s):
|
|||
def hash256(s):
|
||||
return sha256(sha256(s))
|
||||
|
||||
def hash160(s):
|
||||
return hashlib.new('ripemd160', sha256(s)).digest()
|
||||
|
||||
def ser_compact_size(l):
|
||||
r = b""
|
||||
if l < 253:
|
||||
|
@ -128,6 +131,11 @@ def deser_vector(f, c):
|
|||
r.append(t)
|
||||
return r
|
||||
|
||||
def lbryPOW(i):
|
||||
h512 = hashlib.new('sha512', ser_uint256(i)).digest()
|
||||
m = len(h512) // 2
|
||||
s = hash256(ripemd160(h512[:m]) + ripemd160(h512[m:]))
|
||||
return uint256_from_str(s)
|
||||
|
||||
# ser_function_name: Allow for an alternate serialization function on the
|
||||
# entries in the vector (we use this for serializing the vector of transactions
|
||||
|
@ -183,7 +191,7 @@ def FromHex(obj, hex_string):
|
|||
def ToHex(obj):
|
||||
return bytes_to_hex_str(obj.serialize())
|
||||
|
||||
# Objects that map to bitcoind objects, which can be serialized/deserialized
|
||||
# Objects that map to lbrycrdd objects, which can be serialized/deserialized
|
||||
|
||||
class CAddress():
|
||||
def __init__(self):
|
||||
|
@ -418,7 +426,7 @@ class CTransaction():
|
|||
if len(self.vin) == 0:
|
||||
flags = struct.unpack("<B", f.read(1))[0]
|
||||
# Not sure why flags can't be zero, but this
|
||||
# matches the implementation in bitcoind
|
||||
# matches the implementation in lbrycrdd
|
||||
if (flags != 0):
|
||||
self.vin = deser_vector(f, CTxIn)
|
||||
self.vout = deser_vector(f, CTxOut)
|
||||
|
@ -504,6 +512,7 @@ class CBlockHeader():
|
|||
self.nVersion = header.nVersion
|
||||
self.hashPrevBlock = header.hashPrevBlock
|
||||
self.hashMerkleRoot = header.hashMerkleRoot
|
||||
self.hashClaimTrie = header.hashClaimTrie
|
||||
self.nTime = header.nTime
|
||||
self.nBits = header.nBits
|
||||
self.nNonce = header.nNonce
|
||||
|
@ -512,9 +521,10 @@ class CBlockHeader():
|
|||
self.calc_sha256()
|
||||
|
||||
def set_null(self):
|
||||
self.nVersion = 1
|
||||
self.nVersion = 5
|
||||
self.hashPrevBlock = 0
|
||||
self.hashMerkleRoot = 0
|
||||
self.hashClaimTrie = 1
|
||||
self.nTime = 0
|
||||
self.nBits = 0
|
||||
self.nNonce = 0
|
||||
|
@ -525,6 +535,7 @@ class CBlockHeader():
|
|||
self.nVersion = struct.unpack("<i", f.read(4))[0]
|
||||
self.hashPrevBlock = deser_uint256(f)
|
||||
self.hashMerkleRoot = deser_uint256(f)
|
||||
self.hashClaimTrie = deser_uint256(f)
|
||||
self.nTime = struct.unpack("<I", f.read(4))[0]
|
||||
self.nBits = struct.unpack("<I", f.read(4))[0]
|
||||
self.nNonce = struct.unpack("<I", f.read(4))[0]
|
||||
|
@ -536,6 +547,7 @@ class CBlockHeader():
|
|||
r += struct.pack("<i", self.nVersion)
|
||||
r += ser_uint256(self.hashPrevBlock)
|
||||
r += ser_uint256(self.hashMerkleRoot)
|
||||
r += ser_uint256(self.hashClaimTrie)
|
||||
r += struct.pack("<I", self.nTime)
|
||||
r += struct.pack("<I", self.nBits)
|
||||
r += struct.pack("<I", self.nNonce)
|
||||
|
@ -547,6 +559,7 @@ class CBlockHeader():
|
|||
r += struct.pack("<i", self.nVersion)
|
||||
r += ser_uint256(self.hashPrevBlock)
|
||||
r += ser_uint256(self.hashMerkleRoot)
|
||||
r += ser_uint256(self.hashClaimTrie)
|
||||
r += struct.pack("<I", self.nTime)
|
||||
r += struct.pack("<I", self.nBits)
|
||||
r += struct.pack("<I", self.nNonce)
|
||||
|
@ -559,8 +572,8 @@ class CBlockHeader():
|
|||
return self.sha256
|
||||
|
||||
def __repr__(self):
|
||||
return "CBlockHeader(nVersion=%i hashPrevBlock=%064x hashMerkleRoot=%064x nTime=%s nBits=%08x nNonce=%08x)" \
|
||||
% (self.nVersion, self.hashPrevBlock, self.hashMerkleRoot,
|
||||
return "CBlockHeader(nVersion=%i hashPrevBlock=%064x hashMerkleRoot=%064x hashClaimTrie=%064x nTime=%s nBits=%08x nNonce=%08x)" \
|
||||
% (self.nVersion, self.hashPrevBlock, self.hashMerkleRoot, self.hashClaimTrie,
|
||||
time.ctime(self.nTime), self.nBits, self.nNonce)
|
||||
|
||||
|
||||
|
@ -614,7 +627,7 @@ class CBlock(CBlockHeader):
|
|||
def is_valid(self):
|
||||
self.calc_sha256()
|
||||
target = uint256_from_compact(self.nBits)
|
||||
if self.sha256 > target:
|
||||
if lbryPOW(self.sha256) > target:
|
||||
return False
|
||||
for tx in self.vtx:
|
||||
if not tx.is_valid():
|
||||
|
@ -626,13 +639,13 @@ class CBlock(CBlockHeader):
|
|||
def solve(self):
|
||||
self.rehash()
|
||||
target = uint256_from_compact(self.nBits)
|
||||
while self.sha256 > target:
|
||||
while lbryPOW(self.sha256) > target:
|
||||
self.nNonce += 1
|
||||
self.rehash()
|
||||
|
||||
def __repr__(self):
|
||||
return "CBlock(nVersion=%i hashPrevBlock=%064x hashMerkleRoot=%064x nTime=%s nBits=%08x nNonce=%08x vtx=%s)" \
|
||||
% (self.nVersion, self.hashPrevBlock, self.hashMerkleRoot,
|
||||
return "CBlock(nVersion=%i hashPrevBlock=%064x hashMerkleRoot=%064x hashClaimTrie=%064x nTime=%s nBits=%08x nNonce=%08x vtx=%s)" \
|
||||
% (self.nVersion, self.hashPrevBlock, self.hashMerkleRoot, self.hashClaimTrie,
|
||||
time.ctime(self.nTime), self.nBits, self.nNonce, repr(self.vtx))
|
||||
|
||||
|
||||
|
@ -1223,7 +1236,7 @@ class msg_headers():
|
|||
self.headers = headers if headers is not None else []
|
||||
|
||||
def deserialize(self, f):
|
||||
# comment in bitcoind indicates these should be deserialized as blocks
|
||||
# comment in lbrycrdd indicates these should be deserialized as blocks
|
||||
blocks = deser_vector(f, CBlock)
|
||||
for x in blocks:
|
||||
self.headers.append(CBlockHeader(x))
|
||||
|
|
|
@ -51,9 +51,9 @@ MESSAGEMAP = {
|
|||
}
|
||||
|
||||
MAGIC_BYTES = {
|
||||
"mainnet": b"\xf9\xbe\xb4\xd9", # mainnet
|
||||
"testnet3": b"\x0b\x11\x09\x07", # testnet3
|
||||
"regtest": b"\xfa\xbf\xb5\xda", # regtest
|
||||
"mainnet": b"\xfa\xe4\xaa\xf1", # mainnet
|
||||
"testnet3": b"\xfa\xe4\xaa\xe1", # testnet3
|
||||
"regtest": b"\xfa\xe4\xaa\xd1", # regtest
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -105,9 +105,9 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
|
||||
parser = argparse.ArgumentParser(usage="%(prog)s [options]")
|
||||
parser.add_argument("--nocleanup", dest="nocleanup", default=False, action="store_true",
|
||||
help="Leave bitcoinds and test.* datadir on exit or error")
|
||||
help="Leave lbrycrdds and test.* datadir on exit or error")
|
||||
parser.add_argument("--noshutdown", dest="noshutdown", default=False, action="store_true",
|
||||
help="Don't stop bitcoinds after the test execution")
|
||||
help="Don't stop lbrycrdds after the test execution")
|
||||
parser.add_argument("--cachedir", dest="cachedir", default=os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + "/../../cache"),
|
||||
help="Directory for caching pregenerated datadirs (default: %(default)s)")
|
||||
parser.add_argument("--tmpdir", dest="tmpdir", help="Root directory for datadirs")
|
||||
|
@ -125,7 +125,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
parser.add_argument("--pdbonfailure", dest="pdbonfailure", default=False, action="store_true",
|
||||
help="Attach a python debugger if test fails")
|
||||
parser.add_argument("--usecli", dest="usecli", default=False, action="store_true",
|
||||
help="use bitcoin-cli instead of RPC for all commands")
|
||||
help="use lbrycrd-cli instead of RPC for all commands")
|
||||
self.add_options(parser)
|
||||
self.options = parser.parse_args()
|
||||
|
||||
|
@ -137,8 +137,8 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
|
||||
config = configparser.ConfigParser()
|
||||
config.read_file(open(self.options.configfile))
|
||||
self.options.bitcoind = os.getenv("BITCOIND", default=config["environment"]["BUILDDIR"] + '/src/bitcoind' + config["environment"]["EXEEXT"])
|
||||
self.options.bitcoincli = os.getenv("BITCOINCLI", default=config["environment"]["BUILDDIR"] + '/src/bitcoin-cli' + config["environment"]["EXEEXT"])
|
||||
self.options.lbrycrdd = os.getenv("LBRYCRDD", default=config["environment"]["BUILDDIR"] + '/src/lbrycrdd' + config["environment"]["EXEEXT"])
|
||||
self.options.lbrycrdcli = os.getenv("LBRYCRDCLI", default=config["environment"]["BUILDDIR"] + '/src/lbrycrd-cli' + config["environment"]["EXEEXT"])
|
||||
|
||||
os.environ['PATH'] = os.pathsep.join([
|
||||
os.path.join(config['environment']['BUILDDIR'], 'src'),
|
||||
|
@ -196,7 +196,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
else:
|
||||
for node in self.nodes:
|
||||
node.cleanup_on_exit = False
|
||||
self.log.info("Note: bitcoinds were not stopped and may still be running")
|
||||
self.log.info("Note: lbrycrdds were not stopped and may still be running")
|
||||
|
||||
if not self.options.nocleanup and not self.options.noshutdown and success != TestStatus.FAILED:
|
||||
self.log.info("Cleaning up {} on exit".format(self.options.tmpdir))
|
||||
|
@ -288,15 +288,15 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
if extra_args is None:
|
||||
extra_args = [[]] * num_nodes
|
||||
if binary is None:
|
||||
binary = [self.options.bitcoind] * num_nodes
|
||||
binary = [self.options.lbrycrdd] * num_nodes
|
||||
assert_equal(len(extra_confs), num_nodes)
|
||||
assert_equal(len(extra_args), num_nodes)
|
||||
assert_equal(len(binary), num_nodes)
|
||||
for i in range(num_nodes):
|
||||
self.nodes.append(TestNode(i, get_datadir_path(self.options.tmpdir, i), rpchost=rpchost, timewait=self.rpc_timewait, bitcoind=binary[i], bitcoin_cli=self.options.bitcoincli, mocktime=self.mocktime, coverage_dir=self.options.coveragedir, extra_conf=extra_confs[i], extra_args=extra_args[i], use_cli=self.options.usecli))
|
||||
self.nodes.append(TestNode(i, get_datadir_path(self.options.tmpdir, i), rpchost=rpchost, timewait=self.rpc_timewait, lbrycrdd=binary[i], lbrycrd_cli=self.options.lbrycrdcli, mocktime=self.mocktime, coverage_dir=self.options.coveragedir, extra_conf=extra_confs[i], extra_args=extra_args[i], use_cli=self.options.usecli))
|
||||
|
||||
def start_node(self, i, *args, **kwargs):
|
||||
"""Start a bitcoind"""
|
||||
"""Start a lbrycrdd"""
|
||||
|
||||
node = self.nodes[i]
|
||||
|
||||
|
@ -307,7 +307,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
coverage.write_all_rpc_commands(self.options.coveragedir, node.rpc)
|
||||
|
||||
def start_nodes(self, extra_args=None, *args, **kwargs):
|
||||
"""Start multiple bitcoinds"""
|
||||
"""Start multiple lbrycrdds"""
|
||||
|
||||
if extra_args is None:
|
||||
extra_args = [None] * self.num_nodes
|
||||
|
@ -327,12 +327,12 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
coverage.write_all_rpc_commands(self.options.coveragedir, node.rpc)
|
||||
|
||||
def stop_node(self, i, expected_stderr=''):
|
||||
"""Stop a bitcoind test node"""
|
||||
"""Stop a lbrycrdd test node"""
|
||||
self.nodes[i].stop_node(expected_stderr)
|
||||
self.nodes[i].wait_until_stopped()
|
||||
|
||||
def stop_nodes(self):
|
||||
"""Stop multiple bitcoind test nodes"""
|
||||
"""Stop multiple lbrycrdd test nodes"""
|
||||
for node in self.nodes:
|
||||
# Issue RPC to stop nodes
|
||||
node.stop_node()
|
||||
|
@ -382,7 +382,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
For backward compatibility of the python scripts with previous
|
||||
versions of the cache, this helper function sets mocktime to Jan 1,
|
||||
2014 + (201 * 10 * 60)"""
|
||||
self.mocktime = 1388534400 + (201 * 10 * 60)
|
||||
self.mocktime = 1451606400 + (201 * 10 * 60)
|
||||
|
||||
def disable_mocktime(self):
|
||||
self.mocktime = 0
|
||||
|
@ -401,7 +401,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
# User can provide log level as a number or string (eg DEBUG). loglevel was caught as a string, so try to convert it to an int
|
||||
ll = int(self.options.loglevel) if self.options.loglevel.isdigit() else self.options.loglevel.upper()
|
||||
ch.setLevel(ll)
|
||||
# Format logs the same as bitcoind's debug.log with microprecision (so log files can be concatenated and sorted)
|
||||
# Format logs the same as lbrycrdd's debug.log with microprecision (so log files can be concatenated and sorted)
|
||||
formatter = logging.Formatter(fmt='%(asctime)s.%(msecs)03d000Z %(name)s (%(levelname)s): %(message)s', datefmt='%Y-%m-%dT%H:%M:%S')
|
||||
formatter.converter = time.gmtime
|
||||
fh.setFormatter(formatter)
|
||||
|
@ -438,13 +438,13 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
if os.path.isdir(get_datadir_path(self.options.cachedir, i)):
|
||||
shutil.rmtree(get_datadir_path(self.options.cachedir, i))
|
||||
|
||||
# Create cache directories, run bitcoinds:
|
||||
# Create cache directories, run lbrycrdds:
|
||||
for i in range(MAX_NODES):
|
||||
datadir = initialize_datadir(self.options.cachedir, i)
|
||||
args = [self.options.bitcoind, "-datadir=" + datadir, '-disablewallet']
|
||||
args = [self.options.lbrycrdd, "-datadir=" + datadir, '-disablewallet']
|
||||
if i > 0:
|
||||
args.append("-connect=127.0.0.1:" + str(p2p_port(0)))
|
||||
self.nodes.append(TestNode(i, get_datadir_path(self.options.cachedir, i), extra_conf=["bind=127.0.0.1"], extra_args=[], rpchost=None, timewait=self.rpc_timewait, bitcoind=self.options.bitcoind, bitcoin_cli=self.options.bitcoincli, mocktime=self.mocktime, coverage_dir=None))
|
||||
self.nodes.append(TestNode(i, get_datadir_path(self.options.cachedir, i), extra_conf=["bind=127.0.0.1"], extra_args=[], rpchost=None, timewait=self.rpc_timewait, lbrycrdd=self.options.lbrycrdd, lbrycrd_cli=self.options.lbrycrdcli, mocktime=self.mocktime, coverage_dir=None))
|
||||
self.nodes[i].args = args
|
||||
self.start_node(i)
|
||||
|
||||
|
@ -457,7 +457,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
# Note: To preserve compatibility with older versions of
|
||||
# initialize_chain, only 4 nodes will generate coins.
|
||||
#
|
||||
# blocks are created with timestamps 10 minutes apart
|
||||
# blocks are created with timestamps 2 minutes apart
|
||||
# starting from 2010 minutes in the past
|
||||
self.enable_mocktime()
|
||||
block_time = self.mocktime - (201 * 10 * 60)
|
||||
|
@ -481,14 +481,14 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
for i in range(MAX_NODES):
|
||||
os.rmdir(cache_path(i, 'wallets')) # Remove empty wallets dir
|
||||
for entry in os.listdir(cache_path(i)):
|
||||
if entry not in ['chainstate', 'blocks']:
|
||||
if entry not in ['chainstate', 'blocks', 'claimtrie']:
|
||||
os.remove(cache_path(i, entry))
|
||||
|
||||
for i in range(self.num_nodes):
|
||||
from_dir = get_datadir_path(self.options.cachedir, i)
|
||||
to_dir = get_datadir_path(self.options.tmpdir, i)
|
||||
shutil.copytree(from_dir, to_dir)
|
||||
initialize_datadir(self.options.tmpdir, i) # Overwrite port/rpcport in bitcoin.conf
|
||||
initialize_datadir(self.options.tmpdir, i) # Overwrite port/rpcport in lbrycrd.conf
|
||||
|
||||
def _initialize_chain_clean(self):
|
||||
"""Initialize empty blockchain for use by the test.
|
||||
|
@ -505,10 +505,10 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
except ImportError:
|
||||
raise SkipTest("python3-zmq module not available.")
|
||||
|
||||
def skip_if_no_bitcoind_zmq(self):
|
||||
"""Skip the running test if bitcoind has not been compiled with zmq support."""
|
||||
def skip_if_no_lbrycrdd_zmq(self):
|
||||
"""Skip the running test if lbrycrdd has not been compiled with zmq support."""
|
||||
if not self.is_zmq_compiled():
|
||||
raise SkipTest("bitcoind has not been built with zmq enabled.")
|
||||
raise SkipTest("lbrycrdd has not been built with zmq enabled.")
|
||||
|
||||
def skip_if_no_wallet(self):
|
||||
"""Skip the running test if wallet has not been compiled."""
|
||||
|
@ -516,12 +516,12 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||
raise SkipTest("wallet has not been compiled.")
|
||||
|
||||
def skip_if_no_cli(self):
|
||||
"""Skip the running test if bitcoin-cli has not been compiled."""
|
||||
"""Skip the running test if lbrycrd-cli has not been compiled."""
|
||||
if not self.is_cli_compiled():
|
||||
raise SkipTest("bitcoin-cli has not been compiled.")
|
||||
raise SkipTest("lbrycrd-cli has not been compiled.")
|
||||
|
||||
def is_cli_compiled(self):
|
||||
"""Checks whether bitcoin-cli was compiled."""
|
||||
"""Checks whether lbrycrd-cli was compiled."""
|
||||
config = configparser.ConfigParser()
|
||||
config.read_file(open(self.options.configfile))
|
||||
|
||||
|
|
44
test/functional/test_framework/test_node.py
Executable file → Normal file
44
test/functional/test_framework/test_node.py
Executable file → Normal file
|
@ -2,7 +2,7 @@
|
|||
# Copyright (c) 2017-2018 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Class for bitcoind node under test"""
|
||||
"""Class for lbrycrdd node under test"""
|
||||
|
||||
import contextlib
|
||||
import decimal
|
||||
|
@ -31,7 +31,7 @@ from .util import (
|
|||
# For Python 3.4 compatibility
|
||||
JSONDecodeError = getattr(json, "JSONDecodeError", ValueError)
|
||||
|
||||
BITCOIND_PROC_WAIT_TIMEOUT = 60
|
||||
LBRYCRDD_PROC_WAIT_TIMEOUT = 60
|
||||
|
||||
|
||||
class FailedToStartError(Exception):
|
||||
|
@ -45,7 +45,7 @@ class ErrorMatch(Enum):
|
|||
|
||||
|
||||
class TestNode():
|
||||
"""A class for representing a bitcoind node under test.
|
||||
"""A class for representing a lbrycrdd node under test.
|
||||
|
||||
This class contains:
|
||||
|
||||
|
@ -58,14 +58,14 @@ class TestNode():
|
|||
To make things easier for the test writer, any unrecognised messages will
|
||||
be dispatched to the RPC connection."""
|
||||
|
||||
def __init__(self, i, datadir, *, rpchost, timewait, bitcoind, bitcoin_cli, mocktime, coverage_dir, extra_conf=None, extra_args=None, use_cli=False):
|
||||
def __init__(self, i, datadir, *, rpchost, timewait, lbrycrdd, lbrycrd_cli, mocktime, coverage_dir, extra_conf=None, extra_args=None, use_cli=False):
|
||||
self.index = i
|
||||
self.datadir = datadir
|
||||
self.stdout_dir = os.path.join(self.datadir, "stdout")
|
||||
self.stderr_dir = os.path.join(self.datadir, "stderr")
|
||||
self.rpchost = rpchost
|
||||
self.rpc_timeout = timewait
|
||||
self.binary = bitcoind
|
||||
self.binary = lbrycrdd
|
||||
self.coverage_dir = coverage_dir
|
||||
if extra_conf != None:
|
||||
append_config(datadir, extra_conf)
|
||||
|
@ -84,7 +84,7 @@ class TestNode():
|
|||
"-uacomment=testnode%d" % i
|
||||
]
|
||||
|
||||
self.cli = TestNodeCLI(bitcoin_cli, self.datadir)
|
||||
self.cli = TestNodeCLI(lbrycrd_cli, self.datadir)
|
||||
self.use_cli = use_cli
|
||||
|
||||
self.running = False
|
||||
|
@ -122,7 +122,7 @@ class TestNode():
|
|||
raise AssertionError(self._node_msg(msg))
|
||||
|
||||
def __del__(self):
|
||||
# Ensure that we don't leave any bitcoind processes lying around after
|
||||
# Ensure that we don't leave any lbrycrdd processes lying around after
|
||||
# the test ends
|
||||
if self.process and self.cleanup_on_exit:
|
||||
# Should only happen on test failure
|
||||
|
@ -144,7 +144,7 @@ class TestNode():
|
|||
if extra_args is None:
|
||||
extra_args = self.extra_args
|
||||
|
||||
# Add a new stdout and stderr file each time bitcoind is started
|
||||
# Add a new stdout and stderr file each time lbrycrdd is started
|
||||
if stderr is None:
|
||||
stderr = tempfile.NamedTemporaryFile(dir=self.stderr_dir, delete=False)
|
||||
if stdout is None:
|
||||
|
@ -153,7 +153,7 @@ class TestNode():
|
|||
self.stdout = stdout
|
||||
|
||||
# Delete any existing cookie file -- if such a file exists (eg due to
|
||||
# unclean shutdown), it will get overwritten anyway by bitcoind, and
|
||||
# unclean shutdown), it will get overwritten anyway by lbrycrdd, and
|
||||
# potentially interfere with our attempt to authenticate
|
||||
delete_cookie_file(self.datadir)
|
||||
|
||||
|
@ -163,16 +163,16 @@ class TestNode():
|
|||
self.process = subprocess.Popen(self.args + extra_args, env=subp_env, stdout=stdout, stderr=stderr, **kwargs)
|
||||
|
||||
self.running = True
|
||||
self.log.debug("bitcoind started, waiting for RPC to come up")
|
||||
self.log.debug("lbrycrdd started, waiting for RPC to come up")
|
||||
|
||||
def wait_for_rpc_connection(self):
|
||||
"""Sets up an RPC connection to the bitcoind process. Returns False if unable to connect."""
|
||||
"""Sets up an RPC connection to the lbrycrdd process. Returns False if unable to connect."""
|
||||
# Poll at a rate of four times per second
|
||||
poll_per_s = 4
|
||||
for _ in range(poll_per_s * self.rpc_timeout):
|
||||
if self.process.poll() is not None:
|
||||
raise FailedToStartError(self._node_msg(
|
||||
'bitcoind exited with status {} during initialization'.format(self.process.returncode)))
|
||||
'lbrycrdd exited with status {} during initialization'.format(self.process.returncode)))
|
||||
try:
|
||||
self.rpc = get_rpc_proxy(rpc_url(self.datadir, self.index, self.rpchost), self.index, timeout=self.rpc_timeout, coveragedir=self.coverage_dir)
|
||||
self.rpc.getblockcount()
|
||||
|
@ -187,11 +187,11 @@ class TestNode():
|
|||
except JSONRPCException as e: # Initialization phase
|
||||
if e.error['code'] != -28: # RPC in warmup?
|
||||
raise # unknown JSON RPC exception
|
||||
except ValueError as e: # cookie file not found and no rpcuser or rpcassword. bitcoind still starting
|
||||
except ValueError as e: # cookie file not found and no rpcuser or rpcassword. lbrycrdd still starting
|
||||
if "No RPC credentials" not in str(e):
|
||||
raise
|
||||
time.sleep(1.0 / poll_per_s)
|
||||
self._raise_assertion_error("Unable to connect to bitcoind")
|
||||
self._raise_assertion_error("Unable to connect to lbrycrdd")
|
||||
|
||||
def get_wallet_rpc(self, wallet_name):
|
||||
if self.use_cli:
|
||||
|
@ -243,7 +243,7 @@ class TestNode():
|
|||
self.log.debug("Node stopped")
|
||||
return True
|
||||
|
||||
def wait_until_stopped(self, timeout=BITCOIND_PROC_WAIT_TIMEOUT):
|
||||
def wait_until_stopped(self, timeout=LBRYCRDD_PROC_WAIT_TIMEOUT):
|
||||
wait_until(self.is_node_stopped, timeout=timeout)
|
||||
|
||||
@contextlib.contextmanager
|
||||
|
@ -266,11 +266,11 @@ class TestNode():
|
|||
def assert_start_raises_init_error(self, extra_args=None, expected_msg=None, match=ErrorMatch.FULL_TEXT, *args, **kwargs):
|
||||
"""Attempt to start the node and expect it to raise an error.
|
||||
|
||||
extra_args: extra arguments to pass through to bitcoind
|
||||
expected_msg: regex that stderr should match when bitcoind fails
|
||||
extra_args: extra arguments to pass through to lbrycrdd
|
||||
expected_msg: regex that stderr should match when lbrycrdd fails
|
||||
|
||||
Will throw if bitcoind starts without an error.
|
||||
Will throw if an expected_msg is provided and it does not match bitcoind's stdout."""
|
||||
Will throw if lbrycrdd starts without an error.
|
||||
Will throw if an expected_msg is provided and it does not match lbrycrdd's stdout."""
|
||||
with tempfile.NamedTemporaryFile(dir=self.stderr_dir, delete=False) as log_stderr, \
|
||||
tempfile.NamedTemporaryFile(dir=self.stdout_dir, delete=False) as log_stdout:
|
||||
try:
|
||||
|
@ -279,7 +279,7 @@ class TestNode():
|
|||
self.stop_node()
|
||||
self.wait_until_stopped()
|
||||
except FailedToStartError as e:
|
||||
self.log.debug('bitcoind failed to start: %s', e)
|
||||
self.log.debug('lbrycrdd failed to start: %s', e)
|
||||
self.running = False
|
||||
self.process = None
|
||||
# Check stderr for expected message
|
||||
|
@ -300,9 +300,9 @@ class TestNode():
|
|||
'Expected message "{}" does not fully match stderr:\n"{}"'.format(expected_msg, stderr))
|
||||
else:
|
||||
if expected_msg is None:
|
||||
assert_msg = "bitcoind should have exited with an error"
|
||||
assert_msg = "lbrycrdd should have exited with an error"
|
||||
else:
|
||||
assert_msg = "bitcoind should have exited with expected error " + expected_msg
|
||||
assert_msg = "lbrycrdd should have exited with expected error " + expected_msg
|
||||
self._raise_assertion_error(assert_msg)
|
||||
|
||||
def add_p2p_connection(self, p2p_conn, *, wait_for_verack=True, **kwargs):
|
||||
|
|
|
@ -292,9 +292,9 @@ def initialize_datadir(dirname, n):
|
|||
datadir = get_datadir_path(dirname, n)
|
||||
if not os.path.isdir(datadir):
|
||||
os.makedirs(datadir)
|
||||
with open(os.path.join(datadir, "bitcoin.conf"), 'w', encoding='utf8') as f:
|
||||
with open(os.path.join(datadir, "lbrycrd.conf"), 'w', encoding='utf8') as f:
|
||||
f.write("regtest=1\n")
|
||||
f.write("[regtest]\n")
|
||||
f.write("[lbrycrdreg]\n")
|
||||
f.write("port=" + str(p2p_port(n)) + "\n")
|
||||
f.write("rpcport=" + str(rpc_port(n)) + "\n")
|
||||
f.write("server=1\n")
|
||||
|
@ -310,15 +310,15 @@ def get_datadir_path(dirname, n):
|
|||
return os.path.join(dirname, "node" + str(n))
|
||||
|
||||
def append_config(datadir, options):
|
||||
with open(os.path.join(datadir, "bitcoin.conf"), 'a', encoding='utf8') as f:
|
||||
with open(os.path.join(datadir, "lbrycrd.conf"), 'a', encoding='utf8') as f:
|
||||
for option in options:
|
||||
f.write(option + "\n")
|
||||
|
||||
def get_auth_cookie(datadir):
|
||||
user = None
|
||||
password = None
|
||||
if os.path.isfile(os.path.join(datadir, "bitcoin.conf")):
|
||||
with open(os.path.join(datadir, "bitcoin.conf"), 'r', encoding='utf8') as f:
|
||||
if os.path.isfile(os.path.join(datadir, "lbrycrd.conf")):
|
||||
with open(os.path.join(datadir, "lbrycrd.conf"), 'r', encoding='utf8') as f:
|
||||
for line in f:
|
||||
if line.startswith("rpcuser="):
|
||||
assert user is None # Ensure that there is only one rpcuser line
|
||||
|
|
|
@ -237,7 +237,7 @@ def main():
|
|||
|
||||
logging.debug("Temporary test directory at %s" % tmpdir)
|
||||
|
||||
enable_bitcoind = config["components"].getboolean("ENABLE_BITCOIND")
|
||||
enable_lbrycrdd = config["components"].getboolean("ENABLE_LBRYCRDD")
|
||||
|
||||
if config["environment"]["EXEEXT"] == ".exe" and not args.force:
|
||||
# https://github.com/bitcoin/bitcoin/commit/d52802551752140cf41f0d9a225a43e84404d3e9
|
||||
|
@ -245,7 +245,7 @@ def main():
|
|||
print("Tests currently disabled on Windows by default. Use --force option to enable")
|
||||
sys.exit(0)
|
||||
|
||||
if not enable_bitcoind:
|
||||
if not enable_lbrycrdd:
|
||||
print("No functional tests to run.")
|
||||
print("Rerun ./configure with --with-daemon and then make")
|
||||
sys.exit(0)
|
||||
|
@ -309,10 +309,10 @@ def main():
|
|||
def run_tests(test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=False, args=None, combined_logs_len=0, failfast=False):
|
||||
args = args or []
|
||||
|
||||
# Warn if bitcoind is already running (unix only)
|
||||
# Warn if lbrycrdd is already running (unix only)
|
||||
try:
|
||||
if subprocess.check_output(["pidof", "bitcoind"]) is not None:
|
||||
print("%sWARNING!%s There is already a bitcoind process running on this system. Tests may fail unexpectedly due to resource contention!" % (BOLD[1], BOLD[0]))
|
||||
if subprocess.check_output(["pidof", "lbrycrdd"]) is not None:
|
||||
print("%sWARNING!%s There is already a lbrycrdd process running on this system. Tests may fail unexpectedly due to resource contention!" % (BOLD[1], BOLD[0]))
|
||||
except (OSError, subprocess.SubprocessError):
|
||||
pass
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|||
|
||||
sync_blocks(self.nodes)
|
||||
newbalance = self.nodes[0].getbalance()
|
||||
assert(balance - newbalance < Decimal("0.001")) #no more than fees lost
|
||||
assert(balance - newbalance < Decimal("0.00102")) #no more than fees lost
|
||||
balance = newbalance
|
||||
|
||||
# Disconnect nodes so node0's transactions don't get into node1's mempool
|
||||
|
|
10
test/functional/wallet_backup.py
Executable file → Normal file
10
test/functional/wallet_backup.py
Executable file → Normal file
|
@ -58,7 +58,7 @@ class WalletBackupTest(BitcoinTestFramework):
|
|||
|
||||
def one_send(self, from_node, to_address):
|
||||
if (randint(1,2) == 1):
|
||||
amount = Decimal(randint(1,10)) / Decimal(10)
|
||||
amount = Decimal(randint(1,2)) / Decimal(10)
|
||||
self.nodes[from_node].sendtoaddress(to_address, amount)
|
||||
|
||||
def do_one_round(self):
|
||||
|
@ -110,9 +110,9 @@ class WalletBackupTest(BitcoinTestFramework):
|
|||
self.nodes[3].generate(100)
|
||||
sync_blocks(self.nodes)
|
||||
|
||||
assert_equal(self.nodes[0].getbalance(), 50)
|
||||
assert_equal(self.nodes[1].getbalance(), 50)
|
||||
assert_equal(self.nodes[2].getbalance(), 50)
|
||||
assert_equal(self.nodes[0].getbalance(), 1)
|
||||
assert_equal(self.nodes[1].getbalance(), 1)
|
||||
assert_equal(self.nodes[2].getbalance(), 1)
|
||||
assert_equal(self.nodes[3].getbalance(), 0)
|
||||
|
||||
self.log.info("Creating transactions")
|
||||
|
@ -145,7 +145,7 @@ class WalletBackupTest(BitcoinTestFramework):
|
|||
|
||||
# At this point, there are 214 blocks (103 for setup, then 10 rounds, then 101.)
|
||||
# 114 are mature, so the sum of all wallets should be 114 * 50 = 5700.
|
||||
assert_equal(total, 5700)
|
||||
assert_equal(total, 114)
|
||||
|
||||
##
|
||||
# Test restoring spender wallets from backups
|
||||
|
|
|
@ -58,22 +58,22 @@ class WalletTest(BitcoinTestFramework):
|
|||
self.nodes[1].generatetoaddress(100, RANDOM_COINBASE_ADDRESS)
|
||||
self.sync_all()
|
||||
|
||||
assert_equal(self.nodes[0].getbalance(), 50)
|
||||
assert_equal(self.nodes[1].getbalance(), 50)
|
||||
assert_equal(self.nodes[0].getbalance(), 1)
|
||||
assert_equal(self.nodes[1].getbalance(), 1)
|
||||
|
||||
self.log.info("Test getbalance with different arguments")
|
||||
assert_equal(self.nodes[0].getbalance("*"), 50)
|
||||
assert_equal(self.nodes[0].getbalance("*", 1), 50)
|
||||
assert_equal(self.nodes[0].getbalance("*", 1, True), 50)
|
||||
assert_equal(self.nodes[0].getbalance(minconf=1), 50)
|
||||
assert_equal(self.nodes[0].getbalance("*"), 1)
|
||||
assert_equal(self.nodes[0].getbalance("*", 1), 1)
|
||||
assert_equal(self.nodes[0].getbalance("*", 1, True), 1)
|
||||
assert_equal(self.nodes[0].getbalance(minconf=1), 1)
|
||||
|
||||
# Send 40 BTC from 0 to 1 and 60 BTC from 1 to 0.
|
||||
txs = create_transactions(self.nodes[0], self.nodes[1].getnewaddress(), 40, [Decimal('0.01')])
|
||||
txs = create_transactions(self.nodes[0], self.nodes[1].getnewaddress(), Decimal('0.4'), [Decimal('0.01')])
|
||||
self.nodes[0].sendrawtransaction(txs[0]['hex'])
|
||||
self.nodes[1].sendrawtransaction(txs[0]['hex']) # sending on both nodes is faster than waiting for propagation
|
||||
|
||||
self.sync_all()
|
||||
txs = create_transactions(self.nodes[1], self.nodes[0].getnewaddress(), 60, [Decimal('0.01'), Decimal('0.02')])
|
||||
txs = create_transactions(self.nodes[1], self.nodes[0].getnewaddress(), Decimal('0.6'), [Decimal('0.01'), Decimal('0.02')])
|
||||
self.nodes[1].sendrawtransaction(txs[0]['hex'])
|
||||
self.nodes[0].sendrawtransaction(txs[0]['hex']) # sending on both nodes is faster than waiting for propagation
|
||||
self.sync_all()
|
||||
|
@ -84,18 +84,18 @@ class WalletTest(BitcoinTestFramework):
|
|||
self.log.info("Test getbalance and getunconfirmedbalance with unconfirmed inputs")
|
||||
|
||||
# getbalance without any arguments includes unconfirmed transactions, but not untrusted transactions
|
||||
assert_equal(self.nodes[0].getbalance(), Decimal('9.99')) # change from node 0's send
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal('29.99')) # change from node 1's send
|
||||
assert_equal(self.nodes[0].getbalance(), Decimal('0.59')) # change from node 0's send
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal('0.39')) # change from node 1's send
|
||||
# Same with minconf=0
|
||||
assert_equal(self.nodes[0].getbalance(minconf=0), Decimal('9.99'))
|
||||
assert_equal(self.nodes[1].getbalance(minconf=0), Decimal('29.99'))
|
||||
assert_equal(self.nodes[0].getbalance(minconf=0), Decimal('0.59'))
|
||||
assert_equal(self.nodes[1].getbalance(minconf=0), Decimal('0.39'))
|
||||
# getbalance with a minconf incorrectly excludes coins that have been spent more recently than the minconf blocks ago
|
||||
# TODO: fix getbalance tracking of coin spentness depth
|
||||
assert_equal(self.nodes[0].getbalance(minconf=1), Decimal('0'))
|
||||
assert_equal(self.nodes[1].getbalance(minconf=1), Decimal('0'))
|
||||
# getunconfirmedbalance
|
||||
assert_equal(self.nodes[0].getunconfirmedbalance(), Decimal('60')) # output of node 1's spend
|
||||
assert_equal(self.nodes[1].getunconfirmedbalance(), Decimal('0')) # Doesn't include output of node 0's send since it was spent
|
||||
assert_equal(self.nodes[0].getunconfirmedbalance(), Decimal('0.6')) # output of node 1's spend
|
||||
assert_equal(self.nodes[1].getunconfirmedbalance(), Decimal('0.4')) # Doesn't include output of node 0's send since it was spent
|
||||
|
||||
# Node 1 bumps the transaction fee and resends
|
||||
self.nodes[1].sendrawtransaction(txs[1]['hex'])
|
||||
|
@ -103,20 +103,20 @@ class WalletTest(BitcoinTestFramework):
|
|||
|
||||
self.log.info("Test getbalance and getunconfirmedbalance with conflicted unconfirmed inputs")
|
||||
|
||||
assert_equal(self.nodes[0].getwalletinfo()["unconfirmed_balance"], Decimal('60')) # output of node 1's send
|
||||
assert_equal(self.nodes[0].getunconfirmedbalance(), Decimal('60'))
|
||||
assert_equal(self.nodes[1].getwalletinfo()["unconfirmed_balance"], Decimal('0')) # Doesn't include output of node 0's send since it was spent
|
||||
assert_equal(self.nodes[1].getunconfirmedbalance(), Decimal('0'))
|
||||
assert_equal(self.nodes[0].getwalletinfo()["unconfirmed_balance"], Decimal('0.6')) # output of node 1's send
|
||||
assert_equal(self.nodes[0].getunconfirmedbalance(), Decimal('0.6'))
|
||||
assert_equal(self.nodes[1].getwalletinfo()["unconfirmed_balance"], Decimal('0.4')) # Doesn't include output of node 0's send since it was spent
|
||||
assert_equal(self.nodes[1].getunconfirmedbalance(), Decimal('0.4'))
|
||||
|
||||
self.nodes[1].generatetoaddress(1, RANDOM_COINBASE_ADDRESS)
|
||||
self.sync_all()
|
||||
|
||||
# balances are correct after the transactions are confirmed
|
||||
assert_equal(self.nodes[0].getbalance(), Decimal('69.99')) # node 1's send plus change from node 0's send
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal('29.98')) # change from node 0's send
|
||||
assert_equal(self.nodes[0].getbalance(), Decimal('1.19')) # node 1's send plus change from node 0's send
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal('0.78')) # change from node 0's send
|
||||
|
||||
# Send total balance away from node 1
|
||||
txs = create_transactions(self.nodes[1], self.nodes[0].getnewaddress(), Decimal('29.97'), [Decimal('0.01')])
|
||||
txs = create_transactions(self.nodes[1], self.nodes[0].getnewaddress(), Decimal('0.77'), [Decimal('0.01')])
|
||||
self.nodes[1].sendrawtransaction(txs[0]['hex'])
|
||||
self.nodes[1].generatetoaddress(2, RANDOM_COINBASE_ADDRESS)
|
||||
self.sync_all()
|
||||
|
|
|
@ -56,15 +56,15 @@ class WalletTest(BitcoinTestFramework):
|
|||
self.nodes[0].generate(1)
|
||||
|
||||
walletinfo = self.nodes[0].getwalletinfo()
|
||||
assert_equal(walletinfo['immature_balance'], 50)
|
||||
assert_equal(walletinfo['immature_balance'], 1)
|
||||
assert_equal(walletinfo['balance'], 0)
|
||||
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
self.nodes[1].generate(101)
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
|
||||
assert_equal(self.nodes[0].getbalance(), 50)
|
||||
assert_equal(self.nodes[1].getbalance(), 50)
|
||||
assert_equal(self.nodes[0].getbalance(), 1)
|
||||
assert_equal(self.nodes[1].getbalance(), 1)
|
||||
assert_equal(self.nodes[2].getbalance(), 0)
|
||||
|
||||
# Check that only first and second nodes have UTXOs
|
||||
|
@ -78,16 +78,16 @@ class WalletTest(BitcoinTestFramework):
|
|||
# First, outputs that are unspent both in the chain and in the
|
||||
# mempool should appear with or without include_mempool
|
||||
txout = self.nodes[0].gettxout(txid=confirmed_txid, n=confirmed_index, include_mempool=False)
|
||||
assert_equal(txout['value'], 50)
|
||||
assert_equal(txout['value'], 1)
|
||||
txout = self.nodes[0].gettxout(txid=confirmed_txid, n=confirmed_index, include_mempool=True)
|
||||
assert_equal(txout['value'], 50)
|
||||
assert_equal(txout['value'], 1)
|
||||
|
||||
# Send 21 BTC from 0 to 2 using sendtoaddress call.
|
||||
# Locked memory should use at least 32 bytes to sign each transaction
|
||||
self.log.info("test getmemoryinfo")
|
||||
memory_before = self.nodes[0].getmemoryinfo()
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 11)
|
||||
mempool_txid = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 10)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 0.11)
|
||||
mempool_txid = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 0.1)
|
||||
memory_after = self.nodes[0].getmemoryinfo()
|
||||
assert(memory_before['locked']['used'] + 64 <= memory_after['locked']['used'])
|
||||
|
||||
|
@ -95,7 +95,7 @@ class WalletTest(BitcoinTestFramework):
|
|||
# utxo spent in mempool should be visible if you exclude mempool
|
||||
# but invisible if you include mempool
|
||||
txout = self.nodes[0].gettxout(confirmed_txid, confirmed_index, False)
|
||||
assert_equal(txout['value'], 50)
|
||||
assert_equal(txout['value'], 1)
|
||||
txout = self.nodes[0].gettxout(confirmed_txid, confirmed_index, True)
|
||||
assert txout is None
|
||||
# new utxo from mempool should be invisible if you exclude mempool
|
||||
|
@ -107,7 +107,7 @@ class WalletTest(BitcoinTestFramework):
|
|||
# note the mempool tx will have randomly assigned indices
|
||||
# but 10 will go to node2 and the rest will go to node0
|
||||
balance = self.nodes[0].getbalance()
|
||||
assert_equal(set([txout1['value'], txout2['value']]), set([10, balance]))
|
||||
assert_equal(set([txout1['value'], txout2['value']]), set([Decimal('0.1'), balance]))
|
||||
walletinfo = self.nodes[0].getwalletinfo()
|
||||
assert_equal(walletinfo['immature_balance'], 0)
|
||||
|
||||
|
@ -121,7 +121,7 @@ class WalletTest(BitcoinTestFramework):
|
|||
assert_raises_rpc_error(-8, "Invalid parameter, expected locked output", self.nodes[2].lockunspent, True, [unspent_0])
|
||||
self.nodes[2].lockunspent(False, [unspent_0])
|
||||
assert_raises_rpc_error(-8, "Invalid parameter, output already locked", self.nodes[2].lockunspent, False, [unspent_0])
|
||||
assert_raises_rpc_error(-4, "Insufficient funds", self.nodes[2].sendtoaddress, self.nodes[2].getnewaddress(), 20)
|
||||
assert_raises_rpc_error(-6, "Insufficient funds", self.nodes[2].sendtoaddress, self.nodes[2].getnewaddress(), 20)
|
||||
assert_equal([unspent_0], self.nodes[2].listlockunspent())
|
||||
self.nodes[2].lockunspent(True, [unspent_0])
|
||||
assert_equal(len(self.nodes[2].listlockunspent()), 0)
|
||||
|
@ -147,8 +147,8 @@ class WalletTest(BitcoinTestFramework):
|
|||
|
||||
# node0 should end up with 100 btc in block rewards plus fees, but
|
||||
# minus the 21 plus fees sent to node2
|
||||
assert_equal(self.nodes[0].getbalance(), 100 - 21)
|
||||
assert_equal(self.nodes[2].getbalance(), 21)
|
||||
assert_equal(self.nodes[0].getbalance(), Decimal("1.79"))
|
||||
assert_equal(self.nodes[2].getbalance(), Decimal("0.21"))
|
||||
|
||||
# Node0 should have two unspent outputs.
|
||||
# Create a couple of transactions to send them to node2, submit them through
|
||||
|
@ -162,7 +162,7 @@ class WalletTest(BitcoinTestFramework):
|
|||
inputs = []
|
||||
outputs = {}
|
||||
inputs.append({"txid": utxo["txid"], "vout": utxo["vout"]})
|
||||
outputs[self.nodes[2].getnewaddress()] = utxo["amount"] - 3
|
||||
outputs[self.nodes[2].getnewaddress()] = utxo["amount"] - Decimal("0.3")
|
||||
raw_tx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||
txns_to_send.append(self.nodes[0].signrawtransactionwithwallet(raw_tx))
|
||||
|
||||
|
@ -175,7 +175,7 @@ class WalletTest(BitcoinTestFramework):
|
|||
self.sync_all([self.nodes[0:3]])
|
||||
|
||||
assert_equal(self.nodes[0].getbalance(), 0)
|
||||
assert_equal(self.nodes[2].getbalance(), 94)
|
||||
assert_equal(self.nodes[2].getbalance(), Decimal("1.40"))
|
||||
|
||||
# Verify that a spent output cannot be locked anymore
|
||||
spent_0 = {"txid": node0utxos[0]["txid"], "vout": node0utxos[0]["vout"]}
|
||||
|
@ -185,42 +185,42 @@ class WalletTest(BitcoinTestFramework):
|
|||
address = self.nodes[0].getnewaddress("test")
|
||||
fee_per_byte = Decimal('0.001') / 1000
|
||||
self.nodes[2].settxfee(fee_per_byte * 1000)
|
||||
txid = self.nodes[2].sendtoaddress(address, 10, "", "", False)
|
||||
txid = self.nodes[2].sendtoaddress(address, Decimal("0.1"), "", "", False)
|
||||
self.nodes[2].generate(1)
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), Decimal('84'), fee_per_byte, self.get_vsize(self.nodes[2].getrawtransaction(txid)))
|
||||
assert_equal(self.nodes[0].getbalance(), Decimal('10'))
|
||||
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), Decimal('1.3'), fee_per_byte, self.get_vsize(self.nodes[2].getrawtransaction(txid)))
|
||||
assert_equal(self.nodes[0].getbalance(), Decimal('0.1'))
|
||||
|
||||
# Send 10 BTC with subtract fee from amount
|
||||
txid = self.nodes[2].sendtoaddress(address, 10, "", "", True)
|
||||
txid = self.nodes[2].sendtoaddress(address, 0.1, "", "", True)
|
||||
self.nodes[2].generate(1)
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
node_2_bal -= Decimal('10')
|
||||
node_2_bal -= Decimal('0.1')
|
||||
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
||||
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), Decimal('20'), fee_per_byte, self.get_vsize(self.nodes[2].getrawtransaction(txid)))
|
||||
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), Decimal('0.2'), fee_per_byte, self.get_vsize(self.nodes[2].getrawtransaction(txid)))
|
||||
|
||||
# Sendmany 10 BTC
|
||||
txid = self.nodes[2].sendmany('', {address: 10}, 0, "", [])
|
||||
txid = self.nodes[2].sendmany('', {address: 0.1}, 0, "", [])
|
||||
self.nodes[2].generate(1)
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
node_0_bal += Decimal('10')
|
||||
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), node_2_bal - Decimal('10'), fee_per_byte, self.get_vsize(self.nodes[2].getrawtransaction(txid)))
|
||||
node_0_bal += Decimal('0.1')
|
||||
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), node_2_bal - Decimal('0.1'), fee_per_byte, self.get_vsize(self.nodes[2].getrawtransaction(txid)))
|
||||
assert_equal(self.nodes[0].getbalance(), node_0_bal)
|
||||
|
||||
# Sendmany 10 BTC with subtract fee from amount
|
||||
txid = self.nodes[2].sendmany('', {address: 10}, 0, "", [address])
|
||||
txid = self.nodes[2].sendmany('', {address: 0.1}, 0, "", [address])
|
||||
self.nodes[2].generate(1)
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
node_2_bal -= Decimal('10')
|
||||
node_2_bal -= Decimal('0.1')
|
||||
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
||||
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), node_0_bal + Decimal('10'), fee_per_byte, self.get_vsize(self.nodes[2].getrawtransaction(txid)))
|
||||
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), node_0_bal + Decimal('0.1'), fee_per_byte, self.get_vsize(self.nodes[2].getrawtransaction(txid)))
|
||||
|
||||
# Test ResendWalletTransactions:
|
||||
# Create a couple of transactions, then start up a fourth
|
||||
# node (nodes[3]) and ask nodes[0] to rebroadcast.
|
||||
# EXPECT: nodes[3] should have those transactions in its mempool.
|
||||
txid1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1)
|
||||
txid2 = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||
txid1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1)
|
||||
txid2 = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 0.1)
|
||||
sync_mempools(self.nodes[0:2])
|
||||
|
||||
self.start_node(3)
|
||||
|
@ -238,9 +238,9 @@ class WalletTest(BitcoinTestFramework):
|
|||
# 2. hex-changed one output to 0.0
|
||||
# 3. sign and send
|
||||
# 4. check if recipient (node0) can list the zero value tx
|
||||
usp = self.nodes[1].listunspent(query_options={'minimumAmount': '49.998'})[0]
|
||||
usp = self.nodes[1].listunspent(query_options={'minimumAmount': '0.998'})[0]
|
||||
inputs = [{"txid": usp['txid'], "vout": usp['vout']}]
|
||||
outputs = {self.nodes[1].getnewaddress(): 49.998, self.nodes[0].getnewaddress(): 11.11}
|
||||
outputs = {self.nodes[1].getnewaddress(): 0.998, self.nodes[0].getnewaddress(): 11.11}
|
||||
|
||||
raw_tx = self.nodes[1].createrawtransaction(inputs, outputs).replace("c0833842", "00000000") # replace 11.11 with 0.0 (int32)
|
||||
signed_raw_tx = self.nodes[1].signrawtransactionwithwallet(raw_tx)
|
||||
|
@ -270,7 +270,7 @@ class WalletTest(BitcoinTestFramework):
|
|||
connect_nodes_bi(self.nodes, 0, 2)
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
|
||||
txid_not_broadcast = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 2)
|
||||
txid_not_broadcast = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 0.2)
|
||||
tx_obj_not_broadcast = self.nodes[0].gettransaction(txid_not_broadcast)
|
||||
self.nodes[1].generate(1) # mine a block, tx should not be in there
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
|
@ -280,12 +280,12 @@ class WalletTest(BitcoinTestFramework):
|
|||
self.nodes[1].sendrawtransaction(tx_obj_not_broadcast['hex'])
|
||||
self.nodes[1].generate(1)
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
node_2_bal += 2
|
||||
node_2_bal += Decimal("0.2")
|
||||
tx_obj_not_broadcast = self.nodes[0].gettransaction(txid_not_broadcast)
|
||||
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
||||
|
||||
# create another tx
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 2)
|
||||
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 0.1)
|
||||
|
||||
# restart the nodes with -walletbroadcast=1
|
||||
self.stop_nodes()
|
||||
|
@ -299,15 +299,15 @@ class WalletTest(BitcoinTestFramework):
|
|||
|
||||
self.nodes[0].generate(1)
|
||||
sync_blocks(self.nodes[0:3])
|
||||
node_2_bal += 2
|
||||
node_2_bal += Decimal("0.1")
|
||||
|
||||
# tx should be added to balance because after restarting the nodes tx should be broadcast
|
||||
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
||||
|
||||
# send a tx with value in a string (PR#6380 +)
|
||||
txid = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), "2")
|
||||
txid = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), "0.01")
|
||||
tx_obj = self.nodes[0].gettransaction(txid)
|
||||
assert_equal(tx_obj['amount'], Decimal('-2'))
|
||||
assert_equal(tx_obj['amount'], Decimal('-0.01'))
|
||||
|
||||
txid = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), "0.0001")
|
||||
tx_obj = self.nodes[0].gettransaction(txid)
|
||||
|
@ -327,7 +327,7 @@ class WalletTest(BitcoinTestFramework):
|
|||
# Import address and private key to check correct behavior of spendable unspents
|
||||
# 1. Send some coins to generate new UTXO
|
||||
address_to_import = self.nodes[2].getnewaddress()
|
||||
txid = self.nodes[0].sendtoaddress(address_to_import, 1)
|
||||
txid = self.nodes[0].sendtoaddress(address_to_import, 0.01)
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all([self.nodes[0:3]])
|
||||
|
||||
|
|
|
@ -18,13 +18,13 @@ class WalletRBFTest(BitcoinTestFramework):
|
|||
self.nodes[0].generate(101)
|
||||
|
||||
# sending a transaction without fee estimations must be possible by default on regtest
|
||||
self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||
self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 0.1)
|
||||
|
||||
# test sending a tx with disabled fallback fee (must fail)
|
||||
self.restart_node(0, extra_args=["-fallbackfee=0"])
|
||||
assert_raises_rpc_error(-4, "Fee estimation failed", lambda: self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1))
|
||||
assert_raises_rpc_error(-4, "Fee estimation failed", lambda: self.nodes[0].fundrawtransaction(self.nodes[0].createrawtransaction([], {self.nodes[0].getnewaddress(): 1})))
|
||||
assert_raises_rpc_error(-6, "Fee estimation failed", lambda: self.nodes[0].sendmany("", {self.nodes[0].getnewaddress(): 1}))
|
||||
assert_raises_rpc_error(-4, "Fee estimation failed", lambda: self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 0.1))
|
||||
assert_raises_rpc_error(-4, "Fee estimation failed", lambda: self.nodes[0].fundrawtransaction(self.nodes[0].createrawtransaction([], {self.nodes[0].getnewaddress(): 0.1})))
|
||||
assert_raises_rpc_error(-6, "Fee estimation failed", lambda: self.nodes[0].sendmany("", {self.nodes[0].getnewaddress(): 0.1}))
|
||||
|
||||
if __name__ == '__main__':
|
||||
WalletRBFTest().main()
|
||||
|
|
|
@ -79,7 +79,7 @@ class WalletGroupTest(BitcoinTestFramework):
|
|||
raw_tx = self.nodes[0].createrawtransaction([{"txid":"0"*64, "vout":0}], [{addr2[0]: 0.05}])
|
||||
tx = FromHex(CTransaction(), raw_tx)
|
||||
tx.vin = []
|
||||
tx.vout = [tx.vout[0]] * 2000
|
||||
tx.vout = [tx.vout[0]] * 2
|
||||
funded_tx = self.nodes[0].fundrawtransaction(ToHex(tx))
|
||||
signed_tx = self.nodes[0].signrawtransactionwithwallet(funded_tx['hex'])
|
||||
self.nodes[0].sendrawtransaction(signed_tx['hex'])
|
||||
|
@ -90,7 +90,7 @@ class WalletGroupTest(BitcoinTestFramework):
|
|||
# Check that we can create a transaction that only requires ~100 of our
|
||||
# utxos, without pulling in all outputs and creating a transaction that
|
||||
# is way too big.
|
||||
assert self.nodes[2].sendtoaddress(address=addr2[0], amount=5)
|
||||
assert self.nodes[2].sendtoaddress(address=addr2[0], amount=0.1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
WalletGroupTest().main ()
|
||||
|
|
13
test/functional/wallet_hd.py
Executable file → Normal file
13
test/functional/wallet_hd.py
Executable file → Normal file
|
@ -6,6 +6,7 @@
|
|||
|
||||
import os
|
||||
import shutil
|
||||
from decimal import Decimal
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import (
|
||||
|
@ -60,9 +61,9 @@ class WalletHDTest(BitcoinTestFramework):
|
|||
assert_equal(hd_info["hdkeypath"], "m/0'/0'/"+str(i)+"'")
|
||||
assert_equal(hd_info["hdseedid"], masterkeyid)
|
||||
assert_equal(hd_info["hdmasterkeyid"], masterkeyid)
|
||||
self.nodes[0].sendtoaddress(hd_add, 1)
|
||||
self.nodes[0].sendtoaddress(hd_add, 0.1)
|
||||
self.nodes[0].generate(1)
|
||||
self.nodes[0].sendtoaddress(non_hd_add, 1)
|
||||
self.nodes[0].sendtoaddress(non_hd_add, 0.1)
|
||||
self.nodes[0].generate(1)
|
||||
|
||||
# create an internal key (again)
|
||||
|
@ -71,7 +72,7 @@ class WalletHDTest(BitcoinTestFramework):
|
|||
assert_equal(change_addrV["hdkeypath"], "m/0'/1'/1'") #second internal child key
|
||||
|
||||
self.sync_all()
|
||||
assert_equal(self.nodes[1].getbalance(), NUM_HD_ADDS + 1)
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal("1.1"))
|
||||
|
||||
self.log.info("Restore backup ...")
|
||||
self.stop_node(1)
|
||||
|
@ -97,7 +98,7 @@ class WalletHDTest(BitcoinTestFramework):
|
|||
# Needs rescan
|
||||
self.stop_node(1)
|
||||
self.start_node(1, extra_args=self.extra_args[1] + ['-rescan'])
|
||||
assert_equal(self.nodes[1].getbalance(), NUM_HD_ADDS + 1)
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal("1.1"))
|
||||
|
||||
# Try a RPC based rescan
|
||||
self.stop_node(1)
|
||||
|
@ -108,14 +109,14 @@ class WalletHDTest(BitcoinTestFramework):
|
|||
connect_nodes_bi(self.nodes, 0, 1)
|
||||
self.sync_all()
|
||||
# Wallet automatically scans blocks older than key on startup
|
||||
assert_equal(self.nodes[1].getbalance(), NUM_HD_ADDS + 1)
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal("1.1"))
|
||||
out = self.nodes[1].rescanblockchain(0, 1)
|
||||
assert_equal(out['start_height'], 0)
|
||||
assert_equal(out['stop_height'], 1)
|
||||
out = self.nodes[1].rescanblockchain()
|
||||
assert_equal(out['start_height'], 0)
|
||||
assert_equal(out['stop_height'], self.nodes[1].getblockcount())
|
||||
assert_equal(self.nodes[1].getbalance(), NUM_HD_ADDS + 1)
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal("1.1"))
|
||||
|
||||
# send a tx and make sure its using the internal chain for the changeoutput
|
||||
txid = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||
|
|
|
@ -25,6 +25,7 @@ from test_framework.util import (assert_raises_rpc_error, connect_nodes, sync_bl
|
|||
import collections
|
||||
import enum
|
||||
import itertools
|
||||
from decimal import Decimal
|
||||
|
||||
Call = enum.Enum("Call", "single multi")
|
||||
Data = enum.Enum("Data", "address pub priv")
|
||||
|
@ -80,7 +81,7 @@ class Variant(collections.namedtuple("Variant", "call data rescan prune")):
|
|||
tx, = [tx for tx in txs if tx["txid"] == txid]
|
||||
assert_equal(tx["label"], self.label)
|
||||
assert_equal(tx["address"], self.address["address"])
|
||||
assert_equal(tx["amount"], amount)
|
||||
assert_equal(tx["amount"], Decimal(str(amount)))
|
||||
assert_equal(tx["category"], "receive")
|
||||
assert_equal(tx["label"], self.label)
|
||||
assert_equal(tx["txid"], txid)
|
||||
|
@ -89,7 +90,7 @@ class Variant(collections.namedtuple("Variant", "call data rescan prune")):
|
|||
|
||||
address, = [ad for ad in addresses if txid in ad["txids"]]
|
||||
assert_equal(address["address"], self.address["address"])
|
||||
assert_equal(address["amount"], self.expected_balance)
|
||||
assert_equal(address["amount"], Decimal(str(self.expected_balance)))
|
||||
assert_equal(address["confirmations"], confirmations)
|
||||
# Verify the transaction is correctly marked watchonly depending on
|
||||
# whether the transaction pays to an imported public key or
|
||||
|
@ -153,7 +154,7 @@ class ImportRescanTest(BitcoinTestFramework):
|
|||
variant.label = "label {} {}".format(i, variant)
|
||||
variant.address = self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress(variant.label))
|
||||
variant.key = self.nodes[1].dumpprivkey(variant.address["address"])
|
||||
variant.initial_amount = 10 - (i + 1) / 4.0
|
||||
variant.initial_amount = 0.01
|
||||
variant.initial_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.initial_amount)
|
||||
|
||||
# Generate a block containing the initial transactions, then another
|
||||
|
@ -183,7 +184,7 @@ class ImportRescanTest(BitcoinTestFramework):
|
|||
|
||||
# Create new transactions sending to each address.
|
||||
for i, variant in enumerate(IMPORT_VARIANTS):
|
||||
variant.sent_amount = 10 - (2 * i + 1) / 8.0
|
||||
variant.sent_amount = 0.02
|
||||
variant.sent_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.sent_amount)
|
||||
|
||||
# Generate a block containing the new transactions.
|
||||
|
|
|
@ -234,7 +234,7 @@ class ImportMultiTest (BitcoinTestFramework):
|
|||
sig_address_3 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress())
|
||||
multi_sig_script = self.nodes[0].createmultisig(2, [sig_address_1['pubkey'], sig_address_2['pubkey'], sig_address_3['pubkey']])
|
||||
self.nodes[1].generate(100)
|
||||
self.nodes[1].sendtoaddress(multi_sig_script['address'], 10.00)
|
||||
self.nodes[1].sendtoaddress(multi_sig_script['address'], 0.1)
|
||||
self.nodes[1].generate(1)
|
||||
timestamp = self.nodes[1].getblock(self.nodes[1].getbestblockhash())['mediantime']
|
||||
|
||||
|
@ -261,7 +261,7 @@ class ImportMultiTest (BitcoinTestFramework):
|
|||
sig_address_3 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress())
|
||||
multi_sig_script = self.nodes[0].createmultisig(2, [sig_address_1['pubkey'], sig_address_2['pubkey'], sig_address_3['pubkey']])
|
||||
self.nodes[1].generate(100)
|
||||
self.nodes[1].sendtoaddress(multi_sig_script['address'], 10.00)
|
||||
self.nodes[1].sendtoaddress(multi_sig_script['address'], 0.1)
|
||||
self.nodes[1].generate(1)
|
||||
timestamp = self.nodes[1].getblock(self.nodes[1].getbestblockhash())['mediantime']
|
||||
|
||||
|
@ -288,7 +288,7 @@ class ImportMultiTest (BitcoinTestFramework):
|
|||
sig_address_3 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress())
|
||||
multi_sig_script = self.nodes[0].createmultisig(2, [sig_address_1['pubkey'], sig_address_2['pubkey'], sig_address_3['pubkey']])
|
||||
self.nodes[1].generate(100)
|
||||
self.nodes[1].sendtoaddress(multi_sig_script['address'], 10.00)
|
||||
self.nodes[1].sendtoaddress(multi_sig_script['address'], 1.00)
|
||||
self.nodes[1].generate(1)
|
||||
timestamp = self.nodes[1].getblock(self.nodes[1].getbestblockhash())['mediantime']
|
||||
|
||||
|
@ -315,7 +315,7 @@ class ImportMultiTest (BitcoinTestFramework):
|
|||
sig_address_3 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress())
|
||||
multi_sig_script = self.nodes[0].createmultisig(2, [sig_address_1['pubkey'], sig_address_2['pubkey'], sig_address_3['pubkey']])
|
||||
self.nodes[1].generate(100)
|
||||
self.nodes[1].sendtoaddress(multi_sig_script['address'], 10.00)
|
||||
self.nodes[1].sendtoaddress(multi_sig_script['address'], 0.1)
|
||||
self.nodes[1].generate(1)
|
||||
timestamp = self.nodes[1].getblock(self.nodes[1].getbestblockhash())['mediantime']
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ Two nodes. Node1 is under test. Node0 is providing transactions and generating b
|
|||
- connect node1 to node0. Verify that they sync and node1 receives its funds."""
|
||||
import os
|
||||
import shutil
|
||||
from decimal import Decimal
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import (
|
||||
|
@ -48,9 +49,9 @@ class KeypoolRestoreTest(BitcoinTestFramework):
|
|||
addr_extpool = self.nodes[1].getnewaddress()
|
||||
|
||||
self.log.info("Send funds to wallet")
|
||||
self.nodes[0].sendtoaddress(addr_oldpool, 10)
|
||||
self.nodes[0].sendtoaddress(addr_oldpool, 0.1)
|
||||
self.nodes[0].generate(1)
|
||||
self.nodes[0].sendtoaddress(addr_extpool, 5)
|
||||
self.nodes[0].sendtoaddress(addr_extpool, 0.05)
|
||||
self.nodes[0].generate(1)
|
||||
sync_blocks(self.nodes)
|
||||
|
||||
|
@ -62,7 +63,7 @@ class KeypoolRestoreTest(BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
|
||||
self.log.info("Verify keypool is restored and balance is correct")
|
||||
assert_equal(self.nodes[1].getbalance(), 15)
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal("0.15"))
|
||||
assert_equal(self.nodes[1].listtransactions()[0]['category'], "receive")
|
||||
# Check that we have marked all keys up to the used keypool key as used
|
||||
assert_equal(self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress())['hdkeypath'], "m/0'/0'/110'")
|
||||
|
|
|
@ -16,6 +16,7 @@ Run the test twice - once using the accounts API and once using the labels API.
|
|||
The accounts API test can be removed in V0.18.
|
||||
"""
|
||||
from collections import defaultdict
|
||||
from decimal import Decimal
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_equal, assert_raises_rpc_error
|
||||
|
@ -48,7 +49,7 @@ class WalletLabelsTest(BitcoinTestFramework):
|
|||
# the same address, so we call twice to get two addresses w/50 each
|
||||
node.generate(1)
|
||||
node.generate(101)
|
||||
assert_equal(node.getbalance(), 100)
|
||||
assert_equal(node.getbalance(), 2)
|
||||
|
||||
# there should be 2 address groups
|
||||
# each with 1 address with a balance of 50 Bitcoins
|
||||
|
@ -60,7 +61,7 @@ class WalletLabelsTest(BitcoinTestFramework):
|
|||
for address_group in address_groups:
|
||||
assert_equal(len(address_group), 1)
|
||||
assert_equal(len(address_group[0]), 2)
|
||||
assert_equal(address_group[0][1], 50)
|
||||
assert_equal(address_group[0][1], 1)
|
||||
linked_addresses.add(address_group[0][0])
|
||||
|
||||
# send 50 from each address to a third address not in this wallet
|
||||
|
@ -69,7 +70,7 @@ class WalletLabelsTest(BitcoinTestFramework):
|
|||
common_address = "msf4WtN1YQKXvNtvdFYt9JBnUD2FB41kjr"
|
||||
txid = node.sendmany(
|
||||
fromaccount="",
|
||||
amounts={common_address: 100},
|
||||
amounts={common_address: 2},
|
||||
subtractfeefrom=[common_address],
|
||||
minconf=1,
|
||||
)
|
||||
|
@ -90,7 +91,7 @@ class WalletLabelsTest(BitcoinTestFramework):
|
|||
# and matures in the next 100 blocks
|
||||
if accounts_api:
|
||||
node.sendfrom("", common_address, fee)
|
||||
amount_to_send = 1.0
|
||||
amount_to_send = 0.1
|
||||
|
||||
# Create labels and make sure subsequent label API calls
|
||||
# recognize the label/address associations.
|
||||
|
@ -120,8 +121,8 @@ class WalletLabelsTest(BitcoinTestFramework):
|
|||
node.generate(1)
|
||||
for label in labels:
|
||||
assert_equal(
|
||||
node.getreceivedbyaddress(label.addresses[0]), amount_to_send)
|
||||
assert_equal(node.getreceivedbylabel(label.name), amount_to_send)
|
||||
node.getreceivedbyaddress(label.addresses[0]), Decimal(str(amount_to_send)))
|
||||
assert_equal(node.getreceivedbylabel(label.name), Decimal(str(amount_to_send)))
|
||||
|
||||
# Check that sendfrom label reduces listaccounts balances.
|
||||
for i, label in enumerate(labels):
|
||||
|
@ -138,17 +139,17 @@ class WalletLabelsTest(BitcoinTestFramework):
|
|||
address = node.getnewaddress(label.name)
|
||||
label.add_receive_address(address)
|
||||
label.verify(node)
|
||||
assert_equal(node.getreceivedbylabel(label.name), 2)
|
||||
assert_equal(node.getreceivedbylabel(label.name), Decimal("0.2"))
|
||||
if accounts_api:
|
||||
node.move(label.name, "", node.getbalance(label.name))
|
||||
label.verify(node)
|
||||
node.generate(101)
|
||||
expected_account_balances = {"": 5200}
|
||||
expected_account_balances = {"": 104}
|
||||
for label in labels:
|
||||
expected_account_balances[label.name] = 0
|
||||
if accounts_api:
|
||||
assert_equal(node.listaccounts(), expected_account_balances)
|
||||
assert_equal(node.getbalance(""), 5200)
|
||||
assert_equal(node.getbalance(""), 104)
|
||||
|
||||
# Check that setlabel can assign a label to a new unused address.
|
||||
for label in labels:
|
||||
|
@ -171,11 +172,11 @@ class WalletLabelsTest(BitcoinTestFramework):
|
|||
label.purpose[multisig_address] = "send"
|
||||
label.verify(node)
|
||||
if accounts_api:
|
||||
node.sendfrom("", multisig_address, 50)
|
||||
node.sendfrom("", multisig_address, 1)
|
||||
node.generate(101)
|
||||
if accounts_api:
|
||||
for label in labels:
|
||||
assert_equal(node.getbalance(label.name), 50)
|
||||
assert_equal(node.getbalance(label.name), 1)
|
||||
|
||||
# Check that setlabel can change the label of an address from a
|
||||
# different label.
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_equal, assert_array_result, assert_raises_rpc_error
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
class ListSinceBlockTest (BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.num_nodes = 4
|
||||
|
@ -26,14 +28,14 @@ class ListSinceBlockTest (BitcoinTestFramework):
|
|||
self.test_double_send()
|
||||
|
||||
def test_no_blockhash(self):
|
||||
txid = self.nodes[2].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||
txid = self.nodes[2].sendtoaddress(self.nodes[0].getnewaddress(), 0.02)
|
||||
blockhash, = self.nodes[2].generate(1)
|
||||
self.sync_all()
|
||||
|
||||
txs = self.nodes[0].listtransactions()
|
||||
assert_array_result(txs, {"txid": txid}, {
|
||||
"category": "receive",
|
||||
"amount": 1,
|
||||
"amount": Decimal("0.02"),
|
||||
"blockhash": blockhash,
|
||||
"confirmations": 1,
|
||||
})
|
||||
|
@ -89,7 +91,7 @@ class ListSinceBlockTest (BitcoinTestFramework):
|
|||
self.split_network()
|
||||
|
||||
# send to nodes[0] from nodes[2]
|
||||
senttx = self.nodes[2].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||
senttx = self.nodes[2].sendtoaddress(self.nodes[0].getnewaddress(), 0.02)
|
||||
|
||||
# generate on both sides
|
||||
lastblockhash = self.nodes[1].generate(6)[5]
|
||||
|
@ -151,9 +153,9 @@ class ListSinceBlockTest (BitcoinTestFramework):
|
|||
self.nodes[1].importprivkey(privkey)
|
||||
|
||||
# send from nodes[1] using utxo to nodes[0]
|
||||
change = '%.8f' % (float(utxo['amount']) - 1.0003)
|
||||
change = '%.8f' % (float(utxo['amount']) - 0.020006)
|
||||
recipient_dict = {
|
||||
self.nodes[0].getnewaddress(): 1,
|
||||
self.nodes[0].getnewaddress(): Decimal("0.02"),
|
||||
self.nodes[1].getnewaddress(): change,
|
||||
}
|
||||
utxo_dicts = [{
|
||||
|
@ -166,7 +168,7 @@ class ListSinceBlockTest (BitcoinTestFramework):
|
|||
|
||||
# send from nodes[2] using utxo to nodes[3]
|
||||
recipient_dict2 = {
|
||||
self.nodes[3].getnewaddress(): 1,
|
||||
self.nodes[3].getnewaddress(): Decimal("0.02"),
|
||||
self.nodes[2].getnewaddress(): change,
|
||||
}
|
||||
self.nodes[2].sendrawtransaction(
|
||||
|
@ -226,9 +228,9 @@ class ListSinceBlockTest (BitcoinTestFramework):
|
|||
# create and sign a transaction
|
||||
utxos = self.nodes[2].listunspent()
|
||||
utxo = utxos[0]
|
||||
change = '%.8f' % (float(utxo['amount']) - 1.0003)
|
||||
change = '%.8f' % (float(utxo['amount']) - 0.020006)
|
||||
recipient_dict = {
|
||||
self.nodes[0].getnewaddress(): 1,
|
||||
self.nodes[0].getnewaddress(): Decimal("0.02"),
|
||||
self.nodes[2].getnewaddress(): change,
|
||||
}
|
||||
utxo_dicts = [{
|
||||
|
|
|
@ -4,11 +4,12 @@
|
|||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test multiwallet.
|
||||
|
||||
Verify that a bitcoind node can load multiple wallet files
|
||||
Verify that a lbrycrdd node can load multiple wallet files
|
||||
"""
|
||||
import os
|
||||
import shutil
|
||||
import time
|
||||
from decimal import Decimal
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.test_node import ErrorMatch
|
||||
|
@ -130,7 +131,7 @@ class MultiWalletTest(BitcoinTestFramework):
|
|||
assert_equal(set(node.listwallets()), {"w4", "w5"})
|
||||
w5 = wallet("w5")
|
||||
w5_info = w5.getwalletinfo()
|
||||
assert_equal(w5_info['immature_balance'], 50)
|
||||
assert_equal(w5_info['immature_balance'], 1)
|
||||
|
||||
competing_wallet_dir = os.path.join(self.options.tmpdir, 'competing_walletdir')
|
||||
os.mkdir(competing_wallet_dir)
|
||||
|
@ -147,7 +148,7 @@ class MultiWalletTest(BitcoinTestFramework):
|
|||
wallets[0].generate(1)
|
||||
for wallet_name, wallet in zip(wallet_names, wallets):
|
||||
info = wallet.getwalletinfo()
|
||||
assert_equal(info['immature_balance'], 50 if wallet is wallets[0] else 0)
|
||||
assert_equal(info['immature_balance'], 1 if wallet is wallets[0] else 0)
|
||||
assert_equal(info['walletname'], wallet_name)
|
||||
|
||||
# accessing invalid wallet fails
|
||||
|
@ -158,21 +159,21 @@ class MultiWalletTest(BitcoinTestFramework):
|
|||
|
||||
w1, w2, w3, w4, *_ = wallets
|
||||
w1.generate(101)
|
||||
assert_equal(w1.getbalance(), 100)
|
||||
assert_equal(w1.getbalance(), 2)
|
||||
assert_equal(w2.getbalance(), 0)
|
||||
assert_equal(w3.getbalance(), 0)
|
||||
assert_equal(w4.getbalance(), 0)
|
||||
|
||||
w1.sendtoaddress(w2.getnewaddress(), 1)
|
||||
w1.sendtoaddress(w3.getnewaddress(), 2)
|
||||
w1.sendtoaddress(w4.getnewaddress(), 3)
|
||||
w1.sendtoaddress(w2.getnewaddress(), 0.1)
|
||||
w1.sendtoaddress(w3.getnewaddress(), 0.2)
|
||||
w1.sendtoaddress(w4.getnewaddress(), 0.3)
|
||||
w1.generate(1)
|
||||
assert_equal(w2.getbalance(), 1)
|
||||
assert_equal(w3.getbalance(), 2)
|
||||
assert_equal(w4.getbalance(), 3)
|
||||
assert_equal(w2.getbalance(), Decimal("0.1"))
|
||||
assert_equal(w3.getbalance(), Decimal("0.2"))
|
||||
assert_equal(w4.getbalance(), Decimal("0.3"))
|
||||
|
||||
batch = w1.batch([w1.getblockchaininfo.get_request(), w1.getwalletinfo.get_request()])
|
||||
assert_equal(batch[0]["result"]["chain"], "regtest")
|
||||
assert_equal(batch[0]["result"]["chain"], "lbrycrdreg")
|
||||
assert_equal(batch[1]["result"]["walletname"], "w1")
|
||||
|
||||
self.log.info('Check for per-wallet settxfee call')
|
||||
|
|
|
@ -38,7 +38,7 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
output_type = "legacy"
|
||||
|
||||
# All nodes should start with 1,250 BTC:
|
||||
starting_balance = 1250
|
||||
starting_balance = 25
|
||||
for i in range(4):
|
||||
assert_equal(self.nodes[i].getbalance(), starting_balance)
|
||||
self.nodes[i].getnewaddress() # bug workaround, coins generated assigned to first getnewaddress!
|
||||
|
@ -46,11 +46,11 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
self.nodes[0].settxfee(.001)
|
||||
|
||||
node0_address1 = self.nodes[0].getnewaddress(address_type=output_type)
|
||||
node0_txid1 = self.nodes[0].sendtoaddress(node0_address1, 1219)
|
||||
node0_txid1 = self.nodes[0].sendtoaddress(node0_address1, 24.38)
|
||||
node0_tx1 = self.nodes[0].gettransaction(node0_txid1)
|
||||
|
||||
node0_address2 = self.nodes[0].getnewaddress(address_type=output_type)
|
||||
node0_txid2 = self.nodes[0].sendtoaddress(node0_address2, 29)
|
||||
node0_txid2 = self.nodes[0].sendtoaddress(node0_address2, 0.58)
|
||||
node0_tx2 = self.nodes[0].gettransaction(node0_txid2)
|
||||
|
||||
assert_equal(self.nodes[0].getbalance(),
|
||||
|
@ -60,8 +60,8 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
node1_address = self.nodes[1].getnewaddress()
|
||||
|
||||
# Send tx1, and another transaction tx2 that won't be cloned
|
||||
txid1 = self.nodes[0].sendtoaddress(node1_address, 40)
|
||||
txid2 = self.nodes[0].sendtoaddress(node1_address, 20)
|
||||
txid1 = self.nodes[0].sendtoaddress(node1_address, 0.8)
|
||||
txid2 = self.nodes[0].sendtoaddress(node1_address, 0.4)
|
||||
|
||||
# Construct a clone of tx1, to be malleated
|
||||
rawtx1 = self.nodes[0].getrawtransaction(txid1, 1)
|
||||
|
@ -140,7 +140,7 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
|
||||
# Check node0's total balance; should be same as before the clone, + 100 BTC for 2 matured,
|
||||
# less possible orphaned matured subsidy
|
||||
expected += 100
|
||||
expected += 2
|
||||
if (self.options.mine_block):
|
||||
expected -= 50
|
||||
assert_equal(self.nodes[0].getbalance(), expected)
|
||||
|
|
|
@ -33,18 +33,18 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
|
||||
def run_test(self):
|
||||
# All nodes should start with 1,250 BTC:
|
||||
starting_balance = 1250
|
||||
starting_balance = 25
|
||||
for i in range(4):
|
||||
assert_equal(self.nodes[i].getbalance(), starting_balance)
|
||||
self.nodes[i].getnewaddress("") # bug workaround, coins generated assigned to first getnewaddress!
|
||||
|
||||
# Assign coins to foo and bar addresses:
|
||||
node0_address_foo = self.nodes[0].getnewaddress()
|
||||
fund_foo_txid = self.nodes[0].sendtoaddress(node0_address_foo, 1219)
|
||||
fund_foo_txid = self.nodes[0].sendtoaddress(node0_address_foo, 24.38)
|
||||
fund_foo_tx = self.nodes[0].gettransaction(fund_foo_txid)
|
||||
|
||||
node0_address_bar = self.nodes[0].getnewaddress()
|
||||
fund_bar_txid = self.nodes[0].sendtoaddress(node0_address_bar, 29)
|
||||
fund_bar_txid = self.nodes[0].sendtoaddress(node0_address_bar, 0.58)
|
||||
fund_bar_tx = self.nodes[0].gettransaction(fund_bar_txid)
|
||||
|
||||
assert_equal(self.nodes[0].getbalance(),
|
||||
|
@ -58,22 +58,22 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
doublespend_fee = Decimal('-.02')
|
||||
rawtx_input_0 = {}
|
||||
rawtx_input_0["txid"] = fund_foo_txid
|
||||
rawtx_input_0["vout"] = find_output(self.nodes[0], fund_foo_txid, 1219)
|
||||
rawtx_input_0["vout"] = find_output(self.nodes[0], fund_foo_txid, Decimal("24.38"))
|
||||
rawtx_input_1 = {}
|
||||
rawtx_input_1["txid"] = fund_bar_txid
|
||||
rawtx_input_1["vout"] = find_output(self.nodes[0], fund_bar_txid, 29)
|
||||
rawtx_input_1["vout"] = find_output(self.nodes[0], fund_bar_txid, Decimal("0.58"))
|
||||
inputs = [rawtx_input_0, rawtx_input_1]
|
||||
change_address = self.nodes[0].getnewaddress()
|
||||
outputs = {}
|
||||
outputs[node1_address] = 1240
|
||||
outputs[change_address] = 1248 - 1240 + doublespend_fee
|
||||
outputs[node1_address] = 24.8
|
||||
outputs[change_address] = Decimal("24.96") - Decimal("24.8") + doublespend_fee
|
||||
rawtx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||
doublespend = self.nodes[0].signrawtransactionwithwallet(rawtx)
|
||||
assert_equal(doublespend["complete"], True)
|
||||
|
||||
# Create two spends using 1 50 BTC coin each
|
||||
txid1 = self.nodes[0].sendtoaddress(node1_address, 40)
|
||||
txid2 = self.nodes[0].sendtoaddress(node1_address, 20)
|
||||
txid1 = self.nodes[0].sendtoaddress(node1_address, 0.8)
|
||||
txid2 = self.nodes[0].sendtoaddress(node1_address, 0.4)
|
||||
|
||||
# Have node0 mine a block:
|
||||
if (self.options.mine_block):
|
||||
|
@ -87,7 +87,7 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
# matured block, minus 40, minus 20, and minus transaction fees:
|
||||
expected = starting_balance + fund_foo_tx["fee"] + fund_bar_tx["fee"]
|
||||
if self.options.mine_block:
|
||||
expected += 50
|
||||
expected += 1
|
||||
expected += tx1["amount"] + tx1["fee"]
|
||||
expected += tx2["amount"] + tx2["fee"]
|
||||
assert_equal(self.nodes[0].getbalance(), expected)
|
||||
|
@ -125,11 +125,11 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
# Node0's total balance should be starting balance, plus 100BTC for
|
||||
# two more matured blocks, minus 1240 for the double-spend, plus fees (which are
|
||||
# negative):
|
||||
expected = starting_balance + 100 - 1240 + fund_foo_tx["fee"] + fund_bar_tx["fee"] + doublespend_fee
|
||||
expected = starting_balance + 2 - Decimal("24.8") + fund_foo_tx["fee"] + fund_bar_tx["fee"] + doublespend_fee
|
||||
assert_equal(self.nodes[0].getbalance(), expected)
|
||||
|
||||
# Node1's balance should be its initial balance (1250 for 25 block rewards) plus the doublespend:
|
||||
assert_equal(self.nodes[1].getbalance(), 1250 + 1240)
|
||||
assert_equal(self.nodes[1].getbalance(), Decimal("25.0") + Decimal("24.8"))
|
||||
|
||||
if __name__ == '__main__':
|
||||
TxnMallTest().main()
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Test the zapwallettxes functionality.
|
||||
|
||||
- start two bitcoind nodes
|
||||
- start two lbrycrdd nodes
|
||||
- create two transactions on node 0 - one is confirmed and one is unconfirmed.
|
||||
- restart node 0 and verify that both the confirmed and the unconfirmed
|
||||
transactions are still available.
|
||||
|
@ -37,13 +37,13 @@ class ZapWalletTXesTest (BitcoinTestFramework):
|
|||
self.sync_all()
|
||||
|
||||
# This transaction will be confirmed
|
||||
txid1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 10)
|
||||
txid1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1)
|
||||
|
||||
self.nodes[0].generate(1)
|
||||
self.sync_all()
|
||||
|
||||
# This transaction will not be confirmed
|
||||
txid2 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 20)
|
||||
txid2 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.2)
|
||||
|
||||
# Confirmed and unconfirmed transactions are now in the wallet.
|
||||
assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1)
|
||||
|
|
|
@ -53,11 +53,13 @@ EXPECTED_BOOST_INCLUDES=(
|
|||
boost/algorithm/string/split.hpp
|
||||
boost/bind.hpp
|
||||
boost/chrono/chrono.hpp
|
||||
boost/container/flat_map.hpp
|
||||
boost/date_time/posix_time/posix_time.hpp
|
||||
boost/filesystem.hpp
|
||||
boost/filesystem/detail/utf8_codecvt_facet.hpp
|
||||
boost/filesystem/fstream.hpp
|
||||
boost/interprocess/sync/file_lock.hpp
|
||||
boost/locale.hpp
|
||||
boost/multi_index/hashed_index.hpp
|
||||
boost/multi_index/ordered_index.hpp
|
||||
boost/multi_index/sequenced_index.hpp
|
||||
|
@ -65,10 +67,14 @@ EXPECTED_BOOST_INCLUDES=(
|
|||
boost/optional.hpp
|
||||
boost/preprocessor/cat.hpp
|
||||
boost/preprocessor/stringize.hpp
|
||||
boost/scope_exit.hpp
|
||||
boost/scoped_array.hpp
|
||||
boost/scoped_ptr.hpp
|
||||
boost/signals2/connection.hpp
|
||||
boost/signals2/last_value.hpp
|
||||
boost/signals2/signal.hpp
|
||||
boost/test/output_test_stream.hpp
|
||||
boost/test/unit_test_parameters.hpp
|
||||
boost/test/unit_test.hpp
|
||||
boost/thread.hpp
|
||||
boost/thread/condition_variable.hpp
|
||||
|
|
|
@ -28,7 +28,7 @@ import sys
|
|||
def main():
|
||||
config = configparser.ConfigParser()
|
||||
config.optionxform = str
|
||||
config.readfp(open(os.path.join(os.path.dirname(__file__), "../config.ini"), encoding="utf8"))
|
||||
config.read_file(open(os.path.join(os.path.dirname(__file__), "../config.ini"), encoding="utf8"))
|
||||
env_conf = dict(config.items('environment'))
|
||||
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
|
|
31
test_cli.sh
Executable file
31
test_cli.sh
Executable file
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -u -e -o pipefail
|
||||
trap "kill 0" EXIT
|
||||
|
||||
"$(pwd)/test/util/bitcoin-util-test.py"
|
||||
"$(pwd)/test/util/rpcauth-test.py"
|
||||
|
||||
"$(pwd)/test/lint/lint-filenames.sh"
|
||||
"$(pwd)/test/lint/lint-include-guards.sh"
|
||||
"$(pwd)/test/lint/lint-includes.sh"
|
||||
"$(pwd)/test/lint/lint-tests.sh"
|
||||
"$(pwd)/test/lint/lint-whitespace.sh"
|
||||
|
||||
# TODO: make the rest of these work:
|
||||
#"$(pwd)/test/functional/test_runner.py" interface_rest
|
||||
|
||||
# do a little run-through of the basic CLI commands:
|
||||
rm -fr /tmp/regtest_cli_testing
|
||||
mkdir /tmp/regtest_cli_testing
|
||||
CLI="$(pwd)/src/lbrycrd-cli -regtest -datadir=/tmp/regtest_cli_testing"
|
||||
"$(pwd)/src/lbrycrdd" -regtest -txindex -datadir=/tmp/regtest_cli_testing -printtoconsole=0 &
|
||||
sleep 3
|
||||
while [[ "$($CLI help)" == *"Loading"* ]]; do sleep 1; done
|
||||
|
||||
GEN150=$($CLI generate 120)
|
||||
TX=$($CLI claimname tester deadbeef 1)
|
||||
GEN1=$($CLI generate 1)
|
||||
LIST=$($CLI listnameclaims)
|
||||
if [[ "$LIST" != *"$TX"* ]]; then exit 1; fi
|
||||
|
Loading…
Reference in a new issue