transaction_utils.cpp
1 // Copyright (c) 2019-2020 The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #include <coins.h> 6 #include <script/signingprovider.h> 7 #include <test/util/transaction_utils.h> 8 9 CMutableTransaction BuildCreditingTransaction(const CScript& scriptPubKey, int nValue) 10 { 11 CMutableTransaction txCredit; 12 txCredit.nVersion = 1; 13 txCredit.nLockTime = 0; 14 txCredit.vin.resize(1); 15 txCredit.vout.resize(1); 16 txCredit.vin[0].prevout.SetNull(); 17 txCredit.vin[0].scriptSig = CScript() << CScriptNum(0) << CScriptNum(0); 18 txCredit.vin[0].nSequence = CTxIn::SEQUENCE_FINAL; 19 txCredit.vout[0].scriptPubKey = scriptPubKey; 20 txCredit.vout[0].nValue = nValue; 21 22 return txCredit; 23 } 24 25 CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CScriptWitness& scriptWitness, const CTransaction& txCredit) 26 { 27 CMutableTransaction txSpend; 28 txSpend.nVersion = 1; 29 txSpend.nLockTime = 0; 30 txSpend.vin.resize(1); 31 txSpend.vout.resize(1); 32 txSpend.vin[0].scriptWitness = scriptWitness; 33 txSpend.vin[0].prevout.hash = txCredit.GetHash(); 34 txSpend.vin[0].prevout.n = 0; 35 txSpend.vin[0].scriptSig = scriptSig; 36 txSpend.vin[0].nSequence = CTxIn::SEQUENCE_FINAL; 37 txSpend.vout[0].scriptPubKey = CScript(); 38 txSpend.vout[0].nValue = txCredit.vout[0].nValue; 39 40 return txSpend; 41 } 42 43 std::vector<CMutableTransaction> SetupDummyInputs(FillableSigningProvider& keystoreRet, CCoinsViewCache& coinsRet, const std::array<CAmount,4>& nValues) 44 { 45 std::vector<CMutableTransaction> dummyTransactions; 46 dummyTransactions.resize(2); 47 48 // Add some keys to the keystore: 49 CKey key[4]; 50 for (int i = 0; i < 4; i++) { 51 key[i].MakeNewKey(i % 2); 52 keystoreRet.AddKey(key[i]); 53 } 54 55 // Create some dummy input transactions 56 dummyTransactions[0].vout.resize(2); 57 dummyTransactions[0].vout[0].nValue = nValues[0]; 58 dummyTransactions[0].vout[0].scriptPubKey << ToByteVector(key[0].GetPubKey()) << OP_CHECKSIG; 59 dummyTransactions[0].vout[1].nValue = nValues[1]; 60 dummyTransactions[0].vout[1].scriptPubKey << ToByteVector(key[1].GetPubKey()) << OP_CHECKSIG; 61 AddCoins(coinsRet, CTransaction(dummyTransactions[0]), 0); 62 63 dummyTransactions[1].vout.resize(2); 64 dummyTransactions[1].vout[0].nValue = nValues[2]; 65 dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(PKHash(key[2].GetPubKey())); 66 dummyTransactions[1].vout[1].nValue = nValues[3]; 67 dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(PKHash(key[3].GetPubKey())); 68 AddCoins(coinsRet, CTransaction(dummyTransactions[1]), 0); 69 70 return dummyTransactions; 71 }