25 #include <validation.h> 34 #include <boost/test/unit_test.hpp> 52 mtx.
vin.push_back({
CTxIn{from.GetHash(), index}});
55 std::map<COutPoint, Coin> coins;
56 coins[mtx.
vin[0].prevout].out = from.vout[index];
57 std::map<int, bilingual_str> input_errors;
69 auto& desc = descs.at(0);
71 Assert(
wallet.AddWalletDescriptor(w_desc, provider,
"",
false));
84 auto descs{
Parse(desc_str, provider, error,
false)};
85 auto& desc{descs.at(0)};
133 std::chrono::steady_clock::time_point fake_time;
134 reserver.
setNow([&] { fake_time += 60
s;
return fake_time; });
221 const auto NUM_WALLETS{5};
224 BOOST_REQUIRE(chain->getRwSetting(
"wallet").isNull());
226 const auto& check_concurrent_wallet = [&](
const auto& settings_function,
int num_expected_wallets) {
227 std::vector<std::thread> threads;
228 threads.reserve(NUM_WALLETS);
229 for (
auto i{0}; i < NUM_WALLETS; ++i) threads.emplace_back(settings_function, i);
230 for (
auto&
t : threads)
t.join();
232 auto wallets = chain->getRwSetting(
"wallet");
237 check_concurrent_wallet([&chain](
int i) {
243 check_concurrent_wallet([&chain](
int i) {
258 auto inserted = chainman.
BlockIndex().emplace(std::piecewise_construct, std::make_tuple(
GetRandHash()), std::make_tuple());
260 const uint256& hash = inserted.first->first;
261 block = &inserted.first->second;
262 block->
nTime = blockTime;
308 std::vector<bilingual_str> warnings;
310 auto wallet{std::make_shared<CWallet>(chain.get(),
"", std::move(database))};
320 BOOST_CHECK(!wallet->IsAddressPreviouslySpent(PKHash()));
321 WalletBatch batch{wallet->GetDatabase()};
331 BOOST_CHECK(wallet->IsAddressPreviouslySpent(PKHash()));
332 BOOST_CHECK(wallet->IsAddressPreviouslySpent(ScriptHash()));
333 auto requests = wallet->GetAddressReceiveRequests();
334 auto erequests = {
"val_rr11",
"val_rr20"};
335 BOOST_CHECK_EQUAL_COLLECTIONS(requests.begin(), requests.end(), std::begin(erequests), std::end(erequests));
343 BOOST_CHECK(!wallet->IsAddressPreviouslySpent(PKHash()));
344 BOOST_CHECK(!wallet->IsAddressPreviouslySpent(ScriptHash()));
345 auto requests = wallet->GetAddressReceiveRequests();
346 auto erequests = {
"val_rr11"};
347 BOOST_CHECK_EQUAL_COLLECTIONS(requests.begin(), requests.end(), std::begin(erequests), std::end(erequests));
375 wallet->CommitTransaction(tx, {}, {});
386 auto it =
wallet->mapWallet.find(tx->GetHash());
397 std::string coinbaseAddress = coinbaseKey.GetPubKey().GetID().ToString();
401 std::map<CTxDestination, std::vector<COutput>> list;
431 for (
const auto&
group : list) {
432 for (
const auto& coin :
group.second) {
434 wallet->LockCoin(coin.outpoint,
false);
453 std::map<OutputType, size_t>& expected_coins_sizes)
455 LOCK(context.wallet->cs_wallet);
462 for (uint32_t i = 0; i < wtx.tx->vout.size(); i++) context.wallet->LockCoin({wtx.GetHash(), i},
false);
463 for (
const auto& [type, size] : expected_coins_sizes)
BOOST_CHECK_EQUAL(size, available_coins.
coins[type].size());
468 std::map<OutputType, size_t> expected_coins_sizes;
469 for (
const auto& out_type :
OUTPUT_TYPES) { expected_coins_sizes[out_type] = 0U; }
487 expected_coins_sizes[out_type] = 2U;
517 CScript script_pubkey =
CScript() << OP_HASH160 << std::vector<unsigned char>(script_id.begin(), script_id.end()) <<
OP_EQUAL;
522 keystore.AddKeyPubKey(key, pubkey);
545 std::string
s(e.what());
546 return s.find(
"Missing checksum") != std::string::npos;
551 std::vector<unsigned char> malformed_record;
553 vw << std::string(
"notadescriptor");
584 m_args.ForceSetArg(
"-unsafesqlitesync",
"1");
587 context.
args = &m_args;
598 DebugLogHelper addtx_counter(
"[default wallet] AddToWallet", [&](
const std::string*
s) {
599 if (
s) ++addtx_count;
604 bool rescan_completed =
false;
605 DebugLogHelper rescan_check(
"[default wallet] Rescan completed", [&](
const std::string*
s) {
606 if (
s) rescan_completed =
true;
614 std::promise<void> promise;
616 promise.get_future().wait();
619 m_coinbase_txns.push_back(CreateAndProcessBlock({},
GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]);
621 m_coinbase_txns.push_back(CreateAndProcessBlock({block_tx},
GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]);
661 m_coinbase_txns.push_back(CreateAndProcessBlock({},
GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]);
663 m_coinbase_txns.push_back(CreateAndProcessBlock({block_tx},
GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]);
685 context.
args = &m_args;
693 m_args.ForceSetArg(
"-unsafesqlitesync",
"1");
695 context.
args = &m_args;
702 m_coinbase_txns.push_back(CreateAndProcessBlock({},
GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]);
709 auto block_hash = block_tx.GetHash();
710 auto prev_tx = m_coinbase_txns[0];
716 std::vector<Txid> vHashIn{ block_hash };
std::shared_ptr< const CTransaction > CTransactionRef
static UniValue Parse(std::string_view raw, ParamFormat format=ParamFormat::JSON)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
std::unique_ptr< interfaces::Chain > chain
std::optional< DatabaseFormat > require_format
void SignTransaction(CMutableTransaction &mtx, const SigningProvider *keystore, const std::map< COutPoint, Coin > &coins, const UniValue &hashType, UniValue &result)
Sign a transaction with the given keystore and previous transactions.
static const CAmount DEFAULT_TRANSACTION_MINFEE
-mintxfee default
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
static constexpr size_t DUMMY_NESTED_P2WPKH_INPUT_SIZE
Pre-calculated constants for input size estimation in virtual size
static void AddKey(CWallet &wallet, const CKey &key)
static size_t CalculateNestedKeyhashInputSize(bool use_max_sig)
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
size_t Size() const
The following methods are provided so that CoinsResult can mimic a vector, i.e., methods can work wit...
void TestLoadWallet(const std::string &name, DatabaseFormat format, std::function< void(std::shared_ptr< CWallet >)> f)
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
static const DatabaseFormat DATABASE_FORMATS[]
CPubKey GetPubKey() const
Compute the public key from a private key.
virtual bool AddCScript(const CScript &redeemScript)
std::shared_ptr< CWallet > m_wallet
std::unique_ptr< ValidationSignals > validation_signals
Issues calls about blocks and transactions.
const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR
A signature creator that just produces 71-byte empty signatures.
static constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE
Default for -minrelaytxfee, minimum relay fee for transactions.
const BaseSignatureCreator & DUMMY_MAXIMUM_SIGNATURE_CREATOR
A signature creator that just produces 72-byte empty signatures.
State of transaction not confirmed or conflicting with a known block and not in the mempool...
bool RemoveWalletSetting(interfaces::Chain &chain, const std::string &wallet_name)
Remove wallet name from persistent configuration so it will not be loaded on startup.
RAII object to check and reserve a wallet rescan.
Balance GetBalance(const CWallet &wallet, const int min_depth, bool avoid_reuse)
std::shared_ptr< CWallet > TestLoadWallet(std::unique_ptr< WalletDatabase > database, WalletContext &context)
bool reserve(bool with_passphrase=false)
Access to the wallet database.
State of transaction confirmed in a block.
bool(* handler)(const std::any &context, HTTPRequest *req, const std::string &strReq)
static constexpr auto OUTPUT_TYPES
std::unique_ptr< CWallet > wallet
static void AvailableCoins(benchmark::Bench &bench, const std::vector< OutputType > &output_type)
constexpr unsigned char * begin()
Minimal stream for reading from an existing byte array by std::span.
CKey GenerateRandomKey(bool compressed) noexcept
std::map< OutputType, std::vector< COutput > > coins
int64_t CAmount
Amount in satoshis (Can be negative)
static int64_t AddTx(ChainstateManager &chainman, CWallet &wallet, uint32_t lockTime, int64_t mockTime, int64_t blockTime)
COutputs available for spending, stored by OutputType.
uint256 GetBlockHash() const
A transaction with a bunch of additional info that only the owner cares about.
NodeContext struct containing references to chain state and connection state.
void WaitForDeleteWallet(std::shared_ptr< CWallet > &&wallet)
Explicitly delete the wallet.
int64_t GetVirtualTransactionInputSize(const CTxIn &txin, int64_t nSigOpCost, unsigned int bytes_per_sigop)
static const CAmount WALLET_INCREMENTAL_RELAY_FEE
minimum recommended increment for replacement txs
BOOST_FIXTURE_TEST_CASE(RemoveTxs, TestChain100Setup)
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
std::shared_ptr< CWallet > TestCreateWallet(std::unique_ptr< WalletDatabase > database, WalletContext &context, uint64_t create_flags)
An input of a transaction.
util::Result< CreatedTransactionResult > CreateTransaction(CWallet &wallet, const std::vector< CRecipient > &vecSend, std::optional< unsigned int > change_pos, const CCoinControl &coin_control, bool sign)
Create a new transaction paying the recipients with a set of coins selected by SelectCoins(); Also cr...
BOOST_AUTO_TEST_SUITE_END()
An encapsulated public key.
Fillable signing provider that keeps keys in an address->secret map.
std::variant< TxStateConfirmed, TxStateInMempool, TxStateBlockConflicted, TxStateInactive, TxStateUnrecognized > TxState
All possible CWalletTx states.
static CMutableTransaction TestSimpleSpend(const CTransaction &from, uint32_t index, const CKey &key, const CScript &pubkey)
static void AddTx(CWallet &wallet)
Indicate that this wallet supports DescriptorScriptPubKeyMan.
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
bool malformed_descriptor(std::ios_base::failure e)
std::vector< uint256 > vHave
Testing fixture that pre-creates a 100-block REGTEST-mode block chain.
std::vector< CTxOut > vout
bool AddWalletSetting(interfaces::Chain &chain, const std::string &wallet_name)
Add wallet name to persistent configuration so it will be loaded on startup.
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Descriptor with some wallet metadata.
node::BlockMap & BlockIndex() EXCLUSIVE_LOCKS_REQUIRED(
static CTransactionRef MakeTransactionRef(Tx &&txIn)
CWalletTx & AddTx(CRecipient recipient)
uint160 Hash160(const T1 &in1)
Compute the 160-bit hash an object.
BOOST_FIXTURE_TEST_CASE(wallet_coinsresult_test, BasicTestingSetup)
std::unique_ptr< CWallet > CreateSyncedWallet(interfaces::Chain &chain, CChain &cchain, const CKey &key)
BOOST_AUTO_TEST_CASE(bnb_test)
std::unique_ptr< WalletDatabase > CreateMockableWalletDatabase(MockableData records)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
std::unique_ptr< Chain > MakeChain(node::NodeContext &node)
Return implementation of Chain interface.
#define BOOST_CHECK_EQUAL(v1, v2)
The block chain is a tree shaped structure starting with the genesis block at the root...
Serialized script, used inside transaction inputs and outputs.
void TestUnloadWallet(std::shared_ptr< CWallet > &&wallet)
constexpr unsigned char * end()
static const unsigned int MAX_BLOCKFILE_SIZE
The maximum size of a blk?????.dat file (since 0.8)
uint256 GetRandHash() noexcept
Generate a random uint256.
void UpdateInput(CTxIn &input, const SignatureData &data)
void TestCoinsResult(ListCoinsTest &context, OutputType out_type, CAmount amount, std::map< OutputType, size_t > &expected_coins_sizes)
std::unique_ptr< interfaces::Handler > HandleLoadWallet(WalletContext &context, LoadWalletFn load_wallet)
constexpr CAmount DEFAULT_TRANSACTION_MAXFEE
-maxtxfee default
Add the transaction to the mempool, but don't broadcast to anybody.
WalletContext struct containing references to state shared between CWallet instances, like the reference to the chain interface, and the list of opened wallets.
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
interfaces::Chain * chain
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
A mutable version of CTransaction.
CScript GetScriptForRawPubKey(const CPubKey &pubKey)
Generate a P2PK script for the given pubkey.
An encapsulated private key.
The basic transaction that is broadcasted on the network and contained in blocks. ...
int nHeight
height of the entry in the chain. The genesis block has height 0
FlatFilePos GetBlockPos() const EXCLUSIVE_LOCKS_REQUIRED(
std::shared_ptr< CWallet > CreateWallet(WalletContext &context, const std::string &name, std::optional< bool > load_on_start, DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error, std::vector< bilingual_str > &warnings)
is a home for public enum and struct type definitions that are used internally by node code...
std::string EncodeSecret(const CKey &key)
static bool RunWithinTxn(WalletBatch &batch, std::string_view process_desc, const std::function< bool(WalletBatch &)> &func)
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
std::unique_ptr< ChainstateManager > chainman
Testing setup that configures a complete environment.
std::string ToString(const T &t)
Locale-independent version of std::to_string.
virtual bool AddKey(const CKey &key)
std::unique_ptr< WalletDatabase > MakeWalletDatabase(const std::string &name, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error_string)
std::map< CTxDestination, std::vector< COutput > > ListCoins(const CWallet &wallet)
Return list of available coins and locked coins grouped by non-change output address.
#define Assert(val)
Identity function.
#define BOOST_CHECK(expr)
static constexpr CAmount COIN
The amount of satoshis in one BTC.
const uint256 * phashBlock
pointer to the hash of the block, if any. Memory is owned by this CBlockIndex