syntax = "proto3";
package cash.z.wallet.sdk.rpc;
option java_package = "cash.z.wallet.sdk.internal.rpc";
option go_package = "walletrpc";
option swift_prefix = "";
// Remember that proto3 fields are all optional. A field that is not present will be set to its zero value.
// bytes fields of hashes are in canonical little-endian format.

// CompactBlock is a packaging of ONLY the data from a block that's needed to:
//   1. Detect a payment to your shielded Sapling address
//   2. Detect a spend of your shielded Sapling notes
//   3. Update your witnesses to generate new Sapling spend proofs.
message CompactBlock {
    uint32 protoVersion = 1; // the version of this wire format, for storage
    uint64 height = 2; // the height of this block
    bytes hash = 3;
    bytes prevHash = 4;
    uint32 time = 5;
    bytes header = 6; // (hash, prevHash, and time) OR (full header)
    repeated CompactTx vtx = 7; // compact transactions from this block
}

message CompactTx {
    // Index and hash will allow the receiver to call out to chain
    // explorers or other data structures to retrieve more information
    // about this transaction.
    uint64 index = 1;
    bytes hash = 2;

    // The transaction fee: present if server can provide. In the case of a
    // stateless server and a transaction with transparent inputs, this will be
    // unset because the calculation requires reference to prior transactions.
    // in a pure-Sapling context, the fee will be calculable as:
    //    valueBalance + (sum(vPubNew) - sum(vPubOld) - sum(tOut))
    uint32 fee = 3;

    repeated CompactSpend spends = 4;
    repeated CompactOutput outputs = 5;
}

message CompactSpend {
    bytes nf = 1;
}

message CompactOutput {
    bytes cmu = 1;
    bytes epk = 2;
    bytes ciphertext = 3;
}
