From 676006008317bba667ecc9f4f9343128ce1cd5eb Mon Sep 17 00:00:00 2001 From: Blake Kaufman <68204898+BlakeKaufman@users.noreply.github.com> Date: Sun, 19 Apr 2026 11:43:00 -0400 Subject: [PATCH] Simplify confirm split payment (#778) * fix small style issues * fix touch gap * fixing podfile * creating standardized amountIn function * show tx ids not amounts * use standardized amount in * use standardized amount in * fixed no payment information crash * downgrade rn and react-native-quick-crypto * only show margin if two elements exist * adding backup amount * wait till hompage to call analytics data * fix restore bug * updating firebase * fix check logic * wrap to handle thrown execptions * use utils package directly * adding error handling * group notification payments insted of handling them sequentually * handle payment requset on confirm page * improving split payment ux * adding translations * adding firebase sdk warning --- __tests__/calculateFlashnetAmountIn.test.js | 98 ++ .../analytics/analyticsBudgetPage.js | 34 +- .../analytics/analyticsCreateBudgetPage.js | 4 +- .../analytics/balancePieChart.js | 8 +- .../contacts/createSplitBill.js | 120 +- .../contacts/sendAndRequestPage.js | 9 +- .../gifts/createGiftDuration.js | 32 +- .../sendBitcoin/confirmSplitPayment.js | 1265 ++++++----------- app/functions/checkGoogleServices.js | 9 +- app/functions/messaging/publishMessage.js | 46 +- .../payments/validateSplitPayment.js | 101 ++ app/functions/spark/bulkPaymentFunctions.js | 108 +- app/functions/spark/flashnet.js | 108 +- app/functions/spark/payments.js | 29 +- app/functions/spark/swapAmountUtils.js | 100 ++ app/functions/spark/transformTxToPayment.js | 2 +- app/hooks/useBudgetWarning.js | 24 +- app/screens/inAccount/analyticsPage.js | 1 + app/screens/inAccount/confirmTxPage.js | 48 +- app/screens/inAccount/loadingScreen.js | 3 + .../inAccount/technicalTransactionDetails.js | 33 +- context-store/analyticsContext.js | 81 +- ios/BlitzWallet.xcodeproj/project.pbxproj | 2 +- .../xcschemes/BlitzWallet.xcscheme | 2 +- ios/Podfile.lock | 1037 ++++++++------ locales/de-DE/translation.json | 3 +- locales/en/translation.json | 3 +- locales/es/translation.json | 3 +- locales/fr/translation.json | 3 +- locales/it/translation.json | 3 +- locales/pt-BR/translation.json | 3 +- locales/ru/translation.json | 3 +- locales/sv/translation.json | 3 +- package.json | 26 +- yarn.lock | 855 +++++------ 35 files changed, 2136 insertions(+), 2073 deletions(-) create mode 100644 __tests__/calculateFlashnetAmountIn.test.js create mode 100644 app/functions/payments/validateSplitPayment.js create mode 100644 app/functions/spark/swapAmountUtils.js diff --git a/__tests__/calculateFlashnetAmountIn.test.js b/__tests__/calculateFlashnetAmountIn.test.js new file mode 100644 index 00000000..1d35793f --- /dev/null +++ b/__tests__/calculateFlashnetAmountIn.test.js @@ -0,0 +1,98 @@ +import { + calculateFlashnetAmountIn, + SEND_AMOUNT_INCREASE_BUFFER, +} from '../app/functions/spark/swapAmountUtils'; + +const PRICE = 1_000_000; // 1 sat = $1.00 at this mock price (simplifies math) + +describe('calculateFlashnetAmountIn', () => { + describe('BTC→USD (isUsdAssetIn = false)', () => { + it('applies default 1% buffer to sats', () => { + const result = calculateFlashnetAmountIn({ + baseAmountIn: 10_000, + isUsdAssetIn: false, + maxBalance: 100_000, + }); + expect(result).toBe(Math.round(10_000 * SEND_AMOUNT_INCREASE_BUFFER)); + }); + + it('caps to maxBalance when buffer exceeds it', () => { + const result = calculateFlashnetAmountIn({ + baseAmountIn: 99_999, + isUsdAssetIn: false, + maxBalance: 100_000, + }); + expect(result).toBe(100_000); + }); + + it('accepts a custom bufferMultiplier', () => { + const result = calculateFlashnetAmountIn({ + baseAmountIn: 10_000, + isUsdAssetIn: false, + maxBalance: 100_000, + bufferMultiplier: 1.02, + }); + expect(result).toBe(10_200); + }); + + it('returns integer', () => { + const result = calculateFlashnetAmountIn({ + baseAmountIn: 9999, + isUsdAssetIn: false, + maxBalance: 50_000, + }); + expect(Number.isInteger(result)).toBe(true); + }); + }); + + describe('USD→BTC (isUsdAssetIn = true)', () => { + // 1_000_000 microdollars = $1.00 + it('applies default 1% buffer and returns microdollars', () => { + // $10.00 in microdollars; PRICE = 1_000_000 means 1 sat = $1.00 + // dollarBalanceSat = 1_000_000 → satsToDollars(1_000_000, 1_000_000) = $1_000_000 + const base = 10_000_000; + const result = calculateFlashnetAmountIn({ + baseAmountIn: base, + isUsdAssetIn: true, + dollarBalanceSat: 1_000_000, + currentPriceAInB: PRICE, + }); + // buffer: 10.00 * 1.01 = 10.10 → 10_100_000 microdollars + expect(result).toBe(10_100_000); + }); + + it('caps to balance when buffer exceeds it (low balance scenario)', () => { + // base = $10 but USD balance only covers $5 + // dollarBalanceSat = 5 sats, PRICE = 1_000_000 → satsToDollars(5, 1_000_000) = 5 + const result = calculateFlashnetAmountIn({ + baseAmountIn: 10_000_000, // $10 + isUsdAssetIn: true, + dollarBalanceSat: 5, // 5 sats → $5 at PRICE + currentPriceAInB: PRICE, + }); + // bufferedDollars = 10_000_000 * 1.01 / 1e6 = 10.10 + // balanceDollars = satsToDollars(5, 1_000_000) = 5 * 1_000_000 / 1_000_000 = 5 + // cappedDollars = min(10.10, 5) = 5.00 + expect(result).toBe(5_000_000); + }); + + it('falls back to maxBalance/1e6 when dollarBalanceSat and currentPriceAInB are absent', () => { + const result = calculateFlashnetAmountIn({ + baseAmountIn: 5_000_000, // $5.00 + isUsdAssetIn: true, + maxBalance: 10_000_000, // $10.00 in microdollars + }); + // 5.00 * 1.01 = 5.05 → 5_050_000 + expect(result).toBe(5_050_000); + }); + + it('returns integer', () => { + const result = calculateFlashnetAmountIn({ + baseAmountIn: 3_333_333, + isUsdAssetIn: true, + maxBalance: 100_000_000, + }); + expect(Number.isInteger(result)).toBe(true); + }); + }); +}); diff --git a/app/components/admin/homeComponents/analytics/analyticsBudgetPage.js b/app/components/admin/homeComponents/analytics/analyticsBudgetPage.js index 504c5d4e..632d7b07 100644 --- a/app/components/admin/homeComponents/analytics/analyticsBudgetPage.js +++ b/app/components/admin/homeComponents/analytics/analyticsBudgetPage.js @@ -48,7 +48,7 @@ export default function AnalyticsBudgetPage() { const { masterInfoObject } = useGlobalContextProvider(); const { fiatStats } = useNodeContext(); const { bottomPadding } = useGlobalInsets(); - const { textColor, backgroundOffset } = GetThemeColors(); + const { textColor, backgroundOffset, backgroundColor } = GetThemeColors(); const { theme, darkModeType } = useGlobalThemeContext(); const { spentTotal, spentTxCount } = useAnalytics(); const { t } = useTranslation(); @@ -205,18 +205,13 @@ export default function AnalyticsBudgetPage() { - + {/* Spent this month */} @@ -238,17 +233,12 @@ export default function AnalyticsBudgetPage() { - + {/* Left to spend */} @@ -265,7 +255,7 @@ export default function AnalyticsBudgetPage() { @@ -297,13 +287,17 @@ const styles = StyleSheet.create({ statusText: { fontSize: SIZES.smedium, fontFamily: FONT.Title_Regular, + includeFontPadding: false, }, statusDivider: { fontSize: SIZES.smedium, + fontFamily: FONT.Title_Regular, + includeFontPadding: false, }, statusPeriod: { fontSize: SIZES.smedium, fontFamily: FONT.Title_Regular, + includeFontPadding: false, }, circleContainer: { width: CIRCLE_SIZE, @@ -329,10 +323,6 @@ const styles = StyleSheet.create({ includeFontPadding: false, opacity: HIDDEN_OPACITY, }, - circleCenterAmount: { - fontSize: SIZES.large, - textAlign: 'center', - }, statsCard: { width: '100%', borderRadius: 16, @@ -370,11 +360,11 @@ const styles = StyleSheet.create({ gap: 8, }, statsValue: { - fontSize: SIZES.smedium, textAlign: 'right', + includeFontPadding: false, }, divider: { - height: StyleSheet.hairlineWidth, + height: 2, marginHorizontal: 16, }, }); diff --git a/app/components/admin/homeComponents/analytics/analyticsCreateBudgetPage.js b/app/components/admin/homeComponents/analytics/analyticsCreateBudgetPage.js index 354e7e2a..2cea0e87 100644 --- a/app/components/admin/homeComponents/analytics/analyticsCreateBudgetPage.js +++ b/app/components/admin/homeComponents/analytics/analyticsCreateBudgetPage.js @@ -34,8 +34,8 @@ export default function AnalyticsCreateBudgetPage() { const formattedPresetAmount = userBalanceDenomination === 'fiat' - ? numberConverter(existingBudget?.amount, 'fiat', 2, fiatStats) - : existingBudget?.amount; + ? numberConverter(existingBudget?.amount || 0, 'fiat', 2, fiatStats) + : existingBudget?.amount || 0; const [amountValue, setAmountValue] = useState( existingBudget?.amount ? String(formattedPresetAmount) : '', diff --git a/app/components/admin/homeComponents/analytics/balancePieChart.js b/app/components/admin/homeComponents/analytics/balancePieChart.js index c3ab087a..7ba22f4d 100644 --- a/app/components/admin/homeComponents/analytics/balancePieChart.js +++ b/app/components/admin/homeComponents/analytics/balancePieChart.js @@ -185,7 +185,7 @@ export default function BalancePieChart() { { + if (!isUSD) return totalNative; + if (price <= 0) return 0; + return Math.round(dollarsToSats(totalNative / 100, price)); + }, [isUSD, totalNative, price]); + + const { + canPayBTC, + canPayUSD, + errorMessage: balanceErrorMessage, + } = useMemo(() => { + if (paymentType !== 'send' || totalAmountSats <= 0) { + return { canPayBTC: true, canPayUSD: true, errorMessage: null }; + } + return validateSplitPayment({ + totalSats: totalAmountSats, + paymentCurrency, + bitcoinBalance, + dollarBalanceSat, + swapLimits, + price, + masterInfoObject, + swapUSDPriceDollars, + t, + }); + }, [ + paymentType, + totalAmountSats, + paymentCurrency, + bitcoinBalance, + dollarBalanceSat, + swapLimits, + price, + masterInfoObject, + swapUSDPriceDollars, + t, + ]); + const canConfirm = useMemo(() => { if (totalNative <= 0) return false; if (!memo.trim()) return false; + if (paymentType === 'send' && !canPayBTC && !canPayUSD) return false; if (splitMode === 'even') return perPersonNative > 0; // custom: every contact must have a valid positive integer and sum must equal total const allSet = selectedContacts.every(c => { @@ -168,30 +213,49 @@ export default function CreateSplitBill(props) { selectedContacts, customAmounts, customTotal, + paymentType, + canPayBTC, + canPayUSD, ]); const buildRecipients = useCallback(() => { return selectedContacts.map((contact, index) => { + const isLast = index === selectedContacts.length - 1; + if (isUSD) { - const amountCents = - splitMode === 'even' - ? perPersonNative - : typeof customAmounts[contact.uuid] === 'number' - ? customAmounts[contact.uuid] - : parseInt(customAmounts[contact.uuid] || '0', 10); + let amountCents; + if (splitMode === 'even') { + amountCents = isLast + ? totalNative - perPersonNative * (selectedContacts.length - 1) + : perPersonNative; + } else { + amountCents = parseInt(customAmounts[contact.uuid] || '0', 10); + } const amountSat = dollarsToSats( amountCents / 100, poolInfoRef.currentPriceAInB, ); return { contact, amountSats: amountSat, amountCents, currency: 'USD' }; } - const amountSats = - splitMode === 'even' - ? perPersonNative - : parseInt(customAmounts[contact.uuid] || '0', 10); + + let amountSats; + if (splitMode === 'even') { + amountSats = isLast + ? totalNative - perPersonNative * (selectedContacts.length - 1) + : perPersonNative; + } else { + amountSats = parseInt(customAmounts[contact.uuid] || '0', 10); + } return { contact, amountSats, amountCents: null, currency: 'BTC' }; }); - }, [selectedContacts, splitMode, perPersonNative, customAmounts, isUSD]); + }, [ + selectedContacts, + isUSD, + splitMode, + perPersonNative, + totalNative, + customAmounts, + ]); const handleConfirm = useCallback(async () => { if (totalNative <= 0) { @@ -208,7 +272,7 @@ export default function CreateSplitBill(props) { }); return; } - if (splitMode === 'custom' && !canConfirm) { + if ((splitMode === 'custom' && !canConfirm) || perPersonNative <= 0) { navigate.navigate('ErrorScreen', { errorMessage: t('contacts.splitBill.errors.noAmount', { context: 'custom', @@ -216,7 +280,7 @@ export default function CreateSplitBill(props) { }); return; } - if (!canConfirm || isLoading) return; + if (isLoading) return; const recipients = buildRecipients(); @@ -257,6 +321,11 @@ export default function CreateSplitBill(props) { setIsLoading(false); } } else { + if (balanceErrorMessage) { + navigate.navigate('ErrorScreen', { errorMessage: balanceErrorMessage }); + return; + } + const docIds = recipients.map(r => r.contact.uuid); const users = await getDocsByIds('blitzWalletUsers', docIds); @@ -294,7 +363,6 @@ export default function CreateSplitBill(props) { ); } }, [ - canConfirm, isLoading, buildRecipients, paymentType, @@ -306,7 +374,11 @@ export default function CreateSplitBill(props) { navigate, t, totalSatsInt, + totalCentsInt, splitMode, + canConfirm, + balanceErrorMessage, + perPersonNative, ]); const contactElements = useMemo(() => { @@ -322,7 +394,12 @@ export default function CreateSplitBill(props) { const amountChip = isUSD ? ( 0 ? `$${(contactAmount / 100).toFixed(2)}` : '$0.00' } @@ -330,7 +407,10 @@ export default function CreateSplitBill(props) { ) : ( ); @@ -341,6 +421,8 @@ export default function CreateSplitBill(props) { @@ -389,6 +471,8 @@ export default function CreateSplitBill(props) { isUSD, textInputBackground, t, + textColor, + textInputColor, ]); return ( diff --git a/app/components/admin/homeComponents/contacts/sendAndRequestPage.js b/app/components/admin/homeComponents/contacts/sendAndRequestPage.js index 1e46bbe9..92c1f67c 100644 --- a/app/components/admin/homeComponents/contacts/sendAndRequestPage.js +++ b/app/components/admin/homeComponents/contacts/sendAndRequestPage.js @@ -934,14 +934,19 @@ const styles = StyleSheet.create({ gap: 10, marginBottom: CONTENT_KEYBOARD_OFFSET, }, - splitPayContainer: { flexDirection: 'row', alignItems: 'center', gap: 5 }, + splitPayContainer: { + flexDirection: 'row', + alignItems: 'center', + gap: 5, + paddingHorizontal: 5, + }, splitPayIcon: { width: 25, height: 25, alignItems: 'center', justifyContent: 'center', position: 'absolute', - right: -30, + right: -25, }, contactListLetterImage: { height: 60, diff --git a/app/components/admin/homeComponents/gifts/createGiftDuration.js b/app/components/admin/homeComponents/gifts/createGiftDuration.js index 3ef572de..6338154d 100644 --- a/app/components/admin/homeComponents/gifts/createGiftDuration.js +++ b/app/components/admin/homeComponents/gifts/createGiftDuration.js @@ -57,6 +57,7 @@ import { useTranslation } from 'react-i18next'; import DropdownMenu from '../../../../functions/CustomElements/dropdownMenu'; import { BTC_ASSET_ADDRESS, + calculateFlashnetAmountIn, dollarsToSats, executeSwap, getUserSwapHistory, @@ -678,24 +679,25 @@ export default function CreateGiftDuration(props) { // and the amountOut guard below will catch it with a clean error. const totalAmountIn = determinePaymentMethod === 'BTC' - ? Math.min( - Math.round( + ? calculateFlashnetAmountIn({ + // base = target output + explicit pool fee; buffer adds the integrator margin + baseAmountIn: totalSatAmount + + Math.round( dollarsToSats( Number(simulation.feePaidAssetIn) / Math.pow(10, 6), - ) + - totalSatAmount * (INTEGRATOR_FEE + 0.005), - ), - bitcoinBalance, - ) - : Math.min( - Math.round( - totalFiatAmount + - Number(simulation.feePaidAssetIn) + - totalFiatAmount * 0.005, - ), - dollarBalanceToken * Math.pow(10, 6), - ); + ), + ), + isUsdAssetIn: false, + maxBalance: bitcoinBalance, + }) + : calculateFlashnetAmountIn({ + // base = target output + explicit pool fee in microdollars + baseAmountIn: + totalFiatAmount + Number(simulation.feePaidAssetIn), + isUsdAssetIn: true, + maxBalance: dollarBalanceToken * Math.pow(10, 6), + }); const executionResponse = await executeSwap(currentWalletMnemoinc, { poolId: poolInfoRef.lpPublicKey, diff --git a/app/components/admin/homeComponents/sendBitcoin/confirmSplitPayment.js b/app/components/admin/homeComponents/sendBitcoin/confirmSplitPayment.js index 3e9c51d4..86f8be79 100644 --- a/app/components/admin/homeComponents/sendBitcoin/confirmSplitPayment.js +++ b/app/components/admin/homeComponents/sendBitcoin/confirmSplitPayment.js @@ -1,10 +1,8 @@ -import { StyleSheet, View, TouchableOpacity, ScrollView } from 'react-native'; +import { StyleSheet, View, ScrollView, TouchableOpacity } from 'react-native'; import { CENTER, CONTENT_KEYBOARD_OFFSET, IS_SPARK_ID, - QUICK_PAY_STORAGE_KEY, - USDB_TOKEN_ID, } from '../../../../constants'; import { useCallback, useEffect, useRef, useState, useMemo } from 'react'; import { useGlobalContextProvider } from '../../../../../context-store/context'; @@ -13,14 +11,11 @@ import { ThemeText, } from '../../../../functions/CustomElements'; import SendTransactionFeeInfo from './components/feeInfo'; -import usePaymentValidation from './functions/paymentValidation'; import { useNavigation } from '@react-navigation/native'; import GetThemeColors from '../../../../hooks/themeColors'; import FormattedSatText from '../../../../functions/CustomElements/satTextDisplay'; -import FormattedBalanceInput from '../../../../functions/CustomElements/formattedBalanceInput'; import { useGlobalThemeContext } from '../../../../../context-store/theme'; import { useNodeContext } from '../../../../../context-store/nodeContext'; -import { useAppStatus } from '../../../../../context-store/appStatus'; import ErrorWithPayment from './components/errorScreen'; import SwipeButtonNew from '../../../../functions/CustomElements/sliderButton'; import { @@ -41,10 +36,7 @@ import { WINDOWWIDTH, } from '../../../../constants/theme'; import { SliderProgressAnimation } from '../../../../functions/CustomElements/sendPaymentAnimation'; -import { InputTypes } from 'bitcoin-address-parser'; import CustomSettingsTopBar from '../../../../functions/CustomElements/settingsTopBar'; -import { useWebView } from '../../../../../context-store/webViewContext'; -import { useGlobalInsets } from '../../../../../context-store/insetsProvider'; import { useGlobalContacts } from '../../../../../context-store/globalContacts'; import { useKeysContext } from '../../../../../context-store/keys'; import { useUserBalanceContext } from '../../../../../context-store/userBalanceContext'; @@ -53,8 +45,8 @@ import { useFlashnet } from '../../../../../context-store/flashnetContext'; import SwapRatesChangedState from './components/swapRatesChangedState'; import { BTC_ASSET_ADDRESS, + calculateFlashnetAmountIn, INTEGRATOR_FEE, - SEND_AMOUNT_INCREASE_BUFFER, USD_ASSET_ADDRESS, dollarsToSats, executeSwap, @@ -62,24 +54,20 @@ import { satsToDollars, simulateSwap, } from '../../../../functions/spark/flashnet'; -import convertTextInputValue from '../../../../functions/textInputConvertValue'; -import usePaymentMethodSelection from '../../../../hooks/usePaymentMethodSelection'; -import { useBudgetWarning } from '../../../../hooks/useBudgetWarning'; -import usePaymentInputDisplay from '../../../../hooks/usePaymentInputDisplay'; import { setFlashnetTransfer } from '../../../../functions/spark/handleFlashnetTransferIds'; import { getSingleTxDetails, getSparkPaymentStatus, } from '../../../../functions/spark'; +import { validateSplitPayment } from '../../../../functions/payments/validateSplitPayment'; +import FormattedBalanceInput from '../../../../functions/CustomElements/formattedBalanceInput'; +import usePaymentInputDisplay from '../../../../hooks/usePaymentInputDisplay'; export default function ConfirmSplitPayment(props) { - console.log('CONFIRM SEND PAYMENT SCREEN'); const navigate = useNavigation(); const { enteredPaymentInfo = {}, errorMessage, - contactInfo, - masterTokenInfo = {}, selectedPaymentMethod = '', preSelectedPaymentMethod, splitRecipients, @@ -88,207 +76,58 @@ export default function ConfirmSplitPayment(props) { const isUSDSplit = paymentCurrency === 'USD'; - console.log(isUSDSplit, 'tesint'); - const { poolInfoRef, swapLimits, swapUSDPriceDollars } = useFlashnet(); const { t } = useTranslation(); const { bitcoinBalance, dollarBalanceSat, dollarBalanceToken } = useUserBalanceContext(); - const { sendWebViewRequest } = useWebView(); const { currentWalletMnemoinc } = useActiveCustodyAccount(); - const { accountMnemoinc, contactsPrivateKey } = useKeysContext(); - const { sparkInformation, showTokensInformation, sparkInfoRef } = - useSparkWallet(); + const { contactsPrivateKey } = useKeysContext(); + const { sparkInformation } = useSparkWallet(); const { masterInfoObject } = useGlobalContextProvider(); - const { liquidNodeInformation, fiatStats } = useNodeContext(); - + const { fiatStats } = useNodeContext(); const { globalContactsInformation } = useGlobalContacts(); const { theme, darkModeType } = useGlobalThemeContext(); const { textColor, backgroundOffset, backgroundColor } = GetThemeColors(); - const didWarnAboutBudget = useRef(null); - const [rerenderInput, setRerenderInput] = useState(0); - const [isAmountFocused, setIsAmountFocused] = useState(true); - const [showProgressAnimation, setShowProgressAnimation] = useState(false); - const progressAnimationRef = useRef(null); - const hasTriggeredFastPay = useRef(false); - const convertedSendAmountRef = useRef(null); - const determinePaymentMethodRef = useRef(null); - const didRequireChoiceRef = useRef(false); - const uiStateRef = useRef(null); - const primaryDisplayRef = useRef(null); - const conversionFiatStatsRef = useRef(null); - const swapFeeKeyRef = useRef(null); - - // Drives the SWAP_RATES_CHANGED uiState when Flashnet rate drift breaks swap viability. - const [rateChangeDetected, setRateChangeDetected] = useState(false); - // Captures swapUSDPriceDollars on CONFIRM_PAYMENT entry (ref = no extra re-render). + const isSendingPayment = useRef(null); const rateAtConfirmEntryRef = useRef(null); + const swapFeeKeyRef = useRef(null); + const progressAnimationRef = useRef(null); - const [didSelectPaymentMethod, setDidSelectPaymentMethod] = useState(false); - const [isDecoding, setIsDecoding] = useState(false); - const [paymentInfo, setPaymentInfo] = useState({}); - const prevSelectedPaymentInfo = useRef({ - preSelectedPaymentMethod, - enteredInfo: enteredPaymentInfo?.inputCurrency, - selectedPaymentMethod, - }); - - const paymentMode = - preSelectedPaymentMethod === 'USD' || - enteredPaymentInfo?.inputCurrency === 'USD' || - selectedPaymentMethod === 'USD' - ? 'USD' - : 'BTC'; - + const [sendingMethod, setSendingMethod] = useState(null); // 'BTC' | 'USD' + const [methodConfirmed, setMethodConfirmed] = useState(false); + const [paymentFee, setPaymentFee] = useState(0); + const [swapPaymentQuote, setSwapPaymentQuote] = useState({}); + const [rateChangeDetected, setRateChangeDetected] = useState(false); + const [showProgressAnimation, setShowProgressAnimation] = useState(false); + const [isCalculatingFeeQuote, setIsCalculatingFeeQuote] = useState(false); const [userSetInputDenomination, setUserSetInputDenomination] = useState(null); - const inputDenomination = userSetInputDenomination ? userSetInputDenomination - : paymentMode === 'USD' + : isUSDSplit ? 'fiat' - : masterInfoObject.userBalanceDenomination !== 'fiat' - ? 'sats' - : 'fiat'; + : 'sats'; - const inputDenominationRef = useRef(inputDenomination); - const [paymentDescription, setPaymentDescription] = useState(''); - const isSendingPayment = useRef(null); - const userPaymentMethod = selectedPaymentMethod || preSelectedPaymentMethod; - const combinedPaymentDescription = - paymentDescription || - paymentInfo?.data?.label || - paymentInfo?.data?.message || - ''; + // ── Derived totals ────────────────────────────────────────────────────────── - // Payment type flags - const isLightningPayment = paymentInfo?.paymentNetwork === 'lightning'; - const isLiquidPayment = paymentInfo?.paymentNetwork === 'liquid'; - const isBitcoinPayment = paymentInfo?.paymentNetwork === 'Bitcoin'; - const isSparkPayment = paymentInfo?.paymentNetwork === 'spark'; - const isLNURLPayment = paymentInfo?.type === InputTypes.LNURL_PAY; + const totalSplitSats = useMemo( + () => + Math.round( + splitRecipients?.reduce((sum, r) => sum + (r.amountSats || 0), 0), + ) || 0, + [splitRecipients], + ); - const isBTCdenominated = - inputDenomination === 'hidden' || inputDenomination === 'sats'; - - const enabledLRC20 = showTokensInformation; - const defaultToken = enabledLRC20 - ? masterInfoObject?.defaultSpendToken || 'Bitcoin' - : 'Bitcoin'; - - const tokensObject = sparkInformation?.tokens ?? {}; - const tokensList = useMemo(() => { - return Object.entries(tokensObject) - .filter(token => { - const [key, value] = token; - return !!value?.balance; - }) - .map(item => item[0]); - }, [tokensObject]); - - const useFullTokensDisplay = - (tokensList.length >= 2 || - (tokensList.length === 1 && !tokensList.includes(USDB_TOKEN_ID)) || - (masterInfoObject.enabledBTKNTokens && tokensList.length)) && - isSparkPayment && - paymentInfo?.data?.expectedToken !== USDB_TOKEN_ID && - !contactInfo; - - const showSendMax = !dollarBalanceSat && !bitcoinBalance; - - const totalSplitSats = useMemo(() => { - return ( - splitRecipients?.reduce((sum, r) => sum + (r.amountSats || 0), 0) || 0 - ); - }, [splitRecipients]); - - const totalSplitCents = useMemo(() => { + const totalSplitDollars = useMemo(() => { if (!isUSDSplit) return 0; - return ( - splitRecipients?.reduce((sum, r) => sum + (r.amountCents || 0), 0) || 0 + const cents = splitRecipients?.reduce( + (sum, r) => sum + (r.amountCents || 0), + 0, ); + return (cents || 0) / 100; }, [isUSDSplit, splitRecipients]); - const totalSplitDollars = totalSplitCents / 100; - - // finds the true min swap amount - const min_usd_swap_amount = useMemo(() => { - return Math.round( - dollarsToSats(swapLimits.usd, poolInfoRef.currentPriceAInB), - ); - }, [poolInfoRef.currentPriceAInB, swapLimits]); - - const minLNURLSatAmount = isLNURLPayment - ? paymentInfo?.data?.minSendable / 1000 - : 0; - const maxLNURLSatAmount = isLNURLPayment - ? paymentInfo?.data?.maxSendable / 1000 - : 0; - - const selectedLRC20Asset = masterTokenInfo?.tokenName || defaultToken; - const seletctedToken = - masterTokenInfo?.details || - sparkInformation?.tokens?.[selectedLRC20Asset] || - {}; - const tokenDecimals = seletctedToken?.tokenMetadata?.decimals ?? 0; - const tokenBalance = seletctedToken?.balance ?? 0; - const sparkBalance = sparkInformation?.balance ?? 0; - const isUsingLRC20 = selectedLRC20Asset?.toLowerCase() !== 'bitcoin'; - - const sendingAmount = paymentInfo?.sendAmount || 0; - const canEditAmount = paymentInfo?.canEditPayment === true; - - const paymentFee = - (paymentInfo?.paymentFee || 0) + (paymentInfo?.supportFee || 0); - console.log(paymentInfo, 'payment info'); - - const { - determinePaymentMethod, - needsToChoosePaymentMethod, - hasBothUSDAndBitcoinBalance, - } = usePaymentMethodSelection({ - paymentInfo, - paymentFee, - sparkBalance, - bitcoinBalance, - dollarBalanceSat, - dollarBalanceToken, - convertedSendAmount, - min_usd_swap_amount, - swapLimits, - isUsingLRC20, - useFullTokensDisplay, - selectedPaymentMethod: userPaymentMethod, - didSelectPaymentMethod, - sparkInformation, - }); - - const { determinePaymentMethod: determinePaymentMethodForChoice } = - usePaymentMethodSelection({ - paymentInfo, - paymentFee, - sparkBalance, - bitcoinBalance, - dollarBalanceSat, - dollarBalanceToken, - convertedSendAmount, - min_usd_swap_amount, - swapLimits, - isUsingLRC20, - useFullTokensDisplay, - selectedPaymentMethod: '', - didSelectPaymentMethod: false, - sparkInformation, - }); - - // For split payments, allow CHOOSE_METHOD even with a preselected method - const shouldShowChooseMethod = - determinePaymentMethodForChoice === 'user-choice' && - !didSelectPaymentMethod && - !isUsingLRC20 && - hasBothUSDAndBitcoinBalance; - const { primaryDisplay, secondaryDisplay, @@ -298,11 +137,7 @@ export default function ConfirmSplitPayment(props) { getNextDenomination, convertForToggle, } = usePaymentInputDisplay({ - paymentMode: - enteredPaymentInfo?.fromContacts && - !enteredPaymentInfo?.payingContactsRequest - ? paymentMode - : determinePaymentMethod, + paymentMode: paymentCurrency, inputDenomination, fiatStats, usdFiatStats: { coin: 'USD', value: swapUSDPriceDollars }, @@ -310,259 +145,301 @@ export default function ConfirmSplitPayment(props) { isSendingPayment: isSendingPayment.current, }); - const displayAmount = canEditAmount - ? sendingAmount // User is editing, so sendingAmount is in current display denomination - : convertSatsToDisplay(sendingAmount); // Fixed from invoice, convert sats to display + const displayAmount = convertSatsToDisplay(totalSplitSats); - const convertedSendAmount = !isUsingLRC20 - ? canEditAmount - ? convertDisplayToSats(sendingAmount) // User entered amount, convert to sats - : Number(sendingAmount) // Fixed invoice amount, already in sats - : Number(sendingAmount); + const handleDenominationToggle = () => { + // For fixed amounts, just change the display denomination + const nextDenom = getNextDenomination(); + setUserSetInputDenomination(nextDenom); + // No need to convert sendingAmount - it stays in sats + // The display will automatically update via convertSatsToDisplay + }; - // use stablepool info ref so the fiat amount doesnt change in between inputs leading to a false amount being sent. - const fiatValueConvertedSendAmount = Math.round( - satsToDollars( - convertedSendAmount, - enteredPaymentInfo?.stablePoolInfoRef?.currentPriceAInB || - poolInfoRef.currentPriceAInB, - ).toFixed(2) * Math.pow(10, 6), - ); + // ── Balance validation ────────────────────────────────────────────────────── - const { shouldWarn } = useBudgetWarning(convertedSendAmount); - - useEffect(() => { - primaryDisplayRef.current = primaryDisplay; - }, [primaryDisplay]); - useEffect(() => { - conversionFiatStatsRef.current = conversionFiatStats; - }, [conversionFiatStats]); - - useEffect(() => { - determinePaymentMethodRef.current = determinePaymentMethod; - }, [determinePaymentMethod]); - - useEffect(() => { - inputDenominationRef.current = inputDenomination; - }, [inputDenomination]); - - useEffect(() => { - if (shouldShowChooseMethod && !didRequireChoiceRef.current) { - didRequireChoiceRef.current = true; - } - }, [shouldShowChooseMethod]); - - // Fast pay logic - const canUseFastPay = - sparkInformation.didConnect && - Object.keys(paymentInfo || {}).length > 0 && - masterInfoObject[QUICK_PAY_STORAGE_KEY]?.isFastPayEnabled && - masterInfoObject[QUICK_PAY_STORAGE_KEY]?.fastPayThresholdSats >= - convertedSendAmount && - !isUsingLRC20 && - (!didRequireChoiceRef.current || didSelectPaymentMethod) && - determinePaymentMethod !== 'user-choice' && - convertedSendAmount >= paymentFee; - - const receiverExpectsCurrency = paymentInfo?.data?.expectedReceive || 'sats'; - - const uiState = useMemo(() => { - if (canEditAmount && !isSendingPayment.current) { - return 'EDIT_AMOUNT'; // Show number pad + description input - } - - // Rate-change intercept: show before CHOOSE_METHOD / CONFIRM_PAYMENT so it - // takes over the screen whenever the Flashnet rate broke swap viability. - if (rateChangeDetected) { - return 'SWAP_RATES_CHANGED'; - } - - if ( - (shouldShowChooseMethod || !didSelectPaymentMethod) && - !isSendingPayment.current && - !isBitcoinPayment && - !isUsingLRC20 && - !canUseFastPay && - hasBothUSDAndBitcoinBalance - ) { - return 'CHOOSE_METHOD'; // Show info screen with button to select method - } - - return 'CONFIRM_PAYMENT'; // Show swipe button + const { canPayBTC, canPayUSD } = useMemo(() => { + const price = poolInfoRef.currentPriceAInB; + return validateSplitPayment({ + totalSats: totalSplitSats, + paymentCurrency, + bitcoinBalance, + dollarBalanceSat, + swapLimits, + price, + masterInfoObject, + swapUSDPriceDollars, + t, + }); + // swapUSDPriceDollars used as reactive proxy for price changes }, [ - canEditAmount, - rateChangeDetected, - shouldShowChooseMethod, - didSelectPaymentMethod, - isBitcoinPayment, - isUsingLRC20, - canUseFastPay, - hasBothUSDAndBitcoinBalance, - ]); - console.log( - shouldShowChooseMethod, - didSelectPaymentMethod, - isBitcoinPayment, - isUsingLRC20, - canUseFastPay, - hasBothUSDAndBitcoinBalance, - uiState, - ); - - useEffect(() => { - uiStateRef.current = uiState; - }, [uiState]); - - useEffect(() => { - if ( - uiState === 'CONFIRM_PAYMENT' && - shouldWarn && - !didWarnAboutBudget.current - ) { - didWarnAboutBudget.current = true; - navigate.navigate('CustomHalfModal', { - wantedContent: 'nearBudgetLimitWarning', - sliderHight: 0.6, - sendingAmount: convertedSendAmount, - }); - } - }, [uiState, shouldWarn, convertedSendAmount]); - - useEffect(() => { - if ( - prevSelectedPaymentInfo.current.preSelectedPaymentMethod !== - preSelectedPaymentMethod || - prevSelectedPaymentInfo.current.enteredInfo !== - enteredPaymentInfo?.inputCurrency || - prevSelectedPaymentInfo.current.selectedPaymentMethod !== - selectedPaymentMethod - ) { - console.log( - 'Payment method or input currency changed, resetting payment info', - ); - if (uiStateRef.current !== 'EDIT_AMOUNT') return; - console.log('Resetting payment info for new selection'); - setPaymentInfo(prev => ({ - ...prev, - sendAmount: '', - })); - setUserSetInputDenomination(null); - prevSelectedPaymentInfo.current = { - preSelectedPaymentMethod, - enteredInfo: enteredPaymentInfo?.inputCurrency, - selectedPaymentMethod, - }; - } - }, [ - preSelectedPaymentMethod, - enteredPaymentInfo?.inputCurrency, - selectedPaymentMethod, - ]); - - const paymentValidation = usePaymentValidation({ - paymentInfo, - convertedSendAmount, - paymentFee, - determinePaymentMethod, - selectedPaymentMethod: userPaymentMethod, + totalSplitSats, + paymentCurrency, bitcoinBalance, dollarBalanceSat, - dollarBalanceToken, - min_usd_swap_amount, swapLimits, - isUsingLRC20, - seletctedToken, - minLNURLSatAmount, - maxLNURLSatAmount, - isDecoding, - canEditAmount, - t, masterInfoObject, - fiatStats, - inputDenomination: primaryDisplay.denomination, - primaryDisplay, - conversionFiatStats, - sparkInformation, - }); - console.log(paymentValidation, 'pv'); + swapUSDPriceDollars, + swapUSDPriceDollars, + ]); + + console.log(canPayBTC, canPayUSD, 'testing'); + + // ── Auto-select / initialize sending method on mount ─────────────────────── + + useEffect(() => { + if (canPayBTC && !canPayUSD) { + setSendingMethod('BTC'); + setMethodConfirmed(true); + } else if (canPayUSD && !canPayBTC) { + setSendingMethod('USD'); + setMethodConfirmed(true); + } else { + // Both viable — default to the pre-selected method for the picker display + const pre = selectedPaymentMethod || preSelectedPaymentMethod; + setSendingMethod(pre === 'USD' ? 'USD' : 'BTC'); + } + }, []); + + // ── Watch route params for method selection returning from modal ──────────── + + useEffect(() => { + const method = props.route.params?.selectedPaymentMethod; + if (method === 'BTC' && canPayBTC) setSendingMethod('BTC'); + else if (method === 'USD' && canPayUSD) setSendingMethod('USD'); + }, [props.route.params?.selectedPaymentMethod, canPayBTC, canPayUSD]); + + // ── UI state machine ──────────────────────────────────────────────────────── + + const uiState = useMemo(() => { + if (rateChangeDetected) return 'SWAP_RATES_CHANGED'; + if (!methodConfirmed) return 'CHOOSE_METHOD'; + return 'CONFIRM_PAYMENT'; + }, [rateChangeDetected, methodConfirmed]); + + // ── Swap detection ────────────────────────────────────────────────────────── + + const needsSwap = + (isUSDSplit && sendingMethod === 'BTC') || + (!isUSDSplit && sendingMethod === 'USD'); + + const swapQuoteReady = + !needsSwap || + (!!swapPaymentQuote && Object.keys(swapPaymentQuote).length > 0); const canSendPayment = - paymentValidation.canProceed && - sendingAmount !== 0 && - uiState === 'CONFIRM_PAYMENT'; + uiState === 'CONFIRM_PAYMENT' && + totalSplitSats > 0 && + swapQuoteReady && + !isSendingPayment.current; - const isUsingFastPay = canUseFastPay && canSendPayment && !canEditAmount; + // ── Swap fee calculation ──────────────────────────────────────────────────── - // Rate-sensitive swap path: only Flashnet swaps (USD→BTC / BTC→USDB) are affected - // by live rate changes. Mirrors needsSwap in paymentValidation. - const needsRateSwap = - (determinePaymentMethod === 'USD' && receiverExpectsCurrency === 'sats') || - (determinePaymentMethod === 'BTC' && receiverExpectsCurrency === 'tokens'); + const min_usd_swap_amount = useMemo( + () => + Math.round(dollarsToSats(swapLimits.usd, poolInfoRef.currentPriceAInB)), + [swapUSDPriceDollars, swapLimits], + ); + + useEffect(() => { + let cancelled = false; + + const clearSwapFee = () => { + swapFeeKeyRef.current = null; + setPaymentFee(0); + setSwapPaymentQuote({}); + setIsCalculatingFeeQuote(false); + }; + + const runSwapFeeCalc = async () => { + try { + if (isSendingPayment.current) return; + if (!poolInfoRef?.currentPriceAInB || !poolInfoRef?.lpPublicKey) return; + if (!sendingMethod || !needsSwap) { + clearSwapFee(); + return; + } + setIsCalculatingFeeQuote(true); + + const price = poolInfoRef.currentPriceAInB; + + if (!isUSDSplit && sendingMethod === 'USD') { + // USD→BTC swap: user pays USD, recipients get BTC + const shortfallSats = totalSplitSats; + if (shortfallSats <= 0) { + clearSwapFee(); + return; + } + + const key = `usd-btc:${shortfallSats}:${price}:${dollarBalanceSat}`; + if (swapFeeKeyRef.current === key) return; + swapFeeKeyRef.current = key; + + const amountToSendConversion = satsToDollars(shortfallSats, price); + const usdBalanceConversion = satsToDollars(dollarBalanceSat, price); + + const maxAmount = Math.min( + amountToSendConversion, + usdBalanceConversion, + ); + const usdAmount = Math.ceil(maxAmount.toFixed(2) * Math.pow(10, 6)); + + const result = await simulateSwap(currentWalletMnemoinc, { + poolId: poolInfoRef.lpPublicKey, + assetInAddress: USD_ASSET_ADDRESS, + assetOutAddress: BTC_ASSET_ADDRESS, + amountIn: usdAmount, + }); + + if (cancelled) return; + if (!result?.didWork) { + clearSwapFee(); + return; + } + + const fees = result.simulation.feePaidAssetIn; + const satFee = Math.round( + dollarsToSats(fees / Math.pow(10, 6), price), + ); + + setPaymentFee(satFee); + setSwapPaymentQuote({ + ...result.simulation, + warn: parseFloat(result.simulation.priceImpact) > 3, + poolId: poolInfoRef.lpPublicKey, + assetInAddress: USD_ASSET_ADDRESS, + assetOutAddress: BTC_ASSET_ADDRESS, + amountIn: usdAmount, + satFee, + bitcoinBalance, + dollarBalanceSat, + }); + } + + if (isUSDSplit && sendingMethod === 'BTC') { + // BTC→USD swap: user pays BTC, recipients get USD + const satAmount = Math.round(dollarsToSats(totalSplitDollars, price)); + if (satAmount <= 0) { + clearSwapFee(); + return; + } + + const key = `btc-usd:${satAmount}:${price}:${bitcoinBalance}`; + if (swapFeeKeyRef.current === key) return; + swapFeeKeyRef.current = key; + + const result = await simulateSwap(currentWalletMnemoinc, { + poolId: poolInfoRef.lpPublicKey, + assetInAddress: BTC_ASSET_ADDRESS, + assetOutAddress: USD_ASSET_ADDRESS, + amountIn: satAmount, + }); + + if (cancelled) return; + if (!result?.didWork) { + clearSwapFee(); + return; + } + + const fees = Number(result.simulation.feePaidAssetIn); + const satFee = Math.round( + dollarsToSats(fees / Math.pow(10, 6), price) + + satAmount * INTEGRATOR_FEE, + ); + + setPaymentFee(satFee); + setSwapPaymentQuote({ + ...result.simulation, + warn: parseFloat(result.simulation.priceImpact) > 3, + poolId: poolInfoRef.lpPublicKey, + assetInAddress: BTC_ASSET_ADDRESS, + assetOutAddress: USD_ASSET_ADDRESS, + amountIn: satAmount, + satFee, + bitcoinBalance, + dollarBalanceSat, + }); + } + } catch (err) { + console.log('error calculating fee quote', err); + } finally { + setIsCalculatingFeeQuote(false); + } + }; + + runSwapFeeCalc(); + return () => { + cancelled = true; + }; + }, [ + sendingMethod, + needsSwap, + isUSDSplit, + poolInfoRef, + totalSplitSats, + totalSplitDollars, + bitcoinBalance, + dollarBalanceSat, + min_usd_swap_amount, + swapLimits.bitcoin, + currentWalletMnemoinc, + ]); + + // ── Rate-change detection ─────────────────────────────────────────────────── - // Snapshot + detection effect. - // Captures the rate on CONFIRM_PAYMENT entry; when a subsequent rate tick - // breaks swap viability (convertedSendAmount shrinks, min_usd_swap_amount rises), - // sets rateChangeDetected → transitions to SWAP_RATES_CHANGED uiState. - // Resets completely when the user leaves the confirm flow. useEffect(() => { if (uiState === 'CONFIRM_PAYMENT') { - // Capture rate once on entry if (rateAtConfirmEntryRef.current === null) { rateAtConfirmEntryRef.current = swapUSDPriceDollars; } - // Detect drift that broke viability if ( rateAtConfirmEntryRef.current !== null && swapUSDPriceDollars !== rateAtConfirmEntryRef.current && - !paymentValidation.canProceed && - needsRateSwap && + needsSwap && + !canSendPayment && !isSendingPayment.current ) { setRateChangeDetected(true); } } else if (uiState !== 'SWAP_RATES_CHANGED') { - // Leaving the confirm flow entirely (EDIT / CHOOSE / back) — full reset. - // Guard against SWAP_RATES_CHANGED so the state doesn't clear itself. rateAtConfirmEntryRef.current = null; setRateChangeDetected(false); } - }, [ - uiState, - swapUSDPriceDollars, - paymentValidation.canProceed, - needsRateSwap, - ]); + }, [uiState, swapUSDPriceDollars, canSendPayment, needsSwap]); + + // ── Handlers ──────────────────────────────────────────────────────────────── const handleRateChangedReset = useCallback(() => { rateAtConfirmEntryRef.current = null; setRateChangeDetected(false); - if (isLNURLPayment || isSparkPayment) { - // Full reset — mirrors hasParamsChanged effect sequence exactly - setIsAmountFocused(true); - setPaymentInfo({}); - isSendingPayment.current = null; - setPaymentDescription(''); - hasTriggeredFastPay.current = false; - didRequireChoiceRef.current = false; - setUserSetInputDenomination(null); - setDidSelectPaymentMethod(false); - setShowProgressAnimation(false); - } else { - navigate.goBack(); - } - }, [ - isLNURLPayment, - isSparkPayment, - navigate, - sparkInformation.didConnect, - sparkInformation.identityPubKey, - t, - ]); + setMethodConfirmed(false); + setSendingMethod( + canPayBTC && !canPayUSD + ? 'BTC' + : canPayUSD && !canPayBTC + ? 'USD' + : sendingMethod, + ); + }, [canPayBTC, canPayUSD, sendingMethod]); + + const handleSelectPaymentMethod = useCallback( + showNextScreen => { + if (showNextScreen) { + if (!sendingMethod) return; + setMethodConfirmed(true); + } else { + navigate.navigate('CustomHalfModal', { + wantedContent: 'SelectPaymentMethod', + selectedPaymentMethod: sendingMethod || 'user-choice', + fromPage: 'ConfirmSplitPayment', + }); + } + }, + [navigate, sendingMethod], + ); const errorMessageNavigation = useCallback( reason => { navigate.navigate('ConfirmSplitPayment', { - comingFromAccept: null, enteredPaymentInfo: {}, splitRecipients, errorMessage: @@ -573,261 +450,10 @@ export default function ConfirmSplitPayment(props) { [navigate, t, splitRecipients], ); - useEffect(() => { - convertedSendAmountRef.current = convertedSendAmount; - }, [convertedSendAmount]); - - // Pre-populate paymentInfo for split payments so amount display shows the total - useEffect(() => { - if (isUSDSplit) { - const totalCents = splitRecipients.reduce( - (sum, r) => sum + (r.amountCents ?? 0), - 0, - ); - const price = poolInfoRef?.currentPriceAInB; - const approxSats = - price > 0 ? Math.round(dollarsToSats(totalCents / 100, price)) : 0; - setPaymentInfo({ - paymentNetwork: 'spark', - sendAmount: approxSats, - canEditPayment: false, - data: { - expectedReceive: 'tokens', - }, - }); - return; - } - const totalSats = - splitRecipients?.reduce((sum, r) => sum + r.amountSats, 0) || 0; - setPaymentInfo({ - paymentNetwork: 'spark', - sendAmount: totalSats, - canEditPayment: false, - data: { - expectedReceive: 'sats', - }, - }); - }, []); // eslint-disable-line react-hooks/exhaustive-deps - - // Calculate swap fee for split payments when funding source requires a swap. - useEffect(() => { - let cancelled = false; - - const clearSwapFee = () => { - swapFeeKeyRef.current = null; - setPaymentInfo(prev => { - if (!prev || !Object.keys(prev).length) return prev; - if ( - (prev.paymentFee || 0) === 0 && - (prev.supportFee || 0) === 0 && - (!prev.swapPaymentQuote || - Object.keys(prev.swapPaymentQuote).length === 0) - ) { - return prev; - } - return { - ...prev, - paymentFee: 0, - supportFee: 0, - swapPaymentQuote: {}, - }; - }); - }; - - const runSwapFeeCalc = async () => { - if (!poolInfoRef?.currentPriceAInB || !poolInfoRef?.lpPublicKey) return; - - if (!determinePaymentMethod || determinePaymentMethod === 'user-choice') { - clearSwapFee(); - return; - } - - const needsSwapForSplit = - (paymentCurrency === 'BTC' && determinePaymentMethod === 'USD') || - (paymentCurrency === 'USD' && determinePaymentMethod === 'BTC'); - - if (!needsSwapForSplit) { - clearSwapFee(); - return; - } - - const price = poolInfoRef.currentPriceAInB; - - if (paymentCurrency === 'BTC' && determinePaymentMethod === 'USD') { - const shortfallSatsReg = totalSplitSats; - - if (shortfallSatsReg <= 0 || shortfallSatsReg < min_usd_swap_amount) { - clearSwapFee(); - return; - } - - const shortfallSats = shortfallSatsReg; - - const key = `usd-btc:${shortfallSats}:${price}:${dollarBalanceSat}`; - if (swapFeeKeyRef.current === key) return; - swapFeeKeyRef.current = key; - - const amountToSendConversion = satsToDollars(shortfallSats, price); - const usdBalanceConversion = satsToDollars(dollarBalanceSat, price); - const maxAmount = Math.min( - amountToSendConversion, - usdBalanceConversion, - ); - const usdAmount = Math.ceil(maxAmount.toFixed(2) * Math.pow(10, 6)); - - const result = await simulateSwap(currentWalletMnemoinc, { - poolId: poolInfoRef.lpPublicKey, - assetInAddress: USD_ASSET_ADDRESS, - assetOutAddress: BTC_ASSET_ADDRESS, - amountIn: usdAmount, - }); - - if (cancelled) return; - if (!result?.didWork) { - clearSwapFee(); - return; - } - - const fees = result.simulation.feePaidAssetIn; - const satFee = Math.round(dollarsToSats(fees / Math.pow(10, 6), price)); - - setPaymentInfo(prev => ({ - ...prev, - paymentFee: satFee, - supportFee: 0, - swapPaymentQuote: { - warn: parseFloat(result.simulation.priceImpact) > 3, - poolId: poolInfoRef.lpPublicKey, - assetInAddress: USD_ASSET_ADDRESS, - assetOutAddress: BTC_ASSET_ADDRESS, - amountIn: usdAmount, - satFee, - bitcoinBalance, - dollarBalanceSat, - }, - })); - } - - if (paymentCurrency === 'USD' && determinePaymentMethod === 'BTC') { - const shortfallDollars = totalSplitDollars; - console.log(shortfallDollars, 'short fall dollar'); - if (shortfallDollars <= 0) { - clearSwapFee(); - return; - } - const shortFallSats = Math.round( - dollarsToSats(shortfallDollars, price), - ); - const satAmount = shortFallSats; - - console.log(satAmount, 'short fall sats'); - if (satAmount < swapLimits.bitcoin) { - clearSwapFee(); - return; - } - - const key = `btc-usd:${satAmount}:${price}:${bitcoinBalance}`; - if (swapFeeKeyRef.current === key) return; - swapFeeKeyRef.current = key; - - const result = await simulateSwap(currentWalletMnemoinc, { - poolId: poolInfoRef.lpPublicKey, - assetInAddress: BTC_ASSET_ADDRESS, - assetOutAddress: USD_ASSET_ADDRESS, - amountIn: satAmount, - }); - - if (cancelled) return; - if (!result?.didWork) { - clearSwapFee(); - return; - } - - const fees = Number(result.simulation.feePaidAssetIn); - let satFee = dollarsToSats(fees / Math.pow(10, 6), price); - satFee += satAmount * INTEGRATOR_FEE; - - setPaymentInfo(prev => ({ - ...prev, - paymentFee: Math.round(satFee), - supportFee: 0, - swapPaymentQuote: { - warn: parseFloat(result.simulation.priceImpact) > 3, - poolId: poolInfoRef.lpPublicKey, - assetInAddress: BTC_ASSET_ADDRESS, - assetOutAddress: USD_ASSET_ADDRESS, - amountIn: satAmount, - satFee: Math.round(satFee), - bitcoinBalance, - dollarBalanceSat, - }, - })); - } - }; - - runSwapFeeCalc(); - - return () => { - cancelled = true; - }; - }, [ - paymentCurrency, - paymentInfo, - isUsingLRC20, - poolInfoRef, - determinePaymentMethod, - totalSplitSats, - totalSplitDollars, - bitcoinBalance, - dollarBalanceToken, - dollarBalanceSat, - min_usd_swap_amount, - swapLimits.bitcoin, - currentWalletMnemoinc, - selectedPaymentMethod, - ]); - - // Fast pay auto-trigger - useEffect(() => { - if ( - !isUsingFastPay || - hasTriggeredFastPay.current || - isSendingPayment.current - ) - return; - - setShowProgressAnimation(true); - - if (progressAnimationRef.current) { - requestAnimationFrame(() => { - progressAnimationRef.current.startAtBeginning(); - }); - } - - const fastPayTrigger = setTimeout(() => { - hasTriggeredFastPay.current = true; - if (progressAnimationRef.current) { - progressAnimationRef.current.startProgress(); - } - sendPayment(); - }, 250); - - return () => { - clearTimeout(fastPayTrigger); - }; - }, [isUsingFastPay]); - - console.log(splitRecipients, 'split recitps'); - + // ── Payment execution ─────────────────────────────────────────────────────── + console.log(swapPaymentQuote); const sendPayment = useCallback(async () => { - if (!paymentValidation.isValid) { - const error = paymentValidation.getErrorMessage( - paymentValidation.primaryError, - ); - navigate.navigate('ErrorScreen', { errorMessage: error }); - return; - } - + if (!canSendPayment) return; if (isSendingPayment.current) return; isSendingPayment.current = true; @@ -837,79 +463,73 @@ export default function ConfirmSplitPayment(props) { const splitMemo = enteredPaymentInfo?.description || ''; let executionResponse; - const expectedReceiveType = paymentInfo?.data?.expectedReceive || 'sats'; - const needsSwap = - (determinePaymentMethod === 'USD' && expectedReceiveType === 'sats') || - (determinePaymentMethod === 'BTC' && expectedReceiveType === 'tokens'); - if (needsSwap) { - if (!paymentInfo?.swapPaymentQuote) { + if (!swapPaymentQuote || !Object.keys(swapPaymentQuote).length) { throw new Error('Swap quote not available'); } - if (!poolInfoRef?.currentPriceAInB) { throw new Error('Pool info not available'); } - if (determinePaymentMethod === 'USD') { - const amountInWithBuffer = Math.min( - (paymentInfo.swapPaymentQuote.amountIn * - SEND_AMOUNT_INCREASE_BUFFER) / - Math.pow(10, 6), - satsToDollars(dollarBalanceSat, poolInfoRef.currentPriceAInB), - ); - const formatted = Math.round( - amountInWithBuffer.toFixed(2) * Math.pow(10, 6), - ); + if (sendingMethod === 'USD') { + // USD→BTC swap + const formatted = calculateFlashnetAmountIn({ + baseAmountIn: + swapPaymentQuote.amountIn + + Number(swapPaymentQuote.feePaidAssetIn), + isUsdAssetIn: true, + dollarBalanceSat, + currentPriceAInB: poolInfoRef.currentPriceAInB, + }); executionResponse = await executeSwap(currentWalletMnemoinc, { - poolId: - paymentInfo.swapPaymentQuote.poolId || poolInfoRef.lpPublicKey, + poolId: swapPaymentQuote.poolId || poolInfoRef.lpPublicKey, assetInAddress: USD_ASSET_ADDRESS, assetOutAddress: BTC_ASSET_ADDRESS, amountIn: formatted, }); } else { - const amountInWithBuffer = Math.min( - paymentInfo.swapPaymentQuote.amountIn * SEND_AMOUNT_INCREASE_BUFFER, - bitcoinBalance, - ); - const formatted = Math.round(amountInWithBuffer); + // BTC→USD swap + const formatted = calculateFlashnetAmountIn({ + baseAmountIn: + swapPaymentQuote.amountIn + + Math.round( + dollarsToSats( + Number(swapPaymentQuote.feePaidAssetIn) / Math.pow(10, 6), + ), + ), + isUsdAssetIn: false, + maxBalance: bitcoinBalance, + }); executionResponse = await executeSwap(currentWalletMnemoinc, { - poolId: - paymentInfo.swapPaymentQuote.poolId || poolInfoRef.lpPublicKey, + poolId: swapPaymentQuote.poolId || poolInfoRef.lpPublicKey, assetInAddress: BTC_ASSET_ADDRESS, assetOutAddress: USD_ASSET_ADDRESS, amountIn: formatted, }); } - if (!executionResponse?.didWork) + if (!executionResponse?.didWork) { throw new Error( executionResponse?.error || 'Error when executing swap', ); + } const outboundTransferId = executionResponse.swap.outboundTransferId; setFlashnetTransfer(outboundTransferId); const userSwaps = await getUserSwapHistory(currentWalletMnemoinc, 5); - if (userSwaps.didWork) { const swap = userSwaps.swaps.find( - savedSwap => savedSwap.outboundTransferId === outboundTransferId, + s => s.outboundTransferId === outboundTransferId, ); - - if (swap) { - setFlashnetTransfer(swap.inboundTransferId); - } + if (swap) setFlashnetTransfer(swap.inboundTransferId); } const MAX_WAIT_TIME = 60000; const startTime = Date.now(); - while (true) { - if (Date.now() - startTime > MAX_WAIT_TIME) { + if (Date.now() - startTime > MAX_WAIT_TIME) throw new Error('Swap completion timeout'); - } if (!IS_SPARK_ID.test(outboundTransferId)) { await new Promise(res => setTimeout(res, 2500)); @@ -920,11 +540,11 @@ export default function ConfirmSplitPayment(props) { currentWalletMnemoinc, outboundTransferId, ); + if ( + getSparkPaymentStatus(sparkTransferResponse?.status) === 'completed' + ) + break; - const status = getSparkPaymentStatus(sparkTransferResponse?.status); - if (status === 'completed') break; - - console.log('Swap is not complete, waiting for completion'); await new Promise(res => setTimeout(res, 1500)); } @@ -932,22 +552,13 @@ export default function ConfirmSplitPayment(props) { await new Promise(res => setTimeout(res, 1500)); } - let swapFee = 0; - if (needsSwap) { - if (determinePaymentMethod === 'USD') { - swapFee = dollarsToSats( + const swapFee = needsSwap + ? dollarsToSats( executionResponse.swap.feeAmount / Math.pow(10, 6), poolInfoRef.currentPriceAInB, - ); - } else { - swapFee = dollarsToSats( - executionResponse.swap.feeAmount / Math.pow(10, 6), - poolInfoRef.currentPriceAInB, - ); - } - } + ) + : 0; - // ── Execute payment (BTC and USD paths both call bulkSparkPayment) ────── const result = await bulkSparkPayment( currentWalletMnemoinc, splitRecipients, @@ -962,7 +573,6 @@ export default function ConfirmSplitPayment(props) { paymentCurrency, swapFee, ); - console.log(result, 'bulk payments result'); isSendingPayingEventEmiiter.emit(SENDING_PAYMENT_EVENT_NAME, false); @@ -971,6 +581,7 @@ export default function ConfirmSplitPayment(props) { await new Promise(res => setTimeout(res, 600)); } + // bug here if tx is undefind we crash the next page requestAnimationFrame(() => { requestAnimationFrame(() => { navigate.reset({ @@ -982,6 +593,7 @@ export default function ConfirmSplitPayment(props) { params: { transaction: result?.transaction, isSplitPayment: true, + error: result.error, }, }, ], @@ -989,103 +601,50 @@ export default function ConfirmSplitPayment(props) { }); }); } catch (error) { - console.error('Error in sendPayment:', error); - // Reset state on error + console.error('ConfirmSplitPayment sendPayment error:', error); isSendingPayment.current = false; setShowProgressAnimation(false); - // Optionally show error to user errorMessageNavigation(error.message); } }, [ - paymentInfo, - selectedLRC20Asset, + canSendPayment, + needsSwap, + swapPaymentQuote, + sendingMethod, enteredPaymentInfo, - combinedPaymentDescription, - isUsingLRC20, - tokenDecimals, - convertedSendAmount, - masterInfoObject, - paymentFee, - sparkBalance, - sparkInformation, currentWalletMnemoinc, - sendWebViewRequest, - contactInfo, + splitRecipients, + paymentCurrency, + sparkInformation, + globalContactsInformation, + contactsPrivateKey, + masterInfoObject, navigate, errorMessageNavigation, - determinePaymentMethod, - fiatValueConvertedSendAmount, - paymentValidation, - splitRecipients, bitcoinBalance, dollarBalanceSat, poolInfoRef, - t, - globalContactsInformation, - contactsPrivateKey, ]); - const handleSelectPaymentMethod = useCallback( - showNextScreen => { - setRerenderInput(prev => (prev += 1)); - if (showNextScreen) { - if (!paymentValidation.isValid) { - const error = paymentValidation.getErrorMessage( - paymentValidation.primaryError, - ); - navigate.navigate('ErrorScreen', { errorMessage: error }); - return; - } - - setDidSelectPaymentMethod(true); - } else { - navigate.navigate('CustomHalfModal', { - wantedContent: 'SelectPaymentMethod', - selectedPaymentMethod: determinePaymentMethod, - fromPage: 'ConfirmSplitPayment', - }); - } - }, - [navigate, paymentValidation, determinePaymentMethod], - ); - - const handleDenominationToggle = () => { - if (!isAmountFocused) return; - if (!canEditAmount) { - // For fixed amounts, just change the display denomination - const nextDenom = getNextDenomination(); - setUserSetInputDenomination(nextDenom); - // No need to convert sendingAmount - it stays in sats - // The display will automatically update via convertSatsToDisplay - } else { - // For editable amounts, convert the user-entered value - const nextDenom = getNextDenomination(); - const convertedValue = convertForToggle( - sendingAmount, - convertTextInputValue, - ); - - setUserSetInputDenomination(nextDenom); - setPaymentInfo(prev => ({ - ...prev, - sendAmount: convertedValue, - })); - } - }; - - const sendingAsset = - selectedLRC20Asset === 'Bitcoin' - ? !isLightningPayment && - !isBitcoinPayment && - !(isSparkPayment && receiverExpectsCurrency === 'sats') - ? t('constants.dollars_upper') - : t('constants.bitcoin_upper') - : seletctedToken?.tokenMetadata?.tokenTicker; + // ── Early exit for error state ────────────────────────────────────────────── if (errorMessage) { return ; } + // ── Derived display ───────────────────────────────────────────────────────── + + const sendingAsset = + sendingMethod === 'USD' || (!sendingMethod && isUSDSplit) + ? t('constants.dollars_upper') + : t('constants.bitcoin_upper'); + + const denomination = isUSDSplit + ? 'fiat' + : masterInfoObject.userBalanceDenomination || 'sats'; + + // ── Render ────────────────────────────────────────────────────────────────── + return ( @@ -1094,8 +653,9 @@ export default function ConfirmSplitPayment(props) { containerStyles={{ marginBottom: 0 }} /> + - {/* Amount display */} + {/* Amount display — always shown except during rate-change intercept */} {uiState !== 'SWAP_RATES_CHANGED' && ( - - {!isUsingLRC20 && ( - - )} + )} - {/* Fee info for fixed amount */} + {/* Fee info */} {uiState === 'CONFIRM_PAYMENT' && ( )} - {/* Invoice info */} + {/* Recipient summary */} {uiState === 'CONFIRM_PAYMENT' && ( )} + + {/* Payment method picker */} {uiState === 'CHOOSE_METHOD' && ( )} - {/* SWAP_RATES_CHANGED — rate drifted and broke swap viability */} + {/* Rates changed */} {uiState === 'SWAP_RATES_CHANGED' && } - {/* SELECT_PAYMENT method state - show button to take user to select half modal */} + {/* CHOOSE_METHOD — continue button */} {uiState === 'CHOOSE_METHOD' && ( handleSelectPaymentMethod(true)} textContent={t('constants.review')} /> )} - {/* SWAP_RATES_CHANGED — primary CTA to re-enter amount */} + {/* SWAP_RATES_CHANGED — reset CTA */} {uiState === 'SWAP_RATES_CHANGED' && ( )} - {/* CONFIRM_PAYMENT State - Show swipe button or progress animation */} + {/* CONFIRM_PAYMENT — swipe slider or progress animation */} {uiState === 'CONFIRM_PAYMENT' && ( - {showProgressAnimation || isUsingFastPay ? ( + {showProgressAnimation ? ( { + const message = await sendPushNotification({ + selectedContactUsername: p.selectedContact.uniqueName, + myProfile: p.globalContactsInformation.myProfile, + data: p.data, + privateKey: p.privateKey, + retrivedContact: p.retrivedContact, + masterInfoObject: p.masterInfoObject, + returnOnly: true, + }); + return message || []; + }), + ) + ).flat(); + + // fire and forget + await fetchBackend( + `bulkPushNoticications`, + { pushNotifications: messages }, + privateKey, + globalContactsInformation.myProfile.uuid, + ); return true; } catch (err) { @@ -86,6 +104,7 @@ export async function sendPushNotification({ privateKey, retrivedContact, masterInfoObject, + returnOnly = false, }) { try { crashlyticsLogReport('Sending push notification'); @@ -213,6 +232,11 @@ export async function sendPushNotification({ decryptPubKey: retrivedContact.uuid, }; } + requestData.useNewNotifications = useNewNotifications; + + if (returnOnly) { + return requestData; + } const response = await fetchBackend( `contactsPushNotificationV${useNewNotifications ? '4' : '3'}`, diff --git a/app/functions/payments/validateSplitPayment.js b/app/functions/payments/validateSplitPayment.js new file mode 100644 index 00000000..4fdb230c --- /dev/null +++ b/app/functions/payments/validateSplitPayment.js @@ -0,0 +1,101 @@ +import displayCorrectDenomination from '../displayCorrectDenomination'; +import { dollarsToSats, satsToDollars } from '../spark/flashnet'; + +/** + * Determines whether a split payment can be funded from BTC balance, USD balance, + * or neither. Used in both createSplitBill (to block navigation) and + * confirmSplitPayment (to derive valid sending options). + * + * @param {object} params + * @param {number} params.totalSats - Total payment amount in sats + * @param {string} params.paymentCurrency - 'BTC' | 'USD' — what recipients receive + * @param {number} params.bitcoinBalance - User's BTC balance in sats + * @param {number} params.dollarBalanceSat - User's USD balance expressed in sats + * @param {{usd: number, bitcoin: number}} params.swapLimits - Min swap amounts + * @param {number} params.price - poolInfo.currentPriceAInB (sats per dollar) + * @param {function} params.t - i18n translation function + * @returns {{ canPayBTC: boolean, canPayUSD: boolean, errorMessage: string|null }} + */ +export function validateSplitPayment({ + totalSats, + paymentCurrency, + bitcoinBalance, + dollarBalanceSat, + swapLimits, + price, + masterInfoObject, + swapUSDPriceDollars, + t, +}) { + const isUSD = paymentCurrency === 'USD'; + const minUsdSwapSats = + price > 0 ? Math.round(dollarsToSats(swapLimits.usd, price)) : Infinity; + const minBtcSwapSats = swapLimits.bitcoin; + + // Compare in integer USD cents to avoid fiat→sats round-trip rounding errors. + // Both user amount and limits are expressed at the same display precision (2 dp). + const totalCents = + price > 0 ? Math.round(satsToDollars(totalSats, price) * 100) : 0; + const minBtcSwapCents = + price > 0 + ? Math.round(satsToDollars(minBtcSwapSats, price) * 100) + : Infinity; + const minUsdSwapCents = Math.round(swapLimits.usd * 100); + + const hasBtcForAmount = bitcoinBalance >= totalSats; + const hasUsdForAmount = dollarBalanceSat >= totalSats; + const aboveBtcSwapMin = totalCents >= minBtcSwapCents; + const aboveUsdSwapMin = totalCents >= minUsdSwapCents; + + let canPayBTC, canPayUSD; + if (isUSD) { + // Recipients receive USD tokens: direct USD or BTC→USD swap + canPayUSD = hasUsdForAmount; + canPayBTC = hasBtcForAmount && aboveBtcSwapMin; + } else { + // Recipients receive BTC: direct BTC or USD→BTC swap + canPayBTC = hasBtcForAmount; + canPayUSD = hasUsdForAmount && aboveUsdSwapMin; + } + + let errorMessage = null; + if (!canPayBTC && !canPayUSD) { + if (isUSD && hasBtcForAmount && !aboveBtcSwapMin) { + errorMessage = t('wallet.sendPages.acceptButton.swapMinimumError', { + currency1: t('constants.bitcoin_upper'), + currency2: t('constants.dollars_upper'), + amount: displayCorrectDenomination({ + amount: minBtcSwapSats, + masterInfoObject: { + ...masterInfoObject, + userBalanceDenomination: 'fiat', + }, + fiatStats: { + value: swapUSDPriceDollars, + coin: 'USD', + }, + }), + }); + } else if (!isUSD && hasUsdForAmount && !aboveUsdSwapMin) { + errorMessage = t('wallet.sendPages.acceptButton.swapMinimumError', { + currency1: t('constants.dollars_upper'), + currency2: t('constants.bitcoin_upper'), + amount: displayCorrectDenomination({ + amount: minUsdSwapSats, + masterInfoObject: { + ...masterInfoObject, + userBalanceDenomination: 'sats', + }, + fiatStats: { + value: swapUSDPriceDollars, + coin: 'USD', + }, + }), + }); + } else { + errorMessage = t('wallet.sendPages.acceptButton.balanceError'); + } + } + + return { canPayBTC, canPayUSD, errorMessage }; +} diff --git a/app/functions/spark/bulkPaymentFunctions.js b/app/functions/spark/bulkPaymentFunctions.js index 0cc1f248..1734e9a5 100644 --- a/app/functions/spark/bulkPaymentFunctions.js +++ b/app/functions/spark/bulkPaymentFunctions.js @@ -10,10 +10,7 @@ import { swapTokenToBitcoin, USD_ASSET_ADDRESS, } from './flashnet'; -import { - publishMessage, - publishBulkMessages, -} from '../messaging/publishMessage'; +import { publishBulkMessages } from '../messaging/publishMessage'; import { bulkUpdateSparkTransactions } from './transactions'; import getReceiveAddressAndContactForContactsPayment from '../../components/admin/homeComponents/contacts/internalComponents/getReceiveAddressAndKindForPayment'; import customUUID from '../customUUID'; @@ -173,7 +170,13 @@ export async function bulkSparkPayment( // Nothing to fulfill if every invoice failed to generate if (invoiceBatch.length === 0) { - return { successful: [], failed, totalPaid: 0, groupId: null }; + return { + successful: [], + failed, + totalPaid: 0, + groupId: null, + error: failed[0].error, + }; } // ── Phase 2: Single batch fulfill ───────────────────────────────────────── @@ -198,7 +201,13 @@ export async function bulkSparkPayment( } if (!fulfillResult || !fulfillResult?.didWork) - return { successful: [], failed, totalPaid: 0, groupId: null }; + return { + successful: [], + failed, + totalPaid: 0, + groupId: null, + error: fulfillResult.error, + }; // ── Phase 3: Match results back to recipients ────────────────────────────── // The SDK returns { invoice, transferResponse } / { invoice, error } in each @@ -262,17 +271,17 @@ export async function bulkSparkPayment( currentTime, } = notifyParams; - for (const { - contact, - amountSats, - transferId, - transfer, - contactFull, - currency, - amountCents, - } of successful) { - try { - await publishMessage({ + const pushNotifications = successful.map( + ({ + contact, + amountSats, + transferId, + transfer, + contactFull, + currency, + amountCents, + }) => { + return { toPubKey: contact.uuid, fromPubKey: globalContactsInformation.myProfile.uuid, data: { @@ -296,16 +305,15 @@ export async function bulkSparkPayment( retrivedContact: contactFull, currentTime, masterInfoObject, - }); - } catch (notifyErr) { - // Notification failure is non-fatal - console.log( - 'bulkSparkPayment: notification failed for', - contact.uniqueName, - notifyErr, - ); - } - } + }; + }, + ); + + await publishBulkMessages( + pushNotifications, + privateKey, + globalContactsInformation, + ); } // ── Phase 5: Persist to SQLite ───────────────────────────────────────────── @@ -444,16 +452,16 @@ export async function bulkSparkPayment( currentTime, } = notifyParams; - for (const { - contact, - amountSats, - amountCents, - currency, - txHash: entryTxHash, - contactFull, - } of successful) { - try { - await publishMessage({ + const pushNotifications = successful.map( + ({ + contact, + amountSats, + amountCents, + currency, + txHash: entryTxHash, + contactFull, + }) => { + return { toPubKey: contact.uuid, fromPubKey: globalContactsInformation.myProfile.uuid, data: { @@ -463,7 +471,7 @@ export async function bulkSparkPayment( isRequest: false, didSend: true, wasSeen: null, - paymentDenomination: 'USD', + paymentDenomination: currency === 'USD' ? 'USD' : 'BTC', amountDollars: amountCents != null ? (amountCents / 100).toFixed(2) : null, txid: entryTxHash, @@ -475,15 +483,15 @@ export async function bulkSparkPayment( retrivedContact: contactFull, currentTime, masterInfoObject, - }); - } catch (notifyErr) { - console.log( - 'bulkSparkPayment: USD notification failed for', - contact.uniqueName, - notifyErr, - ); - } - } + }; + }, + ); + + await publishBulkMessages( + pushNotifications, + privateKey, + globalContactsInformation, + ); } // ── Phase 5: Persist to SQLite ───────────────────────────────────────────── @@ -627,7 +635,11 @@ export async function bulkPaymentRequest(recipients, memo, senderInfo) { return { successful: [], failed }; } - const success = await publishBulkMessages(payloads); + const success = await publishBulkMessages( + payloads, + privateKey, + globalContactsInformation, + ); if (!success) { return { diff --git a/app/functions/spark/flashnet.js b/app/functions/spark/flashnet.js index 9426c3c8..1265c7e9 100644 --- a/app/functions/spark/flashnet.js +++ b/app/functions/spark/flashnet.js @@ -39,23 +39,35 @@ import { import { decode } from 'bolt11'; // ============================================ -// CONSTANTS +// CONSTANTS & PURE UTILITIES // ============================================ +import { + BTC_ASSET_ADDRESS, + USD_ASSET_ADDRESS, + FLASHNET_POOL_IDENTITY_KEY, + DEFAULT_SLIPPAGE_BPS, + SEND_AMOUNT_INCREASE_BUFFER, + DEFAULT_MAX_SLIPPAGE_BPS, + INTEGRATOR_FEE, + INTEGRATOR_FEE_BPS, + satsToDollars, + dollarsToSats, + calculateFlashnetAmountIn, +} from './swapAmountUtils'; -// Standard Bitcoin pubkey for pools (constant across Flashnet) -export const BTC_ASSET_ADDRESS = - '020202020202020202020202020202020202020202020202020202020202020202'; -export const USD_ASSET_ADDRESS = - '3206c93b24a4d18ea19d0a9a213204af2c7e74a6d16c7535cc5d33eca4ad1eca'; - -export const FLASHNET_POOL_IDENTITY_KEY = - '02894808873b896e21d29856a6d7bb346fb13c019739adb9bf0b6a8b7e28da53da'; - -// Default slippage tolerance -export const DEFAULT_SLIPPAGE_BPS = 100; // 1% -export const SEND_AMOUNT_INCREASE_BUFFER = 1.01; // 1% -export const DEFAULT_MAX_SLIPPAGE_BPS = 300; // 3% for lightning payments -export const INTEGRATOR_FEE = 0.005; // .5% +export { + BTC_ASSET_ADDRESS, + USD_ASSET_ADDRESS, + FLASHNET_POOL_IDENTITY_KEY, + DEFAULT_SLIPPAGE_BPS, + SEND_AMOUNT_INCREASE_BUFFER, + DEFAULT_MAX_SLIPPAGE_BPS, + INTEGRATOR_FEE, + INTEGRATOR_FEE_BPS, + satsToDollars, + dollarsToSats, + calculateFlashnetAmountIn, +}; // ============================================ // HELPER FUNCTIONS @@ -364,7 +376,7 @@ export const simulateSwap = async ( assetInAddress, assetOutAddress, amountIn, - integratorFeeRateBps = 50, + integratorFeeRateBps = INTEGRATOR_FEE_BPS, }, ) => { try { @@ -432,7 +444,7 @@ export const executeSwap = async ( amountIn, minAmountOut, // Optional - will be calculated if not provided maxSlippageBps = DEFAULT_SLIPPAGE_BPS, - integratorFeeRateBps = 50, + integratorFeeRateBps = INTEGRATOR_FEE_BPS, }, ) => { try { @@ -705,7 +717,7 @@ export const getLightningPaymentQuote = async ( mnemonic, invoice, tokenAddress, - integratorFeeRateBps = 50, + integratorFeeRateBps = INTEGRATOR_FEE_BPS, maxSlippageBps = DEFAULT_MAX_SLIPPAGE_BPS, ) => { try { @@ -780,7 +792,7 @@ export const payLightningWithToken = async ( maxLightningFeeSats = null, rollbackOnFailure = true, useExistingBtcBalance = false, - integratorFeeRateBps = 50, + integratorFeeRateBps = INTEGRATOR_FEE_BPS, }, ) => { try { @@ -1386,64 +1398,6 @@ export const getCurrentPrice = async (mnemonic, poolId) => { } }; -/** - * Convert sats to dollars - * @param {string|number|bigint} sats - Amount of satoshis (100,000,000) - * @param {string|number|bigint} currentPriceAinB - Price of Bitcoin in dollars - * @returns {number} Amount in dollars - */ -export function satsToDollars(sats, currentPriceAinB) { - try { - const DOLLAR_DECIMALS = 1_000_000; - - const numSats = typeof sats === 'bigint' ? Number(sats) : Number(sats || 0); - const numPrice = - typeof currentPriceAinB === 'bigint' - ? Number(currentPriceAinB) - : Number(currentPriceAinB || 0); - - if (isNaN(numSats) || isNaN(numPrice) || numPrice === 0) { - return 0; - } - - return (numSats * numPrice) / DOLLAR_DECIMALS; - } catch (error) { - console.error('Error in satsToDollars:', error, { sats, currentPriceAinB }); - return 0; - } -} - -/** - * Convert dollars to sats - * @param {string|number|bigint} dollars - Amount of dollars (1,000,000) - * @param {string|number|bigint} currentPriceAinB - Price of Bitcoin in dollars - * @returns {number} Amount in sats - */ -export function dollarsToSats(dollars, currentPriceAinB) { - try { - const DOLLAR_DECIMALS = 1_000_000; - - const numDollars = - typeof dollars === 'bigint' ? Number(dollars) : Number(dollars || 0); - const numPrice = - typeof currentPriceAinB === 'bigint' - ? Number(currentPriceAinB) - : Number(currentPriceAinB || 0); - - if (isNaN(numDollars) || isNaN(numPrice) || numPrice === 0) { - return 0; - } - - return (numDollars * DOLLAR_DECIMALS) / numPrice; - } catch (error) { - console.error('Error in dollarsToSats:', error, { - dollars, - currentPriceAinB, - }); - return 0; - } -} - /** * Convert exchangeRate to fiat price * @param {string|number|bigint} currentPriceAinB - Price of Bitcoin in dollars diff --git a/app/functions/spark/payments.js b/app/functions/spark/payments.js index 16d880dc..3a03ed26 100644 --- a/app/functions/spark/payments.js +++ b/app/functions/spark/payments.js @@ -28,12 +28,12 @@ import { import sha256Hash from '../hash'; import calculateProgressiveBracketFee from './calculateSupportFee'; import { + calculateFlashnetAmountIn, dollarsToSats, executeSwap, getUserSwapHistory, payLightningWithToken, satsToDollars, - SEND_AMOUNT_INCREASE_BUFFER, USD_ASSET_ADDRESS, } from './flashnet'; import { @@ -377,17 +377,12 @@ export const sparkPaymenWrapper = async ({ let usedUSDB = false; if (needsSwap) { if (usablePaymentMethod === 'USD') { - const amountInWithBuffer = Math.min( - (swapPaymentQuote.amountIn * SEND_AMOUNT_INCREASE_BUFFER) / - Math.pow(10, 6), - satsToDollars( - swapPaymentQuote.dollarBalanceSat, - poolInfoRef.currentPriceAInB, - ), - ); - const formatted = Math.round( - amountInWithBuffer.toFixed(2) * Math.pow(10, 6), - ); + const formatted = calculateFlashnetAmountIn({ + baseAmountIn: swapPaymentQuote.amountIn, + isUsdAssetIn: true, + dollarBalanceSat: swapPaymentQuote.dollarBalanceSat, + currentPriceAInB: poolInfoRef.currentPriceAInB, + }); executionResponse = await executeSwap(mnemonic, { poolId: swapPaymentQuote.poolId, assetInAddress: swapPaymentQuote.assetInAddress, @@ -396,11 +391,11 @@ export const sparkPaymenWrapper = async ({ }); usedUSDB = true; } else { - const amountInWithBuffer = Math.min( - swapPaymentQuote.amountIn * SEND_AMOUNT_INCREASE_BUFFER, - swapPaymentQuote.bitcoinBalance, - ); - const formatted = Math.round(amountInWithBuffer); + const formatted = calculateFlashnetAmountIn({ + baseAmountIn: swapPaymentQuote.amountIn, + isUsdAssetIn: false, + maxBalance: swapPaymentQuote.bitcoinBalance, + }); executionResponse = await executeSwap(mnemonic, { poolId: swapPaymentQuote.poolId, assetInAddress: swapPaymentQuote.assetInAddress, diff --git a/app/functions/spark/swapAmountUtils.js b/app/functions/spark/swapAmountUtils.js new file mode 100644 index 00000000..e280ea82 --- /dev/null +++ b/app/functions/spark/swapAmountUtils.js @@ -0,0 +1,100 @@ +// Pure math utilities for Flashnet swap amount calculations. +// No SDK imports — safe to test in Jest without mocking native modules. + +export const BTC_ASSET_ADDRESS = + '020202020202020202020202020202020202020202020202020202020202020202'; +export const USD_ASSET_ADDRESS = + '3206c93b24a4d18ea19d0a9a213204af2c7e74a6d16c7535cc5d33eca4ad1eca'; +export const FLASHNET_POOL_IDENTITY_KEY = + '02894808873b896e21d29856a6d7bb346fb13c019739adb9bf0b6a8b7e28da53da'; + +export const DEFAULT_SLIPPAGE_BPS = 100; // 1% +export const SEND_AMOUNT_INCREASE_BUFFER = 1.01; // 1% +export const DEFAULT_MAX_SLIPPAGE_BPS = 300; // 3% for lightning payments +export const INTEGRATOR_FEE = 0.005; // .5% +export const INTEGRATOR_FEE_BPS = 50; + +/** + * Convert sats to dollars. + * @param {string|number|bigint} sats + * @param {string|number|bigint} currentPriceAinB - BTC price in dollars (microdollar units) + * @returns {number} Amount in dollars + */ +export function satsToDollars(sats, currentPriceAinB) { + try { + const DOLLAR_DECIMALS = 1_000_000; + const numSats = typeof sats === 'bigint' ? Number(sats) : Number(sats || 0); + const numPrice = + typeof currentPriceAinB === 'bigint' + ? Number(currentPriceAinB) + : Number(currentPriceAinB || 0); + if (isNaN(numSats) || isNaN(numPrice) || numPrice === 0) return 0; + return (numSats * numPrice) / DOLLAR_DECIMALS; + } catch (error) { + console.error('Error in satsToDollars:', error, { sats, currentPriceAinB }); + return 0; + } +} + +/** + * Convert dollars to sats. + * @param {string|number|bigint} dollars + * @param {string|number|bigint} currentPriceAinB - BTC price in dollars (microdollar units) + * @returns {number} Amount in sats + */ +export function dollarsToSats(dollars, currentPriceAinB) { + try { + const DOLLAR_DECIMALS = 1_000_000; + const numDollars = + typeof dollars === 'bigint' ? Number(dollars) : Number(dollars || 0); + const numPrice = + typeof currentPriceAinB === 'bigint' + ? Number(currentPriceAinB) + : Number(currentPriceAinB || 0); + if (isNaN(numDollars) || isNaN(numPrice) || numPrice === 0) return 0; + return (numDollars * DOLLAR_DECIMALS) / numPrice; + } catch (error) { + console.error('Error in dollarsToSats:', error, { + dollars, + currentPriceAinB, + }); + return 0; + } +} + +/** + * Calculate the final amountIn for a flashnet swap execution. + * Applies a buffer and caps to available balance. + * Always errs toward providing more input to avoid falling short of target output. + * Especially important when the swap output funds a subsequent payment. + * + * @param {number} baseAmountIn - In smallest units: sats (BTC path) or microdollars (USD path) + * @param {boolean} isUsdAssetIn - true = USD→BTC swap, false = BTC→USD swap + * @param {number} [maxBalance] - Balance cap in same units as baseAmountIn (required for BTC + * path; USD path can use dollarBalanceSat + currentPriceAInB) + * @param {number} [dollarBalanceSat] - USD balance expressed in sats (USD path precision cap) + * @param {number} [currentPriceAInB] - Pool price, required when dollarBalanceSat is provided + * @param {number} [bufferMultiplier] - Overshoot factor; defaults to SEND_AMOUNT_INCREASE_BUFFER + * @returns {number} Integer amountIn ready for executeSwap + */ +export function calculateFlashnetAmountIn({ + baseAmountIn, + isUsdAssetIn, + maxBalance, + dollarBalanceSat, + currentPriceAInB, + bufferMultiplier = SEND_AMOUNT_INCREASE_BUFFER, +}) { + if (isUsdAssetIn) { + // Work in dollars for cent-level precision, then convert back to microdollars. + const bufferedDollars = (baseAmountIn * bufferMultiplier) / Math.pow(10, 6); + const balanceDollars = + dollarBalanceSat != null && currentPriceAInB != null + ? satsToDollars(dollarBalanceSat, currentPriceAInB) + : maxBalance / Math.pow(10, 6); + const cappedDollars = Math.min(bufferedDollars, balanceDollars); + return Math.round(parseFloat(cappedDollars.toFixed(2)) * Math.pow(10, 6)); + } + // BTC path: stay in sats + return Math.round(Math.min(baseAmountIn * bufferMultiplier, maxBalance)); +} diff --git a/app/functions/spark/transformTxToPayment.js b/app/functions/spark/transformTxToPayment.js index bf493be0..3e87d479 100644 --- a/app/functions/spark/transformTxToPayment.js +++ b/app/functions/spark/transformTxToPayment.js @@ -20,7 +20,7 @@ export async function transformTxToPaymentObject( sparkAddress, forcePaymentType, isRestore, - unpaidLNInvoices, + unpaidLNInvoices = [], identityPubKey, numTxsBeingRestored = 1, forceOutgoing = false, diff --git a/app/hooks/useBudgetWarning.js b/app/hooks/useBudgetWarning.js index 07dcde5e..6d0b9055 100644 --- a/app/hooks/useBudgetWarning.js +++ b/app/hooks/useBudgetWarning.js @@ -7,7 +7,23 @@ import { NEAR_BUDGET_LIMIT, OVER_BUDGET_LIMIT } from '../constants'; // accepting them as parameters (test file defines its own copy inline). export function computeBudgetWarning(budget, spentTotal) { - if (!budget || !budget.amount || budget.amount <= 0) { + try { + if (!budget || !budget.amount || budget.amount <= 0) { + return { + shouldWarn: false, + isOverBudget: false, + spentPercent: 0, + leftToSpend: 0, + }; + } + const budgetAmount = budget.amount; + const spentPercent = spentTotal / budgetAmount; + const leftToSpend = Math.max(budgetAmount - spentTotal, 0); + const shouldWarn = spentPercent >= NEAR_BUDGET_LIMIT; + const isOverBudget = spentPercent >= OVER_BUDGET_LIMIT; + return { shouldWarn, isOverBudget, spentPercent, leftToSpend }; + } catch (err) { + console.log('compute budget warning error', err); return { shouldWarn: false, isOverBudget: false, @@ -15,12 +31,6 @@ export function computeBudgetWarning(budget, spentTotal) { leftToSpend: 0, }; } - const budgetAmount = budget.amount; - const spentPercent = spentTotal / budgetAmount; - const leftToSpend = Math.max(budgetAmount - spentTotal, 0); - const shouldWarn = spentPercent >= NEAR_BUDGET_LIMIT; - const isOverBudget = spentPercent >= OVER_BUDGET_LIMIT; - return { shouldWarn, isOverBudget, spentPercent, leftToSpend }; } export function useBudgetWarning(sendingAmount = 0) { diff --git a/app/screens/inAccount/analyticsPage.js b/app/screens/inAccount/analyticsPage.js index 1c654e1d..1928e64b 100644 --- a/app/screens/inAccount/analyticsPage.js +++ b/app/screens/inAccount/analyticsPage.js @@ -316,6 +316,7 @@ const styles = StyleSheet.create({ budgetStatusLabel: { fontSize: SIZES.smedium, fontWeight: '500', + includeFontPadding: false, }, progressBarTrack: { height: 6, diff --git a/app/screens/inAccount/confirmTxPage.js b/app/screens/inAccount/confirmTxPage.js index 8a46c792..fdfd8f3b 100644 --- a/app/screens/inAccount/confirmTxPage.js +++ b/app/screens/inAccount/confirmTxPage.js @@ -48,8 +48,8 @@ export default function ConfirmTxPage(props) { const [isAddingContact, setIsAddingContact] = useState(false); const isLNURLAuth = props.route.params?.useLNURLAuth; const transaction = props.route.params?.transaction; - const hasError = props.route.params?.error; - const paymentInformation = transaction?.details; + const paymentInformation = transaction?.details || {}; + const hasError = props.route.params?.error || !paymentInformation; const lnurlAddress = normalizeLNURLAddress(props.route.params?.lnurlAddress); const isBlitzAddress = isBlitzLNURLAddress(lnurlAddress); const lnurlUsername = lnurlAddress?.split('@')[0]?.toLowerCase(); @@ -87,7 +87,7 @@ export default function ConfirmTxPage(props) { const paymentFee = paymentInformation?.fee; - const errorMessage = hasError; + const errorMessage = hasError || t('errormessages.genericError'); const amount = paymentInformation?.amount || 0; @@ -200,6 +200,48 @@ export default function ConfirmTxPage(props) { ); } + if (props.route.params?.isSplitPayment && props.route.params?.isRequset) { + return ( + + + + { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + navigate.popToTop(); + }); + }); + }} + textContent={t('constants.continue')} + /> + + ); + } + return ( @@ -182,15 +181,6 @@ export default function TechnicalTransactionDetails(props) { // BTC: raw sats passed directly. // USD: amountCents * 10_000 = micros (matches DB amount unit and // what FormattedSatText + formatTokensNumber expect for LRC20). - const rawAmount = isLRC20Payment - ? (entry.amountCents ?? 0) * 10_000 - : entry.amountSats ?? 0; - const displayBalance = isLRC20Payment - ? formatTokensNumber( - rawAmount, - selectedToken?.tokenMetadata?.decimals, - ) - : rawAmount; const isLast = index === successfulGroup.length - 1; @@ -219,15 +209,14 @@ export default function TechnicalTransactionDetails(props) { styles={styles.infoName} CustomNumberOfLines={1} /> + {!details.isLRC20Payment && ( + + )} - {!isLast && ( @@ -271,6 +260,12 @@ const styles = StyleSheet.create({ includeFontPadding: false, flexShrink: 1, }, + transferId: { + fontSize: SIZES.small, + opacity: HIDDEN_OPACITY, + includeFontPadding: false, + flexShrink: 1, + }, infoNameSmall: { fontSize: SIZES.smedium, opacity: HIDDEN_OPACITY, diff --git a/context-store/analyticsContext.js b/context-store/analyticsContext.js index e77bef96..70fa86af 100644 --- a/context-store/analyticsContext.js +++ b/context-store/analyticsContext.js @@ -10,27 +10,35 @@ import { useFlashnet } from './flashnetContext'; import { getMonthlyTransactions } from '../app/functions/spark/transactions'; import { getSatsFromTx } from '../app/functions/getSatsFromTx'; import { buildCumulativeData } from '../app/components/admin/homeComponents/analytics/cumulativeLineChartHelpers'; +import { useAppStatus } from './appStatus'; const AnalyticsContext = createContext(null); export function AnalyticsProvider({ children }) { const { sparkInformation } = useSparkWallet(); + const { didGetToHomepage } = useAppStatus(); const { poolInfoRef } = useFlashnet(); const [inTxs, setInTxs] = useState([]); const [outTxs, setOutTxs] = useState([]); - const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(false); useEffect(() => { async function load() { - if (!sparkInformation.identityPubKey) return; + if (!sparkInformation.identityPubKey || !didGetToHomepage) return; setIsLoading(true); try { + const startTime = Date.now(); const [incoming, outgoing] = await Promise.all([ getMonthlyTransactions(sparkInformation.identityPubKey, 'INCOMING'), getMonthlyTransactions(sparkInformation.identityPubKey, 'OUTGOING'), ]); setInTxs(incoming); setOutTxs(outgoing); + const elapsed = Date.now() - startTime; + const minDuration = 500; + await new Promise(resolve => + setTimeout(resolve, Math.max(60, minDuration - elapsed)), + ); } catch (e) { console.error('AnalyticsContext load error', e); } finally { @@ -38,11 +46,15 @@ export function AnalyticsProvider({ children }) { } } load(); - }, [sparkInformation.identityPubKey, sparkInformation.transactions]); + }, [ + sparkInformation.identityPubKey, + sparkInformation.transactions, + didGetToHomepage, + ]); - const incomeTotal = useMemo( - () => - inTxs.reduce((sum, tx) => { + const incomeTotal = useMemo(() => { + try { + return inTxs.reduce((sum, tx) => { try { return ( sum + getSatsFromTx(tx, poolInfoRef.currentPriceAInB, 'INCOMING') @@ -50,13 +62,16 @@ export function AnalyticsProvider({ children }) { } catch { return sum; } - }, 0), - [inTxs], - ); + }, 0); + } catch (err) { + console.log('eror calcuating total', err); + return 0; + } + }, [inTxs]); - const spentTotal = useMemo( - () => - outTxs.reduce((sum, tx) => { + const spentTotal = useMemo(() => { + try { + return outTxs.reduce((sum, tx) => { try { return ( sum + getSatsFromTx(tx, poolInfoRef.currentPriceAInB, 'OUTGOING') @@ -64,31 +79,40 @@ export function AnalyticsProvider({ children }) { } catch { return sum; } - }, 0), - [outTxs], - ); + }, 0); + } catch (err) { + console.log('error calcuating spent', err); + return 0; + } + }, [outTxs]); - const cumulativeIncomeData = useMemo( - () => - buildCumulativeData( + const cumulativeIncomeData = useMemo(() => { + try { + return buildCumulativeData( inTxs, undefined, poolInfoRef.currentPriceAInB, 'INCOMING', - ), - [inTxs], - ); + ); + } catch (err) { + console.log('error creating cumulative income data', err); + return []; + } + }, [inTxs]); - const cumulativeSpentData = useMemo( - () => - buildCumulativeData( + const cumulativeSpentData = useMemo(() => { + try { + return buildCumulativeData( outTxs, undefined, poolInfoRef.currentPriceAInB, 'OUTGOING', - ), - [outTxs], - ); + ); + } catch (err) { + console.log('error creating cumulative spend data', err); + return []; + } + }, [outTxs]); return ( RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n if ! _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\"); then\n echo \"error: Failed to parse firebase.json, check for syntax errors.\"\n exit 1\n fi\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"note: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"note: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"note: -> RNFB build script started\"\necho \"note: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"note: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"note: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n if ! _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\"); then\n echo \"error: Failed to parse firebase.json, check for syntax errors.\"\n exit 1\n fi\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"error: python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"note: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"note: <- RNFB build script finished\"\n"; }; C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; diff --git a/ios/BlitzWallet.xcodeproj/xcshareddata/xcschemes/BlitzWallet.xcscheme b/ios/BlitzWallet.xcodeproj/xcshareddata/xcschemes/BlitzWallet.xcscheme index d2881340..f05a2ad4 100644 --- a/ios/BlitzWallet.xcodeproj/xcshareddata/xcschemes/BlitzWallet.xcscheme +++ b/ios/BlitzWallet.xcodeproj/xcshareddata/xcschemes/BlitzWallet.xcscheme @@ -1,6 +1,6 @@ 12.3.0) - - Firebase/CoreOnly (12.3.0): - - FirebaseCore (~> 12.3.0) - - Firebase/Crashlytics (12.3.0): + - FirebaseAuth (~> 12.10.0) + - Firebase/CoreOnly (12.10.0): + - FirebaseCore (~> 12.10.0) + - Firebase/Crashlytics (12.10.0): - Firebase/CoreOnly - - FirebaseCrashlytics (~> 12.3.0) - - Firebase/Firestore (12.3.0): + - FirebaseCrashlytics (~> 12.10.0) + - Firebase/Firestore (12.10.0): - Firebase/CoreOnly - - FirebaseFirestore (~> 12.3.0) - - Firebase/Functions (12.3.0): + - FirebaseFirestore (~> 12.10.0) + - Firebase/Functions (12.10.0): - Firebase/CoreOnly - - FirebaseFunctions (~> 12.3.0) - - Firebase/Messaging (12.3.0): + - FirebaseFunctions (~> 12.10.0) + - Firebase/Messaging (12.10.0): - Firebase/CoreOnly - - FirebaseMessaging (~> 12.3.0) - - Firebase/Storage (12.3.0): + - FirebaseMessaging (~> 12.10.0) + - Firebase/Storage (12.10.0): - Firebase/CoreOnly - - FirebaseStorage (~> 12.3.0) - - FirebaseAppCheckInterop (12.3.0) - - FirebaseAuth (12.3.0): - - FirebaseAppCheckInterop (~> 12.3.0) - - FirebaseAuthInterop (~> 12.3.0) - - FirebaseCore (~> 12.3.0) - - FirebaseCoreExtension (~> 12.3.0) + - FirebaseStorage (~> 12.10.0) + - FirebaseAppCheckInterop (12.10.0) + - FirebaseAuth (12.10.0): + - FirebaseAppCheckInterop (~> 12.10.0) + - FirebaseAuthInterop (~> 12.10.0) + - FirebaseCore (~> 12.10.0) + - FirebaseCoreExtension (~> 12.10.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/Environment (~> 8.1) - GTMSessionFetcher/Core (< 6.0, >= 3.4) - RecaptchaInterop (~> 101.0) - - FirebaseAuthInterop (12.3.0) - - FirebaseCore (12.3.0): - - FirebaseCoreInternal (~> 12.3.0) + - FirebaseAuthInterop (12.10.0) + - FirebaseCore (12.10.0): + - FirebaseCoreInternal (~> 12.10.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (12.3.0): - - FirebaseCore (~> 12.3.0) - - FirebaseCoreInternal (12.3.0): + - FirebaseCoreExtension (12.10.0): + - FirebaseCore (~> 12.10.0) + - FirebaseCoreInternal (12.10.0): - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseCrashlytics (12.3.0): - - FirebaseCore (~> 12.3.0) - - FirebaseInstallations (~> 12.3.0) - - FirebaseRemoteConfigInterop (~> 12.3.0) - - FirebaseSessions (~> 12.3.0) + - FirebaseCrashlytics (12.10.0): + - FirebaseCore (~> 12.10.0) + - FirebaseInstallations (~> 12.10.0) + - FirebaseRemoteConfigInterop (~> 12.10.0) + - FirebaseSessions (~> 12.10.0) - GoogleDataTransport (~> 10.1) - GoogleUtilities/Environment (~> 8.1) - nanopb (~> 3.30910.0) - PromisesObjC (~> 2.4) - - FirebaseFirestore (12.3.0): - - FirebaseCore (~> 12.3.0) - - FirebaseCoreExtension (~> 12.3.0) - - FirebaseFirestoreInternal (~> 12.3.0) - - FirebaseSharedSwift (~> 12.3.0) - - FirebaseFirestoreInternal (12.3.0): + - FirebaseFirestore (12.10.0): + - FirebaseCore (~> 12.10.0) + - FirebaseCoreExtension (~> 12.10.0) + - FirebaseFirestoreInternal (~> 12.10.0) + - FirebaseSharedSwift (~> 12.10.0) + - FirebaseFirestoreInternal (12.10.0): - abseil/algorithm (~> 1.20240722.0) - abseil/base (~> 1.20240722.0) - abseil/container/flat_hash_map (~> 1.20240722.0) @@ -1383,51 +1383,51 @@ PODS: - abseil/strings/strings (~> 1.20240722.0) - abseil/time (~> 1.20240722.0) - abseil/types (~> 1.20240722.0) - - FirebaseAppCheckInterop (~> 12.3.0) - - FirebaseCore (~> 12.3.0) + - FirebaseAppCheckInterop (~> 12.10.0) + - FirebaseCore (~> 12.10.0) - "gRPC-C++ (~> 1.69.0)" - gRPC-Core (~> 1.69.0) - leveldb-library (~> 1.22) - nanopb (~> 3.30910.0) - - FirebaseFunctions (12.3.0): - - FirebaseAppCheckInterop (~> 12.3.0) - - FirebaseAuthInterop (~> 12.3.0) - - FirebaseCore (~> 12.3.0) - - FirebaseCoreExtension (~> 12.3.0) - - FirebaseMessagingInterop (~> 12.3.0) - - FirebaseSharedSwift (~> 12.3.0) + - FirebaseFunctions (12.10.0): + - FirebaseAppCheckInterop (~> 12.10.0) + - FirebaseAuthInterop (~> 12.10.0) + - FirebaseCore (~> 12.10.0) + - FirebaseCoreExtension (~> 12.10.0) + - FirebaseMessagingInterop (~> 12.10.0) + - FirebaseSharedSwift (~> 12.10.0) - GTMSessionFetcher/Core (< 6.0, >= 3.4) - - FirebaseInstallations (12.3.0): - - FirebaseCore (~> 12.3.0) + - FirebaseInstallations (12.10.0): + - FirebaseCore (~> 12.10.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.3.0): - - FirebaseCore (~> 12.3.0) - - FirebaseInstallations (~> 12.3.0) + - FirebaseMessaging (12.10.0): + - FirebaseCore (~> 12.10.0) + - FirebaseInstallations (~> 12.10.0) - GoogleDataTransport (~> 10.1) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Reachability (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - nanopb (~> 3.30910.0) - - FirebaseMessagingInterop (12.3.0) - - FirebaseRemoteConfigInterop (12.3.0) - - FirebaseSessions (12.3.0): - - FirebaseCore (~> 12.3.0) - - FirebaseCoreExtension (~> 12.3.0) - - FirebaseInstallations (~> 12.3.0) + - FirebaseMessagingInterop (12.10.0) + - FirebaseRemoteConfigInterop (12.10.0) + - FirebaseSessions (12.10.0): + - FirebaseCore (~> 12.10.0) + - FirebaseCoreExtension (~> 12.10.0) + - FirebaseInstallations (~> 12.10.0) - GoogleDataTransport (~> 10.1) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/UserDefaults (~> 8.1) - nanopb (~> 3.30910.0) - PromisesSwift (~> 2.1) - - FirebaseSharedSwift (12.3.0) - - FirebaseStorage (12.3.0): - - FirebaseAppCheckInterop (~> 12.3.0) - - FirebaseAuthInterop (~> 12.3.0) - - FirebaseCore (~> 12.3.0) - - FirebaseCoreExtension (~> 12.3.0) + - FirebaseSharedSwift (12.10.0) + - FirebaseStorage (12.10.0): + - FirebaseAppCheckInterop (~> 12.10.0) + - FirebaseAuthInterop (~> 12.10.0) + - FirebaseCore (~> 12.10.0) + - FirebaseCoreExtension (~> 12.10.0) - GoogleUtilities/Environment (~> 8.1) - GTMSessionFetcher/Core (< 6.0, >= 3.4) - fmt (12.1.0) @@ -1552,9 +1552,9 @@ PODS: - gRPC-Core/Interface (1.69.0) - gRPC-Core/Privacy (1.69.0) - GTMSessionFetcher/Core (5.2.0) - - hermes-engine (0.81.5): - - hermes-engine/Pre-built (= 0.81.5) - - hermes-engine/Pre-built (0.81.5) + - hermes-engine (0.81.4): + - hermes-engine/Pre-built (= 0.81.4) + - hermes-engine/Pre-built (0.81.4) - leveldb-library (1.22.6) - libavif/core (1.0.0) - libavif/libdav1d (1.0.0): @@ -1637,39 +1637,10 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga + - OpenSSL-Universal (3.6.0000) - PromisesObjC (2.4.0) - PromisesSwift (2.4.0): - PromisesObjC (= 2.4.0) - - QuickCrypto (1.0.16): - - boost - - DoubleConversion - - fast_float - - fmt - - glog - - hermes-engine - - NitroModules - - RCT-Folly - - RCT-Folly/Fabric - - RCTRequired - - RCTTypeSafety - - React-callinvoker - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - SocketRocket - - Yoga - RCT-Folly (2024.11.18.00): - boost - DoubleConversion @@ -1689,27 +1660,27 @@ PODS: - fast_float (= 8.0.0) - fmt (= 12.1.0) - glog - - RCTDeprecation (0.81.5) - - RCTRequired (0.81.5) - - RCTTypeSafety (0.81.5): - - FBLazyVector (= 0.81.5) - - RCTRequired (= 0.81.5) - - React-Core (= 0.81.5) - - React (0.81.5): - - React-Core (= 0.81.5) - - React-Core/DevSupport (= 0.81.5) - - React-Core/RCTWebSocket (= 0.81.5) - - React-RCTActionSheet (= 0.81.5) - - React-RCTAnimation (= 0.81.5) - - React-RCTBlob (= 0.81.5) - - React-RCTImage (= 0.81.5) - - React-RCTLinking (= 0.81.5) - - React-RCTNetwork (= 0.81.5) - - React-RCTSettings (= 0.81.5) - - React-RCTText (= 0.81.5) - - React-RCTVibration (= 0.81.5) - - React-callinvoker (0.81.5) - - React-Core (0.81.5): + - RCTDeprecation (0.81.4) + - RCTRequired (0.81.4) + - RCTTypeSafety (0.81.4): + - FBLazyVector (= 0.81.4) + - RCTRequired (= 0.81.4) + - React-Core (= 0.81.4) + - React (0.81.4): + - React-Core (= 0.81.4) + - React-Core/DevSupport (= 0.81.4) + - React-Core/RCTWebSocket (= 0.81.4) + - React-RCTActionSheet (= 0.81.4) + - React-RCTAnimation (= 0.81.4) + - React-RCTBlob (= 0.81.4) + - React-RCTImage (= 0.81.4) + - React-RCTLinking (= 0.81.4) + - React-RCTNetwork (= 0.81.4) + - React-RCTSettings (= 0.81.4) + - React-RCTText (= 0.81.4) + - React-RCTVibration (= 0.81.4) + - React-callinvoker (0.81.4) + - React-Core (0.81.4): - boost - DoubleConversion - fast_float @@ -1719,7 +1690,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.81.5) + - React-Core/Default (= 0.81.4) - React-cxxreact - React-featureflags - React-hermes @@ -1734,7 +1705,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/CoreModulesHeaders (0.81.5): + - React-Core/CoreModulesHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -1759,7 +1730,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/Default (0.81.5): + - React-Core/Default (0.81.4): - boost - DoubleConversion - fast_float @@ -1783,7 +1754,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/DevSupport (0.81.5): + - React-Core/DevSupport (0.81.4): - boost - DoubleConversion - fast_float @@ -1793,8 +1764,8 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.81.5) - - React-Core/RCTWebSocket (= 0.81.5) + - React-Core/Default (= 0.81.4) + - React-Core/RCTWebSocket (= 0.81.4) - React-cxxreact - React-featureflags - React-hermes @@ -1809,7 +1780,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTActionSheetHeaders (0.81.5): + - React-Core/RCTActionSheetHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -1834,7 +1805,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTAnimationHeaders (0.81.5): + - React-Core/RCTAnimationHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -1859,7 +1830,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTBlobHeaders (0.81.5): + - React-Core/RCTBlobHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -1884,7 +1855,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTImageHeaders (0.81.5): + - React-Core/RCTImageHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -1909,7 +1880,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTLinkingHeaders (0.81.5): + - React-Core/RCTLinkingHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -1934,7 +1905,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTNetworkHeaders (0.81.5): + - React-Core/RCTNetworkHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -1959,7 +1930,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTSettingsHeaders (0.81.5): + - React-Core/RCTSettingsHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -1984,7 +1955,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTTextHeaders (0.81.5): + - React-Core/RCTTextHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -2009,7 +1980,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTVibrationHeaders (0.81.5): + - React-Core/RCTVibrationHeaders (0.81.4): - boost - DoubleConversion - fast_float @@ -2034,7 +2005,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-Core/RCTWebSocket (0.81.5): + - React-Core/RCTWebSocket (0.81.4): - boost - DoubleConversion - fast_float @@ -2044,7 +2015,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - RCTDeprecation - - React-Core/Default (= 0.81.5) + - React-Core/Default (= 0.81.4) - React-cxxreact - React-featureflags - React-hermes @@ -2059,7 +2030,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-CoreModules (0.81.5): + - React-CoreModules (0.81.4): - boost - DoubleConversion - fast_float @@ -2067,20 +2038,20 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - RCTTypeSafety (= 0.81.5) - - React-Core/CoreModulesHeaders (= 0.81.5) - - React-jsi (= 0.81.5) + - RCTTypeSafety (= 0.81.4) + - React-Core/CoreModulesHeaders (= 0.81.4) + - React-jsi (= 0.81.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-NativeModulesApple - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.81.5) + - React-RCTImage (= 0.81.4) - React-runtimeexecutor - ReactCommon - SocketRocket - - React-cxxreact (0.81.5): + - React-cxxreact (0.81.4): - boost - DoubleConversion - fast_float @@ -2089,19 +2060,19 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.81.5) - - React-debug (= 0.81.5) - - React-jsi (= 0.81.5) + - React-callinvoker (= 0.81.4) + - React-debug (= 0.81.4) + - React-jsi (= 0.81.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.81.5) - - React-perflogger (= 0.81.5) + - React-logger (= 0.81.4) + - React-perflogger (= 0.81.4) - React-runtimeexecutor - - React-timing (= 0.81.5) + - React-timing (= 0.81.4) - SocketRocket - - React-debug (0.81.5) - - React-defaultsnativemodule (0.81.5): + - React-debug (0.81.4) + - React-defaultsnativemodule (0.81.4): - boost - DoubleConversion - fast_float @@ -2118,7 +2089,7 @@ PODS: - React-microtasksnativemodule - React-RCTFBReactNativeSpec - SocketRocket - - React-domnativemodule (0.81.5): + - React-domnativemodule (0.81.4): - boost - DoubleConversion - fast_float @@ -2138,7 +2109,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric (0.81.5): + - React-Fabric (0.81.4): - boost - DoubleConversion - fast_float @@ -2152,23 +2123,23 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/animations (= 0.81.5) - - React-Fabric/attributedstring (= 0.81.5) - - React-Fabric/bridging (= 0.81.5) - - React-Fabric/componentregistry (= 0.81.5) - - React-Fabric/componentregistrynative (= 0.81.5) - - React-Fabric/components (= 0.81.5) - - React-Fabric/consistency (= 0.81.5) - - React-Fabric/core (= 0.81.5) - - React-Fabric/dom (= 0.81.5) - - React-Fabric/imagemanager (= 0.81.5) - - React-Fabric/leakchecker (= 0.81.5) - - React-Fabric/mounting (= 0.81.5) - - React-Fabric/observers (= 0.81.5) - - React-Fabric/scheduler (= 0.81.5) - - React-Fabric/telemetry (= 0.81.5) - - React-Fabric/templateprocessor (= 0.81.5) - - React-Fabric/uimanager (= 0.81.5) + - React-Fabric/animations (= 0.81.4) + - React-Fabric/attributedstring (= 0.81.4) + - React-Fabric/bridging (= 0.81.4) + - React-Fabric/componentregistry (= 0.81.4) + - React-Fabric/componentregistrynative (= 0.81.4) + - React-Fabric/components (= 0.81.4) + - React-Fabric/consistency (= 0.81.4) + - React-Fabric/core (= 0.81.4) + - React-Fabric/dom (= 0.81.4) + - React-Fabric/imagemanager (= 0.81.4) + - React-Fabric/leakchecker (= 0.81.4) + - React-Fabric/mounting (= 0.81.4) + - React-Fabric/observers (= 0.81.4) + - React-Fabric/scheduler (= 0.81.4) + - React-Fabric/telemetry (= 0.81.4) + - React-Fabric/templateprocessor (= 0.81.4) + - React-Fabric/uimanager (= 0.81.4) - React-featureflags - React-graphics - React-jsi @@ -2180,7 +2151,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/animations (0.81.5): + - React-Fabric/animations (0.81.4): - boost - DoubleConversion - fast_float @@ -2205,7 +2176,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/attributedstring (0.81.5): + - React-Fabric/attributedstring (0.81.4): - boost - DoubleConversion - fast_float @@ -2230,7 +2201,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/bridging (0.81.5): + - React-Fabric/bridging (0.81.4): - boost - DoubleConversion - fast_float @@ -2255,7 +2226,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistry (0.81.5): + - React-Fabric/componentregistry (0.81.4): - boost - DoubleConversion - fast_float @@ -2280,7 +2251,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/componentregistrynative (0.81.5): + - React-Fabric/componentregistrynative (0.81.4): - boost - DoubleConversion - fast_float @@ -2305,7 +2276,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components (0.81.5): + - React-Fabric/components (0.81.4): - boost - DoubleConversion - fast_float @@ -2319,10 +2290,10 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.81.5) - - React-Fabric/components/root (= 0.81.5) - - React-Fabric/components/scrollview (= 0.81.5) - - React-Fabric/components/view (= 0.81.5) + - React-Fabric/components/legacyviewmanagerinterop (= 0.81.4) + - React-Fabric/components/root (= 0.81.4) + - React-Fabric/components/scrollview (= 0.81.4) + - React-Fabric/components/view (= 0.81.4) - React-featureflags - React-graphics - React-jsi @@ -2334,7 +2305,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/legacyviewmanagerinterop (0.81.5): + - React-Fabric/components/legacyviewmanagerinterop (0.81.4): - boost - DoubleConversion - fast_float @@ -2359,7 +2330,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/root (0.81.5): + - React-Fabric/components/root (0.81.4): - boost - DoubleConversion - fast_float @@ -2384,7 +2355,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/scrollview (0.81.5): + - React-Fabric/components/scrollview (0.81.4): - boost - DoubleConversion - fast_float @@ -2409,7 +2380,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/components/view (0.81.5): + - React-Fabric/components/view (0.81.4): - boost - DoubleConversion - fast_float @@ -2436,7 +2407,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-Fabric/consistency (0.81.5): + - React-Fabric/consistency (0.81.4): - boost - DoubleConversion - fast_float @@ -2461,7 +2432,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/core (0.81.5): + - React-Fabric/core (0.81.4): - boost - DoubleConversion - fast_float @@ -2486,7 +2457,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/dom (0.81.5): + - React-Fabric/dom (0.81.4): - boost - DoubleConversion - fast_float @@ -2511,7 +2482,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/imagemanager (0.81.5): + - React-Fabric/imagemanager (0.81.4): - boost - DoubleConversion - fast_float @@ -2536,7 +2507,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/leakchecker (0.81.5): + - React-Fabric/leakchecker (0.81.4): - boost - DoubleConversion - fast_float @@ -2561,7 +2532,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/mounting (0.81.5): + - React-Fabric/mounting (0.81.4): - boost - DoubleConversion - fast_float @@ -2586,7 +2557,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers (0.81.5): + - React-Fabric/observers (0.81.4): - boost - DoubleConversion - fast_float @@ -2600,7 +2571,7 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.81.5) + - React-Fabric/observers/events (= 0.81.4) - React-featureflags - React-graphics - React-jsi @@ -2612,7 +2583,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/observers/events (0.81.5): + - React-Fabric/observers/events (0.81.4): - boost - DoubleConversion - fast_float @@ -2637,7 +2608,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/scheduler (0.81.5): + - React-Fabric/scheduler (0.81.4): - boost - DoubleConversion - fast_float @@ -2664,7 +2635,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/telemetry (0.81.5): + - React-Fabric/telemetry (0.81.4): - boost - DoubleConversion - fast_float @@ -2689,7 +2660,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/templateprocessor (0.81.5): + - React-Fabric/templateprocessor (0.81.4): - boost - DoubleConversion - fast_float @@ -2714,7 +2685,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager (0.81.5): + - React-Fabric/uimanager (0.81.4): - boost - DoubleConversion - fast_float @@ -2728,7 +2699,7 @@ PODS: - React-Core - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.81.5) + - React-Fabric/uimanager/consistency (= 0.81.4) - React-featureflags - React-graphics - React-jsi @@ -2741,7 +2712,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-Fabric/uimanager/consistency (0.81.5): + - React-Fabric/uimanager/consistency (0.81.4): - boost - DoubleConversion - fast_float @@ -2767,7 +2738,7 @@ PODS: - React-utils - ReactCommon/turbomodule/core - SocketRocket - - React-FabricComponents (0.81.5): + - React-FabricComponents (0.81.4): - boost - DoubleConversion - fast_float @@ -2782,8 +2753,8 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.81.5) - - React-FabricComponents/textlayoutmanager (= 0.81.5) + - React-FabricComponents/components (= 0.81.4) + - React-FabricComponents/textlayoutmanager (= 0.81.4) - React-featureflags - React-graphics - React-jsi @@ -2796,7 +2767,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components (0.81.5): + - React-FabricComponents/components (0.81.4): - boost - DoubleConversion - fast_float @@ -2811,17 +2782,17 @@ PODS: - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.81.5) - - React-FabricComponents/components/iostextinput (= 0.81.5) - - React-FabricComponents/components/modal (= 0.81.5) - - React-FabricComponents/components/rncore (= 0.81.5) - - React-FabricComponents/components/safeareaview (= 0.81.5) - - React-FabricComponents/components/scrollview (= 0.81.5) - - React-FabricComponents/components/switch (= 0.81.5) - - React-FabricComponents/components/text (= 0.81.5) - - React-FabricComponents/components/textinput (= 0.81.5) - - React-FabricComponents/components/unimplementedview (= 0.81.5) - - React-FabricComponents/components/virtualview (= 0.81.5) + - React-FabricComponents/components/inputaccessory (= 0.81.4) + - React-FabricComponents/components/iostextinput (= 0.81.4) + - React-FabricComponents/components/modal (= 0.81.4) + - React-FabricComponents/components/rncore (= 0.81.4) + - React-FabricComponents/components/safeareaview (= 0.81.4) + - React-FabricComponents/components/scrollview (= 0.81.4) + - React-FabricComponents/components/switch (= 0.81.4) + - React-FabricComponents/components/text (= 0.81.4) + - React-FabricComponents/components/textinput (= 0.81.4) + - React-FabricComponents/components/unimplementedview (= 0.81.4) + - React-FabricComponents/components/virtualview (= 0.81.4) - React-featureflags - React-graphics - React-jsi @@ -2834,7 +2805,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/inputaccessory (0.81.5): + - React-FabricComponents/components/inputaccessory (0.81.4): - boost - DoubleConversion - fast_float @@ -2861,7 +2832,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/iostextinput (0.81.5): + - React-FabricComponents/components/iostextinput (0.81.4): - boost - DoubleConversion - fast_float @@ -2888,7 +2859,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/modal (0.81.5): + - React-FabricComponents/components/modal (0.81.4): - boost - DoubleConversion - fast_float @@ -2915,7 +2886,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/rncore (0.81.5): + - React-FabricComponents/components/rncore (0.81.4): - boost - DoubleConversion - fast_float @@ -2942,7 +2913,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/safeareaview (0.81.5): + - React-FabricComponents/components/safeareaview (0.81.4): - boost - DoubleConversion - fast_float @@ -2969,7 +2940,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/scrollview (0.81.5): + - React-FabricComponents/components/scrollview (0.81.4): - boost - DoubleConversion - fast_float @@ -2996,7 +2967,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/switch (0.81.5): + - React-FabricComponents/components/switch (0.81.4): - boost - DoubleConversion - fast_float @@ -3023,7 +2994,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/text (0.81.5): + - React-FabricComponents/components/text (0.81.4): - boost - DoubleConversion - fast_float @@ -3050,7 +3021,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/textinput (0.81.5): + - React-FabricComponents/components/textinput (0.81.4): - boost - DoubleConversion - fast_float @@ -3077,7 +3048,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/unimplementedview (0.81.5): + - React-FabricComponents/components/unimplementedview (0.81.4): - boost - DoubleConversion - fast_float @@ -3104,7 +3075,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/components/virtualview (0.81.5): + - React-FabricComponents/components/virtualview (0.81.4): - boost - DoubleConversion - fast_float @@ -3131,7 +3102,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricComponents/textlayoutmanager (0.81.5): + - React-FabricComponents/textlayoutmanager (0.81.4): - boost - DoubleConversion - fast_float @@ -3158,7 +3129,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-FabricImage (0.81.5): + - React-FabricImage (0.81.4): - boost - DoubleConversion - fast_float @@ -3167,21 +3138,21 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - RCTRequired (= 0.81.5) - - RCTTypeSafety (= 0.81.5) + - RCTRequired (= 0.81.4) + - RCTTypeSafety (= 0.81.4) - React-Fabric - React-featureflags - React-graphics - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.81.5) + - React-jsiexecutor (= 0.81.4) - React-logger - React-rendererdebug - React-utils - ReactCommon - SocketRocket - Yoga - - React-featureflags (0.81.5): + - React-featureflags (0.81.4): - boost - DoubleConversion - fast_float @@ -3190,7 +3161,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-featureflagsnativemodule (0.81.5): + - React-featureflagsnativemodule (0.81.4): - boost - DoubleConversion - fast_float @@ -3205,7 +3176,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - SocketRocket - - React-graphics (0.81.5): + - React-graphics (0.81.4): - boost - DoubleConversion - fast_float @@ -3218,7 +3189,7 @@ PODS: - React-jsiexecutor - React-utils - SocketRocket - - React-hermes (0.81.5): + - React-hermes (0.81.4): - boost - DoubleConversion - fast_float @@ -3227,16 +3198,16 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.81.5) + - React-cxxreact (= 0.81.4) - React-jsi - - React-jsiexecutor (= 0.81.5) + - React-jsiexecutor (= 0.81.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 0.81.5) + - React-perflogger (= 0.81.4) - React-runtimeexecutor - SocketRocket - - React-idlecallbacksnativemodule (0.81.5): + - React-idlecallbacksnativemodule (0.81.4): - boost - DoubleConversion - fast_float @@ -3252,7 +3223,7 @@ PODS: - React-runtimescheduler - ReactCommon/turbomodule/core - SocketRocket - - React-ImageManager (0.81.5): + - React-ImageManager (0.81.4): - boost - DoubleConversion - fast_float @@ -3267,7 +3238,7 @@ PODS: - React-rendererdebug - React-utils - SocketRocket - - React-jserrorhandler (0.81.5): + - React-jserrorhandler (0.81.4): - boost - DoubleConversion - fast_float @@ -3282,7 +3253,7 @@ PODS: - React-jsi - ReactCommon/turbomodule/bridging - SocketRocket - - React-jsi (0.81.5): + - React-jsi (0.81.4): - boost - DoubleConversion - fast_float @@ -3292,7 +3263,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsiexecutor (0.81.5): + - React-jsiexecutor (0.81.4): - boost - DoubleConversion - fast_float @@ -3301,15 +3272,15 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.81.5) - - React-jsi (= 0.81.5) + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 0.81.5) + - React-perflogger (= 0.81.4) - React-runtimeexecutor - SocketRocket - - React-jsinspector (0.81.5): + - React-jsinspector (0.81.4): - boost - DoubleConversion - fast_float @@ -3324,10 +3295,10 @@ PODS: - React-jsinspectornetwork - React-jsinspectortracing - React-oscompat - - React-perflogger (= 0.81.5) + - React-perflogger (= 0.81.4) - React-runtimeexecutor - SocketRocket - - React-jsinspectorcdp (0.81.5): + - React-jsinspectorcdp (0.81.4): - boost - DoubleConversion - fast_float @@ -3336,7 +3307,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-jsinspectornetwork (0.81.5): + - React-jsinspectornetwork (0.81.4): - boost - DoubleConversion - fast_float @@ -3349,7 +3320,7 @@ PODS: - React-performancetimeline - React-timing - SocketRocket - - React-jsinspectortracing (0.81.5): + - React-jsinspectortracing (0.81.4): - boost - DoubleConversion - fast_float @@ -3360,7 +3331,7 @@ PODS: - React-oscompat - React-timing - SocketRocket - - React-jsitooling (0.81.5): + - React-jsitooling (0.81.4): - boost - DoubleConversion - fast_float @@ -3368,16 +3339,16 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - React-cxxreact (= 0.81.5) - - React-jsi (= 0.81.5) + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) - React-jsinspector - React-jsinspectorcdp - React-jsinspectortracing - React-runtimeexecutor - SocketRocket - - React-jsitracing (0.81.5): + - React-jsitracing (0.81.4): - React-jsi - - React-logger (0.81.5): + - React-logger (0.81.4): - boost - DoubleConversion - fast_float @@ -3386,7 +3357,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-Mapbuffer (0.81.5): + - React-Mapbuffer (0.81.4): - boost - DoubleConversion - fast_float @@ -3396,7 +3367,7 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-microtasksnativemodule (0.81.5): + - React-microtasksnativemodule (0.81.4): - boost - DoubleConversion - fast_float @@ -3555,6 +3526,36 @@ PODS: - Yoga - react-native-quick-base64 (2.2.2): - React-Core + - react-native-quick-crypto (0.7.17): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - OpenSSL-Universal + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga - react-native-safe-area-context (5.6.1): - boost - DoubleConversion @@ -3698,7 +3699,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - React-NativeModulesApple (0.81.5): + - React-NativeModulesApple (0.81.4): - boost - DoubleConversion - fast_float @@ -3718,8 +3719,8 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - SocketRocket - - React-oscompat (0.81.5) - - React-perflogger (0.81.5): + - React-oscompat (0.81.4) + - React-perflogger (0.81.4): - boost - DoubleConversion - fast_float @@ -3728,7 +3729,7 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - SocketRocket - - React-performancetimeline (0.81.5): + - React-performancetimeline (0.81.4): - boost - DoubleConversion - fast_float @@ -3741,9 +3742,9 @@ PODS: - React-perflogger - React-timing - SocketRocket - - React-RCTActionSheet (0.81.5): - - React-Core/RCTActionSheetHeaders (= 0.81.5) - - React-RCTAnimation (0.81.5): + - React-RCTActionSheet (0.81.4): + - React-Core/RCTActionSheetHeaders (= 0.81.4) + - React-RCTAnimation (0.81.4): - boost - DoubleConversion - fast_float @@ -3759,7 +3760,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTAppDelegate (0.81.5): + - React-RCTAppDelegate (0.81.4): - boost - DoubleConversion - fast_float @@ -3793,7 +3794,7 @@ PODS: - React-utils - ReactCommon - SocketRocket - - React-RCTBlob (0.81.5): + - React-RCTBlob (0.81.4): - boost - DoubleConversion - fast_float @@ -3812,7 +3813,7 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTFabric (0.81.5): + - React-RCTFabric (0.81.4): - boost - DoubleConversion - fast_float @@ -3847,7 +3848,7 @@ PODS: - React-utils - SocketRocket - Yoga - - React-RCTFBReactNativeSpec (0.81.5): + - React-RCTFBReactNativeSpec (0.81.4): - boost - DoubleConversion - fast_float @@ -3861,10 +3862,10 @@ PODS: - React-Core - React-jsi - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.81.5) + - React-RCTFBReactNativeSpec/components (= 0.81.4) - ReactCommon - SocketRocket - - React-RCTFBReactNativeSpec/components (0.81.5): + - React-RCTFBReactNativeSpec/components (0.81.4): - boost - DoubleConversion - fast_float @@ -3887,7 +3888,7 @@ PODS: - ReactCommon - SocketRocket - Yoga - - React-RCTImage (0.81.5): + - React-RCTImage (0.81.4): - boost - DoubleConversion - fast_float @@ -3903,14 +3904,14 @@ PODS: - React-RCTNetwork - ReactCommon - SocketRocket - - React-RCTLinking (0.81.5): - - React-Core/RCTLinkingHeaders (= 0.81.5) - - React-jsi (= 0.81.5) + - React-RCTLinking (0.81.4): + - React-Core/RCTLinkingHeaders (= 0.81.4) + - React-jsi (= 0.81.4) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.81.5) - - React-RCTNetwork (0.81.5): + - ReactCommon/turbomodule/core (= 0.81.4) + - React-RCTNetwork (0.81.4): - boost - DoubleConversion - fast_float @@ -3928,7 +3929,7 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTRuntime (0.81.5): + - React-RCTRuntime (0.81.4): - boost - DoubleConversion - fast_float @@ -3948,7 +3949,7 @@ PODS: - React-runtimeexecutor - React-RuntimeHermes - SocketRocket - - React-RCTSettings (0.81.5): + - React-RCTSettings (0.81.4): - boost - DoubleConversion - fast_float @@ -3963,10 +3964,10 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-RCTText (0.81.5): - - React-Core/RCTTextHeaders (= 0.81.5) + - React-RCTText (0.81.4): + - React-Core/RCTTextHeaders (= 0.81.4) - Yoga - - React-RCTVibration (0.81.5): + - React-RCTVibration (0.81.4): - boost - DoubleConversion - fast_float @@ -3980,11 +3981,11 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon - SocketRocket - - React-rendererconsistency (0.81.5) - - React-renderercss (0.81.5): + - React-rendererconsistency (0.81.4) + - React-renderercss (0.81.4): - React-debug - React-utils - - React-rendererdebug (0.81.5): + - React-rendererdebug (0.81.4): - boost - DoubleConversion - fast_float @@ -3994,7 +3995,7 @@ PODS: - RCT-Folly/Fabric - React-debug - SocketRocket - - React-RuntimeApple (0.81.5): + - React-RuntimeApple (0.81.4): - boost - DoubleConversion - fast_float @@ -4023,7 +4024,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-RuntimeCore (0.81.5): + - React-RuntimeCore (0.81.4): - boost - DoubleConversion - fast_float @@ -4045,7 +4046,7 @@ PODS: - React-runtimescheduler - React-utils - SocketRocket - - React-runtimeexecutor (0.81.5): + - React-runtimeexecutor (0.81.4): - boost - DoubleConversion - fast_float @@ -4055,10 +4056,10 @@ PODS: - RCT-Folly/Fabric - React-debug - React-featureflags - - React-jsi (= 0.81.5) + - React-jsi (= 0.81.4) - React-utils - SocketRocket - - React-RuntimeHermes (0.81.5): + - React-RuntimeHermes (0.81.4): - boost - DoubleConversion - fast_float @@ -4079,7 +4080,7 @@ PODS: - React-runtimeexecutor - React-utils - SocketRocket - - React-runtimescheduler (0.81.5): + - React-runtimescheduler (0.81.4): - boost - DoubleConversion - fast_float @@ -4101,9 +4102,9 @@ PODS: - React-timing - React-utils - SocketRocket - - React-timing (0.81.5): + - React-timing (0.81.4): - React-debug - - React-utils (0.81.5): + - React-utils (0.81.4): - boost - DoubleConversion - fast_float @@ -4113,11 +4114,11 @@ PODS: - RCT-Folly - RCT-Folly/Fabric - React-debug - - React-jsi (= 0.81.5) + - React-jsi (= 0.81.4) - SocketRocket - - ReactAppDependencyProvider (0.81.5): + - ReactAppDependencyProvider (0.81.4): - ReactCodegen - - ReactCodegen (0.81.5): + - ReactCodegen (0.81.4): - boost - DoubleConversion - fast_float @@ -4143,7 +4144,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - SocketRocket - - ReactCommon (0.81.5): + - ReactCommon (0.81.4): - boost - DoubleConversion - fast_float @@ -4151,9 +4152,9 @@ PODS: - glog - RCT-Folly - RCT-Folly/Fabric - - ReactCommon/turbomodule (= 0.81.5) + - ReactCommon/turbomodule (= 0.81.4) - SocketRocket - - ReactCommon/turbomodule (0.81.5): + - ReactCommon/turbomodule (0.81.4): - boost - DoubleConversion - fast_float @@ -4162,15 +4163,15 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.81.5) - - React-cxxreact (= 0.81.5) - - React-jsi (= 0.81.5) - - React-logger (= 0.81.5) - - React-perflogger (= 0.81.5) - - ReactCommon/turbomodule/bridging (= 0.81.5) - - ReactCommon/turbomodule/core (= 0.81.5) + - React-callinvoker (= 0.81.4) + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) + - React-logger (= 0.81.4) + - React-perflogger (= 0.81.4) + - ReactCommon/turbomodule/bridging (= 0.81.4) + - ReactCommon/turbomodule/core (= 0.81.4) - SocketRocket - - ReactCommon/turbomodule/bridging (0.81.5): + - ReactCommon/turbomodule/bridging (0.81.4): - boost - DoubleConversion - fast_float @@ -4179,13 +4180,13 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.81.5) - - React-cxxreact (= 0.81.5) - - React-jsi (= 0.81.5) - - React-logger (= 0.81.5) - - React-perflogger (= 0.81.5) + - React-callinvoker (= 0.81.4) + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) + - React-logger (= 0.81.4) + - React-perflogger (= 0.81.4) - SocketRocket - - ReactCommon/turbomodule/core (0.81.5): + - ReactCommon/turbomodule/core (0.81.4): - boost - DoubleConversion - fast_float @@ -4194,14 +4195,14 @@ PODS: - hermes-engine - RCT-Folly - RCT-Folly/Fabric - - React-callinvoker (= 0.81.5) - - React-cxxreact (= 0.81.5) - - React-debug (= 0.81.5) - - React-featureflags (= 0.81.5) - - React-jsi (= 0.81.5) - - React-logger (= 0.81.5) - - React-perflogger (= 0.81.5) - - React-utils (= 0.81.5) + - React-callinvoker (= 0.81.4) + - React-cxxreact (= 0.81.4) + - React-debug (= 0.81.4) + - React-featureflags (= 0.81.4) + - React-jsi (= 0.81.4) + - React-logger (= 0.81.4) + - React-perflogger (= 0.81.4) + - React-utils (= 0.81.4) - SocketRocket - RecaptchaInterop (101.0.0) - RestartNewArch (1.0.85): @@ -4290,35 +4291,217 @@ PODS: - Yoga - RNDeviceInfo (14.1.1): - React-Core - - RNFBApp (23.4.0): - - Firebase/CoreOnly (= 12.3.0) + - RNFBApp (24.0.0): + - boost + - DoubleConversion + - fast_float + - Firebase/CoreOnly (= 12.10.0) + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety - React-Core - - RNFBAuth (23.4.0): - - Firebase/Auth (= 12.3.0) + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNFBAuth (24.0.0): + - boost + - DoubleConversion + - fast_float + - Firebase/Auth (= 12.10.0) + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core - RNFBApp - - RNFBCrashlytics (23.4.0): - - Firebase/Crashlytics (= 12.3.0) + - SocketRocket + - Yoga + - RNFBCrashlytics (24.0.0): + - boost + - DoubleConversion + - fast_float + - Firebase/Crashlytics (= 12.10.0) - FirebaseCoreExtension + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core - RNFBApp - - RNFBFirestore (23.4.0): - - Firebase/Firestore (= 12.3.0) + - SocketRocket + - Yoga + - RNFBFirestore (24.0.0): + - boost + - DoubleConversion + - fast_float + - Firebase/Firestore (= 12.10.0) + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core - RNFBApp - - RNFBFunctions (23.4.0): - - Firebase/Functions (= 12.3.0) + - SocketRocket + - Yoga + - RNFBFunctions (24.0.0): + - boost + - DoubleConversion + - fast_float + - Firebase/Functions (= 12.10.0) + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core - RNFBApp - - RNFBMessaging (23.4.0): - - Firebase/Messaging (= 12.3.0) + - SocketRocket + - Yoga + - RNFBMessaging (24.0.0): + - boost + - DoubleConversion + - fast_float + - Firebase/Messaging (= 12.10.0) - FirebaseCoreExtension + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core - RNFBApp - - RNFBStorage (23.4.0): - - Firebase/Storage (= 12.3.0) + - SocketRocket + - Yoga + - RNFBStorage (24.0.0): + - boost + - DoubleConversion + - fast_float + - Firebase/Storage (= 12.10.0) + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core - RNFBApp + - SocketRocket + - Yoga - RNGestureHandler (2.28.0): - boost - DoubleConversion @@ -4766,7 +4949,6 @@ DEPENDENCIES: - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - lottie-react-native (from `../node_modules/lottie-react-native`) - NitroModules (from `../node_modules/react-native-nitro-modules`) - - QuickCrypto (from `../node_modules/react-native-quick-crypto`) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - RCTRequired (from `../node_modules/react-native/Libraries/Required`) @@ -4807,6 +4989,7 @@ DEPENDENCIES: - react-native-pager-view (from `../node_modules/react-native-pager-view`) - react-native-pdf-from-image (from `../node_modules/react-native-pdf-from-image`) - react-native-quick-base64 (from `../node_modules/react-native-quick-base64`) + - react-native-quick-crypto (from `../node_modules/react-native-quick-crypto`) - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - react-native-view-shot (from `../node_modules/react-native-view-shot`) - react-native-webview (from `../node_modules/react-native-webview`) @@ -4899,6 +5082,7 @@ SPEC REPOS: - libwebp - lottie-ios - nanopb + - OpenSSL-Universal - PromisesObjC - PromisesSwift - RecaptchaInterop @@ -4983,8 +5167,6 @@ EXTERNAL SOURCES: :path: "../node_modules/lottie-react-native" NitroModules: :path: "../node_modules/react-native-nitro-modules" - QuickCrypto: - :path: "../node_modules/react-native-quick-crypto" RCT-Folly: :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" RCTDeprecation: @@ -5063,6 +5245,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-pdf-from-image" react-native-quick-base64: :path: "../node_modules/react-native-quick-base64" + react-native-quick-crypto: + :path: "../node_modules/react-native-quick-crypto" react-native-safe-area-context: :path: "../node_modules/react-native-safe-area-context" react-native-view-shot: @@ -5209,25 +5393,25 @@ SPEC CHECKSUMS: ExpoWebBrowser: d04a0d6247a0bea4519fbc2ea816610019ad83e0 EXTaskManager: cf225704fab8de8794a6f57f7fa41a90c0e2cd47 fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 - FBLazyVector: 5beb8028d5a2e75dd9634917f23e23d3a061d2aa - Firebase: f5439b235721ceeef14ca1f327c0da8e4e8556b5 - FirebaseAppCheckInterop: 3a8527abb8bb89fb1bd2bd3d1d7b463c0ceb0cbf - FirebaseAuth: 4fdd7ee2da745f79145124f5191639d2ea756a77 - FirebaseAuthInterop: a7c394818a93d374c543ca085f3a46ab7c71372e - FirebaseCore: ff47fe1ad3ab9ef66edd3e8bc4647b493d2067f8 - FirebaseCoreExtension: 898ca55c7cb126f83747b32cb0daa95394b10853 - FirebaseCoreInternal: a9e1ff270f217489d9258563b693d11a312903bf - FirebaseCrashlytics: a2a9947c0c265575a98213e7c25b0d777f6921b3 - FirebaseFirestore: 93138b63239303eeb035d922920f4e48216f0c2d - FirebaseFirestoreInternal: 81150153b7b25b5eee4633cc5c7f08ab83bda966 - FirebaseFunctions: 7ed4b5e4834c9cf6db02753723ee29fce3f5f440 - FirebaseInstallations: ca48ec60ea51b66b9f214a91847ea3720cde97f5 - FirebaseMessaging: 919ce76cb353f0c36d463f5461d8ab584e6ed765 - FirebaseMessagingInterop: f5ed999a2c51bd454beb9f75a5f966b321660884 - FirebaseRemoteConfigInterop: 66d61ad6cee1cd2137cb8dedf468112e9ba92c6a - FirebaseSessions: 352b204966530e5cb7036c02d8c366922210e681 - FirebaseSharedSwift: a08758c5e2617f3ebb47865b45ecca6f02cd35ea - FirebaseStorage: 23c8869d6e9d93f159766c4f81f6ead6410aff4f + FBLazyVector: 941bef1c8eeabd9fe1f501e30a5220beee913886 + Firebase: 99f203d3a114c6ba591f3b32263a9626e450af65 + FirebaseAppCheckInterop: 2480ab50a070a6bc02e26e62733874361f017a11 + FirebaseAuth: 7109e33998bbd96f983dc02b97289b535f6f4141 + FirebaseAuthInterop: f9c841843d840cae6a7db7551452eac520ffa3bd + FirebaseCore: f4428e22415ea3b3eca652c2098413dabf2a23a9 + FirebaseCoreExtension: 3473a6ec16a91aee29fb75994a86c0220d2cddf3 + FirebaseCoreInternal: e7bbaeb00ab73011298f35ed223aa7371e212948 + FirebaseCrashlytics: cd1baeb80302ec5ea1012f732ab94df7d76f09f7 + FirebaseFirestore: 3c85b7fc1cbad3bcfc0ba807861aa55e0ad4af22 + FirebaseFirestoreInternal: a5120d3aea03c837ff9937c90e8a95f81e6a0706 + FirebaseFunctions: 8fcae1e736d3665f4411ea647d407cb3a8151454 + FirebaseInstallations: 047343aa91fd6a1ebfa3eb374ddecf36a8aaddfd + FirebaseMessaging: ed18fb50634e6e85b5d3e77e628c21e2c928cc53 + FirebaseMessagingInterop: 2729786ffbc2b3414d157ed832420859248f03e3 + FirebaseRemoteConfigInterop: a169873f4093b241eb5e27a4fbad91af36d64b8d + FirebaseSessions: dba7635960740ad77cc2f3387d90ff22a7942f82 + FirebaseSharedSwift: 3d1e448b7202e36821a492941c84592d1308ea14 + FirebaseStorage: dd2dcbd47f603777206c04d2bd837e5f47ca3f4d fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 @@ -5235,7 +5419,7 @@ SPEC CHECKSUMS: "gRPC-C++": cc207623316fb041a7a3e774c252cf68a058b9e8 gRPC-Core: 860978b7db482de8b4f5e10677216309b5ff6330 GTMSessionFetcher: 904bdd2a82c635bcd6f44edf94cc8775c5d1d6e6 - hermes-engine: 9f4dfe93326146a1c99eb535b1cb0b857a3cd172 + hermes-engine: 35c763d57c9832d0eef764316ca1c4d043581394 leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19 libavif: 5f8e715bea24debec477006f21ef9e95432e254d libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f @@ -5244,93 +5428,94 @@ SPEC CHECKSUMS: lottie-react-native: d2b7601b28c063bde347fac764166b5362037846 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 NitroModules: f8c2cc3025e4550aee15ff77c525622bf98e774a + OpenSSL-Universal: 9110d21982bb7e8b22a962b6db56a8aa805afde7 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 - QuickCrypto: f74d286d21d8e36afb04dafd1c080877937d4374 RCT-Folly: b29feb752b08042c62badaef7d453f3bb5e6ae23 - RCTDeprecation: 5eb1d2eeff5fb91151e8a8eef45b6c7658b6c897 - RCTRequired: cebcf9442fc296c9b89ac791dfd463021d9f6f23 - RCTTypeSafety: b99aa872829ee18f6e777e0ef55852521c5a6788 - React: 914f8695f9bf38e6418228c2ffb70021e559f92f - React-callinvoker: 23cd4e33928608bd0cc35357597568b8b9a5f068 - React-Core: 6a0a97598e9455348113bfe4c573fe8edac34469 - React-CoreModules: a88a6ca48b668401b9780e272e2a607e70f9f955 - React-cxxreact: 06265fd7e8d5c3b6b49e00d328ef76e5f1ae9c8b - React-debug: 29aed758c756956a51b4560223edbd15191ca4c5 - React-defaultsnativemodule: c406bf7cd78036efffb7dec9df469257a1bca58c - React-domnativemodule: 925ea5ff8cb05c68e910057e6349e5898cce00f3 - React-Fabric: 13130d0a70f17e913865b04673ee64603d6c42fe - React-FabricComponents: 1f01ea24a1314bf9abcac4743bb7ad8791336be6 - React-FabricImage: f364dc54fcf8b0ef77192674a009aa4f65b34d75 - React-featureflags: 32217ac18a8c216fc571044186fb04164af72772 - React-featureflagsnativemodule: 9c552bb908a7434baa846002ee1752a77b1a5520 - React-graphics: 3034a698e46e947f74a443e761f1feef742e9d71 - React-hermes: a852be3ab9e1f515e46ba3ea9f48c31d4a9df437 - React-idlecallbacksnativemodule: c43fe1f2221b0548cc366bf15f88efb3b3221bbf - React-ImageManager: 7efd7b19cdfaa3a82482e9e6ac0b56606a3ec271 - React-jserrorhandler: 597057d0b9d158c03e02aa376a4a95f64f46a910 - React-jsi: 7b53959aea60909ac6bbe4dd0bdec6c10d7dc597 - React-jsiexecutor: 19938072af05ade148474bac41e0324a2d733f44 - React-jsinspector: eb6bb244a75cbd56f32767daf2efdb344e2ff10c - React-jsinspectorcdp: 727f37537e9c7ab22b6b86c802d879efae5e2757 - React-jsinspectornetwork: 11d47e644701c58038ef8d7f54a405ddd62b3b16 - React-jsinspectortracing: 8875637e6c65b3b9a3852b006856562e874e7a78 - React-jsitooling: b6e6a2551459a6ef9e1529df2ea981fa27ed3a91 - React-jsitracing: 879e2b2f80dd33d84175989de0a8db5d662505db - React-logger: a913317214a26565cd4c045347edf1bcacb80a3f - React-Mapbuffer: 017336879e2e0fb7537bbc08c24f34e2384c9260 - React-microtasksnativemodule: 63ee6730cec233feab9cdcc0c100dc28a12e4165 + RCTDeprecation: c0ed3249a97243002615517dff789bf4666cf585 + RCTRequired: 58719f5124f9267b5f9649c08bf23d9aea845b23 + RCTTypeSafety: 4aefa8328ab1f86da273f08517f1f6b343f6c2cc + React: 2073376f47c71b7e9a0af7535986a77522ce1049 + React-callinvoker: 751b6f2c83347a0486391c3f266f291f0f53b27e + React-Core: dff5d29973349b11dd6631c9498456d75f846d5e + React-CoreModules: c0ae04452e4c5d30e06f8e94692a49107657f537 + React-cxxreact: 376fd672c95dfb64ad5cc246e6a1e9edb78dec4c + React-debug: d4955c86870792887ed695df6ebf0e94e39dc7e1 + React-defaultsnativemodule: bd2b805c6daa85d430d034aa748544b377ada152 + React-domnativemodule: b5c04a4a74ed9c3cb25adc72583b017868600464 + React-Fabric: 93a9ff378f1edf29e9a22a24ad55a1be061e7985 + React-FabricComponents: 83bd54366d4ecb8bec563aa1a78d49915763d503 + React-FabricImage: 8bcd88e553047d4ed5c7ea3def8d6c0e3dd88cfc + React-featureflags: 4ea691ab154d505277859416aa226ae32edeef5f + React-featureflagsnativemodule: b8f00b01436294a30dc62fb5e50b70aa3910309c + React-graphics: d6207795fe822668daeb9c6e1f1470a8500d9eec + React-hermes: fcbdc45ecf38259fe3b12642bd0757c52270a107 + React-idlecallbacksnativemodule: f390a518e1a862453f45f86a1bc248350634d858 + React-ImageManager: acb99e093632b7fc2953dd45f2abaeeea2d9588e + React-jserrorhandler: 958ab9afbe7acdbfe8ca225f7503313409b1319a + React-jsi: 59ec3190dd364cca86a58869e7755477d2468948 + React-jsiexecutor: b87d78a2e8dd7a6f56e9cdac038da45de98c944f + React-jsinspector: 9c33e0c4eeeb10a23b61c4501947b57977980e0e + React-jsinspectorcdp: d7b2c3feddd3669f0eaad2ac1e0f7afbc1d1cf18 + React-jsinspectornetwork: 696d0cf07016e69c053deffba30003fa448904a3 + React-jsinspectortracing: 05d49cd8795db15a279eab6f7604dfa9fe9622f1 + React-jsitooling: 0f9894c3656c3c13d4fcfe6e1dc964fd340acf49 + React-jsitracing: dc11027f9e4e829d32bf17626ec831581ea05223 + React-logger: a3cb5b29c32b8e447b5a96919340e89334062b48 + React-Mapbuffer: e4a65db5f4df53369f39558c0cf2f480f6d3d6c7 + React-microtasksnativemodule: 86334c5c06315e0bccb7b6e6f2c905e92f98b615 react-native-context-menu-view: 418877dcac6add4abba8fc2ee92c39f05b763f3a react-native-get-random-values: 5c2e7ce0c1eedefde8e97fe60152601887fcfa08 react-native-keyboard-controller: c4ca61f44d66c2f8987a7e67e9b78e80dc965c45 react-native-pager-view: 0e228ec2dfdd87807d125c7bbfb83299edede19c react-native-pdf-from-image: af6ff3b4b4dd840d02fb733e0e7b047b9ebab4ae react-native-quick-base64: 6568199bb2ac8e72ecdfdc73a230fbc5c1d3aac4 + react-native-quick-crypto: 2c53f72c27485924b444dda124639ee363cf1d69 react-native-safe-area-context: ee1e8e2a7abf737a8d4d9d1a5686a7f2e7466236 react-native-view-shot: aab9ffbcc2f01035ee8ffd9a00c773e215b35c8b react-native-webview: d73728424a0e24989d71ffdc6fcf15d5f74ff4a2 - React-NativeModulesApple: cbceb3c4cb726838c461b13802a76cefa6f3476f - React-oscompat: eb0626e8ba1a2c61673c991bf9dc21834898475d - React-perflogger: 509e1f9a3ee28df71b0a66de806ac515ce951246 - React-performancetimeline: 9ce28cce1cded27410c293283f99fe62bebdb920 - React-RCTActionSheet: 30fe8f9f8d86db4a25ff34595a658ecd837485fc - React-RCTAnimation: 3126eb1cb8e7a6ca33a52fd833d8018aa9311af1 - React-RCTAppDelegate: b03981c790aa40cf26e0f78cc0f1f2df8287ead4 - React-RCTBlob: 53c35e85c85d6bdaa55dc81a0b290d4e78431095 - React-RCTFabric: 59ad9008775f123019c508efff260594a8509791 - React-RCTFBReactNativeSpec: 82b605ab4f6f8da0a7ad88641161df5a0bafb1fb - React-RCTImage: 074b2faa71a152a456c974e118b60c9eeda94a64 - React-RCTLinking: e5ca17a4f7ae2ad7b0c0483be77e1b383ecd0a8a - React-RCTNetwork: c508d7548c9eceac30a8100a846ea00033a03366 - React-RCTRuntime: 6979568c0bc276fe785e085894f954fa15e0ec7e - React-RCTSettings: dd84c857a4fce42c1e08c1dabcda894e25af4a6e - React-RCTText: 6e4b177d047f98bccb90d6fb1ebdd3391cf8b299 - React-RCTVibration: 9572d4a06a0c92650bcc62913e50eb2a89f19fb6 - React-rendererconsistency: a7b47f8b186af64ff8509c8caec4114a2f1ae63f - React-renderercss: 9845c5063b3a2d0462ed4e4c7fc34219a5d608ed - React-rendererdebug: 3905e346c06347b86c6e49d427062cdd638a3044 - React-RuntimeApple: 97233caf2b635c40819bf5be38d818777f8229ab - React-RuntimeCore: dc41f86fcdf1fbb42a5b8388a29bf59dfa56b2f8 - React-runtimeexecutor: d16d045faaf6cd7de8d1aa8e31a51c13d8db84a4 - React-RuntimeHermes: 5a9d132554c8d6b416d794cd4ac7d927b2f88f7b - React-runtimescheduler: 689d805d43c28b8fb1ab390914e042d10e2ea2ab - React-timing: c39eeb992274aeaeb9f4666dc97a36a31d33fe94 - React-utils: 2f9ba0088251788ad66aa1855ff99ed2424024d2 - ReactAppDependencyProvider: 1bcd3527ac0390a1c898c114f81ff954be35ed79 - ReactCodegen: 2e921a931c5a4dd1d8ab37ade085fdf58fcfe1dd - ReactCommon: 6d0fa86a4510730da7c72560e0ced14258292ab9 + React-NativeModulesApple: 8c7eb6057b00c191a11ad5ced41826ec5a0e4d78 + React-oscompat: 93b5535ea7f7dff46aaee4f78309a70979bdde9d + React-perflogger: 5536d2df3d18fe0920263466f7b46a56351c0510 + React-performancetimeline: c6c9393c1a0453a51e1852e3531defe60790b36c + React-RCTActionSheet: 42195ae666e6d79b4af2346770f765b7c29435b9 + React-RCTAnimation: fa103ccc3503b1ed8dedca7e62e7823937748843 + React-RCTAppDelegate: 665d4baf19424cef08276e9ac0d8771eec4519f9 + React-RCTBlob: 0fa9530c255644db095f2c4fd8d89738d9d9ecc0 + React-RCTFabric: 95eb4a92c5c166e21bae07231d327174e56f202d + React-RCTFBReactNativeSpec: fd66225b71f902a8bfa939fb5f7ec743958298df + React-RCTImage: ba824e61ce2e920a239a65d130b83c3a1d426dff + React-RCTLinking: d2dc199c37e71e6f505d9eca3e5c33be930014d4 + React-RCTNetwork: 87137d4b9bd77e5068f854dd5c1f30d4b072faf6 + React-RCTRuntime: b10bd5e5506af0d6205c4101dd1560fe7beead95 + React-RCTSettings: 71f5c7fd7b5f4e725a4e2114a4b4373d0e46048f + React-RCTText: b94d4699b49285bee22b8ebf768924d607eccee3 + React-RCTVibration: 6e3993c4f6c36a3899059f9a9ead560ddaf5a7d7 + React-rendererconsistency: 612d0f6603d9837bb1236d7fd5194203b35c8799 + React-renderercss: e5c2c3b84976f7a587cde8423c671db07a6a77da + React-rendererdebug: cc7a6131733605b8897754f72c0c35c79f77da9e + React-RuntimeApple: 3f96102fc1ebf738d36719cdce5422a5769293fb + React-RuntimeCore: f05563107927f155180dfa008fed2ac1316a6aec + React-runtimeexecutor: dd3ec3b76761b43e7b37d07a70de91fc1dd24e7e + React-RuntimeHermes: 7fcb384acc111ea21bcffe2e4a15f31b58bb702e + React-runtimescheduler: 7d2eaa4e7d652a391f47df7ff510260413429bd9 + React-timing: f5d4ba74be96a24b9b2a1a910142ed14e03013d9 + React-utils: eb92d1db56a9bb5911b2c77fb4c2e8d331c8b9dd + ReactAppDependencyProvider: 433ddfb4536948630aadd5bd925aff8a632d2fe3 + ReactCodegen: 2cfa890e84ecf7f3a708f1ed9c0f2c0b22a23c9a + ReactCommon: e9ab32f1d1482d207867b4fdd139361302b9dcc6 RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba RestartNewArch: 658794e23d94410cb51e6f8c1831edadf09c77b2 RNCAsyncStorage: fd44f4b03e007e642e98df6726737bc66e9ba609 RNCMaskedView: d707a83784c67099b54b37d056ababb2767ce15e RNDeviceInfo: bcce8752b5043a623fe3c26789679b473f705d3c - RNFBApp: 0211ae65fadcb017cc787b2bd539847330687b93 - RNFBAuth: 867bf4293ca2d48c7266d9eff9e970f882331578 - RNFBCrashlytics: 25573e9e170a6bd9b5c48d3fab6611405e7b500b - RNFBFirestore: bde0e0ad46387b6e88fdefa530fcdcba0468c538 - RNFBFunctions: 8ea7a8f1d95e5cbaa61dae4ef9af81142d23d327 - RNFBMessaging: 97dc90cb79d1d015250d9d10032c920f1d49c354 - RNFBStorage: 5c21c866bfd7c9e1c0c2f25d5de1a424b83f620e + RNFBApp: 59a5f1280d8c7d48ed5cb658682ed12904bca65e + RNFBAuth: dd62a2385ba9bca1532108ae77cd983ef37be556 + RNFBCrashlytics: be487839f66b7339b49e9fd56463bcfbaa43a66d + RNFBFirestore: f4722afdf9ae700f76a72c76f109c2368465092b + RNFBFunctions: 0ca089c5cd66c4697fb679f26c3bae052c583a8b + RNFBMessaging: 296600da7f02e92bb6631c11ef5e19bc1b89a54d + RNFBStorage: be773adcf213c4e22a33d0a277c1ff64d11e75f4 RNGestureHandler: b8d2e75c2e88fc2a1f6be3b3beeeed80b88fa37d RNLocalize: a0bf70cf27f116db4e32be09a6f549715db0686d RNQrGenerator: 52e7e215efc31a88dc2cdbfa97903b6ab486ced9 @@ -5346,7 +5531,7 @@ SPEC CHECKSUMS: spark-sdk: 5fb05f37f18abd8a480f1ea994fabdd7b14b1e7f UMAppLoader: e1234c45d2b7da239e9e90fc4bbeacee12afd5b6 VisionCamera: 7187b3dac1ff3071234ead959ce311875748e14f - Yoga: cc4a6600d61e4e9276e860d4d68eebb834a050ba + Yoga: 9b30b783a17681321b52ac507a37219d7d795ace ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5 PODFILE CHECKSUM: b32f867d7020aa569d4ef0fb33463b7ae90bf924 diff --git a/locales/de-DE/translation.json b/locales/de-DE/translation.json index dcc6902f..9e044ed9 100644 --- a/locales/de-DE/translation.json +++ b/locales/de-DE/translation.json @@ -2037,7 +2037,8 @@ "quoteId": "Angebots-ID", "destinationAddress": "Zieladresse", "destinationAsset": "Ziel-Asset", - "destinationChain": "Ziel-Kette" + "destinationChain": "Ziel-Kette", + "transferIds": "Enthaltene Personen" }, "viewAllTxPage": { "title": "Transaktionen", diff --git a/locales/en/translation.json b/locales/en/translation.json index aa9f4f22..69ff43f0 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -2037,7 +2037,8 @@ "quoteId": "Quote ID", "destinationAddress": "Destination Address", "destinationAsset": "Destination Asset", - "destinationChain": "Destination Chain" + "destinationChain": "Destination Chain", + "transferIds": "People Included" }, "viewAllTxPage": { "title": "Transactions", diff --git a/locales/es/translation.json b/locales/es/translation.json index 4f1f73e6..927f35ac 100644 --- a/locales/es/translation.json +++ b/locales/es/translation.json @@ -2037,7 +2037,8 @@ "quoteId": "ID de Cotización", "destinationAddress": "Dirección de Destino", "destinationAsset": "Activo de Destino", - "destinationChain": "Cadena de Destino" + "destinationChain": "Cadena de Destino", + "transferIds": "Personas incluidas" }, "viewAllTxPage": { "title": "Transacciones", diff --git a/locales/fr/translation.json b/locales/fr/translation.json index cf6edeea..08ad16b1 100644 --- a/locales/fr/translation.json +++ b/locales/fr/translation.json @@ -2037,7 +2037,8 @@ "quoteId": "ID du Devis", "destinationAddress": "Adresse de Destination", "destinationAsset": "Actif de Destination", - "destinationChain": "Chaîne de Destination" + "destinationChain": "Chaîne de Destination", + "transferIds": "Personnes incluses" }, "viewAllTxPage": { "title": "Transactions", diff --git a/locales/it/translation.json b/locales/it/translation.json index 3e7a5e15..4fa3cf7b 100644 --- a/locales/it/translation.json +++ b/locales/it/translation.json @@ -2037,7 +2037,8 @@ "quoteId": "ID Quotazione", "destinationAddress": "Indirizzo di Destinazione", "destinationAsset": "Asset di Destinazione", - "destinationChain": "Catena di Destinazione" + "destinationChain": "Catena di Destinazione", + "transferIds": "Persone incluse" }, "viewAllTxPage": { "title": "Transazioni", diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index 655e8081..1feceb9d 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -2037,7 +2037,8 @@ "quoteId": "ID da cotação", "destinationAddress": "Endereço de destino", "destinationAsset": "Moeda de destino", - "destinationChain": "Rede de destino" + "destinationChain": "Rede de destino", + "transferIds": "Pessoas incluídas" }, "viewAllTxPage": { "title": "Transações", diff --git a/locales/ru/translation.json b/locales/ru/translation.json index 849ec93c..faee160d 100644 --- a/locales/ru/translation.json +++ b/locales/ru/translation.json @@ -2038,7 +2038,8 @@ "quoteId": "ID котировки", "destinationAddress": "Адрес назначения", "destinationAsset": "Актив назначения", - "destinationChain": "Сеть назначения" + "destinationChain": "Сеть назначения", + "transferIds": "Включённые участники" }, "viewAllTxPage": { "title": "Транзакции", diff --git a/locales/sv/translation.json b/locales/sv/translation.json index 86fc33f2..6c420dc8 100644 --- a/locales/sv/translation.json +++ b/locales/sv/translation.json @@ -2037,7 +2037,8 @@ "quoteId": "Offert-ID", "destinationAddress": "Destinationsadress", "destinationAsset": "Destinations-tillgång", - "destinationChain": "Destinations-kedja" + "destinationChain": "Destinations-kedja", + "transferIds": "Inkluderade personer" }, "viewAllTxPage": { "title": "Transaktioner", diff --git a/package.json b/package.json index bbc842d2..8680e38b 100644 --- a/package.json +++ b/package.json @@ -25,13 +25,13 @@ "@noble/hashes": "^1.8.0", "@noble/secp256k1": "^3.0.0", "@react-native-async-storage/async-storage": "2.2.0", - "@react-native-firebase/app": "^23.4.0", - "@react-native-firebase/auth": "^23.4.0", - "@react-native-firebase/crashlytics": "^23.4.0", - "@react-native-firebase/firestore": "^23.4.0", - "@react-native-firebase/functions": "^23.4.0", - "@react-native-firebase/messaging": "^23.4.0", - "@react-native-firebase/storage": "^23.4.0", + "@react-native-firebase/app": "^24.0.0", + "@react-native-firebase/auth": "^24.0.0", + "@react-native-firebase/crashlytics": "^24.0.0", + "@react-native-firebase/firestore": "^24.0.0", + "@react-native-firebase/functions": "^24.0.0", + "@react-native-firebase/messaging": "^24.0.0", + "@react-native-firebase/storage": "^24.0.0", "@react-native-masked-view/masked-view": "^0.3.2", "@react-navigation/bottom-tabs": "^7.3.13", "@react-navigation/drawer": "^7.3.12", @@ -78,7 +78,7 @@ "nostr-tools": "^2.15.0", "react": "19.1.0", "react-i18next": "^16.0.0", - "react-native": "0.81.5", + "react-native": "0.81.4", "react-native-context-menu-view": "^1.19.0", "react-native-country-flag": "^2.0.2", "react-native-country-picker-modal": "^2.0.0", @@ -93,7 +93,7 @@ "react-native-pdf-from-image": "^0.3.6", "react-native-qrcode-svg": "^6.3.15", "react-native-quick-base64": "^2.2.2", - "react-native-quick-crypto": "^1.0.16", + "react-native-quick-crypto": "0.7.17", "react-native-reanimated": "^4.2.2", "react-native-restart-newarch": "^1.0.85", "react-native-safe-area-context": "~5.6.0", @@ -119,10 +119,10 @@ "@react-native-community/cli": "20.0.0", "@react-native-community/cli-platform-android": "20.0.0", "@react-native-community/cli-platform-ios": "20.0.0", - "@react-native/babel-preset": "0.81.5", - "@react-native/eslint-config": "0.81.5", - "@react-native/metro-config": "0.81.5", - "@react-native/typescript-config": "0.81.5", + "@react-native/babel-preset": "0.81.4", + "@react-native/eslint-config": "0.81.4", + "@react-native/metro-config": "0.81.4", + "@react-native/typescript-config": "0.81.4", "@types/jest": "^29.5.13", "@types/react": "~19.1.10", "@types/react-test-renderer": "^19.1.0", diff --git a/yarn.lock b/yarn.lock index c773c6ce..4355dad4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1656,7 +1656,17 @@ __metadata: languageName: node linkType: hard -"@craftzdog/react-native-buffer@npm:6.1.0, @craftzdog/react-native-buffer@npm:^6.1.0": +"@craftzdog/react-native-buffer@npm:^6.0.5": + version: 6.1.1 + resolution: "@craftzdog/react-native-buffer@npm:6.1.1" + dependencies: + ieee754: ^1.2.1 + react-native-quick-base64: ^2.2.2 + checksum: bf8ae64b9631b14677d667c07c82fe6397ef5f317f58ab3d3617a716da757bd0eaf9cc092687103bc3f1448f095305be9672fb10d036331ed0ad4590b3036959 + languageName: node + linkType: hard + +"@craftzdog/react-native-buffer@npm:^6.1.0": version: 6.1.0 resolution: "@craftzdog/react-native-buffer@npm:6.1.0" dependencies: @@ -2166,34 +2176,34 @@ __metadata: languageName: node linkType: hard -"@firebase/ai@npm:2.2.1": - version: 2.2.1 - resolution: "@firebase/ai@npm:2.2.1" +"@firebase/ai@npm:2.9.0": + version: 2.9.0 + resolution: "@firebase/ai@npm:2.9.0" dependencies: "@firebase/app-check-interop-types": 0.3.3 - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x "@firebase/app-types": 0.x - checksum: 7011f16c66e948e58e8a0e40e6fce6ef5bbd48afc8550f8c569ee77991ba497a981e95bb3a81357e957824f73b5183abbd753b12615375dfc83a957962f6fa59 + checksum: 04b5eb35946f53b1aa3c30214d607d6409f53173609a5cf9deb7fd8ae318fd2880afbdf8a2a7cdd1eef8ce10dcd5ba58b3495672738b6014a0bd16ad166a4387 languageName: node linkType: hard -"@firebase/analytics-compat@npm:0.2.24": - version: 0.2.24 - resolution: "@firebase/analytics-compat@npm:0.2.24" +"@firebase/analytics-compat@npm:0.2.26": + version: 0.2.26 + resolution: "@firebase/analytics-compat@npm:0.2.26" dependencies: - "@firebase/analytics": 0.10.18 + "@firebase/analytics": 0.10.20 "@firebase/analytics-types": 0.8.3 - "@firebase/component": 0.7.0 - "@firebase/util": 1.13.0 + "@firebase/component": 0.7.1 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: 4c3579bf8d2c24d5d6c84d0dce455c1cbcafa9bb474518b26c7c417b661f1a2d542f274688b16ba43a8b6e1c6225ffcc1c0e3175aa466bc067beabcdf3cb713d + checksum: e3250962fe490505027366a4d0c91f88f6b7bf31c56a6904911940274abc7f9d30b58b15a13c9d849154910ceb26320470aa477d42f693ac1175c6d0eaccf8fd languageName: node linkType: hard @@ -2204,34 +2214,34 @@ __metadata: languageName: node linkType: hard -"@firebase/analytics@npm:0.10.18": - version: 0.10.18 - resolution: "@firebase/analytics@npm:0.10.18" +"@firebase/analytics@npm:0.10.20": + version: 0.10.20 + resolution: "@firebase/analytics@npm:0.10.20" dependencies: - "@firebase/component": 0.7.0 - "@firebase/installations": 0.6.19 + "@firebase/component": 0.7.1 + "@firebase/installations": 0.6.20 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: f7d2e1d3a2c7587349236880d8be1d508e004ead18360706f842a87b5a7ad15b7bbc7f7f1f4244eeedb8eaae0fa1fff2053e77f60d28c2d3e0413fb4363b07fd + checksum: 1584a640489d8b37bb82112e0f180d69f8ba076ebae8a3323ebaf374de8b2cd9e513ba4838a4ef63cbfe955565b32b8bfe8d617020b4c00070c70e493f5ab72e languageName: node linkType: hard -"@firebase/app-check-compat@npm:0.4.0": - version: 0.4.0 - resolution: "@firebase/app-check-compat@npm:0.4.0" +"@firebase/app-check-compat@npm:0.4.1": + version: 0.4.1 + resolution: "@firebase/app-check-compat@npm:0.4.1" dependencies: - "@firebase/app-check": 0.11.0 + "@firebase/app-check": 0.11.1 "@firebase/app-check-types": 0.5.3 - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: 9302a1d454a96453c9a6ef4c19c0d4c0e406fe8f9d7b151428f69c3148786eb01212fb56b82e69d17be0c7f3b96c9fb407ee53c3761933f233f159836870c1c8 + checksum: 8893ef043f91653d5a980752dbc5a3ad0a18d5e3e50774dfb6f7ff7be40befecc9aeb72cdd3e15d3277827be89ce2c71c5d2740a120432e210e142b02b34bc8b languageName: node linkType: hard @@ -2249,30 +2259,30 @@ __metadata: languageName: node linkType: hard -"@firebase/app-check@npm:0.11.0": - version: 0.11.0 - resolution: "@firebase/app-check@npm:0.11.0" +"@firebase/app-check@npm:0.11.1": + version: 0.11.1 + resolution: "@firebase/app-check@npm:0.11.1" dependencies: - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: df7d57d2e0da3954e45692e63769e4e2b3ffa57ade441a3510e06a0c9e8ea22e925dbe45393065299e6e5360031a1bb109138a657580e59365f8155a9da4b843 + checksum: f4ee6186ebfd78e8ce5373a19c9f5b7b3d7e6f52e2149a0a82e235e63ca8c7120e6fde20c37c2c259399bcfd62038b8adbf60a856a1934da5a61a5769397a523 languageName: node linkType: hard -"@firebase/app-compat@npm:0.5.2": - version: 0.5.2 - resolution: "@firebase/app-compat@npm:0.5.2" +"@firebase/app-compat@npm:0.5.9": + version: 0.5.9 + resolution: "@firebase/app-compat@npm:0.5.9" dependencies: - "@firebase/app": 0.14.2 - "@firebase/component": 0.7.0 + "@firebase/app": 0.14.9 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 - checksum: a78f8065a93ac3635e8ecb79e274ce37ed482d6a32bfeef0dcb3f8e7ff2333499853da874d82871f0a7c7b538376af6c22d9c150156a505cb92cc21d428b6ffc + checksum: d2989f4d9d1d86ffd4fde93da3d8a6ef897df0eb2f6b7775159862b9efedcce48d33a2a5f31744117fa546e23c38fb0aeea815977b569b40414e706c302f6122 languageName: node linkType: hard @@ -2283,31 +2293,31 @@ __metadata: languageName: node linkType: hard -"@firebase/app@npm:0.14.2": - version: 0.14.2 - resolution: "@firebase/app@npm:0.14.2" +"@firebase/app@npm:0.14.9": + version: 0.14.9 + resolution: "@firebase/app@npm:0.14.9" dependencies: - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 idb: 7.1.1 tslib: ^2.1.0 - checksum: a1a48de2f8a356c846729482ebd3ff398c617ed0c9211963beb9b1a3b0b2c83ef0ab4909b86135cfb7d653b150d1d5263d25fac577a20db75964e71e29f84f7e + checksum: afc17b985d56d5e9b0ca3d7eb11164325084fa9b594f6ecd85d526660dc18ccaa3e8c5bf1b34ccfd24a510974c98009b73a91e002ec9df7a13946e5558991f60 languageName: node linkType: hard -"@firebase/auth-compat@npm:0.6.0": - version: 0.6.0 - resolution: "@firebase/auth-compat@npm:0.6.0" +"@firebase/auth-compat@npm:0.6.3": + version: 0.6.3 + resolution: "@firebase/auth-compat@npm:0.6.3" dependencies: - "@firebase/auth": 1.11.0 + "@firebase/auth": 1.12.1 "@firebase/auth-types": 0.13.0 - "@firebase/component": 0.7.0 - "@firebase/util": 1.13.0 + "@firebase/component": 0.7.1 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: 335d0039e49d7cfb80b1b0d647e6b13db436c968bfc5fedc79468197bdcc831dea41e436f2b5654809b23c56aa15151c7219ed9f0882a0fd05a4efcefe5550c7 + checksum: 3bdacefa2f683a522453bcef1d64d6067ea63b172527b99761b79adc3222e65c4a5351ae023b6bc08fe439e811e389aa993a8fd1b4608d5a3c658bcf90147fc1 languageName: node linkType: hard @@ -2328,100 +2338,100 @@ __metadata: languageName: node linkType: hard -"@firebase/auth@npm:1.11.0": - version: 1.11.0 - resolution: "@firebase/auth@npm:1.11.0" +"@firebase/auth@npm:1.12.1": + version: 1.12.1 + resolution: "@firebase/auth@npm:1.12.1" dependencies: - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - "@react-native-async-storage/async-storage": ^1.18.1 + "@react-native-async-storage/async-storage": ^2.2.0 peerDependenciesMeta: "@react-native-async-storage/async-storage": optional: true - checksum: 41cb98104ccf47c93c8ca35b73af583bc6237e38c99a2ccc8107594801525f291d4978b1f3ec1aa32b2ca9b01c198bd5ba716004403db9c3dbe049708cfa4966 + checksum: cb79e50a1bb42195ecbc7a8fb4c76aaee3452252f08b3b1b3f160f25b3510d784f7fa784904dbdc09aa6676623451a1ed3b3b4a372d3ea093551bd7b917964bb languageName: node linkType: hard -"@firebase/component@npm:0.7.0": - version: 0.7.0 - resolution: "@firebase/component@npm:0.7.0" +"@firebase/component@npm:0.7.1": + version: 0.7.1 + resolution: "@firebase/component@npm:0.7.1" dependencies: - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 - checksum: 0db5c9d0ea427add4501692f4e2251175c805242d1e7f953fb59f118319dec6dd256f36fbcfa2abfd8a8c996aeaf9f76e20dbc35076deefc85b04aa31af6297c + checksum: 97726c1055280e4f2c055c248d71b8a08e90414dac88ea0bc14610669e7d2b333085ef5c7c8f2a35594a23e85204deed2dee80b75fa43af67d46edc61027fdbe languageName: node linkType: hard -"@firebase/data-connect@npm:0.3.11": - version: 0.3.11 - resolution: "@firebase/data-connect@npm:0.3.11" +"@firebase/data-connect@npm:0.4.0": + version: 0.4.0 + resolution: "@firebase/data-connect@npm:0.4.0" dependencies: "@firebase/auth-interop-types": 0.2.4 - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: 1f3ee6d3eadec4a25563cce799e9e68e14b98372833318ad4da527cf64ecb8cb3ea2edc4609161734a4ffce028ae269f63488164db408ec772817cdecca6f95d + checksum: 25fa48ef05b23c71d3e83df02180bcb0652bcda279e71a5571a138586cda635ef3890a62d1e95c3b162b94604e038ba752da330a586988a3e164e065d237b1ca languageName: node linkType: hard -"@firebase/database-compat@npm:2.1.0": - version: 2.1.0 - resolution: "@firebase/database-compat@npm:2.1.0" +"@firebase/database-compat@npm:2.1.1": + version: 2.1.1 + resolution: "@firebase/database-compat@npm:2.1.1" dependencies: - "@firebase/component": 0.7.0 - "@firebase/database": 1.1.0 - "@firebase/database-types": 1.0.16 + "@firebase/component": 0.7.1 + "@firebase/database": 1.1.1 + "@firebase/database-types": 1.0.17 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 - checksum: 454a023dafe11dfc56031c7c02fa89b2d98fd9191d4f347cb37153e7e00e98be77fa30bf81eabfa2d0331264deb2aa861580998f10e64f4716dbfacf9bc49b40 + checksum: a33dd38271772c11a47f0d893ca1998ad96fc2319d44384f0ba84e13f9c735048619b2ab416e2ae7c5c7c339dd0072b803d9412ad9e176b4c9e5f7d3dde9398b languageName: node linkType: hard -"@firebase/database-types@npm:1.0.16": - version: 1.0.16 - resolution: "@firebase/database-types@npm:1.0.16" +"@firebase/database-types@npm:1.0.17": + version: 1.0.17 + resolution: "@firebase/database-types@npm:1.0.17" dependencies: "@firebase/app-types": 0.9.3 - "@firebase/util": 1.13.0 - checksum: df60c8635b442a3bbe35b3a04a7a2569f4e01c3b13e65e775079254ed34b7988ed73954685f9fb4f55359902c931aad0d49ac7b052d74f39222eb69bd18c97db + "@firebase/util": 1.14.0 + checksum: 3e94ee958f7d8d62a8a86e278e91a7437819bac1b6ae5cc0953198ee692be96441e771c4e2cc97cc18b5412d27f0e8a85ed2334ea90366a6071ac864145daa51 languageName: node linkType: hard -"@firebase/database@npm:1.1.0": - version: 1.1.0 - resolution: "@firebase/database@npm:1.1.0" +"@firebase/database@npm:1.1.1": + version: 1.1.1 + resolution: "@firebase/database@npm:1.1.1" dependencies: "@firebase/app-check-interop-types": 0.3.3 "@firebase/auth-interop-types": 0.2.4 - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 faye-websocket: 0.11.4 tslib: ^2.1.0 - checksum: acac0dfb088c3246c4064f31489f16dd0e2cd2fd4803e62732544b4d1cf144808d25674e76ce5029cfa59488e9f3639e29c95198b663002c477ac45113b6fee7 + checksum: 184a71cd95dde67e30e45c536afaaf09f82a7905adc7cec84be44a1e4bb4fbfa7e1b846274403b0038d897e70f94049fbc6b2e322a9599991d14d6484c2bc556 languageName: node linkType: hard -"@firebase/firestore-compat@npm:0.4.1": - version: 0.4.1 - resolution: "@firebase/firestore-compat@npm:0.4.1" +"@firebase/firestore-compat@npm:0.4.6": + version: 0.4.6 + resolution: "@firebase/firestore-compat@npm:0.4.6" dependencies: - "@firebase/component": 0.7.0 - "@firebase/firestore": 4.9.1 + "@firebase/component": 0.7.1 + "@firebase/firestore": 4.12.0 "@firebase/firestore-types": 3.0.3 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: 805df6d0987249b0afa14d6969f29cec671b960b187ad55361078cac97decbbb789846470108570b72aed51a395b1b3f5a79c5e42e6d6784908c1ed27f45faf2 + checksum: c5512c4596e04c62f9d9425c2b470492c6e0c3d6ad52e45f581b138a1be66c4f1c83ff9fac43616d6ed3d461b63d4b6a8e10aa1d37b20c4a85dc488f4d53a6cc languageName: node linkType: hard @@ -2435,35 +2445,35 @@ __metadata: languageName: node linkType: hard -"@firebase/firestore@npm:4.9.1": - version: 4.9.1 - resolution: "@firebase/firestore@npm:4.9.1" +"@firebase/firestore@npm:4.12.0": + version: 4.12.0 + resolution: "@firebase/firestore@npm:4.12.0" dependencies: - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 - "@firebase/webchannel-wrapper": 1.0.4 + "@firebase/util": 1.14.0 + "@firebase/webchannel-wrapper": 1.0.5 "@grpc/grpc-js": ~1.9.0 "@grpc/proto-loader": ^0.7.8 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: c8f7ff062e0f86bc2bf69a24d7c14ad98cdd417df1839dbae9647f99f4fac900eca6cd5885e6595b40fa78667caee380b594c4002eb1a5284a9eda87c1cc1aa1 + checksum: d33b0f49b035fb2482cf5cf746710658fd07b73073af3c0517a37922ba0e281e758f6cbb231f393e8a245edb7142335ac4b931faea3cf440ff2cd247a86dff10 languageName: node linkType: hard -"@firebase/functions-compat@npm:0.4.1": - version: 0.4.1 - resolution: "@firebase/functions-compat@npm:0.4.1" +"@firebase/functions-compat@npm:0.4.2": + version: 0.4.2 + resolution: "@firebase/functions-compat@npm:0.4.2" dependencies: - "@firebase/component": 0.7.0 - "@firebase/functions": 0.13.1 + "@firebase/component": 0.7.1 + "@firebase/functions": 0.13.2 "@firebase/functions-types": 0.6.3 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: 513ab515e44725aa6ef935312ea78ebb13c80df89433e7e1f27d4dcd8ad7aa30ebf0db764b971343d39f77a8f2d283503a9d9296c00f825eef6f7c31c1b2ef0d + checksum: d712b63f4667274029be52c99eabfd0229d69c7ad5ba267050fcc3f17d7bc59325160ba5130ed6f42e2c8194f45822610291cb4ba67a6a738dfcf7fc8b7aa251 languageName: node linkType: hard @@ -2474,34 +2484,34 @@ __metadata: languageName: node linkType: hard -"@firebase/functions@npm:0.13.1": - version: 0.13.1 - resolution: "@firebase/functions@npm:0.13.1" +"@firebase/functions@npm:0.13.2": + version: 0.13.2 + resolution: "@firebase/functions@npm:0.13.2" dependencies: "@firebase/app-check-interop-types": 0.3.3 "@firebase/auth-interop-types": 0.2.4 - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/messaging-interop-types": 0.2.3 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: 1eb3cb9e9cdb232691f07f1f8701059c051ff737afc6f5e6009b2784ab1fe3cc5a204a7ae79c0e5efa70c5d7e8a8ca13e3e87ff80bd8109c8bdf17d215cce378 + checksum: e5011068f1d1ca792da4f574dec2f27d32a581d1acb7c2ca48d2b0877be06a006c751b6a06dc866e2dfefbcfce9c3f3302a32e34b1bc80c0977b8029890d725c languageName: node linkType: hard -"@firebase/installations-compat@npm:0.2.19": - version: 0.2.19 - resolution: "@firebase/installations-compat@npm:0.2.19" +"@firebase/installations-compat@npm:0.2.20": + version: 0.2.20 + resolution: "@firebase/installations-compat@npm:0.2.20" dependencies: - "@firebase/component": 0.7.0 - "@firebase/installations": 0.6.19 + "@firebase/component": 0.7.1 + "@firebase/installations": 0.6.20 "@firebase/installations-types": 0.5.3 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: a72d1e1026dd86ac77eb596bc171324e3884866640321745551a948bc3f5f83cfd986f258c9bba5cd34334d3b08bc6f90fe4c30835b6549e765098d267ef35ed + checksum: 8f21f123ab2afbe20ec47e680a86aba73abec9ced556714d1d035cfe0a464a2f1c141d00da4b19a561cd7922333cc0de14d5e30ae90d627f51548ca5ad931b64 languageName: node linkType: hard @@ -2514,17 +2524,17 @@ __metadata: languageName: node linkType: hard -"@firebase/installations@npm:0.6.19": - version: 0.6.19 - resolution: "@firebase/installations@npm:0.6.19" +"@firebase/installations@npm:0.6.20": + version: 0.6.20 + resolution: "@firebase/installations@npm:0.6.20" dependencies: - "@firebase/component": 0.7.0 - "@firebase/util": 1.13.0 + "@firebase/component": 0.7.1 + "@firebase/util": 1.14.0 idb: 7.1.1 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: ec9cb1d18338b2a08446d8731c833fdef968d8d8219c1c28613af9502841cd0091c6cdc9222100d33db87554061555398c650d1728116ca024639072996fc3d1 + checksum: 8be9bc8fa82fd594d84a30bce26004ac71fe68afe10d93ae6d470dbc490c1802af097b0214c41532dde3f3830228566dee664c953eee932ac752654b105d8582 languageName: node linkType: hard @@ -2537,17 +2547,17 @@ __metadata: languageName: node linkType: hard -"@firebase/messaging-compat@npm:0.2.23": - version: 0.2.23 - resolution: "@firebase/messaging-compat@npm:0.2.23" +"@firebase/messaging-compat@npm:0.2.24": + version: 0.2.24 + resolution: "@firebase/messaging-compat@npm:0.2.24" dependencies: - "@firebase/component": 0.7.0 - "@firebase/messaging": 0.12.23 - "@firebase/util": 1.13.0 + "@firebase/component": 0.7.1 + "@firebase/messaging": 0.12.24 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: c52ac4f279edfcfcc506752ad54f89497d6f79c1a9616d57f6ff24014fc1700ba46c1bdbe310330868103a4a55c6dbb30e7784089663b335e58952a10765ce6d + checksum: b3b0f269832bbdafac7ef1baf73ba46d1e5cbe076625ea1aa1bdf6e0d11b355e8e6a2afc66bc02ebf5b56e1a21e52ae44099d3fc3cecd0321ded724d34f63890 languageName: node linkType: hard @@ -2558,35 +2568,35 @@ __metadata: languageName: node linkType: hard -"@firebase/messaging@npm:0.12.23": - version: 0.12.23 - resolution: "@firebase/messaging@npm:0.12.23" +"@firebase/messaging@npm:0.12.24": + version: 0.12.24 + resolution: "@firebase/messaging@npm:0.12.24" dependencies: - "@firebase/component": 0.7.0 - "@firebase/installations": 0.6.19 + "@firebase/component": 0.7.1 + "@firebase/installations": 0.6.20 "@firebase/messaging-interop-types": 0.2.3 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 idb: 7.1.1 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: 5e9edc216b24ce822107de31287d762228b852e3bdf6dea7d47048ca32dc71edb0f01b82d28c280d6cc644c8462f3bba9efa2a9612fb2245a20285019f47dea3 + checksum: 93c3c151185b048482e9dc3dc9d2eb211759b3d744bffef1c71817cf492ffbaa01dd5a64060fdbab334d3c7746e0380d0b9492017bbf675447edb1a5dcb5f6a8 languageName: node linkType: hard -"@firebase/performance-compat@npm:0.2.22": - version: 0.2.22 - resolution: "@firebase/performance-compat@npm:0.2.22" +"@firebase/performance-compat@npm:0.2.23": + version: 0.2.23 + resolution: "@firebase/performance-compat@npm:0.2.23" dependencies: - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/performance": 0.7.9 + "@firebase/performance": 0.7.10 "@firebase/performance-types": 0.2.3 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: 5cfc54ab3a4f4ddd2fe6577cc6f78c02e5a23e0f70792cc178897fffece02cc3eeaf4e9d544c57cc8736510acaea64e75a32a5c545b23acbd95e437d6891e6d4 + checksum: 03a7c20207b6cbb538b4da439a5e826c15a33736570e4f331b81fe1c8e9d530e8f9c9354740f3b4cab7d95de240156ceee87f60b620f0f101861edd5bab68066 languageName: node linkType: hard @@ -2597,72 +2607,72 @@ __metadata: languageName: node linkType: hard -"@firebase/performance@npm:0.7.9": - version: 0.7.9 - resolution: "@firebase/performance@npm:0.7.9" +"@firebase/performance@npm:0.7.10": + version: 0.7.10 + resolution: "@firebase/performance@npm:0.7.10" dependencies: - "@firebase/component": 0.7.0 - "@firebase/installations": 0.6.19 + "@firebase/component": 0.7.1 + "@firebase/installations": 0.6.20 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 web-vitals: ^4.2.4 peerDependencies: "@firebase/app": 0.x - checksum: d972c6198162847ce0cce2035251bf99eea0212108fdcceda2f4b8a2ad45d396ca54f3e5b345ee4bc3aa7405839e31ce3dee4d16a6a58ccd0c11919c8686a044 + checksum: 62f31fc16e5987a3213a7311e8bca8e5c037825d66fbf42c8540fed4208964c26f4db8279cf16dc58febe594e38dc224ebb327884be17989eb431656e261db63 languageName: node linkType: hard -"@firebase/remote-config-compat@npm:0.2.19": - version: 0.2.19 - resolution: "@firebase/remote-config-compat@npm:0.2.19" +"@firebase/remote-config-compat@npm:0.2.22": + version: 0.2.22 + resolution: "@firebase/remote-config-compat@npm:0.2.22" dependencies: - "@firebase/component": 0.7.0 + "@firebase/component": 0.7.1 "@firebase/logger": 0.5.0 - "@firebase/remote-config": 0.6.6 - "@firebase/remote-config-types": 0.4.0 - "@firebase/util": 1.13.0 + "@firebase/remote-config": 0.8.1 + "@firebase/remote-config-types": 0.5.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: fb10c9ee720bc4dfe15cc930c7c9c62be1c3562ac70d8019fb67d459c80a4c4c4b8bd679eeaac7ed9c5cdb07c3ac1b0b5244e2e4ad516ed602e12e10b70c4665 + checksum: 66852d926228b910a089e5f6fbe989c24a04fe93fca166d07f6f8d4463927fadefb311238f0877619fecfcfabe7f5e6060496fc2d5db7b3f2ddc9077a54cb498 languageName: node linkType: hard -"@firebase/remote-config-types@npm:0.4.0": - version: 0.4.0 - resolution: "@firebase/remote-config-types@npm:0.4.0" - checksum: 68c2acad00ad9fb3eb92c42683b841667b4f0c11371fc5f3e656294a7ada0044d9bb8bd4e7b763aa23cb8e2e41de511df1ba1ff58bde2ed4488d95aced2d60f9 +"@firebase/remote-config-types@npm:0.5.0": + version: 0.5.0 + resolution: "@firebase/remote-config-types@npm:0.5.0" + checksum: 758d2b6d364636b38fdba5abca2489e062cf6080753a2a35fea650d1a60728759fb907940cfedac0993fe5f64baf4699cbf22d369a2fc9b23871d4a5c37e5397 languageName: node linkType: hard -"@firebase/remote-config@npm:0.6.6": - version: 0.6.6 - resolution: "@firebase/remote-config@npm:0.6.6" +"@firebase/remote-config@npm:0.8.1": + version: 0.8.1 + resolution: "@firebase/remote-config@npm:0.8.1" dependencies: - "@firebase/component": 0.7.0 - "@firebase/installations": 0.6.19 + "@firebase/component": 0.7.1 + "@firebase/installations": 0.6.20 "@firebase/logger": 0.5.0 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: d5b2f65f8a514ae31becd52f8786ec4d8824d4efbad502be948697d12634abbee41b41a4ca6acff991d26e4766ffa9cb1019bb921aa7f26c892cefd3959d6b59 + checksum: 77ff6272deff186ffae4e0b342bbc4e99d8ab2028fbdaa53dee4126db542fff493bdf42f1e41a74f5dbf3d9fb04fec66655fd5c81117d15d2fdc7ee495af6abd languageName: node linkType: hard -"@firebase/storage-compat@npm:0.4.0": - version: 0.4.0 - resolution: "@firebase/storage-compat@npm:0.4.0" +"@firebase/storage-compat@npm:0.4.1": + version: 0.4.1 + resolution: "@firebase/storage-compat@npm:0.4.1" dependencies: - "@firebase/component": 0.7.0 - "@firebase/storage": 0.14.0 + "@firebase/component": 0.7.1 + "@firebase/storage": 0.14.1 "@firebase/storage-types": 0.8.3 - "@firebase/util": 1.13.0 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app-compat": 0.x - checksum: 0bd371846a6b03755f1fd1b347c071d45e191eba2cf9e8f2ba7e17ebe23dfd39df4e8bcac6ad5fa7818ed41ef570f1cfa49d9f4d1844fc0d722ce6655f6844d9 + checksum: b400d9063357ef8658aef11482b9dbdc186d1988d76336ef6c47d2f7e30f32169c239db6553884e9aca499edc4821c7f201e2119804963dcd972fc24cb0b1598 languageName: node linkType: hard @@ -2676,32 +2686,32 @@ __metadata: languageName: node linkType: hard -"@firebase/storage@npm:0.14.0": - version: 0.14.0 - resolution: "@firebase/storage@npm:0.14.0" +"@firebase/storage@npm:0.14.1": + version: 0.14.1 + resolution: "@firebase/storage@npm:0.14.1" dependencies: - "@firebase/component": 0.7.0 - "@firebase/util": 1.13.0 + "@firebase/component": 0.7.1 + "@firebase/util": 1.14.0 tslib: ^2.1.0 peerDependencies: "@firebase/app": 0.x - checksum: f36f10360478237e1c5e6cb88129089b1efb69a61f812c8aafbb56dae0a33fcf7e2a5fd20025aaa8ec2a42738592295aa870f5ec1ad7c53990a46b5a09182987 + checksum: 0d1015ef7c62d8527b4cbb7059f97e1c7937e8b223c8b7b450e54353c37c7df93db72cf9c94c165731fb758850cc44bf03e047a47d4cfe5e9045b7c5bd026520 languageName: node linkType: hard -"@firebase/util@npm:1.13.0": - version: 1.13.0 - resolution: "@firebase/util@npm:1.13.0" +"@firebase/util@npm:1.14.0": + version: 1.14.0 + resolution: "@firebase/util@npm:1.14.0" dependencies: tslib: ^2.1.0 - checksum: 11ce1acf9bfad6b61ea35148d7403b019fcb170deb3103eeac5012aa07989fbfb5f1cfe7876195ac9ea784b58b75162242b08490c74c5cd5d50335c1cf3958c1 + checksum: 503c413cbd29f3a619df635062416e2d8cb790edf9346c1c597a13bbfa907de0d83f1da0d198d9e2aad34bb91ee6fc39ebe071deedb0844caebe804d4893788a languageName: node linkType: hard -"@firebase/webchannel-wrapper@npm:1.0.4": - version: 1.0.4 - resolution: "@firebase/webchannel-wrapper@npm:1.0.4" - checksum: 0691fdae4f7bbe1d178a03ef8d1222e623a638e0abfab948d185461b71632cd2a1f0bf9fae68a2317b241a4fefb7c0277b264619562651ceea15876e7522a884 +"@firebase/webchannel-wrapper@npm:1.0.5": + version: 1.0.5 + resolution: "@firebase/webchannel-wrapper@npm:1.0.5" + checksum: 24010527f6b1f026f67bef460e70194d90697ab3d9d14d48fcf142106438ef5acc36fccdcd2afaf51ce66df27ec509b88a7ec36b89f7a18c77aeaa3972680ba0 languageName: node linkType: hard @@ -3716,11 +3726,11 @@ __metadata: languageName: node linkType: hard -"@react-native-firebase/app@npm:^23.4.0": - version: 23.4.0 - resolution: "@react-native-firebase/app@npm:23.4.0" +"@react-native-firebase/app@npm:^24.0.0": + version: 24.0.0 + resolution: "@react-native-firebase/app@npm:24.0.0" dependencies: - firebase: 12.2.1 + firebase: 12.10.0 peerDependencies: expo: ">=47.0.0" react: "*" @@ -3728,79 +3738,79 @@ __metadata: peerDependenciesMeta: expo: optional: true - checksum: 3441828e35dc957c002eddbb2a3332d21c6af9f539ac5b8c95adba48344d0d56a78ecdaa6e6ebbf3c12537dc0518f1491337cbd04b73749b863b7f36aeb03923 + checksum: 90e5b9fa78eabed012789bf09b3e49972087e471231c02c315a3564af2ea11a9cb2c7e152d7121b2c749bf358176dfd0e0c6e5b1ceb6dad3718f192df233c91e languageName: node linkType: hard -"@react-native-firebase/auth@npm:^23.4.0": - version: 23.4.0 - resolution: "@react-native-firebase/auth@npm:23.4.0" +"@react-native-firebase/auth@npm:^24.0.0": + version: 24.0.0 + resolution: "@react-native-firebase/auth@npm:24.0.0" dependencies: plist: ^3.1.0 peerDependencies: - "@react-native-firebase/app": 23.4.0 + "@react-native-firebase/app": 24.0.0 expo: ">=47.0.0" peerDependenciesMeta: expo: optional: true - checksum: e04166b393455caa5005c9d4bdaea845f41eec6f390349dc749b42a29d731d8cf25335b43624bcd7e7bc645b9cb256941572ba48ca82d89e04f2e8b6c4c349c5 + checksum: 79bdf6d85a8e5f26c6c867c25f2edcd67539adf85af161fc8243de2962ff81390a4a8e9d6d7e82aa1d106c3c55c84fe8008f7c4462e272e4f941f61b5ab695a3 languageName: node linkType: hard -"@react-native-firebase/crashlytics@npm:^23.4.0": - version: 23.4.0 - resolution: "@react-native-firebase/crashlytics@npm:23.4.0" +"@react-native-firebase/crashlytics@npm:^24.0.0": + version: 24.0.0 + resolution: "@react-native-firebase/crashlytics@npm:24.0.0" dependencies: stacktrace-js: ^2.0.2 peerDependencies: - "@react-native-firebase/app": 23.4.0 + "@react-native-firebase/app": 24.0.0 expo: ">=47.0.0" peerDependenciesMeta: expo: optional: true - checksum: 0e3402f0c5a8515fc45261840978762f4296803c6702e05fdcde0ce8c560a427f17a3cf762e72a167ab0795a3e6f9f92d291af5bfb73798b972b7389a1af2d42 + checksum: 42c0a3b4e6d9df4ea2bdaeba20107b070f9e24abd40f0008a72167b9ed79cea38a2ec0d371f8e8e6f08e7ac7f43e32547b20775bf114823c8fd5b424281eb1c3 languageName: node linkType: hard -"@react-native-firebase/firestore@npm:^23.4.0": - version: 23.4.0 - resolution: "@react-native-firebase/firestore@npm:23.4.0" +"@react-native-firebase/firestore@npm:^24.0.0": + version: 24.0.0 + resolution: "@react-native-firebase/firestore@npm:24.0.0" dependencies: - react-native-url-polyfill: 2.0.0 + react-native-url-polyfill: 3.0.0 peerDependencies: - "@react-native-firebase/app": 23.4.0 - checksum: b0b3fd3bd97187dfbb69e4cbaff38cc85fd02f703d8aae3a0b415e0c8c9219a2208b5d8e0405c9132fa462c3b20bd614f835276d75300be979b93c6a4da4a4b8 + "@react-native-firebase/app": 24.0.0 + checksum: e6ee63e33e106b01dd6c2e995dab0ff22c3ebdb3f2b41b23941eef0e4697d983789a53b63f1b5c957e079bd9c01e166131b8cec1224b0d5bafe789307f492169 languageName: node linkType: hard -"@react-native-firebase/functions@npm:^23.4.0": - version: 23.4.0 - resolution: "@react-native-firebase/functions@npm:23.4.0" +"@react-native-firebase/functions@npm:^24.0.0": + version: 24.0.0 + resolution: "@react-native-firebase/functions@npm:24.0.0" peerDependencies: - "@react-native-firebase/app": 23.4.0 - checksum: b56f77aa8c2f39546f3e2c65dba723fc58c4f1b421b1df3c926b78b97e833e256ef3eb3a56f77a74a015c02cd6d3da6ea1854d2d76c89033a0c8fdbf7643da73 + "@react-native-firebase/app": 24.0.0 + checksum: 355cf279168a351786ad53bb8ff769c951260e7fa3a18d74646b34fc52f004dfd10a6f72b6203d9b6c764f130f0a2dc527a06265dbd7be0b0341affb07b80ac8 languageName: node linkType: hard -"@react-native-firebase/messaging@npm:^23.4.0": - version: 23.4.0 - resolution: "@react-native-firebase/messaging@npm:23.4.0" +"@react-native-firebase/messaging@npm:^24.0.0": + version: 24.0.0 + resolution: "@react-native-firebase/messaging@npm:24.0.0" peerDependencies: - "@react-native-firebase/app": 23.4.0 + "@react-native-firebase/app": 24.0.0 expo: ">=47.0.0" peerDependenciesMeta: expo: optional: true - checksum: 5e7dedb7bb62ff24a11528d75b32f56ec062554e21628c7ddb2ffb71caeab9f1202121408632e315ddc0a45e8557b0d726c4cceb2f749919ecc6ccd9da71e079 + checksum: 81dabf2f77c435736a2f5cd55afdb41cadb4d14908f4a15e0b80faef3b2241b06c6f3a462dbf9e65c9883c94b299afd0ca852edb86c1a93fb6e5384ebc314340 languageName: node linkType: hard -"@react-native-firebase/storage@npm:^23.4.0": - version: 23.4.0 - resolution: "@react-native-firebase/storage@npm:23.4.0" +"@react-native-firebase/storage@npm:^24.0.0": + version: 24.0.0 + resolution: "@react-native-firebase/storage@npm:24.0.0" peerDependencies: - "@react-native-firebase/app": 23.4.0 - checksum: b927e8aeb95eff3f0311905e11d1f156258ca1acd5cbc673a07fceff2ff2091e6fbe1dcfec23cc79c6b362c680b579bfec9c52392ec0e2c2259465b8831b1e01 + "@react-native-firebase/app": 24.0.0 + checksum: 9e44aae0a089edfb556ab78e69ae18f3fe49f8edf31a07a34a4e81b001377ee182429a293cafa83b68438b263ff106f2a6ed979a7f4289958758c5777dc2498a languageName: node linkType: hard @@ -3814,10 +3824,10 @@ __metadata: languageName: node linkType: hard -"@react-native/assets-registry@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/assets-registry@npm:0.81.5" - checksum: c92a5731eb755a7f6702efa5568974fe11a58e5cd5b7c25883b55fe8ab0cc606a294d9e2b97afd163cc5619207fc7557f80a4052d990855a890d3694bcf8a635 +"@react-native/assets-registry@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/assets-registry@npm:0.81.4" + checksum: 23ee2fce6a5f74ff801a7b08ede9c1cd5bc53148bf94103185b9c55b2b0e1b98134b9fd3e637e11ec39988a1cee456f358d0a20bc124bf942253bd096efeb7c5 languageName: node linkType: hard @@ -3831,16 +3841,6 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-plugin-codegen@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/babel-plugin-codegen@npm:0.81.5" - dependencies: - "@babel/traverse": ^7.25.3 - "@react-native/codegen": 0.81.5 - checksum: 939aab253c762df32c5d94a3700971a7a560c7d77b6dd516e8284efdc6a9226e83b30c78455fee6311da0d5e50155e99e279a74015661c4e90b6f4b67a697aa9 - languageName: node - linkType: hard - "@react-native/babel-preset@npm:0.81.4": version: 0.81.4 resolution: "@react-native/babel-preset@npm:0.81.4" @@ -3896,61 +3896,6 @@ __metadata: languageName: node linkType: hard -"@react-native/babel-preset@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/babel-preset@npm:0.81.5" - dependencies: - "@babel/core": ^7.25.2 - "@babel/plugin-proposal-export-default-from": ^7.24.7 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-syntax-export-default-from": ^7.24.7 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-transform-arrow-functions": ^7.24.7 - "@babel/plugin-transform-async-generator-functions": ^7.25.4 - "@babel/plugin-transform-async-to-generator": ^7.24.7 - "@babel/plugin-transform-block-scoping": ^7.25.0 - "@babel/plugin-transform-class-properties": ^7.25.4 - "@babel/plugin-transform-classes": ^7.25.4 - "@babel/plugin-transform-computed-properties": ^7.24.7 - "@babel/plugin-transform-destructuring": ^7.24.8 - "@babel/plugin-transform-flow-strip-types": ^7.25.2 - "@babel/plugin-transform-for-of": ^7.24.7 - "@babel/plugin-transform-function-name": ^7.25.1 - "@babel/plugin-transform-literals": ^7.25.2 - "@babel/plugin-transform-logical-assignment-operators": ^7.24.7 - "@babel/plugin-transform-modules-commonjs": ^7.24.8 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.24.7 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7 - "@babel/plugin-transform-numeric-separator": ^7.24.7 - "@babel/plugin-transform-object-rest-spread": ^7.24.7 - "@babel/plugin-transform-optional-catch-binding": ^7.24.7 - "@babel/plugin-transform-optional-chaining": ^7.24.8 - "@babel/plugin-transform-parameters": ^7.24.7 - "@babel/plugin-transform-private-methods": ^7.24.7 - "@babel/plugin-transform-private-property-in-object": ^7.24.7 - "@babel/plugin-transform-react-display-name": ^7.24.7 - "@babel/plugin-transform-react-jsx": ^7.25.2 - "@babel/plugin-transform-react-jsx-self": ^7.24.7 - "@babel/plugin-transform-react-jsx-source": ^7.24.7 - "@babel/plugin-transform-regenerator": ^7.24.7 - "@babel/plugin-transform-runtime": ^7.24.7 - "@babel/plugin-transform-shorthand-properties": ^7.24.7 - "@babel/plugin-transform-spread": ^7.24.7 - "@babel/plugin-transform-sticky-regex": ^7.24.7 - "@babel/plugin-transform-typescript": ^7.25.2 - "@babel/plugin-transform-unicode-regex": ^7.24.7 - "@babel/template": ^7.25.0 - "@react-native/babel-plugin-codegen": 0.81.5 - babel-plugin-syntax-hermes-parser: 0.29.1 - babel-plugin-transform-flow-enums: ^0.0.2 - react-refresh: ^0.14.0 - peerDependencies: - "@babel/core": "*" - checksum: 80aebb02b4a1f68198e8bc939599def949844666f9601014af561f9cbd167f1fe325b193a5c9ffb7d0a07c9e9ab1a290e8a2ace2ce2ad470aae23f5376fc931e - languageName: node - linkType: hard - "@react-native/codegen@npm:0.81.4": version: 0.81.4 resolution: "@react-native/codegen@npm:0.81.4" @@ -3968,28 +3913,11 @@ __metadata: languageName: node linkType: hard -"@react-native/codegen@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/codegen@npm:0.81.5" +"@react-native/community-cli-plugin@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/community-cli-plugin@npm:0.81.4" dependencies: - "@babel/core": ^7.25.2 - "@babel/parser": ^7.25.3 - glob: ^7.1.1 - hermes-parser: 0.29.1 - invariant: ^2.2.4 - nullthrows: ^1.1.1 - yargs: ^17.6.2 - peerDependencies: - "@babel/core": "*" - checksum: 32a82c43efc6299b2667ab931b88c52da5cb4eecf0875f9b4f95a574144b23cf8d7db5bd40d2a9626c41c5de8153b6b95173810be8ab30cb5d5d678e482f80dc - languageName: node - linkType: hard - -"@react-native/community-cli-plugin@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/community-cli-plugin@npm:0.81.5" - dependencies: - "@react-native/dev-middleware": 0.81.5 + "@react-native/dev-middleware": 0.81.4 debug: ^4.4.0 invariant: ^2.2.4 metro: ^0.83.1 @@ -4004,7 +3932,7 @@ __metadata: optional: true "@react-native/metro-config": optional: true - checksum: 4f3f871f8d05b5bedd28b12d7a1e67bbe7fac9dc09306d5c0f9708df8cf5e58118b9a635616a22985746f3f1b2caa954de317484c907e7d878a44c04630ba814 + checksum: 7b2997e30fae7da1d0231768214554c266543630758bddd59e648861d1b5fc1a34af7e46144daf625a2f452d33f24d9731f885ae4b2c5b146da2acde95e21382 languageName: node linkType: hard @@ -4015,13 +3943,6 @@ __metadata: languageName: node linkType: hard -"@react-native/debugger-frontend@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/debugger-frontend@npm:0.81.5" - checksum: 684f0d562388d336744c68a530801e5d7c9088a76d40e158d20e8a7ed019259ccf6fc20dc0616823d5ce6e8981d302e9a5537032bf3006082ddc1b2734a0d881 - languageName: node - linkType: hard - "@react-native/dev-middleware@npm:0.81.4": version: 0.81.4 resolution: "@react-native/dev-middleware@npm:0.81.4" @@ -4041,32 +3962,13 @@ __metadata: languageName: node linkType: hard -"@react-native/dev-middleware@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/dev-middleware@npm:0.81.5" - dependencies: - "@isaacs/ttlcache": ^1.4.1 - "@react-native/debugger-frontend": 0.81.5 - chrome-launcher: ^0.15.2 - chromium-edge-launcher: ^0.2.0 - connect: ^3.6.5 - debug: ^4.4.0 - invariant: ^2.2.4 - nullthrows: ^1.1.1 - open: ^7.0.3 - serve-static: ^1.16.2 - ws: ^6.2.3 - checksum: 725f85bc3f91158ab5097738cbbbaa38470d9e54e5672697219fea482ba7f2f223912b14ad54319a0cc2058537d1f5202e1ec8e745a74abd39121acabd0e6353 - languageName: node - linkType: hard - -"@react-native/eslint-config@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/eslint-config@npm:0.81.5" +"@react-native/eslint-config@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/eslint-config@npm:0.81.4" dependencies: "@babel/core": ^7.25.2 "@babel/eslint-parser": ^7.25.1 - "@react-native/eslint-plugin": 0.81.5 + "@react-native/eslint-plugin": 0.81.4 "@typescript-eslint/eslint-plugin": ^7.1.1 "@typescript-eslint/parser": ^7.1.1 eslint-config-prettier: ^8.5.0 @@ -4079,54 +3981,54 @@ __metadata: peerDependencies: eslint: ">=8" prettier: ">=2" - checksum: adb3cc87ee656ed258408f2c05983d2ba1e0ce6900e570be9a6c3d2a7f325d4bf7b0b05128c72f11f8994608852eb305631550d4bb03df5afe883c5e92dd564d + checksum: e601fe1298710557916a0ab3c32975ab0e65319c78edaca7369eded6eea4f94ab4a00c1eafd437f93a82baa93cdfbd2a930ceb1b82b4a2e92f51d490184dd1b1 languageName: node linkType: hard -"@react-native/eslint-plugin@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/eslint-plugin@npm:0.81.5" - checksum: 2560b0b1a5ffcae76121efd89b0579ddc62f1789dc98882eecb6198e1cec39da0a6f496eee771f5183d3d365aed5a6804da8debf43509717ad20f6a0e394245d +"@react-native/eslint-plugin@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/eslint-plugin@npm:0.81.4" + checksum: e9c3ada247dfa410ae5f0ed20fb12ec79193a1140ec643d2cf822d472f7951e51247b4b235924faef0763efed73432dcfb203fd4af3c7abd8ccc10442efa6c31 languageName: node linkType: hard -"@react-native/gradle-plugin@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/gradle-plugin@npm:0.81.5" - checksum: e62c3e9f72364064c930b325a6e4714e3d3c8a65c87f5e703e6772fd13110aee70892a6dec41f23dd05fe8cbe731a686c7ec8cbd31d0fedfd85afe32ac3158c1 +"@react-native/gradle-plugin@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/gradle-plugin@npm:0.81.4" + checksum: 98d71e2257c4c4bd41effe29cb3033beeb42194b7482d83c87458b641cc0c9a183206507dcf9b777d748540cd7bbab9754f5e9b13c712d6a6f6a552746fdb44e languageName: node linkType: hard -"@react-native/js-polyfills@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/js-polyfills@npm:0.81.5" - checksum: 3cf56cf90a4d7315e452a4ca7c5557acf3b22deb3b2da89bca2b51da1611d21679da740ab3c80834698c64d7fc178427fb9d032900f4b41317aef016bee8e879 +"@react-native/js-polyfills@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/js-polyfills@npm:0.81.4" + checksum: 5a2d6e2e0c588f39570a826d8632f5ac70607f69939c4961fbe26bd104a71aec83c5503f87a02f160ee8e5174c8e3e309c106e8634bd5f706c53acfd1dea4631 languageName: node linkType: hard -"@react-native/metro-babel-transformer@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/metro-babel-transformer@npm:0.81.5" +"@react-native/metro-babel-transformer@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/metro-babel-transformer@npm:0.81.4" dependencies: "@babel/core": ^7.25.2 - "@react-native/babel-preset": 0.81.5 + "@react-native/babel-preset": 0.81.4 hermes-parser: 0.29.1 nullthrows: ^1.1.1 peerDependencies: "@babel/core": "*" - checksum: 20ba6238591324aa5838d3424e75f1033142214d556131cad78faf5d26ed22ead26d4aef73e801cf852e43bc8b0d95bab2c48caaf9fe83929bba633ca0313929 + checksum: 46f2793a1190becedaebc7a85070e03cd386180805d1082af1e206255b6395e7f749d82ba6736f343f8c9b447755c79d6c5ab11cde36688c45add9d56388db88 languageName: node linkType: hard -"@react-native/metro-config@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/metro-config@npm:0.81.5" +"@react-native/metro-config@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/metro-config@npm:0.81.4" dependencies: - "@react-native/js-polyfills": 0.81.5 - "@react-native/metro-babel-transformer": 0.81.5 + "@react-native/js-polyfills": 0.81.4 + "@react-native/metro-babel-transformer": 0.81.4 metro-config: ^0.83.1 metro-runtime: ^0.83.1 - checksum: 13af9cb8f743e8ae51fe0c77db4c61070ef31074b985911ad03b53ec79985f3ba261f1b0026bc62b1b070a3954c8928b73d2d956fc13bad6ece3699b3f5d7254 + checksum: 3ae2a2c55cb988da8a35f5f119b19a476dd85388d4c4970e33fc9af7886d2bba7d894743b997a4cac7389125b87ed1aac436cd0e2426d3ea06bc1cde4838d866 languageName: node linkType: hard @@ -4144,16 +4046,16 @@ __metadata: languageName: node linkType: hard -"@react-native/typescript-config@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/typescript-config@npm:0.81.5" - checksum: fbcc83ec60d6820a0d5d86644c33284bba35aa3312fd9b620f50f3de5343ed3aac9808aa6915d2a1726f69bbe877c1b92452954e661a2fee16c60c1be88fc8c5 +"@react-native/typescript-config@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/typescript-config@npm:0.81.4" + checksum: 21e517036fe5e423d4bb67739168743374c40641dfb2dde080b13bdd68126f280707ebf7d2780df23f5cf7805c759f1db2705473de35f1d3b7761256d2694c7e languageName: node linkType: hard -"@react-native/virtualized-lists@npm:0.81.5": - version: 0.81.5 - resolution: "@react-native/virtualized-lists@npm:0.81.5" +"@react-native/virtualized-lists@npm:0.81.4": + version: 0.81.4 + resolution: "@react-native/virtualized-lists@npm:0.81.4" dependencies: invariant: ^2.2.4 nullthrows: ^1.1.1 @@ -4164,7 +4066,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: c3dc4f36dca2ced9ec7cdaaa0f262d0ca2387d348f7d97673466f4704eb8db38eeb8124852d225e1a18aeed4431d3ae112189af436e4d2238cdef65c9bbd35ae + checksum: 4a398ada7a072dea8f8275c299201ad107da14b189a453b892942adcf60ccabb311be477c979cfa0313df0b0099b7fafb4cba9c10ed939aec80e3a9a76b0535d languageName: node linkType: hard @@ -4948,18 +4850,18 @@ __metadata: "@react-native-community/cli": 20.0.0 "@react-native-community/cli-platform-android": 20.0.0 "@react-native-community/cli-platform-ios": 20.0.0 - "@react-native-firebase/app": ^23.4.0 - "@react-native-firebase/auth": ^23.4.0 - "@react-native-firebase/crashlytics": ^23.4.0 - "@react-native-firebase/firestore": ^23.4.0 - "@react-native-firebase/functions": ^23.4.0 - "@react-native-firebase/messaging": ^23.4.0 - "@react-native-firebase/storage": ^23.4.0 + "@react-native-firebase/app": ^24.0.0 + "@react-native-firebase/auth": ^24.0.0 + "@react-native-firebase/crashlytics": ^24.0.0 + "@react-native-firebase/firestore": ^24.0.0 + "@react-native-firebase/functions": ^24.0.0 + "@react-native-firebase/messaging": ^24.0.0 + "@react-native-firebase/storage": ^24.0.0 "@react-native-masked-view/masked-view": ^0.3.2 - "@react-native/babel-preset": 0.81.5 - "@react-native/eslint-config": 0.81.5 - "@react-native/metro-config": 0.81.5 - "@react-native/typescript-config": 0.81.5 + "@react-native/babel-preset": 0.81.4 + "@react-native/eslint-config": 0.81.4 + "@react-native/metro-config": 0.81.4 + "@react-native/typescript-config": 0.81.4 "@react-navigation/bottom-tabs": ^7.3.13 "@react-navigation/drawer": ^7.3.12 "@react-navigation/native": ^7.1.9 @@ -5015,7 +4917,7 @@ __metadata: prettier: 2.8.8 react: 19.1.0 react-i18next: ^16.0.0 - react-native: 0.81.5 + react-native: 0.81.4 react-native-context-menu-view: ^1.19.0 react-native-country-flag: ^2.0.2 react-native-country-picker-modal: ^2.0.0 @@ -5031,7 +4933,7 @@ __metadata: react-native-pdf-from-image: ^0.3.6 react-native-qrcode-svg: ^6.3.15 react-native-quick-base64: ^2.2.2 - react-native-quick-crypto: ^1.0.16 + react-native-quick-crypto: 0.7.17 react-native-reanimated: ^4.2.2 react-native-restart-newarch: ^1.0.85 react-native-safe-area-context: ~5.6.0 @@ -8039,7 +7941,7 @@ __metadata: languageName: node linkType: hard -"events@npm:3.3.0, events@npm:^3.3.0": +"events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 @@ -8697,39 +8599,39 @@ __metadata: languageName: node linkType: hard -"firebase@npm:12.2.1": - version: 12.2.1 - resolution: "firebase@npm:12.2.1" +"firebase@npm:12.10.0": + version: 12.10.0 + resolution: "firebase@npm:12.10.0" dependencies: - "@firebase/ai": 2.2.1 - "@firebase/analytics": 0.10.18 - "@firebase/analytics-compat": 0.2.24 - "@firebase/app": 0.14.2 - "@firebase/app-check": 0.11.0 - "@firebase/app-check-compat": 0.4.0 - "@firebase/app-compat": 0.5.2 + "@firebase/ai": 2.9.0 + "@firebase/analytics": 0.10.20 + "@firebase/analytics-compat": 0.2.26 + "@firebase/app": 0.14.9 + "@firebase/app-check": 0.11.1 + "@firebase/app-check-compat": 0.4.1 + "@firebase/app-compat": 0.5.9 "@firebase/app-types": 0.9.3 - "@firebase/auth": 1.11.0 - "@firebase/auth-compat": 0.6.0 - "@firebase/data-connect": 0.3.11 - "@firebase/database": 1.1.0 - "@firebase/database-compat": 2.1.0 - "@firebase/firestore": 4.9.1 - "@firebase/firestore-compat": 0.4.1 - "@firebase/functions": 0.13.1 - "@firebase/functions-compat": 0.4.1 - "@firebase/installations": 0.6.19 - "@firebase/installations-compat": 0.2.19 - "@firebase/messaging": 0.12.23 - "@firebase/messaging-compat": 0.2.23 - "@firebase/performance": 0.7.9 - "@firebase/performance-compat": 0.2.22 - "@firebase/remote-config": 0.6.6 - "@firebase/remote-config-compat": 0.2.19 - "@firebase/storage": 0.14.0 - "@firebase/storage-compat": 0.4.0 - "@firebase/util": 1.13.0 - checksum: 5873b79e9fa42bbafd4bc6667affb649c51876c1de46ea667b7c3a2b3eeea6eecf6339d28aa8a94f756bf62fdf1bd46777c4ce1a45c5034942804ccad3cd2d01 + "@firebase/auth": 1.12.1 + "@firebase/auth-compat": 0.6.3 + "@firebase/data-connect": 0.4.0 + "@firebase/database": 1.1.1 + "@firebase/database-compat": 2.1.1 + "@firebase/firestore": 4.12.0 + "@firebase/firestore-compat": 0.4.6 + "@firebase/functions": 0.13.2 + "@firebase/functions-compat": 0.4.2 + "@firebase/installations": 0.6.20 + "@firebase/installations-compat": 0.2.20 + "@firebase/messaging": 0.12.24 + "@firebase/messaging-compat": 0.2.24 + "@firebase/performance": 0.7.10 + "@firebase/performance-compat": 0.2.23 + "@firebase/remote-config": 0.8.1 + "@firebase/remote-config-compat": 0.2.22 + "@firebase/storage": 0.14.1 + "@firebase/storage-compat": 0.4.1 + "@firebase/util": 1.14.0 + checksum: b76b9a8710401366c8920fd81fb8a8f742e39a13fa5189e28e9e4c743f4daec327ef9afd56cbf56b35bb1a06527d5ca6120e9ba3f3214367316a62188231a9fe languageName: node linkType: hard @@ -13159,29 +13061,16 @@ __metadata: languageName: node linkType: hard -"react-native-quick-crypto@npm:^1.0.16": - version: 1.0.16 - resolution: "react-native-quick-crypto@npm:1.0.16" +"react-native-quick-crypto@npm:0.7.17": + version: 0.7.17 + resolution: "react-native-quick-crypto@npm:0.7.17" dependencies: - "@craftzdog/react-native-buffer": 6.1.0 - events: 3.3.0 - readable-stream: 4.5.2 - safe-buffer: ^5.2.1 + "@craftzdog/react-native-buffer": ^6.0.5 + events: ^3.3.0 + readable-stream: ^4.5.2 string_decoder: ^1.3.0 - util: 0.12.5 - peerDependencies: - expo: ">=48.0.0" - expo-build-properties: "*" - react: "*" - react-native: "*" - react-native-nitro-modules: ">=0.29.1" - react-native-quick-base64: ">=2.1.0" - peerDependenciesMeta: - expo: - optional: true - expo-build-properties: - optional: true - checksum: 73cc7507e66c8a2d2d87ba9b5858acc6973b7dd08fabdb2db10c09ad112666496813a6e48f50018708468f5b6060ca52eb6ad85a7a0eae6b9a7b3eae2e203bb8 + util: ^0.12.5 + checksum: 5864b483900b504bff353721dffce2458635d7ad15a4bb87389a9161d83fd60a809c2881293a58ef03de3492ded8e9bf19efc8ae1d1694b500feedc26eee1e5c languageName: node linkType: hard @@ -13262,14 +13151,14 @@ __metadata: languageName: node linkType: hard -"react-native-url-polyfill@npm:2.0.0": - version: 2.0.0 - resolution: "react-native-url-polyfill@npm:2.0.0" +"react-native-url-polyfill@npm:3.0.0": + version: 3.0.0 + resolution: "react-native-url-polyfill@npm:3.0.0" dependencies: whatwg-url-without-unicode: 8.0.0-3 peerDependencies: react-native: "*" - checksum: 1a2e1030a62fd093764b5330ce0ff34d72246e581dd2892cddc347d8621931aeb2c9ea3e054960484a1259230e8461e569e1890f1ff452d3c5c0adef70190fc3 + checksum: 3d6e02b8c32933bca588b70e86c1b2981cd2d9f4055f7ce5ba5f321596ffae5ce89fea41af8d13eca7b4f29daf685406354c761696e5a4bdfb5698468e54a527 languageName: node linkType: hard @@ -13362,18 +13251,18 @@ __metadata: languageName: node linkType: hard -"react-native@npm:0.81.5": - version: 0.81.5 - resolution: "react-native@npm:0.81.5" +"react-native@npm:0.81.4": + version: 0.81.4 + resolution: "react-native@npm:0.81.4" dependencies: "@jest/create-cache-key-function": ^29.7.0 - "@react-native/assets-registry": 0.81.5 - "@react-native/codegen": 0.81.5 - "@react-native/community-cli-plugin": 0.81.5 - "@react-native/gradle-plugin": 0.81.5 - "@react-native/js-polyfills": 0.81.5 - "@react-native/normalize-colors": 0.81.5 - "@react-native/virtualized-lists": 0.81.5 + "@react-native/assets-registry": 0.81.4 + "@react-native/codegen": 0.81.4 + "@react-native/community-cli-plugin": 0.81.4 + "@react-native/gradle-plugin": 0.81.4 + "@react-native/js-polyfills": 0.81.4 + "@react-native/normalize-colors": 0.81.4 + "@react-native/virtualized-lists": 0.81.4 abort-controller: ^3.0.0 anser: ^1.4.9 ansi-regex: ^5.0.0 @@ -13408,7 +13297,7 @@ __metadata: optional: true bin: react-native: cli.js - checksum: 52c8d47b30f32c593c0d26a233a7edab2fe8de0ba8de8d9e9a52a20d8efb42ab348012de3c7482e9f08743ffae6b5c2171f2d776b1765be19a2e52d6b2f7f21c + checksum: f5d3f726722b37c948ead0ac7971b5daa484e3533184238e7cc12ae36a7cadd74f125f06bee6e2940cce13c4fddcd1e3137532ec5a6f0fbef07b1c03443fa637 languageName: node linkType: hard @@ -13438,19 +13327,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:4.5.2": - version: 4.5.2 - resolution: "readable-stream@npm:4.5.2" - dependencies: - abort-controller: ^3.0.0 - buffer: ^6.0.3 - events: ^3.3.0 - process: ^0.11.10 - string_decoder: ^1.3.0 - checksum: c4030ccff010b83e4f33289c535f7830190773e274b3fcb6e2541475070bdfd69c98001c3b0cb78763fc00c8b62f514d96c2b10a8bd35d5ce45203a25fa1d33a - languageName: node - linkType: hard - "readable-stream@npm:^2.3.8": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" @@ -13477,6 +13353,19 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^4.5.2": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" + dependencies: + abort-controller: ^3.0.0 + buffer: ^6.0.3 + events: ^3.3.0 + process: ^0.11.10 + string_decoder: ^1.3.0 + checksum: 03ec762faed8e149dc6452798b60394a8650861a1bb4bf936fa07b94044826bc25abe73696f5f45372abc404eec01876c560f64b479eba108b56397312dbe2ae + languageName: node + linkType: hard + "reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": version: 1.0.10 resolution: "reflect.getprototypeof@npm:1.0.10" @@ -15288,7 +15177,7 @@ __metadata: languageName: node linkType: hard -"util@npm:0.12.5, util@npm:^0.12.5": +"util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: