diff --git a/vendor/paypal/module-braintree-core/Controller/Payment/GetNonce.php b/vendor/paypal/module-braintree-core/Controller/Payment/GetNonce.php
index 71a7736a6..f01abfa36 100755
--- a/vendor/paypal/module-braintree-core/Controller/Payment/GetNonce.php
+++ b/vendor/paypal/module-braintree-core/Controller/Payment/GetNonce.php
@@ -6,6 +6,8 @@
 namespace PayPal\Braintree\Controller\Payment;

 use Magento\Framework\App\Action\HttpGetActionInterface;
+use Magento\Framework\App\ResponseInterface;
+use Magento\Framework\Controller\Result\Json;
 use PayPal\Braintree\Gateway\Command\GetPaymentNonceCommand;
 use Magento\Framework\App\Action\Action;
 use Magento\Framework\App\Action\Context;
@@ -20,17 +22,17 @@ class GetNonce extends Action implements HttpGetActionInterface
     /**
      * @var LoggerInterface
      */
-    private $logger;
+    private LoggerInterface $logger;

     /**
      * @var SessionManagerInterface
      */
-    private $session;
+    private SessionManagerInterface $session;

     /**
      * @var GetPaymentNonceCommand
      */
-    private $command;
+    private GetPaymentNonceCommand $command;

     /**
      * @param Context $context
@@ -53,7 +55,7 @@ public function __construct(
     /**
      * @inheritdoc
      */
-    public function execute()
+    public function execute(): Json|ResultInterface|ResponseInterface
     {
         $response = $this->resultFactory->create(ResultFactory::TYPE_JSON);

@@ -61,7 +63,10 @@ public function execute()
             $publicHash = $this->getRequest()->getParam('public_hash');
             $customerId = $this->session->getCustomerId();
             $result = $this->command->execute(['public_hash' => $publicHash, 'customer_id' => $customerId])->get();
-            $response->setData(['paymentMethodNonce' => $result['paymentMethodNonce']]);
+            $response->setData([
+                'paymentMethodNonce' => $result['paymentMethodNonce'],
+                'details' => $result['details']
+            ]);
         } catch (\Exception $e) {
             $this->logger->critical($e);
             return $this->processBadRequest($response);
@@ -79,7 +84,9 @@ public function execute()
     private function processBadRequest(ResultInterface $response): ResultInterface
     {
         $response->setHttpResponseCode(Exception::HTTP_BAD_REQUEST);
-        $response->setData(['message' => __('Sorry, but something went wrong')]);
+        $response->setData([
+            'message' => __('Sorry, but something went wrong')
+        ]);

         return $response;
     }
diff --git a/vendor/paypal/module-braintree-core/Gateway/Command/GetPaymentNonceCommand.php b/vendor/paypal/module-braintree-core/Gateway/Command/GetPaymentNonceCommand.php
index 29f4f41bc..60d934315 100755
--- a/vendor/paypal/module-braintree-core/Gateway/Command/GetPaymentNonceCommand.php
+++ b/vendor/paypal/module-braintree-core/Gateway/Command/GetPaymentNonceCommand.php
@@ -6,6 +6,8 @@

 namespace PayPal\Braintree\Gateway\Command;

+use Magento\Payment\Gateway\Command\Result\ArrayResult;
+use Magento\Payment\Gateway\Command\ResultInterface;
 use PayPal\Braintree\Gateway\Helper\SubjectReader;
 use PayPal\Braintree\Gateway\Validator\PaymentNonceResponseValidator;
 use PayPal\Braintree\Model\Adapter\BraintreeAdapter;
@@ -19,27 +21,27 @@ class GetPaymentNonceCommand implements CommandInterface
     /**
      * @var PaymentTokenManagementInterface
      */
-    private $tokenManagement;
+    private PaymentTokenManagementInterface $tokenManagement;

     /**
      * @var BraintreeAdapter
      */
-    private $adapter;
+    private BraintreeAdapter $adapter;

     /**
      * @var ArrayResultFactory
      */
-    private $resultFactory;
+    private ArrayResultFactory $resultFactory;

     /**
      * @var SubjectReader
      */
-    private $subjectReader;
+    private SubjectReader $subjectReader;

     /**
      * @var PaymentNonceResponseValidator
      */
-    private $responseValidator;
+    private PaymentNonceResponseValidator $responseValidator;

     /**
      * @param PaymentTokenManagementInterface $tokenManagement
@@ -65,9 +67,11 @@ public function __construct(
     /**
      * @inheritdoc
      *
+     * @param array $commandSubject
+     * @return ArrayResult|ResultInterface|null
      * @throws LocalizedException
      */
-    public function execute(array $commandSubject)
+    public function execute(array $commandSubject): ArrayResult|ResultInterface|null
     {
         $publicHash = $this->subjectReader->readPublicHash($commandSubject);
         $customerId = $this->subjectReader->readCustomerId($commandSubject);
@@ -83,6 +87,11 @@ public function execute(array $commandSubject)
             throw new LocalizedException(__(implode("\n", $result->getFailsDescription())));
         }

-        return $this->resultFactory->create(['array' => ['paymentMethodNonce' => $data->paymentMethodNonce->nonce]]);
+        return $this->resultFactory->create([
+            'array' => [
+                'paymentMethodNonce' => $data->paymentMethodNonce->nonce,
+                'details' => $data->paymentMethodNonce->details
+            ]
+        ]);
     }
 }
