From f92f7293bde776f88e99584f4b765326d76a8c20 Mon Sep 17 00:00:00 2001 From: "kunming.liu" Date: Mon, 18 Jan 2021 16:36:45 +0800 Subject: [PATCH 1/4] feat: SYG-484 Integrate with Sygna Bridge --- README.md | 4 + build.gradle | 2 +- images/workflow_sygna_bridge.png | Bin 0 -> 85279 bytes .../com/netki/bip75/protocol/Messages.java | 1627 +++++++++++++++-- .../bip75/service/impl/Bip75ServiceNetki.kt | 35 +- .../exceptions/InvalidSygnaOwnerException.kt | 9 + .../InvalidSygnaTransferIDException.kt | 9 + .../java/com/netki/model/InvoiceRequest.kt | 14 +- .../netki/model/InvoiceRequestParameters.kt | 10 +- src/main/java/com/netki/model/Payment.kt | 6 +- .../java/com/netki/model/PaymentParameters.kt | 8 +- .../java/com/netki/model/PaymentRequest.kt | 10 +- .../netki/model/PaymentRequestParameters.kt | 10 +- .../java/com/netki/model/SygnaParameters.kt | 33 + .../java/com/netki/util/ErrorInformation.kt | 3 + .../java/com/netki/util/MessagesExtensions.kt | 77 +- src/main/proto/payment.proto | 9 + src/test/java/com/netki/TransactIdTest.kt | 293 ++- .../netki/bip75/main/impl/Bip75NetkiTest.kt | 240 ++- src/test/java/com/netki/util/TestData.kt | 25 + 20 files changed, 2225 insertions(+), 199 deletions(-) create mode 100644 images/workflow_sygna_bridge.png create mode 100644 src/main/java/com/netki/exceptions/InvalidSygnaOwnerException.kt create mode 100644 src/main/java/com/netki/exceptions/InvalidSygnaTransferIDException.kt create mode 100644 src/main/java/com/netki/model/SygnaParameters.kt diff --git a/README.md b/README.md index 581a073..b131186 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +# Netki Readme # TransactID Library Java Edition ![Netki Logo](images/netki.png) @@ -16,6 +17,7 @@ What we provide: * Networking layers * [Protocol Buffers][4] wiring and definitions * Key signing with [EC cryptography][5] +* Transfer data with a originator VASP in [Sygna Bridge][8] ## Travel Rule @@ -57,6 +59,7 @@ A graph of the workflow is probably the best way to visualize what is going on. ![Transact ID Workflow](images/workflow_transactid.png) +![Transfer with Sygna Bridge Workflow](images/workflow_sygna_bridge.png) ## Quick Start @@ -906,3 +909,4 @@ data class AddressInformation @JvmOverloads constructor( [5]: https://en.wikipedia.org/wiki/Elliptic-curve_cryptography [6]: https://www.sec.gov/about/offices/ocie/aml2007/31cfr103.33g.pdf [7]: https://www.occ.treas.gov/topics/supervision-and-examination/bsa/index-bsa.html +[8]: https://developers.sygna.io/reference#bridge-3 diff --git a/build.gradle b/build.gradle index dd2beab..764f99c 100644 --- a/build.gradle +++ b/build.gradle @@ -20,7 +20,7 @@ ext { kotlinReflectVersion = "1.3.70" groupId = 'com.netki' - versionRelease = '1.0.0-beta4' + versionRelease = '1.0.0-beta5' artifactId = 'transactid' } diff --git a/images/workflow_sygna_bridge.png b/images/workflow_sygna_bridge.png new file mode 100644 index 0000000000000000000000000000000000000000..2de835b1253e1546e12a0938579c2a641239bc4e GIT binary patch literal 85279 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/netki/bip75/protocol/Messages.java b/src/main/java/com/netki/bip75/protocol/Messages.java index b59bd07..a4dae49 100644 --- a/src/main/java/com/netki/bip75/protocol/Messages.java +++ b/src/main/java/com/netki/bip75/protocol/Messages.java @@ -1,5 +1,5 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! -// source: payment.proto +// source: main/proto/payment.proto package com.netki.bip75.protocol; @@ -984,11 +984,68 @@ com.netki.bip75.protocol.Messages.OutputOrBuilder getOriginatorsAddressesOrBuild */ com.google.protobuf.ByteString getRecipientChainAddressBytes(); + + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 14; + * @return Whether the sygnaTransferId field is set. + */ + boolean hasSygnaTransferId(); + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 14; + * @return The sygnaTransferId. + */ + java.lang.String getSygnaTransferId(); + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 14; + * @return The bytes for sygnaTransferId. + */ + com.google.protobuf.ByteString + getSygnaTransferIdBytes(); + + /** + * optional bytes sygna_encrypted_originators = 15; + * @return Whether the sygnaEncryptedOriginators field is set. + */ + boolean hasSygnaEncryptedOriginators(); + /** + * optional bytes sygna_encrypted_originators = 15; + * @return The sygnaEncryptedOriginators. + */ + com.google.protobuf.ByteString getSygnaEncryptedOriginators(); + + /** + * optional string sygna_api_key = 16; + * @return Whether the sygnaApiKey field is set. + */ + boolean hasSygnaApiKey(); + /** + * optional string sygna_api_key = 16; + * @return The sygnaApiKey. + */ + java.lang.String getSygnaApiKey(); + /** + * optional string sygna_api_key = 16; + * @return The bytes for sygnaApiKey. + */ + com.google.protobuf.ByteString + getSygnaApiKeyBytes(); } /** * Protobuf type {@code payments.InvoiceRequest} */ - public static final class InvoiceRequest extends + public static final class InvoiceRequest extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.InvoiceRequest) InvoiceRequestOrBuilder { @@ -1010,6 +1067,9 @@ private InvoiceRequest() { senderEvCert_ = com.google.protobuf.ByteString.EMPTY; recipientVaspName_ = ""; recipientChainAddress_ = ""; + sygnaTransferId_ = ""; + sygnaEncryptedOriginators_ = com.google.protobuf.ByteString.EMPTY; + sygnaApiKey_ = ""; } @java.lang.Override @@ -1155,6 +1215,23 @@ private InvoiceRequest( recipientChainAddress_ = bs; break; } + case 114: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000200; + sygnaTransferId_ = bs; + break; + } + case 122: { + bitField0_ |= 0x00000400; + sygnaEncryptedOriginators_ = input.readBytes(); + break; + } + case 130: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000800; + sygnaApiKey_ = bs; + break; + } default: { if (!parseUnknownField( input, unknownFields, extensionRegistry, tag)) { @@ -1210,6 +1287,7 @@ private InvoiceRequest( * optional uint64 amount = 1 [default = 0]; * @return Whether the amount field is set. */ + @java.lang.Override public boolean hasAmount() { return ((bitField0_ & 0x00000001) != 0); } @@ -1221,6 +1299,7 @@ public boolean hasAmount() { * optional uint64 amount = 1 [default = 0]; * @return The amount. */ + @java.lang.Override public long getAmount() { return amount_; } @@ -1235,6 +1314,7 @@ public long getAmount() { * optional string memo = 2; * @return Whether the memo field is set. */ + @java.lang.Override public boolean hasMemo() { return ((bitField0_ & 0x00000002) != 0); } @@ -1246,6 +1326,7 @@ public boolean hasMemo() { * optional string memo = 2; * @return The memo. */ + @java.lang.Override public java.lang.String getMemo() { java.lang.Object ref = memo_; if (ref instanceof java.lang.String) { @@ -1268,6 +1349,7 @@ public java.lang.String getMemo() { * optional string memo = 2; * @return The bytes for memo. */ + @java.lang.Override public com.google.protobuf.ByteString getMemoBytes() { java.lang.Object ref = memo_; @@ -1292,6 +1374,7 @@ public java.lang.String getMemo() { * optional string notification_url = 3; * @return Whether the notificationUrl field is set. */ + @java.lang.Override public boolean hasNotificationUrl() { return ((bitField0_ & 0x00000004) != 0); } @@ -1303,6 +1386,7 @@ public boolean hasNotificationUrl() { * optional string notification_url = 3; * @return The notificationUrl. */ + @java.lang.Override public java.lang.String getNotificationUrl() { java.lang.Object ref = notificationUrl_; if (ref instanceof java.lang.String) { @@ -1325,6 +1409,7 @@ public java.lang.String getNotificationUrl() { * optional string notification_url = 3; * @return The bytes for notificationUrl. */ + @java.lang.Override public com.google.protobuf.ByteString getNotificationUrlBytes() { java.lang.Object ref = notificationUrl_; @@ -1348,6 +1433,7 @@ public java.lang.String getNotificationUrl() { * * repeated .payments.Originator originators = 4; */ + @java.lang.Override public java.util.List getOriginatorsList() { return originators_; } @@ -1358,6 +1444,7 @@ public java.util.List getOriginato * * repeated .payments.Originator originators = 4; */ + @java.lang.Override public java.util.List getOriginatorsOrBuilderList() { return originators_; @@ -1369,6 +1456,7 @@ public java.util.List getOriginato * * repeated .payments.Originator originators = 4; */ + @java.lang.Override public int getOriginatorsCount() { return originators_.size(); } @@ -1379,6 +1467,7 @@ public int getOriginatorsCount() { * * repeated .payments.Originator originators = 4; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Originator getOriginators(int index) { return originators_.get(index); } @@ -1389,6 +1478,7 @@ public com.netki.bip75.protocol.Messages.Originator getOriginators(int index) { * * repeated .payments.Originator originators = 4; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.OriginatorOrBuilder getOriginatorsOrBuilder( int index) { return originators_.get(index); @@ -1403,6 +1493,7 @@ public com.netki.bip75.protocol.Messages.OriginatorOrBuilder getOriginatorsOrBui * * repeated .payments.Beneficiary beneficiaries = 5; */ + @java.lang.Override public java.util.List getBeneficiariesList() { return beneficiaries_; } @@ -1413,6 +1504,7 @@ public java.util.List getBenefici * * repeated .payments.Beneficiary beneficiaries = 5; */ + @java.lang.Override public java.util.List getBeneficiariesOrBuilderList() { return beneficiaries_; @@ -1424,6 +1516,7 @@ public java.util.List getBenefici * * repeated .payments.Beneficiary beneficiaries = 5; */ + @java.lang.Override public int getBeneficiariesCount() { return beneficiaries_.size(); } @@ -1434,6 +1527,7 @@ public int getBeneficiariesCount() { * * repeated .payments.Beneficiary beneficiaries = 5; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Beneficiary getBeneficiaries(int index) { return beneficiaries_.get(index); } @@ -1444,6 +1538,7 @@ public com.netki.bip75.protocol.Messages.Beneficiary getBeneficiaries(int index) * * repeated .payments.Beneficiary beneficiaries = 5; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.BeneficiaryOrBuilder getBeneficiariesOrBuilder( int index) { return beneficiaries_.get(index); @@ -1458,6 +1553,7 @@ public com.netki.bip75.protocol.Messages.BeneficiaryOrBuilder getBeneficiariesOr * * repeated .payments.Output originatorsAddresses = 6; */ + @java.lang.Override public java.util.List getOriginatorsAddressesList() { return originatorsAddresses_; } @@ -1468,6 +1564,7 @@ public java.util.List getOriginatorsAd * * repeated .payments.Output originatorsAddresses = 6; */ + @java.lang.Override public java.util.List getOriginatorsAddressesOrBuilderList() { return originatorsAddresses_; @@ -1479,6 +1576,7 @@ public java.util.List getOriginatorsAd * * repeated .payments.Output originatorsAddresses = 6; */ + @java.lang.Override public int getOriginatorsAddressesCount() { return originatorsAddresses_.size(); } @@ -1489,6 +1587,7 @@ public int getOriginatorsAddressesCount() { * * repeated .payments.Output originatorsAddresses = 6; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Output getOriginatorsAddresses(int index) { return originatorsAddresses_.get(index); } @@ -1499,6 +1598,7 @@ public com.netki.bip75.protocol.Messages.Output getOriginatorsAddresses(int inde * * repeated .payments.Output originatorsAddresses = 6; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.OutputOrBuilder getOriginatorsAddressesOrBuilder( int index) { return originatorsAddresses_.get(index); @@ -1524,6 +1624,7 @@ public com.netki.bip75.protocol.Messages.AttestationType convert(java.lang.Integ * repeated .payments.AttestationType attestationsRequested = 7; * @return A list containing the attestationsRequested. */ + @java.lang.Override public java.util.List getAttestationsRequestedList() { return new com.google.protobuf.Internal.ListAdapter< java.lang.Integer, com.netki.bip75.protocol.Messages.AttestationType>(attestationsRequested_, attestationsRequested_converter_); @@ -1534,7 +1635,9 @@ public java.util.List getAtte * * * repeated .payments.AttestationType attestationsRequested = 7; + * @return The count of attestationsRequested. */ + @java.lang.Override public int getAttestationsRequestedCount() { return attestationsRequested_.size(); } @@ -1547,6 +1650,7 @@ public int getAttestationsRequestedCount() { * @param index The index of the element to return. * @return The attestationsRequested at the given index. */ + @java.lang.Override public com.netki.bip75.protocol.Messages.AttestationType getAttestationsRequested(int index) { return attestationsRequested_converter_.convert(attestationsRequested_.get(index)); } @@ -1561,6 +1665,7 @@ public com.netki.bip75.protocol.Messages.AttestationType getAttestationsRequeste * optional string sender_pki_type = 8 [default = "none"]; * @return Whether the senderPkiType field is set. */ + @java.lang.Override public boolean hasSenderPkiType() { return ((bitField0_ & 0x00000008) != 0); } @@ -1572,6 +1677,7 @@ public boolean hasSenderPkiType() { * optional string sender_pki_type = 8 [default = "none"]; * @return The senderPkiType. */ + @java.lang.Override public java.lang.String getSenderPkiType() { java.lang.Object ref = senderPkiType_; if (ref instanceof java.lang.String) { @@ -1594,6 +1700,7 @@ public java.lang.String getSenderPkiType() { * optional string sender_pki_type = 8 [default = "none"]; * @return The bytes for senderPkiType. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderPkiTypeBytes() { java.lang.Object ref = senderPkiType_; @@ -1618,6 +1725,7 @@ public java.lang.String getSenderPkiType() { * optional bytes sender_pki_data = 9; * @return Whether the senderPkiData field is set. */ + @java.lang.Override public boolean hasSenderPkiData() { return ((bitField0_ & 0x00000010) != 0); } @@ -1629,6 +1737,7 @@ public boolean hasSenderPkiData() { * optional bytes sender_pki_data = 9; * @return The senderPkiData. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderPkiData() { return senderPkiData_; } @@ -1643,6 +1752,7 @@ public com.google.protobuf.ByteString getSenderPkiData() { * optional bytes sender_signature = 10; * @return Whether the senderSignature field is set. */ + @java.lang.Override public boolean hasSenderSignature() { return ((bitField0_ & 0x00000020) != 0); } @@ -1654,6 +1764,7 @@ public boolean hasSenderSignature() { * optional bytes sender_signature = 10; * @return The senderSignature. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderSignature() { return senderSignature_; } @@ -1668,6 +1779,7 @@ public com.google.protobuf.ByteString getSenderSignature() { * optional bytes sender_ev_cert = 11; * @return Whether the senderEvCert field is set. */ + @java.lang.Override public boolean hasSenderEvCert() { return ((bitField0_ & 0x00000040) != 0); } @@ -1679,6 +1791,7 @@ public boolean hasSenderEvCert() { * optional bytes sender_ev_cert = 11; * @return The senderEvCert. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderEvCert() { return senderEvCert_; } @@ -1693,6 +1806,7 @@ public com.google.protobuf.ByteString getSenderEvCert() { * optional string recipient_vasp_name = 12; * @return Whether the recipientVaspName field is set. */ + @java.lang.Override public boolean hasRecipientVaspName() { return ((bitField0_ & 0x00000080) != 0); } @@ -1704,6 +1818,7 @@ public boolean hasRecipientVaspName() { * optional string recipient_vasp_name = 12; * @return The recipientVaspName. */ + @java.lang.Override public java.lang.String getRecipientVaspName() { java.lang.Object ref = recipientVaspName_; if (ref instanceof java.lang.String) { @@ -1726,6 +1841,7 @@ public java.lang.String getRecipientVaspName() { * optional string recipient_vasp_name = 12; * @return The bytes for recipientVaspName. */ + @java.lang.Override public com.google.protobuf.ByteString getRecipientVaspNameBytes() { java.lang.Object ref = recipientVaspName_; @@ -1750,6 +1866,7 @@ public java.lang.String getRecipientVaspName() { * optional string recipient_chain_address = 13; * @return Whether the recipientChainAddress field is set. */ + @java.lang.Override public boolean hasRecipientChainAddress() { return ((bitField0_ & 0x00000100) != 0); } @@ -1761,6 +1878,7 @@ public boolean hasRecipientChainAddress() { * optional string recipient_chain_address = 13; * @return The recipientChainAddress. */ + @java.lang.Override public java.lang.String getRecipientChainAddress() { java.lang.Object ref = recipientChainAddress_; if (ref instanceof java.lang.String) { @@ -1783,6 +1901,7 @@ public java.lang.String getRecipientChainAddress() { * optional string recipient_chain_address = 13; * @return The bytes for recipientChainAddress. */ + @java.lang.Override public com.google.protobuf.ByteString getRecipientChainAddressBytes() { java.lang.Object ref = recipientChainAddress_; @@ -1797,6 +1916,133 @@ public java.lang.String getRecipientChainAddress() { } } + public static final int SYGNA_TRANSFER_ID_FIELD_NUMBER = 14; + private volatile java.lang.Object sygnaTransferId_; + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 14; + * @return Whether the sygnaTransferId field is set. + */ + @java.lang.Override + public boolean hasSygnaTransferId() { + return ((bitField0_ & 0x00000200) != 0); + } + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 14; + * @return The sygnaTransferId. + */ + @java.lang.Override + public java.lang.String getSygnaTransferId() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sygnaTransferId_ = s; + } + return s; + } + } + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 14; + * @return The bytes for sygnaTransferId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSygnaTransferIdBytes() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sygnaTransferId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SYGNA_ENCRYPTED_ORIGINATORS_FIELD_NUMBER = 15; + private com.google.protobuf.ByteString sygnaEncryptedOriginators_; + /** + * optional bytes sygna_encrypted_originators = 15; + * @return Whether the sygnaEncryptedOriginators field is set. + */ + @java.lang.Override + public boolean hasSygnaEncryptedOriginators() { + return ((bitField0_ & 0x00000400) != 0); + } + /** + * optional bytes sygna_encrypted_originators = 15; + * @return The sygnaEncryptedOriginators. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSygnaEncryptedOriginators() { + return sygnaEncryptedOriginators_; + } + + public static final int SYGNA_API_KEY_FIELD_NUMBER = 16; + private volatile java.lang.Object sygnaApiKey_; + /** + * optional string sygna_api_key = 16; + * @return Whether the sygnaApiKey field is set. + */ + @java.lang.Override + public boolean hasSygnaApiKey() { + return ((bitField0_ & 0x00000800) != 0); + } + /** + * optional string sygna_api_key = 16; + * @return The sygnaApiKey. + */ + @java.lang.Override + public java.lang.String getSygnaApiKey() { + java.lang.Object ref = sygnaApiKey_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sygnaApiKey_ = s; + } + return s; + } + } + /** + * optional string sygna_api_key = 16; + * @return The bytes for sygnaApiKey. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSygnaApiKeyBytes() { + java.lang.Object ref = sygnaApiKey_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sygnaApiKey_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -1862,6 +2108,15 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (((bitField0_ & 0x00000100) != 0)) { com.google.protobuf.GeneratedMessageV3.writeString(output, 13, recipientChainAddress_); } + if (((bitField0_ & 0x00000200) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 14, sygnaTransferId_); + } + if (((bitField0_ & 0x00000400) != 0)) { + output.writeBytes(15, sygnaEncryptedOriginators_); + } + if (((bitField0_ & 0x00000800) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 16, sygnaApiKey_); + } unknownFields.writeTo(output); } @@ -1923,6 +2178,16 @@ public int getSerializedSize() { if (((bitField0_ & 0x00000100) != 0)) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, recipientChainAddress_); } + if (((bitField0_ & 0x00000200) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, sygnaTransferId_); + } + if (((bitField0_ & 0x00000400) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(15, sygnaEncryptedOriginators_); + } + if (((bitField0_ & 0x00000800) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(16, sygnaApiKey_); + } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; @@ -1990,6 +2255,21 @@ public boolean equals(final java.lang.Object obj) { if (!getRecipientChainAddress() .equals(other.getRecipientChainAddress())) return false; } + if (hasSygnaTransferId() != other.hasSygnaTransferId()) return false; + if (hasSygnaTransferId()) { + if (!getSygnaTransferId() + .equals(other.getSygnaTransferId())) return false; + } + if (hasSygnaEncryptedOriginators() != other.hasSygnaEncryptedOriginators()) return false; + if (hasSygnaEncryptedOriginators()) { + if (!getSygnaEncryptedOriginators() + .equals(other.getSygnaEncryptedOriginators())) return false; + } + if (hasSygnaApiKey() != other.hasSygnaApiKey()) return false; + if (hasSygnaApiKey()) { + if (!getSygnaApiKey() + .equals(other.getSygnaApiKey())) return false; + } if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -2054,6 +2334,18 @@ public int hashCode() { hash = (37 * hash) + RECIPIENT_CHAIN_ADDRESS_FIELD_NUMBER; hash = (53 * hash) + getRecipientChainAddress().hashCode(); } + if (hasSygnaTransferId()) { + hash = (37 * hash) + SYGNA_TRANSFER_ID_FIELD_NUMBER; + hash = (53 * hash) + getSygnaTransferId().hashCode(); + } + if (hasSygnaEncryptedOriginators()) { + hash = (37 * hash) + SYGNA_ENCRYPTED_ORIGINATORS_FIELD_NUMBER; + hash = (53 * hash) + getSygnaEncryptedOriginators().hashCode(); + } + if (hasSygnaApiKey()) { + hash = (37 * hash) + SYGNA_API_KEY_FIELD_NUMBER; + hash = (53 * hash) + getSygnaApiKey().hashCode(); + } hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; @@ -2228,6 +2520,12 @@ public Builder clear() { bitField0_ = (bitField0_ & ~0x00000800); recipientChainAddress_ = ""; bitField0_ = (bitField0_ & ~0x00001000); + sygnaTransferId_ = ""; + bitField0_ = (bitField0_ & ~0x00002000); + sygnaEncryptedOriginators_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00004000); + sygnaApiKey_ = ""; + bitField0_ = (bitField0_ & ~0x00008000); return this; } @@ -2324,6 +2622,18 @@ public com.netki.bip75.protocol.Messages.InvoiceRequest buildPartial() { to_bitField0_ |= 0x00000100; } result.recipientChainAddress_ = recipientChainAddress_; + if (((from_bitField0_ & 0x00002000) != 0)) { + to_bitField0_ |= 0x00000200; + } + result.sygnaTransferId_ = sygnaTransferId_; + if (((from_bitField0_ & 0x00004000) != 0)) { + to_bitField0_ |= 0x00000400; + } + result.sygnaEncryptedOriginators_ = sygnaEncryptedOriginators_; + if (((from_bitField0_ & 0x00008000) != 0)) { + to_bitField0_ |= 0x00000800; + } + result.sygnaApiKey_ = sygnaApiKey_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -2498,6 +2808,19 @@ public Builder mergeFrom(com.netki.bip75.protocol.Messages.InvoiceRequest other) recipientChainAddress_ = other.recipientChainAddress_; onChanged(); } + if (other.hasSygnaTransferId()) { + bitField0_ |= 0x00002000; + sygnaTransferId_ = other.sygnaTransferId_; + onChanged(); + } + if (other.hasSygnaEncryptedOriginators()) { + setSygnaEncryptedOriginators(other.getSygnaEncryptedOriginators()); + } + if (other.hasSygnaApiKey()) { + bitField0_ |= 0x00008000; + sygnaApiKey_ = other.sygnaApiKey_; + onChanged(); + } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; @@ -2547,6 +2870,7 @@ public Builder mergeFrom( * optional uint64 amount = 1 [default = 0]; * @return Whether the amount field is set. */ + @java.lang.Override public boolean hasAmount() { return ((bitField0_ & 0x00000001) != 0); } @@ -2558,6 +2882,7 @@ public boolean hasAmount() { * optional uint64 amount = 1 [default = 0]; * @return The amount. */ + @java.lang.Override public long getAmount() { return amount_; } @@ -3974,6 +4299,7 @@ public Builder setSenderPkiTypeBytes( * optional bytes sender_pki_data = 9; * @return Whether the senderPkiData field is set. */ + @java.lang.Override public boolean hasSenderPkiData() { return ((bitField0_ & 0x00000100) != 0); } @@ -3985,6 +4311,7 @@ public boolean hasSenderPkiData() { * optional bytes sender_pki_data = 9; * @return The senderPkiData. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderPkiData() { return senderPkiData_; } @@ -4030,6 +4357,7 @@ public Builder clearSenderPkiData() { * optional bytes sender_signature = 10; * @return Whether the senderSignature field is set. */ + @java.lang.Override public boolean hasSenderSignature() { return ((bitField0_ & 0x00000200) != 0); } @@ -4041,6 +4369,7 @@ public boolean hasSenderSignature() { * optional bytes sender_signature = 10; * @return The senderSignature. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderSignature() { return senderSignature_; } @@ -4086,6 +4415,7 @@ public Builder clearSenderSignature() { * optional bytes sender_ev_cert = 11; * @return Whether the senderEvCert field is set. */ + @java.lang.Override public boolean hasSenderEvCert() { return ((bitField0_ & 0x00000400) != 0); } @@ -4097,6 +4427,7 @@ public boolean hasSenderEvCert() { * optional bytes sender_ev_cert = 11; * @return The senderEvCert. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderEvCert() { return senderEvCert_; } @@ -4348,49 +4679,283 @@ public Builder setRecipientChainAddressBytes( onChanged(); return this; } - @java.lang.Override - public final Builder setUnknownFields( - final com.google.protobuf.UnknownFieldSet unknownFields) { - return super.setUnknownFields(unknownFields); - } - @java.lang.Override - public final Builder mergeUnknownFields( - final com.google.protobuf.UnknownFieldSet unknownFields) { - return super.mergeUnknownFields(unknownFields); + private java.lang.Object sygnaTransferId_ = ""; + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 14; + * @return Whether the sygnaTransferId field is set. + */ + public boolean hasSygnaTransferId() { + return ((bitField0_ & 0x00002000) != 0); } - - - // @@protoc_insertion_point(builder_scope:payments.InvoiceRequest) - } - - // @@protoc_insertion_point(class_scope:payments.InvoiceRequest) - private static final com.netki.bip75.protocol.Messages.InvoiceRequest DEFAULT_INSTANCE; - static { - DEFAULT_INSTANCE = new com.netki.bip75.protocol.Messages.InvoiceRequest(); - } - - public static com.netki.bip75.protocol.Messages.InvoiceRequest getDefaultInstance() { - return DEFAULT_INSTANCE; - } - - @java.lang.Deprecated public static final com.google.protobuf.Parser - PARSER = new com.google.protobuf.AbstractParser() { - @java.lang.Override - public InvoiceRequest parsePartialFrom( - com.google.protobuf.CodedInputStream input, - com.google.protobuf.ExtensionRegistryLite extensionRegistry) - throws com.google.protobuf.InvalidProtocolBufferException { - return new InvoiceRequest(input, extensionRegistry); + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 14; + * @return The sygnaTransferId. + */ + public java.lang.String getSygnaTransferId() { + java.lang.Object ref = sygnaTransferId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sygnaTransferId_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } } - }; - - public static com.google.protobuf.Parser parser() { - return PARSER; - } - - @java.lang.Override - public com.google.protobuf.Parser getParserForType() { + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 14; + * @return The bytes for sygnaTransferId. + */ + public com.google.protobuf.ByteString + getSygnaTransferIdBytes() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sygnaTransferId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 14; + * @param value The sygnaTransferId to set. + * @return This builder for chaining. + */ + public Builder setSygnaTransferId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00002000; + sygnaTransferId_ = value; + onChanged(); + return this; + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 14; + * @return This builder for chaining. + */ + public Builder clearSygnaTransferId() { + bitField0_ = (bitField0_ & ~0x00002000); + sygnaTransferId_ = getDefaultInstance().getSygnaTransferId(); + onChanged(); + return this; + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 14; + * @param value The bytes for sygnaTransferId to set. + * @return This builder for chaining. + */ + public Builder setSygnaTransferIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00002000; + sygnaTransferId_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString sygnaEncryptedOriginators_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes sygna_encrypted_originators = 15; + * @return Whether the sygnaEncryptedOriginators field is set. + */ + @java.lang.Override + public boolean hasSygnaEncryptedOriginators() { + return ((bitField0_ & 0x00004000) != 0); + } + /** + * optional bytes sygna_encrypted_originators = 15; + * @return The sygnaEncryptedOriginators. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSygnaEncryptedOriginators() { + return sygnaEncryptedOriginators_; + } + /** + * optional bytes sygna_encrypted_originators = 15; + * @param value The sygnaEncryptedOriginators to set. + * @return This builder for chaining. + */ + public Builder setSygnaEncryptedOriginators(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00004000; + sygnaEncryptedOriginators_ = value; + onChanged(); + return this; + } + /** + * optional bytes sygna_encrypted_originators = 15; + * @return This builder for chaining. + */ + public Builder clearSygnaEncryptedOriginators() { + bitField0_ = (bitField0_ & ~0x00004000); + sygnaEncryptedOriginators_ = getDefaultInstance().getSygnaEncryptedOriginators(); + onChanged(); + return this; + } + + private java.lang.Object sygnaApiKey_ = ""; + /** + * optional string sygna_api_key = 16; + * @return Whether the sygnaApiKey field is set. + */ + public boolean hasSygnaApiKey() { + return ((bitField0_ & 0x00008000) != 0); + } + /** + * optional string sygna_api_key = 16; + * @return The sygnaApiKey. + */ + public java.lang.String getSygnaApiKey() { + java.lang.Object ref = sygnaApiKey_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sygnaApiKey_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string sygna_api_key = 16; + * @return The bytes for sygnaApiKey. + */ + public com.google.protobuf.ByteString + getSygnaApiKeyBytes() { + java.lang.Object ref = sygnaApiKey_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sygnaApiKey_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string sygna_api_key = 16; + * @param value The sygnaApiKey to set. + * @return This builder for chaining. + */ + public Builder setSygnaApiKey( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00008000; + sygnaApiKey_ = value; + onChanged(); + return this; + } + /** + * optional string sygna_api_key = 16; + * @return This builder for chaining. + */ + public Builder clearSygnaApiKey() { + bitField0_ = (bitField0_ & ~0x00008000); + sygnaApiKey_ = getDefaultInstance().getSygnaApiKey(); + onChanged(); + return this; + } + /** + * optional string sygna_api_key = 16; + * @param value The bytes for sygnaApiKey to set. + * @return This builder for chaining. + */ + public Builder setSygnaApiKeyBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00008000; + sygnaApiKey_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:payments.InvoiceRequest) + } + + // @@protoc_insertion_point(class_scope:payments.InvoiceRequest) + private static final com.netki.bip75.protocol.Messages.InvoiceRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.netki.bip75.protocol.Messages.InvoiceRequest(); + } + + public static com.netki.bip75.protocol.Messages.InvoiceRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + @java.lang.Deprecated public static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public InvoiceRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new InvoiceRequest(input, extensionRegistry); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { return PARSER; } @@ -4574,11 +5139,51 @@ com.netki.bip75.protocol.Messages.BeneficiaryOrBuilder getBeneficiariesOrBuilder * @return The senderSignature. */ com.google.protobuf.ByteString getSenderSignature(); + + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 8; + * @return Whether the sygnaTransferId field is set. + */ + boolean hasSygnaTransferId(); + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 8; + * @return The sygnaTransferId. + */ + java.lang.String getSygnaTransferId(); + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 8; + * @return The bytes for sygnaTransferId. + */ + com.google.protobuf.ByteString + getSygnaTransferIdBytes(); + + /** + * optional bytes sygna_encrypted_beneficiaries = 9; + * @return Whether the sygnaEncryptedBeneficiaries field is set. + */ + boolean hasSygnaEncryptedBeneficiaries(); + /** + * optional bytes sygna_encrypted_beneficiaries = 9; + * @return The sygnaEncryptedBeneficiaries. + */ + com.google.protobuf.ByteString getSygnaEncryptedBeneficiaries(); } /** * Protobuf type {@code payments.PaymentRequest} */ - public static final class PaymentRequest extends + public static final class PaymentRequest extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.PaymentRequest) PaymentRequestOrBuilder { @@ -4595,6 +5200,8 @@ private PaymentRequest() { senderPkiType_ = "none"; senderPkiData_ = com.google.protobuf.ByteString.EMPTY; senderSignature_ = com.google.protobuf.ByteString.EMPTY; + sygnaTransferId_ = ""; + sygnaEncryptedBeneficiaries_ = com.google.protobuf.ByteString.EMPTY; } @java.lang.Override @@ -4698,6 +5305,17 @@ private PaymentRequest( senderSignature_ = input.readBytes(); break; } + case 66: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000020; + sygnaTransferId_ = bs; + break; + } + case 74: { + bitField0_ |= 0x00000040; + sygnaEncryptedBeneficiaries_ = input.readBytes(); + break; + } default: { if (!parseUnknownField( input, unknownFields, extensionRegistry, tag)) { @@ -4743,6 +5361,7 @@ private PaymentRequest( * optional uint32 payment_details_version = 1 [default = 1]; * @return Whether the paymentDetailsVersion field is set. */ + @java.lang.Override public boolean hasPaymentDetailsVersion() { return ((bitField0_ & 0x00000001) != 0); } @@ -4750,6 +5369,7 @@ public boolean hasPaymentDetailsVersion() { * optional uint32 payment_details_version = 1 [default = 1]; * @return The paymentDetailsVersion. */ + @java.lang.Override public int getPaymentDetailsVersion() { return paymentDetailsVersion_; } @@ -4764,6 +5384,7 @@ public int getPaymentDetailsVersion() { * required bytes serialized_payment_details = 2; * @return Whether the serializedPaymentDetails field is set. */ + @java.lang.Override public boolean hasSerializedPaymentDetails() { return ((bitField0_ & 0x00000002) != 0); } @@ -4775,6 +5396,7 @@ public boolean hasSerializedPaymentDetails() { * required bytes serialized_payment_details = 2; * @return The serializedPaymentDetails. */ + @java.lang.Override public com.google.protobuf.ByteString getSerializedPaymentDetails() { return serializedPaymentDetails_; } @@ -4788,6 +5410,7 @@ public com.google.protobuf.ByteString getSerializedPaymentDetails() { * * repeated .payments.Beneficiary beneficiaries = 3; */ + @java.lang.Override public java.util.List getBeneficiariesList() { return beneficiaries_; } @@ -4798,6 +5421,7 @@ public java.util.List getBenefici * * repeated .payments.Beneficiary beneficiaries = 3; */ + @java.lang.Override public java.util.List getBeneficiariesOrBuilderList() { return beneficiaries_; @@ -4809,6 +5433,7 @@ public java.util.List getBenefici * * repeated .payments.Beneficiary beneficiaries = 3; */ + @java.lang.Override public int getBeneficiariesCount() { return beneficiaries_.size(); } @@ -4819,6 +5444,7 @@ public int getBeneficiariesCount() { * * repeated .payments.Beneficiary beneficiaries = 3; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Beneficiary getBeneficiaries(int index) { return beneficiaries_.get(index); } @@ -4829,6 +5455,7 @@ public com.netki.bip75.protocol.Messages.Beneficiary getBeneficiaries(int index) * * repeated .payments.Beneficiary beneficiaries = 3; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.BeneficiaryOrBuilder getBeneficiariesOrBuilder( int index) { return beneficiaries_.get(index); @@ -4854,6 +5481,7 @@ public com.netki.bip75.protocol.Messages.AttestationType convert(java.lang.Integ * repeated .payments.AttestationType attestationsRequested = 4; * @return A list containing the attestationsRequested. */ + @java.lang.Override public java.util.List getAttestationsRequestedList() { return new com.google.protobuf.Internal.ListAdapter< java.lang.Integer, com.netki.bip75.protocol.Messages.AttestationType>(attestationsRequested_, attestationsRequested_converter_); @@ -4864,7 +5492,9 @@ public java.util.List getAtte * * * repeated .payments.AttestationType attestationsRequested = 4; + * @return The count of attestationsRequested. */ + @java.lang.Override public int getAttestationsRequestedCount() { return attestationsRequested_.size(); } @@ -4877,6 +5507,7 @@ public int getAttestationsRequestedCount() { * @param index The index of the element to return. * @return The attestationsRequested at the given index. */ + @java.lang.Override public com.netki.bip75.protocol.Messages.AttestationType getAttestationsRequested(int index) { return attestationsRequested_converter_.convert(attestationsRequested_.get(index)); } @@ -4891,6 +5522,7 @@ public com.netki.bip75.protocol.Messages.AttestationType getAttestationsRequeste * required string sender_pki_type = 5 [default = "none"]; * @return Whether the senderPkiType field is set. */ + @java.lang.Override public boolean hasSenderPkiType() { return ((bitField0_ & 0x00000004) != 0); } @@ -4902,6 +5534,7 @@ public boolean hasSenderPkiType() { * required string sender_pki_type = 5 [default = "none"]; * @return The senderPkiType. */ + @java.lang.Override public java.lang.String getSenderPkiType() { java.lang.Object ref = senderPkiType_; if (ref instanceof java.lang.String) { @@ -4924,6 +5557,7 @@ public java.lang.String getSenderPkiType() { * required string sender_pki_type = 5 [default = "none"]; * @return The bytes for senderPkiType. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderPkiTypeBytes() { java.lang.Object ref = senderPkiType_; @@ -4948,6 +5582,7 @@ public java.lang.String getSenderPkiType() { * optional bytes sender_pki_data = 6; * @return Whether the senderPkiData field is set. */ + @java.lang.Override public boolean hasSenderPkiData() { return ((bitField0_ & 0x00000008) != 0); } @@ -4959,6 +5594,7 @@ public boolean hasSenderPkiData() { * optional bytes sender_pki_data = 6; * @return The senderPkiData. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderPkiData() { return senderPkiData_; } @@ -4973,6 +5609,7 @@ public com.google.protobuf.ByteString getSenderPkiData() { * optional bytes sender_signature = 7; * @return Whether the senderSignature field is set. */ + @java.lang.Override public boolean hasSenderSignature() { return ((bitField0_ & 0x00000010) != 0); } @@ -4984,10 +5621,90 @@ public boolean hasSenderSignature() { * optional bytes sender_signature = 7; * @return The senderSignature. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderSignature() { return senderSignature_; } + public static final int SYGNA_TRANSFER_ID_FIELD_NUMBER = 8; + private volatile java.lang.Object sygnaTransferId_; + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 8; + * @return Whether the sygnaTransferId field is set. + */ + @java.lang.Override + public boolean hasSygnaTransferId() { + return ((bitField0_ & 0x00000020) != 0); + } + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 8; + * @return The sygnaTransferId. + */ + @java.lang.Override + public java.lang.String getSygnaTransferId() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sygnaTransferId_ = s; + } + return s; + } + } + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 8; + * @return The bytes for sygnaTransferId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSygnaTransferIdBytes() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sygnaTransferId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SYGNA_ENCRYPTED_BENEFICIARIES_FIELD_NUMBER = 9; + private com.google.protobuf.ByteString sygnaEncryptedBeneficiaries_; + /** + * optional bytes sygna_encrypted_beneficiaries = 9; + * @return Whether the sygnaEncryptedBeneficiaries field is set. + */ + @java.lang.Override + public boolean hasSygnaEncryptedBeneficiaries() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + * optional bytes sygna_encrypted_beneficiaries = 9; + * @return The sygnaEncryptedBeneficiaries. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSygnaEncryptedBeneficiaries() { + return sygnaEncryptedBeneficiaries_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -5037,6 +5754,12 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (((bitField0_ & 0x00000010) != 0)) { output.writeBytes(7, senderSignature_); } + if (((bitField0_ & 0x00000020) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 8, sygnaTransferId_); + } + if (((bitField0_ & 0x00000040) != 0)) { + output.writeBytes(9, sygnaEncryptedBeneficiaries_); + } unknownFields.writeTo(output); } @@ -5078,6 +5801,13 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeBytesSize(7, senderSignature_); } + if (((bitField0_ & 0x00000020) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, sygnaTransferId_); + } + if (((bitField0_ & 0x00000040) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(9, sygnaEncryptedBeneficiaries_); + } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; @@ -5121,6 +5851,16 @@ public boolean equals(final java.lang.Object obj) { if (!getSenderSignature() .equals(other.getSenderSignature())) return false; } + if (hasSygnaTransferId() != other.hasSygnaTransferId()) return false; + if (hasSygnaTransferId()) { + if (!getSygnaTransferId() + .equals(other.getSygnaTransferId())) return false; + } + if (hasSygnaEncryptedBeneficiaries() != other.hasSygnaEncryptedBeneficiaries()) return false; + if (hasSygnaEncryptedBeneficiaries()) { + if (!getSygnaEncryptedBeneficiaries() + .equals(other.getSygnaEncryptedBeneficiaries())) return false; + } if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -5160,6 +5900,14 @@ public int hashCode() { hash = (37 * hash) + SENDER_SIGNATURE_FIELD_NUMBER; hash = (53 * hash) + getSenderSignature().hashCode(); } + if (hasSygnaTransferId()) { + hash = (37 * hash) + SYGNA_TRANSFER_ID_FIELD_NUMBER; + hash = (53 * hash) + getSygnaTransferId().hashCode(); + } + if (hasSygnaEncryptedBeneficiaries()) { + hash = (37 * hash) + SYGNA_ENCRYPTED_BENEFICIARIES_FIELD_NUMBER; + hash = (53 * hash) + getSygnaEncryptedBeneficiaries().hashCode(); + } hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; @@ -5312,6 +6060,10 @@ public Builder clear() { bitField0_ = (bitField0_ & ~0x00000020); senderSignature_ = com.google.protobuf.ByteString.EMPTY; bitField0_ = (bitField0_ & ~0x00000040); + sygnaTransferId_ = ""; + bitField0_ = (bitField0_ & ~0x00000080); + sygnaEncryptedBeneficiaries_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000100); return this; } @@ -5374,6 +6126,14 @@ public com.netki.bip75.protocol.Messages.PaymentRequest buildPartial() { to_bitField0_ |= 0x00000010; } result.senderSignature_ = senderSignature_; + if (((from_bitField0_ & 0x00000080) != 0)) { + to_bitField0_ |= 0x00000020; + } + result.sygnaTransferId_ = sygnaTransferId_; + if (((from_bitField0_ & 0x00000100) != 0)) { + to_bitField0_ |= 0x00000040; + } + result.sygnaEncryptedBeneficiaries_ = sygnaEncryptedBeneficiaries_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -5476,6 +6236,14 @@ public Builder mergeFrom(com.netki.bip75.protocol.Messages.PaymentRequest other) if (other.hasSenderSignature()) { setSenderSignature(other.getSenderSignature()); } + if (other.hasSygnaTransferId()) { + bitField0_ |= 0x00000080; + sygnaTransferId_ = other.sygnaTransferId_; + onChanged(); + } + if (other.hasSygnaEncryptedBeneficiaries()) { + setSygnaEncryptedBeneficiaries(other.getSygnaEncryptedBeneficiaries()); + } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; @@ -5522,6 +6290,7 @@ public Builder mergeFrom( * optional uint32 payment_details_version = 1 [default = 1]; * @return Whether the paymentDetailsVersion field is set. */ + @java.lang.Override public boolean hasPaymentDetailsVersion() { return ((bitField0_ & 0x00000001) != 0); } @@ -5529,6 +6298,7 @@ public boolean hasPaymentDetailsVersion() { * optional uint32 payment_details_version = 1 [default = 1]; * @return The paymentDetailsVersion. */ + @java.lang.Override public int getPaymentDetailsVersion() { return paymentDetailsVersion_; } @@ -5563,6 +6333,7 @@ public Builder clearPaymentDetailsVersion() { * required bytes serialized_payment_details = 2; * @return Whether the serializedPaymentDetails field is set. */ + @java.lang.Override public boolean hasSerializedPaymentDetails() { return ((bitField0_ & 0x00000002) != 0); } @@ -5574,6 +6345,7 @@ public boolean hasSerializedPaymentDetails() { * required bytes serialized_payment_details = 2; * @return The serializedPaymentDetails. */ + @java.lang.Override public com.google.protobuf.ByteString getSerializedPaymentDetails() { return serializedPaymentDetails_; } @@ -6153,6 +6925,7 @@ public Builder setSenderPkiTypeBytes( * optional bytes sender_pki_data = 6; * @return Whether the senderPkiData field is set. */ + @java.lang.Override public boolean hasSenderPkiData() { return ((bitField0_ & 0x00000020) != 0); } @@ -6164,6 +6937,7 @@ public boolean hasSenderPkiData() { * optional bytes sender_pki_data = 6; * @return The senderPkiData. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderPkiData() { return senderPkiData_; } @@ -6209,6 +6983,7 @@ public Builder clearSenderPkiData() { * optional bytes sender_signature = 7; * @return Whether the senderSignature field is set. */ + @java.lang.Override public boolean hasSenderSignature() { return ((bitField0_ & 0x00000040) != 0); } @@ -6220,6 +6995,7 @@ public boolean hasSenderSignature() { * optional bytes sender_signature = 7; * @return The senderSignature. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderSignature() { return senderSignature_; } @@ -6255,6 +7031,156 @@ public Builder clearSenderSignature() { onChanged(); return this; } + + private java.lang.Object sygnaTransferId_ = ""; + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 8; + * @return Whether the sygnaTransferId field is set. + */ + public boolean hasSygnaTransferId() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 8; + * @return The sygnaTransferId. + */ + public java.lang.String getSygnaTransferId() { + java.lang.Object ref = sygnaTransferId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sygnaTransferId_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 8; + * @return The bytes for sygnaTransferId. + */ + public com.google.protobuf.ByteString + getSygnaTransferIdBytes() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sygnaTransferId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 8; + * @param value The sygnaTransferId to set. + * @return This builder for chaining. + */ + public Builder setSygnaTransferId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000080; + sygnaTransferId_ = value; + onChanged(); + return this; + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 8; + * @return This builder for chaining. + */ + public Builder clearSygnaTransferId() { + bitField0_ = (bitField0_ & ~0x00000080); + sygnaTransferId_ = getDefaultInstance().getSygnaTransferId(); + onChanged(); + return this; + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 8; + * @param value The bytes for sygnaTransferId to set. + * @return This builder for chaining. + */ + public Builder setSygnaTransferIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000080; + sygnaTransferId_ = value; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString sygnaEncryptedBeneficiaries_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes sygna_encrypted_beneficiaries = 9; + * @return Whether the sygnaEncryptedBeneficiaries field is set. + */ + @java.lang.Override + public boolean hasSygnaEncryptedBeneficiaries() { + return ((bitField0_ & 0x00000100) != 0); + } + /** + * optional bytes sygna_encrypted_beneficiaries = 9; + * @return The sygnaEncryptedBeneficiaries. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSygnaEncryptedBeneficiaries() { + return sygnaEncryptedBeneficiaries_; + } + /** + * optional bytes sygna_encrypted_beneficiaries = 9; + * @param value The sygnaEncryptedBeneficiaries to set. + * @return This builder for chaining. + */ + public Builder setSygnaEncryptedBeneficiaries(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000100; + sygnaEncryptedBeneficiaries_ = value; + onChanged(); + return this; + } + /** + * optional bytes sygna_encrypted_beneficiaries = 9; + * @return This builder for chaining. + */ + public Builder clearSygnaEncryptedBeneficiaries() { + bitField0_ = (bitField0_ & ~0x00000100); + sygnaEncryptedBeneficiaries_ = getDefaultInstance().getSygnaEncryptedBeneficiaries(); + onChanged(); + return this; + } @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { @@ -6520,11 +7446,40 @@ com.netki.bip75.protocol.Messages.OriginatorOrBuilder getOriginatorsOrBuilder( */ com.netki.bip75.protocol.Messages.BeneficiaryOrBuilder getBeneficiariesOrBuilder( int index); + + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 7; + * @return Whether the sygnaTransferId field is set. + */ + boolean hasSygnaTransferId(); + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 7; + * @return The sygnaTransferId. + */ + java.lang.String getSygnaTransferId(); + /** + *
+     * sygna specific fields
+     * 
+ * + * optional string sygna_transfer_id = 7; + * @return The bytes for sygnaTransferId. + */ + com.google.protobuf.ByteString + getSygnaTransferIdBytes(); } /** * Protobuf type {@code payments.Payment} */ - public static final class Payment extends + public static final class Payment extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.Payment) PaymentOrBuilder { @@ -6540,6 +7495,7 @@ private Payment() { memo_ = ""; originators_ = java.util.Collections.emptyList(); beneficiaries_ = java.util.Collections.emptyList(); + sygnaTransferId_ = ""; } @java.lang.Override @@ -6619,6 +7575,12 @@ private Payment( input.readMessage(com.netki.bip75.protocol.Messages.Beneficiary.PARSER, extensionRegistry)); break; } + case 58: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000004; + sygnaTransferId_ = bs; + break; + } default: { if (!parseUnknownField( input, unknownFields, extensionRegistry, tag)) { @@ -6674,6 +7636,7 @@ private Payment( * optional bytes merchant_data = 1; * @return Whether the merchantData field is set. */ + @java.lang.Override public boolean hasMerchantData() { return ((bitField0_ & 0x00000001) != 0); } @@ -6685,6 +7648,7 @@ public boolean hasMerchantData() { * optional bytes merchant_data = 1; * @return The merchantData. */ + @java.lang.Override public com.google.protobuf.ByteString getMerchantData() { return merchantData_; } @@ -6699,6 +7663,7 @@ public com.google.protobuf.ByteString getMerchantData() { * repeated bytes transactions = 2; * @return A list containing the transactions. */ + @java.lang.Override public java.util.List getTransactionsList() { return transactions_; @@ -6736,6 +7701,7 @@ public com.google.protobuf.ByteString getTransactions(int index) { * * repeated .payments.Output refund_to = 3; */ + @java.lang.Override public java.util.List getRefundToList() { return refundTo_; } @@ -6746,6 +7712,7 @@ public java.util.List getRefundToList( * * repeated .payments.Output refund_to = 3; */ + @java.lang.Override public java.util.List getRefundToOrBuilderList() { return refundTo_; @@ -6757,6 +7724,7 @@ public java.util.List getRefundToList( * * repeated .payments.Output refund_to = 3; */ + @java.lang.Override public int getRefundToCount() { return refundTo_.size(); } @@ -6767,6 +7735,7 @@ public int getRefundToCount() { * * repeated .payments.Output refund_to = 3; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Output getRefundTo(int index) { return refundTo_.get(index); } @@ -6777,6 +7746,7 @@ public com.netki.bip75.protocol.Messages.Output getRefundTo(int index) { * * repeated .payments.Output refund_to = 3; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.OutputOrBuilder getRefundToOrBuilder( int index) { return refundTo_.get(index); @@ -6792,6 +7762,7 @@ public com.netki.bip75.protocol.Messages.OutputOrBuilder getRefundToOrBuilder( * optional string memo = 4; * @return Whether the memo field is set. */ + @java.lang.Override public boolean hasMemo() { return ((bitField0_ & 0x00000002) != 0); } @@ -6803,6 +7774,7 @@ public boolean hasMemo() { * optional string memo = 4; * @return The memo. */ + @java.lang.Override public java.lang.String getMemo() { java.lang.Object ref = memo_; if (ref instanceof java.lang.String) { @@ -6825,6 +7797,7 @@ public java.lang.String getMemo() { * optional string memo = 4; * @return The bytes for memo. */ + @java.lang.Override public com.google.protobuf.ByteString getMemoBytes() { java.lang.Object ref = memo_; @@ -6848,6 +7821,7 @@ public java.lang.String getMemo() { * * repeated .payments.Originator originators = 5; */ + @java.lang.Override public java.util.List getOriginatorsList() { return originators_; } @@ -6858,6 +7832,7 @@ public java.util.List getOriginato * * repeated .payments.Originator originators = 5; */ + @java.lang.Override public java.util.List getOriginatorsOrBuilderList() { return originators_; @@ -6869,6 +7844,7 @@ public java.util.List getOriginato * * repeated .payments.Originator originators = 5; */ + @java.lang.Override public int getOriginatorsCount() { return originators_.size(); } @@ -6879,6 +7855,7 @@ public int getOriginatorsCount() { * * repeated .payments.Originator originators = 5; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Originator getOriginators(int index) { return originators_.get(index); } @@ -6889,6 +7866,7 @@ public com.netki.bip75.protocol.Messages.Originator getOriginators(int index) { * * repeated .payments.Originator originators = 5; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.OriginatorOrBuilder getOriginatorsOrBuilder( int index) { return originators_.get(index); @@ -6903,6 +7881,7 @@ public com.netki.bip75.protocol.Messages.OriginatorOrBuilder getOriginatorsOrBui * * repeated .payments.Beneficiary beneficiaries = 6; */ + @java.lang.Override public java.util.List getBeneficiariesList() { return beneficiaries_; } @@ -6913,40 +7892,104 @@ public java.util.List getBenefici * * repeated .payments.Beneficiary beneficiaries = 6; */ + @java.lang.Override public java.util.List getBeneficiariesOrBuilderList() { return beneficiaries_; } /** *
-     * Beneficiaries of the InvoiceRequest
+     * Beneficiaries of the InvoiceRequest
+     * 
+ * + * repeated .payments.Beneficiary beneficiaries = 6; + */ + @java.lang.Override + public int getBeneficiariesCount() { + return beneficiaries_.size(); + } + /** + *
+     * Beneficiaries of the InvoiceRequest
+     * 
+ * + * repeated .payments.Beneficiary beneficiaries = 6; + */ + @java.lang.Override + public com.netki.bip75.protocol.Messages.Beneficiary getBeneficiaries(int index) { + return beneficiaries_.get(index); + } + /** + *
+     * Beneficiaries of the InvoiceRequest
+     * 
+ * + * repeated .payments.Beneficiary beneficiaries = 6; + */ + @java.lang.Override + public com.netki.bip75.protocol.Messages.BeneficiaryOrBuilder getBeneficiariesOrBuilder( + int index) { + return beneficiaries_.get(index); + } + + public static final int SYGNA_TRANSFER_ID_FIELD_NUMBER = 7; + private volatile java.lang.Object sygnaTransferId_; + /** + *
+     * sygna specific fields
      * 
* - * repeated .payments.Beneficiary beneficiaries = 6; + * optional string sygna_transfer_id = 7; + * @return Whether the sygnaTransferId field is set. */ - public int getBeneficiariesCount() { - return beneficiaries_.size(); + @java.lang.Override + public boolean hasSygnaTransferId() { + return ((bitField0_ & 0x00000004) != 0); } /** *
-     * Beneficiaries of the InvoiceRequest
+     * sygna specific fields
      * 
* - * repeated .payments.Beneficiary beneficiaries = 6; + * optional string sygna_transfer_id = 7; + * @return The sygnaTransferId. */ - public com.netki.bip75.protocol.Messages.Beneficiary getBeneficiaries(int index) { - return beneficiaries_.get(index); + @java.lang.Override + public java.lang.String getSygnaTransferId() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sygnaTransferId_ = s; + } + return s; + } } /** *
-     * Beneficiaries of the InvoiceRequest
+     * sygna specific fields
      * 
* - * repeated .payments.Beneficiary beneficiaries = 6; + * optional string sygna_transfer_id = 7; + * @return The bytes for sygnaTransferId. */ - public com.netki.bip75.protocol.Messages.BeneficiaryOrBuilder getBeneficiariesOrBuilder( - int index) { - return beneficiaries_.get(index); + @java.lang.Override + public com.google.protobuf.ByteString + getSygnaTransferIdBytes() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sygnaTransferId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } } private byte memoizedIsInitialized = -1; @@ -6993,6 +8036,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) for (int i = 0; i < beneficiaries_.size(); i++) { output.writeMessage(6, beneficiaries_.get(i)); } + if (((bitField0_ & 0x00000004) != 0)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 7, sygnaTransferId_); + } unknownFields.writeTo(output); } @@ -7030,6 +8076,9 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeMessageSize(6, beneficiaries_.get(i)); } + if (((bitField0_ & 0x00000004) != 0)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, sygnaTransferId_); + } size += unknownFields.getSerializedSize(); memoizedSize = size; return size; @@ -7063,6 +8112,11 @@ public boolean equals(final java.lang.Object obj) { .equals(other.getOriginatorsList())) return false; if (!getBeneficiariesList() .equals(other.getBeneficiariesList())) return false; + if (hasSygnaTransferId() != other.hasSygnaTransferId()) return false; + if (hasSygnaTransferId()) { + if (!getSygnaTransferId() + .equals(other.getSygnaTransferId())) return false; + } if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -7098,6 +8152,10 @@ public int hashCode() { hash = (37 * hash) + BENEFICIARIES_FIELD_NUMBER; hash = (53 * hash) + getBeneficiariesList().hashCode(); } + if (hasSygnaTransferId()) { + hash = (37 * hash) + SYGNA_TRANSFER_ID_FIELD_NUMBER; + hash = (53 * hash) + getSygnaTransferId().hashCode(); + } hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; @@ -7258,6 +8316,8 @@ public Builder clear() { } else { beneficiariesBuilder_.clear(); } + sygnaTransferId_ = ""; + bitField0_ = (bitField0_ & ~0x00000040); return this; } @@ -7326,6 +8386,10 @@ public com.netki.bip75.protocol.Messages.Payment buildPartial() { } else { result.beneficiaries_ = beneficiariesBuilder_.build(); } + if (((from_bitField0_ & 0x00000040) != 0)) { + to_bitField0_ |= 0x00000004; + } + result.sygnaTransferId_ = sygnaTransferId_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -7471,6 +8535,11 @@ public Builder mergeFrom(com.netki.bip75.protocol.Messages.Payment other) { } } } + if (other.hasSygnaTransferId()) { + bitField0_ |= 0x00000040; + sygnaTransferId_ = other.sygnaTransferId_; + onChanged(); + } this.mergeUnknownFields(other.unknownFields); onChanged(); return this; @@ -7520,6 +8589,7 @@ public Builder mergeFrom( * optional bytes merchant_data = 1; * @return Whether the merchantData field is set. */ + @java.lang.Override public boolean hasMerchantData() { return ((bitField0_ & 0x00000001) != 0); } @@ -7531,6 +8601,7 @@ public boolean hasMerchantData() { * optional bytes merchant_data = 1; * @return The merchantData. */ + @java.lang.Override public com.google.protobuf.ByteString getMerchantData() { return merchantData_; } @@ -8723,6 +9794,114 @@ public com.netki.bip75.protocol.Messages.Beneficiary.Builder addBeneficiariesBui } return beneficiariesBuilder_; } + + private java.lang.Object sygnaTransferId_ = ""; + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 7; + * @return Whether the sygnaTransferId field is set. + */ + public boolean hasSygnaTransferId() { + return ((bitField0_ & 0x00000040) != 0); + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 7; + * @return The sygnaTransferId. + */ + public java.lang.String getSygnaTransferId() { + java.lang.Object ref = sygnaTransferId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + sygnaTransferId_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 7; + * @return The bytes for sygnaTransferId. + */ + public com.google.protobuf.ByteString + getSygnaTransferIdBytes() { + java.lang.Object ref = sygnaTransferId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sygnaTransferId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 7; + * @param value The sygnaTransferId to set. + * @return This builder for chaining. + */ + public Builder setSygnaTransferId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + sygnaTransferId_ = value; + onChanged(); + return this; + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 7; + * @return This builder for chaining. + */ + public Builder clearSygnaTransferId() { + bitField0_ = (bitField0_ & ~0x00000040); + sygnaTransferId_ = getDefaultInstance().getSygnaTransferId(); + onChanged(); + return this; + } + /** + *
+       * sygna specific fields
+       * 
+ * + * optional string sygna_transfer_id = 7; + * @param value The bytes for sygnaTransferId to set. + * @return This builder for chaining. + */ + public Builder setSygnaTransferIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000040; + sygnaTransferId_ = value; + onChanged(); + return this; + } @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { @@ -8839,7 +10018,7 @@ public interface PaymentACKOrBuilder extends /** * Protobuf type {@code payments.PaymentACK} */ - public static final class PaymentACK extends + public static final class PaymentACK extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.PaymentACK) PaymentACKOrBuilder { @@ -8945,6 +10124,7 @@ private PaymentACK( * required .payments.Payment payment = 1; * @return Whether the payment field is set. */ + @java.lang.Override public boolean hasPayment() { return ((bitField0_ & 0x00000001) != 0); } @@ -8956,6 +10136,7 @@ public boolean hasPayment() { * required .payments.Payment payment = 1; * @return The payment. */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Payment getPayment() { return payment_ == null ? com.netki.bip75.protocol.Messages.Payment.getDefaultInstance() : payment_; } @@ -8966,6 +10147,7 @@ public com.netki.bip75.protocol.Messages.Payment getPayment() { * * required .payments.Payment payment = 1; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.PaymentOrBuilder getPaymentOrBuilder() { return payment_ == null ? com.netki.bip75.protocol.Messages.Payment.getDefaultInstance() : payment_; } @@ -8980,6 +10162,7 @@ public com.netki.bip75.protocol.Messages.PaymentOrBuilder getPaymentOrBuilder() * optional string memo = 2; * @return Whether the memo field is set. */ + @java.lang.Override public boolean hasMemo() { return ((bitField0_ & 0x00000002) != 0); } @@ -8991,6 +10174,7 @@ public boolean hasMemo() { * optional string memo = 2; * @return The memo. */ + @java.lang.Override public java.lang.String getMemo() { java.lang.Object ref = memo_; if (ref instanceof java.lang.String) { @@ -9013,6 +10197,7 @@ public java.lang.String getMemo() { * optional string memo = 2; * @return The bytes for memo. */ + @java.lang.Override public com.google.protobuf.ByteString getMemoBytes() { java.lang.Object ref = memo_; @@ -9776,7 +10961,7 @@ com.netki.bip75.protocol.Messages.AttestationOrBuilder getAttestationsOrBuilder( /** * Protobuf type {@code payments.Beneficiary} */ - public static final class Beneficiary extends + public static final class Beneficiary extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.Beneficiary) BeneficiaryOrBuilder { @@ -9881,6 +11066,7 @@ private Beneficiary( * required bool primary_for_transaction = 1 [default = true]; * @return Whether the primaryForTransaction field is set. */ + @java.lang.Override public boolean hasPrimaryForTransaction() { return ((bitField0_ & 0x00000001) != 0); } @@ -9892,6 +11078,7 @@ public boolean hasPrimaryForTransaction() { * required bool primary_for_transaction = 1 [default = true]; * @return The primaryForTransaction. */ + @java.lang.Override public boolean getPrimaryForTransaction() { return primaryForTransaction_; } @@ -9905,6 +11092,7 @@ public boolean getPrimaryForTransaction() { * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public java.util.List getAttestationsList() { return attestations_; } @@ -9915,6 +11103,7 @@ public java.util.List getAttestat * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public java.util.List getAttestationsOrBuilderList() { return attestations_; @@ -9926,6 +11115,7 @@ public java.util.List getAttestat * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public int getAttestationsCount() { return attestations_.size(); } @@ -9936,6 +11126,7 @@ public int getAttestationsCount() { * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Attestation getAttestations(int index) { return attestations_.get(index); } @@ -9946,6 +11137,7 @@ public com.netki.bip75.protocol.Messages.Attestation getAttestations(int index) * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.AttestationOrBuilder getAttestationsOrBuilder( int index) { return attestations_.get(index); @@ -10337,6 +11529,7 @@ public Builder mergeFrom( * required bool primary_for_transaction = 1 [default = true]; * @return Whether the primaryForTransaction field is set. */ + @java.lang.Override public boolean hasPrimaryForTransaction() { return ((bitField0_ & 0x00000001) != 0); } @@ -10348,6 +11541,7 @@ public boolean hasPrimaryForTransaction() { * required bool primary_for_transaction = 1 [default = true]; * @return The primaryForTransaction. */ + @java.lang.Override public boolean getPrimaryForTransaction() { return primaryForTransaction_; } @@ -10815,7 +12009,7 @@ com.netki.bip75.protocol.Messages.AttestationOrBuilder getAttestationsOrBuilder( /** * Protobuf type {@code payments.Originator} */ - public static final class Originator extends + public static final class Originator extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.Originator) OriginatorOrBuilder { @@ -10920,6 +12114,7 @@ private Originator( * required bool primary_for_transaction = 1 [default = true]; * @return Whether the primaryForTransaction field is set. */ + @java.lang.Override public boolean hasPrimaryForTransaction() { return ((bitField0_ & 0x00000001) != 0); } @@ -10931,6 +12126,7 @@ public boolean hasPrimaryForTransaction() { * required bool primary_for_transaction = 1 [default = true]; * @return The primaryForTransaction. */ + @java.lang.Override public boolean getPrimaryForTransaction() { return primaryForTransaction_; } @@ -10944,6 +12140,7 @@ public boolean getPrimaryForTransaction() { * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public java.util.List getAttestationsList() { return attestations_; } @@ -10954,6 +12151,7 @@ public java.util.List getAttestat * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public java.util.List getAttestationsOrBuilderList() { return attestations_; @@ -10965,6 +12163,7 @@ public java.util.List getAttestat * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public int getAttestationsCount() { return attestations_.size(); } @@ -10975,6 +12174,7 @@ public int getAttestationsCount() { * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Attestation getAttestations(int index) { return attestations_.get(index); } @@ -10985,6 +12185,7 @@ public com.netki.bip75.protocol.Messages.Attestation getAttestations(int index) * * repeated .payments.Attestation attestations = 2; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.AttestationOrBuilder getAttestationsOrBuilder( int index) { return attestations_.get(index); @@ -11376,6 +12577,7 @@ public Builder mergeFrom( * required bool primary_for_transaction = 1 [default = true]; * @return Whether the primaryForTransaction field is set. */ + @java.lang.Override public boolean hasPrimaryForTransaction() { return ((bitField0_ & 0x00000001) != 0); } @@ -11387,6 +12589,7 @@ public boolean hasPrimaryForTransaction() { * required bool primary_for_transaction = 1 [default = true]; * @return The primaryForTransaction. */ + @java.lang.Override public boolean getPrimaryForTransaction() { return primaryForTransaction_; } @@ -11877,7 +13080,7 @@ public interface AttestationOrBuilder extends /** * Protobuf type {@code payments.Attestation} */ - public static final class Attestation extends + public static final class Attestation extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.Attestation) AttestationOrBuilder { @@ -11995,7 +13198,7 @@ private Attestation( * optional .payments.AttestationType attestation = 1; * @return Whether the attestation field is set. */ - public boolean hasAttestation() { + @java.lang.Override public boolean hasAttestation() { return ((bitField0_ & 0x00000001) != 0); } /** @@ -12006,7 +13209,7 @@ public boolean hasAttestation() { * optional .payments.AttestationType attestation = 1; * @return The attestation. */ - public com.netki.bip75.protocol.Messages.AttestationType getAttestation() { + @java.lang.Override public com.netki.bip75.protocol.Messages.AttestationType getAttestation() { @SuppressWarnings("deprecation") com.netki.bip75.protocol.Messages.AttestationType result = com.netki.bip75.protocol.Messages.AttestationType.valueOf(attestation_); return result == null ? com.netki.bip75.protocol.Messages.AttestationType.LEGAL_PERSON_PRIMARY_NAME : result; @@ -12022,6 +13225,7 @@ public com.netki.bip75.protocol.Messages.AttestationType getAttestation() { * optional string pki_type = 2 [default = "none"]; * @return Whether the pkiType field is set. */ + @java.lang.Override public boolean hasPkiType() { return ((bitField0_ & 0x00000002) != 0); } @@ -12033,6 +13237,7 @@ public boolean hasPkiType() { * optional string pki_type = 2 [default = "none"]; * @return The pkiType. */ + @java.lang.Override public java.lang.String getPkiType() { java.lang.Object ref = pkiType_; if (ref instanceof java.lang.String) { @@ -12055,6 +13260,7 @@ public java.lang.String getPkiType() { * optional string pki_type = 2 [default = "none"]; * @return The bytes for pkiType. */ + @java.lang.Override public com.google.protobuf.ByteString getPkiTypeBytes() { java.lang.Object ref = pkiType_; @@ -12079,6 +13285,7 @@ public java.lang.String getPkiType() { * optional bytes pki_data = 3; * @return Whether the pkiData field is set. */ + @java.lang.Override public boolean hasPkiData() { return ((bitField0_ & 0x00000004) != 0); } @@ -12090,6 +13297,7 @@ public boolean hasPkiData() { * optional bytes pki_data = 3; * @return The pkiData. */ + @java.lang.Override public com.google.protobuf.ByteString getPkiData() { return pkiData_; } @@ -12104,6 +13312,7 @@ public com.google.protobuf.ByteString getPkiData() { * optional bytes signature = 4; * @return Whether the signature field is set. */ + @java.lang.Override public boolean hasSignature() { return ((bitField0_ & 0x00000008) != 0); } @@ -12115,6 +13324,7 @@ public boolean hasSignature() { * optional bytes signature = 4; * @return The signature. */ + @java.lang.Override public com.google.protobuf.ByteString getSignature() { return signature_; } @@ -12517,7 +13727,7 @@ public Builder mergeFrom( * optional .payments.AttestationType attestation = 1; * @return Whether the attestation field is set. */ - public boolean hasAttestation() { + @java.lang.Override public boolean hasAttestation() { return ((bitField0_ & 0x00000001) != 0); } /** @@ -12528,6 +13738,7 @@ public boolean hasAttestation() { * optional .payments.AttestationType attestation = 1; * @return The attestation. */ + @java.lang.Override public com.netki.bip75.protocol.Messages.AttestationType getAttestation() { @SuppressWarnings("deprecation") com.netki.bip75.protocol.Messages.AttestationType result = com.netki.bip75.protocol.Messages.AttestationType.valueOf(attestation_); @@ -12683,6 +13894,7 @@ public Builder setPkiTypeBytes( * optional bytes pki_data = 3; * @return Whether the pkiData field is set. */ + @java.lang.Override public boolean hasPkiData() { return ((bitField0_ & 0x00000004) != 0); } @@ -12694,6 +13906,7 @@ public boolean hasPkiData() { * optional bytes pki_data = 3; * @return The pkiData. */ + @java.lang.Override public com.google.protobuf.ByteString getPkiData() { return pkiData_; } @@ -12739,6 +13952,7 @@ public Builder clearPkiData() { * optional bytes signature = 4; * @return Whether the signature field is set. */ + @java.lang.Override public boolean hasSignature() { return ((bitField0_ & 0x00000008) != 0); } @@ -12750,6 +13964,7 @@ public boolean hasSignature() { * optional bytes signature = 4; * @return The signature. */ + @java.lang.Override public com.google.protobuf.ByteString getSignature() { return signature_; } @@ -13033,7 +14248,7 @@ com.netki.bip75.protocol.Messages.OutputOrBuilder getBeneficiariesAddressesOrBui /** * Protobuf type {@code payments.PaymentDetails} */ - public static final class PaymentDetails extends + public static final class PaymentDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.PaymentDetails) PaymentDetailsOrBuilder { @@ -13169,6 +14384,7 @@ private PaymentDetails( * optional string network = 1 [default = "main"]; * @return Whether the network field is set. */ + @java.lang.Override public boolean hasNetwork() { return ((bitField0_ & 0x00000001) != 0); } @@ -13180,6 +14396,7 @@ public boolean hasNetwork() { * optional string network = 1 [default = "main"]; * @return The network. */ + @java.lang.Override public java.lang.String getNetwork() { java.lang.Object ref = network_; if (ref instanceof java.lang.String) { @@ -13202,6 +14419,7 @@ public java.lang.String getNetwork() { * optional string network = 1 [default = "main"]; * @return The bytes for network. */ + @java.lang.Override public com.google.protobuf.ByteString getNetworkBytes() { java.lang.Object ref = network_; @@ -13225,6 +14443,7 @@ public java.lang.String getNetwork() { * * repeated .payments.Output beneficiariesAddresses = 2; */ + @java.lang.Override public java.util.List getBeneficiariesAddressesList() { return beneficiariesAddresses_; } @@ -13235,6 +14454,7 @@ public java.util.List getBeneficiaries * * repeated .payments.Output beneficiariesAddresses = 2; */ + @java.lang.Override public java.util.List getBeneficiariesAddressesOrBuilderList() { return beneficiariesAddresses_; @@ -13246,6 +14466,7 @@ public java.util.List getBeneficiaries * * repeated .payments.Output beneficiariesAddresses = 2; */ + @java.lang.Override public int getBeneficiariesAddressesCount() { return beneficiariesAddresses_.size(); } @@ -13256,6 +14477,7 @@ public int getBeneficiariesAddressesCount() { * * repeated .payments.Output beneficiariesAddresses = 2; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.Output getBeneficiariesAddresses(int index) { return beneficiariesAddresses_.get(index); } @@ -13266,6 +14488,7 @@ public com.netki.bip75.protocol.Messages.Output getBeneficiariesAddresses(int in * * repeated .payments.Output beneficiariesAddresses = 2; */ + @java.lang.Override public com.netki.bip75.protocol.Messages.OutputOrBuilder getBeneficiariesAddressesOrBuilder( int index) { return beneficiariesAddresses_.get(index); @@ -13281,6 +14504,7 @@ public com.netki.bip75.protocol.Messages.OutputOrBuilder getBeneficiariesAddress * required uint64 time = 3; * @return Whether the time field is set. */ + @java.lang.Override public boolean hasTime() { return ((bitField0_ & 0x00000002) != 0); } @@ -13292,6 +14516,7 @@ public boolean hasTime() { * required uint64 time = 3; * @return The time. */ + @java.lang.Override public long getTime() { return time_; } @@ -13306,6 +14531,7 @@ public long getTime() { * optional uint64 expires = 4; * @return Whether the expires field is set. */ + @java.lang.Override public boolean hasExpires() { return ((bitField0_ & 0x00000004) != 0); } @@ -13317,6 +14543,7 @@ public boolean hasExpires() { * optional uint64 expires = 4; * @return The expires. */ + @java.lang.Override public long getExpires() { return expires_; } @@ -13331,6 +14558,7 @@ public long getExpires() { * optional string memo = 5; * @return Whether the memo field is set. */ + @java.lang.Override public boolean hasMemo() { return ((bitField0_ & 0x00000008) != 0); } @@ -13342,6 +14570,7 @@ public boolean hasMemo() { * optional string memo = 5; * @return The memo. */ + @java.lang.Override public java.lang.String getMemo() { java.lang.Object ref = memo_; if (ref instanceof java.lang.String) { @@ -13364,6 +14593,7 @@ public java.lang.String getMemo() { * optional string memo = 5; * @return The bytes for memo. */ + @java.lang.Override public com.google.protobuf.ByteString getMemoBytes() { java.lang.Object ref = memo_; @@ -13388,6 +14618,7 @@ public java.lang.String getMemo() { * optional string payment_url = 6; * @return Whether the paymentUrl field is set. */ + @java.lang.Override public boolean hasPaymentUrl() { return ((bitField0_ & 0x00000010) != 0); } @@ -13399,6 +14630,7 @@ public boolean hasPaymentUrl() { * optional string payment_url = 6; * @return The paymentUrl. */ + @java.lang.Override public java.lang.String getPaymentUrl() { java.lang.Object ref = paymentUrl_; if (ref instanceof java.lang.String) { @@ -13421,6 +14653,7 @@ public java.lang.String getPaymentUrl() { * optional string payment_url = 6; * @return The bytes for paymentUrl. */ + @java.lang.Override public com.google.protobuf.ByteString getPaymentUrlBytes() { java.lang.Object ref = paymentUrl_; @@ -13445,6 +14678,7 @@ public java.lang.String getPaymentUrl() { * optional bytes merchant_data = 7; * @return Whether the merchantData field is set. */ + @java.lang.Override public boolean hasMerchantData() { return ((bitField0_ & 0x00000020) != 0); } @@ -13456,6 +14690,7 @@ public boolean hasMerchantData() { * optional bytes merchant_data = 7; * @return The merchantData. */ + @java.lang.Override public com.google.protobuf.ByteString getMerchantData() { return merchantData_; } @@ -14395,6 +15630,7 @@ public com.netki.bip75.protocol.Messages.Output.Builder addBeneficiariesAddresse * required uint64 time = 3; * @return Whether the time field is set. */ + @java.lang.Override public boolean hasTime() { return ((bitField0_ & 0x00000004) != 0); } @@ -14406,6 +15642,7 @@ public boolean hasTime() { * required uint64 time = 3; * @return The time. */ + @java.lang.Override public long getTime() { return time_; } @@ -14448,6 +15685,7 @@ public Builder clearTime() { * optional uint64 expires = 4; * @return Whether the expires field is set. */ + @java.lang.Override public boolean hasExpires() { return ((bitField0_ & 0x00000008) != 0); } @@ -14459,6 +15697,7 @@ public boolean hasExpires() { * optional uint64 expires = 4; * @return The expires. */ + @java.lang.Override public long getExpires() { return expires_; } @@ -14717,6 +15956,7 @@ public Builder setPaymentUrlBytes( * optional bytes merchant_data = 7; * @return Whether the merchantData field is set. */ + @java.lang.Override public boolean hasMerchantData() { return ((bitField0_ & 0x00000040) != 0); } @@ -14728,6 +15968,7 @@ public boolean hasMerchantData() { * optional bytes merchant_data = 7; * @return The merchantData. */ + @java.lang.Override public com.google.protobuf.ByteString getMerchantData() { return merchantData_; } @@ -14880,7 +16121,7 @@ public interface OutputOrBuilder extends /** * Protobuf type {@code payments.Output} */ - public static final class Output extends + public static final class Output extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.Output) OutputOrBuilder { @@ -14990,6 +16231,7 @@ private Output( * optional uint64 amount = 1 [default = 0]; * @return Whether the amount field is set. */ + @java.lang.Override public boolean hasAmount() { return ((bitField0_ & 0x00000001) != 0); } @@ -15001,6 +16243,7 @@ public boolean hasAmount() { * optional uint64 amount = 1 [default = 0]; * @return The amount. */ + @java.lang.Override public long getAmount() { return amount_; } @@ -15015,6 +16258,7 @@ public long getAmount() { * optional bytes script = 2; * @return Whether the script field is set. */ + @java.lang.Override public boolean hasScript() { return ((bitField0_ & 0x00000002) != 0); } @@ -15026,6 +16270,7 @@ public boolean hasScript() { * optional bytes script = 2; * @return The script. */ + @java.lang.Override public com.google.protobuf.ByteString getScript() { return script_; } @@ -15040,7 +16285,7 @@ public com.google.protobuf.ByteString getScript() { * optional .payments.CurrencyType currency = 3; * @return Whether the currency field is set. */ - public boolean hasCurrency() { + @java.lang.Override public boolean hasCurrency() { return ((bitField0_ & 0x00000004) != 0); } /** @@ -15051,7 +16296,7 @@ public boolean hasCurrency() { * optional .payments.CurrencyType currency = 3; * @return The currency. */ - public com.netki.bip75.protocol.Messages.CurrencyType getCurrency() { + @java.lang.Override public com.netki.bip75.protocol.Messages.CurrencyType getCurrency() { @SuppressWarnings("deprecation") com.netki.bip75.protocol.Messages.CurrencyType result = com.netki.bip75.protocol.Messages.CurrencyType.valueOf(currency_); return result == null ? com.netki.bip75.protocol.Messages.CurrencyType.BITCOIN : result; @@ -15430,6 +16675,7 @@ public Builder mergeFrom( * optional uint64 amount = 1 [default = 0]; * @return Whether the amount field is set. */ + @java.lang.Override public boolean hasAmount() { return ((bitField0_ & 0x00000001) != 0); } @@ -15441,6 +16687,7 @@ public boolean hasAmount() { * optional uint64 amount = 1 [default = 0]; * @return The amount. */ + @java.lang.Override public long getAmount() { return amount_; } @@ -15483,6 +16730,7 @@ public Builder clearAmount() { * optional bytes script = 2; * @return Whether the script field is set. */ + @java.lang.Override public boolean hasScript() { return ((bitField0_ & 0x00000002) != 0); } @@ -15494,6 +16742,7 @@ public boolean hasScript() { * optional bytes script = 2; * @return The script. */ + @java.lang.Override public com.google.protobuf.ByteString getScript() { return script_; } @@ -15539,7 +16788,7 @@ public Builder clearScript() { * optional .payments.CurrencyType currency = 3; * @return Whether the currency field is set. */ - public boolean hasCurrency() { + @java.lang.Override public boolean hasCurrency() { return ((bitField0_ & 0x00000004) != 0); } /** @@ -15550,6 +16799,7 @@ public boolean hasCurrency() { * optional .payments.CurrencyType currency = 3; * @return The currency. */ + @java.lang.Override public com.netki.bip75.protocol.Messages.CurrencyType getCurrency() { @SuppressWarnings("deprecation") com.netki.bip75.protocol.Messages.CurrencyType result = com.netki.bip75.protocol.Messages.CurrencyType.valueOf(currency_); @@ -15771,7 +17021,7 @@ public interface ProtocolMessageOrBuilder extends /** * Protobuf type {@code payments.ProtocolMessage} */ - public static final class ProtocolMessage extends + public static final class ProtocolMessage extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.ProtocolMessage) ProtocolMessageOrBuilder { @@ -15901,6 +17151,7 @@ private ProtocolMessage( * required uint64 version = 1 [default = 1]; * @return Whether the version field is set. */ + @java.lang.Override public boolean hasVersion() { return ((bitField0_ & 0x00000001) != 0); } @@ -15912,6 +17163,7 @@ public boolean hasVersion() { * required uint64 version = 1 [default = 1]; * @return The version. */ + @java.lang.Override public long getVersion() { return version_; } @@ -15926,6 +17178,7 @@ public long getVersion() { * required uint64 status_code = 2 [default = 1]; * @return Whether the statusCode field is set. */ + @java.lang.Override public boolean hasStatusCode() { return ((bitField0_ & 0x00000002) != 0); } @@ -15937,6 +17190,7 @@ public boolean hasStatusCode() { * required uint64 status_code = 2 [default = 1]; * @return The statusCode. */ + @java.lang.Override public long getStatusCode() { return statusCode_; } @@ -15951,7 +17205,7 @@ public long getStatusCode() { * required .payments.ProtocolMessageType message_type = 3; * @return Whether the messageType field is set. */ - public boolean hasMessageType() { + @java.lang.Override public boolean hasMessageType() { return ((bitField0_ & 0x00000004) != 0); } /** @@ -15962,7 +17216,7 @@ public boolean hasMessageType() { * required .payments.ProtocolMessageType message_type = 3; * @return The messageType. */ - public com.netki.bip75.protocol.Messages.ProtocolMessageType getMessageType() { + @java.lang.Override public com.netki.bip75.protocol.Messages.ProtocolMessageType getMessageType() { @SuppressWarnings("deprecation") com.netki.bip75.protocol.Messages.ProtocolMessageType result = com.netki.bip75.protocol.Messages.ProtocolMessageType.valueOf(messageType_); return result == null ? com.netki.bip75.protocol.Messages.ProtocolMessageType.UNKNOWN_MESSAGE_TYPE : result; @@ -15978,6 +17232,7 @@ public com.netki.bip75.protocol.Messages.ProtocolMessageType getMessageType() { * required bytes serialized_message = 4; * @return Whether the serializedMessage field is set. */ + @java.lang.Override public boolean hasSerializedMessage() { return ((bitField0_ & 0x00000008) != 0); } @@ -15989,6 +17244,7 @@ public boolean hasSerializedMessage() { * required bytes serialized_message = 4; * @return The serializedMessage. */ + @java.lang.Override public com.google.protobuf.ByteString getSerializedMessage() { return serializedMessage_; } @@ -16003,6 +17259,7 @@ public com.google.protobuf.ByteString getSerializedMessage() { * optional string status_message = 5; * @return Whether the statusMessage field is set. */ + @java.lang.Override public boolean hasStatusMessage() { return ((bitField0_ & 0x00000010) != 0); } @@ -16014,6 +17271,7 @@ public boolean hasStatusMessage() { * optional string status_message = 5; * @return The statusMessage. */ + @java.lang.Override public java.lang.String getStatusMessage() { java.lang.Object ref = statusMessage_; if (ref instanceof java.lang.String) { @@ -16036,6 +17294,7 @@ public java.lang.String getStatusMessage() { * optional string status_message = 5; * @return The bytes for statusMessage. */ + @java.lang.Override public com.google.protobuf.ByteString getStatusMessageBytes() { java.lang.Object ref = statusMessage_; @@ -16060,6 +17319,7 @@ public java.lang.String getStatusMessage() { * required bytes identifier = 6; * @return Whether the identifier field is set. */ + @java.lang.Override public boolean hasIdentifier() { return ((bitField0_ & 0x00000020) != 0); } @@ -16071,6 +17331,7 @@ public boolean hasIdentifier() { * required bytes identifier = 6; * @return The identifier. */ + @java.lang.Override public com.google.protobuf.ByteString getIdentifier() { return identifier_; } @@ -16560,6 +17821,7 @@ public Builder mergeFrom( * required uint64 version = 1 [default = 1]; * @return Whether the version field is set. */ + @java.lang.Override public boolean hasVersion() { return ((bitField0_ & 0x00000001) != 0); } @@ -16571,6 +17833,7 @@ public boolean hasVersion() { * required uint64 version = 1 [default = 1]; * @return The version. */ + @java.lang.Override public long getVersion() { return version_; } @@ -16613,6 +17876,7 @@ public Builder clearVersion() { * required uint64 status_code = 2 [default = 1]; * @return Whether the statusCode field is set. */ + @java.lang.Override public boolean hasStatusCode() { return ((bitField0_ & 0x00000002) != 0); } @@ -16624,6 +17888,7 @@ public boolean hasStatusCode() { * required uint64 status_code = 2 [default = 1]; * @return The statusCode. */ + @java.lang.Override public long getStatusCode() { return statusCode_; } @@ -16666,7 +17931,7 @@ public Builder clearStatusCode() { * required .payments.ProtocolMessageType message_type = 3; * @return Whether the messageType field is set. */ - public boolean hasMessageType() { + @java.lang.Override public boolean hasMessageType() { return ((bitField0_ & 0x00000004) != 0); } /** @@ -16677,6 +17942,7 @@ public boolean hasMessageType() { * required .payments.ProtocolMessageType message_type = 3; * @return The messageType. */ + @java.lang.Override public com.netki.bip75.protocol.Messages.ProtocolMessageType getMessageType() { @SuppressWarnings("deprecation") com.netki.bip75.protocol.Messages.ProtocolMessageType result = com.netki.bip75.protocol.Messages.ProtocolMessageType.valueOf(messageType_); @@ -16724,6 +17990,7 @@ public Builder clearMessageType() { * required bytes serialized_message = 4; * @return Whether the serializedMessage field is set. */ + @java.lang.Override public boolean hasSerializedMessage() { return ((bitField0_ & 0x00000008) != 0); } @@ -16735,6 +18002,7 @@ public boolean hasSerializedMessage() { * required bytes serialized_message = 4; * @return The serializedMessage. */ + @java.lang.Override public com.google.protobuf.ByteString getSerializedMessage() { return serializedMessage_; } @@ -16888,6 +18156,7 @@ public Builder setStatusMessageBytes( * required bytes identifier = 6; * @return Whether the identifier field is set. */ + @java.lang.Override public boolean hasIdentifier() { return ((bitField0_ & 0x00000020) != 0); } @@ -16899,6 +18168,7 @@ public boolean hasIdentifier() { * required bytes identifier = 6; * @return The identifier. */ + @java.lang.Override public com.google.protobuf.ByteString getIdentifier() { return identifier_; } @@ -17194,7 +18464,7 @@ public interface EncryptedProtocolMessageOrBuilder extends /** * Protobuf type {@code payments.EncryptedProtocolMessage} */ - public static final class EncryptedProtocolMessage extends + public static final class EncryptedProtocolMessage extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:payments.EncryptedProtocolMessage) EncryptedProtocolMessageOrBuilder { @@ -17347,6 +18617,7 @@ private EncryptedProtocolMessage( * required uint64 version = 1 [default = 1]; * @return Whether the version field is set. */ + @java.lang.Override public boolean hasVersion() { return ((bitField0_ & 0x00000001) != 0); } @@ -17358,6 +18629,7 @@ public boolean hasVersion() { * required uint64 version = 1 [default = 1]; * @return The version. */ + @java.lang.Override public long getVersion() { return version_; } @@ -17372,6 +18644,7 @@ public long getVersion() { * required uint64 status_code = 2 [default = 1]; * @return Whether the statusCode field is set. */ + @java.lang.Override public boolean hasStatusCode() { return ((bitField0_ & 0x00000002) != 0); } @@ -17383,6 +18656,7 @@ public boolean hasStatusCode() { * required uint64 status_code = 2 [default = 1]; * @return The statusCode. */ + @java.lang.Override public long getStatusCode() { return statusCode_; } @@ -17397,7 +18671,7 @@ public long getStatusCode() { * required .payments.ProtocolMessageType message_type = 3; * @return Whether the messageType field is set. */ - public boolean hasMessageType() { + @java.lang.Override public boolean hasMessageType() { return ((bitField0_ & 0x00000004) != 0); } /** @@ -17408,7 +18682,7 @@ public boolean hasMessageType() { * required .payments.ProtocolMessageType message_type = 3; * @return The messageType. */ - public com.netki.bip75.protocol.Messages.ProtocolMessageType getMessageType() { + @java.lang.Override public com.netki.bip75.protocol.Messages.ProtocolMessageType getMessageType() { @SuppressWarnings("deprecation") com.netki.bip75.protocol.Messages.ProtocolMessageType result = com.netki.bip75.protocol.Messages.ProtocolMessageType.valueOf(messageType_); return result == null ? com.netki.bip75.protocol.Messages.ProtocolMessageType.UNKNOWN_MESSAGE_TYPE : result; @@ -17424,6 +18698,7 @@ public com.netki.bip75.protocol.Messages.ProtocolMessageType getMessageType() { * required bytes encrypted_message = 4; * @return Whether the encryptedMessage field is set. */ + @java.lang.Override public boolean hasEncryptedMessage() { return ((bitField0_ & 0x00000008) != 0); } @@ -17435,6 +18710,7 @@ public boolean hasEncryptedMessage() { * required bytes encrypted_message = 4; * @return The encryptedMessage. */ + @java.lang.Override public com.google.protobuf.ByteString getEncryptedMessage() { return encryptedMessage_; } @@ -17449,6 +18725,7 @@ public com.google.protobuf.ByteString getEncryptedMessage() { * required bytes receiver_public_key = 5; * @return Whether the receiverPublicKey field is set. */ + @java.lang.Override public boolean hasReceiverPublicKey() { return ((bitField0_ & 0x00000010) != 0); } @@ -17460,6 +18737,7 @@ public boolean hasReceiverPublicKey() { * required bytes receiver_public_key = 5; * @return The receiverPublicKey. */ + @java.lang.Override public com.google.protobuf.ByteString getReceiverPublicKey() { return receiverPublicKey_; } @@ -17474,6 +18752,7 @@ public com.google.protobuf.ByteString getReceiverPublicKey() { * required bytes sender_public_key = 6; * @return Whether the senderPublicKey field is set. */ + @java.lang.Override public boolean hasSenderPublicKey() { return ((bitField0_ & 0x00000020) != 0); } @@ -17485,6 +18764,7 @@ public boolean hasSenderPublicKey() { * required bytes sender_public_key = 6; * @return The senderPublicKey. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderPublicKey() { return senderPublicKey_; } @@ -17499,6 +18779,7 @@ public com.google.protobuf.ByteString getSenderPublicKey() { * required uint64 nonce = 7; * @return Whether the nonce field is set. */ + @java.lang.Override public boolean hasNonce() { return ((bitField0_ & 0x00000040) != 0); } @@ -17510,6 +18791,7 @@ public boolean hasNonce() { * required uint64 nonce = 7; * @return The nonce. */ + @java.lang.Override public long getNonce() { return nonce_; } @@ -17524,6 +18806,7 @@ public long getNonce() { * required bytes identifier = 8; * @return Whether the identifier field is set. */ + @java.lang.Override public boolean hasIdentifier() { return ((bitField0_ & 0x00000080) != 0); } @@ -17535,6 +18818,7 @@ public boolean hasIdentifier() { * required bytes identifier = 8; * @return The identifier. */ + @java.lang.Override public com.google.protobuf.ByteString getIdentifier() { return identifier_; } @@ -17549,6 +18833,7 @@ public com.google.protobuf.ByteString getIdentifier() { * optional string status_message = 9; * @return Whether the statusMessage field is set. */ + @java.lang.Override public boolean hasStatusMessage() { return ((bitField0_ & 0x00000100) != 0); } @@ -17560,6 +18845,7 @@ public boolean hasStatusMessage() { * optional string status_message = 9; * @return The statusMessage. */ + @java.lang.Override public java.lang.String getStatusMessage() { java.lang.Object ref = statusMessage_; if (ref instanceof java.lang.String) { @@ -17582,6 +18868,7 @@ public java.lang.String getStatusMessage() { * optional string status_message = 9; * @return The bytes for statusMessage. */ + @java.lang.Override public com.google.protobuf.ByteString getStatusMessageBytes() { java.lang.Object ref = statusMessage_; @@ -17606,6 +18893,7 @@ public java.lang.String getStatusMessage() { * optional bytes signature = 10; * @return Whether the signature field is set. */ + @java.lang.Override public boolean hasSignature() { return ((bitField0_ & 0x00000200) != 0); } @@ -17617,6 +18905,7 @@ public boolean hasSignature() { * optional bytes signature = 10; * @return The signature. */ + @java.lang.Override public com.google.protobuf.ByteString getSignature() { return signature_; } @@ -18228,6 +19517,7 @@ public Builder mergeFrom( * required uint64 version = 1 [default = 1]; * @return Whether the version field is set. */ + @java.lang.Override public boolean hasVersion() { return ((bitField0_ & 0x00000001) != 0); } @@ -18239,6 +19529,7 @@ public boolean hasVersion() { * required uint64 version = 1 [default = 1]; * @return The version. */ + @java.lang.Override public long getVersion() { return version_; } @@ -18281,6 +19572,7 @@ public Builder clearVersion() { * required uint64 status_code = 2 [default = 1]; * @return Whether the statusCode field is set. */ + @java.lang.Override public boolean hasStatusCode() { return ((bitField0_ & 0x00000002) != 0); } @@ -18292,6 +19584,7 @@ public boolean hasStatusCode() { * required uint64 status_code = 2 [default = 1]; * @return The statusCode. */ + @java.lang.Override public long getStatusCode() { return statusCode_; } @@ -18334,7 +19627,7 @@ public Builder clearStatusCode() { * required .payments.ProtocolMessageType message_type = 3; * @return Whether the messageType field is set. */ - public boolean hasMessageType() { + @java.lang.Override public boolean hasMessageType() { return ((bitField0_ & 0x00000004) != 0); } /** @@ -18345,6 +19638,7 @@ public boolean hasMessageType() { * required .payments.ProtocolMessageType message_type = 3; * @return The messageType. */ + @java.lang.Override public com.netki.bip75.protocol.Messages.ProtocolMessageType getMessageType() { @SuppressWarnings("deprecation") com.netki.bip75.protocol.Messages.ProtocolMessageType result = com.netki.bip75.protocol.Messages.ProtocolMessageType.valueOf(messageType_); @@ -18392,6 +19686,7 @@ public Builder clearMessageType() { * required bytes encrypted_message = 4; * @return Whether the encryptedMessage field is set. */ + @java.lang.Override public boolean hasEncryptedMessage() { return ((bitField0_ & 0x00000008) != 0); } @@ -18403,6 +19698,7 @@ public boolean hasEncryptedMessage() { * required bytes encrypted_message = 4; * @return The encryptedMessage. */ + @java.lang.Override public com.google.protobuf.ByteString getEncryptedMessage() { return encryptedMessage_; } @@ -18448,6 +19744,7 @@ public Builder clearEncryptedMessage() { * required bytes receiver_public_key = 5; * @return Whether the receiverPublicKey field is set. */ + @java.lang.Override public boolean hasReceiverPublicKey() { return ((bitField0_ & 0x00000010) != 0); } @@ -18459,6 +19756,7 @@ public boolean hasReceiverPublicKey() { * required bytes receiver_public_key = 5; * @return The receiverPublicKey. */ + @java.lang.Override public com.google.protobuf.ByteString getReceiverPublicKey() { return receiverPublicKey_; } @@ -18504,6 +19802,7 @@ public Builder clearReceiverPublicKey() { * required bytes sender_public_key = 6; * @return Whether the senderPublicKey field is set. */ + @java.lang.Override public boolean hasSenderPublicKey() { return ((bitField0_ & 0x00000020) != 0); } @@ -18515,6 +19814,7 @@ public boolean hasSenderPublicKey() { * required bytes sender_public_key = 6; * @return The senderPublicKey. */ + @java.lang.Override public com.google.protobuf.ByteString getSenderPublicKey() { return senderPublicKey_; } @@ -18560,6 +19860,7 @@ public Builder clearSenderPublicKey() { * required uint64 nonce = 7; * @return Whether the nonce field is set. */ + @java.lang.Override public boolean hasNonce() { return ((bitField0_ & 0x00000040) != 0); } @@ -18571,6 +19872,7 @@ public boolean hasNonce() { * required uint64 nonce = 7; * @return The nonce. */ + @java.lang.Override public long getNonce() { return nonce_; } @@ -18613,6 +19915,7 @@ public Builder clearNonce() { * required bytes identifier = 8; * @return Whether the identifier field is set. */ + @java.lang.Override public boolean hasIdentifier() { return ((bitField0_ & 0x00000080) != 0); } @@ -18624,6 +19927,7 @@ public boolean hasIdentifier() { * required bytes identifier = 8; * @return The identifier. */ + @java.lang.Override public com.google.protobuf.ByteString getIdentifier() { return identifier_; } @@ -18777,6 +20081,7 @@ public Builder setStatusMessageBytes( * optional bytes signature = 10; * @return Whether the signature field is set. */ + @java.lang.Override public boolean hasSignature() { return ((bitField0_ & 0x00000200) != 0); } @@ -18788,6 +20093,7 @@ public boolean hasSignature() { * optional bytes signature = 10; * @return The signature. */ + @java.lang.Override public com.google.protobuf.ByteString getSignature() { return signature_; } @@ -18940,84 +20246,89 @@ public com.netki.bip75.protocol.Messages.EncryptedProtocolMessage getDefaultInst descriptor; static { java.lang.String[] descriptorData = { - "\n\rpayment.proto\022\010payments\"\266\003\n\016InvoiceReq" + - "uest\022\021\n\006amount\030\001 \001(\004:\0010\022\014\n\004memo\030\002 \001(\t\022\030\n" + - "\020notification_url\030\003 \001(\t\022)\n\013originators\030\004" + - " \003(\0132\024.payments.Originator\022,\n\rbeneficiar" + - "ies\030\005 \003(\0132\025.payments.Beneficiary\022.\n\024orig" + - "inatorsAddresses\030\006 \003(\0132\020.payments.Output" + - "\0228\n\025attestationsRequested\030\007 \003(\0162\031.paymen" + - "ts.AttestationType\022\035\n\017sender_pki_type\030\010 " + - "\001(\t:\004none\022\027\n\017sender_pki_data\030\t \001(\014\022\030\n\020se" + - "nder_signature\030\n \001(\014\022\026\n\016sender_ev_cert\030\013" + - " \001(\014\022\033\n\023recipient_vasp_name\030\014 \001(\t\022\037\n\027rec" + - "ipient_chain_address\030\r \001(\t\"\222\002\n\016PaymentRe" + - "quest\022\"\n\027payment_details_version\030\001 \001(\r:\001" + - "1\022\"\n\032serialized_payment_details\030\002 \002(\014\022,\n" + - "\rbeneficiaries\030\003 \003(\0132\025.payments.Benefici" + - "ary\0228\n\025attestationsRequested\030\004 \003(\0162\031.pay" + - "ments.AttestationType\022\035\n\017sender_pki_type" + - "\030\005 \002(\t:\004none\022\027\n\017sender_pki_data\030\006 \001(\014\022\030\n" + - "\020sender_signature\030\007 \001(\014\"\302\001\n\007Payment\022\025\n\rm" + - "erchant_data\030\001 \001(\014\022\024\n\014transactions\030\002 \003(\014" + - "\022#\n\trefund_to\030\003 \003(\0132\020.payments.Output\022\014\n" + - "\004memo\030\004 \001(\t\022)\n\013originators\030\005 \003(\0132\024.payme" + - "nts.Originator\022,\n\rbeneficiaries\030\006 \003(\0132\025." + - "payments.Beneficiary\">\n\nPaymentACK\022\"\n\007pa" + - "yment\030\001 \002(\0132\021.payments.Payment\022\014\n\004memo\030\002" + - " \001(\t\"a\n\013Beneficiary\022%\n\027primary_for_trans" + - "action\030\001 \002(\010:\004true\022+\n\014attestations\030\002 \003(\013" + - "2\025.payments.Attestation\"`\n\nOriginator\022%\n" + - "\027primary_for_transaction\030\001 \002(\010:\004true\022+\n\014" + - "attestations\030\002 \003(\0132\025.payments.Attestatio" + - "n\"z\n\013Attestation\022.\n\013attestation\030\001 \001(\0162\031." + - "payments.AttestationType\022\026\n\010pki_type\030\002 \001" + - "(\t:\004none\022\020\n\010pki_data\030\003 \001(\014\022\021\n\tsignature\030" + - "\004 \001(\014\"\262\001\n\016PaymentDetails\022\025\n\007network\030\001 \001(" + - "\t:\004main\0220\n\026beneficiariesAddresses\030\002 \003(\0132" + - "\020.payments.Output\022\014\n\004time\030\003 \002(\004\022\017\n\007expir" + - "es\030\004 \001(\004\022\014\n\004memo\030\005 \001(\t\022\023\n\013payment_url\030\006 " + - "\001(\t\022\025\n\rmerchant_data\030\007 \001(\014\"U\n\006Output\022\021\n\006" + - "amount\030\001 \001(\004:\0010\022\016\n\006script\030\002 \001(\014\022(\n\010curre" + - "ncy\030\003 \001(\0162\026.payments.CurrencyType\"\272\001\n\017Pr" + - "otocolMessage\022\022\n\007version\030\001 \002(\004:\0011\022\026\n\013sta" + - "tus_code\030\002 \002(\004:\0011\0223\n\014message_type\030\003 \002(\0162" + - "\035.payments.ProtocolMessageType\022\032\n\022serial" + - "ized_message\030\004 \002(\014\022\026\n\016status_message\030\005 \001" + - "(\t\022\022\n\nidentifier\030\006 \002(\014\"\234\002\n\030EncryptedProt" + - "ocolMessage\022\022\n\007version\030\001 \002(\004:\0011\022\026\n\013statu" + - "s_code\030\002 \002(\004:\0011\0223\n\014message_type\030\003 \002(\0162\035." + - "payments.ProtocolMessageType\022\031\n\021encrypte" + - "d_message\030\004 \002(\014\022\033\n\023receiver_public_key\030\005" + - " \002(\014\022\031\n\021sender_public_key\030\006 \002(\014\022\r\n\005nonce" + - "\030\007 \002(\004\022\022\n\nidentifier\030\010 \002(\014\022\026\n\016status_mes" + - "sage\030\t \001(\t\022\021\n\tsignature\030\n \001(\014*w\n\023Protoco" + - "lMessageType\022\030\n\024UNKNOWN_MESSAGE_TYPE\020\000\022\023" + - "\n\017INVOICE_REQUEST\020\001\022\023\n\017PAYMENT_REQUEST\020\002" + - "\022\013\n\007PAYMENT\020\003\022\017\n\013PAYMENT_ACK\020\004*\241\006\n\017Attes" + - "tationType\022\035\n\031LEGAL_PERSON_PRIMARY_NAME\020" + - "\000\022\037\n\033LEGAL_PERSON_SECONDARY_NAME\020\001\022\026\n\022AD" + - "DRESS_DEPARTMENT\020\002\022\032\n\026ADDRESS_SUB_DEPART" + - "MENT\020\003\022\027\n\023ADDRESS_STREET_NAME\020\004\022\033\n\027ADDRE" + - "SS_BUILDING_NUMBER\020\005\022\031\n\025ADDRESS_BUILDING" + - "_NAME\020\006\022\021\n\rADDRESS_FLOOR\020\007\022\023\n\017ADDRESS_PO" + - "STBOX\020\010\022\020\n\014ADDRESS_ROOM\020\t\022\024\n\020ADDRESS_POS" + - "TCODE\020\n\022\025\n\021ADDRESS_TOWN_NAME\020\013\022\036\n\032ADDRES" + - "S_TOWN_LOCATION_NAME\020\014\022\031\n\025ADDRESS_DISTRI" + - "CT_NAME\020\r\022 \n\034ADDRESS_COUNTRY_SUB_DIVISIO" + - "N\020\016\022\030\n\024ADDRESS_ADDRESS_LINE\020\017\022\023\n\017ADDRESS" + - "_COUNTRY\020\020\022\035\n\031NATURAL_PERSON_FIRST_NAME\020" + - "\021\022\034\n\030NATURAL_PERSON_LAST_NAME\020\022\022!\n\035BENEF" + - "ICIARY_PERSON_FIRST_NAME\020\023\022 \n\034BENEFICIAR" + - "Y_PERSON_LAST_NAME\020\024\022\016\n\nBIRTH_DATE\020\025\022\017\n\013" + - "BIRTH_PLACE\020\026\022\030\n\024COUNTRY_OF_RESIDENCE\020\027\022" + - "\023\n\017ISSUING_COUNTRY\020\030\022\036\n\032NATIONAL_IDENTIF" + - "IER_NUMBER\020\031\022\027\n\023NATIONAL_IDENTIFIER\020\032\022\022\n" + - "\016ACCOUNT_NUMBER\020\033\022\033\n\027CUSTOMER_IDENTIFICA" + - "TION\020\034\022\032\n\026REGISTRATION_AUTHORITY\020\035*I\n\014Cu" + - "rrencyType\022\013\n\007BITCOIN\020\000\022\014\n\010ETHEREUM\020\001\022\014\n" + - "\010LITECOIN\020\002\022\020\n\014BITCOIN_CASH\020\003B$\n\030com.net" + - "ki.bip75.protocolB\010Messages" + "\n\030main/proto/payment.proto\022\010payments\"\215\004\n" + + "\016InvoiceRequest\022\021\n\006amount\030\001 \001(\004:\0010\022\014\n\004me" + + "mo\030\002 \001(\t\022\030\n\020notification_url\030\003 \001(\t\022)\n\013or" + + "iginators\030\004 \003(\0132\024.payments.Originator\022,\n" + + "\rbeneficiaries\030\005 \003(\0132\025.payments.Benefici" + + "ary\022.\n\024originatorsAddresses\030\006 \003(\0132\020.paym" + + "ents.Output\0228\n\025attestationsRequested\030\007 \003" + + "(\0162\031.payments.AttestationType\022\035\n\017sender_" + + "pki_type\030\010 \001(\t:\004none\022\027\n\017sender_pki_data\030" + + "\t \001(\014\022\030\n\020sender_signature\030\n \001(\014\022\026\n\016sende" + + "r_ev_cert\030\013 \001(\014\022\033\n\023recipient_vasp_name\030\014" + + " \001(\t\022\037\n\027recipient_chain_address\030\r \001(\t\022\031\n" + + "\021sygna_transfer_id\030\016 \001(\t\022#\n\033sygna_encryp" + + "ted_originators\030\017 \001(\014\022\025\n\rsygna_api_key\030\020" + + " \001(\t\"\324\002\n\016PaymentRequest\022\"\n\027payment_detai" + + "ls_version\030\001 \001(\r:\0011\022\"\n\032serialized_paymen" + + "t_details\030\002 \002(\014\022,\n\rbeneficiaries\030\003 \003(\0132\025" + + ".payments.Beneficiary\0228\n\025attestationsReq" + + "uested\030\004 \003(\0162\031.payments.AttestationType\022" + + "\035\n\017sender_pki_type\030\005 \002(\t:\004none\022\027\n\017sender" + + "_pki_data\030\006 \001(\014\022\030\n\020sender_signature\030\007 \001(" + + "\014\022\031\n\021sygna_transfer_id\030\010 \001(\t\022%\n\035sygna_en" + + "crypted_beneficiaries\030\t \001(\014\"\335\001\n\007Payment\022" + + "\025\n\rmerchant_data\030\001 \001(\014\022\024\n\014transactions\030\002" + + " \003(\014\022#\n\trefund_to\030\003 \003(\0132\020.payments.Outpu" + + "t\022\014\n\004memo\030\004 \001(\t\022)\n\013originators\030\005 \003(\0132\024.p" + + "ayments.Originator\022,\n\rbeneficiaries\030\006 \003(" + + "\0132\025.payments.Beneficiary\022\031\n\021sygna_transf" + + "er_id\030\007 \001(\t\">\n\nPaymentACK\022\"\n\007payment\030\001 \002" + + "(\0132\021.payments.Payment\022\014\n\004memo\030\002 \001(\t\"a\n\013B" + + "eneficiary\022%\n\027primary_for_transaction\030\001 " + + "\002(\010:\004true\022+\n\014attestations\030\002 \003(\0132\025.paymen" + + "ts.Attestation\"`\n\nOriginator\022%\n\027primary_" + + "for_transaction\030\001 \002(\010:\004true\022+\n\014attestati" + + "ons\030\002 \003(\0132\025.payments.Attestation\"z\n\013Atte" + + "station\022.\n\013attestation\030\001 \001(\0162\031.payments." + + "AttestationType\022\026\n\010pki_type\030\002 \001(\t:\004none\022" + + "\020\n\010pki_data\030\003 \001(\014\022\021\n\tsignature\030\004 \001(\014\"\262\001\n" + + "\016PaymentDetails\022\025\n\007network\030\001 \001(\t:\004main\0220" + + "\n\026beneficiariesAddresses\030\002 \003(\0132\020.payment" + + "s.Output\022\014\n\004time\030\003 \002(\004\022\017\n\007expires\030\004 \001(\004\022" + + "\014\n\004memo\030\005 \001(\t\022\023\n\013payment_url\030\006 \001(\t\022\025\n\rme" + + "rchant_data\030\007 \001(\014\"U\n\006Output\022\021\n\006amount\030\001 " + + "\001(\004:\0010\022\016\n\006script\030\002 \001(\014\022(\n\010currency\030\003 \001(\016" + + "2\026.payments.CurrencyType\"\272\001\n\017ProtocolMes" + + "sage\022\022\n\007version\030\001 \002(\004:\0011\022\026\n\013status_code\030" + + "\002 \002(\004:\0011\0223\n\014message_type\030\003 \002(\0162\035.payment" + + "s.ProtocolMessageType\022\032\n\022serialized_mess" + + "age\030\004 \002(\014\022\026\n\016status_message\030\005 \001(\t\022\022\n\nide" + + "ntifier\030\006 \002(\014\"\234\002\n\030EncryptedProtocolMessa" + + "ge\022\022\n\007version\030\001 \002(\004:\0011\022\026\n\013status_code\030\002 " + + "\002(\004:\0011\0223\n\014message_type\030\003 \002(\0162\035.payments." + + "ProtocolMessageType\022\031\n\021encrypted_message" + + "\030\004 \002(\014\022\033\n\023receiver_public_key\030\005 \002(\014\022\031\n\021s" + + "ender_public_key\030\006 \002(\014\022\r\n\005nonce\030\007 \002(\004\022\022\n" + + "\nidentifier\030\010 \002(\014\022\026\n\016status_message\030\t \001(" + + "\t\022\021\n\tsignature\030\n \001(\014*w\n\023ProtocolMessageT" + + "ype\022\030\n\024UNKNOWN_MESSAGE_TYPE\020\000\022\023\n\017INVOICE" + + "_REQUEST\020\001\022\023\n\017PAYMENT_REQUEST\020\002\022\013\n\007PAYME" + + "NT\020\003\022\017\n\013PAYMENT_ACK\020\004*\241\006\n\017AttestationTyp" + + "e\022\035\n\031LEGAL_PERSON_PRIMARY_NAME\020\000\022\037\n\033LEGA" + + "L_PERSON_SECONDARY_NAME\020\001\022\026\n\022ADDRESS_DEP" + + "ARTMENT\020\002\022\032\n\026ADDRESS_SUB_DEPARTMENT\020\003\022\027\n" + + "\023ADDRESS_STREET_NAME\020\004\022\033\n\027ADDRESS_BUILDI" + + "NG_NUMBER\020\005\022\031\n\025ADDRESS_BUILDING_NAME\020\006\022\021" + + "\n\rADDRESS_FLOOR\020\007\022\023\n\017ADDRESS_POSTBOX\020\010\022\020" + + "\n\014ADDRESS_ROOM\020\t\022\024\n\020ADDRESS_POSTCODE\020\n\022\025" + + "\n\021ADDRESS_TOWN_NAME\020\013\022\036\n\032ADDRESS_TOWN_LO" + + "CATION_NAME\020\014\022\031\n\025ADDRESS_DISTRICT_NAME\020\r" + + "\022 \n\034ADDRESS_COUNTRY_SUB_DIVISION\020\016\022\030\n\024AD" + + "DRESS_ADDRESS_LINE\020\017\022\023\n\017ADDRESS_COUNTRY\020" + + "\020\022\035\n\031NATURAL_PERSON_FIRST_NAME\020\021\022\034\n\030NATU" + + "RAL_PERSON_LAST_NAME\020\022\022!\n\035BENEFICIARY_PE" + + "RSON_FIRST_NAME\020\023\022 \n\034BENEFICIARY_PERSON_" + + "LAST_NAME\020\024\022\016\n\nBIRTH_DATE\020\025\022\017\n\013BIRTH_PLA" + + "CE\020\026\022\030\n\024COUNTRY_OF_RESIDENCE\020\027\022\023\n\017ISSUIN" + + "G_COUNTRY\020\030\022\036\n\032NATIONAL_IDENTIFIER_NUMBE" + + "R\020\031\022\027\n\023NATIONAL_IDENTIFIER\020\032\022\022\n\016ACCOUNT_" + + "NUMBER\020\033\022\033\n\027CUSTOMER_IDENTIFICATION\020\034\022\032\n" + + "\026REGISTRATION_AUTHORITY\020\035*I\n\014CurrencyTyp" + + "e\022\013\n\007BITCOIN\020\000\022\014\n\010ETHEREUM\020\001\022\014\n\010LITECOIN" + + "\020\002\022\020\n\014BITCOIN_CASH\020\003B$\n\030com.netki.bip75." + + "protocolB\010Messages" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -19028,19 +20339,19 @@ public com.netki.bip75.protocol.Messages.EncryptedProtocolMessage getDefaultInst internal_static_payments_InvoiceRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_payments_InvoiceRequest_descriptor, - new java.lang.String[] { "Amount", "Memo", "NotificationUrl", "Originators", "Beneficiaries", "OriginatorsAddresses", "AttestationsRequested", "SenderPkiType", "SenderPkiData", "SenderSignature", "SenderEvCert", "RecipientVaspName", "RecipientChainAddress", }); + new java.lang.String[] { "Amount", "Memo", "NotificationUrl", "Originators", "Beneficiaries", "OriginatorsAddresses", "AttestationsRequested", "SenderPkiType", "SenderPkiData", "SenderSignature", "SenderEvCert", "RecipientVaspName", "RecipientChainAddress", "SygnaTransferId", "SygnaEncryptedOriginators", "SygnaApiKey", }); internal_static_payments_PaymentRequest_descriptor = getDescriptor().getMessageTypes().get(1); internal_static_payments_PaymentRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_payments_PaymentRequest_descriptor, - new java.lang.String[] { "PaymentDetailsVersion", "SerializedPaymentDetails", "Beneficiaries", "AttestationsRequested", "SenderPkiType", "SenderPkiData", "SenderSignature", }); + new java.lang.String[] { "PaymentDetailsVersion", "SerializedPaymentDetails", "Beneficiaries", "AttestationsRequested", "SenderPkiType", "SenderPkiData", "SenderSignature", "SygnaTransferId", "SygnaEncryptedBeneficiaries", }); internal_static_payments_Payment_descriptor = getDescriptor().getMessageTypes().get(2); internal_static_payments_Payment_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_payments_Payment_descriptor, - new java.lang.String[] { "MerchantData", "Transactions", "RefundTo", "Memo", "Originators", "Beneficiaries", }); + new java.lang.String[] { "MerchantData", "Transactions", "RefundTo", "Memo", "Originators", "Beneficiaries", "SygnaTransferId", }); internal_static_payments_PaymentACK_descriptor = getDescriptor().getMessageTypes().get(3); internal_static_payments_PaymentACK_fieldAccessorTable = new diff --git a/src/main/java/com/netki/bip75/service/impl/Bip75ServiceNetki.kt b/src/main/java/com/netki/bip75/service/impl/Bip75ServiceNetki.kt index a61b21f..73be99a 100644 --- a/src/main/java/com/netki/bip75/service/impl/Bip75ServiceNetki.kt +++ b/src/main/java/com/netki/bip75/service/impl/Bip75ServiceNetki.kt @@ -3,9 +3,7 @@ package com.netki.bip75.service.impl import com.netki.address.info.service.AddressInformationService import com.netki.bip75.protocol.Messages import com.netki.bip75.service.Bip75Service -import com.netki.exceptions.InvalidCertificateChainException -import com.netki.exceptions.InvalidCertificateException -import com.netki.exceptions.InvalidSignatureException +import com.netki.exceptions.* import com.netki.model.* import com.netki.security.CertificateValidator import com.netki.util.* @@ -27,15 +25,19 @@ internal class Bip75ServiceNetki( * {@inheritDoc} */ override fun createInvoiceRequest(invoiceRequestParameters: InvoiceRequestParameters): ByteArray { - - invoiceRequestParameters.originatorParameters.validate(true, OwnerType.ORIGINATOR) - invoiceRequestParameters.beneficiaryParameters?.validate(false, OwnerType.BENEFICIARY) + if(invoiceRequestParameters.sygnaParameters != null){ + invoiceRequestParameters.sygnaParameters.validate(OwnerType.ORIGINATOR) + }else{ + invoiceRequestParameters.originatorParameters.validate(true, OwnerType.ORIGINATOR) + invoiceRequestParameters.beneficiaryParameters?.validate(false, OwnerType.BENEFICIARY) + } val messageInvoiceRequestBuilder = invoiceRequestParameters.toMessageInvoiceRequestBuilderUnsigned( invoiceRequestParameters.senderParameters, invoiceRequestParameters.attestationsRequested, - invoiceRequestParameters.recipientParameters + invoiceRequestParameters.recipientParameters, + invoiceRequestParameters.sygnaParameters ) invoiceRequestParameters.beneficiaryParameters?.forEach { beneficiary -> @@ -209,14 +211,19 @@ internal class Bip75ServiceNetki( */ override fun createPaymentRequest(paymentRequestParameters: PaymentRequestParameters): ByteArray { - paymentRequestParameters.beneficiaryParameters.validate(true, OwnerType.BENEFICIARY) + if(paymentRequestParameters.sygnaParameters != null){ + paymentRequestParameters.sygnaParameters.validate(OwnerType.BENEFICIARY) + }else{ + paymentRequestParameters.beneficiaryParameters.validate(true, OwnerType.BENEFICIARY) + } val messagePaymentRequestBuilder = paymentRequestParameters .toMessagePaymentDetails() .toPaymentRequest( paymentRequestParameters.senderParameters, paymentRequestParameters.paymentParametersVersion, - paymentRequestParameters.attestationsRequested + paymentRequestParameters.attestationsRequested, + paymentRequestParameters.sygnaParameters ) paymentRequestParameters.beneficiaryParameters.forEach { beneficiary -> @@ -354,8 +361,12 @@ internal class Bip75ServiceNetki( * {@inheritDoc} */ override fun createPayment(paymentParameters: PaymentParameters): ByteArray { - paymentParameters.originatorParameters.validate(true, OwnerType.ORIGINATOR) - paymentParameters.beneficiaryParameters?.validate(false, OwnerType.BENEFICIARY) + if(paymentParameters.sygnaParameters != null){ + paymentParameters.sygnaParameters.validate(null) + }else{ + paymentParameters.originatorParameters?.validate(true, OwnerType.ORIGINATOR) + paymentParameters.beneficiaryParameters?.validate(false, OwnerType.BENEFICIARY) + } val paymentBuilder = paymentParameters.toMessagePaymentBuilder() @@ -369,7 +380,7 @@ internal class Bip75ServiceNetki( paymentBuilder.addBeneficiaries(beneficiaryMessage) } - paymentParameters.originatorParameters.forEach { originator -> + paymentParameters.originatorParameters?.forEach { originator -> val originatorMessage = originator.toMessageOriginatorBuilderWithoutAttestations() originator.pkiDataParametersSets.forEach { pkiData -> diff --git a/src/main/java/com/netki/exceptions/InvalidSygnaOwnerException.kt b/src/main/java/com/netki/exceptions/InvalidSygnaOwnerException.kt new file mode 100644 index 0000000..f4c6a7b --- /dev/null +++ b/src/main/java/com/netki/exceptions/InvalidSygnaOwnerException.kt @@ -0,0 +1,9 @@ +package com.netki.exceptions + +/** + * Represents an error when a sygna owners is not valid. + */ +class InvalidSygnaOwnerException : Exception { + constructor(message: String?) : super(message) + constructor(message: String?, cause: Throwable?) : super(message, cause) +} diff --git a/src/main/java/com/netki/exceptions/InvalidSygnaTransferIDException.kt b/src/main/java/com/netki/exceptions/InvalidSygnaTransferIDException.kt new file mode 100644 index 0000000..488d0e9 --- /dev/null +++ b/src/main/java/com/netki/exceptions/InvalidSygnaTransferIDException.kt @@ -0,0 +1,9 @@ +package com.netki.exceptions + +/** + * Represents an error when a sygna transfer id is not valid. + */ +class InvalidSygnaTransferIDException : Exception { + constructor(message: String?) : super(message) + constructor(message: String?, cause: Throwable?) : super(message, cause) +} diff --git a/src/main/java/com/netki/model/InvoiceRequest.kt b/src/main/java/com/netki/model/InvoiceRequest.kt index 88f3130..b510989 100644 --- a/src/main/java/com/netki/model/InvoiceRequest.kt +++ b/src/main/java/com/netki/model/InvoiceRequest.kt @@ -73,5 +73,17 @@ data class InvoiceRequest @JvmOverloads constructor( /** * Metadata for the protocol message. */ - val protocolMessageMetadata: ProtocolMessageMetadata + val protocolMessageMetadata: ProtocolMessageMetadata, + /** + * Specific ID for Sygna Bridge + */ + val sygnaTransferId: String? = null, + /** + * Originators' encrypted account for Sygna Bridge + */ + val sygnaEncryptedOriginators: String? = null, + /** + * Specific Sygna Bridge API key for /netki + */ + val sygnaApiKey: String? = null ) diff --git a/src/main/java/com/netki/model/InvoiceRequestParameters.kt b/src/main/java/com/netki/model/InvoiceRequestParameters.kt index b9ddaad..0b9c625 100644 --- a/src/main/java/com/netki/model/InvoiceRequestParameters.kt +++ b/src/main/java/com/netki/model/InvoiceRequestParameters.kt @@ -12,7 +12,7 @@ data class InvoiceRequestParameters @JvmOverloads constructor( /** * List of originators for this transaction. */ - val originatorParameters: List, + val originatorParameters: List = emptyList(), /** * The sender of the protocol message. @@ -22,7 +22,7 @@ data class InvoiceRequestParameters @JvmOverloads constructor( /** * List of attestations requested for the transaction. */ - val attestationsRequested: List, + val attestationsRequested: List = emptyList(), /** * Integer-number-of-satoshis. @@ -57,5 +57,9 @@ data class InvoiceRequestParameters @JvmOverloads constructor( /** * Status and information of the protocol message status, by default "OK". */ - val messageInformation: MessageInformation = MessageInformation() + val messageInformation: MessageInformation = MessageInformation(), + /** + * Sygna specific parameters + */ + val sygnaParameters: SygnaParameters? = null ) diff --git a/src/main/java/com/netki/model/Payment.kt b/src/main/java/com/netki/model/Payment.kt index a82e12b..66b0875 100644 --- a/src/main/java/com/netki/model/Payment.kt +++ b/src/main/java/com/netki/model/Payment.kt @@ -39,5 +39,9 @@ data class Payment @JvmOverloads constructor( /** * Metadata for the protocol message. */ - val protocolMessageMetadata: ProtocolMessageMetadata? = null + val protocolMessageMetadata: ProtocolMessageMetadata? = null, + /** + * Specific ID for Sygna Bridge + */ + val sygnaTransferId: String? = null ) diff --git a/src/main/java/com/netki/model/PaymentParameters.kt b/src/main/java/com/netki/model/PaymentParameters.kt index cbed33d..04a83b8 100644 --- a/src/main/java/com/netki/model/PaymentParameters.kt +++ b/src/main/java/com/netki/model/PaymentParameters.kt @@ -31,7 +31,7 @@ data class PaymentParameters @JvmOverloads constructor( /** * List of originators for this transaction. */ - val originatorParameters: List, + val originatorParameters: List? = emptyList(), /** * List of beneficiaries for this transaction. @@ -51,5 +51,9 @@ data class PaymentParameters @JvmOverloads constructor( /** * Status and information of the protocol message status, by default "OK". */ - val messageInformation: MessageInformation = MessageInformation() + val messageInformation: MessageInformation = MessageInformation(), + /** + * Sygna specific parameters + */ + val sygnaParameters: SygnaParameters? = null ) diff --git a/src/main/java/com/netki/model/PaymentRequest.kt b/src/main/java/com/netki/model/PaymentRequest.kt index f7a7fb0..68e39d1 100644 --- a/src/main/java/com/netki/model/PaymentRequest.kt +++ b/src/main/java/com/netki/model/PaymentRequest.kt @@ -76,5 +76,13 @@ data class PaymentRequest @JvmOverloads constructor( /** * Metadata for the protocol message. */ - val protocolMessageMetadata: ProtocolMessageMetadata + val protocolMessageMetadata: ProtocolMessageMetadata, + /** + * Specific ID for Sygna Bridge + */ + val sygnaTransferId: String? = null, + /** + * Beneficiaries' encrypted account for Sygna Bridge + */ + val sygnaEncryptedBeneficiaries: String? = null ) diff --git a/src/main/java/com/netki/model/PaymentRequestParameters.kt b/src/main/java/com/netki/model/PaymentRequestParameters.kt index 9b96287..827e5b9 100644 --- a/src/main/java/com/netki/model/PaymentRequestParameters.kt +++ b/src/main/java/com/netki/model/PaymentRequestParameters.kt @@ -48,7 +48,7 @@ data class PaymentRequestParameters @JvmOverloads constructor( /** * List of beneficiaries for this transaction. */ - val beneficiaryParameters: List, + val beneficiaryParameters: List = emptyList(), /** * The sender of the protocol message. @@ -58,7 +58,7 @@ data class PaymentRequestParameters @JvmOverloads constructor( /** * List of attestations requested for the transaction. */ - val attestationsRequested: List, + val attestationsRequested: List = emptyList(), /** * Information of the recipient of the message. @@ -73,5 +73,9 @@ data class PaymentRequestParameters @JvmOverloads constructor( /** * Version of the PaymentDetails message. */ - val paymentParametersVersion: Int = 1 + val paymentParametersVersion: Int = 1, + /** + * Sygna specific parameters + */ + val sygnaParameters: SygnaParameters? = null ) diff --git a/src/main/java/com/netki/model/SygnaParameters.kt b/src/main/java/com/netki/model/SygnaParameters.kt new file mode 100644 index 0000000..c6134cf --- /dev/null +++ b/src/main/java/com/netki/model/SygnaParameters.kt @@ -0,0 +1,33 @@ +package com.netki.model + +/** + * Data of the Sygna to be used to create a message. + */ +data class SygnaParameters @JvmOverloads constructor( + /** + * Specific ID for Sygna Bridge + */ + val sygnaTransferId: String? = null, + /** + * Originators' encrypted account for Sygna Bridge + * + * @see + *
ECIES Encrypting an Decrypting + * + * Please encrypt your originators' account to prevent data breach + */ + val sygnaEncryptedOriginators: String? = null, + /** + * Beneficiaries' encrypted account for Sygna Bridge + * + * @see + * ECIES Encrypting an Decrypting + * + * Please encrypt your beneficiaries' account to prevent data breach + */ + val sygnaEncryptedBeneficiaries: String? = null, + /** + * Specific Sygna Bridge API key for api.sygna.io/netki + */ + val sygnaApiKey: String? = null +) diff --git a/src/main/java/com/netki/util/ErrorInformation.kt b/src/main/java/com/netki/util/ErrorInformation.kt index 71dc9f5..ffd5b4f 100644 --- a/src/main/java/com/netki/util/ErrorInformation.kt +++ b/src/main/java/com/netki/util/ErrorInformation.kt @@ -47,4 +47,7 @@ object ErrorInformation { const val ENCRYPTION_INVALID_ERROR = "Unable to decrypt the message with the given keys, error: %s" const val DECRYPTION_MISSING_RECIPIENT_KEYS_ERROR = "To decrypt the message you need to have the recipient's private key in your RecipientParameters.EncryptionParameters object." + const val SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR = "To transfer to Sygna VASP, the sygnaTransferId field should not be empty" + const val SYGNA_VALIDATION_ENCRYPTED_ORIGINATORS_EMPTY_ERROR = "To transfer to Sygna VASP, the sygnaEncryptedOriginators field should not be empty" + const val SYGNA_VALIDATION_ENCRYPTED_BENEFICIARIES_EMPTY_ERROR = "To transfer to Sygna VASP, the sygnaEncryptedBeneficiaries field should not be empty" } diff --git a/src/main/java/com/netki/util/MessagesExtensions.kt b/src/main/java/com/netki/util/MessagesExtensions.kt index 9b8c705..3ca2053 100644 --- a/src/main/java/com/netki/util/MessagesExtensions.kt +++ b/src/main/java/com/netki/util/MessagesExtensions.kt @@ -3,9 +3,7 @@ package com.netki.util import com.google.protobuf.ByteString import com.google.protobuf.GeneratedMessageV3 import com.netki.bip75.protocol.Messages -import com.netki.exceptions.EncryptionException -import com.netki.exceptions.InvalidObjectException -import com.netki.exceptions.InvalidOwnersException +import com.netki.exceptions.* import com.netki.model.* import com.netki.security.CryptoModule import com.netki.security.EncryptionModule @@ -23,7 +21,8 @@ import java.util.* internal fun InvoiceRequestParameters.toMessageInvoiceRequestBuilderUnsigned( senderParameters: SenderParameters, attestationsRequested: List, - recipientParameters: RecipientParameters? + recipientParameters: RecipientParameters?, + sygnaParameters: SygnaParameters? ): Messages.InvoiceRequest.Builder { val invoiceRequestBuilder = Messages.InvoiceRequest.newBuilder() .setAmount(this.amount ?: 0) @@ -47,6 +46,13 @@ internal fun InvoiceRequestParameters.toMessageInvoiceRequestBuilderUnsigned( invoiceRequestBuilder.recipientVaspName = recipientParameters.vaspName } + sygnaParameters?.let { + invoiceRequestBuilder.sygnaTransferId = it.sygnaTransferId ?: "" + invoiceRequestBuilder.sygnaEncryptedOriginators = + it.sygnaEncryptedOriginators?.hexStringToByteString() ?: "".toByteString() + invoiceRequestBuilder.sygnaApiKey = it.sygnaApiKey ?: "" + } + return invoiceRequestBuilder } @@ -90,7 +96,11 @@ internal fun Messages.InvoiceRequest.toInvoiceRequest(protocolMessageMetadata: P senderEvCert = this.senderEvCert.toStringLocal(), recipientVaspName = this.recipientVaspName, recipientChainAddress = this.recipientChainAddress, - protocolMessageMetadata = protocolMessageMetadata + protocolMessageMetadata = protocolMessageMetadata, + sygnaTransferId = this.sygnaTransferId, + sygnaEncryptedOriginators = this.sygnaEncryptedOriginators?.toHex(), + sygnaApiKey = this.sygnaApiKey + ) } @@ -144,7 +154,9 @@ internal fun Messages.PaymentRequest.toPaymentRequest(protocolMessageMetadata: P senderPkiType = this.senderPkiType.getType(), senderPkiData = this.senderPkiData.toStringLocal(), senderSignature = this.senderSignature.toStringLocal(), - protocolMessageMetadata = protocolMessageMetadata + protocolMessageMetadata = protocolMessageMetadata, + sygnaTransferId = this.sygnaTransferId, + sygnaEncryptedBeneficiaries = this.sygnaEncryptedBeneficiaries?.toHex() ) } @@ -158,7 +170,8 @@ internal fun Messages.PaymentRequest.toPaymentRequest(protocolMessageMetadata: P internal fun Messages.PaymentDetails.toPaymentRequest( senderParameters: SenderParameters, paymentParametersVersion: Int, - attestationsRequested: List + attestationsRequested: List, + sygnaParameters: SygnaParameters? ): Messages.PaymentRequest.Builder { val paymentRequestBuilder = Messages.PaymentRequest.newBuilder() .setPaymentDetailsVersion(paymentParametersVersion) @@ -171,6 +184,12 @@ internal fun Messages.PaymentDetails.toPaymentRequest( paymentRequestBuilder.addAttestationsRequested(it.toAttestationType()) } + sygnaParameters?.let { + paymentRequestBuilder.sygnaTransferId = it.sygnaTransferId ?: "" + paymentRequestBuilder.sygnaEncryptedBeneficiaries = + it.sygnaEncryptedBeneficiaries?.hexStringToByteString() ?: "".toByteString() + } + return paymentRequestBuilder } @@ -185,7 +204,7 @@ internal fun PaymentRequestParameters.toMessagePaymentDetails(): Messages.Paymen .setTime(this.time.time) .setExpires(this.expires?.time ?: 0) .setMemo(this.memo) - .setPaymentUrl(this.paymentUrl) + .setPaymentUrl(this.paymentUrl?:"") .setMerchantData(this.merchantData?.toByteString()) this.beneficiariesAddresses.forEach { output -> @@ -239,6 +258,10 @@ internal fun PaymentParameters.toMessagePaymentBuilder(): Messages.Payment.Build messagePaymentBuilder.addRefundTo(output.toMessageOutput()) } + this.sygnaParameters?.let { + messagePaymentBuilder.sygnaTransferId = it.sygnaTransferId ?: "" + } + return messagePaymentBuilder } @@ -268,6 +291,8 @@ internal fun Payment.toMessagePayment(): Messages.Payment { messagePaymentBuilder.addOriginators(originator.toMessageOriginator()) } + messagePaymentBuilder.sygnaTransferId = this.sygnaTransferId ?: "" + return messagePaymentBuilder.build() } @@ -304,7 +329,8 @@ internal fun Messages.Payment.toPayment(protocolMessageMetadata: ProtocolMessage memo = this.memo, beneficiaries = beneficiaries, originators = originators, - protocolMessageMetadata = protocolMessageMetadata + protocolMessageMetadata = protocolMessageMetadata, + sygnaTransferId = this.sygnaTransferId ) } @@ -1255,3 +1281,36 @@ internal fun ByteArray.changeStatus(statusCode: StatusCode, statusMessage: Strin throw InvalidObjectException(PARSE_BINARY_MESSAGE_INVALID_INPUT.format(exception.message)) } } + +internal fun ByteString.toHex(): String { + val byteArray = this.toByteArray() + return byteArray.joinToString("") { "%02x".format(it) } +} + +internal fun String.hexStringToByteString(): ByteString { + val byteArray = ByteArray(this.length / 2) { + this.substring(it * 2, it * 2 + 2).toInt(16).toByte() + } + return byteArray.toByteString() +} + +/** + * Validate that a sygnaParameters is valid. + * Is valid, when it has one single primaryOwner. + * + * @throws InvalidSygnaTransferIDException if sygnaTransferId is not valid. + * @throws InvalidOwnersException if sygnaEncryptedOriginators or sygnaEncryptedBeneficiaries is not valid. + */ +internal fun SygnaParameters.validate(ownerType: OwnerType?) { + if (this.sygnaTransferId.isNullOrBlank()) { + throw InvalidSygnaTransferIDException(ErrorInformation.SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR) + } + + if ((ownerType?.equals(OwnerType.ORIGINATOR) == true) && this.sygnaEncryptedOriginators.isNullOrBlank()) { + throw InvalidSygnaOwnerException(ErrorInformation.SYGNA_VALIDATION_ENCRYPTED_ORIGINATORS_EMPTY_ERROR) + } + + if ((ownerType?.equals(OwnerType.BENEFICIARY) == true) && this.sygnaEncryptedBeneficiaries.isNullOrBlank()) { + throw InvalidSygnaOwnerException(ErrorInformation.SYGNA_VALIDATION_ENCRYPTED_BENEFICIARIES_EMPTY_ERROR) + } +} \ No newline at end of file diff --git a/src/main/proto/payment.proto b/src/main/proto/payment.proto index 0bd613b..a73f967 100644 --- a/src/main/proto/payment.proto +++ b/src/main/proto/payment.proto @@ -19,6 +19,10 @@ message InvoiceRequest { optional bytes sender_ev_cert = 11; // Sender's EV cert optional string recipient_vasp_name = 12; // Recipient's vasp name optional string recipient_chain_address = 13; // Recipient's chain address + // sygna specific fields + optional string sygna_transfer_id = 14; + optional bytes sygna_encrypted_originators = 15; + optional string sygna_api_key = 16; } message PaymentRequest { @@ -29,6 +33,9 @@ message PaymentRequest { required string sender_pki_type = 5 [default = "none"]; // none / x509+sha256 optional bytes sender_pki_data = 6; // Sender's pki data, depends on pki_type optional bytes sender_signature = 7; // Sender's Signature of the whole message + // sygna specific fields + optional string sygna_transfer_id = 8; + optional bytes sygna_encrypted_beneficiaries = 9; } message Payment { @@ -38,6 +45,8 @@ message Payment { optional string memo = 4; // Human-readable message for the merchant repeated Originator originators = 5; // Originators of the InvoiceRequest repeated Beneficiary beneficiaries = 6; // Beneficiaries of the InvoiceRequest + // sygna specific fields + optional string sygna_transfer_id = 7; } message PaymentACK { diff --git a/src/test/java/com/netki/TransactIdTest.kt b/src/test/java/com/netki/TransactIdTest.kt index ceb134f..17281a1 100644 --- a/src/test/java/com/netki/TransactIdTest.kt +++ b/src/test/java/com/netki/TransactIdTest.kt @@ -1,10 +1,7 @@ package com.netki import com.netki.bip75.protocol.Messages -import com.netki.exceptions.EncryptionException -import com.netki.exceptions.InvalidCertificateChainException -import com.netki.exceptions.InvalidObjectException -import com.netki.exceptions.InvalidSignatureException +import com.netki.exceptions.* import com.netki.model.* import com.netki.util.ErrorInformation.CERTIFICATE_VALIDATION_INVALID_OWNER_CERTIFICATE_CA import com.netki.util.ErrorInformation.CERTIFICATE_VALIDATION_INVALID_SENDER_CERTIFICATE_CA @@ -12,6 +9,9 @@ import com.netki.util.ErrorInformation.ENCRYPTION_MISSING_RECIPIENT_KEYS_ERROR import com.netki.util.ErrorInformation.ENCRYPTION_MISSING_SENDER_KEYS_ERROR import com.netki.util.ErrorInformation.SIGNATURE_VALIDATION_INVALID_OWNER_SIGNATURE import com.netki.util.ErrorInformation.SIGNATURE_VALIDATION_INVALID_SENDER_SIGNATURE +import com.netki.util.ErrorInformation.SYGNA_VALIDATION_ENCRYPTED_BENEFICIARIES_EMPTY_ERROR +import com.netki.util.ErrorInformation.SYGNA_VALIDATION_ENCRYPTED_ORIGINATORS_EMPTY_ERROR +import com.netki.util.ErrorInformation.SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR import com.netki.util.TestData import com.netki.util.TestData.Attestations.INVALID_ATTESTATION import com.netki.util.TestData.Attestations.REQUESTED_ATTESTATIONS @@ -33,12 +33,17 @@ import com.netki.util.TestData.Payment.MEMO import com.netki.util.TestData.Payment.MEMO_PAYMENT_ACK import com.netki.util.TestData.Payment.Output.OUTPUTS import com.netki.util.TestData.Payment.PAYMENT +import com.netki.util.TestData.Payment.SYGNA_PAYMENT import com.netki.util.TestData.Recipients.RECIPIENTS_PARAMETERS import com.netki.util.TestData.Recipients.RECIPIENTS_PARAMETERS_WITH_ENCRYPTION import com.netki.util.TestData.Senders.SENDER_PKI_NONE import com.netki.util.TestData.Senders.SENDER_PKI_X509SHA256 import com.netki.util.TestData.Senders.SENDER_PKI_X509SHA256_INVALID_CERTIFICATE import com.netki.util.TestData.Senders.SENDER_PKI_X509SHA256_WITH_ENCRYPTION +import com.netki.util.TestData.SygnaParameters.SYGNA_API_KEY +import com.netki.util.TestData.SygnaParameters.SYGNA_ENCRYPTED_BENEFICIARIES +import com.netki.util.TestData.SygnaParameters.SYGNA_ENCRYPTED_ORIGINATORS +import com.netki.util.TestData.SygnaParameters.SYGNA_TRANSFER_ID import com.netki.util.getSerializedMessage import com.netki.util.toAttestationType import com.netki.util.toByteString @@ -745,6 +750,103 @@ internal class TransactIdTest { assert(exception.message?.contains("Invalid object for") ?: false) } + @Test + fun `Create and parse InvoiceRequestBinary with Sygna format to InvoiceRequest`() { + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID, + sygnaEncryptedOriginators = SYGNA_ENCRYPTED_ORIGINATORS, + sygnaApiKey = SYGNA_API_KEY + ) + val sender = SENDER_PKI_X509SHA256 + val invoiceRequestParameters = InvoiceRequestParameters( + amount = 1000, + memo = "memo", + notificationUrl = "notificationUrl", + originatorsAddresses = OUTPUTS, + originatorParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val invoiceRequestBinary = transactId.createInvoiceRequest(invoiceRequestParameters) + + val invoiceRequest = transactId.parseInvoiceRequest(invoiceRequestBinary) + + assert(invoiceRequestParameters.amount == invoiceRequest.amount) + assert(invoiceRequestParameters.memo == invoiceRequest.memo) + assert(invoiceRequestParameters.notificationUrl == invoiceRequest.notificationUrl) + assert(REQUESTED_ATTESTATIONS.size == invoiceRequest.attestationsRequested.size) + assert(OUTPUTS.size == invoiceRequest.originatorsAddresses.size) + + assert(sender.pkiDataParameters?.type == invoiceRequest.senderPkiType) + assert(sender.pkiDataParameters?.certificatePem == invoiceRequest.senderPkiData) + assert(!invoiceRequest.senderSignature.isNullOrBlank()) + assert(!invoiceRequest.protocolMessageMetadata.identifier.isBlank()) + assert(invoiceRequest.protocolMessageMetadata.version == 1L) + assert(invoiceRequest.protocolMessageMetadata.statusCode == StatusCode.OK) + assert(invoiceRequest.protocolMessageMetadata.statusMessage.isEmpty()) + assert(invoiceRequest.protocolMessageMetadata.messageType == MessageType.INVOICE_REQUEST) + assert(!invoiceRequest.senderEvCert.isNullOrBlank()) + + assert(sygnaParameters.sygnaTransferId == invoiceRequest.sygnaTransferId) + assert(sygnaParameters.sygnaEncryptedOriginators == invoiceRequest.sygnaEncryptedOriginators) + assert(sygnaParameters.sygnaApiKey == invoiceRequest.sygnaApiKey) + + assertTrue(transactId.isInvoiceRequestValid(invoiceRequestBinary)) + } + + @Test + fun `Create and parse InvoiceRequestBinary with Sygna format to InvoiceRequest, SygnaParameters with invalid sygnaTransferId`() { + val sygnaParameters = SygnaParameters( + sygnaEncryptedOriginators = SYGNA_ENCRYPTED_ORIGINATORS, + sygnaApiKey = SYGNA_API_KEY + ) + val sender = SENDER_PKI_X509SHA256 + val invoiceRequestParameters = InvoiceRequestParameters( + amount = 1000, + memo = "memo", + notificationUrl = "notificationUrl", + originatorsAddresses = OUTPUTS, + originatorParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaTransferIDException::class.java) { + transactId.createInvoiceRequest(invoiceRequestParameters) + } + + assert(exception.message == SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR) + } + + @Test + fun `Create and parse InvoiceRequestBinary with Sygna format to InvoiceRequest, sygnaParameters with invalid sygnaEncryptedOriginators`() { + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID, + sygnaApiKey = SYGNA_API_KEY + ) + val sender = SENDER_PKI_X509SHA256 + val invoiceRequestParameters = InvoiceRequestParameters( + amount = 1000, + memo = "memo", + notificationUrl = "notificationUrl", + originatorsAddresses = OUTPUTS, + originatorParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaOwnerException::class.java) { + transactId.createInvoiceRequest(invoiceRequestParameters) + } + + assert(exception.message == SYGNA_VALIDATION_ENCRYPTED_ORIGINATORS_EMPTY_ERROR) + } + + @Test fun `Create and validate PaymentRequestBinary, Owners and Sender with PkiData`() { val beneficiaries = listOf( @@ -1429,6 +1531,108 @@ internal class TransactIdTest { assert(paymentRequest.protocolMessageMetadata.nonce!! > 0L) } + @Test + fun `Create and parse PaymentRequestBinary with Sygna format to PaymentRequest`() { + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID, + sygnaEncryptedBeneficiaries = SYGNA_ENCRYPTED_BENEFICIARIES + ) + val sender = SENDER_PKI_X509SHA256 + val paymentRequestParameters = PaymentRequestParameters( + network = "main", + beneficiariesAddresses = OUTPUTS, + time = Timestamp(System.currentTimeMillis()), + expires = Timestamp(System.currentTimeMillis()), + memo = "memo", + paymentUrl = "www.payment.url/test", + merchantData = "merchant data", + beneficiaryParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val paymentRequestBinary = transactId.createPaymentRequest(paymentRequestParameters) + + val paymentRequest = transactId.parsePaymentRequest(paymentRequestBinary) + + assert(paymentRequest.network == paymentRequestParameters.network) + assert(paymentRequest.time == paymentRequestParameters.time) + assert(paymentRequest.expires == paymentRequestParameters.expires) + assert(paymentRequest.memo == paymentRequestParameters.memo) + assert(paymentRequest.paymentUrl == paymentRequestParameters.paymentUrl) + assert(paymentRequest.merchantData == paymentRequestParameters.merchantData) + assert(paymentRequest.beneficiariesAddresses.size == paymentRequestParameters.beneficiariesAddresses.size) + + assert(sender.pkiDataParameters?.type == paymentRequest.senderPkiType) + assert(sender.pkiDataParameters?.certificatePem == paymentRequest.senderPkiData) + assert(!paymentRequest.senderSignature.isNullOrBlank()) + assert(!paymentRequest.protocolMessageMetadata.identifier.isBlank()) + assert(paymentRequest.protocolMessageMetadata.version == 1L) + assert(paymentRequest.protocolMessageMetadata.statusCode == StatusCode.OK) + assert(paymentRequest.protocolMessageMetadata.statusMessage.isEmpty()) + assert(paymentRequest.protocolMessageMetadata.messageType == MessageType.PAYMENT_REQUEST) + + assert(paymentRequest.sygnaTransferId == paymentRequestParameters.sygnaParameters?.sygnaTransferId) + assert(paymentRequest.sygnaEncryptedBeneficiaries == paymentRequestParameters.sygnaParameters?.sygnaEncryptedBeneficiaries) + + assertTrue(transactId.isPaymentRequestValid(paymentRequestBinary)) + } + + @Test + fun `Create and parse PaymentRequestBinary to PaymentRequest with Sygna format, SygnaParameters with invalid sygnaTransferId`() { + val sygnaParameters = SygnaParameters( + sygnaEncryptedBeneficiaries = SYGNA_ENCRYPTED_BENEFICIARIES + ) + val sender = SENDER_PKI_X509SHA256 + val paymentRequestParameters = PaymentRequestParameters( + network = "main", + beneficiariesAddresses = OUTPUTS, + time = Timestamp(System.currentTimeMillis()), + expires = Timestamp(System.currentTimeMillis()), + memo = "memo", + paymentUrl = "www.payment.url/test", + merchantData = "merchant data", + beneficiaryParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaTransferIDException::class.java) { + transactId.createPaymentRequest(paymentRequestParameters) + } + + assert(exception.message == SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR) + } + + @Test + fun `Create and parse PaymentRequestBinary to PaymentRequest with Sygna format, SygnaParameters with invalid sygnaEncryptedBeneficiaries`() { + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID + ) + val sender = SENDER_PKI_X509SHA256 + val paymentRequestParameters = PaymentRequestParameters( + network = "main", + beneficiariesAddresses = OUTPUTS, + time = Timestamp(System.currentTimeMillis()), + expires = Timestamp(System.currentTimeMillis()), + memo = "memo", + paymentUrl = "www.payment.url/test", + merchantData = "merchant data", + beneficiaryParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaOwnerException::class.java) { + transactId.createPaymentRequest(paymentRequestParameters) + } + + assert(exception.message == SYGNA_VALIDATION_ENCRYPTED_BENEFICIARIES_EMPTY_ERROR) + } + @Test fun `Create and validate PaymentBinary`() { val originators = listOf( @@ -1737,6 +1941,62 @@ internal class TransactIdTest { } } + @Test + fun `Create and parse PaymentBinary with Sygna format to Payment`() { + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID + ) + val paymentParameters = PaymentParameters( + merchantData = "merchant data", + transactions = arrayListOf( + "transaction1".toByteArray(), + "transaction2".toByteArray() + ), + outputs = OUTPUTS, + memo = MEMO, + originatorParameters = emptyList(), + sygnaParameters = sygnaParameters + ) + + val paymentBinary = transactId.createPayment(paymentParameters) + val payment = transactId.parsePayment(paymentBinary) + + assert(payment.merchantData == paymentParameters.merchantData) + assert(payment.transactions.size == paymentParameters.transactions.size) + assert(payment.outputs == paymentParameters.outputs) + assert(payment.memo == paymentParameters.memo) + assert(!payment.protocolMessageMetadata!!.identifier.isBlank()) + assert(payment.protocolMessageMetadata?.version == 1L) + assert(payment.protocolMessageMetadata?.statusCode == StatusCode.OK) + assert(payment.protocolMessageMetadata?.statusMessage.isNullOrBlank()) + assert(payment.protocolMessageMetadata?.messageType == MessageType.PAYMENT) + assert(payment.sygnaTransferId == sygnaParameters.sygnaTransferId) + + assertTrue(transactId.isPaymentValid(paymentBinary)) + } + + @Test + fun `Create and parse PaymentBinary with Sygna format to Payment, sygnaParameters with invalid sygnaTransferId`() { + val sygnaParameters = SygnaParameters() + val paymentParameters = PaymentParameters( + merchantData = "merchant data", + transactions = arrayListOf( + "transaction1".toByteArray(), + "transaction2".toByteArray() + ), + outputs = OUTPUTS, + memo = MEMO, + originatorParameters = emptyList(), + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaTransferIDException::class.java) { + transactId.createPayment(paymentParameters) + } + + assert(exception.message == SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR) + } + @Test fun `Create and validate PaymentAckBinary`() { val paymentAckParameters = PaymentAckParameters( @@ -1935,6 +2195,31 @@ internal class TransactIdTest { assert(paymentAck.protocolMessageMetadata.nonce!! > 0L) } + @Test + fun `Create and parse PaymentAckBinary to PaymentAck with Sygna format`() { + val paymentAckParameters = PaymentAckParameters( + payment = SYGNA_PAYMENT, + memo = MEMO_PAYMENT_ACK + ) + val paymentBinary = transactId.createPaymentAck(paymentAckParameters) + val paymentAck = transactId.parsePaymentAck(paymentBinary) + + assert(paymentAck.payment.merchantData == SYGNA_PAYMENT.merchantData) + assert(paymentAck.payment.transactions.size == SYGNA_PAYMENT.transactions.size) + assert(paymentAck.payment.outputs == SYGNA_PAYMENT.outputs) + assert(paymentAck.payment.memo == SYGNA_PAYMENT.memo) + assert(paymentAck.payment.protocolMessageMetadata == null) + assert(paymentAck.memo == MEMO_PAYMENT_ACK) + assert(!paymentAck.protocolMessageMetadata.identifier.isBlank()) + assert(paymentAck.protocolMessageMetadata.version == 1L) + assert(paymentAck.protocolMessageMetadata.statusCode == StatusCode.OK) + assert(paymentAck.protocolMessageMetadata.statusMessage.isEmpty()) + assert(paymentAck.protocolMessageMetadata.messageType == MessageType.PAYMENT_ACK) + assert(paymentAck.payment.sygnaTransferId == SYGNA_PAYMENT.sygnaTransferId) + + assertTrue(transactId.isPaymentAckValid(paymentBinary)) + } + @Test fun `Change status from OK to CANCEL to InvoiceRequest`() { val originators = listOf( diff --git a/src/test/java/com/netki/bip75/main/impl/Bip75NetkiTest.kt b/src/test/java/com/netki/bip75/main/impl/Bip75NetkiTest.kt index 52772d9..3f7dbeb 100644 --- a/src/test/java/com/netki/bip75/main/impl/Bip75NetkiTest.kt +++ b/src/test/java/com/netki/bip75/main/impl/Bip75NetkiTest.kt @@ -5,13 +5,15 @@ import com.netki.address.info.service.AddressInformationService import com.netki.bip75.service.impl.Bip75ServiceNetki import com.netki.exceptions.AddressProviderErrorException import com.netki.exceptions.AddressProviderUnauthorizedException -import com.netki.model.AddressCurrency -import com.netki.model.AddressInformation -import com.netki.model.InvoiceRequestParameters -import com.netki.model.PaymentRequestParameters +import com.netki.exceptions.InvalidSygnaOwnerException +import com.netki.exceptions.InvalidSygnaTransferIDException +import com.netki.model.* import com.netki.security.CertificateValidator import com.netki.util.ErrorInformation.ADDRESS_INFORMATION_INTERNAL_ERROR_PROVIDER import com.netki.util.ErrorInformation.ADDRESS_INFORMATION_NOT_AUTHORIZED_ERROR_PROVIDER +import com.netki.util.ErrorInformation.SYGNA_VALIDATION_ENCRYPTED_BENEFICIARIES_EMPTY_ERROR +import com.netki.util.ErrorInformation.SYGNA_VALIDATION_ENCRYPTED_ORIGINATORS_EMPTY_ERROR +import com.netki.util.ErrorInformation.SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR import com.netki.util.TestData import com.netki.util.TestData.Address.ADDRESS_INFORMATION import com.netki.util.TestData.Attestations.REQUESTED_ATTESTATIONS @@ -22,6 +24,10 @@ import com.netki.util.TestData.Originators.NO_PRIMARY_ORIGINATOR_PKI_X509SHA256 import com.netki.util.TestData.Originators.PRIMARY_ORIGINATOR_PKI_X509SHA256 import com.netki.util.TestData.Recipients.RECIPIENTS_PARAMETERS import com.netki.util.TestData.Senders.SENDER_PKI_X509SHA256 +import com.netki.util.TestData.SygnaParameters.SYGNA_TRANSFER_ID +import com.netki.util.TestData.SygnaParameters.SYGNA_ENCRYPTED_ORIGINATORS +import com.netki.util.TestData.SygnaParameters.SYGNA_API_KEY +import com.netki.util.TestData.SygnaParameters.SYGNA_ENCRYPTED_BENEFICIARIES import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test @@ -81,6 +87,56 @@ internal class Bip75NetkiTest { assertEquals(invoiceRequest.originatorsAddresses.size, invoiceRequestData.originatorsAddresses.size) assertTrue(invoiceRequest.recipientChainAddress.isNullOrBlank()) assertTrue(invoiceRequest.recipientVaspName.isNullOrBlank()) + assertTrue(invoiceRequest.sygnaTransferId.isNullOrBlank()) + assertTrue(invoiceRequest.sygnaEncryptedOriginators.isNullOrBlank()) + assertTrue(invoiceRequest.sygnaApiKey.isNullOrBlank()) + invoiceRequest.originatorsAddresses.forEach { output -> + run { + assert(!output.addressInformation?.identifier.isNullOrBlank()) + assertNotNull(output.addressInformation?.alerts) + assert(!output.addressInformation?.currencyVerbose.isNullOrBlank()) + assert(!output.addressInformation?.earliestTransactionTime.isNullOrBlank()) + assert(!output.addressInformation?.latestTransactionTime.isNullOrBlank()) + } + } + } + + @Test + fun `Create and parse InvoiceRequest binary with Sygna format`() { + `when`( + mockAddressInformationService.getAddressInformation( + any(AddressCurrency::class.java), + anyString() + ) + ).thenReturn(ADDRESS_INFORMATION) + + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID, + sygnaEncryptedOriginators = SYGNA_ENCRYPTED_ORIGINATORS, + sygnaApiKey = SYGNA_API_KEY + ) + val sender = SENDER_PKI_X509SHA256 + val invoiceRequestData = InvoiceRequestParameters( + amount = 1000, + memo = "memo", + notificationUrl = "notificationUrl", + originatorsAddresses = TestData.Payment.Output.OUTPUTS, + originatorParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val invoiceRequestBinary = transactId.createInvoiceRequest(invoiceRequestData) + + val invoiceRequest = bip75Netki.parseInvoiceRequestWithAddressesInfo(invoiceRequestBinary) + + assertEquals(invoiceRequest.originatorsAddresses.size, invoiceRequestData.originatorsAddresses.size) + assertTrue(invoiceRequest.recipientChainAddress.isNullOrBlank()) + assertTrue(invoiceRequest.recipientVaspName.isNullOrBlank()) + assertEquals(invoiceRequest.sygnaTransferId, invoiceRequestData.sygnaParameters?.sygnaTransferId) + assertEquals(invoiceRequest.sygnaEncryptedOriginators, invoiceRequestData.sygnaParameters?.sygnaEncryptedOriginators) + assertEquals(invoiceRequest.sygnaApiKey, invoiceRequestData.sygnaParameters?.sygnaApiKey) invoiceRequest.originatorsAddresses.forEach { output -> run { assert(!output.addressInformation?.identifier.isNullOrBlank()) @@ -268,6 +324,67 @@ internal class Bip75NetkiTest { } } + @Test + fun `Create and parse InvoiceRequest binary with Sygna Format throwing InvalidSygnaTransferIDException`() { + `when`( + mockAddressInformationService.getAddressInformation( + any(AddressCurrency::class.java), + anyString() + ) + ).thenReturn(ADDRESS_INFORMATION) + + val sygnaParameters = SygnaParameters() + val sender = SENDER_PKI_X509SHA256 + val invoiceRequestData = InvoiceRequestParameters( + amount = 1000, + memo = "memo", + notificationUrl = "notificationUrl", + originatorsAddresses = TestData.Payment.Output.OUTPUTS, + originatorParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaTransferIDException::class.java) { + transactId.createInvoiceRequest(invoiceRequestData) + } + + assert(exception.message != null && exception.message!! == (SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR)) + } + + @Test + fun `Create and parse InvoiceRequest binary with Sygna Format throwing InvalidSygnaOwnerException`() { + `when`( + mockAddressInformationService.getAddressInformation( + any(AddressCurrency::class.java), + anyString() + ) + ).thenReturn(ADDRESS_INFORMATION) + + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID + ) + val sender = SENDER_PKI_X509SHA256 + val invoiceRequestData = InvoiceRequestParameters( + amount = 1000, + memo = "memo", + notificationUrl = "notificationUrl", + originatorsAddresses = TestData.Payment.Output.OUTPUTS, + originatorParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaOwnerException::class.java) { + transactId.createInvoiceRequest(invoiceRequestData) + } + + assert(exception.message != null && exception.message!! == (SYGNA_VALIDATION_ENCRYPTED_ORIGINATORS_EMPTY_ERROR)) + } + + @Test fun `Create and parse PaymentRequest binary and fetch AddressInformation`() { `when`( @@ -300,6 +417,8 @@ internal class Bip75NetkiTest { val paymentRequest = bip75Netki.parsePaymentRequestWithAddressesInfo(paymentRequestBinary) assertEquals(paymentRequest.beneficiariesAddresses.size, paymentRequestParameters.beneficiariesAddresses.size) + assertTrue(paymentRequest.sygnaTransferId.isNullOrBlank()) + assertTrue(paymentRequest.sygnaEncryptedBeneficiaries.isNullOrBlank()) paymentRequest.beneficiariesAddresses.forEach { output -> run { assert(!output.addressInformation?.identifier.isNullOrBlank()) @@ -352,6 +471,53 @@ internal class Bip75NetkiTest { } } + @Test + fun `Create and parse PaymentRequest binary with Sygna format`() { + `when`( + mockAddressInformationService.getAddressInformation( + any(AddressCurrency::class.java), + anyString() + ) + ).thenReturn(ADDRESS_INFORMATION) + + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID, + sygnaEncryptedBeneficiaries = SYGNA_ENCRYPTED_BENEFICIARIES + ) + val sender = SENDER_PKI_X509SHA256 + val paymentRequestParameters = PaymentRequestParameters( + network = "main", + beneficiariesAddresses = TestData.Payment.Output.OUTPUTS, + time = Timestamp(System.currentTimeMillis()), + expires = Timestamp(System.currentTimeMillis()), + memo = "memo", + paymentUrl = "www.payment.url/test", + merchantData = "merchant data", + beneficiaryParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val paymentRequestBinary = bip75Netki.createPaymentRequest(paymentRequestParameters) + + val paymentRequest = bip75Netki.parsePaymentRequestWithAddressesInfo(paymentRequestBinary) + + assertEquals(paymentRequest.beneficiariesAddresses.size, paymentRequestParameters.beneficiariesAddresses.size) + assertEquals(paymentRequest.sygnaTransferId, paymentRequestParameters.sygnaParameters?.sygnaTransferId) + assertEquals(paymentRequest.sygnaEncryptedBeneficiaries, paymentRequestParameters.sygnaParameters?.sygnaEncryptedBeneficiaries) + + paymentRequest.beneficiariesAddresses.forEach { output -> + run { + assert(!output.addressInformation?.identifier.isNullOrBlank()) + assertNotNull(output.addressInformation?.alerts) + assert(!output.addressInformation?.currencyVerbose.isNullOrBlank()) + assert(!output.addressInformation?.earliestTransactionTime.isNullOrBlank()) + assert(!output.addressInformation?.latestTransactionTime.isNullOrBlank()) + } + } + } + @Test fun `Create and parse PaymentRequest binary and fetch AddressInformation throwing Unauthorized error`() { `when`( @@ -439,5 +605,71 @@ internal class Bip75NetkiTest { assert(exception.message != null && exception.message!!.contains("Provider internal error for address:")) } + @Test + fun `Create and parse PaymentRequest binary with Sygna format throwing InvalidSygnaTransferIDException`() { + `when`( + mockAddressInformationService.getAddressInformation( + any(AddressCurrency::class.java), + anyString() + ) + ).thenReturn(ADDRESS_INFORMATION) + + val sygnaParameters = SygnaParameters() + val sender = SENDER_PKI_X509SHA256 + val paymentRequestParameters = PaymentRequestParameters( + network = "main", + beneficiariesAddresses = TestData.Payment.Output.OUTPUTS, + time = Timestamp(System.currentTimeMillis()), + expires = Timestamp(System.currentTimeMillis()), + memo = "memo", + paymentUrl = "www.payment.url/test", + merchantData = "merchant data", + beneficiaryParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaTransferIDException::class.java) { + bip75Netki.createPaymentRequest(paymentRequestParameters) + } + + assert(exception.message != null && exception.message!! == SYGNA_VALIDATION_TRANSFER_ID_EMPTY_ERROR) + } + + @Test + fun `Create and parse PaymentRequest binary with Sygna format throwing InvalidSygnaOwnerException`() { + `when`( + mockAddressInformationService.getAddressInformation( + any(AddressCurrency::class.java), + anyString() + ) + ).thenReturn(ADDRESS_INFORMATION) + + val sygnaParameters = SygnaParameters( + sygnaTransferId = SYGNA_TRANSFER_ID + ) + val sender = SENDER_PKI_X509SHA256 + val paymentRequestParameters = PaymentRequestParameters( + network = "main", + beneficiariesAddresses = TestData.Payment.Output.OUTPUTS, + time = Timestamp(System.currentTimeMillis()), + expires = Timestamp(System.currentTimeMillis()), + memo = "memo", + paymentUrl = "www.payment.url/test", + merchantData = "merchant data", + beneficiaryParameters = emptyList(), + senderParameters = sender, + attestationsRequested = REQUESTED_ATTESTATIONS, + sygnaParameters = sygnaParameters + ) + + val exception = assertThrows(InvalidSygnaOwnerException::class.java) { + bip75Netki.createPaymentRequest(paymentRequestParameters) + } + + assert(exception.message != null && exception.message!! == SYGNA_VALIDATION_ENCRYPTED_BENEFICIARIES_EMPTY_ERROR) + } + private fun any(type: Class): T = Mockito.any(type) } diff --git a/src/test/java/com/netki/util/TestData.kt b/src/test/java/com/netki/util/TestData.kt index e814fb0..3b1d8bb 100644 --- a/src/test/java/com/netki/util/TestData.kt +++ b/src/test/java/com/netki/util/TestData.kt @@ -158,6 +158,24 @@ internal object TestData { ) ) + val SYGNA_PAYMENT = Payment( + merchantData = "merchant data", + transactions = arrayListOf( + "transaction1".toByteArray(), + "transaction2".toByteArray() + ), + outputs = OUTPUTS, + memo = MEMO, + sygnaTransferId = "03509afc922c99b9a0f16e89f4129e9504cf8f5ffb76048aee693aaa29f68b26", + protocolMessageMetadata = ProtocolMessageMetadata( + 1, + StatusCode.OK, + MessageType.PAYMENT, + "", + "randomIdentifier" + ) + ) + object Output { val OUTPUTS = listOf( Output(1000, "Script 1", AddressCurrency.BITCOIN), @@ -999,4 +1017,11 @@ internal object TestData { CryptoModule.objectToPublicKeyPem(keysSender.public) ) } + + object SygnaParameters { + const val SYGNA_TRANSFER_ID = "03509afc922c99b9a0f16e89f4129e9504cf8f5ffb76048aee693aaa29f68b26" + const val SYGNA_ENCRYPTED_ORIGINATORS = "df94fd292fdbb3e23b512334ded22169b4a483a6269f9add2e3fcf" + const val SYGNA_ENCRYPTED_BENEFICIARIES = "16a7bdd4420ab592da5a868f9913a9572b5f58fb2a5b289f7f53" + const val SYGNA_API_KEY = "092ce11d949af34d439b2fc40c2e9d4c80c19e01a2c955661096671d23a6c57a" + } } From be66b6f4e99d2f9e40d113b24a0058da6aabada3 Mon Sep 17 00:00:00 2001 From: "kunming.liu" Date: Thu, 21 Jan 2021 12:08:47 +0800 Subject: [PATCH 2/4] fix: fix PR#1 comments --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b131186..fd18003 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ What we provide: * Networking layers * [Protocol Buffers][4] wiring and definitions * Key signing with [EC cryptography][5] -* Transfer data with a originator VASP in [Sygna Bridge][8] +* Transfer data from originator VASP in [Sygna Bridge][8] ## Travel Rule From 9a1188a743b86d07d74582c5495994376aeaa9b0 Mon Sep 17 00:00:00 2001 From: "kunming.liu" Date: Mon, 25 Jan 2021 11:10:29 +0800 Subject: [PATCH 3/4] fix: fix PR#1 comments --- src/main/java/com/netki/util/MessagesExtensions.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/netki/util/MessagesExtensions.kt b/src/main/java/com/netki/util/MessagesExtensions.kt index 3ca2053..86d53a7 100644 --- a/src/main/java/com/netki/util/MessagesExtensions.kt +++ b/src/main/java/com/netki/util/MessagesExtensions.kt @@ -1295,8 +1295,7 @@ internal fun String.hexStringToByteString(): ByteString { } /** - * Validate that a sygnaParameters is valid. - * Is valid, when it has one single primaryOwner. + * Validate if sygnaParameters is valid. * * @throws InvalidSygnaTransferIDException if sygnaTransferId is not valid. * @throws InvalidOwnersException if sygnaEncryptedOriginators or sygnaEncryptedBeneficiaries is not valid. From a80e0d57ae6d06fc2c535149497f15d2edede5eb Mon Sep 17 00:00:00 2001 From: "kunming.liu" Date: Wed, 27 Jan 2021 10:10:50 +0800 Subject: [PATCH 4/4] fix: fix readme --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index fd18003..96e443f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -# Netki Readme # TransactID Library Java Edition ![Netki Logo](images/netki.png)