Search in sources :

Example 6 with MobileCoinPublicAddress

use of org.thoughtcrime.securesms.payments.MobileCoinPublicAddress in project Signal-Android by WhisperSystems.

the class PaymentSendJob method onRun.

@Override
protected void onRun() throws Exception {
    if (!Recipient.self().isRegistered()) {
        throw new NotPushRegisteredException();
    }
    if (!SignalStore.paymentsValues().mobileCoinPaymentsEnabled()) {
        Log.w(TAG, "Payments are not enabled");
        return;
    }
    Stopwatch stopwatch = new Stopwatch("Payment submission");
    Wallet wallet = ApplicationDependencies.getPayments().getWallet();
    PaymentDatabase paymentDatabase = SignalDatabase.payments();
    paymentDatabase.createOutgoingPayment(uuid, recipientId, publicAddress, timestamp, note, amount);
    Log.i(TAG, "Payment record created " + uuid);
    stopwatch.split("Record created");
    try {
        PaymentSubmissionResult paymentSubmissionResult = wallet.sendPayment(publicAddress, amount.requireMobileCoin(), totalFee.requireMobileCoin());
        stopwatch.split("Payment submitted");
        if (paymentSubmissionResult.containsDefrags()) {
            Log.i(TAG, "Payment contains " + paymentSubmissionResult.defrags().size() + " defrags, main payment" + uuid);
            RecipientId self = Recipient.self().getId();
            MobileCoinPublicAddress selfAddress = wallet.getMobileCoinPublicAddress();
            for (TransactionSubmissionResult defrag : paymentSubmissionResult.defrags()) {
                UUID defragUuid = UUID.randomUUID();
                PaymentTransactionId.MobileCoin mobileCoinTransaction = (PaymentTransactionId.MobileCoin) defrag.getTransactionId();
                paymentDatabase.createDefrag(defragUuid, self, selfAddress, timestamp - 1, mobileCoinTransaction.getFee(), mobileCoinTransaction.getTransaction(), mobileCoinTransaction.getReceipt());
                Log.i(TAG, "Defrag entered with id " + defragUuid);
                ApplicationDependencies.getJobManager().startChain(new PaymentTransactionCheckJob(defragUuid, QUEUE)).then(new MultiDeviceOutgoingPaymentSyncJob(defragUuid)).enqueue();
            }
            stopwatch.split("Defrag");
        }
        TransactionSubmissionResult.ErrorCode errorCode = paymentSubmissionResult.getErrorCode();
        switch(errorCode) {
            case INSUFFICIENT_FUNDS:
                paymentDatabase.markPaymentFailed(uuid, FailureReason.INSUFFICIENT_FUNDS);
                throw new PaymentException("Payment failed due to " + errorCode);
            case GENERIC_FAILURE:
                paymentDatabase.markPaymentFailed(uuid, FailureReason.UNKNOWN);
                throw new PaymentException("Payment failed due to " + errorCode);
            case NETWORK_FAILURE:
                paymentDatabase.markPaymentFailed(uuid, FailureReason.NETWORK);
                throw new PaymentException("Payment failed due to " + errorCode);
            case NONE:
                Log.i(TAG, "Payment submission complete");
                TransactionSubmissionResult transactionSubmissionResult = Objects.requireNonNull(paymentSubmissionResult.getNonDefrag());
                PaymentTransactionId.MobileCoin mobileCoinTransaction = (PaymentTransactionId.MobileCoin) transactionSubmissionResult.getTransactionId();
                paymentDatabase.markPaymentSubmitted(uuid, mobileCoinTransaction.getTransaction(), mobileCoinTransaction.getReceipt(), mobileCoinTransaction.getFee());
                Log.i(TAG, "Payment record updated " + uuid);
                break;
        }
    } catch (Exception e) {
        Log.w(TAG, "Unknown payment failure", e);
        paymentDatabase.markPaymentFailed(uuid, FailureReason.UNKNOWN);
        throw e;
    }
    stopwatch.split("Update database record");
    stopwatch.stop(TAG);
}
Also used : PaymentTransactionId(org.thoughtcrime.securesms.payments.PaymentTransactionId) PaymentSubmissionResult(org.thoughtcrime.securesms.payments.PaymentSubmissionResult) RecipientId(org.thoughtcrime.securesms.recipients.RecipientId) Wallet(org.thoughtcrime.securesms.payments.Wallet) NotPushRegisteredException(org.thoughtcrime.securesms.net.NotPushRegisteredException) Stopwatch(org.thoughtcrime.securesms.util.Stopwatch) NotPushRegisteredException(org.thoughtcrime.securesms.net.NotPushRegisteredException) TransactionSubmissionResult(org.thoughtcrime.securesms.payments.TransactionSubmissionResult) PaymentDatabase(org.thoughtcrime.securesms.database.PaymentDatabase) UUID(java.util.UUID) MobileCoinPublicAddress(org.thoughtcrime.securesms.payments.MobileCoinPublicAddress)

Example 7 with MobileCoinPublicAddress

use of org.thoughtcrime.securesms.payments.MobileCoinPublicAddress in project Signal-Android by WhisperSystems.

the class ProfileUtil method getSelfPaymentsAddressProtobuf.

@Nullable
private static SignalServiceProtos.PaymentAddress getSelfPaymentsAddressProtobuf() {
    if (!SignalStore.paymentsValues().mobileCoinPaymentsEnabled()) {
        return null;
    } else {
        IdentityKeyPair identityKeyPair = SignalStore.account().getAciIdentityKey();
        MobileCoinPublicAddress publicAddress = ApplicationDependencies.getPayments().getWallet().getMobileCoinPublicAddress();
        return MobileCoinPublicAddressProfileUtil.signPaymentsAddress(publicAddress.serialize(), identityKeyPair);
    }
}
Also used : IdentityKeyPair(org.whispersystems.libsignal.IdentityKeyPair) MobileCoinPublicAddress(org.thoughtcrime.securesms.payments.MobileCoinPublicAddress) Nullable(androidx.annotation.Nullable)

Aggregations

MobileCoinPublicAddress (org.thoughtcrime.securesms.payments.MobileCoinPublicAddress)7 UUID (java.util.UUID)3 RecipientId (org.thoughtcrime.securesms.recipients.RecipientId)3 IOException (java.io.IOException)2 PaymentsAddressException (org.thoughtcrime.securesms.payments.PaymentsAddressException)2 AlertDialog (android.app.AlertDialog)1 Uri (android.net.Uri)1 AnyThread (androidx.annotation.AnyThread)1 MainThread (androidx.annotation.MainThread)1 NonNull (androidx.annotation.NonNull)1 Nullable (androidx.annotation.Nullable)1 WorkerThread (androidx.annotation.WorkerThread)1 NavDirections (androidx.navigation.NavDirections)1 SerializationException (com.mobilecoin.lib.exceptions.SerializationException)1 ProfileKey (org.signal.zkgroup.profiles.ProfileKey)1 PaymentDatabase (org.thoughtcrime.securesms.database.PaymentDatabase)1 NotPushRegisteredException (org.thoughtcrime.securesms.net.NotPushRegisteredException)1 Balance (org.thoughtcrime.securesms.payments.Balance)1 Payee (org.thoughtcrime.securesms.payments.Payee)1 PaymentSubmissionResult (org.thoughtcrime.securesms.payments.PaymentSubmissionResult)1