diff --git a/examples/bare-react-native-with-js-sdk-and-flow/.bundle/config b/examples/bare-react-native-with-js-sdk-and-flow/.bundle/config new file mode 100644 index 0000000..848943b --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/examples/bare-react-native-with-js-sdk-and-flow/.env.example b/examples/bare-react-native-with-js-sdk-and-flow/.env.example new file mode 100644 index 0000000..48d6bcc --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/.env.example @@ -0,0 +1,23 @@ +# Required — your Dynamic environment ID. +# Get one at https://app.dynamic.xyz/dashboard/developer/api (use a Sandbox +# key while developing, never a Live/production key in a local .env file). +DYNAMIC_ENVIRONMENT_ID= + +# Required — a Dynamic API key with the `flow.write` scope +# (Dashboard → Developers → API Keys), used to call the Flow create +# endpoint directly from this app (see src/utils/createDepositFlow.ts and +# src/utils/createWithdrawFlow.ts). +# +# SANDBOX-ONLY. Dynamic's own reference implementation only ever calls the +# Flow create endpoint from a server, because it takes a real API secret — +# this demo calls it straight from the client instead, for simplicity, which +# means this key ends up inside the compiled app bundle at runtime (anyone +# with the .ipa/.apk can extract it). That's an acceptable tradeoff for a +# sandbox-only demo key with no real funds behind it, but NEVER put a +# production key here, and don't reuse this key for anything else. +DYNAMIC_API_KEY= + +# Optional — override the Dynamic client's API base URL. Leave empty to let +# the JS SDK use its own built-in default (production). +DYNAMIC_API_BASE_URL= + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/.eslintignore b/examples/bare-react-native-with-js-sdk-and-flow/.eslintignore new file mode 100644 index 0000000..8e446f9 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/.eslintignore @@ -0,0 +1,20 @@ +# ios/ and android/ hold native project files, not this app's JS/TS source +# -- `eslint .` (package.json's "lint" script) should never need to walk +# them. This became load-bearing (not just tidy) once ios/Podfile started +# forcing Hermes to build from source: ios/Pods/hermes-engine now contains +# Hermes's own GitHub checkout, including its full JS test suite (esprima +# test fixtures, flow-parser tests, etc.) -- real .js/.jsx files that `eslint +# .` will otherwise happily try to lint and can crash on (a JSX test +# fixture in hermes-engine/external/esprima/test_fixtures previously threw +# "node.name.name.toLowerCase is not a function" inside +# eslint-plugin-react-native, since those fixtures aren't real React Native +# code). Before the from-source Hermes change, ios/Pods only ever held +# prebuilt binaries and headers, so this never came up. +# +# Anchored to the repo root (leading `/`) rather than bare `ios/`/`android/` +# -- unanchored gitignore-style patterns match at any depth, so without the +# anchor, a future source folder literally named e.g. `src/ios/` would be +# silently skipped by ESLint too, with no warning. Root-only is what's +# actually intended here. +/ios/ +/android/ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/.eslintrc.js b/examples/bare-react-native-with-js-sdk-and-flow/.eslintrc.js new file mode 100644 index 0000000..187894b --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '@react-native', +}; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/.gitignore b/examples/bare-react-native-with-js-sdk-and-flow/.gitignore new file mode 100644 index 0000000..4793cfd --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/.gitignore @@ -0,0 +1,81 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +**/.xcode.env.local + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ +*.keystore +!debug.keystore +.kotlin/ + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +**/fastlane/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output + +# Bundle artifact +*.jsbundle + +# Ruby / CocoaPods +**/Pods/ +/vendor/bundle/ + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* + +# testing +/coverage + +# Environment variables — never commit real secrets, only .env.example +.env +.env.local + +# Yarn +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +pnpm-lock.yaml diff --git a/examples/bare-react-native-with-js-sdk-and-flow/.prettierrc.js b/examples/bare-react-native-with-js-sdk-and-flow/.prettierrc.js new file mode 100644 index 0000000..06860c8 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/.prettierrc.js @@ -0,0 +1,5 @@ +module.exports = { + arrowParens: 'avoid', + singleQuote: true, + trailingComma: 'all', +}; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/.watchmanconfig b/examples/bare-react-native-with-js-sdk-and-flow/.watchmanconfig new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/.watchmanconfig @@ -0,0 +1 @@ +{} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/Gemfile b/examples/bare-react-native-with-js-sdk-and-flow/Gemfile new file mode 100644 index 0000000..cc897bb --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/Gemfile @@ -0,0 +1,22 @@ +source 'https://rubygems.org' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby ">= 2.6.10" + +# Exclude problematic versions of cocoapods and activesupport that causes build failures. +gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' +gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' +gem 'xcodeproj', '< 1.26.0' +gem 'concurrent-ruby', '< 1.3.4' + +# Ruby 3.4.0 has removed some libraries from the standard library. +gem 'bigdecimal' +gem 'logger' +gem 'benchmark' +gem 'mutex_m' + +# Ruby 3.4/4.0 also dropped these two — CFPropertyList (a CocoaPods +# dependency) still calls Kconv, and molinillo (also a CocoaPods dependency) +# still calls tsort, both of which used to ship in the standard library. +gem 'nkf' +gem 'tsort' diff --git a/examples/bare-react-native-with-js-sdk-and-flow/Gemfile.lock b/examples/bare-react-native-with-js-sdk-and-flow/Gemfile.lock new file mode 100644 index 0000000..40db245 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/Gemfile.lock @@ -0,0 +1,173 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.8) + activesupport (7.2.3.2) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1, < 6) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (4.1.2) + claide (1.1.0) + cocoapods (1.15.2) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.15.2) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) + activesupport (>= 5.0, < 8) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (2.1) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.3.3) + connection_pool (3.0.2) + drb (2.2.3) + escape (0.0.4) + ethon (0.18.0) + ffi (>= 1.15.0) + logger + ffi (1.17.4) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.9.0) + mutex_m + i18n (1.15.2) + concurrent-ruby (~> 1.0) + json (2.21.2) + logger (1.7.0) + minitest (5.27.0) + molinillo (0.8.0) + mutex_m (0.3.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + nkf (0.3.0) + public_suffix (4.0.7) + rexml (3.4.4) + ruby-macho (2.5.1) + securerandom (0.4.1) + tsort (0.2.0) + typhoeus (1.6.0) + ethon (>= 0.18.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcodeproj (1.25.1) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (>= 3.3.6, < 4.0) + +PLATFORMS + ruby + +DEPENDENCIES + activesupport (>= 6.1.7.5, != 7.1.0) + benchmark + bigdecimal + cocoapods (>= 1.13, != 1.15.1, != 1.15.0) + concurrent-ruby (< 1.3.4) + logger + mutex_m + nkf + tsort + xcodeproj (< 1.26.0) + +CHECKSUMS + CFPropertyList (3.0.8) sha256=2c99d0d980536d3d7ab252f7bd59ac8be50fbdd1ff487c98c949bb66bb114261 + activesupport (7.2.3.2) sha256=ddc90d11dd88086d78ace03407fe3c2a3f5c8853c3c3046313db5ed823ef3312 + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af + algoliasearch (1.27.5) sha256=26c1cddf3c2ec4bd60c148389e42702c98fdac862881dc6b07a4c0b89ffec853 + atomos (0.1.3) sha256=7d43b22f2454a36bace5532d30785b06de3711399cb1c6bf932573eda536789f + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c + bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd + claide (1.1.0) sha256=6d3c5c089dde904d96aa30e73306d0d4bd444b1accb9b3125ce14a3c0183f82e + cocoapods (1.15.2) sha256=f0f5153de8d028d133b96f423e04f37fb97a1da0d11dda581a9f46c0cba4090a + cocoapods-core (1.15.2) sha256=322650d97fe1ad4c0831a09669764b888bd91c6d79d0f6bb07281a17667a2136 + cocoapods-deintegrate (1.0.5) sha256=517c2a448ef563afe99b6e7668704c27f5de9e02715a88ee9de6974dc1b3f6a2 + cocoapods-downloader (2.1) sha256=bb6ebe1b3966dc4055de54f7a28b773485ac724fdf575d9bee2212d235e7b6d1 + cocoapods-plugins (1.0.0) sha256=725d17ce90b52f862e73476623fd91441b4430b742d8a071000831efb440ca9a + cocoapods-search (1.0.1) sha256=1b133b0e6719ed439bd840e84a1828cca46425ab73a11eff5e096c3b2df05589 + cocoapods-trunk (1.6.0) sha256=5f5bda8c172afead48fa2d43a718cf534b1313c367ba1194cebdeb9bfee9ed31 + cocoapods-try (1.2.0) sha256=145b946c6e7747ed0301d975165157951153d27469e6b2763c83e25c84b9defe + colored2 (3.1.2) sha256=b13c2bd7eeae2cf7356a62501d398e72fde78780bd26aec6a979578293c28b4a + concurrent-ruby (1.3.3) sha256=4f9cd28965c4dcf83ffd3ea7304f9323277be8525819cb18a3b61edcb56a7c6a + connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a + drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 + escape (0.0.4) sha256=e49f44ae2b4f47c6a3abd544ae77fe4157802794e32f19b8e773cbc4dcec4169 + ethon (0.18.0) sha256=b598afc9f30448cb068b850714b7d6948e941476095d04f90a4ac65b8d6efcb2 + ffi (1.17.4) sha256=bcd1642e06f0d16fc9e09ac6d49c3a7298b9789bcb58127302f934e437d60acf + fourflusher (2.3.1) sha256=1b3de61c7c791b6a4e64f31e3719eb25203d151746bb519a0292bff1065ccaa9 + fuzzy_match (2.0.4) sha256=b5de4f95816589c5b5c3ad13770c0af539b75131c158135b3f3bbba75d0cfca5 + gh_inspector (1.1.3) sha256=04cca7171b87164e053aa43147971d3b7f500fcb58177698886b48a9fc4a1939 + httpclient (2.9.0) sha256=4b645958e494b2f86c2f8a2f304c959baa273a310e77a2931ddb986d83e498c8 + i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 + json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5 + molinillo (0.8.0) sha256=efbff2716324e2a30bccd3eba1ff3a735f4d5d53ffddbc6a2f32c0ca9433045d + mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 + nanaimo (0.3.0) sha256=aaaedc60497070b864a7e220f7c4b4cad3a0daddda2c30055ba8dae306342376 + nap (1.1.0) sha256=949691660f9d041d75be611bb2a8d2fd559c467537deac241f4097d9b5eea576 + netrc (0.11.0) sha256=de1ce33da8c99ab1d97871726cba75151113f117146becbe45aa85cb3dabee3f + nkf (0.3.0) sha256=357a8dbeba38b727b75930f665146546076a394a1c243faf634ff176e3588895 + public_suffix (4.0.7) sha256=8be161e2421f8d45b0098c042c06486789731ea93dc3a896d30554ee38b573b8 + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + ruby-macho (2.5.1) sha256=9075e52e0f9270b552a90b24fcc6219ad149b0d15eae1bc364ecd0ac8984f5c9 + securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 + tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f + typhoeus (1.6.0) sha256=bacc41c23e379547e29801dc235cd1699b70b955a1ba3d32b2b877aa844c331d + tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b + xcodeproj (1.25.1) sha256=9a2310dccf6d717076e86f602b17c640046b6f1dfe64480044596f6f2f13dc84 + +RUBY VERSION + ruby 4.0.6 + +BUNDLED WITH + 4.0.16 diff --git a/examples/bare-react-native-with-js-sdk-and-flow/README.md b/examples/bare-react-native-with-js-sdk-and-flow/README.md new file mode 100644 index 0000000..9db3fbd --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/README.md @@ -0,0 +1,199 @@ +# bare-react-native-with-js-sdk-and-flow + +A **bare React Native** (no Expo) example that connects **MetaMask** and +moves USDC on Base between it and a destination address you type in, using a +real +[Fireblocks Flow](https://www.dynamic.xyz/docs/overview/fireblocks-flow-api): +create → attach source → quote → submit → sign in the MetaMask app → display +settlement status. + +No login, no account, no embedded wallet — this is a minimal demo of +connecting MetaMask via Dynamic's JS SDK and driving a real Flow with it. +Deposit and Withdraw each connect MetaMask ad hoc, inline on the same screen +as the destination-address/amount inputs, fresh every time (never persisted +or signature-verified). Both directions settle **real USDC on Base +mainnet** — no testnet fallback — capped at $5 per transfer +(`src/consts/flow.ts`'s `MAX_AMOUNT_USD`) as a guardrail against a typo +turning into an expensive mistake. + +## Project structure + +| Folder | Responsible for | +| -------------------- | -------------------------------------------------------------------------------------------------------------------| +| `src/components/` | Small, dumb presentational pieces (buttons, headers, icons) with no SDK/business logic. | +| `src/views/` | Dumb, prop-driven screens composed from components — no SDK or navigation calls, just render what they're given. | +| `src/routes/` | The smart layer: one file per screen, owns SDK/react-query hooks and navigation, feeds a view's props. | +| `src/utils/` | Standalone helper functions (Flow API calls, wallet connect, small pure helpers) — one top-level function per file. | +| `src/consts/` | Fixed config and constants (chain/token addresses, theme tokens, demo amount caps). | +| `src/navigation.tsx` | The React Navigation stack + the one-time cold-boot check that waits for the Dynamic client to finish initializing. | +| `src/App.tsx` | Top-level providers only (safe area, react-query, Dynamic) wrapping ``. | + +## Flow & wallet connections + +The files below do the actual work of talking to the Flow API and +connecting MetaMask — start here to see how it's wired: + +- [`src/utils/createDepositFlow.ts`](./src/utils/createDepositFlow.ts) — hand-rolled REST call creating a deposit flow: the connected wallet pays ETH, the typed destination address settles in USDC (Flow's create step is server-only, no client SDK function exists for it). +- [`src/utils/createWithdrawFlow.ts`](./src/utils/createWithdrawFlow.ts) — same, but for a withdrawal: the connected wallet pays USDC, the destination address settles in native ETH. +- [`src/routes/DepositRoute.tsx`](./src/routes/DepositRoute.tsx) — connect MetaMask, then create → attach → quote → submit, MetaMask → destination address, MetaMask signs. +- [`src/routes/WithdrawRoute.tsx`](./src/routes/WithdrawRoute.tsx) — same sequence in reverse: destination address → MetaMask's USDC, MetaMask signs. +- [`src/routes/FlowStatusRoute.tsx`](./src/routes/FlowStatusRoute.tsx) — polls a flow to a terminal state and derives its step-by-step status. +- [`src/utils/connectMetaMask.ts`](./src/utils/connectMetaMask.ts) — ephemeral MetaMask connect via Dynamic's own MetaMask SDK wrapper. + +## Prerequisites + +- Node 20+ +- Xcode + CocoaPods (iOS) and/or Android Studio (Android) +- pnpm (`npm i -g pnpm`) — this repo prefers pnpm, though the RN CLI itself + defaults to npm +- A [Dynamic](https://app.dynamic.xyz) account with a **Sandbox** environment + ID (Settings → Developers → API Keys) — never use a Live/production key + for local development + +## Setup + +```bash +cd examples/bare-react-native-with-js-sdk-and-flow + +# 1. Install dependencies +pnpm install + +# 2. Copy and fill in env vars +cp .env.example .env +# Edit .env + +# 3. iOS: install native pods +cd ios && bundle install && bundle exec pod install && cd .. +``` + +## Running a Release build on a physical device + +`pnpm ios` (step 4 above) launches a **Debug** build on the Simulator — +fine for most of the app, but MetaMask can't be installed on the Simulator +(see Troubleshooting), so exercising the connect button for real means a +**Release** build on an actual iPhone/iPad, which means dealing with code +signing. + +`ios/BareFlowMetaMaskDemo.xcodeproj/project.pbxproj` deliberately ships +with **no `DEVELOPMENT_TEAM` set**. It's a tracked, committed file shared +by everyone who clones this example — baking in one person's or company's +Apple Developer Team ID as a "default" would leak that identifier into a +public repo's git history for no real benefit (every other clone would +just have to overwrite it with their own anyway), and it's easy to commit +by accident the moment anyone picks a team from Xcode's Signing & +Capabilities UI, since that UI writes straight into this same tracked +file. Set your team at build time instead, via the React Native CLI's +`--extra-params`, which passes through to `xcodebuild` without writing +anything to disk: + +```bash +# Find your team ID (the 10-char code in the OU field of any of your valid +# signing certs): +security find-certificate -a -c "Apple Development" -p \ + | openssl x509 -noout -subject + +# Find your device's UDID in the *classic* format react-native-cli expects — +# NOT the CoreDevice identifier `xcrun devicectl list devices` prints; those +# are two different ID formats for the same physical device: +xcrun xctrace list devices + +# Build, sign, and install a Release build straight onto the device: +npx react-native run-ios \ + --mode Release \ + --udid \ + --extra-params "DEVELOPMENT_TEAM= CODE_SIGN_STYLE=Automatic" +``` + +> First launch with a fresh signing team/profile may prompt "Untrusted +> Developer" on the device — trust it under **Settings → General → VPN & +> Device Management** before the app will open. + +> If Xcode shows a red "Failed to load container for document" error when +> you open the workspace, that's unrelated to signing — running +> `pod install` from a sandboxed/scripted shell can leave +> `project.pbxproj`/`Pods/Pods.xcodeproj/project.pbxproj` with `600` +> permissions instead of the normal `644`, which Xcode's own helper +> processes can't read. `chmod 644` both files and reopen the workspace. + +If you do open the workspace in Xcode and pick a team from its Signing & +Capabilities UI instead of using `--extra-params`, check `git status`/`git +diff` in `ios/` before committing anything else — that UI writes +`DEVELOPMENT_TEAM` directly into the tracked `project.pbxproj`, and +`git checkout -- ios/BareFlowMetaMaskDemo.xcodeproj/project.pbxproj` reverts +it if you don't want it in history. + +### Android + +Same reasoning applies on Android: `pnpm android` runs a **Debug** build, +but MetaMask's connect flow needs a **Release** build on a physical device. +Unlike iOS, this needs no code-signing setup — a debug keystore is enough to +install locally — so it's just: + +```bash +# Find your device's ID (the value under "List of devices attached"): +adb devices + +# Build and install a Release build straight onto the device: +npx react-native run-android --device --mode release +``` + +> Make sure USB debugging is enabled on the device (**Settings → Developer +> options → USB debugging**) and that you've accepted the "Allow USB +> debugging" prompt on the device itself, or `adb devices` will list it as +> `unauthorized` instead of showing an ID you can use. + +## Environment variables + +| Variable | Required | Description | +| ------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `DYNAMIC_ENVIRONMENT_ID` | Yes | Your Dynamic environment ID. Use a Sandbox key. | +| `DYNAMIC_API_BASE_URL` | No | Overrides the SDK's API base URL. Leave empty to use the SDK's built-in production default. | +| `DYNAMIC_API_KEY` | Yes | Sandbox-only Dynamic API key (`flow.write` scope), used directly from the client for simplicity. **Never a production key.** | + +Bare React Native has no Expo-style `EXPO_PUBLIC_*` build-time substitution, +so env vars are inlined into the bundle via +[`babel-plugin-transform-inline-environment-variables`](https://www.npmjs.com/package/babel-plugin-transform-inline-environment-variables) +(loaded from `.env` via `dotenv` in `babel.config.js`) — see `src/consts/config.ts` +for where they're read. Missing required variables throw at startup instead +of failing silently. + +> **Heads up:** because `DYNAMIC_API_KEY` is called directly from the app, +> it's visible in plaintext in any request-inspector tooling (React Native's +> dev menu network inspector, Flipper, etc.) while the app is running in +> debug mode. Don't screen-record or screenshot that tooling while your key +> is loaded, and treat a sandbox key as "rotate if you suspect it leaked." + +## Why MetaMask connection needs no Expo + +Dynamic's [bare React Native setup guide](https://www.dynamic.xyz/docs/javascript/react-native/bare-react-native) +covers exactly this: a handful of manual polyfills (`react-native-get-random-values`, +a `Buffer` global, a `crypto.randomUUID` shim, and a minimal `window.location` +shim for the embedded-wallet WebView — see `polyfills.ts`) and two Babel +plugins (`@babel/plugin-transform-export-namespace-from`, +`@babel/plugin-transform-class-static-block` — the SDK ships modern syntax +the stock RN Babel preset doesn't transform on its own). None of it is +Expo-specific; this example intentionally scaffolds with the RN CLI directly +to keep that dependency surface visible instead of hidden behind Expo +tooling. + +## Troubleshooting + +- **`pod install` fails with `cannot load such file -- kconv` (from CFPropertyList) or a `tsort` load error (from molinillo), or a spurious `pathname contains null byte` CocoaPods crash.** Ruby 3.4+ dropped `kconv` and `tsort` from the standard library; CocoaPods' own dependencies (`CFPropertyList`, `molinillo`) still call into them. Already worked around in the `Gemfile` (`gem 'nkf'`, `gem 'tsort'`); if you still hit this, run `bundle install` again and confirm your Ruby version isn't newer than what's been tested here. +- **iOS build fails inside `hermes-engine` with `make: \*** No rule to make target 'libhermes'`, or crashes on a physical Release build with `EXC_BAD_ACCESS`/`SIGSEGV`inside Hermes's debugger/inspector setup.** This project's`ios/Podfile` forces Hermes to build from source for everyone (`ENV['RCT_BUILD_HERMES_FROM_SOURCE'] ||= 'true'`) to avoid a C++ ABI mismatch between React Native's prebuilt Hermes binary and a newer Xcode. If you still hit a Hermes build failure, check GitHub connectivity — building from source clones Hermes from `https://github.com/facebook/hermes.git`. +- **A truly from-scratch `pnpm install` + `pod install` causes a native module to fail compiling with `no type or protocol named 'NativeSpec'`.** An upstream `@react-native/codegen` bug: its file-discovery uses `fs.lstatSync`, which doesn't follow symlinks, and every pnpm-managed `node_modules/` entry is a symlink — Codegen silently skips scanning pnpm-linked packages. Patched via `pnpm patch` (`patches/@react-native__codegen@0.81.4.patch`); applies automatically on `pnpm install`. If you bump `react-native`/`@react-native/codegen`, see the patch file's own header for how to regenerate it. +- **iOS build fails with `call to consteval function ... is not a constant expression` in `fmt`.** Already worked around in `ios/Podfile`'s `post_install` for Xcode 26+; if you still see it, delete `ios/Pods` and re-run `pod install`. +- **`pod install` fails with an `Invalid \`Podfile\``error wrapping a Codegen error about`setToolbarMenuElementOptions`.** `react-native-screens` is intentionally pinned below 4.25.0 (currently `4.24.0`) in `package.json` — 4.25.0+ ships an experimental Android-only native component whose codegen this pinned React Native version (0.81.4) can't parse. This app doesn't use that experimental API, so pinning loses nothing. +- **Metro fails to resolve `stream` from inside `ws`, or a Babel error like `Export namespace should be first transformed by...`.** Delete Metro's cache (`npx react-native start --reset-cache`) and confirm `metro.config.js`'s `resolver.resolveRequest` override and both `@babel/plugin-transform-*` plugins in `babel.config.js` are present. +- **Tapping "Connect with MetaMask" shows a red screen: `Requiring unknown module ""`.** A currently-unresolved Metro dev-server issue deep in `@metamask/mobile-wallet-protocol-dapp-client`'s dependency chain — reproduces even after a full cache reset. Doesn't affect the app otherwise; a production/release bundle may not be affected (untested here). Needs a physical device with MetaMask installed either way (MetaMask can't be installed on the iOS Simulator). +- **A withdrawal fails with an error mentioning balance, gas, or an insufficient-funds message.** The connected wallet needs enough native ETH on **Base mainnet** to cover both the withdrawal amount and gas — `submitFlowTransaction` checks this before submitting and surfaces a clear error rather than partially submitting. +- **Known limitation: no flow persistence.** `FlowStatusRoute.tsx`'s active `flowId` lives in plain React Navigation route params — there is no AsyncStorage record and no on-launch resume. If the app is killed while a deposit/withdraw is mid-flight, relaunching it loses track of that flow entirely — the underlying Flow keeps executing server-side regardless. +- **Known limitation: an app process killed mid wallet-approval loses the in-progress Deposit/Withdraw step.** The connected MetaMask wallet for that operation is held in-memory only, never persisted by design. Relaunching returns to Home; the operation must be restarted from scratch. +- **Known limitation: reconnecting MetaMask within the same app session reuses the previous connection instead of prompting again.** MetaMask's underlying connect SDK caches its session for the app's lifetime and only resets it when it catches a pairing mid-handshake — a second "Connect with MetaMask" tap in the same app run (e.g. Deposit, back to Home, then Withdraw) doesn't open a fresh deep link; `connectMetaMask.ts` deliberately falls back to the previously-connected account in that case instead of surfacing this as an error. Force-quitting the app resets it. + +## Learn more + +- [Dynamic JS SDK overview](https://www.dynamic.xyz/docs/javascript/overview) +- [React Native quickstart](https://www.dynamic.xyz/docs/javascript/reference/react-native-quickstart) +- [Bare React Native setup](https://www.dynamic.xyz/docs/javascript/react-native/bare-react-native) +- [Fireblocks Flow API](https://www.dynamic.xyz/docs/overview/fireblocks-flow-api) +- [Flow getting started (JS)](https://www.dynamic.xyz/docs/javascript/reference/flow-getting-started) diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/build.gradle b/examples/bare-react-native-with-js-sdk-and-flow/android/app/build.gradle new file mode 100644 index 0000000..b296e98 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/app/build.gradle @@ -0,0 +1,119 @@ +apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.facebook.react" + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '../..' + // root = file("../../") + // The folder where the react-native NPM package is. Default is ../../node_modules/react-native + // reactNativeDir = file("../../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen + // codegenDir = file("../../node_modules/@react-native/codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js + // cliFile = file("../../node_modules/react-native/cli.js") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] + + /* Autolinking */ + autolinkLibrariesWithApp() +} + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = false + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = io.github.react-native-community:jsc-android-intl:2026004.+` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+' + +android { + ndkVersion rootProject.ext.ndkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion + + namespace "com.dynamiclabs.examples.bareflowmetamaskdemo" + defaultConfig { + applicationId "com.dynamiclabs.examples.bareflowmetamaskdemo" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/debug.keystore b/examples/bare-react-native-with-js-sdk-and-flow/android/app/debug.keystore new file mode 100644 index 0000000..364e105 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/debug.keystore differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/proguard-rules.pro b/examples/bare-react-native-with-js-sdk-and-flow/android/app/proguard-rules.pro new file mode 100644 index 0000000..11b0257 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/app/proguard-rules.pro @@ -0,0 +1,10 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/AndroidManifest.xml b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a91d5e6 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/java/com/dynamiclabs/examples/bareflowmetamaskdemo/MainActivity.kt b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/java/com/dynamiclabs/examples/bareflowmetamaskdemo/MainActivity.kt new file mode 100644 index 0000000..d687d68 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/java/com/dynamiclabs/examples/bareflowmetamaskdemo/MainActivity.kt @@ -0,0 +1,33 @@ +package com.dynamiclabs.examples.bareflowmetamaskdemo + +import android.content.Intent +import com.facebook.react.ReactActivity +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled +import com.facebook.react.defaults.DefaultReactActivityDelegate + +class MainActivity : ReactActivity() { + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "BareFlowMetaMaskDemo" + + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate = + DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) + + // Forwards incoming bareflowmetamaskdemo:// intents (see AndroidManifest.xml's + // intent-filter and dynamicClient.ts's metadata.nativeLink) to this already-running + // Activity — required because the manifest sets launchMode="singleTask", so a warm + // app receives the redirect here rather than via a fresh launch Intent. Without this, + // RN's Linking.getInitialURL()/'url' listeners never see it. + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + } +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/java/com/dynamiclabs/examples/bareflowmetamaskdemo/MainApplication.kt b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/java/com/dynamiclabs/examples/bareflowmetamaskdemo/MainApplication.kt new file mode 100644 index 0000000..2a65b1f --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/java/com/dynamiclabs/examples/bareflowmetamaskdemo/MainApplication.kt @@ -0,0 +1,38 @@ +package com.dynamiclabs.examples.bareflowmetamaskdemo + +import android.app.Application +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactHost +import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost +import com.facebook.react.defaults.DefaultReactNativeHost + +class MainApplication : Application(), ReactApplication { + + override val reactNativeHost: ReactNativeHost = + object : DefaultReactNativeHost(this) { + override fun getPackages(): List = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + // add(MyReactNativePackage()) + } + + override fun getJSMainModuleName(): String = "index" + + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } + + override val reactHost: ReactHost + get() = getDefaultReactHost(applicationContext, reactNativeHost) + + override fun onCreate() { + super.onCreate() + loadReactNative(this) + } +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/drawable/rn_edit_text_material.xml b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 0000000..5c25e72 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a2f5908 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..1b52399 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..ff10afd Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..115a4c7 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..dcd3cd8 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..459ca60 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..8ca12fe Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8e19b41 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b824ebd Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..4c19a13 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/values/strings.xml b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..aff847e --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + BareFlowMetaMaskDemo + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/values/styles.xml b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..7ba83a2 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/build.gradle b/examples/bare-react-native-with-js-sdk-and-flow/android/build.gradle new file mode 100644 index 0000000..dad99b0 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/build.gradle @@ -0,0 +1,21 @@ +buildscript { + ext { + buildToolsVersion = "36.0.0" + minSdkVersion = 24 + compileSdkVersion = 36 + targetSdkVersion = 36 + ndkVersion = "27.1.12297006" + kotlinVersion = "2.1.20" + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") + } +} + +apply plugin: "com.facebook.react.rootproject" diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/gradle.properties b/examples/bare-react-native-with-js-sdk-and-flow/android/gradle.properties new file mode 100644 index 0000000..9afe615 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/gradle.properties @@ -0,0 +1,44 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=true + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true + +# Use this property to enable edge-to-edge display support. +# This allows your app to draw behind system bars for an immersive UI. +# Note: Only works with ReactActivity and should not be used with custom Activity. +edgeToEdgeEnabled=false diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/gradle/wrapper/gradle-wrapper.jar b/examples/bare-react-native-with-js-sdk-and-flow/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..1b33c55 Binary files /dev/null and b/examples/bare-react-native-with-js-sdk-and-flow/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/gradle/wrapper/gradle-wrapper.properties b/examples/bare-react-native-with-js-sdk-and-flow/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..d4081da --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/gradlew b/examples/bare-react-native-with-js-sdk-and-flow/android/gradlew new file mode 100755 index 0000000..23d15a9 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/gradlew.bat b/examples/bare-react-native-with-js-sdk-and-flow/android/gradlew.bat new file mode 100644 index 0000000..11bf182 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/gradlew.bat @@ -0,0 +1,99 @@ +@REM Copyright (c) Meta Platforms, Inc. and affiliates. +@REM +@REM This source code is licensed under the MIT license found in the +@REM LICENSE file in the root directory of this source tree. + +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/bare-react-native-with-js-sdk-and-flow/android/settings.gradle b/examples/bare-react-native-with-js-sdk-and-flow/android/settings.gradle new file mode 100644 index 0000000..f8850bf --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/android/settings.gradle @@ -0,0 +1,14 @@ +pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } +plugins { id("com.facebook.react.settings") } +extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } +rootProject.name = 'com.dynamiclabs.examples.bareflowmetamaskdemo' + +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } +} + +include ':app' +includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/examples/bare-react-native-with-js-sdk-and-flow/app.json b/examples/bare-react-native-with-js-sdk-and-flow/app.json new file mode 100644 index 0000000..b4a65f7 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/app.json @@ -0,0 +1,4 @@ +{ + "name": "BareFlowMetaMaskDemo", + "displayName": "BareFlowMetaMaskDemo" +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/babel.config.js b/examples/bare-react-native-with-js-sdk-and-flow/babel.config.js new file mode 100644 index 0000000..a8c9065 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/babel.config.js @@ -0,0 +1,20 @@ +// Loads .env into process.env before babel runs, so the plugin below can +// inline the values into the bundle. Copy .env.example to .env and fill it +// in — see README.md. +require('dotenv').config(); + +module.exports = { + presets: ['module:@react-native/babel-preset'], + plugins: [ + // The Dynamic SDK ships modern JS syntax (`export * as ns from …`, + // static class blocks) that the stock RN Babel preset doesn't + // transform on its own — see + // https://www.dynamic.xyz/docs/javascript/react-native/bare-react-native + '@babel/plugin-transform-export-namespace-from', + '@babel/plugin-transform-class-static-block', + // Inlines process.env.* references at bundle time. This is a bare RN + // app, so there's no Expo-style EXPO_PUBLIC_* / Metro env substitution + // — this plugin is the equivalent mechanism. + 'transform-inline-environment-variables', + ], +}; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/dynamicClient.ts b/examples/bare-react-native-with-js-sdk-and-flow/dynamicClient.ts new file mode 100644 index 0000000..f364b96 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/dynamicClient.ts @@ -0,0 +1,49 @@ +/** + * Creates and configures the single Dynamic client instance for this app. + * + * Imported once, at app startup (see App.tsx) — creating more than one + * DynamicClient in the same app is unsupported by most SDK helpers, which + * default to whichever client was created first (see `addEvmExtension`'s + * docs: "Only required when using multiple Dynamic clients"). + */ +import { createDynamicClient } from '@dynamic-labs-sdk/client'; +import { addEvmExtension } from '@dynamic-labs-sdk/evm'; +import { APP_ORIGIN, config } from './src/consts/config'; + +if (!config.dynamic.environmentId) { + throw new Error( + 'DYNAMIC_ENVIRONMENT_ID is not set. Copy .env.example to .env, fill in ' + + 'your Dynamic Sandbox environment ID, and rebuild the app.', + ); +} + +if (!config.dynamic.apiKey) { + throw new Error( + 'DYNAMIC_API_KEY is not set. Copy .env.example to .env, fill in a ' + + 'sandbox API key with the flow.write scope, and rebuild the app.', + ); +} + +export const dynamicClient = createDynamicClient({ + environmentId: config.dynamic.environmentId, + ...(config.dynamic.apiBaseUrl + ? { coreConfig: { apiBaseUrl: config.dynamic.apiBaseUrl } } + : {}), + logLevel: 'debug', + metadata: { + // Asserted non-empty by MetaMask's underlying connect SDK. + name: 'Bare Flow MetaMask Demo', + // Reduced to its scheme (bareflowmetamaskdemo://) and embedded in the + // MetaMask pairing URI, so the wallet app can offer a "return to app" + // affordance once the user approves — registered as a URL scheme in + // ios/.../Info.plist (CFBundleURLTypes, forwarded to Linking via + // AppDelegate.swift) and android/.../AndroidManifest.xml (intent-filter, + // forwarded via MainActivity.kt's onNewIntent). Approval itself still + // resolves over the SDK's own relay/session either way; this only + // affects how smoothly the user gets back to this app. + nativeLink: 'bareflowmetamaskdemo://', + universalLink: APP_ORIGIN, + }, +}); + +addEvmExtension(dynamicClient); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/index.js b/examples/bare-react-native-with-js-sdk-and-flow/index.js new file mode 100644 index 0000000..8d13444 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/index.js @@ -0,0 +1,13 @@ +/** + * @format + */ + +// Must run before anything else touches crypto/URL/Buffer globals — see +// polyfills.ts for why. +import './polyfills'; + +import { AppRegistry } from 'react-native'; +import App from './src/App'; +import { name as appName } from './app.json'; + +AppRegistry.registerComponent(appName, () => App); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/.xcode.env b/examples/bare-react-native-with-js-sdk-and-flow/ios/.xcode.env new file mode 100644 index 0000000..3d5782c --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcodeproj/project.pbxproj b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f0516d9 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcodeproj/project.pbxproj @@ -0,0 +1,478 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 0C80B921A6F3F58F76C31292 /* libPods-BareFlowMetaMaskDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-BareFlowMetaMaskDemo.a */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 5F560E0A65990150FC49F55A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; }; + 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 13B07F961A680F5B00A75B9A /* BareFlowMetaMaskDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BareFlowMetaMaskDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = BareFlowMetaMaskDemo/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = BareFlowMetaMaskDemo/Info.plist; sourceTree = ""; }; + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = BareFlowMetaMaskDemo/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 3B4392A12AC88292D35C810B /* Pods-BareFlowMetaMaskDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BareFlowMetaMaskDemo.debug.xcconfig"; path = "Target Support Files/Pods-BareFlowMetaMaskDemo/Pods-BareFlowMetaMaskDemo.debug.xcconfig"; sourceTree = ""; }; + 5709B34CF0A7D63546082F79 /* Pods-BareFlowMetaMaskDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BareFlowMetaMaskDemo.release.xcconfig"; path = "Target Support Files/Pods-BareFlowMetaMaskDemo/Pods-BareFlowMetaMaskDemo.release.xcconfig"; sourceTree = ""; }; + 5DCACB8F33CDC322A6C60F78 /* libPods-BareFlowMetaMaskDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BareFlowMetaMaskDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = BareFlowMetaMaskDemo/AppDelegate.swift; sourceTree = ""; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = BareFlowMetaMaskDemo/LaunchScreen.storyboard; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0C80B921A6F3F58F76C31292 /* libPods-BareFlowMetaMaskDemo.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13B07FAE1A68108700A75B9A /* BareFlowMetaMaskDemo */ = { + isa = PBXGroup; + children = ( + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 761780EC2CA45674006654EE /* AppDelegate.swift */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */, + ); + name = BareFlowMetaMaskDemo; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 5DCACB8F33CDC322A6C60F78 /* libPods-BareFlowMetaMaskDemo.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* BareFlowMetaMaskDemo */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + BBD78D7AC51CEA395F1C20DB /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* BareFlowMetaMaskDemo.app */, + ); + name = Products; + sourceTree = ""; + }; + BBD78D7AC51CEA395F1C20DB /* Pods */ = { + isa = PBXGroup; + children = ( + 3B4392A12AC88292D35C810B /* Pods-BareFlowMetaMaskDemo.debug.xcconfig */, + 5709B34CF0A7D63546082F79 /* Pods-BareFlowMetaMaskDemo.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* BareFlowMetaMaskDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "BareFlowMetaMaskDemo" */; + buildPhases = ( + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BareFlowMetaMaskDemo; + productName = BareFlowMetaMaskDemo; + productReference = 13B07F961A680F5B00A75B9A /* BareFlowMetaMaskDemo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + TargetAttributes = { + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1120; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "BareFlowMetaMaskDemo" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* BareFlowMetaMaskDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 5F560E0A65990150FC49F55A /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + }; + 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-BareFlowMetaMaskDemo/Pods-BareFlowMetaMaskDemo-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-BareFlowMetaMaskDemo/Pods-BareFlowMetaMaskDemo-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BareFlowMetaMaskDemo/Pods-BareFlowMetaMaskDemo-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-BareFlowMetaMaskDemo-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-BareFlowMetaMaskDemo/Pods-BareFlowMetaMaskDemo-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-BareFlowMetaMaskDemo/Pods-BareFlowMetaMaskDemo-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BareFlowMetaMaskDemo/Pods-BareFlowMetaMaskDemo-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-BareFlowMetaMaskDemo.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = BareFlowMetaMaskDemo/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.dynamiclabs.examples.bareflowmetamaskdemo; + PRODUCT_NAME = BareFlowMetaMaskDemo; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-BareFlowMetaMaskDemo.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = BareFlowMetaMaskDemo/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.dynamiclabs.examples.bareflowmetamaskdemo; + PRODUCT_NAME = BareFlowMetaMaskDemo; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + USE_HERMES = true; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + "-DFOLLY_CFG_NO_COROUTINES=1", + "-DFOLLY_HAVE_CLOCK_GETTIME=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + USE_HERMES = true; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "BareFlowMetaMaskDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "BareFlowMetaMaskDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcodeproj/xcshareddata/xcschemes/BareFlowMetaMaskDemo.xcscheme b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcodeproj/xcshareddata/xcschemes/BareFlowMetaMaskDemo.xcscheme new file mode 100644 index 0000000..ae8dba3 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcodeproj/xcshareddata/xcschemes/BareFlowMetaMaskDemo.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcworkspace/contents.xcworkspacedata b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..7b0e87c --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/AppDelegate.swift b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/AppDelegate.swift new file mode 100644 index 0000000..181976f --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/AppDelegate.swift @@ -0,0 +1,61 @@ +import UIKit +import React +import React_RCTAppDelegate +import ReactAppDependencyProvider + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? + + var reactNativeDelegate: ReactNativeDelegate? + var reactNativeFactory: RCTReactNativeFactory? + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil + ) -> Bool { + let delegate = ReactNativeDelegate() + let factory = RCTReactNativeFactory(delegate: delegate) + delegate.dependencyProvider = RCTAppDependencyProvider() + + reactNativeDelegate = delegate + reactNativeFactory = factory + + window = UIWindow(frame: UIScreen.main.bounds) + + factory.startReactNative( + withModuleName: "BareFlowMetaMaskDemo", + in: window, + launchOptions: launchOptions + ) + + return true + } + + // Forwards incoming bareflowmetamaskdemo:// URLs (see Info.plist's + // CFBundleURLTypes and dynamicClient.ts's metadata.nativeLink) to RN's + // Linking module, so JS-level Linking.getInitialURL()/'url' listeners + // actually fire. The OS foregrounds the app on a registered scheme + // regardless of this method, but without it RN never finds out why. + func application( + _ app: UIApplication, + open url: URL, + options: [UIApplication.OpenURLOptionsKey: Any] = [:] + ) -> Bool { + return RCTLinkingManager.application(app, open: url, options: options) + } +} + +class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + self.bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..8121323 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Images.xcassets/Contents.json b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Images.xcassets/Contents.json new file mode 100644 index 0000000..2d92bd5 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Info.plist b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Info.plist new file mode 100644 index 0000000..1590ab1 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/Info.plist @@ -0,0 +1,68 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + BareFlowMetaMaskDemo + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + CFBundleURLTypes + + + + CFBundleURLName + com.dynamiclabs.examples.bareflowmetamaskdemo + CFBundleURLSchemes + + bareflowmetamaskdemo + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + NSLocationWhenInUseUsageDescription + + RCTNewArchEnabled + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/LaunchScreen.storyboard b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/LaunchScreen.storyboard new file mode 100644 index 0000000..28c43ba --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/PrivacyInfo.xcprivacy b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..41b8317 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/BareFlowMetaMaskDemo/PrivacyInfo.xcprivacy @@ -0,0 +1,37 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/Podfile b/examples/bare-react-native-with-js-sdk-and-flow/ios/Podfile new file mode 100644 index 0000000..b1435f0 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/Podfile @@ -0,0 +1,108 @@ +# --- Why this line exists: NOT a required step for using Dynamic's SDK --- +# +# This works around a machine/toolchain-specific problem, not something +# wrong with this app's code or with Dynamic's SDK. If your own project +# builds fine with the default (prebuilt) Hermes, you almost certainly +# don't need this — most people won't. It's kept here because this +# example's own dev/CI environment hit it and the fix is a safe, harmless +# default for anyone else who might. +# +# The problem: React Native 0.81.4's hermes-engine pod defaults to a +# prebuilt XCFramework compiled by Meta with whatever Xcode was current +# at RN 0.81.4's release time. Building with a *much newer* Xcode (26+, +# here) than that prebuilt binary was compiled with is a C++ ABI mismatch +# waiting to happen — confirmed the hard way in this repo: physical +# Release builds crashed on every single launch with EXC_BAD_ACCESS/SIGSEGV +# inside HermesRuntimeImpl's debugger/inspector setup +# (ReactInstance::initializeRuntime's runtime-install callback), 100% +# reproducible, before any app JS ever ran. Debug-on-Simulator never showed +# it (Simulator + Debug wasn't exercising the prebuilt binary's actual ABI +# boundary the same way). If you're on an Xcode version released closer to +# when your pinned React Native version shipped, the prebuilt binary and +# your compiler are ABI-compatible and this mismatch simply doesn't occur. +# +# The fix: forcing Hermes to build from source instead compiles it with +# this project's own Xcode toolchain, eliminating the mismatch entirely — +# confirmed fixed on-device after this change. The tradeoff is a one-time +# (cached by DerivedData afterwards) extra native compile of Hermes itself +# on the next `pod install` + build (well under 10 minutes on this +# project's dev machine), which is why this isn't just always the React +# Native default upstream. This also shifts a dependency onto GitHub +# connectivity (cloning Hermes's source at a pinned tag) rather than Maven +# Central, for every configuration -- including Debug-on-Simulator builds +# that were never affected by the crash in the first place. We apply it +# project-wide rather than scoping it to just Release because CocoaPods +# resolves one Podspec graph for all configurations in a single +# `pod install` -- there's no clean way to make this Debug/Release- +# conditional at the Podfile level. +# +# Why a Podfile default and not an env var you pass by hand, or a wrapper +# script around `pod install`: this needs to apply automatically to every +# future `pod install`/`bundle exec pod install` — including CI, including +# anyone else who clones this repo — for every configuration (Debug and +# Release) and target (Simulator and device) — not just the +# Release-on-device combination that happened to surface it here. A +# command you have to remember to run is a command someone eventually +# forgets to run. `||=` still allows an explicit override (e.g. +# HERMES_ENGINE_TARBALL_PATH workflows) by whoever's running the install. +# See hermes-utils.rb in react-native's own scripts for the full +# source-selection logic this feeds into. +ENV['RCT_BUILD_HERMES_FROM_SOURCE'] ||= 'true' + +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip + +platform :ios, min_ios_version_supported +prepare_react_native_project! + +linkage = ENV['USE_FRAMEWORKS'] +if linkage != nil + Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green + use_frameworks! :linkage => linkage.to_sym +end + +target 'BareFlowMetaMaskDemo' do + config = use_native_modules! + + use_react_native!( + :path => config[:reactNativePath], + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) + + post_install do |installer| + # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 + react_native_post_install( + installer, + config[:reactNativePath], + :mac_catalyst_enabled => false, + # :ccache_enabled => true + ) + + # Workaround: react-native 0.81.x vendors fmt 11.0.2, which mis-detects + # consteval support on very recent Clang toolchains (Xcode 26.x here), + # producing "call to consteval function ... is not a constant + # expression". This is a local build-only patch (not shipped as part of + # the app) that disables fmt's compile-time format-string validation -- + # a compile-time diagnostic only, with no runtime behavior change. + # Workaround for fmt compilation errors with Xcode 26+ (stricter consteval + # in Clang): fmt unconditionally sets FMT_USE_CONSTEVAL=1 when + # __cpp_consteval is defined, which Xcode 26's Clang rejects ("call to + # consteval function ... is not a constant expression"). Patches + # fmt/base.h to disable the consteval code path. `ios/Pods` is gitignored + # and regenerated by `pod install`, so this re-applies on every install. + fmt_base_header = File.join(__dir__, 'Pods', 'fmt', 'include', 'fmt', 'base.h') + if File.exist?(fmt_base_header) + content = File.read(fmt_base_header) + patched = content.gsub('define FMT_USE_CONSTEVAL 1', 'define FMT_USE_CONSTEVAL 0') + if patched != content + File.chmod(0644, fmt_base_header) + File.write(fmt_base_header, patched) + end + end + end +end diff --git a/examples/bare-react-native-with-js-sdk-and-flow/ios/Podfile.lock b/examples/bare-react-native-with-js-sdk-and-flow/ios/Podfile.lock new file mode 100644 index 0000000..e53fa2e --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/ios/Podfile.lock @@ -0,0 +1,2980 @@ +PODS: + - boost (1.84.0) + - DoubleConversion (1.1.6) + - dynamic-labs-sdk-client (1.28.0): + - boost + - DoubleConversion + - fast_float + - 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 + - SocketRocket + - Yoga + - fast_float (8.0.0) + - FBLazyVector (0.81.4) + - fmt (11.0.2) + - glog (0.3.5) + - hermes-engine (0.81.4): + - hermes-engine/cdp (= 0.81.4) + - hermes-engine/Hermes (= 0.81.4) + - hermes-engine/inspector (= 0.81.4) + - hermes-engine/inspector_chrome (= 0.81.4) + - hermes-engine/Public (= 0.81.4) + - hermes-engine/cdp (0.81.4) + - hermes-engine/Hermes (0.81.4) + - hermes-engine/inspector (0.81.4) + - hermes-engine/inspector_chrome (0.81.4) + - hermes-engine/Public (0.81.4) + - RCT-Folly (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCT-Folly/Default (= 2024.11.18.00) + - RCT-Folly/Default (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - RCT-Folly/Fabric (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 8.0.0) + - fmt (= 11.0.2) + - glog + - 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 + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.4) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/CoreModulesHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/Default (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/DevSupport (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.4) + - React-Core/RCTWebSocket (= 0.81.4) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTActionSheetHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTAnimationHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTBlobHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTImageHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTLinkingHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTNetworkHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTSettingsHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTTextHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTVibrationHeaders (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-Core/RCTWebSocket (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTDeprecation + - React-Core/Default (= 0.81.4) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsinspectorcdp + - React-jsitooling + - React-perflogger + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-CoreModules (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - 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.4) + - React-runtimeexecutor + - ReactCommon + - SocketRocket + - React-cxxreact (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - 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.4) + - React-perflogger (= 0.81.4) + - React-runtimeexecutor + - React-timing (= 0.81.4) + - SocketRocket + - React-debug (0.81.4) + - React-defaultsnativemodule (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-domnativemodule + - React-featureflagsnativemodule + - React-idlecallbacksnativemodule + - React-jsi + - React-jsiexecutor + - React-microtasksnativemodule + - React-RCTFBReactNativeSpec + - SocketRocket + - React-domnativemodule (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Fabric + - React-Fabric/bridging + - React-FabricComponents + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-Fabric (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - 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 + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/animations (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/attributedstring (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/bridging (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/componentregistry (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/componentregistrynative (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - 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 + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/legacyviewmanagerinterop (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/root (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/scrollview (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/components/view (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-Fabric/consistency (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/core (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/dom (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/imagemanager (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/leakchecker (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/mounting (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.81.4) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/observers/events (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/scheduler (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/telemetry (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/templateprocessor (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.81.4) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-Fabric/uimanager/consistency (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - React-FabricComponents (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.81.4) + - React-FabricComponents/textlayoutmanager (= 0.81.4) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - 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 + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/inputaccessory (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/iostextinput (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/modal (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/rncore (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/safeareaview (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/scrollview (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/switch (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/text (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/textinput (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/unimplementedview (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/components/virtualview (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricComponents/textlayoutmanager (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-FabricImage (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired (= 0.81.4) + - RCTTypeSafety (= 0.81.4) + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.81.4) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-featureflags (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-featureflagsnativemodule (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - React-graphics (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-utils + - SocketRocket + - React-hermes (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.4) + - React-jsi + - React-jsiexecutor (= 0.81.4) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.81.4) + - React-runtimeexecutor + - SocketRocket + - React-idlecallbacksnativemodule (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - SocketRocket + - React-ImageManager (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - SocketRocket + - React-jserrorhandler (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - ReactCommon/turbomodule/bridging + - SocketRocket + - React-jsi (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsiexecutor (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-perflogger (= 0.81.4) + - React-runtimeexecutor + - SocketRocket + - React-jsinspector (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-oscompat + - React-perflogger (= 0.81.4) + - React-runtimeexecutor + - SocketRocket + - React-jsinspectorcdp (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-jsinspectornetwork (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectorcdp + - React-performancetimeline + - React-timing + - SocketRocket + - React-jsinspectortracing (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-oscompat + - React-timing + - SocketRocket + - React-jsitooling (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact (= 0.81.4) + - React-jsi (= 0.81.4) + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-runtimeexecutor + - SocketRocket + - React-jsitracing (0.81.4): + - React-jsi + - React-logger (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-Mapbuffer (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-microtasksnativemodule (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - SocketRocket + - react-native-get-random-values (2.0.0): + - boost + - DoubleConversion + - fast_float + - 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 + - SocketRocket + - Yoga + - react-native-passkey (3.5.0): + - boost + - DoubleConversion + - fast_float + - 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 + - SocketRocket + - Yoga + - react-native-safe-area-context (5.5.2): + - boost + - DoubleConversion + - fast_float + - 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-native-safe-area-context/common (= 5.5.2) + - react-native-safe-area-context/fabric (= 5.5.2) + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - react-native-safe-area-context/common (5.5.2): + - boost + - DoubleConversion + - fast_float + - 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 + - SocketRocket + - Yoga + - react-native-safe-area-context/fabric (5.5.2): + - boost + - DoubleConversion + - fast_float + - 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-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - React-NativeModulesApple (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core + - React-cxxreact + - React-featureflags + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - React-oscompat (0.81.4) + - React-perflogger (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - SocketRocket + - React-performancetimeline (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-jsinspectortracing + - React-perflogger + - React-timing + - SocketRocket + - React-RCTActionSheet (0.81.4): + - React-Core/RCTActionSheetHeaders (= 0.81.4) + - React-RCTAnimation (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-featureflags + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTAppDelegate (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsitooling + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTNetwork + - React-RCTRuntime + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon + - SocketRocket + - React-RCTBlob (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - React-RCTFabric (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-RCTAnimation + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-renderercss + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - Yoga + - React-RCTFBReactNativeSpec (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec/components (= 0.81.4) + - ReactCommon + - SocketRocket + - React-RCTFBReactNativeSpec/components (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon + - SocketRocket + - Yoga + - React-RCTImage (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - SocketRocket + - 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.4) + - React-RCTNetwork (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-featureflags + - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTRuntime (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-Core + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-RuntimeApple + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - SocketRocket + - React-RCTSettings (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-RCTText (0.81.4): + - React-Core/RCTTextHeaders (= 0.81.4) + - Yoga + - React-RCTVibration (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - SocketRocket + - React-rendererconsistency (0.81.4) + - React-renderercss (0.81.4): + - React-debug + - React-utils + - React-rendererdebug (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - SocketRocket + - React-RuntimeApple (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - SocketRocket + - React-RuntimeCore (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-cxxreact + - React-Fabric + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - SocketRocket + - React-runtimeexecutor (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-featureflags + - React-jsi (= 0.81.4) + - React-utils + - SocketRocket + - React-RuntimeHermes (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectorcdp + - React-jsinspectortracing + - React-jsitooling + - React-jsitracing + - React-RuntimeCore + - React-runtimeexecutor + - React-utils + - SocketRocket + - React-runtimescheduler (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-jsinspectortracing + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - SocketRocket + - React-timing (0.81.4): + - React-debug + - React-utils (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - React-debug + - React-jsi (= 0.81.4) + - SocketRocket + - ReactAppDependencyProvider (0.81.4): + - ReactCodegen + - ReactCodegen (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-RCTAppDelegate + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - ReactCommon (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly + - RCT-Folly/Fabric + - ReactCommon/turbomodule (= 0.81.4) + - SocketRocket + - ReactCommon/turbomodule (0.81.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - 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.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - 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.4): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - 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 + - RNCAsyncStorage (2.2.0): + - boost + - DoubleConversion + - fast_float + - 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 + - SocketRocket + - Yoga + - RNCClipboard (1.16.3): + - boost + - DoubleConversion + - fast_float + - 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 + - SocketRocket + - Yoga + - RNInAppBrowser (3.7.1): + - React-Core + - RNKeychain (10.0.0): + - boost + - DoubleConversion + - fast_float + - 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 + - SocketRocket + - Yoga + - RNScreens (4.24.0): + - boost + - DoubleConversion + - fast_float + - 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-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNScreens/common (= 4.24.0) + - SocketRocket + - Yoga + - RNScreens/common (4.24.0): + - boost + - DoubleConversion + - fast_float + - 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-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga + - RNSVG (15.15.5): + - boost + - DoubleConversion + - fast_float + - 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 + - RNSVG/common (= 15.15.5) + - SocketRocket + - Yoga + - RNSVG/common (15.15.5): + - boost + - DoubleConversion + - fast_float + - 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 + - SocketRocket + - Yoga + - SocketRocket (0.7.1) + - Yoga (0.0.0) + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - "dynamic-labs-sdk-client (from `../node_modules/@dynamic-labs-sdk/client`)" + - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - 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`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) + - React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`) + - React-Fabric (from `../node_modules/react-native/ReactCommon`) + - React-FabricComponents (from `../node_modules/react-native/ReactCommon`) + - React-FabricImage (from `../node_modules/react-native/ReactCommon`) + - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) + - React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) + - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) + - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) + - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) + - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) + - React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`) + - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) + - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) + - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) + - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - react-native-get-random-values (from `../node_modules/react-native-get-random-values`) + - react-native-passkey (from `../node_modules/react-native-passkey`) + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTFabric (from `../node_modules/react-native/React`) + - React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTRuntime (from `../node_modules/react-native/React/Runtime`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) + - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) + - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) + - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) + - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - ReactAppDependencyProvider (from `build/generated/ios`) + - ReactCodegen (from `build/generated/ios`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" + - "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)" + - RNInAppBrowser (from `../node_modules/react-native-inappbrowser-reborn`) + - RNKeychain (from `../node_modules/react-native-keychain`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNSVG (from `../node_modules/react-native-svg`) + - SocketRocket (~> 0.7.1) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - SocketRocket + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + dynamic-labs-sdk-client: + :path: "../node_modules/@dynamic-labs-sdk/client" + fast_float: + :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + fmt: + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2025-07-07-RNv0.81.0-e0fc67142ec0763c6b6153ca2bf96df815539782 + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + RCTRequired: + :path: "../node_modules/react-native/Libraries/Required" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jserrorhandler: + :path: "../node_modules/react-native/ReactCommon/jserrorhandler" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectorcdp: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + React-jsinspectornetwork: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" + React-jsinspectortracing: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" + React-jsitooling: + :path: "../node_modules/react-native/ReactCommon/jsitooling" + React-jsitracing: + :path: "../node_modules/react-native/ReactCommon/hermes/executor/" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-get-random-values: + :path: "../node_modules/react-native-get-random-values" + react-native-passkey: + :path: "../node_modules/react-native-passkey" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-oscompat: + :path: "../node_modules/react-native/ReactCommon/oscompat" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: "../node_modules/react-native/React" + React-RCTFBReactNativeSpec: + :path: "../node_modules/react-native/React" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTRuntime: + :path: "../node_modules/react-native/React/Runtime" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../node_modules/react-native/ReactCommon/react/renderer/consistency" + React-renderercss: + :path: "../node_modules/react-native/ReactCommon/react/renderer/css" + React-rendererdebug: + :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" + React-RuntimeApple: + :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-timing: + :path: "../node_modules/react-native/ReactCommon/react/timing" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" + ReactAppDependencyProvider: + :path: build/generated/ios + ReactCodegen: + :path: build/generated/ios + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RNCAsyncStorage: + :path: "../node_modules/@react-native-async-storage/async-storage" + RNCClipboard: + :path: "../node_modules/@react-native-clipboard/clipboard" + RNInAppBrowser: + :path: "../node_modules/react-native-inappbrowser-reborn" + RNKeychain: + :path: "../node_modules/react-native-keychain" + RNScreens: + :path: "../node_modules/react-native-screens" + RNSVG: + :path: "../node_modules/react-native-svg" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 + DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + dynamic-labs-sdk-client: 5fee4611d6c82001c86cc6a760603197eefea0b4 + fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 + FBLazyVector: 941bef1c8eeabd9fe1f501e30a5220beee913886 + fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd + glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 + hermes-engine: 228692ee4d4390de83b99d1756f67b1502d9fbc6 + RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 + RCTDeprecation: c0ed3249a97243002615517dff789bf4666cf585 + RCTRequired: 58719f5124f9267b5f9649c08bf23d9aea845b23 + RCTTypeSafety: 4aefa8328ab1f86da273f08517f1f6b343f6c2cc + React: 2073376f47c71b7e9a0af7535986a77522ce1049 + React-callinvoker: 751b6f2c83347a0486391c3f266f291f0f53b27e + React-Core: dff5d29973349b11dd6631c9498456d75f846d5e + React-CoreModules: c0ae04452e4c5d30e06f8e94692a49107657f537 + React-cxxreact: 376fd672c95dfb64ad5cc246e6a1e9edb78dec4c + React-debug: 7b56a0a7da432353287d2eedac727903e35278f5 + React-defaultsnativemodule: 393b81aaa6211408f50a6ef00a277847256dd881 + React-domnativemodule: 5fb5829baa7a7a0f217019cbad1eb226d94f7062 + React-Fabric: a17c4ae35503673b57b91c2d1388429e7cbee452 + React-FabricComponents: a76572ddeba78ebe4ec58615291e9db4a55cd46a + React-FabricImage: d806eb2695d7ef355ec28d1a21f5a14ac26b1cae + React-featureflags: 1690ec3c453920b6308e23a4e24eb9c3632f9c75 + React-featureflagsnativemodule: 7b7e8483fc671c5a33aefd699b7c7a3c0bdfdfec + React-graphics: ea146ee799dc816524a3a0922fc7be0b5a52dcc1 + React-hermes: fcbdc45ecf38259fe3b12642bd0757c52270a107 + React-idlecallbacksnativemodule: a353f9162eaa7ad787e68aba9f52a1cfa8154098 + React-ImageManager: ec5cf55ce9cc81719eb5f1f51d23d04db851c86c + React-jserrorhandler: 594c593f3d60f527be081e2cace7710c2bd9f524 + React-jsi: 59ec3190dd364cca86a58869e7755477d2468948 + React-jsiexecutor: b87d78a2e8dd7a6f56e9cdac038da45de98c944f + React-jsinspector: b9204adf1af622c98e78af96ec1bca615c2ce2bd + React-jsinspectorcdp: 4a356fa69e412d35d3a38c44d4a6cc555c5931e8 + React-jsinspectornetwork: 7820056773178f321cbf18689e1ffcd38276a878 + React-jsinspectortracing: b341c5ef6e031a33e0bd462d67fd397e8e9cd612 + React-jsitooling: 401655e05cb966b0081225c5201d90734a567cb9 + React-jsitracing: 67eff6dea0cb58a1e7bd8b49243012d88c0f511e + React-logger: a3cb5b29c32b8e447b5a96919340e89334062b48 + React-Mapbuffer: 9d2434a42701d6144ca18f0ca1c4507808ca7696 + React-microtasksnativemodule: 75b6604b667d297292345302cc5bfb6b6aeccc1b + react-native-get-random-values: e2acf4070fe4b7325705a05af047449637a27a21 + react-native-passkey: eaf2e620c220e12a37ba7c96a9934580ecf24cb2 + react-native-safe-area-context: 84a754cad3fbb25117482cde6b8defca6c6f6a53 + React-NativeModulesApple: 879fbdc5dcff7136abceb7880fe8a2022a1bd7c3 + React-oscompat: 93b5535ea7f7dff46aaee4f78309a70979bdde9d + React-perflogger: 5536d2df3d18fe0920263466f7b46a56351c0510 + React-performancetimeline: 9041c53efa07f537164dcfe7670a36642352f4c2 + React-RCTActionSheet: 42195ae666e6d79b4af2346770f765b7c29435b9 + React-RCTAnimation: fa103ccc3503b1ed8dedca7e62e7823937748843 + React-RCTAppDelegate: 665d4baf19424cef08276e9ac0d8771eec4519f9 + React-RCTBlob: 0fa9530c255644db095f2c4fd8d89738d9d9ecc0 + React-RCTFabric: 1fcd8af6e25f92532f56b4ba092e58662c14d156 + React-RCTFBReactNativeSpec: db171247585774f9f0a30f75109cc51568686213 + React-RCTImage: ba824e61ce2e920a239a65d130b83c3a1d426dff + React-RCTLinking: d2dc199c37e71e6f505d9eca3e5c33be930014d4 + React-RCTNetwork: 87137d4b9bd77e5068f854dd5c1f30d4b072faf6 + React-RCTRuntime: 137fafaa808a8b7e76a510e8be45f9f827899daa + React-RCTSettings: 71f5c7fd7b5f4e725a4e2114a4b4373d0e46048f + React-RCTText: b94d4699b49285bee22b8ebf768924d607eccee3 + React-RCTVibration: 6e3993c4f6c36a3899059f9a9ead560ddaf5a7d7 + React-rendererconsistency: b4785e5ed837dc7c242bbc5fdd464b33ef5bfae7 + React-renderercss: e6fb0ba387b389c595ffa86b8b628716d31f58dc + React-rendererdebug: 60a03de5c7ea59bf2d39791eb43c4c0f5d8b24e3 + React-RuntimeApple: 3df6788cd9b938bb8cb28298d80b5fbd98a4d852 + React-RuntimeCore: fad8adb4172c414c00ff6980250caf35601a0f5d + React-runtimeexecutor: d2db7e72d97751855ea0bf5273d2ac84e5ea390c + React-RuntimeHermes: 04faa4cf9a285136a6d73738787fe36020170613 + React-runtimescheduler: f6a1c9555e7131b4a8b64cce01489ad0405f6e8d + React-timing: 1e6a8acb66e2b7ac9d418956617fd1fdb19322fd + React-utils: 52bbb03f130319ef82e4c3bc7a85eaacdb1fec87 + ReactAppDependencyProvider: 433ddfb4536948630aadd5bd925aff8a632d2fe3 + ReactCodegen: bda01baeea463f2bb10d9166da70e1a4e4eded6d + ReactCommon: 394c6b92765cf6d211c2c3f7f6bc601dffb316a6 + RNCAsyncStorage: 29f0230e1a25f36c20b05f65e2eb8958d6526e82 + RNCClipboard: 4b58c780f63676367640f23c8e114e9bd0cf86ac + RNInAppBrowser: 904d24dc75e8e6c6c98a3160329192608946f9df + RNKeychain: a2c134ab796272c3d605e035ab727591000b30f3 + RNScreens: 7f643ee0fd1407dc5085c7795460bd93da113b8f + RNSVG: 4dd2d79b3cb224bcb3ae666a2adda2ede9d3772f + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Yoga: a3ed390a19db0459bd6839823a6ac6d9c6db198d + +PODFILE CHECKSUM: 9777ce28208699bc64da6eb7b341c67ee5c3ada0 + +COCOAPODS: 1.15.2 diff --git a/examples/bare-react-native-with-js-sdk-and-flow/metro.config.js b/examples/bare-react-native-with-js-sdk-and-flow/metro.config.js new file mode 100644 index 0000000..50bd22b --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/metro.config.js @@ -0,0 +1,33 @@ +const path = require('path'); +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); + +/** + * Metro configuration + * https://reactnative.dev/docs/metro + * + * @type {import('@react-native/metro-config').MetroConfig} + */ +const config = { + resolver: { + // `extraNodeModules` is only consulted as a *fallback*, once normal + // resolution fails to find a module — it can't override a package + // that's actually installed, which `ws` is (as a transitive + // dependency). `resolveRequest` intercepts every resolution up front, + // so it can redirect a real package too. + resolveRequest: (context, moduleName, platform) => { + if (moduleName === 'ws') { + // `ws` is a Node-only WebSocket client that WalletConnect + // internals pull in transitively (via @dynamic-labs-sdk/evm's + // wallet-connect dependency, even for MetaMask-only usage) — see + // shims/ws.js. + return { + type: 'sourceFile', + filePath: path.resolve(__dirname, 'shims/ws.js'), + }; + } + return context.resolveRequest(context, moduleName, platform); + }, + }, +}; + +module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/package.json b/examples/bare-react-native-with-js-sdk-and-flow/package.json new file mode 100644 index 0000000..08cf4bb --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/package.json @@ -0,0 +1,60 @@ +{ + "name": "bare-react-native-with-js-sdk-and-flow", + "version": "0.0.1", + "private": true, + "scripts": { + "android": "react-native run-android", + "ios": "react-native run-ios", + "lint": "eslint .", + "start": "react-native start" + }, + "dependencies": { + "@dynamic-labs-sdk/client": "1.28.0", + "@dynamic-labs-sdk/evm": "1.28.0", + "@dynamic-labs-sdk/react-hooks": "1.28.0", + "@react-native-async-storage/async-storage": "2.2.0", + "@react-native-clipboard/clipboard": "1.16.3", + "@react-native/new-app-screen": "0.81.4", + "@react-navigation/native": "7.3.14", + "@react-navigation/native-stack": "7.18.6", + "@tanstack/react-query": "5.101.4", + "buffer": "6.0.3", + "react": "19.1.0", + "react-native": "0.81.4", + "react-native-get-random-values": "2.0.0", + "react-native-inappbrowser-reborn": "3.7.1", + "react-native-keychain": "10.0.0", + "react-native-passkey": "3.5.0", + "react-native-safe-area-context": "5.5.2", + "react-native-screens": "4.24.0", + "react-native-svg": "15.15.5", + "viem": "2.55.8" + }, + "devDependencies": { + "@babel/core": "7.25.2", + "@babel/plugin-transform-class-static-block": "7.29.7", + "@babel/plugin-transform-export-namespace-from": "7.29.7", + "@babel/preset-env": "7.25.3", + "@babel/runtime": "7.25.0", + "@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.4", + "@react-native/codegen": "0.81.4", + "@react-native/eslint-config": "0.81.4", + "@react-native/gradle-plugin": "0.81.4", + "@react-native/metro-config": "0.81.4", + "@react-native/typescript-config": "0.81.4", + "@types/react": "19.1.0", + "babel-plugin-transform-inline-environment-variables": "0.4.4", + "dotenv": "17.4.2", + "eslint": "8.57.1", + "eslint-plugin-jest": "27.9.0", + "prettier": "2.8.8", + "typescript": "5.8.3" + }, + "engines": { + "node": ">=20" + }, + "packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017" +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/patches/@react-native__codegen@0.81.4.patch b/examples/bare-react-native-with-js-sdk-and-flow/patches/@react-native__codegen@0.81.4.patch new file mode 100644 index 0000000..72da76c --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/patches/@react-native__codegen@0.81.4.patch @@ -0,0 +1,36 @@ +diff --git a/lib/cli/combine/combine-js-to-schema.js b/lib/cli/combine/combine-js-to-schema.js +index 9c2fb5f4248f965b8d1c30540d35ad1549b3c937..06d9deea5f74c4a7777c80a8cc59ab0ade815033 100644 +--- a/lib/cli/combine/combine-js-to-schema.js ++++ b/lib/cli/combine/combine-js-to-schema.js +@@ -52,7 +52,30 @@ function combineSchemas(files, libraryName) { + function expandDirectoriesIntoFiles(fileList, platform, exclude) { + return fileList + .flatMap(file => { +- if (!fs.lstatSync(file).isDirectory()) { ++ // --- pnpm compatibility fix, not a machine-specific workaround --- ++ // Unlike the Hermes-from-source setting in this project's ios/Podfile ++ // (which only matters on an unusually new Xcode), THIS fix is needed ++ // by anyone using pnpm with this pinned React Native/codegen version ++ // -- it has nothing to do with what computer you're on. ++ // ++ // Upstream uses lstatSync here, which does NOT follow symlinks. Every ++ // pnpm-managed node_modules/ entry IS a symlink (into ++ // .pnpm/@version/node_modules/), so lstatSync reports every ++ // such package root as "not a directory" and this silently skips ++ // scanning it for Native*.ts specs entirely -- producing an empty ++ // codegen schema for every pnpm-linked TurboModule (any of them, not ++ // just @walletconnect/react-native-compat -- react-native-keychain's ++ // generated header is equally empty, it just happens not to be ++ // referenced by keychain's own native code, so nothing ever notices). ++ // The only symptom upstream gives you is a generic "No modules to ++ // process" log line during `pod install`, easy to miss. statSync ++ // follows symlinks and correctly identifies these as directories, ++ // which is all this one-line fix does. ++ // ++ // If this project ever switches off pnpm (npm/Yarn's node_modules ++ // aren't symlinked the same way), this patch becomes a no-op you can ++ // safely drop -- but with pnpm, every consumer of this repo needs it. ++ if (!fs.statSync(file).isDirectory()) { + return [file]; + } + const filePattern = path.sep === '\\' ? file.replace(/\\/g, '/') : file; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/pnpm-workspace.yaml b/examples/bare-react-native-with-js-sdk-and-flow/pnpm-workspace.yaml new file mode 100644 index 0000000..025abba --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +patchedDependencies: + '@react-native/codegen@0.81.4': patches/@react-native__codegen@0.81.4.patch diff --git a/examples/bare-react-native-with-js-sdk-and-flow/polyfills.ts b/examples/bare-react-native-with-js-sdk-and-flow/polyfills.ts new file mode 100644 index 0000000..e5ded52 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/polyfills.ts @@ -0,0 +1,115 @@ +/** + * Bare React Native has none of the browser/Node globals the Dynamic SDK + * (and the libraries it pulls in) assume exist. Expo's managed workflow + * sets most of these up automatically; a bare RN CLI app has to do it + * explicitly, once, before anything else runs — see index.js, which + * imports this file first. + * + * This mirrors Dynamic's own bare React Native setup guide: + * https://www.dynamic.xyz/docs/javascript/react-native/bare-react-native + */ + +/** + * Random values polyfill (crypto.getRandomValues). Provides the secure + * native RNG the SDK relies on. Must load before anything that generates + * random values. + */ +import 'react-native-get-random-values'; + +import { APP_ORIGIN } from './src/consts/config'; + +/** + * Buffer polyfill for various cryptographic operations in this dependency + * tree (viem, wallet connectors). + */ +import { Buffer as BufferPolyfill } from 'buffer'; + +(globalThis as typeof globalThis & { Buffer: typeof BufferPolyfill }).Buffer = + BufferPolyfill; + +/** + * crypto.randomUUID polyfill. Hermes doesn't implement crypto.randomUUID, + * so we generate a v4 UUID from crypto.getRandomValues (polyfilled above). + */ +type CryptoLike = { + getRandomValues?: (array: Uint8Array) => Uint8Array; + randomUUID?: () => string; +}; + +const globalWithCrypto = globalThis as unknown as { + crypto?: CryptoLike; +}; + +if (!globalWithCrypto.crypto) { + globalWithCrypto.crypto = {}; +} + +const cryptoRef = globalWithCrypto.crypto; + +if (typeof cryptoRef.randomUUID !== 'function') { + cryptoRef.randomUUID = () => { + const bytes = new Uint8Array(16); + // getRandomValues is guaranteed by the react-native-get-random-values + // import above. + cryptoRef.getRandomValues!(bytes); + // Set the version (4) and variant bits required by RFC 4122. + /* eslint-disable no-bitwise */ + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + /* eslint-enable no-bitwise */ + const hex = [...bytes] + .map(b => b.toString(16).padStart(2, '0')) + .join(''); + return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; + }; +} + +/** + * window.location polyfill for Dynamic's embedded wallet support. + * React Native has no window.location; addEvmExtension() (see + * dynamicClient.ts) wires up Dynamic's embedded/WaaS wallet extension too + * (it's bundled into the same call as standard wallet support), and that + * client reads window.location.origin when loading the embedded wallet's + * page inside the SDK's native WebView — it throws without this shim, even + * though this demo only ever connects an external wallet (MetaMask). Uses + * config.ts's APP_ORIGIN — the same value passed as metadata.universalLink + * (see dynamicClient.ts) — so the embedded wallet loads with a consistent + * origin. + */ +type MinimalLocation = { + origin: string; + href: string; + protocol: string; + host: string; + hostname: string; + port: string; + pathname: string; + search: string; + hash: string; +}; + +const globalWithLocation = globalThis as typeof globalThis & { + location?: MinimalLocation; +}; + +// React Native's TypeScript config has no DOM lib, so the URL global +// (provided at runtime by React Native) needs an explicit type here. +const globalWithUrl = globalThis as typeof globalThis & { + URL: new (url: string) => MinimalLocation; +}; + +if (!globalWithLocation.location) { + const appOriginUrl = new globalWithUrl.URL(APP_ORIGIN); + + globalWithLocation.location = { + origin: appOriginUrl.origin, + href: appOriginUrl.href, + protocol: appOriginUrl.protocol, + host: appOriginUrl.host, + hostname: appOriginUrl.hostname, + port: appOriginUrl.port, + pathname: appOriginUrl.pathname, + search: appOriginUrl.search, + hash: appOriginUrl.hash, + }; +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/shims/ws.js b/examples/bare-react-native-with-js-sdk-and-flow/shims/ws.js new file mode 100644 index 0000000..8304417 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/shims/ws.js @@ -0,0 +1,25 @@ +/** + * Metro shim for the `ws` package. + * + * `ws` is a Node-only WebSocket client (its real implementation needs + * Node's `stream`/`net` built-ins, unavailable in Hermes/React Native). + * Something in this dependency tree resolves it transitively — WalletConnect + * internals pulled in by @dynamic-labs-sdk/evm's wallet-connect dependency, + * even when only MetaMask's own connector is used directly — so Metro tries + * to bundle `ws`'s real source and fails on the Node built-ins it needs. + * + * This just re-exports React Native's global `WebSocket`. That's only + * actually safe because the real consumers here (`isows`, pulled in by + * viem, and @walletconnect/jsonrpc-ws-connection) both check for a global + * `WebSocket` FIRST and prefer it over whatever `require('ws')` returns — + * they never call this shim's exports directly, so its exact shape doesn't + * matter much in practice today. It is NOT a faithful `ws` polyfill (no + * `.on('message', ...)`-style EventEmitter API, only the browser-style + * `WebSocket` shape) — if a future dependency in this tree calls `ws` + * directly without that same defensive check, this will need a real + * implementation instead, aliased in via metro.config.js's + * resolver.resolveRequest. + */ +module.exports = global.WebSocket; +module.exports.WebSocket = global.WebSocket; +module.exports.default = global.WebSocket; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/App.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/App.tsx new file mode 100644 index 0000000..db42244 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/App.tsx @@ -0,0 +1,25 @@ +import { DynamicProvider } from '@dynamic-labs-sdk/react-hooks'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { StatusBar } from 'react-native'; +import { SafeAreaProvider } from 'react-native-safe-area-context'; +import { dynamicClient } from '../dynamicClient'; +import { colors } from './consts/theme'; +import { Navigation } from './navigation'; + +const queryClient = new QueryClient(); + +export default function App() { + return ( + + + + + + + + + ); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/components/CopyButton.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/components/CopyButton.tsx new file mode 100644 index 0000000..0eb21db --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/components/CopyButton.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { Pressable, StyleSheet, Text } from 'react-native'; +import { colors, radii, spacing } from '../consts/theme'; + +type CopyButtonProps = { + title: string; + onPress: () => void; +}; + +/** + * Small bordered chip button, purely presentational — FlowStatusScreen's + * CopyRow owns the actual clipboard write + "Copied!" label swap and just + * passes the current label down. + */ +export function CopyButton({ title, onPress }: CopyButtonProps) { + return ( + [styles.button, pressed && styles.buttonPressed]} + onPress={onPress} + > + {title} + + ); +} + +const styles = StyleSheet.create({ + button: { + borderWidth: 1, + borderColor: colors.border, + borderRadius: radii.sm, + paddingHorizontal: spacing.md, + paddingVertical: spacing.xs, + }, + buttonPressed: { + backgroundColor: colors.divider, + }, + buttonText: { + fontSize: 12, + fontWeight: '600', + color: colors.accent, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/components/ErrorText.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/components/ErrorText.tsx new file mode 100644 index 0000000..881fa8f --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/components/ErrorText.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { StyleProp, StyleSheet, Text, TextStyle } from 'react-native'; +import { colors, spacing } from '../consts/theme'; + +type ErrorTextProps = { + children: React.ReactNode; + style?: StyleProp; +}; + +/** + * Inline error message shown under a failed mutation/query. Extracted from + * the `color: colors.error, fontSize: 13, marginTop: spacing.sm` Text that + * had drifted into near-identical copies across App.tsx, + * WithdrawalForm.tsx, and FlowStatusScreen.tsx — the latter also added an + * extra marginBottom before its Retry button, so that stays available as a + * style override rather than baked into the default. + */ +export function ErrorText({ children, style }: ErrorTextProps) { + return {children}; +} + +const styles = StyleSheet.create({ + text: { + color: colors.error, + fontSize: 13, + marginTop: spacing.sm, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/components/Header.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/components/Header.tsx new file mode 100644 index 0000000..a51555c --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/components/Header.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { Pressable, StyleSheet, Text, View } from 'react-native'; +import { colors, spacing, typography } from '../consts/theme'; +import { ChevronLeftIcon } from './icons'; + +type HeaderProps = { + title: string; + /** Renders a back chevron + "Back" that calls this when tapped. Omit on + * screens with nothing to go back to (Splash, the first screen of a + * stack). */ + onBack?: () => void; + /** A single trailing affordance, e.g. Home's account icon button. Kept to + * one slot, not a generic children/icon-row API — every screen in this + * app needs at most one. */ + right?: React.ReactNode; +}; + +/** + * Every full-bleed screen renders its own Header rather than relying on + * native-stack's built-in one (navigation.tsx sets `headerShown: false`) — + * this app's redesign wants full control over the header's look (no native + * chrome/back-button styling to fight), and a single shared component here + * keeps that consistent across ~10 screens instead of each reinventing it. + */ +export function Header({ title, onBack, right }: HeaderProps) { + return ( + + + {onBack ? ( + [ + styles.backButton, + pressed && styles.backButtonPressed, + ]} + onPress={onBack} + hitSlop={8} + > + + Back + + ) : null} + + + {title} + + {right} + + ); +} + +const styles = StyleSheet.create({ + row: { + flexDirection: 'row', + alignItems: 'center', + paddingHorizontal: spacing.lg, + paddingVertical: spacing.md, + }, + // Equal-width side slots keep `title` visually centered regardless of + // whether onBack/right are present — a plain 3-cell flex row without this + // would shift the title left/right depending on which slots are filled. + side: { + minWidth: 56, + }, + rightSide: { + alignItems: 'flex-end', + }, + backButton: { + flexDirection: 'row', + alignItems: 'center', + gap: 2, + alignSelf: 'flex-start', + }, + backButtonPressed: { + opacity: 0.6, + }, + backText: { + color: colors.accent, + ...typography.bodyMedium, + }, + title: { + flex: 1, + textAlign: 'center', + color: colors.foreground, + ...typography.headline, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/components/LinkButton.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/components/LinkButton.tsx new file mode 100644 index 0000000..5f92b99 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/components/LinkButton.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { Pressable, StyleSheet, Text } from 'react-native'; +import { colors } from '../consts/theme'; + +type LinkButtonProps = { + title: string; + onPress: () => void; + disabled?: boolean; + /** + * 'accent' for a plain link (e.g. the keyboard accessory's "Done"), + * 'danger' for a destructive action (e.g. "Disconnect"). + */ + tone?: 'accent' | 'danger'; + hitSlop?: number; +}; + +/** + * Bare text button with no fill or border — a tap target that's just a + * Text with a pressed-opacity feedback. Consolidates App.tsx's "Disconnect" + * (danger) and WithdrawalForm.tsx's keyboard-accessory "Done" (accent), + * which had drifted to the point that "Done" had no pressed feedback at + * all. + */ +export function LinkButton({ + title, + onPress, + disabled = false, + tone = 'accent', + hitSlop, +}: LinkButtonProps) { + return ( + + {({ pressed }) => ( + + {title} + + )} + + ); +} + +const styles = StyleSheet.create({ + text: { + fontSize: 13, + fontWeight: '600', + }, + accentText: { + color: colors.accent, + fontSize: 16, + }, + dangerText: { + color: colors.error, + }, + textPressed: { + opacity: 0.6, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/components/PrimaryButton.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/components/PrimaryButton.tsx new file mode 100644 index 0000000..2e2aa79 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/components/PrimaryButton.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { + ActivityIndicator, + Pressable, + StyleProp, + StyleSheet, + Text, + ViewStyle, +} from 'react-native'; +import { colors, radii, spacing } from '../consts/theme'; + +type PrimaryButtonProps = { + title: string; + onPress: () => void; + /** Shows a spinner in place of the label and implicitly disables the button. */ + loading?: boolean; + disabled?: boolean; + style?: StyleProp; +}; + +/** + * The filled accent CTA used throughout the app (e.g. "Connect with + * MetaMask", "Send withdrawal", "Retry", "Start a new withdrawal"). + * Extracted from the near-identical Pressable blocks duplicated across + * App.tsx, WithdrawalForm.tsx, and FlowStatusScreen.tsx. + */ +export function PrimaryButton({ + title, + onPress, + loading = false, + disabled = false, + style, +}: PrimaryButtonProps) { + const isDisabled = disabled || loading; + + return ( + [ + styles.button, + pressed && !isDisabled && styles.buttonPressed, + isDisabled && styles.buttonDisabled, + style, + ]} + onPress={onPress} + disabled={isDisabled} + > + {loading ? ( + + ) : ( + {title} + )} + + ); +} + +const styles = StyleSheet.create({ + button: { + backgroundColor: colors.accent, + borderRadius: radii.md, + paddingVertical: spacing.md, + alignItems: 'center', + justifyContent: 'center', + }, + buttonPressed: { + backgroundColor: colors.accentHover, + }, + buttonDisabled: { + opacity: 0.7, + }, + buttonText: { + color: colors.onAccent, + fontSize: 16, + fontWeight: '600', + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/components/Screen.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/components/Screen.tsx new file mode 100644 index 0000000..55bc6ed --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/components/Screen.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { + Keyboard, + KeyboardAvoidingView, + Platform, + ScrollView, + StyleSheet, + TouchableWithoutFeedback, + View, +} from 'react-native'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { colors, spacing } from '../consts/theme'; + +type ScreenProps = { + children: React.ReactNode; + /** + * Wraps content in a ScrollView + keyboard-dismiss-on-tap-outside, for + * screens with a text input that can end up behind the keyboard (Deposit, + * Withdraw). Screens with no input (Home, Splash, FlowStatus) don't need + * this. + */ + scrollsWithKeyboard?: boolean; +}; + +/** + * Every full-bleed route renders its content inside this instead of a bare + * View — it owns safe-area insets and (optionally) the keyboard-avoidance/ + * dismiss-on-tap behavior that used to live once in App.tsx (see its + * pre-redesign AppContent, which wrapped its single screen in + * KeyboardAvoidingView + ScrollView + TouchableWithoutFeedback). Now that + * each screen is its own route instead of one component swapping content, + * that behavior has to be available per-screen rather than once at the top. + */ +export function Screen({ children, scrollsWithKeyboard = false }: ScreenProps) { + const insets = useSafeAreaInsets(); + const paddedContent = ( + + {children} + + ); + + if (!scrollsWithKeyboard) { + return {paddedContent}; + } + + return ( + + + + {paddedContent} + + + + ); +} + +const styles = StyleSheet.create({ + flexOne: { + flex: 1, + }, + screen: { + flex: 1, + backgroundColor: colors.pageBackground, + }, + scrollContent: { + flexGrow: 1, + }, + content: { + flex: 1, + paddingHorizontal: spacing.lg, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/components/SecondaryButton.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/components/SecondaryButton.tsx new file mode 100644 index 0000000..be74a82 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/components/SecondaryButton.tsx @@ -0,0 +1,70 @@ +import React from 'react'; +import { + Pressable, + StyleProp, + StyleSheet, + Text, + ViewStyle, +} from 'react-native'; +import { colors, radii, spacing } from '../consts/theme'; + +type SecondaryButtonProps = { + title: string; + onPress: () => void; + disabled?: boolean; + style?: StyleProp; +}; + +/** + * Outline CTA for the lower-emphasis option next to a PrimaryButton (e.g. + * "Give up and start a new withdrawal"). Extracted from + * FlowStatusScreen.tsx, which was the only place this visual actually + * existed — App.tsx's "secondary" connect button is styled identically to + * its primary button, so it stays a PrimaryButton. + */ +export function SecondaryButton({ + title, + onPress, + disabled = false, + style, +}: SecondaryButtonProps) { + return ( + [ + styles.button, + pressed && !disabled && styles.buttonPressed, + disabled && styles.buttonDisabled, + style, + ]} + onPress={onPress} + disabled={disabled} + > + {title} + + ); +} + +const styles = StyleSheet.create({ + button: { + backgroundColor: colors.surface, + borderWidth: 1, + borderColor: colors.border, + borderRadius: radii.md, + paddingVertical: spacing.md, + alignItems: 'center', + justifyContent: 'center', + }, + buttonPressed: { + backgroundColor: colors.divider, + }, + buttonDisabled: { + opacity: 0.7, + }, + buttonText: { + color: colors.foregroundSecondary, + fontSize: 14, + fontWeight: '600', + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/components/icons.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/components/icons.tsx new file mode 100644 index 0000000..e2247f0 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/components/icons.tsx @@ -0,0 +1,67 @@ +/** + * Small glyph icons shared across the header (back chevron) and the flow + * status screen (FlowStatusView.tsx) — two filled step-state glyphs + * (check/alert) plus the back chevron. All paths use `currentColor` via the + * `color` prop so callers can theme them with existing theme.ts tokens + * instead of hardcoding hex here. + */ +import Svg, { Circle, Path } from 'react-native-svg'; + +type IconProps = { + size?: number; + color: string; +}; + +/** + * Filled circle + white checkmark — a "this step is done" glyph for + * FlowStatusScreen's step list. Unlike the outline icons above, `color` + * fills the circle rather than strokes a path, since the glyph inside is + * always white for contrast regardless of what's underneath. + */ +export function CheckCircleIcon({ size = 22, color }: IconProps) { + return ( + + + + + ); +} + +/** Filled circle + white exclamation mark — a "this step failed" glyph. */ +export function AlertCircleIcon({ size = 22, color }: IconProps) { + return ( + + + + + + ); +} + +/** Back-navigation chevron - Header.tsx's back button, in place of relying + * on native-stack's own header (this app renders its own Header per screen + * instead, for full control over the full-bleed redesign's look). */ +export function ChevronLeftIcon({ size = 20, color }: IconProps) { + return ( + + + + ); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/consts/config.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/consts/config.ts new file mode 100644 index 0000000..a5df959 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/consts/config.ts @@ -0,0 +1,44 @@ +/** + * Centralized env var reads. Values are inlined into the JS bundle at build + * time by babel-plugin-transform-inline-environment-variables (see + * babel.config.js) — there's no Expo-style EXPO_PUBLIC_* substitution in a + * bare React Native app, so this is the equivalent mechanism. + * + * Copy .env.example to .env and fill it in before running the app. + */ +/** + * Placeholder — this demo has no real hosted domain. Used both as the + * origin for Dynamic's embedded-wallet WebView (polyfills.ts's + * window.location shim) and as `metadata.universalLink` (dynamicClient.ts). + * Shared here so the two stay in sync automatically; replace with your + * app's actual domain in production. + */ +export const APP_ORIGIN = 'https://example.com'; +const BASE_CHAIN_ID = '8453'; +const BASE_USDC_ADDRESS = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; + +export const config = { + dynamic: { + /** Required. https://app.dynamic.xyz/dashboard/developer/api */ + environmentId: process.env.DYNAMIC_ENVIRONMENT_ID, + /** Optional. Empty/undefined lets the SDK use its own default (production). */ + apiBaseUrl: process.env.DYNAMIC_API_BASE_URL || undefined, + /** + * Sandbox-only Dynamic API key (flow.write scope) — see .env.example. + * Used directly by src/utils/createDepositFlow.ts and + * src/utils/createWithdrawFlow.ts to create Flows server-side. + */ + apiKey: process.env.DYNAMIC_API_KEY, + }, + /** String form — what Flow's own params (fromChainId/chainId) expect. */ + chainId: BASE_CHAIN_ID, + /** + * Numeric form of the same chain ID — what `getTokenBalances`'s + * `networkId` param expects (see VaultBalanceCard.tsx/WithdrawForm.tsx). + * Kept as a single derived constant rather than each call site writing + * its own `Number(config.chainId)`, so there's one place to get this + * right instead of two-plus copies that can drift out of sync. + */ + chainIdNumber: Number(BASE_CHAIN_ID), + usdcAddress: BASE_USDC_ADDRESS, +} as const; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/consts/flow.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/consts/flow.ts new file mode 100644 index 0000000..a02fe2b --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/consts/flow.ts @@ -0,0 +1,11 @@ +/** + * This settles real USDC on Base mainnet (see WithdrawalForm.tsx's original + * comment, now shared by DepositForm.tsx and WithdrawForm.tsx) — there's no + * testnet fallback, so a demo-appropriate cap is the only thing standing + * between a typo (e.g. "100" instead of "1.00") and an expensive mistake. + * Shared by both directions rather than given each its own limit: the same + * USDC/Base rail carries both, so there's no reason for one direction to be + * riskier than the other. Raise this if you actually need to test a larger + * amount. + */ +export const MAX_AMOUNT_USD = 5; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/consts/theme.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/consts/theme.ts new file mode 100644 index 0000000..d320378 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/consts/theme.ts @@ -0,0 +1,91 @@ +/** + * Colors/spacing lifted from flow.dynamic.dev's marketing pages (its + * `--brand-*` CSS custom properties and DM Sans typography) so this demo's + * UI reads as visually related to Dynamic's own Flow demo site. + * + * Caveat: flow.dynamic.dev's actual wallet-connect/quote/status widget is + * rendered client-side after the page hydrates, so its exact screens + * weren't inspectable — this is a best-effort approximation built from the + * site's marketing-page CSS and layout, not a pixel-exact clone. We also use + * the system sans-serif font rather than DM Sans itself: bare React Native + * needs the font file linked as a native asset to use a custom font, which + * felt like unnecessary weight for a demo app. + */ +export const colors = { + pageBackground: '#F4F5F7', + surface: '#FFFFFF', + foreground: '#0E121B', + foregroundSecondary: '#525866', + muted: '#99A0AE', + border: '#E1E4EA', + divider: '#F2F3F5', + accent: '#4779FF', + accentHover: '#2F61E8', + success: '#16A34A', + error: '#DC2626', + warning: '#F59E0B', + onAccent: '#FFFFFF', +} as const; + +export const spacing = { + xs: 4, + sm: 8, + md: 16, + lg: 24, + xl: 32, +} as const; + +export const radii = { + sm: 8, + md: 12, + lg: 16, + full: 999, +} as const; + +/** + * Font sizes/weights, extracted from what was already inlined per-component + * across the pre-redesign widgets rather than invented from scratch — + * existing screens migrating to these tokens should be a like-for-like swap, + * not a visual change. Precedents: `title` is the old App.tsx title + * (28/700), `label` is the form-label size used across Deposit/Withdraw + * (13/600). + */ +export const typography = { + title: { fontSize: 28, fontWeight: '700' }, + headline: { fontSize: 20, fontWeight: '700' }, + body: { fontSize: 15, fontWeight: '400' }, + bodyMedium: { fontSize: 15, fontWeight: '600' }, + label: { fontSize: 13, fontWeight: '600' }, + caption: { fontSize: 12, fontWeight: '400' }, +} as const; + +/** + * iOS shadow + Android elevation for surfaces that need to visually lift off + * pageBackground on the new full-bleed screens (e.g. a card floating over the + * page rather than being the entire page, as it was pre-redesign). RN doesn't + * unify the two platforms' shadow APIs, so each tier bundles both sets of + * properties — spread the whole tier into a style object on either platform. + */ +export const shadows = { + sm: { + shadowColor: '#0E121B', + shadowOffset: { width: 0, height: 1 }, + shadowOpacity: 0.06, + shadowRadius: 2, + elevation: 1, + }, + md: { + shadowColor: '#0E121B', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.08, + shadowRadius: 12, + elevation: 4, + }, + lg: { + shadowColor: '#0E121B', + shadowOffset: { width: 0, height: 12 }, + shadowOpacity: 0.12, + shadowRadius: 24, + elevation: 8, + }, +} as const; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/navigation.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/navigation.tsx new file mode 100644 index 0000000..97b38e9 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/navigation.tsx @@ -0,0 +1,70 @@ +/** + * Owns the app's screen-to-screen navigation via React Navigation's + * native-stack. Every screen renders its own Header (see + * components/Header.tsx) instead of native-stack's built-in one, hence + * `headerShown: false` below. + * + * There's no account model in this app — no login, no vault — so there's + * nothing to check before picking an initial screen beyond the Dynamic + * client itself finishing initialization. Until `useInitStatus()` reports + * `'finished'`, SplashView is rendered directly (not as a registered + * screen — there's nothing to navigate to yet). + */ +import { useInitStatus } from '@dynamic-labs-sdk/react-hooks'; +import { NavigationContainer } from '@react-navigation/native'; +import { + createNativeStackNavigator, + type NativeStackScreenProps, +} from '@react-navigation/native-stack'; +import { SplashView } from './views/SplashView'; +import { HomeRoute } from './routes/HomeRoute'; +import { DepositRoute } from './routes/DepositRoute'; +import { FlowStatusRoute } from './routes/FlowStatusRoute'; +import { WithdrawRoute } from './routes/WithdrawRoute'; + +export type RootStackParamList = { + Home: undefined; + Deposit: undefined; + Withdraw: undefined; + FlowStatus: { flowId: string; direction: 'deposit' | 'withdraw' }; +}; + +export type RouteProps = + NativeStackScreenProps; + +const Stack = createNativeStackNavigator(); + +export function Navigation() { + const { data: initStatus, error: initError } = useInitStatus(); + + // A distinct, unrecoverable-from-here state, checked before the loading + // check below — without this, a failed init (bad/unreachable environment + // config, offline cold boot) leaves the app stuck on the loading spinner + // indefinitely, since nothing else ever flips `initStatus` away from + // 'failed'. + if (initStatus === 'failed') { + return ( + + ); + } + + if (initStatus !== 'finished') { + return ; + } + + return ( + + + + + + + + + ); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/routes/DepositRoute.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/routes/DepositRoute.tsx new file mode 100644 index 0000000..603483b --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/routes/DepositRoute.tsx @@ -0,0 +1,155 @@ +/** + * Address + amount deposit: connect MetaMask inline on this screen, then + * MetaMask -> the typed destination address. Same create -> attach source -> + * quote -> submit sequence this app has always used for deposits, with the + * destination now a plain address the user types instead of a pre-existing + * vault's address. + */ +import { + attachFlowSource, + getFlowQuote, + submitFlowTransaction, +} from '@dynamic-labs-sdk/client'; +import type { EvmWalletAccount } from '@dynamic-labs-sdk/evm'; +import { useMutation } from '@tanstack/react-query'; +import { useState } from 'react'; +import { AddressAmountView } from '../views/AddressAmountView'; +import { config } from '../consts/config'; +import { MAX_AMOUNT_USD } from '../consts/flow'; +import { createDepositFlow } from '../utils/createDepositFlow'; +import { connectMetaMask } from '../utils/connectMetaMask'; +import { normalizeAmount } from '../utils/normalizeAmount'; +import { isValidAmount } from '../utils/isValidAmount'; +import type { RouteProps } from '../navigation'; + +type Step = + | 'idle' + | 'creating' + | 'attaching' + | 'quoting' + | 'awaiting-approval' + | 'error'; + +const BUSY_STEPS: ReadonlySet = new Set([ + 'creating', + 'attaching', + 'quoting', + 'awaiting-approval', +]); + +const STEP_LABELS: Partial> = { + creating: 'Creating deposit…', + attaching: 'Attaching your wallet…', + quoting: 'Getting a quote…', + 'awaiting-approval': 'Check your wallet to approve the transaction…', +}; + +export function DepositRoute({ navigation }: RouteProps<'Deposit'>) { + const [address, setAddress] = useState(''); + const [amount, setAmount] = useState(''); + const [connectedAccount, setConnectedAccount] = useState< + EvmWalletAccount | undefined + >(); + const [isConnecting, setIsConnecting] = useState(false); + const [connectError, setConnectError] = useState(); + const [step, setStep] = useState('idle'); + const [submitStepLabel, setSubmitStepLabel] = useState(null); + const isBusy = BUSY_STEPS.has(step); + const canSubmit = + !isBusy && address.trim().length > 0 && isValidAmount(amount, MAX_AMOUNT_USD); + + async function handleConnect() { + setIsConnecting(true); + setConnectError(undefined); + try { + setConnectedAccount(await connectMetaMask()); + } catch (e) { + setConnectError( + e instanceof Error ? e.message : 'Failed to connect wallet.', + ); + } finally { + setIsConnecting(false); + } + } + + const { + mutate: handleSubmit, + isPending: isSubmitting, + error, + } = useMutation({ + mutationFn: async ({ amount: submittedAmount }: { amount: string }) => { + if (!connectedAccount) { + // Unreachable in practice — canSubmit/the view only render the + // submit action once a wallet is connected. + throw new Error('Connect a wallet first.'); + } + + setSubmitStepLabel(null); + setStep('creating'); + + const normalizedAmount = normalizeAmount(submittedAmount); + + const flowId = await createDepositFlow({ + amount: normalizedAmount, + destinationAddress: address.trim(), + }); + + setStep('attaching'); + + await attachFlowSource({ + flowId, + sourceType: 'wallet', + fromAddress: connectedAccount.address, + fromChainId: config.chainId, + fromChainName: 'EVM', + }); + + setStep('quoting'); + + await getFlowQuote({ flowId }); + + setStep('awaiting-approval'); + + await submitFlowTransaction({ + flowId, + walletAccount: connectedAccount, + onStepChange: submitStep => { + if (submitStep === 'approval') { + setSubmitStepLabel('Check your wallet to approve the transaction…'); + } else if (submitStep === 'transaction') { + setSubmitStepLabel('Broadcasting transaction…'); + } + }, + }); + + navigation.replace('FlowStatus', { flowId, direction: 'deposit' }); + }, + onError: () => { + setStep('error'); + setSubmitStepLabel(null); + }, + }); + + return ( + handleSubmit({ amount })} + submitLabel="Deposit" + isSubmitting={isSubmitting} + canSubmit={canSubmit} + stepLabel={ + isSubmitting ? submitStepLabel ?? STEP_LABELS[step] : undefined + } + error={connectError ?? error?.message} + onBack={() => navigation.goBack()} + /> + ); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/routes/FlowStatusRoute.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/routes/FlowStatusRoute.tsx new file mode 100644 index 0000000..a88eb20 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/routes/FlowStatusRoute.tsx @@ -0,0 +1,261 @@ +/** + * Tracks a submitted Flow from broadcast through settlement — the "smart" + * half of the pre-redesign FlowStatusScreen.tsx, porting its polling/ + * derived-state logic (buildSteps, the execution/settlement/risk label + * maps, the isFailure-before-isComplete resolution order) to feed + * FlowStatusView's props instead of rendering its own markup. See + * FlowStatusView.tsx's own top-of-file comment for the full rationale + * behind each of these — this file only recomputes the *data*, not the + * reasoning; that lives with the view now. + */ +import type { + Flow, + FlowExecutionState, + FlowSettlementState, +} from '@dynamic-labs-sdk/client'; +import { useCancelFlow, useGetFlow } from '@dynamic-labs-sdk/react-hooks'; +import { FlowStatusView, type Step } from '../views/FlowStatusView'; +import type { RouteProps } from '../navigation'; + +const EXECUTION_ORDER: FlowExecutionState[] = [ + 'initiated', + 'source_attached', + 'quoted', + 'signing', + 'broadcasted', + 'source_confirmed', +]; + +const PRE_BROADCAST_STATES: FlowExecutionState[] = [ + 'initiated', + 'source_attached', + 'quoted', + 'signing', +]; + +const EXECUTION_LABELS: Record = { + initiated: 'Initiated', + source_attached: 'Wallet attached', + quoted: 'Quote received', + signing: 'Awaiting your signature', + broadcasted: 'Broadcast to Base', + source_confirmed: 'Source transaction confirmed', + cancelled: 'Cancelled', + expired: 'Expired', + failed: 'Failed', +}; + +const SETTLEMENT_LABELS: Record = { + none: 'Not started', + routing: 'Routing', + bridging: 'Bridging', + swapping: 'Swapping assets', + settling: 'Settling', + completed: 'Completed', + failed: 'Failed', +}; + +const RISK_LABELS: Record = { + unknown: 'Unknown', + pending: 'Screening in progress', + cleared: 'Cleared', + blocked: 'Blocked', + review: 'Under review', +}; + +const SETTLEMENT_STEP_DESCRIPTIONS: Record = { + none: 'Preparing to route your funds to the destination.', + routing: 'Routing your funds to the destination.', + bridging: 'Bridging your funds across chains.', + swapping: 'Swapping assets.', + settling: 'Finalizing the transfer.', + completed: 'Funds have landed.', + failed: 'Settlement failed.', +}; + +function buildSteps(flow: Flow, direction: 'deposit' | 'withdraw'): Step[] { + const execIndex = EXECUTION_ORDER.indexOf(flow.executionState); + const isBroadcasted = execIndex >= EXECUTION_ORDER.indexOf('broadcasted'); + const isSourceConfirmed = + execIndex >= EXECUTION_ORDER.indexOf('source_confirmed'); + const isSettlementStarted = flow.settlementState !== 'none'; + const isSettled = flow.settlementState === 'completed'; + + return [ + { + key: 'broadcast', + title: 'Broadcast to Base', + description: isBroadcasted + ? 'Sent to the Base network.' + : flow.executionState === 'signing' + ? 'Waiting for you to confirm in your wallet.' + : 'Preparing your transaction.', + status: isBroadcasted ? 'completed' : 'active', + }, + { + key: 'confirm', + title: 'Confirm on Base', + description: 'Waiting for the network to confirm your transaction.', + status: isSourceConfirmed + ? 'completed' + : isBroadcasted + ? 'active' + : 'pending', + }, + { + key: 'settle', + title: 'Convert & route', + description: SETTLEMENT_STEP_DESCRIPTIONS[flow.settlementState], + status: isSettled + ? 'completed' + : isSourceConfirmed || isSettlementStarted + ? 'active' + : 'pending', + }, + { + key: 'complete', + title: + direction === 'deposit' ? 'Deposit complete' : 'Withdrawal complete', + description: + direction === 'deposit' + ? 'USDC has landed at the destination address.' + : 'ETH has landed at the destination address.', + status: isSettled ? 'completed' : 'pending', + }, + ]; +} + +export function FlowStatusRoute({ + navigation, + route, +}: RouteProps<'FlowStatus'>) { + const { flowId, direction } = route.params; + const noun = direction === 'deposit' ? 'Deposit' : 'Withdrawal'; + + const { + data: flow, + isPending, + isError, + refetch, + error, + } = useGetFlow({ + flowId, + // Simple fixed 3s poll — this keeps polling even once the flow reaches + // a terminal state, unlike the previous refetchInterval callback that + // stopped polling there. Simplicity was chosen over that optimization + // here; a few extra background polls a terminal flow doesn't move on + // from is a fine trade-off for a demo app. + queryParams: { refetchInterval: 3000 }, + }); + + const { + mutate: cancelFlowMutate, + isPending: isCancelling, + error: cancelError, + } = useCancelFlow({ mutateParams: { onSuccess: () => refetch() } }); + + const onDone = () => + navigation.reset({ index: 0, routes: [{ name: 'Home' }] }); + + if (isPending) { + return ( + refetch()} + onGiveUp={onDone} + onDone={onDone} + /> + ); + } + + // Gated on `!flow`, not just `isError` — see FlowStatusView.tsx's + // top-of-file comment on why a transient background-poll error shouldn't + // blow away a perfectly healthy cached step list. + if (isError && !flow) { + const message = + error instanceof Error + ? error.message + : `Failed to load ${noun.toLowerCase()} status.`; + return ( + refetch()} + onGiveUp={onDone} + onDone={onDone} + /> + ); + } + + if (!flow) { + return null; + } + + const isFailure = + flow.executionState === 'cancelled' || + flow.executionState === 'expired' || + flow.executionState === 'failed' || + flow.settlementState === 'failed'; + const isComplete = !isFailure && flow.settlementState === 'completed'; + const isCancellable = PRE_BROADCAST_STATES.includes(flow.executionState); + + const failureTitle = + flow.executionState === 'cancelled' + ? `${noun} cancelled` + : flow.executionState === 'expired' + ? `${noun} expired` + : `${noun} failed`; + const isMutedFailure = + flow.executionState === 'cancelled' || flow.executionState === 'expired'; + const failureDescription = + flow.executionState === 'cancelled' + ? `You cancelled this ${noun.toLowerCase()} before it was broadcast.` + : flow.executionState === 'expired' + ? `This ${noun.toLowerCase()} timed out before it was broadcast. Start a new one from Home.` + : flow.failure?.message ?? + `Something went wrong processing this ${noun.toLowerCase()}.`; + const failureHint = + !isMutedFailure && flow.failure?.retryable + ? `This step can be retried — start a new ${noun.toLowerCase()} from Home.` + : undefined; + + return ( + refetch()} + onGiveUp={onDone} + riskState={flow.riskState} + isStale={isError} + isComplete={isComplete} + isFailure={isFailure} + failureTitle={failureTitle} + failureDescription={failureDescription} + failureHint={failureHint} + isMutedFailure={isMutedFailure} + steps={isComplete || isFailure ? undefined : buildSteps(flow, direction)} + isCancellable={isCancellable} + isCancelling={isCancelling} + cancelError={cancelError?.message} + onCancel={() => cancelFlowMutate({ flowId })} + details={{ + executionLabel: EXECUTION_LABELS[flow.executionState], + settlementLabel: SETTLEMENT_LABELS[flow.settlementState], + screeningLabel: RISK_LABELS[flow.riskState], + quoteLabel: flow.quote + ? `${flow.quote.fromAmount} → ${flow.quote.toAmount}${ + flow.quote.fees?.totalFeeUsd + ? ` (~$${flow.quote.fees.totalFeeUsd} fee)` + : '' + }` + : undefined, + flowId: flow.id, + sourceTxHash: flow.txHash ?? undefined, + destinationTxHash: flow.settlementTxHash ?? undefined, + }} + onDone={onDone} + /> + ); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/routes/HomeRoute.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/routes/HomeRoute.tsx new file mode 100644 index 0000000..ce23134 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/routes/HomeRoute.tsx @@ -0,0 +1,16 @@ +/** + * Home screen: just the two entry points, Deposit and Withdraw. No account + * model in this app anymore — no login, no vault, nothing to own or poll + * here, so this is a thin pass-through with no hooks of its own. + */ +import { HomeView } from '../views/HomeView'; +import type { RouteProps } from '../navigation'; + +export function HomeRoute({ navigation }: RouteProps<'Home'>) { + return ( + navigation.navigate('Deposit')} + onWithdraw={() => navigation.navigate('Withdraw')} + /> + ); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/routes/WithdrawRoute.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/routes/WithdrawRoute.tsx new file mode 100644 index 0000000..c1886d0 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/routes/WithdrawRoute.tsx @@ -0,0 +1,168 @@ +/** + * Address + amount withdrawal: connect MetaMask inline on this screen, then + * MetaMask -> the typed destination address — the reverse of DepositRoute's + * ETH-in/USDC-out. Paid in USDC from the connected wallet, settled as native + * ETH to the destination. Same create -> attach source -> quote -> submit + * sequence, with source/destination and the settled asset swapped. + * + * Replaces both the old vault-era gas-check hub (WithdrawRoute.tsx) and the + * amount-entry screen (WithdrawAmountRoute.tsx) — there's no vault gas to + * check anymore; MetaMask users cover their own gas the same way they + * already do signing the deposit. + */ +import { + attachFlowSource, + getFlowQuote, + submitFlowTransaction, +} from '@dynamic-labs-sdk/client'; +import type { EvmWalletAccount } from '@dynamic-labs-sdk/evm'; +import { useMutation } from '@tanstack/react-query'; +import { useState } from 'react'; +import { AddressAmountView } from '../views/AddressAmountView'; +import { config } from '../consts/config'; +import { MAX_AMOUNT_USD } from '../consts/flow'; +import { createWithdrawFlow } from '../utils/createWithdrawFlow'; +import { connectMetaMask } from '../utils/connectMetaMask'; +import { normalizeAmount } from '../utils/normalizeAmount'; +import { isValidAmount } from '../utils/isValidAmount'; +import type { RouteProps } from '../navigation'; + +type Step = + | 'idle' + | 'creating' + | 'attaching' + | 'quoting' + | 'awaiting-approval' + | 'error'; + +const BUSY_STEPS: ReadonlySet = new Set([ + 'creating', + 'attaching', + 'quoting', + 'awaiting-approval', +]); + +const STEP_LABELS: Partial> = { + creating: 'Creating withdrawal…', + attaching: 'Attaching your wallet…', + quoting: 'Getting a quote…', + 'awaiting-approval': 'Check your wallet to approve the transaction…', +}; + +export function WithdrawRoute({ navigation }: RouteProps<'Withdraw'>) { + const [address, setAddress] = useState(''); + const [amount, setAmount] = useState(''); + const [connectedAccount, setConnectedAccount] = useState< + EvmWalletAccount | undefined + >(); + const [isConnecting, setIsConnecting] = useState(false); + const [connectError, setConnectError] = useState(); + const [step, setStep] = useState('idle'); + const [submitStepLabel, setSubmitStepLabel] = useState(null); + const isBusy = BUSY_STEPS.has(step); + const canSubmit = + !isBusy && address.trim().length > 0 && isValidAmount(amount, MAX_AMOUNT_USD); + + async function handleConnect() { + setIsConnecting(true); + setConnectError(undefined); + try { + setConnectedAccount(await connectMetaMask()); + } catch (e) { + setConnectError( + e instanceof Error ? e.message : 'Failed to connect wallet.', + ); + } finally { + setIsConnecting(false); + } + } + + const { + mutate: handleSubmit, + isPending: isSubmitting, + error, + } = useMutation({ + mutationFn: async ({ amount: submittedAmount }: { amount: string }) => { + if (!connectedAccount) { + // Unreachable in practice — canSubmit/the view only render the + // submit action once a wallet is connected. + throw new Error('Connect a wallet first.'); + } + + setSubmitStepLabel(null); + setStep('creating'); + + const normalizedAmount = normalizeAmount(submittedAmount); + + const flowId = await createWithdrawFlow({ + amount: normalizedAmount, + destinationAddress: address.trim(), + }); + + setStep('attaching'); + + await attachFlowSource({ + flowId, + sourceType: 'wallet', + fromAddress: connectedAccount.address, + fromChainId: config.chainId, + fromChainName: 'EVM', + }); + + setStep('quoting'); + + // fromTokenAddress is what actually picks the connected wallet's + // paying asset — attachFlowSource's wallet-source params have no + // token field at all, so without this, getFlowQuote defaults to the + // chain's native token (ETH) regardless of what the wallet holds. + // This is the one thing that makes the connected wallet spend its + // USDC instead of its ETH gas — confirmed against Dynamic's own + // demo-dashboard reference (github.com/dynamic-labs-oss/demo-dashboard), + // whose withdraw flow passes this same param for exactly this reason. + await getFlowQuote({ flowId, fromTokenAddress: config.usdcAddress }); + + setStep('awaiting-approval'); + + await submitFlowTransaction({ + flowId, + walletAccount: connectedAccount, + onStepChange: submitStep => { + if (submitStep === 'approval') { + setSubmitStepLabel('Check your wallet to approve the transaction…'); + } else if (submitStep === 'transaction') { + setSubmitStepLabel('Broadcasting transaction…'); + } + }, + }); + + navigation.replace('FlowStatus', { flowId, direction: 'withdraw' }); + }, + onError: () => { + setStep('error'); + setSubmitStepLabel(null); + }, + }); + + return ( + handleSubmit({ amount })} + submitLabel="Withdraw" + isSubmitting={isSubmitting} + canSubmit={canSubmit} + stepLabel={ + isSubmitting ? submitStepLabel ?? STEP_LABELS[step] : undefined + } + error={connectError ?? error?.message} + onBack={() => navigation.goBack()} + /> + ); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/utils/connectMetaMask.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/connectMetaMask.ts new file mode 100644 index 0000000..193fbcf --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/connectMetaMask.ts @@ -0,0 +1,57 @@ +/** + * Connects MetaMask for exactly one operation — never persisted to + * Dynamic's wallet-account list (`addToDynamicWalletAccounts: false`). + * Uses Dynamic's own MetaMask SDK wrapper (a deep link, not the generic + * WalletConnect catalog, which this app no longer connects to at all). + * + * Deposit and Withdraw each call this fresh, with no "remember the last + * wallet" state of their own — but the MetaMask controller this wraps is a + * singleton cached for the app's entire lifetime + * (`getOrCreateMetaMaskEvmController`), and its `connect()` only resets a + * session it catches mid-"connecting"; an already-`"connected"` session is + * left alone. So a *second* connect within the same app run (no force-quit + * in between — e.g. Deposit, back to Home, then Withdraw) resolves against + * that still-live session without ever emitting a new `display_uri`, which + * `connectWithMetaMaskUriEvm` surfaces as `MetaMaskDisplayUriMissingError` + * instead of "already connected, here's the account" — there's no public + * API in this SDK version to force the underlying session closed first (see + * git history for why an earlier `discardEphemeralWallet.ts` was removed as + * a no-op). Since the wallet genuinely is still connected in that case, this + * reuses the last resolved account instead of surfacing that as a failure. + */ +import { appendConnectionUriToDeeplink } from '@dynamic-labs-sdk/client'; +import { + connectWithMetaMaskUriEvm, + MetaMaskDisplayUriMissingError, +} from '@dynamic-labs-sdk/evm/metamask'; +import type { EvmWalletAccount } from '@dynamic-labs-sdk/evm'; +import { Linking } from 'react-native'; +import { resolveWalletAccounts } from './resolveWalletAccounts'; + +const METAMASK_DEEPLINK = 'https://metamask.app.link/wc'; + +let lastConnectedAccount: EvmWalletAccount | undefined; + +export async function connectMetaMask(): Promise { + try { + const { uri, approval } = await connectWithMetaMaskUriEvm({ + addToDynamicWalletAccounts: false, + }); + const deeplink = appendConnectionUriToDeeplink({ + connectionUri: uri, + deeplinkUrl: METAMASK_DEEPLINK, + }); + Linking.openURL(deeplink); + const account = await resolveWalletAccounts(approval); + lastConnectedAccount = account; + return account; + } catch (error) { + if ( + error instanceof MetaMaskDisplayUriMissingError && + lastConnectedAccount + ) { + return lastConnectedAccount; + } + throw error; + } +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/utils/createDepositFlow.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/createDepositFlow.ts new file mode 100644 index 0000000..c0896fc --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/createDepositFlow.ts @@ -0,0 +1,60 @@ +import { config } from '../consts/config'; + +type CreateDepositFlowParams = { + /** Settlement amount in USD, e.g. "0.10". */ + amount: string; + /** The destination address — receives USDC. */ + destinationAddress: string; +}; + +/** + * Creates a Flow deposit: the connected external wallet pays in ETH on Base + * mainnet, settled as USDC to the destination address (`destinationAddress`). + * + * The process of creating your flow should be done from the backend so the + * Dynamic API token is not exposed to the client. This is just an example of + * how to do it from the client side. + */ +export const createDepositFlow = async ({ + amount, + destinationAddress, +}: CreateDepositFlowParams) => { + const res = await fetch( + `${config.dynamic.apiBaseUrl}/server/${config.dynamic.environmentId}/flow/deposit`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${config.dynamic.apiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + amount, + currency: 'USD', + settlementConfig: { + strategy: 'cheapest', + settlements: [ + { + chainName: 'EVM', + chainId: config.chainId, + symbol: 'USDC', + tokenAddress: config.usdcAddress, + tokenDecimals: 6, + }, + ], + }, + destinationConfig: { + destinations: [ + { + chainName: 'EVM', + type: 'address', + identifier: destinationAddress, + }, + ], + }, + }), + }, + ); + const { flow } = (await res.json()) as { flow: { id: string } }; + + return flow.id; +}; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/utils/createWithdrawFlow.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/createWithdrawFlow.ts new file mode 100644 index 0000000..b72eaec --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/createWithdrawFlow.ts @@ -0,0 +1,63 @@ +import { config } from '../consts/config'; + +type CreateWithdrawFlowParams = { + /** Settlement amount in USD, e.g. "0.10". */ + amount: string; + /** The destination wallet's address — receives native ETH. */ + destinationAddress: string; +}; + +/** + * Creates a Flow withdrawal: the connected external wallet pays in USDC, + * settled as native ETH on Base mainnet to the destination address + * (`destinationAddress`) — the reverse of createDepositFlow's + * ETH-in/USDC-out. + * + * The process of creating your flow should be done from the backend so the + * Dynamic API token is not exposed to the client. This is just an example of + * how to do it from the client side. + */ +export const createWithdrawFlow = async ({ + amount, + destinationAddress, +}: CreateWithdrawFlowParams) => { + const res = await fetch( + `${config.dynamic.apiBaseUrl}/server/${config.dynamic.environmentId}/flow/withdraw`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${config.dynamic.apiKey}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + amount, + currency: 'USD', + settlementConfig: { + strategy: 'cheapest', + settlements: [ + { + chainName: 'EVM', + chainId: config.chainId, + symbol: 'ETH', + tokenAddress: '0x0000000000000000000000000000000000000000', + tokenDecimals: 18, + isNative: true, + }, + ], + }, + destinationConfig: { + destinations: [ + { + chainName: 'EVM', + type: 'address', + identifier: destinationAddress, + }, + ], + }, + }), + }, + ); + const { flow } = (await res.json()) as { flow: { id: string } }; + + return flow.id; +}; diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/utils/isValidAmount.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/isValidAmount.ts new file mode 100644 index 0000000..2ab5a6c --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/isValidAmount.ts @@ -0,0 +1,15 @@ +/** + * Shared by DepositRoute and WithdrawRoute, both capped at MAX_AMOUNT_USD — + * `maxAmount` is the caller's job to derive, this just validates the string + * against it. + */ +import { normalizeAmount } from './normalizeAmount'; + +export function isValidAmount(value: string, maxAmount: number): boolean { + const normalized = normalizeAmount(value); + return ( + /^\d+(\.\d{1,2})?$/.test(normalized) && + Number(normalized) > 0 && + Number(normalized) <= maxAmount + ); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/utils/normalizeAmount.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/normalizeAmount.ts new file mode 100644 index 0000000..669f074 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/normalizeAmount.ts @@ -0,0 +1,9 @@ +/** + * `decimal-pad` renders whatever decimal separator the device's region uses + * (comma vs. period) — this normalizes either input to what `isValidAmount` + * and `Number()` expect. Ported verbatim from the pre-redesign + * DepositForm.tsx. + */ +export function normalizeAmount(value: string): string { + return value.replace(',', '.'); +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/utils/resolveWalletAccounts.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/resolveWalletAccounts.ts new file mode 100644 index 0000000..cc53f43 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/resolveWalletAccounts.ts @@ -0,0 +1,22 @@ +/** + * Used by connectMetaMask: MetaMask's connect flow resolves to + * `approval()` resolving `{ walletAccounts }` — a real, typed guarantee from + * the SDK (`WalletProviderUriConnectionResult`), not a coincidence this + * relies on informally. + */ +import { + isEvmWalletAccount, + type EvmWalletAccount, +} from '@dynamic-labs-sdk/evm'; +import type { WalletAccount } from '@dynamic-labs-sdk/client'; + +export async function resolveWalletAccounts( + approval: () => Promise<{ walletAccounts: WalletAccount[] }>, +): Promise { + const { walletAccounts } = await approval(); + const account = walletAccounts[0]; + if (!account || !isEvmWalletAccount(account)) { + throw new Error('Wallet connected, but no EVM account was returned.'); + } + return account; +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/utils/shortAddress.ts b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/shortAddress.ts new file mode 100644 index 0000000..a2bebea --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/utils/shortAddress.ts @@ -0,0 +1,4 @@ +/** `0x1234…abcd` — used anywhere a full address would be too wide to show. */ +export function shortAddress(address: string): string { + return `${address.slice(0, 6)}…${address.slice(-4)}`; +} diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/views/AddressAmountView.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/views/AddressAmountView.tsx new file mode 100644 index 0000000..c5eab47 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/views/AddressAmountView.tsx @@ -0,0 +1,203 @@ +/** + * Dumb, prop-driven address + amount entry view — shared shape for Deposit + * and Withdraw, which differ only in copy (title/hint) and in which side of + * the flow the connected MetaMask wallet plays (source for both, but paying + * a different asset). Replaces the old vault-era AmountView.tsx: this app no + * longer has a pre-known destination (the vault), so the destination address + * is now a plain text field on this same screen instead of something chosen + * on a separate ConnectWallet/picker screen. + * + * All flow mechanics (connect MetaMask, create -> attach source -> quote -> + * submit, validation, busy state) stay in the route that renders this — this + * component only knows about the two TextInputs, the hint/error text, and + * the action button, which reads "Connect with MetaMask" until a wallet is + * connected and then becomes the submit button in the same slot. + */ +import React from 'react'; +import { + InputAccessoryView, + Keyboard, + Platform, + StyleSheet, + Text, + TextInput, + View, +} from 'react-native'; +import { ErrorText } from '../components/ErrorText'; +import { Header } from '../components/Header'; +import { LinkButton } from '../components/LinkButton'; +import { PrimaryButton } from '../components/PrimaryButton'; +import { Screen } from '../components/Screen'; +import { colors, radii, spacing, typography } from '../consts/theme'; + +type Props = { + title: string; + hint: string; + address: string; + onChangeAddress: (value: string) => void; + amount: string; + onChangeAmount: (value: string) => void; + /** True once MetaMask is connected — swaps the action button from + * "Connect with MetaMask" to the submit action. */ + isWalletConnected: boolean; + isConnectingWallet: boolean; + onConnectWallet: () => void; + onSubmit: () => void; + submitLabel: string; + isSubmitting: boolean; + canSubmit: boolean; + stepLabel?: string; + error?: string; + amountErrorText?: string; + onBack: () => void; +}; + +// decimal-pad has no return key on iOS to hit "Done" with, so this pairs the +// amount field with its own accessory toolbar above the keyboard as the way +// to dismiss it — same pattern as the old AmountView.tsx, just under this +// view's own nativeID so the two never collide if both somehow mounted at +// once. +const AMOUNT_INPUT_ACCESSORY_ID = 'address-amount-view-done'; + +export function AddressAmountView({ + title, + hint, + address, + onChangeAddress, + amount, + onChangeAmount, + isWalletConnected, + isConnectingWallet, + onConnectWallet, + onSubmit, + submitLabel, + isSubmitting, + canSubmit, + stepLabel, + error, + amountErrorText, + onBack, +}: Props) { + const isBusy = isConnectingWallet || isSubmitting; + + return ( + + {/* onBack is withheld while busy, same rule the old AmountView used — + * the Header's Back is the only way out of this screen, so it has to + * carry the "can't leave mid-connect/mid-submit" rule itself. */} +
+ + Destination address + + + Amount (USD) + + {Platform.OS === 'ios' ? ( + + + + + + ) : null} + + {hint} + + {amountErrorText ? ( + + {amountErrorText} + + ) : null} + + {isWalletConnected ? ( + + ) : ( + + )} + + {isSubmitting && stepLabel ? ( + {stepLabel} + ) : null} + {error ? {error} : null} + + ); +} + +const styles = StyleSheet.create({ + label: { + ...typography.label, + color: colors.foregroundSecondary, + marginBottom: spacing.xs, + }, + input: { + ...typography.body, + borderWidth: 1, + borderColor: colors.border, + borderRadius: radii.md, + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm, + color: colors.foreground, + marginBottom: spacing.md, + }, + hint: { + ...typography.caption, + color: colors.foregroundSecondary, + lineHeight: 17, + marginBottom: spacing.md, + }, + amountErrorSpaced: { + marginTop: -spacing.sm, + marginBottom: spacing.md, + }, + stepLabel: { + ...typography.caption, + color: colors.foregroundSecondary, + marginTop: spacing.sm, + textAlign: 'center', + }, + accessoryBar: { + flexDirection: 'row', + justifyContent: 'flex-end', + backgroundColor: colors.surface, + borderTopWidth: 1, + borderTopColor: colors.border, + paddingHorizontal: spacing.lg, + paddingVertical: spacing.sm, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/views/FlowStatusView.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/views/FlowStatusView.tsx new file mode 100644 index 0000000..dc369d3 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/views/FlowStatusView.tsx @@ -0,0 +1,657 @@ +/** + * Dumb, prop-driven port of FlowStatusScreen.tsx's presentational half — the + * step list, risk banner, complete/failure summaries, and collapsible + * technical-details block, with every place that used to read `flow` + * directly (or react-query's isPending/isError/error/isCancelling/ + * cancelError) now reading the equivalent value from props instead. The + * route/widget that renders this owns useGetFlow/useCancelFlow and all the + * derived-state computation (buildSteps, isFailure/isComplete resolution, + * the failure title/description/hint strings, the technical-details label + * strings) — this view has no @dynamic-labs-sdk/react-hooks or react-query + * import at all, only a type-only import of FlowRiskState for prop typing. + * + * `showDetails` is the one exception to "props are the only state": it's + * pure UI toggle state with no bearing on any business logic, so — exactly + * like the original FlowStatusScreen.tsx — it stays a local useState here + * rather than being lifted to the caller. + * + * Branch order mirrors the original exactly: isLoading -> loadError (full + * takeover, only when there's truly nothing cached) -> isFailure -> isComplete + * -> otherwise (in-progress step list). See FlowStatusScreen.tsx's top-of-file + * comment for why isFailure is resolved before isComplete, and why the + * loadError takeover is gated on "nothing to show" rather than plain isError. + */ +import type { FlowRiskState } from '@dynamic-labs-sdk/client'; +import Clipboard from '@react-native-clipboard/clipboard'; +import React, { useEffect, useRef, useState } from 'react'; +import { ActivityIndicator, StyleSheet, Text, View } from 'react-native'; +import { CopyButton } from '../components/CopyButton'; +import { ErrorText } from '../components/ErrorText'; +import { Header } from '../components/Header'; +import { AlertCircleIcon, CheckCircleIcon } from '../components/icons'; +import { LinkButton } from '../components/LinkButton'; +import { PrimaryButton } from '../components/PrimaryButton'; +import { Screen } from '../components/Screen'; +import { SecondaryButton } from '../components/SecondaryButton'; +import { colors, radii, spacing, typography } from '../consts/theme'; + +export type StepStatus = 'completed' | 'active' | 'pending'; + +export type Step = { + key: string; + title: string; + description: string; + status: StepStatus; +}; + +export type Details = { + executionLabel: string; + settlementLabel: string; + screeningLabel: string; + quoteLabel?: string; + flowId: string; + sourceTxHash?: string; + destinationTxHash?: string; +}; + +type Props = { + direction: 'deposit' | 'withdraw'; + /** Mirrors FlowStatusScreen.tsx's `isPending` (react-query's initial-load + * state, not a mutation's). */ + isLoading: boolean; + /** Set ONLY when there's truly nothing cached to show (mirrors + * FlowStatusScreen.tsx's `isError && !flow` branch) — the full-page error + * takeover. */ + loadError?: string; + onRetryLoad: () => void; + onGiveUp: () => void; + + // The rest are present once loaded (isLoading === false && !loadError): + riskState?: FlowRiskState; + /** Mirrors the `isError` (but WITH a cached flow present) inline "stale" + * notice. */ + isStale?: boolean; + isComplete?: boolean; + isFailure?: boolean; + failureTitle?: string; + failureDescription?: string; + failureHint?: string; + isMutedFailure?: boolean; + /** Only meaningful when !isComplete && !isFailure — the in-progress step + * list. */ + steps?: Step[]; + isCancellable?: boolean; + isCancelling?: boolean; + cancelError?: string; + onCancel?: () => void; + details?: Details; + onDone: () => void; +}; + +function shortHash(hash: string): string { + return `${hash.slice(0, 8)}…${hash.slice(-6)}`; +} + +function StepIcon({ status }: { status: StepStatus }) { + if (status === 'completed') { + return ; + } + if (status === 'active') { + return ( + + + + ); + } + return ; +} + +function StepRow({ step, isLast }: { step: Step; isLast: boolean }) { + return ( + + + + {!isLast ? ( + + ) : null} + + + + {step.title} + + {step.description} + + + ); +} + +function RiskBanner({ riskState }: { riskState?: FlowRiskState }) { + if (riskState !== 'blocked' && riskState !== 'review') { + return null; + } + const isBlocked = riskState === 'blocked'; + return ( + + + {isBlocked + ? 'This transfer was blocked during compliance screening. Contact support for help.' + : 'This transfer is under manual compliance review — this can take longer than usual.'} + + + ); +} + +/** Small "Copy" button with transient "Copied!" feedback. */ +function CopyRow({ label, value }: { label: string; value: string }) { + const [justCopied, setJustCopied] = useState(false); + const timeoutRef = useRef | null>(null); + + useEffect(() => { + return () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + }; + }, []); + + return ( + + + {label} + + {value.length > 20 ? shortHash(value) : value} + + + { + Clipboard.setString(value); + setJustCopied(true); + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + } + timeoutRef.current = setTimeout(() => setJustCopied(false), 1500); + }} + /> + + ); +} + +function TechnicalDetails({ details }: { details: Details }) { + return ( + + + + Execution + {details.executionLabel} + + + Settlement + {details.settlementLabel} + + + Screening + {details.screeningLabel} + + {details.quoteLabel ? ( + + Quote + {details.quoteLabel} + + ) : null} + + + {details.sourceTxHash ? ( + + ) : null} + {details.destinationTxHash ? ( + + ) : null} + + ); +} + +function DetailsToggle({ + expanded, + onToggle, +}: { + expanded: boolean; + onToggle: () => void; +}) { + return ( + + + + ); +} + +function CompleteSummary({ + direction, + onDone, +}: { + direction: 'deposit' | 'withdraw'; + onDone: () => void; +}) { + const noun = direction === 'deposit' ? 'Deposit' : 'Withdrawal'; + return ( + + + {`${noun} complete`} + + {direction === 'deposit' + ? 'USDC has landed at the destination address.' + : 'ETH has landed at the destination address.'} + + + + ); +} + +function FailureSummary({ + title, + description, + hint, + isMuted, + onDone, +}: { + title: string; + description: string; + hint?: string; + isMuted: boolean; + onDone: () => void; +}) { + return ( + + + + {title} + + {description} + {!isMuted && hint ? {hint} : null} + + + ); +} + +export function FlowStatusView({ + direction, + isLoading, + loadError, + onRetryLoad, + onGiveUp, + riskState, + isStale, + isComplete, + isFailure, + failureTitle, + failureDescription, + failureHint, + isMutedFailure, + steps, + isCancellable, + isCancelling, + cancelError, + onCancel, + details, + onDone, +}: Props) { + const [showDetails, setShowDetails] = useState(false); + const noun = direction === 'deposit' ? 'Deposit' : 'Withdrawal'; + + // No onBack on any branch below: mid-flight this isn't cancelable via a + // header back button (matches the original's behavior of no navigation + // away at all while in-progress) — the in-progress branch's own Cancel + // link and the terminal branches' "Back to Home" button are the only + // ways off this screen, same as before this Header existed. + const headerTitle = `${noun} status`; + + if (isLoading) { + return ( + +
+ + + Loading {noun.toLowerCase()} status… + + + ); + } + + if (loadError) { + return ( + +
+ Couldn't load status + {loadError} + + + + ); + } + + if (isFailure) { + return ( + +
+ + + setShowDetails(v => !v)} + /> + {showDetails && details ? : null} + + ); + } + + if (isComplete) { + return ( + +
+ + + setShowDetails(v => !v)} + /> + {showDetails && details ? : null} + + ); + } + + const inProgressSteps = steps ?? []; + + return ( + +
+ + {isStale ? ( + + + Couldn't refresh the latest status — showing the last known state. + + + ) : null} + {`${noun} in progress`} + + + {inProgressSteps.map((step, index) => ( + + ))} + + + {isCancellable ? ( + + {cancelError ? ( + {cancelError} + ) : null} + onCancel?.()} + /> + + ) : null} + + setShowDetails(v => !v)} + /> + {showDetails && details ? : null} + + + This updates automatically every few seconds — you can leave and come + back to this app while it's in progress. + + + ); +} + +const styles = StyleSheet.create({ + centered: { + alignItems: 'center', + paddingVertical: spacing.lg, + }, + title: { + fontSize: 18, + fontWeight: '700', + color: colors.foreground, + marginBottom: spacing.md, + }, + stepsBlock: { + marginBottom: spacing.sm, + }, + stepRow: { + flexDirection: 'row', + }, + stepIconColumn: { + width: 24, + alignItems: 'center', + }, + stepConnector: { + width: 2, + flex: 1, + minHeight: 20, + marginTop: spacing.xs, + backgroundColor: colors.border, + }, + stepConnectorActive: { + backgroundColor: colors.success, + }, + activeIconWrap: { + width: 24, + height: 24, + alignItems: 'center', + justifyContent: 'center', + }, + pendingDot: { + width: 12, + height: 12, + borderRadius: radii.full, + marginTop: 6, + backgroundColor: colors.divider, + borderWidth: 2, + borderColor: colors.border, + }, + stepTextColumn: { + flex: 1, + marginLeft: spacing.md, + paddingBottom: spacing.lg, + }, + stepTitle: { + ...typography.bodyMedium, + color: colors.foreground, + }, + stepTitleMuted: { + color: colors.foregroundSecondary, + }, + stepDescription: { + fontSize: 13, + color: colors.foregroundSecondary, + marginTop: 2, + }, + riskBanner: { + borderRadius: radii.md, + borderWidth: 1, + padding: spacing.md, + marginBottom: spacing.md, + }, + riskBannerBlocked: { + backgroundColor: 'rgba(220, 38, 38, 0.08)', + borderColor: colors.error, + }, + riskBannerReview: { + backgroundColor: 'rgba(245, 158, 11, 0.1)', + borderColor: colors.warning, + }, + riskBannerText: { + ...typography.label, + color: colors.foreground, + }, + staleNotice: { + borderRadius: radii.md, + borderWidth: 1, + borderColor: colors.border, + backgroundColor: colors.divider, + padding: spacing.sm, + marginBottom: spacing.md, + }, + staleNoticeText: { + fontSize: 12, + color: colors.foregroundSecondary, + }, + cancelRow: { + marginBottom: spacing.md, + }, + detailsToggleRow: { + marginTop: spacing.sm, + marginBottom: spacing.xs, + }, + detailsBlock: { + marginTop: spacing.xs, + }, + divider: { + height: 1, + backgroundColor: colors.divider, + marginBottom: spacing.md, + }, + detailRow: { + flexDirection: 'row', + justifyContent: 'space-between', + paddingVertical: spacing.xs, + }, + detailLabel: { + fontSize: 13, + color: colors.foregroundSecondary, + }, + detailValue: { + ...typography.label, + color: colors.foreground, + flexShrink: 1, + textAlign: 'right', + marginLeft: spacing.md, + }, + copyRow: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: spacing.sm, + }, + copyRowText: { + flex: 1, + marginRight: spacing.sm, + }, + copyRowLabel: { + fontSize: 12, + color: colors.foregroundSecondary, + }, + copyRowValue: { + fontSize: 14, + fontWeight: '600', + color: colors.foreground, + }, + summaryCentered: { + alignItems: 'center', + paddingVertical: spacing.lg, + }, + summaryTitle: { + fontSize: 18, + fontWeight: '700', + color: colors.foreground, + marginTop: spacing.md, + }, + summaryTitleMuted: { + color: colors.foregroundSecondary, + }, + summaryDescription: { + fontSize: 14, + color: colors.foregroundSecondary, + textAlign: 'center', + marginTop: spacing.xs, + paddingHorizontal: spacing.md, + }, + summaryHint: { + fontSize: 12, + color: colors.foregroundSecondary, + textAlign: 'center', + marginTop: spacing.sm, + paddingHorizontal: spacing.md, + }, + summaryButton: { + marginTop: spacing.lg, + alignSelf: 'stretch', + }, + hint: { + fontSize: 12, + color: colors.foregroundSecondary, + lineHeight: 17, + marginTop: spacing.md, + }, + doneButton: { + marginTop: spacing.md, + }, + errorTitle: { + fontSize: 16, + fontWeight: '700', + color: colors.error, + marginBottom: spacing.xs, + }, + errorTextSpaced: { + marginBottom: spacing.md, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/views/HomeView.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/views/HomeView.tsx new file mode 100644 index 0000000..d5387d6 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/views/HomeView.tsx @@ -0,0 +1,60 @@ +/** + * Home screen: a title and two buttons, Deposit and Withdraw. This app has + * no account/vault to show a balance or address for anymore — it's a pure + * "connect MetaMask and move USDC on Base" demo, so Home is just the two + * entry points. Purely prop-driven, no hooks — HomeRoute wires the two + * callbacks straight to navigation. + */ +import React from 'react'; +import { StyleSheet, Text, View } from 'react-native'; +import { Screen } from '../components/Screen'; +import { Header } from '../components/Header'; +import { PrimaryButton } from '../components/PrimaryButton'; +import { SecondaryButton } from '../components/SecondaryButton'; +import { spacing, typography, colors } from '../consts/theme'; + +type HomeViewProps = { + onDeposit: () => void; + onWithdraw: () => void; +}; + +export function HomeView({ onDeposit, onWithdraw }: HomeViewProps) { + return ( + +
+ + + + Connect MetaMask to deposit or withdraw USDC on Base. + + + + + + + ); +} + +const styles = StyleSheet.create({ + body: { + flex: 1, + justifyContent: 'center', + }, + hint: { + ...typography.body, + color: colors.foregroundSecondary, + textAlign: 'center', + marginBottom: spacing.xl, + }, + actionSpacing: { + marginTop: spacing.md, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/src/views/SplashView.tsx b/examples/bare-react-native-with-js-sdk-and-flow/src/views/SplashView.tsx new file mode 100644 index 0000000..e0c2073 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/src/views/SplashView.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import { ActivityIndicator, StyleSheet, Text, View } from 'react-native'; +import { Screen } from '../components/Screen'; +import { ErrorText } from '../components/ErrorText'; +import { AlertCircleIcon } from '../components/icons'; +import { colors, spacing, typography } from '../consts/theme'; + +type Props = { + /** e.g. "Checking your session…" — optional, a bare spinner is fine + * without it. Ignored once `error` is set. */ + message?: string; + /** Set when the Dynamic client itself failed to initialize (bad/ + * unreachable environment config, offline cold boot) — a distinct, + * unrecoverable-from-here state, not just "still loading." There's no + * SDK-exposed way to retry initialization itself (it runs once at client + * creation), so this has no Retry button — telling the user plainly what + * happened, rather than offering a button with nothing real to call, is + * the more honest failure mode. */ + error?: string; +}; + +/** + * The very first thing the app can render, before it's even known whether + * there's a session to resume — deliberately minimal: no Header, no back + * button, no cancel action, since there's nothing yet to go back to or + * cancel out of. + */ +export function SplashView({ message, error }: Props) { + return ( + + + {error ? ( + <> + + Couldn't start the app + {error} + + ) : ( + <> + + {message ? {message} : null} + + )} + + + ); +} + +const styles = StyleSheet.create({ + centered: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: spacing.md, + }, + message: { + color: colors.foregroundSecondary, + marginTop: spacing.md, + ...typography.body, + }, + errorTitle: { + color: colors.foreground, + marginTop: spacing.md, + textAlign: 'center', + ...typography.headline, + }, + errorText: { + textAlign: 'center', + marginTop: spacing.xs, + }, +}); diff --git a/examples/bare-react-native-with-js-sdk-and-flow/tsconfig.json b/examples/bare-react-native-with-js-sdk-and-flow/tsconfig.json new file mode 100644 index 0000000..b39e658 --- /dev/null +++ b/examples/bare-react-native-with-js-sdk-and-flow/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@react-native/typescript-config", + "compilerOptions": { + // @react-native/typescript-config hardcodes ["jest"] here — this app + // has no tests, so the jest package (and its ambient types) aren't + // installed at all. + "types": [] + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["**/node_modules", "**/Pods"] +} diff --git a/examples/rn-moneygram-ramp/pnpm-lock.yaml b/examples/rn-moneygram-ramp/pnpm-lock.yaml index a7cacc5..f5613ea 100644 --- a/examples/rn-moneygram-ramp/pnpm-lock.yaml +++ b/examples/rn-moneygram-ramp/pnpm-lock.yaml @@ -593,16 +593,16 @@ packages: engines: {node: '>=6.9.0'} '@dynamic-labs-sdk/assert-package-version@0.26.9': - resolution: {integrity: sha512-hB9VvQOhE9j2EHAQfv7LCoLH8+DQXzYveHbsEK5dlU3BB4FoZTdJEU2SEH34q+g7Hyz3Nb+ioc5//jrr/tb39w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-sdk/assert-package-version/-/assert-package-version-0.26.9.tgz} + resolution: {integrity: sha512-hB9VvQOhE9j2EHAQfv7LCoLH8+DQXzYveHbsEK5dlU3BB4FoZTdJEU2SEH34q+g7Hyz3Nb+ioc5//jrr/tb39w==, tarball: https://registry.npmjs.org/@dynamic-labs-sdk/assert-package-version/-/assert-package-version-0.26.9.tgz} '@dynamic-labs-sdk/client@0.26.9': - resolution: {integrity: sha512-ubdqCkyiER9Ruc63E4IomvsOMMzSjGbFNeGnn3hIipzamPslrlAO9YTcU50qJEFioMneA2iJ00kbSBx+1VWHmw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-sdk/client/-/client-0.26.9.tgz} + resolution: {integrity: sha512-ubdqCkyiER9Ruc63E4IomvsOMMzSjGbFNeGnn3hIipzamPslrlAO9YTcU50qJEFioMneA2iJ00kbSBx+1VWHmw==, tarball: https://registry.npmjs.org/@dynamic-labs-sdk/client/-/client-0.26.9.tgz} '@dynamic-labs-wallet/browser-wallet-client@0.0.325': - resolution: {integrity: sha512-niU6U2OPNg0aPMpQ+yqoTFYayKoRpLSxQg56mKHWM9RmbilGH5jHWXH3mEAVGS7u5YEAuZDnnCavBdWYSBsK5Q==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/browser-wallet-client/-/browser-wallet-client-0.0.325.tgz} + resolution: {integrity: sha512-niU6U2OPNg0aPMpQ+yqoTFYayKoRpLSxQg56mKHWM9RmbilGH5jHWXH3mEAVGS7u5YEAuZDnnCavBdWYSBsK5Q==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/browser-wallet-client/-/browser-wallet-client-0.0.325.tgz} '@dynamic-labs-wallet/browser-wallet-client@0.0.337': - resolution: {integrity: sha512-0fZyXUfiZf/mPvvWl+kI4NqUAddWT18dWPRoM08xDUMZ8wGJmyWgD0MeqyJjHV92CV2by2cV+TRcEK3gnaf1sQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/browser-wallet-client/-/browser-wallet-client-0.0.337.tgz} + resolution: {integrity: sha512-0fZyXUfiZf/mPvvWl+kI4NqUAddWT18dWPRoM08xDUMZ8wGJmyWgD0MeqyJjHV92CV2by2cV+TRcEK3gnaf1sQ==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/browser-wallet-client/-/browser-wallet-client-0.0.337.tgz} '@dynamic-labs-wallet/browser@0.0.167': resolution: {integrity: sha512-HDmUetnJ1iz6kGd5PB1kJzeLI7ZJmwxlJ1QGtUqSQHDdBkhLwaDPlccB2IviC5iPfU5PR/IQ1BYEqpoTWx2sBA==} @@ -611,7 +611,7 @@ packages: resolution: {integrity: sha512-Vwi4CFMjSiLsPF4VUlYV4F87xaQrgnmUVUVx3b5F0I5DbFsGLafiSl2T/dlsOeNuRAhbpDMU4MEB4oOxzR0kYQ==} '@dynamic-labs-wallet/browser@0.0.259': - resolution: {integrity: sha512-wvsfzFDFiXx+LnELExFkbakzyewreZl9VvpaXrwTpzDrDFQHQE081CwyMHLHxZetFzE10L23fyKOrjSAaJuQuw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs-wallet/browser/-/@dynamic-labs-wallet/browser-0.0.259.tgz} + resolution: {integrity: sha512-wvsfzFDFiXx+LnELExFkbakzyewreZl9VvpaXrwTpzDrDFQHQE081CwyMHLHxZetFzE10L23fyKOrjSAaJuQuw==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/browser/-/@dynamic-labs-wallet/browser-0.0.259.tgz} '@dynamic-labs-wallet/core@0.0.167': resolution: {integrity: sha512-jEHD/mDfnqx2/ML/MezY725uPPrKGsGoR3BaS1JNITGIitai1gPEgaEMqbXIhzId/m+Xieb8ZrLDiaYYJcXcyQ==} @@ -620,80 +620,80 @@ packages: resolution: {integrity: sha512-1ykOANTDCPPaIpajpKqRxfISGYrmiMs7WMZQzdzRkTLftpnatgycYjdZrX9adhE1kY9BMrPdhfYaaE5B9wbFbQ==} '@dynamic-labs-wallet/core@0.0.259': - resolution: {integrity: sha512-q9QhQ30CU1IwJgSQ4jvoX3ltWBnvoomsPIjn8K3+vhW/Js6zIeTB0mQ0M0m/NQSbms3E16XstzSnAkiXcSTvow==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs-wallet/core/-/@dynamic-labs-wallet/core-0.0.259.tgz} + resolution: {integrity: sha512-q9QhQ30CU1IwJgSQ4jvoX3ltWBnvoomsPIjn8K3+vhW/Js6zIeTB0mQ0M0m/NQSbms3E16XstzSnAkiXcSTvow==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/core/-/@dynamic-labs-wallet/core-0.0.259.tgz} '@dynamic-labs-wallet/core@0.0.325': - resolution: {integrity: sha512-kWlCPMjHVBwiKyWUYrQrsgfTL2Mszsk1acjxJqfsWJucfgOxp432uO5XHGivosu3T1hfGNBNyKK6bChy3gL9Nw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs-wallet/core/-/@dynamic-labs-wallet/core-0.0.325.tgz} + resolution: {integrity: sha512-kWlCPMjHVBwiKyWUYrQrsgfTL2Mszsk1acjxJqfsWJucfgOxp432uO5XHGivosu3T1hfGNBNyKK6bChy3gL9Nw==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/core/-/@dynamic-labs-wallet/core-0.0.325.tgz} peerDependencies: '@dynamic-labs-wallet/forward-mpc-client': 0.5.5 '@dynamic-labs-wallet/core@0.0.337': - resolution: {integrity: sha512-csS/Xqx9kERTYLzt7BXHkaIBX8WIfUIDC3R0Yv6fweWdRL+6KX0A6lRUN1lajAF9/7d6XhxVzS/C3umS0qd7JQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs-wallet/core/-/@dynamic-labs-wallet/core-0.0.337.tgz} + resolution: {integrity: sha512-csS/Xqx9kERTYLzt7BXHkaIBX8WIfUIDC3R0Yv6fweWdRL+6KX0A6lRUN1lajAF9/7d6XhxVzS/C3umS0qd7JQ==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/core/-/@dynamic-labs-wallet/core-0.0.337.tgz} peerDependencies: '@dynamic-labs-wallet/forward-mpc-client': 0.9.0 '@dynamic-labs-wallet/forward-mpc-client@0.1.3': - resolution: {integrity: sha512-riZesfU41fMvetaxJ3bO48/9P8ikRPgoVJgWh8m8i0oRyYN7uUz+Iesp+52U12DCtcvSTXljxrKtrV3yqNAYRw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/forward-mpc-client/-/forward-mpc-client-0.1.3.tgz} + resolution: {integrity: sha512-riZesfU41fMvetaxJ3bO48/9P8ikRPgoVJgWh8m8i0oRyYN7uUz+Iesp+52U12DCtcvSTXljxrKtrV3yqNAYRw==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/forward-mpc-client/-/forward-mpc-client-0.1.3.tgz} '@dynamic-labs-wallet/forward-mpc-client@0.2.0': - resolution: {integrity: sha512-zkn5eYPPkjOFRi8POHXM+rl2lW+0AKjqiKPdNYmJieegI8PuXqq9Q0UzVWISwzpqmMX4/nQmK+9cqbPDW9Lu6A==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/forward-mpc-client/-/forward-mpc-client-0.2.0.tgz} + resolution: {integrity: sha512-zkn5eYPPkjOFRi8POHXM+rl2lW+0AKjqiKPdNYmJieegI8PuXqq9Q0UzVWISwzpqmMX4/nQmK+9cqbPDW9Lu6A==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/forward-mpc-client/-/forward-mpc-client-0.2.0.tgz} '@dynamic-labs-wallet/forward-mpc-client@0.5.5': - resolution: {integrity: sha512-O2qu7C6dLyImsEsuKtypXw6sTQ6Z5JoDle0sSDjEtcrUmlyJZBq0Bbf4gveNFkvB9Ra6dKG5V4RpK2V6vi0oKw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/forward-mpc-client/-/forward-mpc-client-0.5.5.tgz} + resolution: {integrity: sha512-O2qu7C6dLyImsEsuKtypXw6sTQ6Z5JoDle0sSDjEtcrUmlyJZBq0Bbf4gveNFkvB9Ra6dKG5V4RpK2V6vi0oKw==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/forward-mpc-client/-/forward-mpc-client-0.5.5.tgz} '@dynamic-labs-wallet/forward-mpc-client@0.9.0': - resolution: {integrity: sha512-gotV/RnPTJmjosddbZU6L9Rgs6WEJRwNX/VO7v+0JKyyuzIZPvjA2wJLto9EVEiNMCKMES2a+VY39rEqcGNHCg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/forward-mpc-client/-/forward-mpc-client-0.9.0.tgz} + resolution: {integrity: sha512-gotV/RnPTJmjosddbZU6L9Rgs6WEJRwNX/VO7v+0JKyyuzIZPvjA2wJLto9EVEiNMCKMES2a+VY39rEqcGNHCg==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/forward-mpc-client/-/forward-mpc-client-0.9.0.tgz} peerDependencies: '@dynamic-labs-wallet/primitives': '>=0.0.336 || 0.0.1' '@dynamic-labs-wallet/forward-mpc-shared@0.1.0': - resolution: {integrity: sha512-xRpMri4+ZuClonwf04RcnT/BCG8oA36ononD7s0MA5wSqd8kOuHjzNTSoM6lWnPiCmlpECyPARJ1CEO02Sfq9Q==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/forward-mpc-shared/-/forward-mpc-shared-0.1.0.tgz} + resolution: {integrity: sha512-xRpMri4+ZuClonwf04RcnT/BCG8oA36ononD7s0MA5wSqd8kOuHjzNTSoM6lWnPiCmlpECyPARJ1CEO02Sfq9Q==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/forward-mpc-shared/-/forward-mpc-shared-0.1.0.tgz} '@dynamic-labs-wallet/forward-mpc-shared@0.2.0': - resolution: {integrity: sha512-2I8NoCBVT9/09o4+M78S2wyY9jVXAb6RKt5Bnh1fhvikuB11NBeswtfZLns3wAFQxayApe31Jhamd4D2GR+mtw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/forward-mpc-shared/-/forward-mpc-shared-0.2.0.tgz} + resolution: {integrity: sha512-2I8NoCBVT9/09o4+M78S2wyY9jVXAb6RKt5Bnh1fhvikuB11NBeswtfZLns3wAFQxayApe31Jhamd4D2GR+mtw==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/forward-mpc-shared/-/forward-mpc-shared-0.2.0.tgz} '@dynamic-labs-wallet/forward-mpc-shared@0.5.1': - resolution: {integrity: sha512-ekfuJV7Q861ElqeeOCKO1kNGE+32+xM9azka7BxOLr3XeBPQz3H/wjcEX8YWqOUqeAcYMRc4QbBKR7ouTgsFSQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/forward-mpc-shared/-/forward-mpc-shared-0.5.1.tgz} + resolution: {integrity: sha512-ekfuJV7Q861ElqeeOCKO1kNGE+32+xM9azka7BxOLr3XeBPQz3H/wjcEX8YWqOUqeAcYMRc4QbBKR7ouTgsFSQ==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/forward-mpc-shared/-/forward-mpc-shared-0.5.1.tgz} '@dynamic-labs-wallet/forward-mpc-shared@0.7.0': - resolution: {integrity: sha512-mN6zT5J8JbZxkOJxEjgGrjURybVn/t9DD+pWW5U4DRZH6Qakn5n1LIB4Lg4Y7OW9WwrlMH2IJ9RNgBW35RaF1A==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs-wallet/forward-mpc-shared/-/forward-mpc-shared-0.7.0.tgz} + resolution: {integrity: sha512-mN6zT5J8JbZxkOJxEjgGrjURybVn/t9DD+pWW5U4DRZH6Qakn5n1LIB4Lg4Y7OW9WwrlMH2IJ9RNgBW35RaF1A==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/forward-mpc-shared/-/forward-mpc-shared-0.7.0.tgz} peerDependencies: '@dynamic-labs-wallet/primitives': '>=0.0.336 || 0.0.1' '@dynamic-labs-wallet/primitives@0.0.337': - resolution: {integrity: sha512-HZHohGUedboP4Bwe6cS0Plftq6GATGnt4PnqVC3IY2mD+W8w7IAK+NVSSbe9kllXJyfaYeK+hJxpE/SC/gc6bw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs-wallet/primitives/-/@dynamic-labs-wallet/primitives-0.0.337.tgz} + resolution: {integrity: sha512-HZHohGUedboP4Bwe6cS0Plftq6GATGnt4PnqVC3IY2mD+W8w7IAK+NVSSbe9kllXJyfaYeK+hJxpE/SC/gc6bw==, tarball: https://registry.npmjs.org/@dynamic-labs-wallet/primitives/-/@dynamic-labs-wallet/primitives-0.0.337.tgz} '@dynamic-labs/assert-package-version@4.83.1': - resolution: {integrity: sha512-wSpNfNxoaUVGGYQWGnvyiEuwoNr5YA9dTQZizvnEyCvI/HfipVsQRJjp63ysbPFmqLUFHvwYEDjcHE/+5/V62w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/assert-package-version/-/assert-package-version-4.83.1.tgz} + resolution: {integrity: sha512-wSpNfNxoaUVGGYQWGnvyiEuwoNr5YA9dTQZizvnEyCvI/HfipVsQRJjp63ysbPFmqLUFHvwYEDjcHE/+5/V62w==, tarball: https://registry.npmjs.org/@dynamic-labs/assert-package-version/-/assert-package-version-4.83.1.tgz} '@dynamic-labs/client@4.83.1': - resolution: {integrity: sha512-Y3UE9pprtTK54+gsj3FOCSDemWwj3UeGdBnwBShdnBO1Rgig0h5vxQfkPlYXUZNTT7YS62dTjyjjANfc1PP1Rg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/client/-/client-4.83.1.tgz} + resolution: {integrity: sha512-Y3UE9pprtTK54+gsj3FOCSDemWwj3UeGdBnwBShdnBO1Rgig0h5vxQfkPlYXUZNTT7YS62dTjyjjANfc1PP1Rg==, tarball: https://registry.npmjs.org/@dynamic-labs/client/-/client-4.83.1.tgz} '@dynamic-labs/iconic@4.83.1': - resolution: {integrity: sha512-tYU1XYsI426LRnRp1ID1MybyXTitBXNTOZ+SKOWrNzqSnC503li6d4dm7pjuWAT0OZlpMlGw2bL0ZpV66Uojqw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/iconic/-/iconic-4.83.1.tgz} + resolution: {integrity: sha512-tYU1XYsI426LRnRp1ID1MybyXTitBXNTOZ+SKOWrNzqSnC503li6d4dm7pjuWAT0OZlpMlGw2bL0ZpV66Uojqw==, tarball: https://registry.npmjs.org/@dynamic-labs/iconic/-/iconic-4.83.1.tgz} peerDependencies: react: '>=18.0.0 <20.0.0' react-dom: '>=18.0.0 <20.0.0' '@dynamic-labs/locale@4.83.1': - resolution: {integrity: sha512-QlVqKyc9tVhisocfuPAlwKxfEebEfitE1F1j1TUGCsVrs4BukT7ZMhXvwE73z6umQAHILABXepwS0xjURRhLeg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/locale/-/locale-4.83.1.tgz} + resolution: {integrity: sha512-QlVqKyc9tVhisocfuPAlwKxfEebEfitE1F1j1TUGCsVrs4BukT7ZMhXvwE73z6umQAHILABXepwS0xjURRhLeg==, tarball: https://registry.npmjs.org/@dynamic-labs/locale/-/locale-4.83.1.tgz} '@dynamic-labs/logger@4.83.1': - resolution: {integrity: sha512-rT8Wsx2EJbnPosbTVIgUWHxHfQ5x8mOnBmcGmVwB3jhPa809sJDJ/+QrvTj0Fsoz80XvmseoHoTKSgIv6XpWVg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs/logger/-/@dynamic-labs/logger-4.83.1.tgz} + resolution: {integrity: sha512-rT8Wsx2EJbnPosbTVIgUWHxHfQ5x8mOnBmcGmVwB3jhPa809sJDJ/+QrvTj0Fsoz80XvmseoHoTKSgIv6XpWVg==, tarball: https://registry.npmjs.org/@dynamic-labs/logger/-/@dynamic-labs/logger-4.83.1.tgz} '@dynamic-labs/logger@4.84.1': - resolution: {integrity: sha512-0/QnGlA4UUOlqKl0fIrefQ+kXvFVAUgHkExnESIbdlJYH3BTEX61LTb/Sx7lYRho55QkR6XVjEjeZzHY8ngGoA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs/logger/-/@dynamic-labs/logger-4.84.1.tgz} + resolution: {integrity: sha512-0/QnGlA4UUOlqKl0fIrefQ+kXvFVAUgHkExnESIbdlJYH3BTEX61LTb/Sx7lYRho55QkR6XVjEjeZzHY8ngGoA==, tarball: https://registry.npmjs.org/@dynamic-labs/logger/-/@dynamic-labs/logger-4.84.1.tgz} '@dynamic-labs/message-transport@4.83.1': - resolution: {integrity: sha512-NlJSIZmOjf0ZP9U3wmyUKs20rBsigyNwcDacd+WBqaQlMtuiGLkz6exK6MSxAC4ej/CgWZpnGaKBnBDu9RIRkA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/message-transport/-/message-transport-4.83.1.tgz} + resolution: {integrity: sha512-NlJSIZmOjf0ZP9U3wmyUKs20rBsigyNwcDacd+WBqaQlMtuiGLkz6exK6MSxAC4ej/CgWZpnGaKBnBDu9RIRkA==, tarball: https://registry.npmjs.org/@dynamic-labs/message-transport/-/message-transport-4.83.1.tgz} '@dynamic-labs/react-hooks@4.83.1': - resolution: {integrity: sha512-WHrM4JLty5Tr4FclFCvK1ISfks3Jwxny1nyv2+VXNLUxk7ihYWnFHB3VWAW2o9Zlm8RkLUYcNbbTPt2DSsMWdg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/react-hooks/-/react-hooks-4.83.1.tgz} + resolution: {integrity: sha512-WHrM4JLty5Tr4FclFCvK1ISfks3Jwxny1nyv2+VXNLUxk7ihYWnFHB3VWAW2o9Zlm8RkLUYcNbbTPt2DSsMWdg==, tarball: https://registry.npmjs.org/@dynamic-labs/react-hooks/-/react-hooks-4.83.1.tgz} peerDependencies: react: '>=18.0.0 <20.0.0' '@dynamic-labs/react-native-extension@4.83.1': - resolution: {integrity: sha512-LlTBuVNIqkfI7hD80xvZQG0NzkWzaJKIkN0l9YZ2yWd0E1aJVH3YkPbOu+GfWw/8p2CG1mnFm3G1qlmhMZWCpg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/react-native-extension/-/react-native-extension-4.83.1.tgz} + resolution: {integrity: sha512-LlTBuVNIqkfI7hD80xvZQG0NzkWzaJKIkN0l9YZ2yWd0E1aJVH3YkPbOu+GfWw/8p2CG1mnFm3G1qlmhMZWCpg==, tarball: https://registry.npmjs.org/@dynamic-labs/react-native-extension/-/react-native-extension-4.83.1.tgz} peerDependencies: expo-linking: '>=6.2.2' expo-modules-core: '>=2.0.0' @@ -704,7 +704,7 @@ packages: react-native-webview: ^13.6.4 '@dynamic-labs/rpc-providers@4.83.1': - resolution: {integrity: sha512-KghsNAHBwoRoKN/FPuUfT1yQ+Kf7KhxuHcsH+XINfA90/zMLQrOKIsKeUyBboWWwCJrqCcGsG+lqUmxbCrBasw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/rpc-providers/-/rpc-providers-4.83.1.tgz} + resolution: {integrity: sha512-KghsNAHBwoRoKN/FPuUfT1yQ+Kf7KhxuHcsH+XINfA90/zMLQrOKIsKeUyBboWWwCJrqCcGsG+lqUmxbCrBasw==, tarball: https://registry.npmjs.org/@dynamic-labs/rpc-providers/-/rpc-providers-4.83.1.tgz} '@dynamic-labs/sdk-api-core@0.0.764': resolution: {integrity: sha512-79JptJTTClLc9qhioThtwMuzTHJ+mrj8sTEglb7Mcx3lJub9YbXqNdzS9mLRxZsr2et3aqqpzymXdUBzSEaMng==} @@ -716,42 +716,42 @@ packages: resolution: {integrity: sha512-XChDKxbbJtZgFsJ1g9N35ALE2O/CCmT+tB50LpbnbXWkt1gRjYoPNB+UVzNQeDXD4skwJUy6i849WmTUPRNReg==} '@dynamic-labs/sdk-api-core@0.0.900': - resolution: {integrity: sha512-4kb6IY75fFbTLwW24hN8ziVuxEeGAtsQpvXlKXA/XYrPKFFtJU6VQnuiKrKAerekIltdfMXEIqBJpcdPsmbszg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs/sdk-api-core/-/@dynamic-labs/sdk-api-core-0.0.900.tgz} + resolution: {integrity: sha512-4kb6IY75fFbTLwW24hN8ziVuxEeGAtsQpvXlKXA/XYrPKFFtJU6VQnuiKrKAerekIltdfMXEIqBJpcdPsmbszg==, tarball: https://registry.npmjs.org/@dynamic-labs/sdk-api-core/-/@dynamic-labs/sdk-api-core-0.0.900.tgz} '@dynamic-labs/sdk-api-core@0.0.958': - resolution: {integrity: sha512-jbDSjxWi69Nb5ZRmMrt+tV1gqGoPflvZnw7Qlpmbxbfguqx8KBzvDdDphMJ5jW2YCEmD8dRw2qizOrnN1gjIxw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs/sdk-api-core/-/@dynamic-labs/sdk-api-core-0.0.958.tgz} + resolution: {integrity: sha512-jbDSjxWi69Nb5ZRmMrt+tV1gqGoPflvZnw7Qlpmbxbfguqx8KBzvDdDphMJ5jW2YCEmD8dRw2qizOrnN1gjIxw==, tarball: https://registry.npmjs.org/@dynamic-labs/sdk-api-core/-/@dynamic-labs/sdk-api-core-0.0.958.tgz} '@dynamic-labs/sdk-api-core@0.0.964': - resolution: {integrity: sha512-U7PdyUQXdvToWCoysBIURYDMy+3XTnGZsdruv1Bl1LKwXHNbR8jGwIt6ibf0vbp1lQga6fc4DPnlAjbtUHaPIA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/dynamic-npm/@dynamic-labs/sdk-api-core/-/@dynamic-labs/sdk-api-core-0.0.964.tgz} + resolution: {integrity: sha512-U7PdyUQXdvToWCoysBIURYDMy+3XTnGZsdruv1Bl1LKwXHNbR8jGwIt6ibf0vbp1lQga6fc4DPnlAjbtUHaPIA==, tarball: https://registry.npmjs.org/@dynamic-labs/sdk-api-core/-/@dynamic-labs/sdk-api-core-0.0.964.tgz} '@dynamic-labs/solana-core@4.83.1': - resolution: {integrity: sha512-j2Upn13oq8z/biAQWAeLocrKqaVeA1yVFWnxSzB0DKPsyKs944LgdFXo2IOVwycegvhejMfGezMVloaO5AgVkg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/solana-core/-/solana-core-4.83.1.tgz} + resolution: {integrity: sha512-j2Upn13oq8z/biAQWAeLocrKqaVeA1yVFWnxSzB0DKPsyKs944LgdFXo2IOVwycegvhejMfGezMVloaO5AgVkg==, tarball: https://registry.npmjs.org/@dynamic-labs/solana-core/-/solana-core-4.83.1.tgz} '@dynamic-labs/solana-extension@4.83.1': - resolution: {integrity: sha512-j97Cx260psg2BjK+33EJzmVS4SKxFntPoDDkp8n+LKJGrAYSgBQiLtCMTAfHoP+TJDnW99BQGlfUBN7DGpyLTQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/solana-extension/-/solana-extension-4.83.1.tgz} + resolution: {integrity: sha512-j97Cx260psg2BjK+33EJzmVS4SKxFntPoDDkp8n+LKJGrAYSgBQiLtCMTAfHoP+TJDnW99BQGlfUBN7DGpyLTQ==, tarball: https://registry.npmjs.org/@dynamic-labs/solana-extension/-/solana-extension-4.83.1.tgz} peerDependencies: '@solana/web3.js': 1.98.1 '@dynamic-labs/types@4.83.1': - resolution: {integrity: sha512-lwNz57iJLk/bySkGVxeYIbWZvmb18s9yD2QbXQguyChu6V4/PdoRH4DGBr9xxOMY06zzSVSN3g2ctrsepv4atg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/types/-/types-4.83.1.tgz} + resolution: {integrity: sha512-lwNz57iJLk/bySkGVxeYIbWZvmb18s9yD2QbXQguyChu6V4/PdoRH4DGBr9xxOMY06zzSVSN3g2ctrsepv4atg==, tarball: https://registry.npmjs.org/@dynamic-labs/types/-/types-4.83.1.tgz} '@dynamic-labs/utils@4.83.1': - resolution: {integrity: sha512-6PgT0Xr8IQUn4xx3fBn2XEcyA9NAnR/BSVEsOb/+KgFRhx7bmKkwC3Bh1ooCXpr9P/osutT9Yy+Eb/3rg182CA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/utils/-/utils-4.83.1.tgz} + resolution: {integrity: sha512-6PgT0Xr8IQUn4xx3fBn2XEcyA9NAnR/BSVEsOb/+KgFRhx7bmKkwC3Bh1ooCXpr9P/osutT9Yy+Eb/3rg182CA==, tarball: https://registry.npmjs.org/@dynamic-labs/utils/-/utils-4.83.1.tgz} '@dynamic-labs/wallet-book@4.83.1': - resolution: {integrity: sha512-FNCQsS8U1l2SgvbZAESJcBcVcVJ7EeQrazNiEIKze4gcAwlJXDMoa/ThbN/dUOGaY1smM0A8TOKiBER96+t7OA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/wallet-book/-/wallet-book-4.83.1.tgz} + resolution: {integrity: sha512-FNCQsS8U1l2SgvbZAESJcBcVcVJ7EeQrazNiEIKze4gcAwlJXDMoa/ThbN/dUOGaY1smM0A8TOKiBER96+t7OA==, tarball: https://registry.npmjs.org/@dynamic-labs/wallet-book/-/wallet-book-4.83.1.tgz} peerDependencies: react: '>=18.0.0 <20.0.0' react-dom: '>=18.0.0 <20.0.0' '@dynamic-labs/wallet-connector-core@4.83.1': - resolution: {integrity: sha512-lYAuLgMB8aKqT+M+vftUslIy5YlArs4LxcwCHZgQNoly1UB9CEjGSJFQBQmZQIrmz7TB+8H8V11uHhGu/Ow3IQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/wallet-connector-core/-/wallet-connector-core-4.83.1.tgz} + resolution: {integrity: sha512-lYAuLgMB8aKqT+M+vftUslIy5YlArs4LxcwCHZgQNoly1UB9CEjGSJFQBQmZQIrmz7TB+8H8V11uHhGu/Ow3IQ==, tarball: https://registry.npmjs.org/@dynamic-labs/wallet-connector-core/-/wallet-connector-core-4.83.1.tgz} '@dynamic-labs/webauthn@4.83.1': - resolution: {integrity: sha512-8d4OQK4D/7Hdn4x2cAWC5uiXW1j1ZFmDsm5Hg3QkXhuBOGO7zqleT2VhPfm0RXcdG7p6Po0RtuFFWmv6jTvWgw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/webauthn/-/webauthn-4.83.1.tgz} + resolution: {integrity: sha512-8d4OQK4D/7Hdn4x2cAWC5uiXW1j1ZFmDsm5Hg3QkXhuBOGO7zqleT2VhPfm0RXcdG7p6Po0RtuFFWmv6jTvWgw==, tarball: https://registry.npmjs.org/@dynamic-labs/webauthn/-/webauthn-4.83.1.tgz} '@dynamic-labs/webview-messages@4.83.1': - resolution: {integrity: sha512-V/sRqfG6FcnbynQQxqF+Pkrdi/2vUjgHyWCS7K1GmUhIcxJcqFLt5OqgaGlr5nxGEsjZVYPBSm34e4omq6g9cQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@dynamic-labs/webview-messages/-/webview-messages-4.83.1.tgz} + resolution: {integrity: sha512-V/sRqfG6FcnbynQQxqF+Pkrdi/2vUjgHyWCS7K1GmUhIcxJcqFLt5OqgaGlr5nxGEsjZVYPBSm34e4omq6g9cQ==, tarball: https://registry.npmjs.org/@dynamic-labs/webview-messages/-/webview-messages-4.83.1.tgz} '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} @@ -760,7 +760,7 @@ packages: resolution: {integrity: sha512-pJsbax/pEPdRXSnFKahzGZeq2CNTZ0skAPWpnEZK/8vdcvlan7LE7wMSOVr+Z+MqTBnVEnS7O80TKpXKU5Rsbw==} '@expo/cli@54.0.24': - resolution: {integrity: sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@expo/cli/-/cli-54.0.24.tgz} + resolution: {integrity: sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ==, tarball: https://registry.npmjs.org/@expo/cli/-/cli-54.0.24.tgz} hasBin: true peerDependencies: expo: '*' @@ -788,7 +788,7 @@ packages: resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} '@expo/devtools@0.1.8': - resolution: {integrity: sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@expo/devtools/-/devtools-0.1.8.tgz} + resolution: {integrity: sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==, tarball: https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz} peerDependencies: react: '*' react-native: '*' @@ -802,7 +802,7 @@ packages: resolution: {integrity: sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q==} '@expo/fingerprint@0.15.5': - resolution: {integrity: sha512-mdVoAMcux1WlM6kd1RoWiHRNqKqS+J6mKmWQ/BKgeh937S/fcW58EE68O6nc4KDXtWi3PBeNHskOFcgyIuD4hw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@expo/fingerprint/-/fingerprint-0.15.5.tgz} + resolution: {integrity: sha512-mdVoAMcux1WlM6kd1RoWiHRNqKqS+J6mKmWQ/BKgeh937S/fcW58EE68O6nc4KDXtWi3PBeNHskOFcgyIuD4hw==, tarball: https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.5.tgz} hasBin: true '@expo/image-utils@0.8.14': @@ -815,7 +815,7 @@ packages: resolution: {integrity: sha512-rmkjHrYLdfhGGW1TINHwJ/TIcKgtd+1iV+uTycEB74RWSax6U2klRiXXGgudKH6j2OrDSCm3edYTPukSVZtsIQ==} '@expo/metro-config@54.0.15': - resolution: {integrity: sha512-SqIya4VZ9KHM1S9g+xR0A+QKw1Tfs7Gacx6bQNJ98vs4+O7I5+QP5mHZIB0QSZLUV8opiXebHYTiTu+0OAsIUw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@expo/metro-config/-/metro-config-54.0.15.tgz} + resolution: {integrity: sha512-SqIya4VZ9KHM1S9g+xR0A+QKw1Tfs7Gacx6bQNJ98vs4+O7I5+QP5mHZIB0QSZLUV8opiXebHYTiTu+0OAsIUw==, tarball: https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.15.tgz} peerDependencies: expo: '*' peerDependenciesMeta: @@ -823,7 +823,7 @@ packages: optional: true '@expo/metro-runtime@6.1.2': - resolution: {integrity: sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz} + resolution: {integrity: sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==, tarball: https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz} peerDependencies: expo: '*' react: '*' @@ -887,118 +887,118 @@ packages: hasBin: true '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz} + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==, tarball: https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz} + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==, tarball: https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz} + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==, tarball: https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz} cpu: [arm64] os: [darwin] '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz} + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==, tarball: https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz} cpu: [x64] os: [darwin] '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz} + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz} cpu: [arm64] os: [linux] libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz} + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz} cpu: [arm] os: [linux] libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz} + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz} cpu: [s390x] os: [linux] libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz} + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz} cpu: [x64] os: [linux] libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz} + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz} cpu: [arm64] os: [linux] libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz} + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz} cpu: [x64] os: [linux] libc: [musl] '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz} + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==, tarball: https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] libc: [glibc] '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz} + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==, tarball: https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] libc: [glibc] '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz} + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==, tarball: https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] libc: [glibc] '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz} + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==, tarball: https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz} + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==, tarball: https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz} + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==, tarball: https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] libc: [musl] '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz} + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==, tarball: https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz} + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==, tarball: https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz} + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==, tarball: https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1138,10 +1138,10 @@ packages: resolution: {integrity: sha512-+Mzq+W7cNEKfkNZzyLl6A6ffqc3r21HGZUezgfKxpZrkORfOqgRXnS80Zu0IV6a9Ue9QBJeKD7kN0iWfc3bhRQ==} '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/primitive/-/primitive-1.1.3.tgz} + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==, tarball: https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz} '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-collection/-/react-collection-1.1.7.tgz} + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==, tarball: https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1154,7 +1154,7 @@ packages: optional: true '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz} + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==, tarball: https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1163,7 +1163,7 @@ packages: optional: true '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-context/-/react-context-1.1.2.tgz} + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==, tarball: https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1185,7 +1185,7 @@ packages: optional: true '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-direction/-/react-direction-1.1.1.tgz} + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==, tarball: https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1194,7 +1194,7 @@ packages: optional: true '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz} + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==, tarball: https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1207,7 +1207,7 @@ packages: optional: true '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz} + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==, tarball: https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1216,7 +1216,7 @@ packages: optional: true '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz} + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==, tarball: https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1229,7 +1229,7 @@ packages: optional: true '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-id/-/react-id-1.1.1.tgz} + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==, tarball: https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1238,7 +1238,7 @@ packages: optional: true '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-portal/-/react-portal-1.1.9.tgz} + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==, tarball: https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1251,7 +1251,7 @@ packages: optional: true '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-presence/-/react-presence-1.1.5.tgz} + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==, tarball: https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1264,7 +1264,7 @@ packages: optional: true '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz} + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==, tarball: https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1277,7 +1277,7 @@ packages: optional: true '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz} + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==, tarball: https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1290,7 +1290,7 @@ packages: optional: true '@radix-ui/react-slot@1.2.0': - resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-slot/-/react-slot-1.2.0.tgz} + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==, tarball: https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1299,7 +1299,7 @@ packages: optional: true '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-slot/-/react-slot-1.2.3.tgz} + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==, tarball: https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1321,7 +1321,7 @@ packages: optional: true '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz} + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==, tarball: https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1330,7 +1330,7 @@ packages: optional: true '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz} + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==, tarball: https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1339,7 +1339,7 @@ packages: optional: true '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz} + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==, tarball: https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1348,7 +1348,7 @@ packages: optional: true '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz} + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==, tarball: https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1357,7 +1357,7 @@ packages: optional: true '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz} + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==, tarball: https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1366,7 +1366,7 @@ packages: optional: true '@react-native-async-storage/async-storage@2.2.0': - resolution: {integrity: sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz} + resolution: {integrity: sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==, tarball: https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz} peerDependencies: react-native: ^0.0.0-0 || >=0.65 <1.0 @@ -1377,33 +1377,33 @@ packages: react-native: '>=0.79.0' '@react-native/assets-registry@0.81.4': - resolution: {integrity: sha512-AMcDadefBIjD10BRqkWw+W/VdvXEomR6aEZ0fhQRAv7igrBzb4PTn4vHKYg+sUK0e3wa74kcMy2DLc/HtnGcMA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/assets-registry/-/assets-registry-0.81.4.tgz} + resolution: {integrity: sha512-AMcDadefBIjD10BRqkWw+W/VdvXEomR6aEZ0fhQRAv7igrBzb4PTn4vHKYg+sUK0e3wa74kcMy2DLc/HtnGcMA==, tarball: https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.4.tgz} engines: {node: '>= 20.19.4'} '@react-native/babel-plugin-codegen@0.81.5': - resolution: {integrity: sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz} + resolution: {integrity: sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==, tarball: https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz} engines: {node: '>= 20.19.4'} '@react-native/babel-preset@0.81.5': - resolution: {integrity: sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/babel-preset/-/babel-preset-0.81.5.tgz} + resolution: {integrity: sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==, tarball: https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz} engines: {node: '>= 20.19.4'} peerDependencies: '@babel/core': '*' '@react-native/codegen@0.81.4': - resolution: {integrity: sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/codegen/-/codegen-0.81.4.tgz} + resolution: {integrity: sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==, tarball: https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.4.tgz} engines: {node: '>= 20.19.4'} peerDependencies: '@babel/core': '*' '@react-native/codegen@0.81.5': - resolution: {integrity: sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/codegen/-/codegen-0.81.5.tgz} + resolution: {integrity: sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==, tarball: https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz} engines: {node: '>= 20.19.4'} peerDependencies: '@babel/core': '*' '@react-native/community-cli-plugin@0.81.4': - resolution: {integrity: sha512-8mpnvfcLcnVh+t1ok6V9eozWo8Ut+TZhz8ylJ6gF9d6q9EGDQX6s8jenan5Yv/pzN4vQEKI4ib2pTf/FELw+SA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.4.tgz} + resolution: {integrity: sha512-8mpnvfcLcnVh+t1ok6V9eozWo8Ut+TZhz8ylJ6gF9d6q9EGDQX6s8jenan5Yv/pzN4vQEKI4ib2pTf/FELw+SA==, tarball: https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.4.tgz} engines: {node: '>= 20.19.4'} peerDependencies: '@react-native-community/cli': '*' @@ -1415,37 +1415,37 @@ packages: optional: true '@react-native/debugger-frontend@0.81.4': - resolution: {integrity: sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz} + resolution: {integrity: sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==, tarball: https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.4.tgz} engines: {node: '>= 20.19.4'} '@react-native/debugger-frontend@0.81.5': - resolution: {integrity: sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz} + resolution: {integrity: sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==, tarball: https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz} engines: {node: '>= 20.19.4'} '@react-native/dev-middleware@0.81.4': - resolution: {integrity: sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz} + resolution: {integrity: sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==, tarball: https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.4.tgz} engines: {node: '>= 20.19.4'} '@react-native/dev-middleware@0.81.5': - resolution: {integrity: sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz} + resolution: {integrity: sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==, tarball: https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz} engines: {node: '>= 20.19.4'} '@react-native/gradle-plugin@0.81.4': - resolution: {integrity: sha512-T7fPcQvDDCSusZFVSg6H1oVDKb/NnVYLnsqkcHsAF2C2KGXyo3J7slH/tJAwNfj/7EOA2OgcWxfC1frgn9TQvw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/gradle-plugin/-/gradle-plugin-0.81.4.tgz} + resolution: {integrity: sha512-T7fPcQvDDCSusZFVSg6H1oVDKb/NnVYLnsqkcHsAF2C2KGXyo3J7slH/tJAwNfj/7EOA2OgcWxfC1frgn9TQvw==, tarball: https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.4.tgz} engines: {node: '>= 20.19.4'} '@react-native/js-polyfills@0.81.4': - resolution: {integrity: sha512-sr42FaypKXJHMVHhgSbu2f/ZJfrLzgaoQ+HdpRvKEiEh2mhFf6XzZwecyLBvWqf2pMPZa+CpPfNPiejXjKEy8w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/js-polyfills/-/js-polyfills-0.81.4.tgz} + resolution: {integrity: sha512-sr42FaypKXJHMVHhgSbu2f/ZJfrLzgaoQ+HdpRvKEiEh2mhFf6XzZwecyLBvWqf2pMPZa+CpPfNPiejXjKEy8w==, tarball: https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.4.tgz} engines: {node: '>= 20.19.4'} '@react-native/normalize-colors@0.81.4': - resolution: {integrity: sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz} + resolution: {integrity: sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==, tarball: https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.4.tgz} '@react-native/normalize-colors@0.81.5': - resolution: {integrity: sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz} + resolution: {integrity: sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==, tarball: https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz} '@react-native/virtualized-lists@0.81.4': - resolution: {integrity: sha512-hBM+rMyL6Wm1Q4f/WpqGsaCojKSNUBqAXLABNGoWm1vabZ7cSnARMxBvA/2vo3hLcoR4v7zDK8tkKm9+O0LjVA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@react-native/virtualized-lists/-/virtualized-lists-0.81.4.tgz} + resolution: {integrity: sha512-hBM+rMyL6Wm1Q4f/WpqGsaCojKSNUBqAXLABNGoWm1vabZ7cSnARMxBvA/2vo3hLcoR4v7zDK8tkKm9+O0LjVA==, tarball: https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.4.tgz} engines: {node: '>= 20.19.4'} peerDependencies: '@types/react': ^19.1.0 @@ -1500,10 +1500,10 @@ packages: resolution: {integrity: sha512-9/hhMte12Kgu+pMnLfA4EWJ0OQmIEAMVMX06FPH2yGkEQSQ3JhhCN/GkcRikzQhtEi97VYYQA15umptBUShcOQ==} '@simplewebauthn/browser@13.1.0': - resolution: {integrity: sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@simplewebauthn/browser/-/browser-13.1.0.tgz} + resolution: {integrity: sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg==, tarball: https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.1.0.tgz} '@simplewebauthn/types@12.0.0': - resolution: {integrity: sha512-q6y8MkoV8V8jB4zzp18Uyj2I7oFp2/ONL8c3j8uT06AOWu3cIChc1au71QYHrP2b+xDapkGTiv+9lX7xkTlAsA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@simplewebauthn/types/-/types-12.0.0.tgz} + resolution: {integrity: sha512-q6y8MkoV8V8jB4zzp18Uyj2I7oFp2/ONL8c3j8uT06AOWu3cIChc1au71QYHrP2b+xDapkGTiv+9lX7xkTlAsA==, tarball: https://registry.npmjs.org/@simplewebauthn/types/-/types-12.0.0.tgz} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@sinclair/typebox@0.27.10': @@ -1528,18 +1528,18 @@ packages: engines: {node: '>=5.10'} '@solana/codecs-core@2.0.0-rc.1': - resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz} + resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==, tarball: https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz} peerDependencies: typescript: '>=5' '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/codecs-core/-/codecs-core-2.3.0.tgz} + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==, tarball: https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' '@solana/codecs-data-structures@2.0.0-rc.1': - resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz} + resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==, tarball: https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz} peerDependencies: typescript: '>=5' @@ -1555,31 +1555,31 @@ packages: typescript: '>=5.3.3' '@solana/codecs-strings@2.0.0-rc.1': - resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz} + resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==, tarball: https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 typescript: '>=5' '@solana/codecs@2.0.0-rc.1': - resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/codecs/-/codecs-2.0.0-rc.1.tgz} + resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==, tarball: https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz} peerDependencies: typescript: '>=5' '@solana/errors@2.0.0-rc.1': - resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/errors/-/errors-2.0.0-rc.1.tgz} + resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==, tarball: https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz} hasBin: true peerDependencies: typescript: '>=5' '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/errors/-/errors-2.3.0.tgz} + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==, tarball: https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz} engines: {node: '>=20.18.0'} hasBin: true peerDependencies: typescript: '>=5.3.3' '@solana/options@2.0.0-rc.1': - resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/options/-/options-2.0.0-rc.1.tgz} + resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==, tarball: https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz} peerDependencies: typescript: '>=5' @@ -1596,13 +1596,13 @@ packages: '@solana/web3.js': ^1.95.3 '@solana/spl-token@0.4.13': - resolution: {integrity: sha512-cite/pYWQZZVvLbg5lsodSovbetK/eA24gaR0eeUeMuBAMNrT8XFCwaygKy0N2WSg3gSyjjNpIeAGBAKZaY/1w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/spl-token/-/spl-token-0.4.13.tgz} + resolution: {integrity: sha512-cite/pYWQZZVvLbg5lsodSovbetK/eA24gaR0eeUeMuBAMNrT8XFCwaygKy0N2WSg3gSyjjNpIeAGBAKZaY/1w==, tarball: https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.13.tgz} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.95.5 '@solana/spl-token@0.4.14': - resolution: {integrity: sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@solana/spl-token/-/spl-token-0.4.14.tgz} + resolution: {integrity: sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA==, tarball: https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.14.tgz} engines: {node: '>=16'} peerDependencies: '@solana/web3.js': ^1.95.5 @@ -1626,7 +1626,7 @@ packages: engines: {node: '>=18.0.0'} '@turnkey/encoding@0.6.0': - resolution: {integrity: sha512-IC8qXvy36+iGAeiaVIuJvB35uU2Ld/RAWI/DRTKS+ttBej0GXhOn48Ouu5mlca4jt8ZEuwXmDVv74A8uBQclsA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@turnkey/encoding/-/encoding-0.6.0.tgz} + resolution: {integrity: sha512-IC8qXvy36+iGAeiaVIuJvB35uU2Ld/RAWI/DRTKS+ttBej0GXhOn48Ouu5mlca4jt8ZEuwXmDVv74A8uBQclsA==, tarball: https://registry.npmjs.org/@turnkey/encoding/-/encoding-0.6.0.tgz} engines: {node: '>=18.0.0'} '@turnkey/http@3.16.1': @@ -1634,7 +1634,7 @@ packages: engines: {node: '>=18.0.0'} '@turnkey/react-native-passkey-stamper@1.2.7': - resolution: {integrity: sha512-w8Ka8EO+Tu1o2qI/y4NNuhfhGWEF9Bc7vNQAgpJ5RPkEjFYTqA6SQsRNToFpf/AQjvyNDRlBq5k83XHqm2oVdQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@turnkey/react-native-passkey-stamper/-/react-native-passkey-stamper-1.2.7.tgz} + resolution: {integrity: sha512-w8Ka8EO+Tu1o2qI/y4NNuhfhGWEF9Bc7vNQAgpJ5RPkEjFYTqA6SQsRNToFpf/AQjvyNDRlBq5k83XHqm2oVdQ==, tarball: https://registry.npmjs.org/@turnkey/react-native-passkey-stamper/-/react-native-passkey-stamper-1.2.7.tgz} engines: {node: '>=18.0.0'} '@turnkey/sdk-types@0.11.1': @@ -1642,7 +1642,7 @@ packages: engines: {node: '>=18.0.0'} '@turnkey/webauthn-stamper@0.6.0': - resolution: {integrity: sha512-jdN17QEnn7RBykEOhtKIialWmDjnDAH8DzbyITwn8jsKcwT1TBNYge89hTUTjbdsDLBAqQw8cHujPdy0RaAqvw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@turnkey/webauthn-stamper/-/webauthn-stamper-0.6.0.tgz} + resolution: {integrity: sha512-jdN17QEnn7RBykEOhtKIialWmDjnDAH8DzbyITwn8jsKcwT1TBNYge89hTUTjbdsDLBAqQw8cHujPdy0RaAqvw==, tarball: https://registry.npmjs.org/@turnkey/webauthn-stamper/-/webauthn-stamper-0.6.0.tgz} engines: {node: '>=18.0.0'} '@types/babel__core@7.20.5': @@ -1726,7 +1726,7 @@ packages: resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} '@vue/shared@3.5.34': - resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/@vue/shared/-/shared-3.5.34.tgz} + resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==, tarball: https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz} '@xmldom/xmldom@0.8.13': resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} @@ -1737,7 +1737,7 @@ packages: engines: {node: '>=14.6'} ably@2.17.1: - resolution: {integrity: sha512-70yfXHoM7JtJD/8FCtPD1gkWW0f+AJqbJp0PsqDAqiyxFB8cPFY+FuKHgNTYb8eRHKXq8hT1xiDphUcY0+GHnA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/ably/-/ably-2.17.1.tgz} + resolution: {integrity: sha512-70yfXHoM7JtJD/8FCtPD1gkWW0f+AJqbJp0PsqDAqiyxFB8cPFY+FuKHgNTYb8eRHKXq8hT1xiDphUcY0+GHnA==, tarball: https://registry.npmjs.org/ably/-/ably-2.17.1.tgz} engines: {node: '>=16'} peerDependencies: react: '>=16.8.0' @@ -1811,7 +1811,7 @@ packages: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} argon2id@1.0.1: - resolution: {integrity: sha512-rsiD3lX+0L0CsiZARp3bf9EGxprtuWAT7PpiJd+Fk53URV0/USOQkBIP1dLTV8t6aui0ECbymQ9W9YCcTd6XgA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/argon2id/-/argon2id-1.0.1.tgz} + resolution: {integrity: sha512-rsiD3lX+0L0CsiZARp3bf9EGxprtuWAT7PpiJd+Fk53URV0/USOQkBIP1dLTV8t6aui0ECbymQ9W9YCcTd6XgA==, tarball: https://registry.npmjs.org/argon2id/-/argon2id-1.0.1.tgz} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1841,16 +1841,16 @@ packages: engines: {node: '>= 0.4'} axios@1.13.2: - resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/axios/-/axios-1.13.2.tgz} + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==, tarball: https://registry.npmjs.org/axios/-/axios-1.13.2.tgz} axios@1.15.0: - resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/axios/-/axios-1.15.0.tgz} + resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==, tarball: https://registry.npmjs.org/axios/-/axios-1.15.0.tgz} axios@1.15.2: - resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/axios/-/axios-1.15.2.tgz} + resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==, tarball: https://registry.npmjs.org/axios/-/axios-1.15.2.tgz} axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/axios/-/axios-1.9.0.tgz} + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==, tarball: https://registry.npmjs.org/axios/-/axios-1.9.0.tgz} babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} @@ -1888,7 +1888,7 @@ packages: resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} babel-plugin-syntax-hermes-parser@0.29.1: - resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz} + resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==, tarball: https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz} babel-plugin-transform-flow-enums@0.0.2: resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} @@ -1975,7 +1975,7 @@ packages: resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} bplist-creator@0.1.0: - resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/bplist-creator/-/bplist-creator-0.1.0.tgz} + resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==, tarball: https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz} bplist-parser@0.3.1: resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==} @@ -2011,10 +2011,10 @@ packages: resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} bs58check@4.0.0: - resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/bs58check/-/bs58check-4.0.0.tgz} + resolution: {integrity: sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==, tarball: https://registry.npmjs.org/bs58check/-/bs58check-4.0.0.tgz} bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/bser/-/bser-2.1.1.tgz} + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, tarball: https://registry.npmjs.org/bser/-/bser-2.1.1.tgz} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -2030,7 +2030,7 @@ packages: engines: {node: '>=6.14.2'} bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/bytes/-/bytes-3.1.2.tgz} + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, tarball: https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz} engines: {node: '>= 0.8'} cacheable-lookup@5.0.4: @@ -2172,7 +2172,7 @@ packages: engines: {node: '>= 0.8.0'} concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/concat-map/-/concat-map-0.0.1.tgz} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz} connect@3.7.0: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} @@ -2259,7 +2259,7 @@ packages: engines: {node: '>=0.4.0'} depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/depd/-/depd-2.0.0.tgz} + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, tarball: https://registry.npmjs.org/depd/-/depd-2.0.0.tgz} engines: {node: '>= 0.8'} dequal@2.0.3: @@ -2267,7 +2267,7 @@ packages: engines: {node: '>=6'} destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/destroy/-/destroy-1.2.0.tgz} + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, tarball: https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} detect-libc@2.1.2: @@ -2290,7 +2290,7 @@ packages: engines: {node: '>= 0.4'} ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/ee-first/-/ee-first-1.1.1.tgz} + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, tarball: https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz} electron-to-chromium@1.5.353: resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} @@ -2422,11 +2422,11 @@ packages: react-native: '*' expo-modules-autolinking@3.0.25: - resolution: {integrity: sha512-YmHWctJlwvOuLZccg3cOXvSiXVJrPMKl7g2YR0YHWoGL9v2RvcmgaPJWPSLVW+voNEgEPsbo5UmUrAqbnYcBeg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/expo-modules-autolinking/-/expo-modules-autolinking-3.0.25.tgz} + resolution: {integrity: sha512-YmHWctJlwvOuLZccg3cOXvSiXVJrPMKl7g2YR0YHWoGL9v2RvcmgaPJWPSLVW+voNEgEPsbo5UmUrAqbnYcBeg==, tarball: https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.25.tgz} hasBin: true expo-modules-core@3.0.30: - resolution: {integrity: sha512-a6IrpAn/Jbmwxi9L+hMmXKpNqnkUpoF7WHOpn02rVLyax2J0gB1vvCVE5rNydplEnt41Q6WxQwvcOjZaIkcSUg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/expo-modules-core/-/expo-modules-core-3.0.30.tgz} + resolution: {integrity: sha512-a6IrpAn/Jbmwxi9L+hMmXKpNqnkUpoF7WHOpn02rVLyax2J0gB1vvCVE5rNydplEnt41Q6WxQwvcOjZaIkcSUg==, tarball: https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.30.tgz} peerDependencies: react: '*' react-native: '*' @@ -2543,7 +2543,7 @@ packages: optional: true file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz} + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, tarball: https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -2554,7 +2554,7 @@ packages: engines: {node: '>=0.10.0'} finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/finalhandler/-/finalhandler-1.1.2.tgz} + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, tarball: https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz} engines: {node: '>= 0.8'} find-up@4.1.0: @@ -2685,13 +2685,13 @@ packages: engines: {node: '>= 0.4'} hermes-estree@0.29.1: - resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/hermes-estree/-/hermes-estree-0.29.1.tgz} + resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==, tarball: https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz} hermes-estree@0.32.0: - resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/hermes-estree/-/hermes-estree-0.32.0.tgz} + resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==, tarball: https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz} hermes-estree@0.35.0: - resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/hermes-estree/-/hermes-estree-0.35.0.tgz} + resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==, tarball: https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz} hermes-parser@0.29.1: resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} @@ -2732,7 +2732,7 @@ packages: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} i18next@23.4.6: - resolution: {integrity: sha512-jBE8bui969Ygv7TVYp0pwDZB7+he0qsU+nz7EcfdqSh+QvKjEfl9YPRQd/KrGiMhTYFGkeuPaeITenKK/bSFDg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/i18next/-/i18next-23.4.6.tgz} + resolution: {integrity: sha512-jBE8bui969Ygv7TVYp0pwDZB7+he0qsU+nz7EcfdqSh+QvKjEfl9YPRQd/KrGiMhTYFGkeuPaeITenKK/bSFDg==, tarball: https://registry.npmjs.org/i18next/-/i18next-23.4.6.tgz} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2879,7 +2879,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jimp-compact@0.16.1: - resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/jimp-compact/-/jimp-compact-0.16.1.tgz} + resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==, tarball: https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2901,7 +2901,7 @@ packages: hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/json-buffer/-/json-buffer-3.0.1.tgz} + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, tarball: https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz} json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -2930,71 +2930,71 @@ packages: resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz} + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==, tarball: https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz} + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==, tarball: https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz} + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==, tarball: https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz} + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==, tarball: https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz} + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==, tarball: https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz} + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==, tarball: https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz} + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==, tarball: https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz} + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==, tarball: https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz} + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==, tarball: https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz} + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==, tarball: https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz} + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==, tarball: https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] @@ -3039,7 +3039,7 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/makeerror/-/makeerror-1.0.12.tgz} + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, tarball: https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz} marky@1.3.0: resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} @@ -3059,7 +3059,7 @@ packages: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} metro-babel-transformer@0.83.3: - resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz} + resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==, tarball: https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-babel-transformer@0.83.7: @@ -3067,7 +3067,7 @@ packages: engines: {node: '>=20.19.4'} metro-cache-key@0.83.3: - resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-cache-key/-/metro-cache-key-0.83.3.tgz} + resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==, tarball: https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-cache-key@0.83.7: @@ -3075,7 +3075,7 @@ packages: engines: {node: '>=20.19.4'} metro-cache@0.83.3: - resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-cache/-/metro-cache-0.83.3.tgz} + resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==, tarball: https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-cache@0.83.7: @@ -3083,7 +3083,7 @@ packages: engines: {node: '>=20.19.4'} metro-config@0.83.3: - resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-config/-/metro-config-0.83.3.tgz} + resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==, tarball: https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-config@0.83.7: @@ -3091,7 +3091,7 @@ packages: engines: {node: '>=20.19.4'} metro-core@0.83.3: - resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-core/-/metro-core-0.83.3.tgz} + resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==, tarball: https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-core@0.83.7: @@ -3099,7 +3099,7 @@ packages: engines: {node: '>=20.19.4'} metro-file-map@0.83.3: - resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-file-map/-/metro-file-map-0.83.3.tgz} + resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==, tarball: https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-file-map@0.83.7: @@ -3107,7 +3107,7 @@ packages: engines: {node: '>=20.19.4'} metro-minify-terser@0.83.3: - resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz} + resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==, tarball: https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-minify-terser@0.83.7: @@ -3115,7 +3115,7 @@ packages: engines: {node: '>=20.19.4'} metro-resolver@0.83.3: - resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-resolver/-/metro-resolver-0.83.3.tgz} + resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==, tarball: https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-resolver@0.83.7: @@ -3139,7 +3139,7 @@ packages: engines: {node: '>=20.19.4'} metro-symbolicate@0.83.3: - resolution: {integrity: sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz} + resolution: {integrity: sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==, tarball: https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz} engines: {node: '>=20.19.4'} hasBin: true @@ -3149,7 +3149,7 @@ packages: hasBin: true metro-transform-plugins@0.83.3: - resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz} + resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==, tarball: https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-transform-plugins@0.83.7: @@ -3157,7 +3157,7 @@ packages: engines: {node: '>=20.19.4'} metro-transform-worker@0.83.3: - resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz} + resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==, tarball: https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz} engines: {node: '>=20.19.4'} metro-transform-worker@0.83.7: @@ -3165,7 +3165,7 @@ packages: engines: {node: '>=20.19.4'} metro@0.83.3: - resolution: {integrity: sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/metro/-/metro-0.83.3.tgz} + resolution: {integrity: sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==, tarball: https://registry.npmjs.org/metro/-/metro-0.83.3.tgz} engines: {node: '>=20.19.4'} hasBin: true @@ -3179,7 +3179,7 @@ packages: engines: {node: '>=8.6'} mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/mime-db/-/mime-db-1.52.0.tgz} + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, tarball: https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz} engines: {node: '>= 0.6'} mime-db@1.54.0: @@ -3195,7 +3195,7 @@ packages: engines: {node: '>=18'} mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/mime/-/mime-1.6.0.tgz} + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, tarball: https://registry.npmjs.org/mime/-/mime-1.6.0.tgz} engines: {node: '>=4'} hasBin: true @@ -3253,7 +3253,7 @@ packages: hasBin: true negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/negotiator/-/negotiator-0.6.3.tgz} + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, tarball: https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz} engines: {node: '>= 0.6'} negotiator@0.6.4: @@ -3365,7 +3365,7 @@ packages: engines: {node: '>=8'} p-queue@9.1.0: - resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/p-queue/-/p-queue-9.1.0.tgz} + resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==, tarball: https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz} engines: {node: '>=20'} p-timeout@7.0.1: @@ -3468,7 +3468,7 @@ packages: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} punycode@1.3.2: - resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/punycode/-/punycode-1.3.2.tgz} + resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==, tarball: https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -3482,7 +3482,7 @@ packages: engines: {node: '>=16.0.0'} qrcode-terminal@0.11.0: - resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz} + resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==, tarball: https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz} hasBin: true query-string@7.1.3: @@ -3490,12 +3490,12 @@ packages: engines: {node: '>=6'} querystring@0.2.0: - resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/querystring/-/querystring-0.2.0.tgz} + resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==, tarball: https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/queue/-/queue-6.0.2.tgz} + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==, tarball: https://registry.npmjs.org/queue/-/queue-6.0.2.tgz} quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} @@ -3513,7 +3513,7 @@ packages: resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} react-dom@19.2.5: - resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/react-dom/-/react-dom-19.2.5.tgz} + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==, tarball: https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz} peerDependencies: react: ^19.2.5 @@ -3527,7 +3527,7 @@ packages: react: '>=17.0.0' react-i18next@13.5.0: - resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/react-i18next/-/react-i18next-13.5.0.tgz} + resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==, tarball: https://registry.npmjs.org/react-i18next/-/react-i18next-13.5.0.tgz} peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -3566,7 +3566,7 @@ packages: react-native: '*' react-native-passkey@3.3.2: - resolution: {integrity: sha512-YgXERrBlgVHAYkxGPpncB0zoiRQfZyMMMlWfNTYMyKvOS6muFMlhzk6w5lG4FyEEVrvXHGV4AS6twbmt2Rv8GA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/react-native-passkey/-/react-native-passkey-3.3.2.tgz} + resolution: {integrity: sha512-YgXERrBlgVHAYkxGPpncB0zoiRQfZyMMMlWfNTYMyKvOS6muFMlhzk6w5lG4FyEEVrvXHGV4AS6twbmt2Rv8GA==, tarball: https://registry.npmjs.org/react-native-passkey/-/react-native-passkey-3.3.2.tgz} peerDependencies: react: '*' react-native: '*' @@ -3584,13 +3584,13 @@ packages: react-native: '*' react-native-webview@13.15.0: - resolution: {integrity: sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/react-native-webview/-/react-native-webview-13.15.0.tgz} + resolution: {integrity: sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ==, tarball: https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.15.0.tgz} peerDependencies: react: '*' react-native: '*' react-native@0.81.4: - resolution: {integrity: sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/react-native/-/react-native-0.81.4.tgz} + resolution: {integrity: sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==, tarball: https://registry.npmjs.org/react-native/-/react-native-0.81.4.tgz} engines: {node: '>= 20.19.4'} hasBin: true peerDependencies: @@ -3635,7 +3635,7 @@ packages: optional: true react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/react/-/react-19.1.0.tgz} + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==, tarball: https://registry.npmjs.org/react/-/react-19.1.0.tgz} engines: {node: '>=0.10.0'} reflect-metadata@0.2.2: @@ -3723,7 +3723,7 @@ packages: engines: {node: '>=11.0.0'} scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/scheduler/-/scheduler-0.26.0.tgz} + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==, tarball: https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz} scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -3775,7 +3775,7 @@ packages: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/sharp/-/sharp-0.33.5.tgz} + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==, tarball: https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -3955,18 +3955,18 @@ packages: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} tldts@6.0.16: - resolution: {integrity: sha512-TkEq38COU640mzOKPk4D1oH3FFVvwEtMaKIfw/+F/umVsy7ONWu8PPQH0c11qJ/Jq/zbcQGprXGsT8GcaDSmJg==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/tldts/-/tldts-6.0.16.tgz} + resolution: {integrity: sha512-TkEq38COU640mzOKPk4D1oH3FFVvwEtMaKIfw/+F/umVsy7ONWu8PPQH0c11qJ/Jq/zbcQGprXGsT8GcaDSmJg==, tarball: https://registry.npmjs.org/tldts/-/tldts-6.0.16.tgz} hasBin: true tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/tmpl/-/tmpl-1.0.5.tgz} + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, tarball: https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} to-utf8@0.0.1: - resolution: {integrity: sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/to-utf8/-/to-utf8-0.0.1.tgz} + resolution: {integrity: sha512-zks18/TWT1iHO3v0vFp5qLKOG27m67ycq/Y7a7cTiRuUNlc4gf3HGnkRgMv0NyhnfTamtkYBJl+YeD1/j07gBQ==, tarball: https://registry.npmjs.org/to-utf8/-/to-utf8-0.0.1.tgz} toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} @@ -3979,7 +3979,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tsl-apple-cloudkit@0.2.34: - resolution: {integrity: sha512-A49Oflo4/Edb9GUN9hzjm7akpY3S+uivrPUxgvp6LPN+PGQsnruiCadSED029Wnh7HVZDU/I7dqWtG9VkPAbVA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/tsl-apple-cloudkit/-/tsl-apple-cloudkit-0.2.34.tgz} + resolution: {integrity: sha512-A49Oflo4/Edb9GUN9hzjm7akpY3S+uivrPUxgvp6LPN+PGQsnruiCadSED029Wnh7HVZDU/I7dqWtG9VkPAbVA==, tarball: https://registry.npmjs.org/tsl-apple-cloudkit/-/tsl-apple-cloudkit-0.2.34.tgz} engines: {node: '>=16.0.0'} peerDependencies: typescript: '>=3.0.0' @@ -3995,7 +3995,7 @@ packages: engines: {node: '>= 6.0.0'} type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/type-detect/-/type-detect-4.0.8.tgz} + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, tarball: https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz} engines: {node: '>=4'} type-fest@0.21.3: @@ -4049,7 +4049,7 @@ packages: browserslist: '>= 4.21.0' url@0.11.0: - resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/url/-/url-0.11.0.tgz} + resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==, tarball: https://registry.npmjs.org/url/-/url-0.11.0.tgz} use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} @@ -4089,10 +4089,10 @@ packages: resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/util/-/util-0.12.5.tgz} + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, tarball: https://registry.npmjs.org/util/-/util-0.12.5.tgz} utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/utils-merge/-/utils-merge-1.0.1.tgz} + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, tarball: https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz} engines: {node: '>= 0.4.0'} uuid@11.1.0: @@ -4131,7 +4131,7 @@ packages: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} void-elements@3.1.0: - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/void-elements/-/void-elements-3.1.0.tgz} + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==, tarball: https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz} engines: {node: '>=0.10.0'} walker@1.0.8: @@ -4154,7 +4154,7 @@ packages: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} whatwg-url-without-unicode@8.0.0-3: - resolution: {integrity: sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz} + resolution: {integrity: sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==, tarball: https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz} engines: {node: '>=10'} whatwg-url@5.0.0: @@ -4223,7 +4223,7 @@ packages: engines: {node: '>=10.0.0'} xml2js@0.6.0: - resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/xml2js/-/xml2js-0.6.0.tgz} + resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==, tarball: https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz} engines: {node: '>=4.0.0'} xmlbuilder@11.0.1: @@ -4263,7 +4263,7 @@ packages: engines: {node: '>=10'} zod@4.0.5: - resolution: {integrity: sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==, tarball: https://fbinfra555artifactory.jfrog.io/artifactory/api/npm/fireblocks-npm/zod/-/zod-4.0.5.tgz} + resolution: {integrity: sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==, tarball: https://registry.npmjs.org/zod/-/zod-4.0.5.tgz} snapshots: