TransactionBuilder: Make fee configurable
This commit is contained in:
parent
45c0d1ec84
commit
a8dd4b0cf1
|
@ -272,3 +272,64 @@ TEST(TransactionBuilder, ChangeOutput)
|
||||||
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_SAPLING, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT);
|
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_SAPLING, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT);
|
||||||
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT);
|
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(TransactionBuilder, SetFee)
|
||||||
|
{
|
||||||
|
SelectParams(CBaseChainParams::REGTEST);
|
||||||
|
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::ALWAYS_ACTIVE);
|
||||||
|
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_SAPLING, Consensus::NetworkUpgrade::ALWAYS_ACTIVE);
|
||||||
|
auto consensusParams = Params().GetConsensus();
|
||||||
|
|
||||||
|
// Generate dummy Sapling address
|
||||||
|
auto sk = libzcash::SaplingSpendingKey::random();
|
||||||
|
auto xsk = sk.expanded_spending_key();
|
||||||
|
auto fvk = sk.full_viewing_key();
|
||||||
|
auto pk = sk.default_address();
|
||||||
|
|
||||||
|
// Generate dummy Sapling note
|
||||||
|
libzcash::SaplingNote note(pk, 50000);
|
||||||
|
auto cm = note.cm().value();
|
||||||
|
ZCSaplingIncrementalMerkleTree tree;
|
||||||
|
tree.append(cm);
|
||||||
|
auto anchor = tree.root();
|
||||||
|
auto witness = tree.witness();
|
||||||
|
|
||||||
|
// Default fee
|
||||||
|
{
|
||||||
|
auto builder = TransactionBuilder(consensusParams, 1);
|
||||||
|
ASSERT_TRUE(builder.AddSaplingSpend(xsk, note, anchor, witness));
|
||||||
|
builder.AddSaplingOutput(fvk, pk, 25000, {});
|
||||||
|
auto maybe_tx = builder.Build();
|
||||||
|
ASSERT_EQ(static_cast<bool>(maybe_tx), true);
|
||||||
|
auto tx = maybe_tx.get();
|
||||||
|
|
||||||
|
EXPECT_EQ(tx.vin.size(), 0);
|
||||||
|
EXPECT_EQ(tx.vout.size(), 0);
|
||||||
|
EXPECT_EQ(tx.vjoinsplit.size(), 0);
|
||||||
|
EXPECT_EQ(tx.vShieldedSpend.size(), 1);
|
||||||
|
EXPECT_EQ(tx.vShieldedOutput.size(), 2);
|
||||||
|
EXPECT_EQ(tx.valueBalance, 10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configured fee
|
||||||
|
{
|
||||||
|
auto builder = TransactionBuilder(consensusParams, 1);
|
||||||
|
ASSERT_TRUE(builder.AddSaplingSpend(xsk, note, anchor, witness));
|
||||||
|
builder.AddSaplingOutput(fvk, pk, 25000, {});
|
||||||
|
builder.SetFee(20000);
|
||||||
|
auto maybe_tx = builder.Build();
|
||||||
|
ASSERT_EQ(static_cast<bool>(maybe_tx), true);
|
||||||
|
auto tx = maybe_tx.get();
|
||||||
|
|
||||||
|
EXPECT_EQ(tx.vin.size(), 0);
|
||||||
|
EXPECT_EQ(tx.vout.size(), 0);
|
||||||
|
EXPECT_EQ(tx.vjoinsplit.size(), 0);
|
||||||
|
EXPECT_EQ(tx.vShieldedSpend.size(), 1);
|
||||||
|
EXPECT_EQ(tx.vShieldedOutput.size(), 2);
|
||||||
|
EXPECT_EQ(tx.valueBalance, 20000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Revert to default
|
||||||
|
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_SAPLING, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT);
|
||||||
|
UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT);
|
||||||
|
}
|
||||||
|
|
|
@ -79,6 +79,11 @@ bool TransactionBuilder::AddTransparentOutput(CTxDestination& to, CAmount value)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TransactionBuilder::SetFee(CAmount fee)
|
||||||
|
{
|
||||||
|
this->fee = fee;
|
||||||
|
}
|
||||||
|
|
||||||
void TransactionBuilder::SendChangeTo(libzcash::SaplingPaymentAddress changeAddr, libzcash::SaplingFullViewingKey fvkOut)
|
void TransactionBuilder::SendChangeTo(libzcash::SaplingPaymentAddress changeAddr, libzcash::SaplingFullViewingKey fvkOut)
|
||||||
{
|
{
|
||||||
zChangeAddr = std::make_pair(fvkOut, changeAddr);
|
zChangeAddr = std::make_pair(fvkOut, changeAddr);
|
||||||
|
@ -97,9 +102,6 @@ bool TransactionBuilder::SendChangeTo(CTxDestination& changeAddr)
|
||||||
|
|
||||||
boost::optional<CTransaction> TransactionBuilder::Build()
|
boost::optional<CTransaction> TransactionBuilder::Build()
|
||||||
{
|
{
|
||||||
// Fixed fee
|
|
||||||
const CAmount fee = 10000;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Consistency checks
|
// Consistency checks
|
||||||
//
|
//
|
||||||
|
|
|
@ -59,6 +59,7 @@ private:
|
||||||
int nHeight;
|
int nHeight;
|
||||||
const CKeyStore* keystore;
|
const CKeyStore* keystore;
|
||||||
CMutableTransaction mtx;
|
CMutableTransaction mtx;
|
||||||
|
CAmount fee = 10000;
|
||||||
|
|
||||||
std::vector<SpendDescriptionInfo> spends;
|
std::vector<SpendDescriptionInfo> spends;
|
||||||
std::vector<OutputDescriptionInfo> outputs;
|
std::vector<OutputDescriptionInfo> outputs;
|
||||||
|
@ -70,6 +71,8 @@ private:
|
||||||
public:
|
public:
|
||||||
TransactionBuilder(const Consensus::Params& consensusParams, int nHeight, CKeyStore* keyStore = nullptr);
|
TransactionBuilder(const Consensus::Params& consensusParams, int nHeight, CKeyStore* keyStore = nullptr);
|
||||||
|
|
||||||
|
void SetFee(CAmount fee);
|
||||||
|
|
||||||
// Returns false if the anchor does not match the anchor used by
|
// Returns false if the anchor does not match the anchor used by
|
||||||
// previously-added Sapling spends.
|
// previously-added Sapling spends.
|
||||||
bool AddSaplingSpend(
|
bool AddSaplingSpend(
|
||||||
|
|
Loading…
Reference in New Issue