LCOV - code coverage report
Current view: top level - src/primitives - transaction.cpp (source / functions) Hit Total Coverage
Test: fuzz_coverage.info Lines: 66 73 90.4 %
Date: 2023-10-05 15:40:34 Functions: 16 17 94.1 %
Branches: 72 132 54.5 %

           Branch data     Line data    Source code
       1                 :            : // Copyright (c) 2009-2010 Satoshi Nakamoto
       2                 :            : // Copyright (c) 2009-2022 The Bitcoin Core developers
       3                 :            : // Distributed under the MIT software license, see the accompanying
       4                 :            : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       5                 :            : 
       6                 :            : #include <primitives/transaction.h>
       7                 :            : 
       8                 :            : #include <consensus/amount.h>
       9                 :            : #include <hash.h>
      10                 :            : #include <script/script.h>
      11                 :            : #include <serialize.h>
      12                 :            : #include <tinyformat.h>
      13                 :            : #include <uint256.h>
      14                 :            : #include <util/strencodings.h>
      15                 :            : #include <version.h>
      16                 :            : 
      17                 :            : #include <cassert>
      18                 :            : #include <stdexcept>
      19                 :            : 
      20                 :     265872 : std::string COutPoint::ToString() const
      21                 :            : {
      22   [ +  -  -  + ]:     265872 :     return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10), n);
      23                 :          0 : }
      24                 :            : 
      25         [ +  - ]:    3637864 : CTxIn::CTxIn(COutPoint prevoutIn, CScript scriptSigIn, uint32_t nSequenceIn)
      26                 :            : {
      27                 :    3637864 :     prevout = prevoutIn;
      28         [ -  + ]:    3637864 :     scriptSig = scriptSigIn;
      29                 :    3637864 :     nSequence = nSequenceIn;
      30                 :    3637864 : }
      31                 :            : 
      32         [ #  # ]:          0 : CTxIn::CTxIn(uint256 hashPrevTx, uint32_t nOut, CScript scriptSigIn, uint32_t nSequenceIn)
      33                 :            : {
      34         [ #  # ]:          0 :     prevout = COutPoint(hashPrevTx, nOut);
      35         [ #  # ]:          0 :     scriptSig = scriptSigIn;
      36                 :          0 :     nSequence = nSequenceIn;
      37                 :          0 : }
      38                 :            : 
      39                 :     265872 : std::string CTxIn::ToString() const
      40                 :            : {
      41                 :     265872 :     std::string str;
      42         [ +  - ]:     265872 :     str += "CTxIn(";
      43   [ +  -  +  - ]:     265872 :     str += prevout.ToString();
      44   [ +  -  +  + ]:     265872 :     if (prevout.IsNull())
      45   [ +  -  +  -  :        237 :         str += strprintf(", coinbase %s", HexStr(scriptSig));
             +  -  +  - ]
      46                 :            :     else
      47   [ +  -  +  -  :     265635 :         str += strprintf(", scriptSig=%s", HexStr(scriptSig).substr(0, 24));
          +  -  +  -  -  
                      + ]
      48         [ +  + ]:     265872 :     if (nSequence != SEQUENCE_FINAL)
      49   [ +  -  +  - ]:     251935 :         str += strprintf(", nSequence=%u", nSequence);
      50         [ +  - ]:     265872 :     str += ")";
      51                 :     265872 :     return str;
      52         [ +  - ]:     265872 : }
      53                 :            : 
      54                 :   14577738 : CTxOut::CTxOut(const CAmount& nValueIn, CScript scriptPubKeyIn)
      55                 :            : {
      56                 :   14577738 :     nValue = nValueIn;
      57         [ +  - ]:   14577738 :     scriptPubKey = scriptPubKeyIn;
      58                 :   14577738 : }
      59                 :            : 
      60                 :    1304528 : std::string CTxOut::ToString() const
      61                 :            : {
      62   [ +  -  -  + ]:    1304528 :     return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)", nValue / COIN, nValue % COIN, HexStr(scriptPubKey).substr(0, 30));
      63                 :          0 : }
      64                 :            : 
      65                 :     906240 : CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nLockTime(0) {}
      66         [ +  - ]:     286522 : CMutableTransaction::CMutableTransaction(const CTransaction& tx) : vin(tx.vin), vout(tx.vout), nVersion(tx.nVersion), nLockTime(tx.nLockTime) {}
      67                 :            : 
      68                 :      95853 : uint256 CMutableTransaction::GetHash() const
      69                 :            : {
      70                 :      95853 :     return (CHashWriter{SERIALIZE_TRANSACTION_NO_WITNESS} << *this).GetHash();
      71                 :            : }
      72                 :            : 
      73                 :    2526775 : uint256 CTransaction::ComputeHash() const
      74                 :        173 : {
      75                 :    2526775 :     return (CHashWriter{SERIALIZE_TRANSACTION_NO_WITNESS} << *this).GetHash();
      76                 :            : }
      77                 :            : 
      78                 :    2526775 : uint256 CTransaction::ComputeWitnessHash() const
      79                 :            : {
      80         [ +  + ]:    2526775 :     if (!HasWitness()) {
      81                 :    2093262 :         return hash;
      82                 :            :     }
      83                 :     433513 :     return (CHashWriter{0} << *this).GetHash();
      84                 :    2526775 : }
      85                 :            : 
      86   [ +  -  +  -  :     630443 : CTransaction::CTransaction(const CMutableTransaction& tx) : vin(tx.vin), vout(tx.vout), nVersion(tx.nVersion), nLockTime(tx.nLockTime), hash{ComputeHash()}, m_witness_hash{ComputeWitnessHash()} {}
                   +  - ]
      87   [ +  -  +  - ]:    1896332 : CTransaction::CTransaction(CMutableTransaction&& tx) : vin(std::move(tx.vin)), vout(std::move(tx.vout)), nVersion(tx.nVersion), nLockTime(tx.nLockTime), hash{ComputeHash()}, m_witness_hash{ComputeWitnessHash()} {}
      88                 :            : 
      89                 :     231821 : CAmount CTransaction::GetValueOut() const
      90                 :            : {
      91                 :     231821 :     CAmount nValueOut = 0;
      92         [ +  + ]:    6654986 :     for (const auto& tx_out : vout) {
      93   [ +  +  +  + ]:    6423627 :         if (!MoneyRange(tx_out.nValue) || !MoneyRange(nValueOut + tx_out.nValue))
      94   [ +  -  +  -  :        462 :             throw std::runtime_error(std::string(__func__) + ": value out of range");
          +  -  -  +  +  
                      - ]
      95                 :    6423165 :         nValueOut += tx_out.nValue;
      96                 :            :     }
      97         [ +  - ]:     231359 :     assert(MoneyRange(nValueOut));
      98                 :     231359 :     return nValueOut;
      99                 :        462 : }
     100                 :            : 
     101                 :       1336 : unsigned int CTransaction::GetTotalSize() const
     102                 :            : {
     103                 :       1336 :     return ::GetSerializeSize(*this, PROTOCOL_VERSION);
     104                 :            : }
     105                 :            : 
     106                 :     282818 : std::string CTransaction::ToString() const
     107                 :            : {
     108                 :     282818 :     std::string str;
     109   [ +  -  -  + ]:     282818 :     str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n",
     110   [ +  -  +  -  :     282818 :         GetHash().ToString().substr(0,10),
                   +  - ]
     111                 :     282818 :         nVersion,
     112                 :     282818 :         vin.size(),
     113                 :     282818 :         vout.size(),
     114                 :     282818 :         nLockTime);
     115         [ +  + ]:     548682 :     for (const auto& tx_in : vin)
     116   [ +  -  +  -  :     265864 :         str += "    " + tx_in.ToString() + "\n";
             +  -  +  - ]
     117         [ +  + ]:     548682 :     for (const auto& tx_in : vin)
     118   [ +  -  +  -  :     265864 :         str += "    " + tx_in.scriptWitness.ToString() + "\n";
             +  -  +  - ]
     119         [ +  + ]:    1585579 :     for (const auto& tx_out : vout)
     120   [ +  -  +  -  :    1302761 :         str += "    " + tx_out.ToString() + "\n";
             +  -  +  - ]
     121                 :     282818 :     return str;
     122         [ +  - ]:     282818 : }

Generated by: LCOV version 1.14