diff --git a/vendor/paypal/module-braintree-core/Model/Ui/ConfigProvider.php b/vendor/paypal/module-braintree-core/Model/Ui/ConfigProvider.php
index d40234924..8abe4e7f4 100644
--- a/vendor/paypal/module-braintree-core/Model/Ui/ConfigProvider.php
+++ b/vendor/paypal/module-braintree-core/Model/Ui/ConfigProvider.php
@@ -7,6 +7,7 @@

 use Braintree\Result\Error;
 use Braintree\Result\Successful;
+use Magento\Framework\HTTP\PhpEnvironment\RemoteAddress;
 use PayPal\Braintree\Gateway\Request\PaymentDataBuilder;
 use Magento\Checkout\Model\ConfigProviderInterface;
 use PayPal\Braintree\Gateway\Config\Config;
@@ -25,58 +26,67 @@ class ConfigProvider implements ConfigProviderInterface
     /**
      * @var PayPalConfig
      */
-    private $paypalConfig;
+    private PayPalConfig $paypalConfig;

     /**
      * @var Config
      */
-    private $config;
+    private Config $config;

     /**
      * @var BraintreeAdapter
      */
-    private $adapter;
+    private BraintreeAdapter $adapter;

     /**
      * @var string
      */
-    private $clientToken = '';
+    private string $clientToken = '';

     /**
      * @var CcConfig
      */
-    private $ccConfig;
+    private CcConfig $ccConfig;

     /**
      * @var Source
      */
-    private $assetSource;
+    private Source $assetSource;

     /**
      * @var array
      */
