         }
     }
     
-    static let maxChallengeRetries = 3
+    static let maxChallengeRetries = 2
     func _markChallengeCompleted(withCompletion completion: @escaping STPBooleanSuccessBlock, retryCount: Int = maxChallengeRetries) {
         guard let currentAction = currentAction,
             let threeDSSourceID = currentAction.nextAction()?.useStripeSDK?.threeDSSourceID

                // This isn't guaranteed to succeed if the ACS isn't ready yet.
                // Try it a few more times if it fails with a 400. (RUN_MOBILESDK-126)
                if retryCount > 0 && (error as NSError?)?.code == STPErrorCode.invalidRequestError.rawValue {
                    // Add some backoff time:
                    let delayTime = TimeInterval(
                        pow(Double(1 + Self.maxChallengeRetries - retryCount), Double(2))
                    )
                    
                    DispatchQueue.main.asyncAfter(deadline: .now() + delayTime) {
                        self._markChallengeCompleted(withCompletion: completion,
                                                     retryCount: retryCount - 1)
                    }
                } else {
                    completion(success, error)
                }

            fatalError()
        }
    }
    
    func _retryWithExponentialDelay(retryCount: Int, block: @escaping STPVoidBlock) {
        // Add some backoff time:
        let delayTime = TimeInterval(
            pow(Double(1 + Self.maxChallengeRetries - retryCount), Double(2))
        )
        
        DispatchQueue.main.asyncAfter(deadline: .now() + delayTime) {
            block()
        }
    }

    func _retrieveAndCheckIntentForCurrentAction(retryCount: Int = maxChallengeRetries) {
        // Alipay requires us to hit an endpoint before retrieving the PI, to ensure the status is up to date.
        let pingMarlinIfNecessary:
            ((STPPaymentHandlerPaymentIntentActionParams, @escaping STPVoidBlock) -> Void) = {
