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

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

/** XXX

Most likely, ALL fields in this file should be `required`. We are leaving some optionals
in place, in cases where the field value continues to the JSON as a string -- on the off
chance that somebody is relying on the behavior.

*/

/**
 * Request: Ask the device for a Binance address.
 * @start
 * @next BinanceAddress
 * @next Failure
 */
message BinanceGetAddress {
    repeated uint32 address_n = 1;  // BIP-32-style path to derive the key from master node
    optional bool show_display = 2; // optionally prompt for confirmation on trezor display
    optional bool chunkify = 3;     // display the address in chunks of 4 characters
}

/**
 * Response: A Binance address.
 * @end
 */
message BinanceAddress {
    required string address = 1;    // prefixed bech32 Binance address
}

/**
 * Request: Ask device for a public key corresponding to address_n path.
 * @start
 * @next BinancePublicKey
 */
message BinanceGetPublicKey {
    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: A public key corresponding to address_n path.
 * @end
 */
message BinancePublicKey {
    required bytes public_key = 1;
}

/**
 * Request: Starts the Binance transaction protocol flow.
 * A transaction consists of these common fields and a series of Binance<Any>Msg messages.
 * These parts form a JSON structure (a string) in Trezor's memory, which is signed to produce a BinanceSignedTx.
 * @start
 * @next BinanceTxRequest
 * @next Failure
*/
message BinanceSignTx {
    repeated uint32 address_n = 1; // BIP-32-style path to derive the key from master node
    required uint32 msg_count = 2; // count of Binance<Any>Msg to be included in this tx
    required sint64 account_number = 3;
    optional string chain_id = 4;
    optional string memo = 5;
    required sint64 sequence = 6;
    required sint64 source = 7;
    optional bool chunkify = 8;    // display the address in chunks of 4 characters
}

/**
 * Response: Trezor requests the next message or signals that it is ready to send a BinanceSignedTx.
 * @next BinanceTransferMsg
 * @next BinanceOrderMsg
 * @next BinanceCancelMsg
 */
message BinanceTxRequest {
}

/**
 * Request: Ask the device to include a Binance transfer msg in the tx.
 * @next BinanceSignedTx
 * @next Failure
 */
message BinanceTransferMsg {
    repeated BinanceInputOutput inputs = 1;
    repeated BinanceInputOutput outputs = 2;
    optional bool chunkify = 3;               // display the address in chunks of 4 characters

    message BinanceInputOutput {
        required string address = 1;
        repeated BinanceCoin coins = 2;
    }

    message BinanceCoin {
        required sint64 amount = 1;
        required string denom = 2;
    }
}

/**
 * Request: Ask the device to include a Binance order msg in the tx.
 * @next BinanceSignedTx
 * @next Failure
 */
message BinanceOrderMsg {
    optional string id = 1;
    required BinanceOrderType ordertype = 2;
    required sint64 price = 3;
    required sint64 quantity = 4;
    optional string sender = 5;
    required BinanceOrderSide side = 6;
    optional string symbol = 7;
    required BinanceTimeInForce timeinforce = 8;

    enum BinanceOrderType {
        OT_UNKNOWN = 0;
        MARKET = 1;
        LIMIT = 2;
        OT_RESERVED = 3;
    }

    enum BinanceOrderSide {
        SIDE_UNKNOWN = 0;
        BUY = 1;
        SELL = 2;
    }

    enum BinanceTimeInForce {
        TIF_UNKNOWN = 0;
        GTE = 1;
        TIF_RESERVED = 2;
        IOC = 3;
    }
}

/**
 * Request: Ask the device to include a Binance cancel msg in the tx.
 * @next BinanceSignedTx
 * @next Failure
 */
message BinanceCancelMsg {
    optional string refid = 1;
    optional string sender = 2;
    optional string symbol = 3;
}

/**
 * Response: A transaction signature and public key corresponding to the address_n path in BinanceSignTx.
 * @end
 */
message BinanceSignedTx {
	required bytes signature = 1;
    required bytes public_key = 2;
}