summaryrefslogtreecommitdiff
path: root/bip-0075/paymentrequest.proto
blob: 1c9cc8e9980f768c1244ed6c2208efc43ead81bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//
// Simple Bitcoin Payment Protocol messages
//
// Use fields 1000+ for extensions;
// to avoid conflicts, register extensions via pull-req at
// https://github.com/bitcoin/bips/bip-0070/extensions.mediawiki
//

package payments;
option java_package = "org.bitcoin.protocols.payments";
option java_outer_classname = "Protos";

// Generalized form of "send payment to this/these bitcoin addresses"
message Output {
        optional uint64 amount = 1 [default = 0]; // amount is integer-number-of-satoshis
        required bytes script = 2; // usually one of the standard Script forms
}
message PaymentDetails {
        optional string network = 1 [default = "main"]; // "main" or "test"
        repeated Output outputs = 2;                // Where payment should be sent
        required uint64 time = 3;                   // Timestamp; when payment request created
        optional uint64 expires = 4;                // Timestamp; when this request should be considered invalid
        optional string memo = 5;                   // Human-readable description of request for the customer
        optional string payment_url = 6;            // URL to send Payment and get PaymentACK
        optional bytes  merchant_data = 7;          // Arbitrary data to include in the Payment message
        optional uint64 subtractable_fee = 1000;    // How many Satoshis can be subtracted from the requested amount and instead applied towards the fee
        optional uint64 fee_per_kb = 1001;          // Minimum transaction fee that must be included with the transaction in order for it to be accepted with zero confirmations.
        optional bool replace_by_fee = 1002;        // Indicates the sender can enable the Replace By Fee flag for this transaction and the receiver will still consider it accepted with zero confirmations. Otherwise, RBF transactions will not be accepted by the receiver until they are confirmed.
}
message PaymentRequest {
        optional uint32 payment_details_version = 1 [default = 1];
        optional string pki_type = 2 [default = "none"];  // none / x509+sha256 / x509+sha1
        optional bytes pki_data = 3;                      // depends on pki_type
        required bytes serialized_payment_details = 4;    // PaymentDetails
        optional bytes signature = 5;                     // pki-dependent signature
}
message X509Certificates {
        repeated bytes certificate = 1;    // DER-encoded X.509 certificate chain
}
message Payment {
        optional bytes merchant_data = 1;  // From PaymentDetails.merchant_data
        repeated bytes transactions = 2;   // Signed transactions that satisfy PaymentDetails.outputs
        repeated Output refund_to = 3;     // Where to send refunds, if a refund is necessary
        optional string memo = 4;          // Human-readable message for the merchant
}
message PaymentACK {
        required Payment payment = 1;      // Payment message that triggered this ACK
        optional string memo = 2;          // Human-readable message for customer
}

// BIP-IR Extensions

message InvoiceRequest {
        required bytes  sender_public_key = 1;              // Sender's EC Public Key
        optional uint64 amount = 3 [default = 0];           // amount is integer-number-of-satoshis
        optional string pki_type = 4 [default = "none"];    // none / x509+sha256
        optional bytes  pki_data = 5;                       // Depends on pki_type
        optional string memo = 6;                           // Human-readable description of invoice request for the receiver
        optional string notification_url = 7;               // URL to notify on EncryptedPaymentRequest ready
        optional bytes  signature = 8;                      // PKI-dependent signature
}

message EncryptedInvoiceRequest {
        required bytes  encrypted_invoice_request = 1;      // AES-256-CBC Encrypted InvoiceRequest as defined in InvoiceRequest Spec
        required bytes  invoice_request_hash = 2;           // SHA256 Hash of Non-Encrypted, Serialized InvoiceRequest (used for authentication)
        required bytes  sender_public_key = 3;              // Sender's EC Public Key
        required bytes  receiver_public_key = 4;            // Receiver's EC Public Key
        required uint64 nonce = 5;                          // Microseconds since epoch
        optional bytes  identifier = 6;                     // Unique key to identify this entire exchange on the server. invoice_request_hash SHOULD be used by default
        optional bytes  signature = 7;                      // Signature of this message using Sender's EC key
}

message EncryptedPaymentRequest {
        required bytes  encrypted_payment_request = 1;                   // AES-256-CBC Encrypted PaymentRequest as defined in InvoiceRequest Spec
        required bytes  payment_request_hash = 2;                        // SHA256 Hash of Non-Encrypted, Serialized PaymentRequest (used for authentication)
        required bytes  receiver_public_key = 3;                         // Receiver's EC Public Key
        required bytes  sender_public_key = 4;                           // Sender's EC Public Key
        required uint64 nonce = 5;                                       // Microseconds since epoch
        optional bool   requires_payment_message = 6 [default = false];  // Requires Payment/PaymentACK message exchange
        optional bytes  signature = 7;                                   // Signature of this message using Receiver's EC key
        optional bytes  identifier = 8;                                  // MUST use the identifier specified with the InvoiceRequest if the PaymentRequest is in response to an InvoiceRequest. Otherwise, use payment_request_hash or other unique value.
}

message EncryptedPayment {
        required bytes  encrypted_payment = 1;           // AES-256-CBC Encrypted BIP70 Payment as defined in InvoiceRequest Spec
        required bytes  payment_hash = 2;                // SHA256 Hash of Non-Encrypted, Serialized BIP70 Payment
        required bytes  sender_public_key = 3;           // Sender's EC Public Key
        required bytes  receiver_public_key = 4;         // Receiver's EC Public Key
        required uint64 nonce = 5;                       // Microseconds since epoch
        required bytes  signature = 6;                   // Signature over EncryptedPayment with Sender's EC Key
        optional bytes  identifier = 7;                  // Use the identifier specified with the EncryptedPaymentRequest, if any.
}

message EncryptedPaymentACK {
        required bytes  encrypted_payment_ack = 1;       // AES-256-CBC Encrypted BIP70 PaymentACK as defined in InvoiceRequest Spec
        required bytes  payment_ack_hash = 2;            // SHA256 Hash of Non-Encrypted, Serialized BIP70 PaymentACK
        required bytes  receiver_public_key = 3;         // Receiver's EC Public Key
        required bytes  sender_public_key = 4;           // Sender's EC Public Key
        required uint64 nonce = 5;                       // Microseconds since epoch
        required bytes  signature = 6;                   // Signature over EncryptedPaymentACK with Receiver's EC Key
        optional bytes  identifier = 7;                  // Use the identifier specified with the EncryptedPaymentRequest, if any.
}