That fuck shit the fascists are using
at master 92 lines 3.6 kB view raw
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}