Search in sources :

Example 11 with SerializationException

use of com.mobilecoin.lib.exceptions.SerializationException in project Signal-Android by WhisperSystems.

the class Wallet method getSentTransactionStatus.

@WorkerThread
@NonNull
public TransactionStatusResult getSentTransactionStatus(@NonNull PaymentTransactionId transactionId) throws IOException {
    try {
        PaymentTransactionId.MobileCoin mobcoinTransaction = (PaymentTransactionId.MobileCoin) transactionId;
        Transaction transaction = Transaction.fromBytes(mobcoinTransaction.getTransaction());
        Transaction.Status status = mobileCoinClient.getAccountSnapshot().getTransactionStatus(transaction);
        switch(status) {
            case UNKNOWN:
                Log.w(TAG, "Unknown sent Transaction Status");
                return TransactionStatusResult.inProgress();
            case FAILED:
                return TransactionStatusResult.failed();
            case ACCEPTED:
                return TransactionStatusResult.complete(status.getBlockIndex().longValue());
            default:
                throw new IllegalStateException("Unknown Transaction Status: " + status);
        }
    } catch (SerializationException | InvalidFogResponse e) {
        Log.w(TAG, e);
        return TransactionStatusResult.failed();
    } catch (NetworkException | AttestationException e) {
        Log.w(TAG, e);
        throw new IOException(e);
    }
}
Also used : SerializationException(com.mobilecoin.lib.exceptions.SerializationException) AttestationException(com.mobilecoin.lib.exceptions.AttestationException) IOException(java.io.IOException) InvalidFogResponse(com.mobilecoin.lib.exceptions.InvalidFogResponse) PendingTransaction(com.mobilecoin.lib.PendingTransaction) Transaction(com.mobilecoin.lib.Transaction) NetworkException(com.mobilecoin.lib.exceptions.NetworkException) WorkerThread(androidx.annotation.WorkerThread) NonNull(androidx.annotation.NonNull)

Example 12 with SerializationException

use of com.mobilecoin.lib.exceptions.SerializationException in project Signal-Android by signalapp.

the class Wallet method sendPayment.

