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

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

// https://github.com/stellar/stellar-core/blob/02d26858069de7c0eefe065056fb0a19bf72ea56/src/xdr/Stellar-ledger-entries.x#L25-L31
enum StellarAssetType {
    NATIVE = 0;
    ALPHANUM4 = 1;
    ALPHANUM12 = 2;
}

/**
 * Describes a Stellar asset
 * @embed
 */
message StellarAsset {
    required StellarAssetType type = 1;
    optional string code = 2;       // for non-native assets, string describing the code
    optional string issuer = 3;     // issuing address

}

/**
 * Request: Address at the specified index
 * @start
 * @next StellarAddress
 */
message StellarGetAddress {
    repeated uint32 address_n = 1;  // BIP-32 path. For compatibility with other wallets, must be m/44'/148'/index'
    optional bool show_display = 2; // optionally show on display before sending the result
}

/**
 * Response: Address for the given index
 * @end
 */
message StellarAddress {
    required string address = 1;    // Address in Stellar format (base32 of a pubkey with checksum)
}

/**
 * Request: ask device to sign Stellar transaction
 * @start
 * @next StellarTxOpRequest
 */
message StellarSignTx {
    repeated uint32 address_n = 2;           // BIP-32 path. For compatibility with other wallets, must be m/44'/148'/index'
    required string network_passphrase = 3;  // passphrase for signing messages on the destination network
    required string source_account = 4;      // source account address
    required uint32 fee = 5;                 // Fee (in stroops) for the transaction
    required uint64 sequence_number = 6;     // transaction sequence number
    required uint32 timebounds_start = 8;    // unix timestamp (client must truncate this to 32 bytes)
    required uint32 timebounds_end = 9;      // unix timestamp (client must truncate this to 32 bytes)
    required StellarMemoType memo_type = 10; // type of memo attached to the transaction
    optional string memo_text = 11;          // up to 28 characters (4 bytes are for length)
    optional uint64 memo_id = 12;            // 8-byte uint64
    optional bytes memo_hash = 13;           // 32 bytes representing a hash
    required uint32 num_operations = 14;     // number of operations in this transaction

    // https://github.com/stellar/stellar-core/blob/02d26858069de7c0eefe065056fb0a19bf72ea56/src/xdr/Stellar-transaction.x#L506-L513
    enum StellarMemoType {
        NONE = 0;
        TEXT = 1;
        ID = 2;
        HASH = 3;
        RETURN = 4;
    }
}

/**
 * Response: device is ready for client to send the next operation
 * @next StellarPaymentOp
 * @next StellarCreateAccountOp
 * @next StellarPathPaymentStrictReceiveOp
 * @next StellarPathPaymentStrictSendOp
 * @next StellarManageSellOfferOp
 * @next StellarManageBuyOfferOp
 * @next StellarCreatePassiveSellOfferOp
 * @next StellarSetOptionsOp
 * @next StellarChangeTrustOp
 * @next StellarAllowTrustOp
 * @next StellarAccountMergeOp
 * @next StellarManageDataOp
 * @next StellarBumpSequenceOp
 */
