text: // Copyright (c) 2019 The Bitcoin Core Developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #include <test/util/transaction_utils.h>
  #include <coins.h>
  #include <script/signingprovider.h>
  
  CMutableTransaction BuildCreditingTransaction(const CScript& scriptPubKey, int nValue)
  {
      CMutableTransaction txCredit;
      txCredit.nVersion = 1;
      txCredit.nLockTime = 0;
      txCredit.vin.resize(1);
      txCredit.vout.resize(1);
      txCredit.vin[0].prevout.SetNull();
      txCredit.vin[0].scriptSig = CScript() << CScriptNum(0) << CScriptNum(0);
      txCredit.vin[0].nSequence = CTxIn::SEQUENCE_FINAL;
      txCredit.vout[0].scriptPubKey = scriptPubKey;
      txCredit.vout[0].nValue = nValue;
  
      return txCredit;
  }
  
  CMutableTransaction BuildSpendingTransaction(const CScript& scriptSig, const CScriptWitness& scriptWitness, const CTransaction& txCredit)
  {
      CMutableTransaction txSpend;
      txSpend.nVersion = 1;
      txSpend.nLockTime = 0;
      txSpend.vin.resize(1);
      txSpend.vout.resize(1);
      txSpend.vin[0].scriptWitness = scriptWitness;
      txSpend.vin[0].prevout.hash = txCredit.GetHash();
      txSpend.vin[0].prevout.n = 0;
      txSpend.vin[0].scriptSig = scriptSig;
      txSpend.vin[0].nSequence = CTxIn::SEQUENCE_FINAL;
      txSpend.vout[0].scriptPubKey = CScript();
      txSpend.vout[0].nValue = txCredit.vout[0].nValue;
  
      return txSpend;
  }
  
  std::vector<CMutableTransaction> SetupDummyInputs(FillableSigningProvider& keystoreRet, CCoinsViewCache& coinsRet, const std::array<CAmount,4>& nValues)
  {
      std::vector<CMutableTransaction> dummyTransactions;
      dummyTransactions.resize(2);
  
      // Add some keys to the keystore:
      CKey key[4];
      for (int i = 0; i < 4; i++) {
          key[i].MakeNewKey(i % 2);
          keystoreRet.AddKey(key[i]);
      }
  
      // Create some dummy input transactions
      dummyTransactions[0].vout.resize(2);
      dummyTransactions[0].vout[0].nValue = nValues[0];
      dummyTransactions[0].vout[0].scriptPubKey << ToByteVector(key[0].GetPubKey()) << OP_CHECKSIG;
      dummyTransactions[0].vout[1].nValue = nValues[1];
      dummyTransactions[0].vout[1].scriptPubKey << ToByteVector(key[1].GetPubKey()) << OP_CHECKSIG;
      AddCoins(coinsRet, CTransaction(dummyTransactions[0]), 0);
  
      dummyTransactions[1].vout.resize(2);
      dummyTransactions[1].vout[0].nValue = nValues[2];
      dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(PKHash(key[2].GetPubKey()));
      dummyTransactions[1].vout[1].nValue = nValues[3];
      dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(PKHash(key[3].GetPubKey()));
      AddCoins(coinsRet, CTransaction(dummyTransactions[1]), 0);
  
      return dummyTransactions;
  }
  