Compare 048efd2 ... +7 ... f8998fd

Coverage Reach
src/interface/TWEthereumAbiFunction.cpp src/interface/TWStoredKey.cpp src/interface/TWBitcoinScript.cpp src/interface/TWAnyAddress.cpp src/interface/TWHash.cpp src/interface/TWData.cpp src/interface/TWPrivateKey.cpp src/interface/TWEthereumAbiValue.cpp src/interface/TWHDWallet.cpp src/interface/TWPublicKey.cpp src/interface/TWCoinType.cpp src/interface/TWBitcoinAddress.cpp src/interface/TWAnySigner.cpp src/interface/TWString+Hex.cpp src/interface/TWString.cpp src/interface/TWSegwitAddress.cpp src/interface/TWEthereumAbi.cpp src/interface/TWBase58.cpp src/interface/TWAES.cpp src/interface/TWGroestlcoinAddress.cpp src/interface/TWAccount.cpp src/interface/TWFIOAccount.cpp src/interface/TWHDVersion.cpp src/interface/TWBitcoin.cpp src/Bitcoin/Script.cpp src/Bitcoin/TransactionSigner.cpp src/Bitcoin/Transaction.cpp src/Bitcoin/TransactionBuilder.cpp src/Bitcoin/UnspentSelector.cpp src/Bitcoin/SegwitAddress.cpp src/Bitcoin/CashAddress.cpp src/Bitcoin/Signer.cpp src/Bitcoin/Entry.cpp src/Bitcoin/TransactionPlan.h src/Bitcoin/FeeCalculator.cpp src/Bitcoin/Script.h src/Bitcoin/TransactionBuilder.h src/Bitcoin/TransactionInput.cpp src/Bitcoin/TransactionSigner.h src/Bitcoin/Transaction.h src/Bitcoin/SegwitAddress.h src/Bitcoin/SigHashType.h src/Bitcoin/UnspentSelector.h src/Bitcoin/OutPoint.h src/Bitcoin/Address.h src/Bitcoin/TransactionInput.h src/Bitcoin/Entry.h src/Bitcoin/OutPoint.cpp src/Bitcoin/TransactionOutput.cpp src/Bitcoin/CashAddress.h src/Bitcoin/FeeCalculator.h src/Bitcoin/OpCodes.h src/Bitcoin/TransactionOutput.h src/Ethereum/ABI/ParamNumber.h src/Ethereum/ABI/Parameters.cpp src/Ethereum/ABI/ParamFactory.cpp src/Ethereum/ABI/Bytes.cpp src/Ethereum/ABI/ValueEncoder.cpp src/Ethereum/ABI/Bytes.h src/Ethereum/ABI/Array.cpp src/Ethereum/ABI/ParamNumber.cpp src/Ethereum/ABI/Function.cpp src/Ethereum/ABI/Function.h src/Ethereum/ABI/Parameters.h src/Ethereum/ABI/ParamAddress.h src/Ethereum/ABI/Array.h src/Ethereum/ABI/ValueDecoder.cpp src/Ethereum/ABI/ParamBase.h src/Ethereum/ABI/ValueEncoder.h src/Ethereum/RLP.cpp src/Ethereum/Signer.cpp src/Ethereum/ContractCall.cpp src/Ethereum/RLP.h src/Ethereum/AddressChecksum.cpp src/Ethereum/Address.cpp src/Ethereum/Entry.cpp src/Ethereum/Transaction.h src/Ethereum/Entry.h src/Ethereum/Address.h src/Ethereum/Signer.h src/FIO/TransactionBuilder.cpp src/FIO/Encryption.cpp src/FIO/Action.cpp src/FIO/Address.cpp src/FIO/Action.h src/FIO/NewFundsRequest.cpp src/FIO/Actor.cpp src/FIO/Signer.cpp src/FIO/Transaction.cpp src/FIO/Entry.cpp src/FIO/Transaction.h src/FIO/Entry.h src/FIO/NewFundsRequest.h src/FIO/Address.h src/FIO/TransactionBuilder.h src/Harmony/Signer.cpp src/Harmony/Staking.h src/Harmony/Transaction.h src/Harmony/Address.h src/Harmony/Entry.cpp src/Harmony/Entry.h src/Harmony/Address.cpp src/Harmony/Signer.h src/Ontology/ParamsBuilder.cpp src/Ontology/Address.cpp src/Ontology/OngTxBuilder.cpp src/Ontology/Signer.cpp src/Ontology/Transaction.cpp src/Ontology/Ong.cpp src/Ontology/OntTxBuilder.cpp src/Ontology/Ont.cpp src/Ontology/SigData.cpp src/Ontology/Transaction.h src/Ontology/Entry.cpp src/Ontology/SigData.h src/Ontology/ParamsBuilder.h src/Ontology/Ong.h src/Ontology/Ont.h src/Ontology/Asset.h src/Ontology/Entry.h src/Ontology/Signer.h src/EOS/Transaction.cpp src/EOS/Asset.cpp src/EOS/Address.cpp src/EOS/Signer.cpp src/EOS/Action.cpp src/EOS/Name.cpp src/EOS/Serialization.h src/EOS/PackedTransaction.cpp src/EOS/Prefixes.h src/EOS/Entry.cpp src/EOS/Action.h src/EOS/Transaction.h src/EOS/Entry.h src/EOS/Signer.h src/EOS/PackedTransaction.h src/EOS/Name.h src/EOS/Address.h src/EOS/Asset.h src/TON/Cell.cpp src/TON/Address.cpp src/TON/Signer.cpp src/TON/Contract.cpp src/TON/Cell.h src/TON/Address.h src/TON/Entry.cpp src/TON/Entry.h src/NEO/Signer.cpp src/NEO/Transaction.cpp src/NEO/ReadData.cpp src/NEO/TransactionAttribute.h src/NEO/Address.cpp src/NEO/Serializable.h src/NEO/TransactionOutput.h src/NEO/CoinReference.h src/NEO/Witness.h src/NEO/Script.cpp src/NEO/MinerTransaction.h src/NEO/Entry.cpp src/NEO/ReadData.h src/NEO/Transaction.h src/NEO/Address.h src/NEO/Entry.h src/NEO/ISerializable.h src/NEO/Signer.h src/Tron/Signer.cpp src/Tron/Serialization.cpp src/Tron/Address.cpp src/Tron/Entry.cpp src/Tron/Entry.h src/Tron/Address.h src/Decred/Signer.cpp src/Decred/Transaction.cpp src/Decred/Address.cpp src/Decred/TransactionBuilder.h src/Decred/Transaction.h src/Decred/TransactionInput.cpp src/Decred/Entry.cpp src/Decred/Signer.h src/Decred/OutPoint.h src/Decred/TransactionOutput.cpp src/Decred/TransactionOutput.h src/Decred/OutPoint.cpp src/Decred/TransactionInput.h src/Decred/Entry.h src/Keystore/StoredKey.cpp src/Keystore/EncryptionParameters.cpp src/Keystore/ScryptParameters.cpp src/Keystore/Account.cpp src/Keystore/PBKDF2Parameters.cpp src/Keystore/AESParameters.cpp src/Keystore/Account.h src/Keystore/EncryptionParameters.h src/Keystore/StoredKey.h src/Keystore/ScryptParameters.h src/Keystore/AESParameters.h src/Keystore/PBKDF2Parameters.h src/Solana/Transaction.h src/Solana/Signer.cpp src/Solana/Transaction.cpp src/Solana/Address.cpp src/Solana/Entry.cpp src/Solana/Entry.h src/Solana/Address.h src/Binance/Signer.cpp src/Binance/Serialization.cpp src/Binance/Address.cpp src/Binance/Entry.cpp src/Binance/Address.h src/Binance/Entry.h src/Binance/Signer.h src/Cbor.cpp src/Cardano/AddressV3.cpp src/Cardano/AddressV2.cpp src/Cardano/Entry.cpp src/Cardano/AddressV3.h src/Cardano/Entry.h src/Cardano/AddressV2.h src/Waves/Transaction.cpp src/Waves/Address.cpp src/Waves/Signer.cpp src/Waves/Entry.cpp src/Waves/BinaryCoding.h src/Waves/Entry.h src/Waves/Transaction.h src/Polkadot/Extrinsic.cpp src/Polkadot/ScaleCodec.h src/Polkadot/Extrinsic.h src/Polkadot/Signer.cpp src/Polkadot/Entry.cpp src/Polkadot/Address.h src/Polkadot/Entry.h src/Filecoin/Address.cpp src/Filecoin/Transaction.cpp src/Filecoin/Signer.cpp src/Filecoin/Address.h src/Filecoin/Transaction.h src/Filecoin/Entry.cpp src/Filecoin/Entry.h src/Tezos/Forging.cpp src/Tezos/Signer.cpp src/Tezos/Address.cpp src/Tezos/OperationList.cpp src/Tezos/BinaryCoding.cpp src/Tezos/Entry.cpp src/Tezos/Entry.h src/Tezos/OperationList.h src/Tezos/Address.h src/Zcash/Transaction.cpp src/Zcash/Signer.cpp src/Zcash/TransactionBuilder.h src/Zcash/Transaction.h src/Zcash/Entry.cpp src/Zcash/TAddress.h src/Zcash/Entry.h src/NULS/Signer.cpp src/NULS/BinaryCoding.h src/NULS/Address.cpp src/NULS/Entry.cpp src/NULS/Entry.h src/NULS/Signer.h src/HDWallet.cpp src/Ripple/Transaction.cpp src/Ripple/XAddress.cpp src/Ripple/Signer.cpp src/Ripple/BinaryCoding.h src/Ripple/Transaction.h src/Ripple/Address.cpp src/Ripple/Entry.cpp src/Ripple/Entry.h src/Coin.cpp src/PrivateKey.cpp src/Algorand/BinaryCoding.h src/Algorand/Transaction.cpp src/Algorand/Address.cpp src/Algorand/Signer.cpp src/Algorand/Transaction.h src/Algorand/Entry.cpp src/Algorand/Entry.h src/Cosmos/Serialization.cpp src/Cosmos/Signer.cpp src/Cosmos/Entry.cpp src/Cosmos/Address.h src/Cosmos/Entry.h src/Nano/Signer.cpp src/Nano/Address.cpp src/Nano/Entry.cpp src/Nano/Entry.h src/Nano/Signer.h src/Nebulas/Transaction.cpp src/Nebulas/Signer.cpp src/Nebulas/Address.cpp src/Nebulas/Transaction.h src/Nebulas/Entry.cpp src/Nebulas/Entry.h src/Nebulas/Signer.h src/Nimiq/Address.cpp src/Nimiq/Transaction.cpp src/Nimiq/Signer.cpp src/Nimiq/Entry.cpp src/Nimiq/Signer.h src/Nimiq/Entry.h src/Nimiq/Transaction.h src/Nimiq/Address.h src/IoTeX/Staking.cpp src/IoTeX/Signer.cpp src/IoTeX/Address.h src/IoTeX/Entry.cpp src/IoTeX/Entry.h src/IoTeX/Signer.h src/IoTeX/Address.cpp src/Theta/Transaction.cpp src/Theta/Signer.cpp src/Theta/Entry.cpp src/Theta/Transaction.h src/Theta/Coins.h src/Theta/Entry.h src/Theta/Signer.h src/Stellar/Signer.cpp src/Stellar/Address.cpp src/Stellar/Entry.cpp src/Stellar/Entry.h src/Stellar/Signer.h src/Aeternity/Signer.cpp src/Aeternity/Transaction.cpp src/Aeternity/Address.cpp src/Aeternity/Transaction.h src/Aeternity/Entry.cpp src/Aeternity/Identifiers.h src/Aeternity/Entry.h src/Aeternity/Address.h src/NEAR/Serialization.cpp src/NEAR/Address.cpp src/NEAR/Signer.cpp src/NEAR/Entry.cpp src/NEAR/Entry.h src/NEAR/Address.h src/BinaryCoding.cpp src/PublicKey.cpp src/Icon/Signer.cpp src/Icon/Address.cpp src/Icon/Entry.cpp src/Icon/Entry.h src/Icon/Signer.h src/Zilliqa/Signer.cpp src/Zilliqa/AddressChecksum.cpp src/Zilliqa/Address.h src/Zilliqa/Entry.cpp src/Zilliqa/Entry.h src/Zilliqa/Address.cpp src/Aion/Signer.cpp src/Aion/Address.cpp src/Aion/Transaction.cpp src/Aion/Transaction.h src/Aion/RLP.h src/Aion/Entry.cpp src/Aion/Entry.h src/Aion/Address.h src/Base58.cpp src/XXHash64.h src/Bech32.cpp src/Hash.cpp src/Elrond/Serialization.cpp src/Elrond/Signer.cpp src/Elrond/Entry.cpp src/Elrond/Address.h src/Elrond/Entry.h src/Elrond/Address.cpp src/VeChain/Transaction.cpp src/VeChain/Signer.cpp src/VeChain/Entry.cpp src/VeChain/Clause.h src/VeChain/Entry.h src/VeChain/Transaction.h src/Groestlcoin/Address.cpp src/Groestlcoin/Signer.cpp src/Groestlcoin/Entry.cpp src/Groestlcoin/Entry.h src/Groestlcoin/Transaction.h src/Groestlcoin/Address.h src/DerivationPath.h src/Wanchain/Signer.cpp src/Wanchain/Entry.cpp src/Wanchain/Entry.h src/Wanchain/Address.cpp src/Wanchain/Signer.h src/Wanchain/Address.h src/Bech32Address.cpp src/Encrypt.cpp src/Hash.h src/uint256.h src/SS58Address.h src/Base58Address.h src/Base64.cpp src/BinaryCoding.h src/DerivationPath.cpp src/Result.h src/HexCoding.h src/Base32.h src/CoinEntry.h src/Crc.cpp src/Cbor.h src/Bech32.h src/Data.h src/Kusama/Entry.cpp src/Kusama/Address.h src/Kusama/Entry.h src/Base58.h src/Bech32Address.h src/PublicKey.h src/PrivateKey.h src/Data.cpp src/HDWallet.h src/Coin.h walletconsole/lib/CommandExecutor.cpp walletconsole/lib/Keys.cpp walletconsole/lib/Util.cpp walletconsole/lib/Address.cpp walletconsole/lib/Coins.cpp walletconsole/lib/Buffer.cpp walletconsole/lib/WalletConsole.cpp walletconsole/lib/Buffer.h walletconsole/lib/TonCoin.h walletconsole/lib/Coins.h walletconsole/lib/WalletConsole.h walletconsole/lib/Keys.h walletconsole/lib/Util.h walletconsole/lib/CommandExecutor.h walletconsole/lib/Address.h