message StellarTxOpRequest {
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarPaymentOp {
    optional string source_account = 1;         // (optional) source account address
    required string destination_account = 2;    // destination account address
    required StellarAsset asset = 3;        // asset involved in the operation
    required sint64 amount = 4;                 // amount of the given asset to pay
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarCreateAccountOp {
    optional string source_account = 1;     // (optional) source account address
    required string new_account = 2;        // account address to create
    required sint64 starting_balance = 3;   // initial starting balance for the new account
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarPathPaymentStrictReceiveOp {
    optional string source_account = 1;           // (optional) source address
    required StellarAsset send_asset = 2;         // asset we pay with
    required sint64 send_max = 3;                 // the maximum amount of sendAsset to send (excluding fees)
    required string destination_account = 4;      // recipient of the payment
    required StellarAsset destination_asset = 5;  // what they end up with
    required sint64 destination_amount = 6;       // amount they end up with
    repeated StellarAsset paths = 7;              // additional hops it must go through to get there
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarPathPaymentStrictSendOp {
    optional string source_account = 1;           // (optional) source address
    required StellarAsset send_asset = 2;         // asset we pay with
    required sint64 send_amount = 3;              // amount of sendAsset to send (excluding fees)
    required string destination_account = 4;      // recipient of the payment
    required StellarAsset destination_asset = 5;  // what they end up with
    required sint64 destination_min = 6;          // the minimum amount of dest asset to be received
    repeated StellarAsset paths = 7;              //additional hops it must go through to get there
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarManageSellOfferOp {
    optional string source_account = 1;             // (optional) source account address
    required StellarAsset selling_asset = 2;
    required StellarAsset buying_asset = 3;
    required sint64 amount = 4;
    required uint32 price_n = 5;                    // Price numerator
    required uint32 price_d = 6;                    // Price denominator
    required uint64 offer_id = 7;                   // Offer ID for updating an existing offer
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarManageBuyOfferOp {
    optional string source_account = 1;             // (optional) source account address
    required StellarAsset selling_asset = 2;
    required StellarAsset buying_asset = 3;
    required sint64 amount = 4;
    required uint32 price_n = 5;                    // Price numerator
    required uint32 price_d = 6;                    // Price denominator
    required uint64 offer_id = 7;                   // Offer ID for updating an existing offer
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarCreatePassiveSellOfferOp {
    optional string source_account = 1;             // (optional) source account address
    required StellarAsset selling_asset = 2;
    required StellarAsset buying_asset = 3;
    required sint64 amount = 4;
    required uint32 price_n = 5;                    // Price numerator
    required uint32 price_d = 6;                    // Price denominator
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarSetOptionsOp {
    optional string source_account = 1;                 // (optional) source account address
    optional string inflation_destination_account = 2;  // (optional) inflation destination address
    optional uint32 clear_flags = 3;
    optional uint32 set_flags = 4;
    optional uint32 master_weight = 5;
    optional uint32 low_threshold = 6;
    optional uint32 medium_threshold = 7;
    optional uint32 high_threshold = 8;
    optional string home_domain = 9;
    optional StellarSignerType signer_type = 10;
    optional bytes signer_key = 11;
    optional uint32 signer_weight = 12;

    // https://github.com/stellar/stellar-core/blob/02d26858069de7c0eefe065056fb0a19bf72ea56/src/xdr/Stellar-types.x#L32-L37
    enum StellarSignerType {
        ACCOUNT = 0;
        PRE_AUTH = 1;
        HASH = 2;
    }
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarChangeTrustOp {
    optional string source_account = 1;     // (optional) source account address
    required StellarAsset asset = 2;
    required uint64 limit = 3;
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarAllowTrustOp {
    optional string source_account = 1;     // (optional) source account address
    required string trusted_account = 2;    // The account being allowed to hold the asset
    required StellarAssetType asset_type = 3;
    optional string asset_code = 4;         // human-readable asset code
    required bool is_authorized = 5;
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarAccountMergeOp {
    optional string source_account = 1;         // (optional) source account address
    required string destination_account = 2;    // destination account address
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarManageDataOp {
    optional string source_account = 1; // (optional) source account address
    required string key = 2;
    optional bytes value = 3;           // 64 bytes of arbitrary data
}

/**
 * Request: ask device to confirm this operation type
 * @next StellarTxOpRequest
 * @next StellarSignedTx
 */
message StellarBumpSequenceOp {
    optional string source_account = 1; // (optional) source account address
    required uint64 bump_to = 2;        // new sequence number
}

/**
 * Response: signature for transaction
 * @end
 */
message StellarSignedTx {
    required bytes public_key = 1;  // public key for the private key used to sign data
    required bytes signature = 2;   // signature suitable for sending to the Stellar network
}
