diff --git a/src/gtest/test_transaction_builder.cpp b/src/gtest/test_transaction_builder.cpp index 9f56da19f..3755dbf7f 100644 --- a/src/gtest/test_transaction_builder.cpp +++ b/src/gtest/test_transaction_builder.cpp @@ -58,7 +58,10 @@ TEST(TransactionBuilder, Invoke) { // Create a Sapling-only transaction auto builder2 = TransactionBuilder(consensusParams, 2); - builder2.AddSaplingSpend(xsk, note, anchor, witness); + ASSERT_TRUE(builder2.AddSaplingSpend(xsk, note, anchor, witness)); + // Check that trying to add a different anchor fails + ASSERT_FALSE(builder2.AddSaplingSpend(xsk, note, uint256(), witness)); + builder2.AddSaplingOutput(fvk, pk, 25, {}); auto maybe_tx2 = builder2.Build(); ASSERT_EQ(static_cast(maybe_tx2), true); diff --git a/src/transaction_builder.cpp b/src/transaction_builder.cpp index 91de871f9..1e4d266d0 100644 --- a/src/transaction_builder.cpp +++ b/src/transaction_builder.cpp @@ -27,14 +27,22 @@ TransactionBuilder::TransactionBuilder( mtx = CreateNewContextualCMutableTransaction(consensusParams, nHeight); } -void TransactionBuilder::AddSaplingSpend( +bool TransactionBuilder::AddSaplingSpend( libzcash::SaplingExpandedSpendingKey xsk, libzcash::SaplingNote note, uint256 anchor, - ZCSaplingIncrementalWitness witness -) { + ZCSaplingIncrementalWitness witness) +{ + // Consistency check: all anchors must equal the first one + if (!spends.empty()) { + if (spends[0].anchor != anchor) { + return false; + } + } + spends.emplace_back(xsk, note, anchor, witness); mtx.valueBalance += note.value(); + return true; } void TransactionBuilder::AddSaplingOutput( diff --git a/src/transaction_builder.h b/src/transaction_builder.h index e3d7096e0..2279bae6c 100644 --- a/src/transaction_builder.h +++ b/src/transaction_builder.h @@ -55,7 +55,9 @@ private: public: TransactionBuilder(const Consensus::Params& consensusParams, int nHeight); - void AddSaplingSpend( + // Returns false if the anchor does not match the anchor used by + // previously-added Sapling spends. + bool AddSaplingSpend( libzcash::SaplingExpandedSpendingKey xsk, libzcash::SaplingNote note, uint256 anchor,