aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Chow <achow101-github@achow101.com>2022-06-01 12:35:00 -0400
committerAndrew Chow <github@achow101.com>2023-12-08 14:55:14 -0500
commit0fefcbb776063b7fcc03c28e544d830a2f540250 (patch)
treee044f7aeb276eb6e3cfddc187d21094d45442269 /src
parent4d335bb1e00a414a4740007d5a192a73179b2262 (diff)
wallet: Explicitly preserve transaction locktime in CreateTransaction
We provide the preset nLockTime to CCoinControl so that CreateTransactionInternal can be aware of it and set it in the produced transaction.
Diffstat (limited to 'src')
-rw-r--r--src/wallet/coincontrol.h2
-rw-r--r--src/wallet/spend.cpp8
2 files changed, 10 insertions, 0 deletions
diff --git a/src/wallet/coincontrol.h b/src/wallet/coincontrol.h
index 32595955f0..c99a3bfd0f 100644
--- a/src/wallet/coincontrol.h
+++ b/src/wallet/coincontrol.h
@@ -91,6 +91,8 @@ public:
int m_max_depth = DEFAULT_MAX_DEPTH;
//! SigningProvider that has pubkeys and scripts to do spend size estimation for external inputs
FlatSigningProvider m_external_provider;
+ //! Locktime
+ std::optional<uint32_t> m_locktime;
CCoinControl();
diff --git a/src/wallet/spend.cpp b/src/wallet/spend.cpp
index 7ec2775fb1..9dfc8c2879 100644
--- a/src/wallet/spend.cpp
+++ b/src/wallet/spend.cpp
@@ -1160,6 +1160,11 @@ static util::Result<CreatedTransactionResult> CreateTransactionInternal(
}
txNew.vin.emplace_back(coin->outpoint, CScript(), sequence.value_or(default_sequence));
}
+ if (coin_control.m_locktime) {
+ txNew.nLockTime = coin_control.m_locktime.value();
+ // If we have a locktime set, we can't use anti-fee-sniping
+ use_anti_fee_sniping = false;
+ }
if (use_anti_fee_sniping) {
DiscourageFeeSniping(txNew, rng_fast, wallet.chain(), wallet.GetLastBlockHash(), wallet.GetLastBlockHeight());
}
@@ -1341,6 +1346,9 @@ bool FundTransaction(CWallet& wallet, CMutableTransaction& tx, CAmount& nFeeRet,
vecSend.push_back(recipient);
}
+ // Set the user desired locktime
+ coinControl.m_locktime = tx.nLockTime;
+
// Acquire the locks to prevent races to the new locked unspents between the
// CreateTransaction call and LockCoin calls (when lockUnspents is true).
LOCK(wallet.cs_wallet);