syntax = "proto2";
package hw.trezor.messages.cardano;

// Sugar for easier handling in Java
option java_package = "com.satoshilabs.trezor.lib.protobuf";
option java_outer_classname = "TrezorMessageCardano";

import "messages-common.proto";

/**
 * Values correspond to address header values given by the spec.
 * Script addresses are only supported in transaction outputs.
 */
enum CardanoAddressType {
    BASE = 0;
    BASE_SCRIPT_KEY = 1;
    BASE_KEY_SCRIPT = 2;
    BASE_SCRIPT_SCRIPT = 3;
    POINTER = 4;
    POINTER_SCRIPT = 5;
    ENTERPRISE = 6;
    ENTERPRISE_SCRIPT = 7;
    BYRON = 8;
    REWARD = 14;
    REWARD_SCRIPT = 15;
}

enum CardanoCertificateType {
    STAKE_REGISTRATION = 0;
    STAKE_DEREGISTRATION = 1;
    STAKE_DELEGATION = 2;
}

/**
 * Structure representing cardano PointerAddress pointer,
 * which points to a staking key registration certificate.
 * @embed
 */
message CardanoBlockchainPointerType {
    optional uint32 block_index = 1;
    optional uint32 tx_index = 2;
    optional uint32 certificate_index = 3;
}

/**
 * Structure to represent address parameters so they can be
 * reused in CardanoGetAddress and CardanoTxOutputType.
 * NetworkId isn't a part of the parameters, because in a transaction
 * this will be included separately in the transaction itself, so it
 * shouldn't be duplicated here.
 * @embed
 */
message CardanoAddressParametersType {
    optional CardanoAddressType address_type = 1;                   // one of the CardanoAddressType-s
    repeated uint32 address_n = 2;                                  // BIP-32-style path to derive the spending key from master node
    repeated uint32 address_n_staking = 3;                          // BIP-32-style path to derive staking key from master node
    optional bytes staking_key_hash = 4;                            // staking key can be derived from address_n_staking, or
                                                                    // can be sent directly e.g. if it doesn't belong to
                                                                    // the same account as address_n
    optional CardanoBlockchainPointerType certificate_pointer = 5;  // a pointer to the staking key registration certificate
}

/**
 * Request: Ask device for Cardano address
 * @start
 * @next CardanoAddress
 * @next Failure
 */
message CardanoGetAddress {
    // repeated uint32 address_n = 1;                               // moved to address_parameters
    optional bool show_display = 2;                                 // optionally prompt for confirmation on trezor display
    optional uint32 protocol_magic = 3;                             // network's protocol magic - needed for Byron addresses on testnets
    optional uint32 network_id = 4;                                 // network id - mainnet or testnet
    optional CardanoAddressParametersType address_parameters = 5;   // parameters used to derive the address
}

/**
 * Request: Ask device for Cardano address
 * @end
 */
message CardanoAddress {
    optional string address = 1;    // Base58 cardano address
}

/**
 * Request: Ask device for public key corresponding to address_n path
 * @start
 * @next CardanoPublicKey
 * @next Failure
 */
message CardanoGetPublicKey {
    repeated uint32 address_n = 1;  // BIP-32 path to derive the key from master node
    optional bool show_display = 2; // optionally show on display before sending the result
}

/**
 * Response: Contains public key derived from device private seed
 * @end
 */
message CardanoPublicKey {
    optional string xpub = 1;                               // Xpub key
    optional hw.trezor.messages.common.HDNodeType node = 2; // BIP-32 public node
}

/**
 * Request: Ask device to sign Cardano transaction
 * @start
 * @next CardanoSignedTx
 * @next Failure
 */
message CardanoSignTx {
    repeated CardanoTxInputType inputs = 1;             // inputs to be used in transaction
    repeated CardanoTxOutputType outputs = 2;           // outputs to be used in transaction
    // optional uint32 transactions_count = 3;          // left as a comment so we know to skip the id 3 in the future
    optional uint32 protocol_magic = 5;                 // network's protocol magic
    optional uint64 fee = 6;                            // transaction fee - added in shelley
    optional uint64 ttl = 7;                            // transaction ttl - added in shelley
    optional uint32 network_id = 8;                     // network id - mainnet or testnet
    repeated CardanoTxCertificateType certificates = 9; // transaction certificates - added in shelley
    repeated CardanoTxWithdrawalType withdrawals = 10;  // transaction withdrawals - added in shelley
    optional bytes metadata = 11;                       // transaction metadata - added in shelley
    /**
     * Structure representing cardano transaction input
     */
    message CardanoTxInputType {
        repeated uint32 address_n = 1;  // BIP-32 path to derive the key from master node
        optional bytes prev_hash = 2;   // hash of previous transaction output to spend by this input
        optional uint32 prev_index = 3; // index of previous output to spend
        // left as a comment so we know to skip the id 4 in the future
        // optional uint32 type = 4;    
    }
    /**
     * Structure representing cardano transaction output
     */
    message CardanoTxOutputType {
        optional string address = 1;                                    // target coin address in bech32 or base58
        // repeated uint32 address_n = 2;                               // moved to address_parameters
        optional uint64 amount = 3;                                     // amount to spend
        optional CardanoAddressParametersType address_parameters = 4;   // parameters used to derive the address
    }
    /**
     * Structure representing cardano transaction certificate
     */
    message CardanoTxCertificateType {
        optional CardanoCertificateType type = 1;   // certificate type
        repeated uint32 path = 2;                   // BIP-32 path to derive (staking) key
        optional bytes pool = 3;                    // pool hash
    }
    /**
     * Structure representing cardano transaction withdrawals
     */
    message CardanoTxWithdrawalType {
        repeated uint32 path = 1;
        optional uint64 amount = 2;
    }
}

/**
 * Response: Serialised signed cardano transaction
 * @end
 */
message CardanoSignedTx {
    optional bytes tx_hash = 1;         // hash of the transaction body
    optional bytes serialized_tx = 2;   // serialized, signed transaction
}