// Copyright (c) 2018 The Zcash developers // Copyright (c) 2016-2020 The Hush developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html #ifndef TRANSACTION_BUILDER_H #define TRANSACTION_BUILDER_H #include "consensus/params.h" #include "keystore.h" #include "primitives/transaction.h" #include "script/script.h" #include "script/standard.h" #include "uint256.h" #include "zcash/Address.hpp" #include "zcash/IncrementalMerkleTree.hpp" #include "zcash/Note.hpp" #include "zcash/NoteEncryption.hpp" #include struct SpendDescriptionInfo { libzcash::SaplingExpandedSpendingKey expsk; libzcash::SaplingNote note; uint256 alpha; uint256 anchor; SaplingWitness witness; SpendDescriptionInfo( libzcash::SaplingExpandedSpendingKey expsk, libzcash::SaplingNote note, uint256 anchor, SaplingWitness witness); }; struct OutputDescriptionInfo { uint256 ovk; libzcash::SaplingNote note; std::array memo; OutputDescriptionInfo( uint256 ovk, libzcash::SaplingNote note, std::array memo) : ovk(ovk), note(note), memo(memo) {} }; struct TransparentInputInfo { CScript scriptPubKey; CAmount value; TransparentInputInfo( CScript scriptPubKey, CAmount value) : scriptPubKey(scriptPubKey), value(value) {} }; class TransactionBuilder { private: Consensus::Params consensusParams; int nHeight; const CKeyStore* keystore; CMutableTransaction mtx; CAmount fee = 10000; std::vector spends; std::vector outputs; std::vector tIns; boost::optional> zChangeAddr; boost::optional tChangeAddr; boost::optional opReturn; bool AddOpRetLast(CScript &s); public: TransactionBuilder() {} 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 // previously-added Sapling spends. bool AddSaplingSpend( libzcash::SaplingExpandedSpendingKey expsk, libzcash::SaplingNote note, uint256 anchor, SaplingWitness witness); void AddSaplingOutput( uint256 ovk, libzcash::SaplingPaymentAddress to, CAmount value, std::array memo = {{0}}); // Assumes that the value correctly corresponds to the provided UTXO. void AddTransparentInput(COutPoint utxo, CScript scriptPubKey, CAmount value, uint32_t nSequence = 0xffffffff); bool AddTransparentOutput(CTxDestination& to, CAmount value); void AddOpRet(CScript &s); bool AddOpRetLast(); void SendChangeTo(libzcash::SaplingPaymentAddress changeAddr, uint256 ovk); bool SendChangeTo(CTxDestination& changeAddr); void SetLockTime(uint32_t time) { this->mtx.nLockTime = time; } boost::optional Build(); }; #endif /* TRANSACTION_BUILDER_H */