That fuck shit the fascists are using
1package org.tm.archive.database;
2
3import androidx.annotation.NonNull;
4import androidx.annotation.Nullable;
5
6import com.annimon.stream.Stream;
7import com.mobilecoin.lib.KeyImage;
8import com.mobilecoin.lib.Receipt;
9import com.mobilecoin.lib.RistrettoPublic;
10import com.mobilecoin.lib.Transaction;
11import com.mobilecoin.lib.exceptions.SerializationException;
12
13import org.tm.archive.payments.proto.PaymentMetaData;
14
15import java.io.IOException;
16import java.util.ArrayList;
17import java.util.List;
18import java.util.Set;
19
20import okio.ByteString;
21
22public final class PaymentMetaDataUtil {
23
24 public static PaymentMetaData parseOrThrow(byte[] requireBlob) {
25 try {
26 return PaymentMetaData.ADAPTER.decode(requireBlob);
27 } catch (IOException e) {
28 throw new IllegalStateException(e);
29 }
30 }
31
32 public static @NonNull PaymentMetaData fromReceipt(@Nullable byte[] receipt) throws SerializationException {
33 PaymentMetaData.MobileCoinTxoIdentification.Builder builder = new PaymentMetaData.MobileCoinTxoIdentification.Builder();
34
35 if (receipt != null) {
36 addReceiptData(receipt, builder);
37 }
38
39 return new PaymentMetaData.Builder().mobileCoinTxoIdentification(builder.build()).build();
40 }
41
42 public static @NonNull PaymentMetaData fromKeysAndImages(@NonNull List<ByteString> publicKeys, @NonNull List<ByteString> keyImages) {
43 PaymentMetaData.MobileCoinTxoIdentification.Builder builder = new PaymentMetaData.MobileCoinTxoIdentification.Builder();
44
45 builder.keyImages(keyImages);
46 builder.publicKey(publicKeys);
47
48 return new PaymentMetaData.Builder().mobileCoinTxoIdentification(builder.build()).build();
49 }
50
51 public static @NonNull PaymentMetaData fromReceiptAndTransaction(@Nullable byte[] receipt, @Nullable byte[] transaction) throws SerializationException {
52 PaymentMetaData.MobileCoinTxoIdentification.Builder builder = new PaymentMetaData.MobileCoinTxoIdentification.Builder();
53
54 if (transaction != null) {
55 addTransactionData(transaction, builder);
56 } else if (receipt != null) {
57 addReceiptData(receipt, builder);
58 }
59
60 return new PaymentMetaData.Builder().mobileCoinTxoIdentification(builder.build()).build();
61 }
62
63 private static void addReceiptData(@NonNull byte[] receipt, PaymentMetaData.MobileCoinTxoIdentification.Builder builder) throws SerializationException {
64 RistrettoPublic publicKey = Receipt.fromBytes(receipt).getPublicKey();
65 addPublicKey(builder, publicKey);
66 }
67
68 private static void addTransactionData(@NonNull byte[] transactionBytes, PaymentMetaData.MobileCoinTxoIdentification.Builder builder) throws SerializationException {
69 Transaction transaction = Transaction.fromBytes(transactionBytes);
70 Set<KeyImage> keyImages = transaction.getKeyImages();
71
72 List<ByteString> newKeyImages = new ArrayList<>(builder.keyImages);
73 for (KeyImage keyImage : keyImages) {
74 newKeyImages.add(ByteString.of(keyImage.getData()));
75 }
76 builder.keyImages(newKeyImages);
77
78 for (RistrettoPublic publicKey : transaction.getOutputPublicKeys()) {
79 addPublicKey(builder, publicKey);
80 }
81 }
82
83 private static void addPublicKey(@NonNull PaymentMetaData.MobileCoinTxoIdentification.Builder builder, @NonNull RistrettoPublic publicKey) {
84 List<ByteString> publicKeys = new ArrayList<>(builder.publicKey);
85 publicKeys.add(ByteString.of(publicKey.getKeyBytes()));
86 builder.publicKey(publicKeys);
87 }
88
89 public static byte[] receiptPublic(@NonNull PaymentMetaData paymentMetaData) {
90 return Stream.of(paymentMetaData.mobileCoinTxoIdentification.publicKey).single().toByteArray();
91 }
92}