diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 7039de29c220..99b3355c533f 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -54,31 +54,31 @@ "@formatjs/intl-pluralrules": "^4.3.3", "@notifee/react-native": "9.1.8", "@onekeyfe/react-native-animated-charts": "2.0.1", - "@onekeyfe/react-native-app-update": "3.0.36", - "@onekeyfe/react-native-auto-size-input": "3.0.36", - "@onekeyfe/react-native-background-thread": "3.0.36", + "@onekeyfe/react-native-app-update": "3.0.37", + "@onekeyfe/react-native-auto-size-input": "3.0.37", + "@onekeyfe/react-native-background-thread": "3.0.37", "@onekeyfe/react-native-ble-utils": "0.1.4", - "@onekeyfe/react-native-bundle-update": "3.0.36", - "@onekeyfe/react-native-check-biometric-auth-changed": "3.0.36", - "@onekeyfe/react-native-cloud-kit-module": "3.0.36", - "@onekeyfe/react-native-device-utils": "3.0.36", - "@onekeyfe/react-native-keychain-module": "3.0.36", - "@onekeyfe/react-native-lite-card": "3.0.36", - "@onekeyfe/react-native-native-logger": "3.0.36", - "@onekeyfe/react-native-perf-memory": "3.0.36", - "@onekeyfe/react-native-perf-stats": "3.0.36", - "@onekeyfe/react-native-scroll-guard": "3.0.36", - "@onekeyfe/react-native-skeleton": "3.0.36", + "@onekeyfe/react-native-bundle-update": "3.0.37", + "@onekeyfe/react-native-check-biometric-auth-changed": "3.0.37", + "@onekeyfe/react-native-cloud-kit-module": "3.0.37", + "@onekeyfe/react-native-device-utils": "3.0.37", + "@onekeyfe/react-native-keychain-module": "3.0.37", + "@onekeyfe/react-native-lite-card": "3.0.37", + "@onekeyfe/react-native-native-logger": "3.0.37", + "@onekeyfe/react-native-perf-memory": "3.0.37", + "@onekeyfe/react-native-perf-stats": "3.0.37", + "@onekeyfe/react-native-scroll-guard": "3.0.37", + "@onekeyfe/react-native-skeleton": "3.0.37", "@onekeyfe/react-native-sni-connect": "1.1.0", - "@onekeyfe/react-native-splash-screen": "3.0.36", - "@onekeyfe/react-native-split-bundle-loader": "3.0.36", - "@onekeyfe/react-native-tab-view": "3.0.36", + "@onekeyfe/react-native-splash-screen": "3.0.37", + "@onekeyfe/react-native-split-bundle-loader": "3.0.37", + "@onekeyfe/react-native-tab-view": "3.0.37", "@onekeyfe/react-native-text-input": "0.3.0", "@onekeyhq/components": "*", "@onekeyhq/kit": "*", "@onekeyhq/shared": "*", "@phantom/react-native-juicebox-sdk": "0.3.17", - "@react-native-async-storage/async-storage": "npm:@onekeyfe/react-native-async-storage@3.0.36", + "@react-native-async-storage/async-storage": "npm:@onekeyfe/react-native-async-storage@3.0.37", "@react-native-community/netinfo": "11.4.1", "@react-native-community/slider": "5.0.1", "@react-native-documents/picker": "^12.0.1", @@ -126,33 +126,33 @@ "path-browserify": "^1.0.1", "react": "19.1.0", "react-native": "0.81.5", - "react-native-aes-crypto": "npm:@onekeyfe/react-native-aes-crypto@3.0.36", + "react-native-aes-crypto": "npm:@onekeyfe/react-native-aes-crypto@3.0.37", "react-native-awesome-slider": "^2.9.0", "react-native-ble-plx": "3.5.1", "react-native-camera-kit": "17.0.1", "react-native-canvas": "^0.1.39", "react-native-capture-protection": "2.3.0", - "react-native-cloud-fs": "npm:@onekeyfe/react-native-cloud-fs@3.0.36", + "react-native-cloud-fs": "npm:@onekeyfe/react-native-cloud-fs@3.0.37", "react-native-collapsible-tab-view": "8.0.1", "react-native-crypto": "^2.2.0", - "react-native-dns-lookup": "npm:@onekeyfe/react-native-dns-lookup@3.0.36", - "react-native-fast-pbkdf2": "npm:@onekeyfe/react-native-pbkdf2@3.0.36", + "react-native-dns-lookup": "npm:@onekeyfe/react-native-dns-lookup@3.0.37", + "react-native-fast-pbkdf2": "npm:@onekeyfe/react-native-pbkdf2@3.0.37", "react-native-fs": "npm:@dr.pogodin/react-native-fs@2.34.0", "react-native-gesture-handler": "2.30.0", - "react-native-get-random-values": "npm:@onekeyfe/react-native-get-random-values@3.0.36", + "react-native-get-random-values": "npm:@onekeyfe/react-native-get-random-values@3.0.37", "react-native-image-colors": "^2.5.0", "react-native-image-crop-picker": "0.51.1", "react-native-keyboard-controller": "1.20.7", "react-native-level-fs": "3.0.1", "react-native-mmkv": "4.1.0", "react-native-modal": "^13.0.1", - "react-native-network-info": "npm:@onekeyfe/react-native-network-info@3.0.36", + "react-native-network-info": "npm:@onekeyfe/react-native-network-info@3.0.37", "react-native-network-logger": "2.0.1", "react-native-nitro-modules": "0.33.2", - "react-native-pager-view": "npm:@onekeyfe/react-native-pager-view@3.0.36", + "react-native-pager-view": "npm:@onekeyfe/react-native-pager-view@3.0.37", "react-native-passkeys": "0.3.3", "react-native-permissions": "5.4.4", - "react-native-ping": "npm:@onekeyfe/react-native-ping@3.0.36", + "react-native-ping": "npm:@onekeyfe/react-native-ping@3.0.37", "react-native-purchases": "8.11.9", "react-native-qrcode-styled": "0.4.0", "react-native-reanimated": "4.2.1", @@ -160,13 +160,13 @@ "react-native-screens": "4.23.0", "react-native-svg": "15.15.1", "react-native-svg-transformer": "^1.5.3", - "react-native-tcp-socket": "npm:@onekeyfe/react-native-tcp-socket@3.0.36", + "react-native-tcp-socket": "npm:@onekeyfe/react-native-tcp-socket@3.0.37", "react-native-video": "6.18.0", "react-native-view-shot": "4.0.3", "react-native-webview": "13.15.0", "react-native-webview-cleaner": "npm:@onekeyfe/react-native-webview-cleaner@1.0.0", "react-native-worklets": "0.7.1", - "react-native-zip-archive": "npm:@onekeyfe/react-native-zip-archive@3.0.36", + "react-native-zip-archive": "npm:@onekeyfe/react-native-zip-archive@3.0.37", "readable-stream": "^3.6.0", "realm": "20.2.0", "realm-flipper-plugin-device": "^1.1.0", diff --git a/package.json b/package.json index aa35162ec13b..5619de083684 100644 --- a/package.json +++ b/package.json @@ -217,7 +217,7 @@ "react-native": "0.81.5", "react-native-confirmation-code-field": "^7.4.0", "react-native-draggable-flatlist": "4.0.3", - "react-native-get-random-values": "npm:@onekeyfe/react-native-get-random-values@3.0.36", + "react-native-get-random-values": "npm:@onekeyfe/react-native-get-random-values@3.0.37", "react-native-reanimated": "4.2.1", "react-native-screens": "4.23.0", "react-native-web": "0.21.2", @@ -450,7 +450,7 @@ "react-native-reanimated": "4.2.1", "react-native-worklets": "0.7.1", "react-native-screens": "4.23.0", - "react-native-get-random-values": "npm:@onekeyfe/react-native-get-random-values@3.0.36", + "react-native-get-random-values": "npm:@onekeyfe/react-native-get-random-values@3.0.37", "@isaacs/brace-expansion": "5.0.1", "fast-xml-parser": "4.5.4" } diff --git a/packages/components/package.json b/packages/components/package.json index 90bba8d4eb01..faa9d1635d9b 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -4,8 +4,8 @@ "private": true, "main": "src/index.tsx", "dependencies": { - "@onekeyfe/react-native-scroll-guard": "3.0.36", - "@onekeyfe/react-native-tab-view": "3.0.36", + "@onekeyfe/react-native-scroll-guard": "3.0.37", + "@onekeyfe/react-native-tab-view": "3.0.37", "@react-navigation/bottom-tabs": "7.10.1", "@react-navigation/elements": "2.9.5", "@react-navigation/native": "7.1.28", diff --git a/packages/kit/src/components/AppUpdate/updateRetry.ts b/packages/kit/src/components/AppUpdate/updateRetry.ts index bd2fc32d57b8..b49008c4cca3 100644 --- a/packages/kit/src/components/AppUpdate/updateRetry.ts +++ b/packages/kit/src/components/AppUpdate/updateRetry.ts @@ -1,3 +1,4 @@ +import { globalNetInfo } from '@onekeyhq/components/src/hooks/useNetInfo'; import { OneKeyLocalError } from '@onekeyhq/shared/src/errors'; import { defaultLogger } from '@onekeyhq/shared/src/logger/logger'; import timerUtils from '@onekeyhq/shared/src/utils/timerUtils'; @@ -7,57 +8,136 @@ import { isUnrecoverableDownloadError, } from './updateErrorTaxonomy'; -const DOWNLOAD_RETRY_MAX_ATTEMPTS = 3; +const DOWNLOAD_RETRY_MAX_ATTEMPTS = 5; const DOWNLOAD_RETRY_BASE_DELAY_MS = 1500; +const DOWNLOAD_RETRY_MAX_DELAY_MS = 60_000; +// Cap on how long we'll camp on the NetInfo listener before falling back to +// the regular backoff. 5 minutes is long enough to cover Wi-Fi → cellular +// handover, captive-portal re-auth, and most train-tunnel blackouts without +// leaving the retry loop wedged forever on a user who just put the phone down. +const DOWNLOAD_RETRY_OFFLINE_WAIT_MS = 5 * 60 * 1000; +// Brief grace after the network is reported back so we don't fire the next +// request while the OS is still negotiating DNS / probing the captive portal. +const DOWNLOAD_RETRY_ONLINE_GRACE_MS = 1500; // Visible for testing; main callers go through runDownloadWithRetry. export function computeDownloadRetryDelayMs(attempt: number): number { - return ( + const exp = DOWNLOAD_RETRY_BASE_DELAY_MS * 2 ** attempt + - Math.floor(Math.random() * 500) + Math.floor(Math.random() * 500); + return Math.min(exp, DOWNLOAD_RETRY_MAX_DELAY_MS); +} + +/** + * Wait until either `timeoutMs` elapses OR globalNetInfo reports the device + * is online (isInternetReachable !== false), whichever comes first. The + * `null` (unknown) state is treated as "not offline" — we never block on a + * NetInfo that hasn't booted yet, since blocking on `null` would wedge the + * retry loop on environments where the reachability probe never runs. + */ +async function waitForOnlineOrTimeout( + timeoutMs: number, + context: string, +): Promise { + if (globalNetInfo.currentState().isInternetReachable !== false) return; + const startedAt = Date.now(); + defaultLogger.app.appUpdate.log( + `${context}: offline-wait start, cap=${timeoutMs}ms`, + ); + // Default to 'timeout'; only the listener path overrides to 'online'. + let exitReason: 'online' | 'timeout' = 'timeout'; + await new Promise((resolve) => { + let timeoutId: ReturnType | null = null; + let unsubscribe: (() => void) | null = null; + let resolved = false; + const finish = () => { + if (resolved) return; + resolved = true; + if (timeoutId !== null) clearTimeout(timeoutId); + unsubscribe?.(); + resolve(); + }; + timeoutId = setTimeout(finish, timeoutMs); + unsubscribe = globalNetInfo.addEventListener((state) => { + if (state.isInternetReachable !== false) { + exitReason = 'online'; + finish(); + } + }); + }); + defaultLogger.app.appUpdate.log( + `${context}: offline-wait end reason=${exitReason} elapsed=${ + Date.now() - startedAt + }ms`, ); } /** - * Retries `operation` on transient bundle-update failures (network drops, - * partial truncation, transient server 5xx) up to DOWNLOAD_RETRY_MAX_ATTEMPTS - * times with exponential backoff + jitter. The native modules persist their + * Sleep before the next attempt. When the device is currently reported + * offline, prefer "wait until online" over a fixed exponential delay — + * a 1.5s backoff in a 30s tunnel just burns retries against DNS for nothing. + * When the device is online, fall back to the original + * exp + jitter schedule capped at DOWNLOAD_RETRY_MAX_DELAY_MS. + */ +async function waitBeforeRetry( + attempt: number, + context: string, +): Promise { + const baseDelay = computeDownloadRetryDelayMs(attempt); + if (globalNetInfo.currentState().isInternetReachable === false) { + await waitForOnlineOrTimeout(DOWNLOAD_RETRY_OFFLINE_WAIT_MS, context); + // After the listener fires (or the offline cap expires), give the OS a + // moment to stabilize the new path before we hammer the CDN again. + await timerUtils.wait(Math.min(baseDelay, DOWNLOAD_RETRY_ONLINE_GRACE_MS)); + return; + } + await timerUtils.wait(baseDelay); +} + +/** + * Retries `operation` on transient bundle / APK download failures (network + * drops, partial truncation, transient server 5xx) up to + * DOWNLOAD_RETRY_MAX_ATTEMPTS times. The native modules persist their * resume artifact (iOS .resume / Android & Desktop .partial) on each failure, * so each retry is a true range-resume rather than a from-byte-zero re-fetch. * + * Wait strategy is reachability-aware: while NetInfo reports offline we camp + * on its listener (capped by DOWNLOAD_RETRY_OFFLINE_WAIT_MS) and only release + * once the link comes back; when online we use exponential backoff + * (`1500 * 2^attempt + jitter[0,500)`, capped at DOWNLOAD_RETRY_MAX_DELAY_MS). + * * Bails immediately for unrecoverable codes (SHA mismatch, HTTP 403/404/410, * config errors) so we don't waste backoff windows on deterministic dead - * states. Cap of 3 attempts (initial + 3 retries = 4 total round-trips). - * Backoff schedule is `1500 * 2^attempt + jitter[0,500)`, i.e. roughly - * 1.5s, 3s, 6s before the 4th attempt; total worst-case wall time - * before bubbling up is ~10.5s + ~1.5s of jitter. + * states. */ export async function runDownloadWithRetry( operation: () => Promise, context: string, ): Promise { - let lastError: unknown; for (let attempt = 0; attempt <= DOWNLOAD_RETRY_MAX_ATTEMPTS; attempt += 1) { try { return await operation(); } catch (e) { - lastError = e; if ( isUnrecoverableDownloadError(e) || attempt === DOWNLOAD_RETRY_MAX_ATTEMPTS ) { throw e; } - const delayMs = computeDownloadRetryDelayMs(attempt); + const isOffline = + globalNetInfo.currentState().isInternetReachable === false; + const baseDelayMs = computeDownloadRetryDelayMs(attempt); defaultLogger.app.appUpdate.log( - `${context}: retry ${attempt + 1}/${DOWNLOAD_RETRY_MAX_ATTEMPTS} in ${delayMs}ms — code=${ - extractUpdateErrorCode(e) ?? '' - }`, + `${context}: retry ${attempt + 1}/${DOWNLOAD_RETRY_MAX_ATTEMPTS} ${ + isOffline + ? `offline-wait≤${DOWNLOAD_RETRY_OFFLINE_WAIT_MS}ms` + : `in ${baseDelayMs}ms` + } — code=${extractUpdateErrorCode(e) ?? ''}`, ); - await timerUtils.wait(delayMs); + await waitBeforeRetry(attempt, context); } } - throw new OneKeyLocalError( - lastError instanceof Error ? lastError.message : String(lastError), - ); + // Unreachable: the loop either returns on success or throws on the + // attempt === MAX iteration. Keep the throw to satisfy TS control flow. + throw new OneKeyLocalError('runDownloadWithRetry: unreachable'); } diff --git a/packages/kit/src/components/AppUpdate/useAppUpdate.test.ts b/packages/kit/src/components/AppUpdate/useAppUpdate.test.ts index 29c1ec36ec82..8f03ae6a778a 100644 --- a/packages/kit/src/components/AppUpdate/useAppUpdate.test.ts +++ b/packages/kit/src/components/AppUpdate/useAppUpdate.test.ts @@ -132,12 +132,41 @@ jest.mock('@onekeyhq/components', () => { const te = jest.fn(); (globalThis as any).__mockDialogShow = ds; (globalThis as any).__mockToastError = te; + // The root jest.config.js moduleNameMapper rewrites `@onekeyhq/components` + // AND every deeper subpath under it (including + // `@onekeyhq/components/src/hooks/useNetInfo`) to the same + // __mocks__/componentsMock.ts. As a result jest.mock attaches to the + // resolved file, so both `import { Toast } from '@onekeyhq/components'` + // AND `import { globalNetInfo } from '@onekeyhq/components/src/hooks/useNetInfo'` + // pull from this single returned object — we must expose ALL named exports + // here, or one import path will silently overwrite the other. + const netInfoListeners: Array< + (s: { isInternetReachable: boolean | null }) => void + > = []; + const globalNetInfo = { + currentState: () => ({ isInternetReachable: null as boolean | null }), + addEventListener: ( + l: (s: { isInternetReachable: boolean | null }) => void, + ) => { + netInfoListeners.push(l); + return () => { + const idx = netInfoListeners.indexOf(l); + if (idx >= 0) netInfoListeners.splice(idx, 1); + }; + }, + __emit: (state: { isInternetReachable: boolean | null }) => { + [...netInfoListeners].forEach((l) => l(state)); + }, + __reset: () => netInfoListeners.splice(0, netInfoListeners.length), + }; + (globalThis as any).__mockGlobalNetInfo = globalNetInfo; return { Dialog: { show: ds }, Toast: { error: te }, LottieView: () => null, YStack: ({ children }: any) => children, useInTabDialog: () => ({ show: ds }), + globalNetInfo, }; }); @@ -477,24 +506,26 @@ describe('runDownloadWithRetry', () => { } }); - test('throws the last error after exhausting all 3 retries', async () => { - const e1 = new Error('NSURLErrorDomain -1005'); - const e2 = new Error('NSURLErrorDomain -1001'); - const e3 = new Error('HTTP 502'); - const e4 = new Error('IO_SocketTimeoutException'); - const op = jest - .fn, []>() - .mockRejectedValueOnce(e1) - .mockRejectedValueOnce(e2) - .mockRejectedValueOnce(e3) - .mockRejectedValueOnce(e4); + test('throws the last error after exhausting all 5 retries', async () => { + const errs = [ + new Error('NSURLErrorDomain -1005'), + new Error('NSURLErrorDomain -1001'), + new Error('HTTP 502'), + new Error('IO_SocketTimeoutException'), + new Error('NSURLErrorDomain -1009'), + new Error('HTTP 503'), + ]; + const op = jest.fn, []>(); + errs.forEach((e) => op.mockRejectedValueOnce(e)); const promise = runDownloadWithRetry(op, 'test').catch((err) => err); - await flush(); - await flush(); - await flush(); + // initial + 5 retries = 6 attempts; flush once per await chain. + for (let i = 0; i < errs.length + 1; i += 1) { + // eslint-disable-next-line no-await-in-loop + await flush(); + } const finalErr = await promise; - expect(finalErr).toBe(e4); - expect(op).toHaveBeenCalledTimes(4); // initial + 3 retries + expect(finalErr).toBe(errs[errs.length - 1]); + expect(op).toHaveBeenCalledTimes(errs.length); // initial + 5 retries }); test('computeDownloadRetryDelayMs grows exponentially with jitter floor', () => { @@ -510,6 +541,74 @@ describe('runDownloadWithRetry', () => { expect(a2).toBeGreaterThanOrEqual(6000); expect(a2).toBeLessThan(6500); }); + + test('computeDownloadRetryDelayMs is capped at 60s for late attempts', () => { + // base * 2^6 = 96_000 > 60_000 cap; cap must clamp before jitter pushes + // us further. Same for attempt 10 (way past the cap). + expect(computeDownloadRetryDelayMs(6)).toBeLessThanOrEqual(60_000); + expect(computeDownloadRetryDelayMs(10)).toBeLessThanOrEqual(60_000); + }); + + test('camps on the NetInfo listener while offline and resumes once back online', async () => { + const netInfo = (globalThis as any).__mockGlobalNetInfo; + netInfo.__reset(); + // Start offline: the first retry should NOT proceed off the regular + // backoff clock — it should wait for an online emission. + let online = false; + netInfo.currentState = () => ({ + isInternetReachable: online ? null : false, + }); + const op = jest + .fn, []>() + .mockRejectedValueOnce(new Error('NSURLErrorDomain -1009')) + .mockResolvedValueOnce('ok'); + const promise = runDownloadWithRetry(op, 'test').catch((e) => e); + // Let the rejection settle and waitBeforeRetry block on addEventListener. + for (let i = 0; i < 8; i += 1) { + // eslint-disable-next-line no-await-in-loop + await Promise.resolve(); + } + expect(op).toHaveBeenCalledTimes(1); + // Simulate the device coming back online — the listener fires and the + // grace-period setTimeout schedules; advance both. + online = true; + netInfo.__emit({ isInternetReachable: true }); + await flush(); + await flush(); + const result = await promise; + expect(result).toBe('ok'); + expect(op).toHaveBeenCalledTimes(2); + // Restore default for sibling tests. + netInfo.currentState = () => ({ isInternetReachable: null }); + }); + + test('falls back to grace + retry when the offline cap expires', async () => { + const netInfo = (globalThis as any).__mockGlobalNetInfo; + netInfo.__reset(); + // Stay offline the whole time — the listener never fires, so the only + // way the retry loop can make progress is by the 5-min offline-wait cap + // tripping and bubbling out as exitReason='timeout'. + netInfo.currentState = () => ({ isInternetReachable: false }); + const op = jest + .fn, []>() + .mockRejectedValueOnce(new Error('NSURLErrorDomain -1009')) + .mockResolvedValueOnce('ok'); + const promise = runDownloadWithRetry(op, 'test').catch((e) => e); + // Let the rejection settle and waitForOnlineOrTimeout register its timer. + for (let i = 0; i < 8; i += 1) { + // eslint-disable-next-line no-await-in-loop + await Promise.resolve(); + } + expect(op).toHaveBeenCalledTimes(1); + // Trip the offline cap → exitReason='timeout' → falls through to grace. + jest.advanceTimersByTime(5 * 60 * 1000); + await flush(); + const result = await promise; + expect(result).toBe('ok'); + expect(op).toHaveBeenCalledTimes(2); + // Restore default for sibling tests. + netInfo.currentState = () => ({ isInternetReachable: null }); + }); }); // ========================================================================= diff --git a/packages/kit/src/components/AppUpdate/useDownloadPackage.tsx b/packages/kit/src/components/AppUpdate/useDownloadPackage.tsx index f4f850963b83..69c9ef95c8a3 100644 --- a/packages/kit/src/components/AppUpdate/useDownloadPackage.tsx +++ b/packages/kit/src/components/AppUpdate/useDownloadPackage.tsx @@ -298,12 +298,12 @@ export const useDownloadPackage = () => { headers, }; defaultLogger.app.appUpdate.startDownload(downloadParams); - // Retry transient failures up to 3x with backoff. Each retry reuses - // the on-disk resume artifact (iOS .resume / Android & Desktop - // .partial), so the second attempt onward is a real range-resume — - // not a from-byte-zero re-fetch. Bails immediately on - // SHA256_MISMATCH / HTTP 4xx-permanent so we don't spin on a known- - // dead state. + // Retry transient failures up to 5x with reachability-aware backoff. + // While NetInfo reports offline we camp on its listener (capped at + // 5 min); when online we use exp backoff capped at 60s. Each retry + // reuses the on-disk resume artifact (iOS .resume / Android & Desktop + // .partial), so attempts after the first are real range-resumes. + // Bails immediately on SHA256_MISMATCH / HTTP 4xx-permanent. const result = await runDownloadWithRetry( () => fileType === EUpdateFileType.jsBundle diff --git a/yarn.lock b/yarn.lock index 3b5fda479f7a..e12270156803 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9303,36 +9303,36 @@ __metadata: languageName: node linkType: hard -"@onekeyfe/react-native-app-update@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-app-update@npm:3.0.36" +"@onekeyfe/react-native-app-update@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-app-update@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/9ac82bdc6ab1b19fdc8c68b067c55e03160b8bcaaac85a123a10a337b3e463a368c688ac0743d615fa1538d738a28b094080991c3dd33e2443dd785259a45e22 + checksum: 10/dc34ed988a2a6ba5edb9221506a8be0b65cb3c68f97e67f6284fa6e6b0b99eed9e48fe0fa72c4d331780cc275365de91441f2983618468170d0c01ed34415e08 languageName: node linkType: hard -"@onekeyfe/react-native-auto-size-input@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-auto-size-input@npm:3.0.36" +"@onekeyfe/react-native-auto-size-input@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-auto-size-input@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/139e5027af7ee82242f46d5bfcbb7a1ff0e84785d213af590bb4669cd32f4ec8ed6b72dd1091594573eca47c98fef208a98f72fe4cc0466ec71df468fdad00fb + checksum: 10/a09b5f7dc92922542d0ea489d94042c8864e0327be4e449678fae7ba1bd6a7359d00ad6930b2f8d6c4712b7b5c0d04d9801440c9373c918899d69a1c89c32d4d languageName: node linkType: hard -"@onekeyfe/react-native-background-thread@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-background-thread@npm:3.0.36" +"@onekeyfe/react-native-background-thread@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-background-thread@npm:3.0.37" peerDependencies: "@onekeyfe/react-native-bundle-update": "*" react: "*" react-native: "*" - checksum: 10/a4ca75d7611283c78578e08f4042500762036f9ba857aeaead14f867cb33362864f1e68a119691edc7b67195a1352c287e403718537687e1a666cdaac455b070 + checksum: 10/a8d0cba997a580ad16de48ad93f9db8815cb6a8d76ec7da15d45b4cccc74b9496547efa2a4908134a04f8c8114eb17081f82ad96b35fb97d04625770b9bf7b0b languageName: node linkType: hard @@ -9346,123 +9346,123 @@ __metadata: languageName: node linkType: hard -"@onekeyfe/react-native-bundle-update@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-bundle-update@npm:3.0.36" +"@onekeyfe/react-native-bundle-update@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-bundle-update@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/cd6c0ae69fc9e1c98ac8578b87e30fffaca96fa9327271300fc5cccd6c9782d0f996ef15244e8faae5b2db455510b6a71ea18900323e53ef4af356749bf00260 + checksum: 10/a8b801c3f636a1519505117113ff7d92487e6e1e4da6cb2ba03afef4cb143cd9e9e46381d02b2bdc34476a9e25d8bb76a55f6c263a69ab3256ad9ce7624ed38a languageName: node linkType: hard -"@onekeyfe/react-native-check-biometric-auth-changed@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-check-biometric-auth-changed@npm:3.0.36" +"@onekeyfe/react-native-check-biometric-auth-changed@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-check-biometric-auth-changed@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/9a4416c0eb9afd4db5d1ece29a1a4547f677d0a6b367d00ba625253c428f948b1c3b022869db0b770be699e81a86828abbc41ddc354533cc37621273d9118e8a + checksum: 10/a763be6f740a06a55d65da335e53c5a756bb956bbc7662dd3670a7dd9467a3353143c426a1bc9d4a5f66578d832157b01f91f123f0ba8bba342cd6b768b285dd languageName: node linkType: hard -"@onekeyfe/react-native-cloud-kit-module@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-cloud-kit-module@npm:3.0.36" +"@onekeyfe/react-native-cloud-kit-module@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-cloud-kit-module@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/11be6924b8272768672b3095e72376a73bfb8d79617c76984a60c5a7b7f58a75b2c3e978f0d8daa02dcb3f9bfa4bec2d0ada06d782e097d2fbca65ae5edcfab9 + checksum: 10/aad41f10966d4b2fb4c581d24168c9d5bd145b404f069173ad96dd737ed7cea34515c52b2e4c7f5f5948afa015acb6c8466ead91b32269482ed8a80a91d7900b languageName: node linkType: hard -"@onekeyfe/react-native-device-utils@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-device-utils@npm:3.0.36" +"@onekeyfe/react-native-device-utils@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-device-utils@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/2043ae557ae86618a1d17617e7d0bc78361dc688f5acabdb1bb6a3cfcde7ab948c148a0fac0ea2c1ae67a161fc95de0bafb0a0474a6025e514a7d237d561591d + checksum: 10/ca8ebcdd51c8468629080e497c20616b40f18f199951087c268c91e05913809a20588e5311b6eb6cee218b99122cebda6cc0af740fb4edc3639ee0510b430474 languageName: node linkType: hard -"@onekeyfe/react-native-keychain-module@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-keychain-module@npm:3.0.36" +"@onekeyfe/react-native-keychain-module@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-keychain-module@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/aca6b186e65d63031930fca2bc20758b1a589cdd2bbd7f3110a838e781a2f32f6ed64e96ed44efd3d19cfd43fcb1a70ad4653bfc96ac13b305979870558ebb29 + checksum: 10/8e23ef59367a4ab4cbdbdd80381873691b8f1cb3c1e9a7b3b5a2350ee57bc1783e1363d71308c2147b75aa10db2269aa6efa6b316d5d5f0c95cfdf21d01c6a8b languageName: node linkType: hard -"@onekeyfe/react-native-lite-card@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-lite-card@npm:3.0.36" +"@onekeyfe/react-native-lite-card@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-lite-card@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/4b18291285403aa2c796b3d6ed6a11d73bf0e672e4800fadd125bcb2419994fe48cee32c18ad903c89245ee89f18cc75b33995431ea0837c52087b38335efc9b + checksum: 10/f9579e1f4edc5a1497196986ef5d6170e47e136747bd77a9d1956d8e3598d3c9613b277156e738cb79376aef9cdaff0384ebe67f61c0c8266e9c161d4095cea4 languageName: node linkType: hard -"@onekeyfe/react-native-native-logger@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-native-logger@npm:3.0.36" +"@onekeyfe/react-native-native-logger@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-native-logger@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/987c093b5310795f612e2da1e663c300dbc6b2e30c5d00b31126ad4f7222f5ff5b1a020c0ba693d4ec06361fe9a08a78e80d8169ef2c8b83db9b87fe4050276c + checksum: 10/e3b423a96c8491e653a60c9179116b0ec15a2b2db1de8bd12de394fa1bea537f3089faec8e0ebfdf2cf32fe7d1350e2746f4acced6b00297b12437d4bc5c5ef5 languageName: node linkType: hard -"@onekeyfe/react-native-perf-memory@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-perf-memory@npm:3.0.36" +"@onekeyfe/react-native-perf-memory@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-perf-memory@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/d3e985d9297ab8f57de6be6f951522b8845ada925e02c51554b8af293f3f6ed7cd32a024c65193708dc04d40d58c11a6aa27251675263664047edb22d63b4c36 + checksum: 10/b97b07ddca5dc95f0af0303e60fb89255faa0f8e858d22c7f1901397ca46d3085acd79af27f0818646c3ea65075b461d773c6b5f91fb15b72cf15359f629fbf4 languageName: node linkType: hard -"@onekeyfe/react-native-perf-stats@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-perf-stats@npm:3.0.36" +"@onekeyfe/react-native-perf-stats@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-perf-stats@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/680de62c60cf6bef57b4658e37732e58c2f99eb11cc72aa650cb5557e3c0911104d105ab9e0e7fc4295b7c1eeca5da2f2863940c396f0def95bbede02e0e4a99 + checksum: 10/88a12ae5c14c9907c2c52b4fbee635f9bcc75d90f8d0b0eca20a378668441bd1a2e4ac8e2287474be76cb25a1716f484177c13b4df692ad4d67e05849aa15a64 languageName: node linkType: hard -"@onekeyfe/react-native-scroll-guard@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-scroll-guard@npm:3.0.36" +"@onekeyfe/react-native-scroll-guard@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-scroll-guard@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/68757891be2d289321eb148b7a0cc8f5a2f8b7b8d7e93a2490de89310724c28a55b5e984c895264445dd5d7af0df57010c3daf70164f56f1ac64be852606cf38 + checksum: 10/46bf519ca430ba8565c88a449f9aa60c5777c734c7a33c963cfb4593f9fc287eca0968581f2706c434cc7a4353673bfb41221443230fc00e7606f5fe26351c7e languageName: node linkType: hard -"@onekeyfe/react-native-skeleton@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-skeleton@npm:3.0.36" +"@onekeyfe/react-native-skeleton@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-skeleton@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/7495b0b5bbbf34d09a48f65f5e22902cc125cae753453ebceec9583fd1aad1f619d1aff7eac81105b2515a1a5f1aa850601dac83a25db9afc60b1bea39c0adf2 + checksum: 10/f6887ae426ac75f4fd5111627387cf5cd6ad76483c6ba1747ebbfb17139e5b5b3e92cb1fff17a669358f1dc3caefe8db0125424346a22cac389e46cda3432384 languageName: node linkType: hard @@ -9476,31 +9476,31 @@ __metadata: languageName: node linkType: hard -"@onekeyfe/react-native-splash-screen@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-splash-screen@npm:3.0.36" +"@onekeyfe/react-native-splash-screen@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-splash-screen@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/d876faa8a7b1ae3b9fbf133ae7dd3703b920613c035337889f403a26ab1790d985643cbd617bab6f9ad8a249618cbfce49f93059ae6b5bea1b6e3db24f998997 + checksum: 10/e6e0b0b4747e2ce614f8c10bf65e5131c5f98573ebf50a751297f687c147fd3cfa0431575c33366e2d8c9b1cb3a3533dc8e3b788d08323d2fa55a8a9245ba4ee languageName: node linkType: hard -"@onekeyfe/react-native-split-bundle-loader@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-split-bundle-loader@npm:3.0.36" +"@onekeyfe/react-native-split-bundle-loader@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-split-bundle-loader@npm:3.0.37" peerDependencies: - "@onekeyfe/react-native-bundle-update": ">=3.0.36" + "@onekeyfe/react-native-bundle-update": ">=3.0.37" react: "*" react-native: "*" - checksum: 10/dc11cc98113d20c574a94bcea822dc3eb093f857770c137c6af947e2a81709bf8ffd19cfa09fb840d8517da65a759d0a2d32f6f7579bcccb8eb5927e5edda8a6 + checksum: 10/f17fe59cf4aa56f36c8075a015ad46eb9b7c0f1148bf6c5d4272ff089cc53da7ae2c6b28e03a8ac074eeac5d175a480b894e9d96f30678626109c1f8bae1bb4a languageName: node linkType: hard -"@onekeyfe/react-native-tab-view@npm:3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-tab-view@npm:3.0.36" +"@onekeyfe/react-native-tab-view@npm:3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-tab-view@npm:3.0.37" dependencies: react-freeze: "npm:^1.0.0" sf-symbols-typescript: "npm:^2.0.0" @@ -9508,7 +9508,7 @@ __metadata: peerDependencies: react: "*" react-native: "*" - checksum: 10/d1af9a4bb13f9784e50cf0940382a3b458ea46a25e74eeb222b6a47024178071812f2d72ee8db75fc24f8aa2aad161368a7474454e315885152b0319e55eccdc + checksum: 10/7c766b5441370d5dd9b0fc5d8aa3d82563f93184f3e5e3245c7f0ca7f358dddbb8c22ec4c7d1eb626cf661b567de42b760c439a6087807a3ec3f991bdfa69325 languageName: node linkType: hard @@ -9730,7 +9730,7 @@ __metadata: react-native-confirmation-code-field: "npm:^7.4.0" react-native-copy-asset: "npm:^3.0.2" react-native-draggable-flatlist: "npm:4.0.3" - react-native-get-random-values: "npm:@onekeyfe/react-native-get-random-values@3.0.36" + react-native-get-random-values: "npm:@onekeyfe/react-native-get-random-values@3.0.37" react-native-harness: "npm:1.0.0-alpha.25" react-native-reanimated: "npm:4.2.1" react-native-screens: "npm:4.23.0" @@ -9781,8 +9781,8 @@ __metadata: version: 0.0.0-use.local resolution: "@onekeyhq/components@workspace:packages/components" dependencies: - "@onekeyfe/react-native-scroll-guard": "npm:3.0.36" - "@onekeyfe/react-native-tab-view": "npm:3.0.36" + "@onekeyfe/react-native-scroll-guard": "npm:3.0.37" + "@onekeyfe/react-native-tab-view": "npm:3.0.37" "@react-navigation/bottom-tabs": "npm:7.10.1" "@react-navigation/elements": "npm:2.9.5" "@react-navigation/native": "npm:7.1.28" @@ -9958,31 +9958,31 @@ __metadata: "@formatjs/intl-pluralrules": "npm:^4.3.3" "@notifee/react-native": "npm:9.1.8" "@onekeyfe/react-native-animated-charts": "npm:2.0.1" - "@onekeyfe/react-native-app-update": "npm:3.0.36" - "@onekeyfe/react-native-auto-size-input": "npm:3.0.36" - "@onekeyfe/react-native-background-thread": "npm:3.0.36" + "@onekeyfe/react-native-app-update": "npm:3.0.37" + "@onekeyfe/react-native-auto-size-input": "npm:3.0.37" + "@onekeyfe/react-native-background-thread": "npm:3.0.37" "@onekeyfe/react-native-ble-utils": "npm:0.1.4" - "@onekeyfe/react-native-bundle-update": "npm:3.0.36" - "@onekeyfe/react-native-check-biometric-auth-changed": "npm:3.0.36" - "@onekeyfe/react-native-cloud-kit-module": "npm:3.0.36" - "@onekeyfe/react-native-device-utils": "npm:3.0.36" - "@onekeyfe/react-native-keychain-module": "npm:3.0.36" - "@onekeyfe/react-native-lite-card": "npm:3.0.36" - "@onekeyfe/react-native-native-logger": "npm:3.0.36" - "@onekeyfe/react-native-perf-memory": "npm:3.0.36" - "@onekeyfe/react-native-perf-stats": "npm:3.0.36" - "@onekeyfe/react-native-scroll-guard": "npm:3.0.36" - "@onekeyfe/react-native-skeleton": "npm:3.0.36" + "@onekeyfe/react-native-bundle-update": "npm:3.0.37" + "@onekeyfe/react-native-check-biometric-auth-changed": "npm:3.0.37" + "@onekeyfe/react-native-cloud-kit-module": "npm:3.0.37" + "@onekeyfe/react-native-device-utils": "npm:3.0.37" + "@onekeyfe/react-native-keychain-module": "npm:3.0.37" + "@onekeyfe/react-native-lite-card": "npm:3.0.37" + "@onekeyfe/react-native-native-logger": "npm:3.0.37" + "@onekeyfe/react-native-perf-memory": "npm:3.0.37" + "@onekeyfe/react-native-perf-stats": "npm:3.0.37" + "@onekeyfe/react-native-scroll-guard": "npm:3.0.37" + "@onekeyfe/react-native-skeleton": "npm:3.0.37" "@onekeyfe/react-native-sni-connect": "npm:1.1.0" - "@onekeyfe/react-native-splash-screen": "npm:3.0.36" - "@onekeyfe/react-native-split-bundle-loader": "npm:3.0.36" - "@onekeyfe/react-native-tab-view": "npm:3.0.36" + "@onekeyfe/react-native-splash-screen": "npm:3.0.37" + "@onekeyfe/react-native-split-bundle-loader": "npm:3.0.37" + "@onekeyfe/react-native-tab-view": "npm:3.0.37" "@onekeyfe/react-native-text-input": "npm:0.3.0" "@onekeyhq/components": "npm:*" "@onekeyhq/kit": "npm:*" "@onekeyhq/shared": "npm:*" "@phantom/react-native-juicebox-sdk": "npm:0.3.17" - "@react-native-async-storage/async-storage": "npm:@onekeyfe/react-native-async-storage@3.0.36" + "@react-native-async-storage/async-storage": "npm:@onekeyfe/react-native-async-storage@3.0.37" "@react-native-community/netinfo": "npm:11.4.1" "@react-native-community/slider": "npm:5.0.1" "@react-native-documents/picker": "npm:^12.0.1" @@ -10037,33 +10037,33 @@ __metadata: path-browserify: "npm:^1.0.1" react: "npm:19.1.0" react-native: "npm:0.81.5" - react-native-aes-crypto: "npm:@onekeyfe/react-native-aes-crypto@3.0.36" + react-native-aes-crypto: "npm:@onekeyfe/react-native-aes-crypto@3.0.37" react-native-awesome-slider: "npm:^2.9.0" react-native-ble-plx: "npm:3.5.1" react-native-camera-kit: "npm:17.0.1" react-native-canvas: "npm:^0.1.39" react-native-capture-protection: "npm:2.3.0" - react-native-cloud-fs: "npm:@onekeyfe/react-native-cloud-fs@3.0.36" + react-native-cloud-fs: "npm:@onekeyfe/react-native-cloud-fs@3.0.37" react-native-collapsible-tab-view: "npm:8.0.1" react-native-crypto: "npm:^2.2.0" - react-native-dns-lookup: "npm:@onekeyfe/react-native-dns-lookup@3.0.36" - react-native-fast-pbkdf2: "npm:@onekeyfe/react-native-pbkdf2@3.0.36" + react-native-dns-lookup: "npm:@onekeyfe/react-native-dns-lookup@3.0.37" + react-native-fast-pbkdf2: "npm:@onekeyfe/react-native-pbkdf2@3.0.37" react-native-fs: "npm:@dr.pogodin/react-native-fs@2.34.0" react-native-gesture-handler: "npm:2.30.0" - react-native-get-random-values: "npm:@onekeyfe/react-native-get-random-values@3.0.36" + react-native-get-random-values: "npm:@onekeyfe/react-native-get-random-values@3.0.37" react-native-image-colors: "npm:^2.5.0" react-native-image-crop-picker: "npm:0.51.1" react-native-keyboard-controller: "npm:1.20.7" react-native-level-fs: "npm:3.0.1" react-native-mmkv: "npm:4.1.0" react-native-modal: "npm:^13.0.1" - react-native-network-info: "npm:@onekeyfe/react-native-network-info@3.0.36" + react-native-network-info: "npm:@onekeyfe/react-native-network-info@3.0.37" react-native-network-logger: "npm:2.0.1" react-native-nitro-modules: "npm:0.33.2" - react-native-pager-view: "npm:@onekeyfe/react-native-pager-view@3.0.36" + react-native-pager-view: "npm:@onekeyfe/react-native-pager-view@3.0.37" react-native-passkeys: "npm:0.3.3" react-native-permissions: "npm:5.4.4" - react-native-ping: "npm:@onekeyfe/react-native-ping@3.0.36" + react-native-ping: "npm:@onekeyfe/react-native-ping@3.0.37" react-native-purchases: "npm:8.11.9" react-native-qrcode-styled: "npm:0.4.0" react-native-reanimated: "npm:4.2.1" @@ -10071,13 +10071,13 @@ __metadata: react-native-screens: "npm:4.23.0" react-native-svg: "npm:15.15.1" react-native-svg-transformer: "npm:^1.5.3" - react-native-tcp-socket: "npm:@onekeyfe/react-native-tcp-socket@3.0.36" + react-native-tcp-socket: "npm:@onekeyfe/react-native-tcp-socket@3.0.37" react-native-video: "npm:6.18.0" react-native-view-shot: "npm:4.0.3" react-native-webview: "npm:13.15.0" react-native-webview-cleaner: "npm:@onekeyfe/react-native-webview-cleaner@1.0.0" react-native-worklets: "npm:0.7.1" - react-native-zip-archive: "npm:@onekeyfe/react-native-zip-archive@3.0.36" + react-native-zip-archive: "npm:@onekeyfe/react-native-zip-archive@3.0.37" readable-stream: "npm:^3.6.0" realm: "npm:20.2.0" realm-flipper-plugin-device: "npm:^1.1.0" @@ -13122,15 +13122,15 @@ __metadata: languageName: node linkType: hard -"@react-native-async-storage/async-storage@npm:@onekeyfe/react-native-async-storage@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-async-storage@npm:3.0.36" +"@react-native-async-storage/async-storage@npm:@onekeyfe/react-native-async-storage@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-async-storage@npm:3.0.37" dependencies: merge-options: "npm:^3.0.4" peerDependencies: react: "*" react-native: "*" - checksum: 10/cd307e6b047ab71b6804f4087a5393840a0bf68794f11fb6e496259f1b16a57be51058fdf6a573607ed89c67cd04974b8cb1a19ba80bd07a2b8e5d9574b007ce + checksum: 10/96fa3a14a72e437374fbaf097049185604857420b92f72af374e5b431dd97065f27ccc37c4d730548109d516b485ef3426e90d311803bd39ebb08e6e3f4f3c3a languageName: node linkType: hard @@ -41154,13 +41154,13 @@ __metadata: languageName: node linkType: hard -"react-native-aes-crypto@npm:@onekeyfe/react-native-aes-crypto@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-aes-crypto@npm:3.0.36" +"react-native-aes-crypto@npm:@onekeyfe/react-native-aes-crypto@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-aes-crypto@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/391e2406a226d9793b42bac33038bf5b441d1be9418999bcb76b8c659498d3e75f483ba05d2e871689cbe663ba7f0fe257562dfd439165a0ed1f44bb9d76eb1c + checksum: 10/6565f3f73f180ca10a81a472c9b7aea284113e6087f51b691f366378386e591afb26988d57492ba12e2ce127b59b2f441ed19e1ee808a4b1c3ad89bfdecdc9cb languageName: node linkType: hard @@ -41230,13 +41230,13 @@ __metadata: languageName: node linkType: hard -"react-native-cloud-fs@npm:@onekeyfe/react-native-cloud-fs@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-cloud-fs@npm:3.0.36" +"react-native-cloud-fs@npm:@onekeyfe/react-native-cloud-fs@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-cloud-fs@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/9a54bd22ce31daac197ad489797fe3f56584ccda860c89529dc0717f58a05420bc56b1f729db8c8392c9481ff8a356e09e64f0f2ae7b23d178807bdba31126c4 + checksum: 10/bbf7c1856930f334a7ba5f426ed77c6895079f9d4a549bc2a87883a66c1083e15317d9f6da60a511da06f88418737d8563ca2eade7788105ab925176c5088934 languageName: node linkType: hard @@ -41310,13 +41310,13 @@ __metadata: languageName: node linkType: hard -"react-native-dns-lookup@npm:@onekeyfe/react-native-dns-lookup@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-dns-lookup@npm:3.0.36" +"react-native-dns-lookup@npm:@onekeyfe/react-native-dns-lookup@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-dns-lookup@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/5f5ec2f0d3885f81488bdacb419d128dcd55f498cbb4598f60cbb20c06f891ab38e8a2141823d1307a0e403bc7d81d8a2102bc0bad4227a005a728b949a28cb4 + checksum: 10/cca4a265917e3052957a95e4448883053b5995476e4a23475ab95bca62ee865fedad78d16274f504967452f67061221895d209f366356c282c2bf580a937f126 languageName: node linkType: hard @@ -41333,13 +41333,13 @@ __metadata: languageName: node linkType: hard -"react-native-fast-pbkdf2@npm:@onekeyfe/react-native-pbkdf2@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-pbkdf2@npm:3.0.36" +"react-native-fast-pbkdf2@npm:@onekeyfe/react-native-pbkdf2@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-pbkdf2@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/033461b267dd350af4c63827f4af3f9db68dd99855c2f07aae4cc6da84fe7788436e31164e74c5283f2b0e65210c82cd5a0501ead5829f177e7a50c881068fee + checksum: 10/25a19c4abe0989be188d1f280237f47bc913707df2aad8edaf342f5f5a0897785faef3401d4348f3ea46b19cf0bbbf1cfbec305aa27d5537600c6f85db3f590e languageName: node linkType: hard @@ -41379,14 +41379,14 @@ __metadata: languageName: node linkType: hard -"react-native-get-random-values@npm:@onekeyfe/react-native-get-random-values@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-get-random-values@npm:3.0.36" +"react-native-get-random-values@npm:@onekeyfe/react-native-get-random-values@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-get-random-values@npm:3.0.37" peerDependencies: react: "*" react-native: "*" react-native-nitro-modules: 0.33.2 - checksum: 10/8a262ae5a7da79cc7ebb3361a2e4a5ecd73a6bf787b09fbe7ba8206b8850f6605d757c2d1e4ac50dfa750e5c613109471f611d79ba7ae74ab7326660dc1ba7e5 + checksum: 10/0f651a78534bf036ce73c943015272765145eff05e3c5345da604e804eb7cb89fb0ce6a09bb4c53b217ba0e0e37a42346843e1d3e4349fad2f7ca9851c689498 languageName: node linkType: hard @@ -41525,13 +41525,13 @@ __metadata: languageName: node linkType: hard -"react-native-network-info@npm:@onekeyfe/react-native-network-info@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-network-info@npm:3.0.36" +"react-native-network-info@npm:@onekeyfe/react-native-network-info@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-network-info@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/6d9b9737aab8549c75caa4ca12c7ebe558af506ec6a3507b884858d55ba3674602c30b379126166a2eecdffc7c49074727380673dcdbf326a595fdc7472c8262 + checksum: 10/7a828d7a0797aca68ec806efecf334bf613309e39b4d5544cbba8a9846110b9d451eb3904cabae3c37a4963250e16e0aefcc96f3dfbbb60dd2d6091ec26975a0 languageName: node linkType: hard @@ -41555,13 +41555,13 @@ __metadata: languageName: node linkType: hard -"react-native-pager-view@npm:@onekeyfe/react-native-pager-view@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-pager-view@npm:3.0.36" +"react-native-pager-view@npm:@onekeyfe/react-native-pager-view@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-pager-view@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/d6a5f81b159c0107fdef287d4bfa4b112889db89d5bccbd0f13e086030e83eac3cf285a6d4563d6732cbc9ba864634097ce827799feb91f850f481638f10387c + checksum: 10/2ce5dacbb723f6c65bce155978e8bac9d2991b1a3140e381e324bfb0f7d94a25e69456684a0a5f1a583428bfadc8179dad28ec6b35cd8148a9964e52008d25c0 languageName: node linkType: hard @@ -41590,13 +41590,13 @@ __metadata: languageName: node linkType: hard -"react-native-ping@npm:@onekeyfe/react-native-ping@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-ping@npm:3.0.36" +"react-native-ping@npm:@onekeyfe/react-native-ping@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-ping@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/57829f9e90609935939cb7f949294918d3821c54b0ae7eff89176a97ae706c56c9b7b97a0b5b971053742c169f8eea1696fa5d29258f669725c18ad67a58937b + checksum: 10/8286b44c1d2e97495d9ab0405b9c87162b87df073d4877546e9689759e9bd58bc7dcf21a4aeab0d42c007e1b44885ea3fcdffe0b252f11eb5dccea18e28d40fd languageName: node linkType: hard @@ -41768,13 +41768,13 @@ __metadata: languageName: node linkType: hard -"react-native-tcp-socket@npm:@onekeyfe/react-native-tcp-socket@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-tcp-socket@npm:3.0.36" +"react-native-tcp-socket@npm:@onekeyfe/react-native-tcp-socket@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-tcp-socket@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/1f7732c2b4f738b8cb659d3aaeae78effb623a2894b45e5c5a2ca213b90a27990ac7dc25b6ec0a451b336714bfc07746c628073f0dc9c6a47235b62df0536e51 + checksum: 10/24173192b68f58af467ce8a3ce1578186f5f427030ec5b6bafe3c24a07204b8f8a4ab1a38bb1b1773752b6a032e56cfd98a217fa468427ae22eab299ff2c088c languageName: node linkType: hard @@ -41943,13 +41943,13 @@ __metadata: languageName: node linkType: hard -"react-native-zip-archive@npm:@onekeyfe/react-native-zip-archive@3.0.36": - version: 3.0.36 - resolution: "@onekeyfe/react-native-zip-archive@npm:3.0.36" +"react-native-zip-archive@npm:@onekeyfe/react-native-zip-archive@3.0.37": + version: 3.0.37 + resolution: "@onekeyfe/react-native-zip-archive@npm:3.0.37" peerDependencies: react: "*" react-native: "*" - checksum: 10/8baff2ee96229f1b9e77cad5c85c96866dbea2bdfaa9382a74241aac5f1623904e0bb0e159b695a7476441783d5012a3c00c32a1af3fe42b1abd223c632f1aa7 + checksum: 10/52231dd7acb7f1e9153050030f4a406dc7f0d8980619c032f22383b89418693080d02eefbe00386e81f3ffe26f2bb2c3bca229588359aa58caf9c751dcc39da5 languageName: node linkType: hard