syntax = "proto2";

// Sugar for easier handling in Java
option java_package = "io.coinwise.safewise.lib.protobuf";
option java_outer_classname = "SafeWISEMessageOntology";

/**
 * Ontology Transaction
 * @embed
 */
message OntologyTransaction {
    optional uint32 version = 1;
    optional uint32 type = 2;
    optional uint32 nonce = 3;
    optional uint64 gas_price = 4;
    optional uint64 gas_limit = 5;
    optional string payer = 6;
    repeated OntologyTxAttribute tx_attributes = 7;
    /**
     * Attribute of Ontology transaction
     */
    message OntologyTxAttribute {
        optional uint32 usage = 1;
        optional bytes data = 2;
    }
}

/**
 * Request: Ask device for Ontology public key corresponding to address_n path
 * @start
 * @next OntologyPublicKey
 */
message OntologyGetPublicKey {
    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 Ontology public key derived from device private seed
 * @end
 */
message OntologyPublicKey {
    optional bytes public_key = 1;  // Ontology public key
}

/**
 * Request: Ask device for Ontology address corresponding to address_n path
 * @start
 * @next OntologyAddress
 */
message OntologyGetAddress {
    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 Ontology address derived from device private seed
 * @end
 */
message OntologyAddress {
    optional string address = 1;    // Ontology address
}

/**
 * Request: Ask device to sign Ontology transfer
 * @start
 * @next OntologySignedTransfer
 */
message OntologySignTransfer {
    repeated uint32 address_n = 1;                  // BIP-32 path to derive the key from master node
    optional OntologyTransaction transaction = 2;
    optional OntologyTransfer transfer = 3;
    /**
     * Ontology Transfer
     */
    message OntologyTransfer {
        optional OntologyAsset asset = 1;
        optional uint64 amount = 2;
        optional string from_address = 3;
        optional string to_address = 4;
        /**
         * Ontology Asset
         */
        enum OntologyAsset {
            ONT = 1;
            ONG = 2;
        }
    }
}

/**
 * Response: Contains Ontology transfer signature
 * @end
 */
message OntologySignedTransfer {
    optional bytes signature = 1;
    optional bytes payload = 2;
}

/**
 * Request: Ask device to sign Ontology ONG withdrawal
 * @start
 * @next OntologySignedWithdrawOng
 */
message OntologySignWithdrawOng {
    repeated uint32 address_n = 1;                  // BIP-32 path to derive the key from master node
    optional OntologyTransaction transaction = 2;
    optional OntologyWithdrawOng withdraw_ong = 3;
    /**
    * Ontology ONG Withdrawal
    */
    message OntologyWithdrawOng {
        optional uint64 amount = 1;
        optional string from_address = 2;
        optional string to_address = 3;
    }
}

/**
 * Response: Contains Ontology ONG withdrawal signature
 * @end
 */
message OntologySignedWithdrawOng {
    optional bytes signature = 1;
    optional bytes payload = 2;
}

/**
 * Request: Ask device to sign Ontology ONT ID registration
 * @start
 * @next OntologySignedOntIdRegister
 */
message OntologySignOntIdRegister {
    repeated uint32 address_n = 1;                  // BIP-32 path to derive the key from master node
    optional OntologyTransaction transaction = 2;
    optional OntologyOntIdRegister ont_id_register = 3;
    /**
     * Ontology ONT ID registration
     */
    message OntologyOntIdRegister {
        optional string ont_id = 1;
        optional bytes public_key = 2;
    }
}

/**
 * Response: Contains Ontology ONT ID registration signature
 * @end
 */
message OntologySignedOntIdRegister {
    optional bytes signature = 1;
    optional bytes payload = 2;
}

/**
 * Request: Ask device to sign Ontology ONT ID attributes adding
 * @start
 * @next OntologySignedOntIdAddAttributes
 */
message OntologySignOntIdAddAttributes {
    repeated uint32 address_n = 1;                  // BIP-32 path to derive the key from master node
    optional OntologyTransaction transaction = 2;
    optional OntologyOntIdAddAttributes ont_id_add_attributes = 3;
    /**
     * Ontology ONT ID attributes adding
     */
    message OntologyOntIdAddAttributes {
        optional string ont_id = 1;
        optional bytes public_key = 2;
        repeated OntologyOntIdAttribute ont_id_attributes = 3;
        /**
         * Attribute of Ontology ONT ID
         */
        message OntologyOntIdAttribute {
            optional string key = 1;
            optional string type = 2;
            optional string value = 3;
        }
    }
}

/**
 * Response: Contains Ontology ONT ID attributes adding signature
 * @end
 */
message OntologySignedOntIdAddAttributes {
    optional bytes signature = 1;
    optional bytes payload = 2;
}