No flags found

Use flags to group coverage reports by test type, project and/or folders.
Then setup custom commit statuses and notifications for each flag.

e.g., #unittest #integration

#production #enterprise

#frontend #backend

Learn more about Codecov Flags here.


@@ -15,16 +15,16 @@
Loading
15 15
namespace TW::Bitcoin {
16 16
17 17
/// Estimate encoded size by simple formula
18 -
int64_t estimateSimpleFee(FeeCalculator& feeCalculator, const TransactionPlan& plan, int outputSize, const Bitcoin::Proto::SigningInput& input) {
19 -
    return feeCalculator.calculate(plan.utxos.size(), outputSize, input.byte_fee());
18 +
int64_t estimateSimpleFee(const FeeCalculator& feeCalculator, const TransactionPlan& plan, int outputSize, int64_t byteFee) {
19 +
    return feeCalculator.calculate(plan.utxos.size(), outputSize, byteFee);
20 20
}
21 21
22 22
/// Estimate encoded size by invoking sign(sizeOnly), get actual size
23 -
int64_t estimateSegwitFee(FeeCalculator& feeCalculator, const TransactionPlan& plan, int outputSize, const Bitcoin::Proto::SigningInput& input) {
23 +
int64_t estimateSegwitFee(const FeeCalculator& feeCalculator, const TransactionPlan& plan, int outputSize, const Bitcoin::Proto::SigningInput& input) {
24 24
    TWPurpose coinPurpose = TW::purpose(static_cast<TWCoinType>(input.coin_type()));
25 25
    if (coinPurpose != TWPurposeBIP84) {
26 26
        // not segwit, return default simple estimate
27 -
        return estimateSimpleFee(feeCalculator, plan, outputSize, input);
27 +
        return estimateSimpleFee(feeCalculator, plan, outputSize, input.byte_fee());
28 28
    }
29 29
30 30
    // duplicate input, with the current plan
@@ -35,7 +35,7 @@
Loading
35 35
    auto result = signer.sign();
36 36
    if (!result) {
37 37
        // signing failed; return default simple estimate
38 -
        return estimateSimpleFee(feeCalculator, plan, outputSize, input);
38 +
        return estimateSimpleFee(feeCalculator, plan, outputSize, input.byte_fee());
39 39
    }
40 40
41 41
    // Obtain the encoded size
@@ -65,12 +65,13 @@
Loading
65 65
    auto plan = TransactionPlan();
66 66
    plan.amount = input.amount();
67 67
68 -
    auto output_size = 2;
69 -
    auto& feeCalculator = getFeeCalculator(static_cast<TWCoinType>(input.coin_type()));
68 +
    const auto& feeCalculator = getFeeCalculator(static_cast<TWCoinType>(input.coin_type()));
70 69
    auto unspentSelector = UnspentSelector(feeCalculator);
70 +
    bool maxAmount = input.use_max_amount();
71 71
72 72
    // select UTXOs
73 -
    if (!input.use_max_amount()) {
73 +
    auto output_size = 2;
74 +
    if (!maxAmount) {
74 75
        output_size = 2; // output + change
75 76
        plan.utxos = unspentSelector.select(input.utxo(), plan.amount, input.byte_fee(), output_size);
76 77
    } else {
@@ -82,7 +83,7 @@
Loading
82 83
83 84
    // Compute fee.
84 85
    // must preliminary set change so that there is a second output
85 -
    if (!input.use_max_amount()) {
86 +
    if (!maxAmount) {
86 87
        plan.amount = input.amount();
87 88
        plan.fee = 0;
88 89
        plan.change = plan.availableAmount - plan.amount;
@@ -97,7 +98,7 @@
Loading
97 98
    assert(plan.fee >= 0 && plan.fee <= plan.availableAmount);
98 99
    
99 100
    // adjust/compute amount
100 -
    if (!input.use_max_amount()) {
101 +
    if (!maxAmount) {
101 102
        // reduce amount if needed
102 103
        plan.amount = std::max(Amount(0), std::min(plan.amount, plan.availableAmount - plan.fee));
103 104
    } else {
@@ -109,7 +110,7 @@
Loading
109 110
    // compute change
110 111
    plan.change = plan.availableAmount - plan.amount - plan.fee;
111 112
    assert(plan.change >= 0 && plan.change <= plan.availableAmount);
112 -
    assert(!input.use_max_amount() || plan.change == 0); // change is 0 in max amount case
113 +
    assert(!maxAmount || plan.change == 0); // change is 0 in max amount case
113 114
114 115
    assert(plan.amount + plan.change + plan.fee == plan.availableAmount);
115 116

@@ -34,7 +34,7 @@
Loading
34 34
    std::vector<Proto::UnspentTransaction> selectMaxAmount(const T& utxos, int64_t byteFee);
35 35
36 36
    /// Construct, using provided feeCalculator (see getFeeCalculator()).
37 -
    explicit UnspentSelector(FeeCalculator& feeCalculator) : feeCalculator(feeCalculator) {}
37 +
    explicit UnspentSelector(const FeeCalculator& feeCalculator) : feeCalculator(feeCalculator) {}
38 38
    UnspentSelector() : UnspentSelector(getFeeCalculator(TWCoinTypeBitcoin)) {}
39 39
40 40
    template <typename T>
@@ -47,7 +47,7 @@
Loading
47 47
    }
48 48
49 49
  private:
50 -
    FeeCalculator& feeCalculator;
50 +
    const FeeCalculator& feeCalculator;
51 51
    template <typename T> std::vector<Proto::UnspentTransaction> filterDustInput(const T& selectedUtxos, int64_t byteFee);
52 52
};
53 53

Everything is accounted for!

No changes detected that need to be reviewed.
What changes does Codecov check for?
Lines, not adjusted in diff, that have changed coverage data.
Files that introduced coverage data that had none before.
Files that have missing coverage data that once were tracked.
Files Coverage
src +<.01% 95.20%
walletconsole/lib 94.81%
Project Totals (429 files) 95.18%
Loading