@WorkerThread
private void sendPayment(@NonNull MobileCoinPublicAddress to, @NonNull Money.MobileCoin amount, @NonNull Money.MobileCoin totalFee, boolean defragmentFirst, @NonNull List<TransactionSubmissionResult> results) {
    Money.MobileCoin defragmentFees = Money.MobileCoin.ZERO;
    if (defragmentFirst) {
        try {
            defragmentFees = defragment(amount, results);
        } catch (InsufficientFundsException e) {
            Log.w(TAG, "Insufficient funds", e);
            results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.INSUFFICIENT_FUNDS, true));
            return;
        } catch (TimeoutException | InvalidTransactionException | InvalidFogResponse | AttestationException | TransactionBuilderException | NetworkException | FogReportException e) {
            Log.w(TAG, "Defragment failed", e);
            results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, true));
            return;
        }
    }
    Money.MobileCoin feeMobileCoin = totalFee.subtract(defragmentFees).requireMobileCoin();
    BigInteger picoMob = amount.requireMobileCoin().toPicoMobBigInteger();
    PendingTransaction pendingTransaction = null;
    Log.i(TAG, String.format("Total fee advised: %s\nDefrag fees: %s\nTransaction fee: %s", totalFee, defragmentFees, feeMobileCoin));
    if (!feeMobileCoin.isPositive()) {
        Log.i(TAG, "No fee left after defrag");
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
        return;
    }
    try {
        pendingTransaction = mobileCoinClient.prepareTransaction(to.getAddress(), picoMob, feeMobileCoin.toPicoMobBigInteger());
    } catch (InsufficientFundsException e) {
        Log.w(TAG, "Insufficient funds", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.INSUFFICIENT_FUNDS, false));
    } catch (FeeRejectedException e) {
        Log.w(TAG, "Fee rejected " + totalFee, e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
    } catch (InvalidFogResponse | FogReportException e) {
        Log.w(TAG, "Invalid fog response", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
    } catch (FragmentedAccountException e) {
        if (defragmentFirst) {
            Log.w(TAG, "Account is fragmented, but already tried to defragment", e);
            results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
        } else {
            Log.i(TAG, "Account is fragmented, defragmenting and retrying");
            sendPayment(to, amount, totalFee, true, results);
        }
    } catch (AttestationException e) {
        Log.w(TAG, "Attestation problem", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
    } catch (NetworkException e) {
        Log.w(TAG, "Network problem", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
    } catch (TransactionBuilderException e) {
        Log.w(TAG, "Builder problem", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
    }
    if (pendingTransaction == null) {
        Log.w(TAG, "Failed to create pending transaction");
        return;
    }
    try {
        Log.i(TAG, "Submitting transaction");
        mobileCoinClient.submitTransaction(pendingTransaction.getTransaction());
        Log.i(TAG, "Transaction submitted");
        results.add(TransactionSubmissionResult.successfullySubmitted(new PaymentTransactionId.MobileCoin(pendingTransaction.getTransaction().toByteArray(), pendingTransaction.getReceipt().toByteArray(), feeMobileCoin)));
    } catch (NetworkException e) {
        Log.w(TAG, "Network problem", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.NETWORK_FAILURE, false));
    } catch (InvalidTransactionException e) {
        Log.w(TAG, "Invalid transaction", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
    } catch (AttestationException e) {
        Log.w(TAG, "Attestation problem", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
    } catch (SerializationException e) {
        Log.w(TAG, "Serialization problem", e);
        results.add(TransactionSubmissionResult.failure(TransactionSubmissionResult.ErrorCode.GENERIC_FAILURE, false));
    }
}
Also used : PendingTransaction(com.mobilecoin.lib.PendingTransaction) AttestationException(com.mobilecoin.lib.exceptions.AttestationException) FogReportException(com.mobilecoin.lib.exceptions.FogReportException) SerializationException(com.mobilecoin.lib.exceptions.SerializationException) FeeRejectedException(com.mobilecoin.lib.exceptions.FeeRejectedException) InvalidTransactionException(com.mobilecoin.lib.exceptions.InvalidTransactionException) InvalidFogResponse(com.mobilecoin.lib.exceptions.InvalidFogResponse) TransactionBuilderException(com.mobilecoin.lib.exceptions.TransactionBuilderException) Money(org.whispersystems.signalservice.api.payments.Money) FragmentedAccountException(com.mobilecoin.lib.exceptions.FragmentedAccountException) InsufficientFundsException(com.mobilecoin.lib.exceptions.InsufficientFundsException) BigInteger(java.math.BigInteger) NetworkException(com.mobilecoin.lib.exceptions.NetworkException) TimeoutException(java.util.concurrent.TimeoutException) WorkerThread(androidx.annotation.WorkerThread)

Aggregations

SerializationException (com.mobilecoin.lib.exceptions.SerializationException)12 WorkerThread (androidx.annotation.WorkerThread)6 AttestationException (com.mobilecoin.lib.exceptions.AttestationException)6 InvalidFogResponse (com.mobilecoin.lib.exceptions.InvalidFogResponse)6 NetworkException (com.mobilecoin.lib.exceptions.NetworkException)6 NonNull (androidx.annotation.NonNull)4 PendingTransaction (com.mobilecoin.lib.PendingTransaction)4 IOException (java.io.IOException)4 BigInteger (java.math.BigInteger)4 UUID (java.util.UUID)4 ContentValues (android.content.ContentValues)2 Receipt (com.mobilecoin.lib.Receipt)2 Transaction (com.mobilecoin.lib.Transaction)2 AmountDecoderException (com.mobilecoin.lib.exceptions.AmountDecoderException)2 FeeRejectedException (com.mobilecoin.lib.exceptions.FeeRejectedException)2 FogReportException (com.mobilecoin.lib.exceptions.FogReportException)2 FragmentedAccountException (com.mobilecoin.lib.exceptions.FragmentedAccountException)2 InsufficientFundsException (com.mobilecoin.lib.exceptions.InsufficientFundsException)2 InvalidReceiptException (com.mobilecoin.lib.exceptions.InvalidReceiptException)2 InvalidTransactionException (com.mobilecoin.lib.exceptions.InvalidTransactionException)2