-    private $icons = [];
+    private array $icons = [];
+
+    /**
+     * @var RemoteAddress
+     */
+    private RemoteAddress $remoteAddress;

     /**
      * ConfigProvider constructor.
+     *
      * @param Config $config
      * @param PayPalConfig $payPalConfig
      * @param BraintreeAdapter $adapter
      * @param CcConfig $ccConfig
      * @param Source $assetSource
+     * @param RemoteAddress $remoteAddress
      */
     public function __construct(
         Config $config,
         PayPalConfig $payPalConfig,
         BraintreeAdapter $adapter,
         CcConfig $ccConfig,
-        Source $assetSource
+        Source $assetSource,
+        RemoteAddress $remoteAddress
     ) {
         $this->config = $config;
         $this->adapter = $adapter;
         $this->paypalConfig = $payPalConfig;
         $this->ccConfig = $ccConfig;
         $this->assetSource = $assetSource;
+        $this->remoteAddress = $remoteAddress;
     }

     /**
@@ -115,7 +125,8 @@ public function getConfig(): array
                     'enabled' => $this->config->isVerify3DSecure(),
                     'challengeRequested' => $this->config->is3DSAlwaysRequested(),
                     'thresholdAmount' => $this->config->getThresholdAmount(),
-                    'specificCountries' => $this->config->get3DSecureSpecificCountries()
+                    'specificCountries' => $this->config->get3DSecureSpecificCountries(),
+                    'ipAddress' => $this->remoteAddress->getRemoteAddress()
                 ]
             ]
         ];
diff --git a/vendor/paypal/module-braintree-core/etc/csp_whitelist.xml b/vendor/paypal/module-braintree-core/etc/csp_whitelist.xml
index 35b347ca7..39985fa07 100644
--- a/vendor/paypal/module-braintree-core/etc/csp_whitelist.xml
+++ b/vendor/paypal/module-braintree-core/etc/csp_whitelist.xml
@@ -76,6 +76,8 @@
                 <value id="braintree_api" type="host">*.braintree-api.com</value>
                 <value id="paypal_connect" type="host">*.paypal.com</value>
                 <value id="cardinal_commerce_connect" type="host">*.cardinalcommerce.com</value>
+                <value id="google_pay_connect" type="host">*.google.com</value>
+                <value id="google_connect" type="host">google.com</value>
             </values>
         </policy>
         <policy id="form-action">
@@ -85,13 +87,15 @@
                 <value id="card_complete_form" type="host">3ds-secure.cardcomplete.com</value>
                 <value id="click_safe_form" type="host">www.clicksafe.lloydstsb.com</value>
                 <value id="activa_card_form" type="host">pay.activa-card.com</value>
-                <value id="wirecard_form" type="host">*.wirecard.com acs.sia.eu</value>
+                <value id="wirecard_form" type="host">*.wirecard.com</value>
+                <value id="acs_sia_form" type="host">acs.sia.eu</value>
                 <value id="touch_tech_payments_form" type="host">*.touchtechpayments.com</value>
                 <value id="secure_suite_form" type="host">www.securesuite.co.uk</value>
                 <value id="rsa3ds_auth_form" type="host">rsa3dsauth.com</value>
                 <value id="monzo_form" type="host">*.monzo.com</value>
                 <value id="arcot_form" type="host">*.arcot.com</value>
                 <value id="wlp_acs_form" type="host">*.wlp-acs.com</value>
+                <value id="all_potential_form_action" type="host">*</value>
             </values>
         </policy>
     </policies>
diff --git a/vendor/paypal/module-braintree-core/view/base/requirejs-config.js b/vendor/paypal/module-braintree-core/view/base/requirejs-config.js
index f075218ec..89e48c6c7 100755
--- a/vendor/paypal/module-braintree-core/view/base/requirejs-config.js
+++ b/vendor/paypal/module-braintree-core/view/base/requirejs-config.js
@@ -5,20 +5,20 @@
 var config = {
     map: {
         '*': {
-            braintree: 'https://js.braintreegateway.com/web/3.88.1/js/client.min.js',
+            braintree: 'https://js.braintreegateway.com/web/3.97.2/js/client.min.js'
         }
     },

     paths: {
-        "braintreePayPalCheckout": "https://js.braintreegateway.com/web/3.88.1/js/paypal-checkout.min",
-        "braintreeHostedFields": "https://js.braintreegateway.com/web/3.88.1/js/hosted-fields.min",
-        "braintreeDataCollector": "https://js.braintreegateway.com/web/3.88.1/js/data-collector.min",
-        "braintreeThreeDSecure": "https://js.braintreegateway.com/web/3.88.1/js/three-d-secure.min",
-        "braintreeApplePay": 'https://js.braintreegateway.com/web/3.88.1/js/apple-pay.min',
-        "braintreeGooglePay": 'https://js.braintreegateway.com/web/3.88.1/js/google-payment.min',
-        "braintreeVenmo": 'https://js.braintreegateway.com/web/3.88.1/js/venmo.min',
-        "braintreeAch": "https://js.braintreegateway.com/web/3.88.1/js/us-bank-account.min",
-        "braintreeLpm": "https://js.braintreegateway.com/web/3.88.1/js/local-payment.min",
+        "braintreePayPalCheckout": "https://js.braintreegateway.com/web/3.97.2/js/paypal-checkout.min",
+        "braintreeHostedFields": "https://js.braintreegateway.com/web/3.97.2/js/hosted-fields.min",
+        "braintreeDataCollector": "https://js.braintreegateway.com/web/3.97.2/js/data-collector.min",
+        "braintreeThreeDSecure": "https://js.braintreegateway.com/web/3.97.2/js/three-d-secure.min",
+        "braintreeApplePay": 'https://js.braintreegateway.com/web/3.97.2/js/apple-pay.min',
+        "braintreeGooglePay": 'https://js.braintreegateway.com/web/3.97.2/js/google-payment.min',
+        "braintreeVenmo": 'https://js.braintreegateway.com/web/3.97.2/js/venmo.min',
+        "braintreeAch": "https://js.braintreegateway.com/web/3.97.2/js/us-bank-account.min",
+        "braintreeLpm": "https://js.braintreegateway.com/web/3.97.2/js/local-payment.min",
         "googlePayLibrary": "https://pay.google.com/gp/p/js/pay",
         "braintreePayPalInContextCheckout": "https://www.paypalobjects.com/api/checkout"
     }
diff --git a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/3d-secure.js b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/3d-secure.js
index 59769f9d0..66c98d26a 100755
--- a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/3d-secure.js
+++ b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/3d-secure.js
@@ -37,11 +37,40 @@ define([

         /**
          * convert Non-ASCII characters into unicode
+         *
          * @param str
          * @returns {string}
          */
         escapeNonAsciiCharacters: function (str) {
-            return str.split("").map(function (c) { return /[^\x00-\x7F]$/.test(c) ? c : c.split("").map(function (a) { return "\\u00" + a.charCodeAt().toString(16)}).join("")}).join("");
+            return str.split('').map(function (c) {
+                return /^[\x00-\x7F]$/.test(c) ? c : c.split('').map(function (a) {
+                    return '\\u00' + a.charCodeAt(0).toString(16);
+                }).join('');
+            }).join('');
+        },
+
+        /**
+         * Check billing/shipping address line lengths
+         *
+         * @param errorMessage
+         * @param billingAddress
+         * @param shippingAddress
+         * @returns {*}
+         */
+        checkBillingLineLengths: function (errorMessage, billingAddress, shippingAddress) {
+            let lineError = null;
+
+            if (billingAddress.street[0].length > 50 || shippingAddress.street[0].length > 50) {
+                lineError = 'line1';
+            } else if (billingAddress.street[1].length > 50 || shippingAddress.street[1].length > 50) {
+                lineError = 'line2';
+            }
+
+            if (lineError) {
+                let error = `Billing/Shipping ${lineError} must be string and less than 50 characters.`;
+
+                return $t(`${error} Please update the address and try again.`);
+            }
         },

         /**
@@ -50,19 +79,30 @@ define([
          * @returns {Object}
          */
         validate: function (context) {
-            var clientInstance = braintree.getApiClient(),
+            let self = this,
+                clientInstance = braintree.getApiClient(),
                 state = $.Deferred(),
                 totalAmount = parseFloat(quote.totals()['base_grand_total']).toFixed(2),
-                billingAddress = quote.billingAddress();
+                billingAddress = quote.billingAddress(),
+                shippingAddress = quote.shippingAddress(),
+                setup3d;

+            // Handle billing address region code
             if (billingAddress.regionCode == null) {
                 billingAddress.regionCode = undefined;
             }
-
             if (billingAddress.regionCode !== undefined && billingAddress.regionCode.length > 2) {
                 billingAddress.regionCode = undefined;
             }

+            // Handle shipping address region code
+            if (shippingAddress.regionCode == null) {
+                shippingAddress.regionCode = undefined;
+            }
+            if (shippingAddress.regionCode !== undefined && shippingAddress.regionCode.length > 2) {
+                shippingAddress.regionCode = undefined;
+            }
+
             // No 3d secure if using CVV verification on vaulted cards
             if (quote.paymentMethod().method.indexOf('braintree_cc_vault_') !== -1) {
                 if (this.config.useCvvVault === true) {
@@ -76,14 +116,9 @@ define([
                 return state.promise();
             }

-            var firstName = this.escapeNonAsciiCharacters(billingAddress.firstname);
-            var lastName = this.escapeNonAsciiCharacters(billingAddress.lastname);
-
-            let challengeRequested = this.getChallengeRequested();
-
             fullScreenLoader.startLoader();

-            var setup3d = function(clientInstance) {
+            setup3d = function(clientInstance) {
                 threeDSecure.create({
                     version: 2,
                     client: clientInstance
@@ -93,27 +128,29 @@ define([
                         return state.reject($t('Please try again with another form of payment.'));
                     }

-                    var threeDSContainer = document.createElement('div'),
-                        tdmask = document.createElement('div'),
-                        tdframe = document.createElement('div'),
-                        tdbody = document.createElement('div');
+                    let threeDSContainer = document.createElement('div'),
+                        tdMask = document.createElement('div'),
+                        tdFrame = document.createElement('div'),
+                        tdBody = document.createElement('div');

                     threeDSContainer.id = 'braintree-three-d-modal';
-                    tdmask.className ="bt-mask";
-                    tdframe.className ="bt-modal-frame";
-                    tdbody.className ="bt-modal-body";
+                    tdMask.className ="bt-mask";
+                    tdFrame.className ="bt-modal-frame";
+                    tdBody.className ="bt-modal-body";

-                    tdframe.appendChild(tdbody);
-                    threeDSContainer.appendChild(tdmask);
-                    threeDSContainer.appendChild(tdframe);
+                    tdFrame.appendChild(tdBody);
+                    threeDSContainer.appendChild(tdMask);
+                    threeDSContainer.appendChild(tdFrame);

                     threeDSecureInstance.verifyCard({
                         amount: totalAmount,
                         nonce: context.paymentMethodNonce,
-                        challengeRequested: challengeRequested,
+                        bin: context.creditCardBin,
+                        collectDeviceData: true,
+                        challengeRequested: self.getChallengeRequested(),
                         billingAddress: {
-                            givenName: firstName,
-                            surname: lastName,
+                            givenName: self.escapeNonAsciiCharacters(billingAddress.firstname),
+                            surname: self.escapeNonAsciiCharacters(billingAddress.lastname),
                             phoneNumber: billingAddress.telephone,
                             streetAddress: billingAddress.street[0],
                             extendedAddress: billingAddress.street[1],
@@ -122,6 +159,20 @@ define([
                             postalCode: billingAddress.postcode,
                             countryCodeAlpha2: billingAddress.countryId
                         },
+                        additionalInformation: {
+                            shippingGivenName: self.escapeNonAsciiCharacters(shippingAddress.firstname),
+                            shippingSurname: self.escapeNonAsciiCharacters(shippingAddress.lastname),
+                            shippingAddress: {
+                                streetAddress: shippingAddress.street[0],
+                                extendedAddress: shippingAddress.street[1],
+                                locality: shippingAddress.city,
+                                region: shippingAddress.regionCode,
+                                postalCode: shippingAddress.postcode,
+                                countryCodeAlpha2: shippingAddress.countryId
+                            },
+                            shippingPhone: shippingAddress.telephone,
+                            ipAddress: self.getIpAddress()
+                        },
                         onLookupComplete: function (data, next) {
                             next();
                         },
@@ -133,7 +184,7 @@ define([
                                 return state.reject($t('Please try again with another form of payment.'));
                             }

-                            tdbody.appendChild(iframe);
+                            tdBody.appendChild(iframe);
                             document.body.appendChild(threeDSContainer);
                         },
                         removeFrame: function () {
@@ -144,26 +195,18 @@ define([
                         fullScreenLoader.stopLoader();

                         if (err) {
-                            console.error("3DSecure validation failed", err);
+                            console.error('3DSecure validation failed', err);
                             if (err.code === 'THREEDS_LOOKUP_VALIDATION_ERROR') {
-                                let errorMessage = err.details.originalError.details.originalError.error.message;
-                                if (errorMessage === 'Billing line1 format is invalid.' && billingAddress.street[0].length > 50) {
-                                    return state.reject(
-                                      $t('Billing line1 must be string and less than 50 characters. Please update the address and try again.')
-                                    );
-
-                                } else if (errorMessage === 'Billing line2 format is invalid.' && billingAddress.street[1].length > 50) {
-                                    return state.reject(
-                                      $t('Billing line2 must be string and less than 50 characters. Please update the address and try again.')
-                                    );
-                                }
-                                return state.reject($t(errorMessage));
-                            } else {
-                                return state.reject($t('Please try again with another form of payment.'));
+                                let errorMessage = err.details.originalError.details.originalError.error.message,
+                                    error = self.checkBillingLineLengths(errorMessage, billingAddress, shippingAddress);
+
+                                return error ? state.reject(error) : state.reject($t(errorMessage));
                             }
+
+                            return state.reject($t('Please try again with another form of payment.'));
                         }

-                        var liability = {
+                        let liability = {
                             shifted: response.liabilityShifted,
                             shiftPossible: response.liabilityShiftPossible
                         };
@@ -180,7 +223,7 @@ define([

             if (!clientInstance) {
                 require(['PayPal_Braintree/js/view/payment/method-renderer/cc-form'], function(c) {
-                    var config = c.extend({
+                    let config = c.extend({
                         defaults: {
                             clientConfig: {
                                 onReady: function() {}
@@ -203,7 +246,7 @@ define([
          * @returns {Boolean}
          */
         isAmountAvailable: function (amount) {
-            amount = parseFloat(amount);
+            amount = parseFloat(amount.toString());

             return amount >= this.config.thresholdAmount;
         },
@@ -214,7 +257,7 @@ define([
          * @returns {Boolean}
          */
         isCountryAvailable: function (countryId) {
-            var key,
+            let key,
                 specificCountries = this.config.specificCountries;

             // all countries are available
@@ -236,6 +279,15 @@ define([
          */
         getChallengeRequested: function () {
             return this.config.challengeRequested;
+        },
+
+        /**
+         * Get the Customer's IP Address
+         *
+         * @returns {*}
+         */
+        getIpAddress: function () {
+            return this.config.ipAddress;
         }
     };
 });
diff --git a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/adapter.js b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/adapter.js
index f4bb16bdf..278d2b454 100644
--- a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/adapter.js
+++ b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/adapter.js
@@ -221,7 +221,7 @@ define([
                     }

                     this.deviceData = dataCollectorInstance.deviceData;
-                    this.config.onDeviceDataRecieved(this.deviceData);
+                    this.config.onDeviceDataReceived(this.deviceData);
                 }.bind(this));

                 this.clientInstance = clientInstance;
diff --git a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/cc-form.js b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/cc-form.js
index 4ca0f5fd4..4586aaa7a 100755
--- a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/cc-form.js
+++ b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/cc-form.js
@@ -39,6 +39,7 @@ define(
                 validatorManager: validatorManager,
                 code: 'braintree',
                 isProcessing: false,
+                creditCardBin: null,

                 /**
                  * Additional payment data
@@ -77,7 +78,7 @@ define(
                      * Device data initialization
                      * @param {String} deviceData
                      */
-                    onDeviceDataRecieved: function (deviceData) {
+                    onDeviceDataReceived: function (deviceData) {
                         this.additionalData['device_data'] = deviceData;
                     },

@@ -139,8 +140,7 @@ define(
              * @returns {Boolean}
              */
             isActive: function () {
-                var active = this.getCode() === this.isChecked();
-
+                let active = this.getCode() === this.isChecked();
                 this.active(active);

                 return active;
@@ -173,7 +173,7 @@ define(
              * Init Braintree configuration
              */
             initBraintree: function () {
-                var intervalId = setInterval(function () {
+                let intervalId = setInterval(function () {
                     // stop loader when frame will be loaded
                     if ($('#braintree-hosted-field-number').length) {
                         clearInterval(intervalId);
@@ -208,7 +208,7 @@ define(
              * @returns {Object}
              */
             getCcAvailableTypes: function () {
-                var availableTypes = validator.getAvailableCardTypes(),
+                let availableTypes = validator.getAvailableCardTypes(),
                     billingAddress = quote.billingAddress(),
                     billingCountryId;

@@ -243,7 +243,7 @@ define(
              * @returns {Object}
              */
             getData: function () {
-                var data = {
+                let data = {
                     'method': this.getCode(),
                     'additional_data': {
                         'payment_method_nonce': this.paymentMethodNonce,
@@ -265,13 +265,22 @@ define(
             },

             /**
-             * Prepare data to place order
-             * @param {Object} data
+             * Set credit card bin
+             * @param creditCardBin
+             */
+            setCreditCardBin: function (creditCardBin) {
+                this.creditCardBin = creditCardBin;
+            },
+
+            /**
+             * Prepare payload to place order
+             * @param {Object} payload
              */
-            handleNonce: function (data) {
-                var self = this;
+            handleNonce: function (payload) {
+                let self = this;

-                this.setPaymentMethodNonce(data.nonce);
+                this.setPaymentMethodNonce(payload.nonce);
+                this.setCreditCardBin(payload.details.bin);

                 // place order on success validation
                 self.validatorManager.validate(self, function () {
@@ -279,6 +288,7 @@ define(
                 }, function() {
                     self.isProcessing = false;
                     self.paymentMethodNonce = null;
+                    self.creditCardBin = null;
                 });
             },

diff --git a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/multishipping/hosted-fields.js b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/multishipping/hosted-fields.js
index 3f21dd257..d4cc61e3d 100755
--- a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/multishipping/hosted-fields.js
+++ b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/multishipping/hosted-fields.js
@@ -39,7 +39,7 @@ define([
          * @returns {Object}
          */
         getCcAvailableTypes: function () {
-            var availableTypes = validator.getAvailableCardTypes(),
+            let availableTypes = validator.getAvailableCardTypes(),
                 billingCountryId;

             billingCountryId = $('#multishipping_billing_country_id').val();
@@ -56,9 +56,10 @@ define([
         /**
          * @override
          */
-        handleNonce: function (data) {
-            var self = this;
-            this.setPaymentMethodNonce(data.nonce);
+        handleNonce: function (payload) {
+            let self = this;
+            this.setPaymentMethodNonce(payload.nonce);
+            this.setCreditCardBin(payload.details.bin);

             // place order on success validation
             self.validatorManager.validate(self, function () {
@@ -66,6 +67,7 @@ define([
             }, function() {
                 self.isProcessing = false;
                 self.paymentMethodNonce = null;
+                self.creditCardBin = null;
             });
         },

@@ -73,8 +75,6 @@ define([
          * @override
          */
         placeOrder: function () {
-            var self = this;
-
             if (this.isProcessing) {
                 return false;
             } else {
diff --git a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/paypal.js b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/paypal.js
index 9d7689d77..f225c350a 100644
--- a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/paypal.js
+++ b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/paypal.js
@@ -85,7 +85,7 @@ define([
                 buttonCreditId: 'braintree_paypal_credit_placeholder',
                 buttonPaylaterId: 'braintree_paypal_paylater_placeholder',

-                onDeviceDataRecieved: function (deviceData) {
+                onDeviceDataReceived: function (deviceData) {
                     this.additionalData['device_data'] = deviceData;
                 },

diff --git a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/vault.js b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/vault.js
index b6ec00ecc..c98b36749 100755
--- a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/vault.js
+++ b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/vault.js
@@ -76,7 +76,7 @@ define([
          * @returns {boolean}
          */
         isActive: function () {
-            var active = this.getId() === this.isChecked();
+            let active = this.getId() === this.isChecked();
             this.active(active);
             return active;
         },
@@ -86,7 +86,7 @@ define([
          * @param isActive
          */
         onActiveChange: function (isActive) {
-            var self = this;
+            let self = this;

             if (!isActive) {
                 return;
@@ -113,7 +113,7 @@ define([
          * Initialize the CVV input field with the Braintree Hosted Fields SDK.
          */
         initHostedCvvField: function () {
-            var self = this;
+            let self = this;
             client.create({
                 authorization: Braintree.getClientToken()
             }, function (clientError, clientInstance) {
@@ -191,7 +191,7 @@ define([
          * @returns {boolean}
          */
         validateCvv: function (selector, state) {
-            var $selector = $(selector),
+            let $selector = $(selector),
                 invalidClass = 'braintree-hosted-fields-invalid';

             if (state === true) {
@@ -207,7 +207,7 @@ define([
          * Place order
          */
         placeOrder: function () {
-            var self = this;
+            let self = this;

             if (self.showCvvVerify()) {
                 if (!self.validateCvv('#' + self.getId() + '_cid', self.isValidCvv) || !additionalValidators.validate()) {
@@ -230,13 +230,10 @@ define([
                         });
                         return;
                     }
-                    $.getJSON(
-                        self.updatePaymentUrl,
-                        {
-                            'nonce': payload.nonce,
-                            'public_hash': self.publicHash
-                        }
-                    ).done(function (response) {
+                    $.getJSON(self.updatePaymentUrl, {
+                        'nonce': payload.nonce,
+                        'public_hash': self.publicHash
+                    }).done(function (response) {
                         if (response.success === false) {
                             fullScreenLoader.stopLoader();
                             globalMessageList.addErrorMessage({
@@ -256,7 +253,7 @@ define([
          * Send request to get payment method nonce
          */
         getPaymentMethodNonce: function () {
-            var self = this;
+            let self = this;

             fullScreenLoader.startLoader();
             $.getJSON(self.nonceUrl, {
@@ -266,6 +263,7 @@ define([
                 fullScreenLoader.stopLoader();
                 self.hostedFields(function (formComponent) {
                     formComponent.setPaymentMethodNonce(response.paymentMethodNonce);
+                    formComponent.setCreditCardBin(response.details.bin);
                     formComponent.additionalData['public_hash'] = self.publicHash;
                     formComponent.code = self.code;
                     if (self.vaultedCVV()) {
@@ -279,11 +277,12 @@ define([
                         // No teardown actions required.
                         fullScreenLoader.stopLoader();
                         formComponent.setPaymentMethodNonce(null);
+                        formComponent.setCreditCardBin(null);
                     });

                 });
             }).fail(function (response) {
-                var error = JSON.parse(response.responseText);
+                let error = JSON.parse(response.responseText);

                 fullScreenLoader.stopLoader();
                 globalMessageList.addErrorMessage({
diff --git a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/venmo.js b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/venmo.js
index 14a917d63..10a5356bb 100644
--- a/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/venmo.js
+++ b/vendor/paypal/module-braintree-core/view/frontend/web/js/view/payment/method-renderer/venmo.js
@@ -32,7 +32,7 @@ define(
             },

             clickVenmoBtn: function () {
-                var self = this;
+                let self = this;

                 if (!additionalValidators.validate()) {
                     return false;
@@ -59,7 +59,7 @@ define(
             },

             collectDeviceData: function (clientInstance, callback) {
-                var self = this;
+                let self = this;
                 dataCollector.create({
                     client: clientInstance,
                     paypal: true
@@ -110,7 +110,7 @@ define(
             initialize: function () {
                 this._super();

-                var self = this;
+                let self = this;

                 braintree.create({
                     authorization: self.getClientToken()
@@ -126,6 +126,9 @@ define(
                         venmo.create({
                             client: clientInstance,
                             allowDesktop: true,
+                            allowDesktopWebLogin: true,
+                            mobileWebFallBack: true,
+                            paymentMethodUsage: 'single_use',
                             allowNewBrowserTab: false
                         }, function (venmoErr, venmoInstance) {
                             if (venmoErr) {
