103 lines
2.9 KiB
C++
103 lines
2.9 KiB
C++
// Copyright (c) 2018 The Zcash developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#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 <boost/optional.hpp>
|
|
|
|
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<unsigned char, ZC_MEMO_SIZE> memo;
|
|
|
|
OutputDescriptionInfo(
|
|
uint256 ovk,
|
|
libzcash::SaplingNote note,
|
|
std::array<unsigned char, ZC_MEMO_SIZE> 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<SpendDescriptionInfo> spends;
|
|
std::vector<OutputDescriptionInfo> outputs;
|
|
std::vector<TransparentInputInfo> tIns;
|
|
|
|
boost::optional<std::pair<libzcash::SaplingFullViewingKey, libzcash::SaplingPaymentAddress>> zChangeAddr;
|
|
boost::optional<CTxDestination> tChangeAddr;
|
|
|
|
public:
|
|
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(
|
|
libzcash::SaplingFullViewingKey from,
|
|
libzcash::SaplingPaymentAddress to,
|
|
CAmount value,
|
|
std::array<unsigned char, ZC_MEMO_SIZE> memo);
|
|
|
|
// Assumes that the value correctly corresponds to the provided UTXO.
|
|
void AddTransparentInput(COutPoint utxo, CScript scriptPubKey, CAmount value);
|
|
|
|
bool AddTransparentOutput(CTxDestination& to, CAmount value);
|
|
|
|
void SendChangeTo(libzcash::SaplingPaymentAddress changeAddr, libzcash::SaplingFullViewingKey fvkOut);
|
|
|
|
bool SendChangeTo(CTxDestination& changeAddr);
|
|
|
|
boost::optional<CTransaction> Build();
|
|
};
|
|
|
|
#endif /* TRANSACTION_BUILDER_H */
|