From 31656b028fea1fce41d3a2d1d29752eeeac3e177 Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Thu, 19 Dec 2024 20:26:14 +0100 Subject: [PATCH 01/49] refactor: move nextjs files to apps/web --- .dockerignore => apps/web/.dockerignore | 0 .env.example => apps/web/.env.example | 0 apps/web/.gitignore | 61 ++++++++++++++++++ .prettierrc => apps/web/.prettierrc | 0 {.storybook => apps/web/.storybook}/main.ts | 0 .../web/.storybook}/preview.ts | 0 Dockerfile => apps/web/Dockerfile | 0 LICENSE => apps/web/LICENSE | 0 README.md => apps/web/README.md | 0 .../web/cypress.config.js | 0 {cypress => apps/web/cypress}/ci.json | 0 .../e2e/happypath/recovery_hp_1.cy.js | 0 .../e2e/happypath/recovery_hp_2.cy.js | 0 .../e2e/happypath/recovery_hp_3.cy.js | 0 .../e2e/happypath/recovery_hp_4.cy.js | 0 .../sendfunds_connected_wallet.cy.js | 0 .../e2e/happypath/sendfunds_queue_1.cy.js | 0 .../e2e/happypath/sendfunds_relay.cy.js | 0 .../happypath/tx_history_filter_hp_1.cy.js | 0 .../happypath/tx_history_filter_hp_2.cy.js | 0 .../cypress}/e2e/happypath_2/add_owner.cy.js | 0 .../happypath_2/multichain_create_safe.cy.js | 0 .../cypress}/e2e/happypath_2/proposers.cy.js | 0 .../web/cypress}/e2e/happypath_2/swaps.cy.js | 0 .../cypress}/e2e/pages/address_book.page.js | 0 .../web/cypress}/e2e/pages/assets.pages.js | 0 .../web/cypress}/e2e/pages/batches.pages.js | 0 .../web/cypress}/e2e/pages/create_tx.pages.js | 0 .../cypress}/e2e/pages/create_wallet.pages.js | 0 .../web/cypress}/e2e/pages/dashboard.pages.js | 0 .../cypress}/e2e/pages/import_export.pages.js | 0 .../web/cypress}/e2e/pages/load_safe.pages.js | 0 .../web/cypress}/e2e/pages/main.page.js | 0 .../web/cypress}/e2e/pages/messages.pages.js | 0 .../web/cypress}/e2e/pages/modals.page.js | 0 .../modals/message_confirmation.pages.js | 0 .../web/cypress}/e2e/pages/modules.page.js | 0 .../web/cypress}/e2e/pages/navigation.page.js | 0 .../web/cypress}/e2e/pages/nfts.pages.js | 0 .../web/cypress}/e2e/pages/owners.pages.js | 0 .../web/cypress}/e2e/pages/proposers.pages.js | 0 .../web/cypress}/e2e/pages/recovery.pages.js | 0 .../web/cypress}/e2e/pages/safeapps.pages.js | 0 .../web/cypress}/e2e/pages/sidebar.pages.js | 0 .../e2e/pages/spending_limits.pages.js | 0 .../web/cypress}/e2e/pages/staking.page.js | 0 .../web/cypress}/e2e/pages/swaps.pages.js | 0 .../web/cypress}/e2e/pages/tables.page.js | 0 .../cypress}/e2e/pages/transactions.page.js | 0 .../e2e/prodhealthcheck/add_owner.cy.js | 0 .../e2e/prodhealthcheck/create_tx.cy.js | 0 .../e2e/prodhealthcheck/load_safe.cy.js | 0 .../prodhealthcheck/messages_onchain.cy.js | 0 .../prodhealthcheck/multichain_network.cy.js | 0 .../cypress}/e2e/prodhealthcheck/nfts.cy.js | 0 .../e2e/prodhealthcheck/recovery.cy.js | 0 .../e2e/prodhealthcheck/remove_owner.cy.js | 0 .../e2e/prodhealthcheck/sidebar.cy.js | 0 .../e2e/prodhealthcheck/sidebar_3.cy.js | 0 .../e2e/prodhealthcheck/spending_limits.cy.js | 0 .../e2e/prodhealthcheck/swaps_history_2.cy.js | 0 .../e2e/prodhealthcheck/swaps_tokens.cy.js | 0 .../cypress}/e2e/prodhealthcheck/tokens.cy.js | 0 .../e2e/prodhealthcheck/tx_history.cy.js | 0 .../e2e/prodhealthcheck/tx_history_2.cy.js | 0 .../cypress}/e2e/regression/add_owner.cy.js | 0 .../e2e/regression/address_book.cy.js | 0 .../e2e/regression/address_book_2.cy.js | 0 .../e2e/regression/balances_pagination.cy.js | 0 .../cypress}/e2e/regression/batch_tx.cy.js | 0 .../e2e/regression/bulk_execution.cy.js | 0 .../e2e/regression/create_safe_cf.cy.js | 0 .../e2e/regression/create_safe_simple.cy.js | 0 .../e2e/regression/create_safe_simple_2.cy.js | 0 .../cypress}/e2e/regression/create_tx.cy.js | 0 .../cypress}/e2e/regression/load_safe.cy.js | 0 .../cypress}/e2e/regression/load_safe_2.cy.js | 0 .../e2e/regression/messages_onchain.cy.js | 0 .../e2e/regression/messages_popup.cy.js | 0 .../regression/multichain_create_safe.cy.js | 0 .../multichain_create_safe_flow.cy.js | 0 .../e2e/regression/multichain_network.cy.js | 0 .../regression/multichain_networkswitch.cy.js | 0 .../e2e/regression/multichain_setup.cy.js | 0 .../e2e/regression/multichain_sidebar.cy.js | 0 .../web/cypress}/e2e/regression/nfts.cy.js | 0 .../cypress}/e2e/regression/proposers.cy.js | 0 .../cypress}/e2e/regression/proposers_2.cy.js | 0 .../cypress}/e2e/regression/recovery.cy.js | 0 .../cypress}/e2e/regression/recovery_2.cy.js | 0 .../e2e/regression/remove_owner.cy.js | 0 .../e2e/regression/replace_owner.cy.js | 0 .../web/cypress}/e2e/regression/sidebar.cy.js | 0 .../cypress}/e2e/regression/sidebar_2.cy.js | 0 .../cypress}/e2e/regression/sidebar_3.cy.js | 0 .../cypress}/e2e/regression/sidebar_4.cy.js | 0 .../cypress}/e2e/regression/sidebar_5.cy.js | 0 .../cypress}/e2e/regression/sidebar_6.cy.js | 0 .../cypress}/e2e/regression/sidebar_7.cy.js | 0 .../e2e/regression/sidebar_nonowner.cy.js | 0 .../e2e/regression/spending_limits.cy.js | 0 .../regression/spending_limits_nonowner.cy.js | 0 .../e2e/regression/staking_history.cy.js | 0 .../web/cypress}/e2e/regression/swaps.cy.js | 0 .../e2e/regression/swaps_history.cy.js | 0 .../e2e/regression/swaps_history_2.cy.js | 0 .../e2e/regression/swaps_tokens.cy.js | 0 .../web/cypress}/e2e/regression/tokens.cy.js | 0 .../web/cypress}/e2e/regression/twaps.cy.js | 0 .../web/cypress}/e2e/regression/twaps_2.cy.js | 0 .../e2e/regression/twaps_history.cy.js | 0 .../cypress}/e2e/regression/tx_decoding.cy.js | 0 .../cypress}/e2e/regression/tx_history.cy.js | 0 .../e2e/regression/tx_history_2.cy.js | 0 .../e2e/regression/tx_history_3.cy.js | 0 .../e2e/regression/tx_history_4.cy.js | 0 .../cypress}/e2e/safe-apps/apps_list.cy.js | 0 .../e2e/safe-apps/browser_permissions.cy.js | 0 .../web/cypress}/e2e/safe-apps/constants.js | 0 .../e2e/safe-apps/drain_account.spec.cy.js | 0 .../cypress}/e2e/safe-apps/info_modal.cy.js | 0 .../e2e/safe-apps/permissions_settings.cy.js | 0 .../e2e/safe-apps/preview_drawer.cy.js | 0 .../e2e/safe-apps/safe_permissions.cy.js | 0 .../e2e/safe-apps/tx-builder.2spec.cy.js | 0 .../e2e/safe-apps/tx-builder.spec.cy.js | 0 .../web/cypress}/e2e/safe-apps/tx_modal.cy.js | 0 .../web/cypress}/e2e/smoke/add_owner.cy.js | 0 .../web/cypress}/e2e/smoke/address_book.cy.js | 0 .../web/cypress}/e2e/smoke/assets.cy.js | 0 .../web/cypress}/e2e/smoke/batch_tx.cy.js | 0 .../cypress}/e2e/smoke/create_safe_cf.cy.js | 0 .../e2e/smoke/create_safe_simple.cy.js | 0 .../web/cypress}/e2e/smoke/create_tx.cy.js | 0 .../web/cypress}/e2e/smoke/create_tx_2.cy.js | 0 .../web/cypress}/e2e/smoke/dashboard.cy.js | 0 .../e2e/smoke/import_export_data.cy.js | 0 .../e2e/smoke/import_export_data_2.cy.js | 0 .../web/cypress}/e2e/smoke/landing.cy.js | 0 .../web/cypress}/e2e/smoke/load_safe.cy.js | 0 .../e2e/smoke/messages_offchain.cy.js | 0 .../web/cypress}/e2e/smoke/nfts.cy.js | 0 .../cypress}/e2e/smoke/replace_owner.cy.js | 0 .../cypress}/e2e/smoke/spending_limits.cy.js | 0 .../web/cypress}/e2e/smoke/tokens.cy.js | 0 .../web/cypress}/e2e/smoke/tx_history.cy.js | 0 .../e2e/smoke/tx_history_filter.cy.js | 0 .../fixtures/address_book_addedsafes.csv | 0 .../fixtures/address_book_duplicated.csv | 0 .../fixtures/address_book_empty_test.csv | 0 .../fixtures/address_book_networks.csv | 0 .../cypress}/fixtures/address_book_test.csv | 0 .../web/cypress}/fixtures/balances.json | 0 .../web/cypress}/fixtures/data_import.json | 0 .../fixtures/invalid_image_QR_test.png | Bin .../web/cypress}/fixtures/safe-app.html | 0 .../web/cypress}/fixtures/safes/funds.json | 0 .../web/cypress}/fixtures/safes/nfts.json | 0 .../web/cypress}/fixtures/safes/recovery.json | 0 .../web/cypress}/fixtures/safes/safeapps.json | 0 .../web/cypress}/fixtures/safes/static.json | 0 .../fixtures/sepolia_test_safe_QR.png | Bin .../web/cypress}/fixtures/staking_data.json | 0 .../web/cypress}/fixtures/swaps_data.json | 0 .../cypress}/fixtures/test-empty-batch.json | 0 .../cypress}/fixtures/test-invalid-batch.json | 0 .../cypress}/fixtures/test-mainnet-batch.json | 0 .../fixtures/test-modified-batch.json | 0 .../cypress}/fixtures/test-working-batch.json | 0 .../fixtures/txhistory_data_data.json | 0 .../fixtures/txhistory_incoming_data.json | 0 .../cypress}/fixtures/txmessages_data.json | 0 .../web/cypress}/plugins/index.js | 0 .../tx_decoding.cy.js/tx_decoding.png | Bin .../web/cypress}/support/api/contracts.js | 0 .../web/cypress}/support/api/utils_ether.js | 0 .../cypress}/support/api/utils_protocolkit.js | 0 .../web/cypress}/support/commands.js | 0 .../web/cypress}/support/constants.js | 0 {cypress => apps/web/cypress}/support/e2e.js | 0 .../web/cypress}/support/localstorage_data.js | 0 .../cypress}/support/safe-apps-commands.js | 0 .../cypress}/support/safes/safesHandler.js | 0 .../web/cypress}/support/utils/checkers.js | 0 .../web/cypress}/support/utils/ethers.js | 0 .../web/cypress}/support/utils/gtag.js | 0 .../web/cypress}/support/utils/txquery.js | 0 .../web/cypress}/support/utils/wallet.js | 0 {docs => apps/web/docs}/code-style.md | 0 {docs => apps/web/docs}/environments.md | 0 {docs => apps/web/docs}/release-procedure.md | 0 {docs => apps/web/docs}/update-terms.md | 0 .../web/eslint.config.mjs | 0 jest.config.cjs => apps/web/jest.config.cjs | 0 jest.setup.js => apps/web/jest.setup.js | 0 {mocks => apps/web/mocks}/svg.js | 0 next-env.d.ts => apps/web/next-env.d.ts | 0 next.config.mjs => apps/web/next.config.mjs | 0 package.json => apps/web/package.json | 0 .../.well-known/apple-app-site-association | 0 {public => apps/web/public}/favicon.ico | Bin .../favicons/android-chrome-192x192.png | Bin .../favicons/android-chrome-512x512.png | Bin .../web/public}/favicons/apple-touch-icon.png | Bin .../web/public}/favicons/favicon-16x16.png | Bin .../web/public}/favicons/favicon-32x32.png | Bin .../web/public}/favicons/favicon-dot.ico | Bin .../web/public}/favicons/favicon.ico | Bin .../web/public}/favicons/logo_120x120.png | Bin .../web/public}/favicons/mstile-144x144.png | Bin .../web/public}/favicons/mstile-150x150.png | Bin .../web/public}/favicons/mstile-310x150.png | Bin .../web/public}/favicons/mstile-310x310.png | Bin .../web/public}/favicons/mstile-70x70.png | Bin .../public}/favicons/safari-pinned-tab.svg | 0 .../web/public}/fonts/DMSans700.woff2 | Bin .../web/public}/fonts/DMSansRegular.woff2 | Bin {public => apps/web/public}/fonts/fonts.css | 0 .../images/address-book/address-book.svg | 0 .../images/address-book/no-entries.svg | 0 .../public}/images/apps/add-custom-app.svg | 0 .../public}/images/apps/app-placeholder.svg | 0 .../web/public}/images/apps/apps-demo.svg | 0 .../web/public}/images/apps/apps-icon.svg | 0 .../web/public}/images/apps/batch-icon.svg | 0 .../web/public}/images/apps/bookmark.svg | 0 .../web/public}/images/apps/bookmarked.svg | 0 .../web/public}/images/apps/code-icon.svg | 0 .../web/public}/images/apps/explore.svg | 0 .../public}/images/apps/grid-view-icon.svg | 0 .../public}/images/apps/list-view-icon.svg | 0 .../web/public}/images/apps/network-error.svg | 0 .../web/public}/images/balances/no-assets.svg | 0 .../public}/images/common/add-outlined.svg | 0 .../web/public}/images/common/add.svg | 0 .../web/public}/images/common/alert.svg | 0 .../web/public}/images/common/arrow-down.svg | 0 .../web/public}/images/common/arrow-nw.svg | 0 .../web/public}/images/common/arrow-se.svg | 0 .../public}/images/common/arrow-top-right.svg | 0 .../web/public}/images/common/asterix.svg | 0 .../web/public}/images/common/bar-chart.svg | 0 .../web/public}/images/common/batch.svg | 0 .../web/public}/images/common/block.svg | 0 .../web/public}/images/common/bridge.svg | 0 .../web/public}/images/common/cancel.svg | 0 .../web/public}/images/common/caret-down.svg | 0 .../public}/images/common/check-filled.svg | 0 .../web/public}/images/common/check.svg | 0 .../public}/images/common/circle-check.svg | 0 .../images/common/circle-partial-fill.svg | 0 .../web/public}/images/common/circle.svg | 0 .../web/public}/images/common/clock.svg | 0 .../web/public}/images/common/close.svg | 0 .../public}/images/common/connection-dots.svg | 0 .../web/public}/images/common/copy.svg | 0 .../web/public}/images/common/created.svg | 0 .../web/public}/images/common/delete.svg | 0 .../public}/images/common/discord-icon.svg | 0 .../images/common/document_signature.svg | 0 .../web/public}/images/common/dot.svg | 0 .../public}/images/common/download-cloud.svg | 0 .../web/public}/images/common/drag.svg | 0 .../web/public}/images/common/edit.svg | 0 .../web/public}/images/common/empty-batch.svg | 0 .../web/public}/images/common/error.png | Bin .../web/public}/images/common/export.svg | 0 .../web/public}/images/common/gas-station.svg | 0 .../images/common/gnosis-chain-logo.png | Bin .../images/common/ic-rocket-speedup.svg | 0 .../web/public}/images/common/ic-swaps.svg | 0 .../web/public}/images/common/import.svg | 0 .../web/public}/images/common/kiln.svg | 0 .../web/public}/images/common/lightbulb.svg | 0 .../web/public}/images/common/link.svg | 0 .../web/public}/images/common/loading.svg | 0 .../web/public}/images/common/lock-small.svg | 0 .../public}/images/common/lock-warning.svg | 0 .../web/public}/images/common/lock.svg | 0 .../web/public}/images/common/minus.svg | 0 .../web/public}/images/common/multisend.svg | 0 .../public}/images/common/network-error.svg | 0 .../web/public}/images/common/nft-atomic0.svg | 0 .../web/public}/images/common/nft-blur.svg | 0 .../public}/images/common/nft-etherscan.svg | 0 .../public}/images/common/nft-gnosisscan.svg | 0 .../web/public}/images/common/nft-opensea.svg | 0 .../public}/images/common/nft-placeholder.png | Bin .../public}/images/common/nft-polygonscan.svg | 0 .../web/public}/images/common/nft-zapper.svg | 0 .../web/public}/images/common/nft-zerion.svg | 0 .../web/public}/images/common/nft.svg | 0 .../public}/images/common/notifications.svg | 0 .../images/common/outreach-popup-avatar.png | Bin .../web/public}/images/common/owners.svg | 0 .../web/public}/images/common/plus.svg | 0 .../images/common/propose-recovery-dark.svg | 0 .../images/common/propose-recovery-light.svg | 0 .../web/public}/images/common/qr.svg | 0 .../web/public}/images/common/question.svg | 0 .../web/public}/images/common/ramp_logo.svg | 0 .../images/common/recovery-pending.svg | 0 .../public}/images/common/recovery-plus.svg | 0 .../web/public}/images/common/recovery.svg | 0 .../public}/images/common/recovery_custom.svg | 0 .../public}/images/common/recovery_sygnum.svg | 0 .../web/public}/images/common/relayer.svg | 0 .../web/public}/images/common/rocket.svg | 0 .../public}/images/common/safe-pass-logo.svg | 0 .../public}/images/common/safe-pass-star.svg | 0 .../public}/images/common/safe-swap-dark.svg | 0 .../web/public}/images/common/safe-swap.svg | 0 .../web/public}/images/common/safe-token.svg | 0 .../public}/images/common/save-address.svg | 0 .../web/public}/images/common/search.svg | 0 .../web/public}/images/common/share.svg | 0 .../web/public}/images/common/shield-off.svg | 0 .../web/public}/images/common/shield.svg | 0 .../images/common/stake-illustration-dark.svg | 0 .../common/stake-illustration-light.svg | 0 .../web/public}/images/common/stake.svg | 0 .../web/public}/images/common/success.svg | 0 .../public}/images/common/swap-empty-dark.svg | 0 .../images/common/swap-empty-light.svg | 0 .../web/public}/images/common/swap.svg | 0 .../images/common/token-placeholder.svg | 0 .../web/public}/images/common/tx-failed.svg | 0 .../public}/images/common/walletconnect.svg | 0 .../public}/images/common/zkemail-logo.svg | 0 .../web/public}/images/logo-no-text.svg | 0 .../web/public}/images/logo-round.svg | 0 .../web/public}/images/logo-text.svg | 0 {public => apps/web/public}/images/logo.svg | 0 .../web/public}/images/messages/created.svg | 0 .../web/public}/images/messages/dot.svg | 0 .../web/public}/images/messages/link.svg | 0 .../public}/images/messages/no-messages.svg | 0 .../web/public}/images/messages/required.svg | 0 .../web/public}/images/messages/signed.svg | 0 .../public}/images/notifications/alert.svg | 0 .../public}/images/notifications/error.svg | 0 .../web/public}/images/notifications/info.svg | 0 .../images/notifications/no-notifications.svg | 0 .../notifications/push-notification.svg | 0 .../public}/images/notifications/success.svg | 0 .../public}/images/notifications/warning.svg | 0 .../images/open/safe-creation-error.svg | 0 .../images/open/safe-creation-process.gif | Bin .../web/public}/images/open/safe-creation.svg | 0 .../web/public}/images/safe-logo-green.png | Bin .../web/public}/images/settings/data/file.svg | 0 .../images/settings/permissions/shield.svg | 0 .../images/settings/setup/replace-owner.svg | 0 .../settings/spending-limit/asset-amount.svg | 0 .../settings/spending-limit/beneficiary.svg | 0 .../images/settings/spending-limit/speed.svg | 0 .../images/settings/spending-limit/time.svg | 0 .../public}/images/sidebar/address-book.svg | 0 .../web/public}/images/sidebar/apps.svg | 0 .../web/public}/images/sidebar/assets.svg | 0 .../web/public}/images/sidebar/copy-bold.svg | 0 .../public}/images/sidebar/help-center.svg | 0 .../web/public}/images/sidebar/home.svg | 0 .../web/public}/images/sidebar/link-bold.svg | 0 .../web/public}/images/sidebar/link.svg | 0 .../images/sidebar/multichain-account.svg | 0 .../web/public}/images/sidebar/qr-bold.svg | 0 .../web/public}/images/sidebar/settings.svg | 0 .../public}/images/sidebar/transactions.svg | 0 .../web/public}/images/sidebar/whats-new.svg | 0 .../web/public}/images/social-share.png | Bin .../images/transactions/blockaid-icon.svg | 0 .../images/transactions/circle-cross-red.svg | 0 .../public}/images/transactions/custom.svg | 0 .../web/public}/images/transactions/ghost.svg | 0 .../public}/images/transactions/incoming.svg | 0 .../public}/images/transactions/nestedTx.svg | 0 .../public}/images/transactions/new-tx.svg | 0 .../images/transactions/no-transactions.svg | 0 .../public}/images/transactions/outgoing.svg | 0 .../transactions/recovery-execution.svg | 0 .../transactions/recovery-recoverer.svg | 0 .../transactions/redefine-dark-mode.png | Bin .../public}/images/transactions/redefine.png | Bin .../images/transactions/replace-tx.svg | 0 .../public}/images/transactions/rocket.svg | 0 .../public}/images/transactions/settings.svg | 0 .../public}/images/transactions/signature.svg | 0 .../images/transactions/tenderly-dark.svg | 0 .../images/transactions/tenderly-light.svg | 0 .../images/transactions/transactions.svg | 0 .../images/transactions/zodiac-roles.svg | 0 .../web/public}/images/welcome/load-safe.svg | 0 .../public}/images/welcome/logo-google.svg | 0 .../web/public}/images/welcome/new-safe.svg | 0 {public => apps/web/public}/safe.webmanifest | 0 {scripts => apps/web/scripts}/cmp.sh | 0 {scripts => apps/web/scripts}/css-vars.ts | 0 .../web/scripts}/generate-routes.js | 0 .../download_bundle_analyser_artifact.sh | 0 .../github/prepare_production_deployment.sh | 0 .../web/scripts}/github/s3_upload.sh | 0 .../address-book/AddressBookHeader/index.tsx | 0 .../address-book/AddressBookTable/index.tsx | 0 .../AddressBookTable/styles.module.css | 0 .../address-book/EntryDialog/index.tsx | 0 .../address-book/ExportDialog/index.test.tsx | 0 .../address-book/ExportDialog/index.tsx | 0 .../ImportDialog/__tests__/validation.test.ts | 0 .../address-book/ImportDialog/index.tsx | 0 .../ImportDialog/styles.module.css | 0 .../address-book/ImportDialog/validation.ts | 0 .../address-book/RemoveDialog/index.tsx | 0 .../balances/AssetsHeader/index.tsx | 0 .../balances/AssetsTable/SendButton.tsx | 0 .../balances/AssetsTable/index.test.tsx | 0 .../components/balances/AssetsTable/index.tsx | 0 .../balances/AssetsTable/styles.module.css | 0 .../balances/AssetsTable/useHideAssets.ts | 0 .../__tests__/useCurrencies.test.ts | 0 .../balances/CurrencySelect/index.tsx | 0 .../balances/CurrencySelect/useCurrencies.ts | 0 .../balances/HiddenTokenButton/index.test.tsx | 0 .../balances/HiddenTokenButton/index.tsx | 0 .../HiddenTokenButton/styles.module.css | 0 .../balances/TokenListSelect/index.tsx | 0 .../components/balances/TokenMenu/index.tsx | 0 .../balances/TokenMenu/styles.module.css | 0 .../batch/BatchIndicator/BatchTooltip.tsx | 0 .../components/batch/BatchIndicator/index.tsx | 0 .../batch/BatchSidebar/BatchTxItem.tsx | 0 .../batch/BatchSidebar/BatchTxList.tsx | 0 .../batch/BatchSidebar/EmptyBatch.tsx | 0 .../components/batch/BatchSidebar/index.tsx | 0 .../batch/BatchSidebar/styles.module.css | 0 .../src}/components/common/AddFunds/index.tsx | 0 .../common/AddressBookInput/index.test.tsx | 0 .../common/AddressBookInput/index.tsx | 0 .../common/AddressBookInput/styles.module.css | 0 .../common/AddressInput/index.test.tsx | 0 .../components/common/AddressInput/index.tsx | 0 .../common/AddressInput/styles.module.css | 0 .../common/AddressInput/useNameResolver.ts | 0 .../common/AddressInputReadOnly/index.tsx | 0 .../AddressInputReadOnly/styles.module.css | 0 .../common/BlockedAddress/index.tsx | 0 .../common/BlockedAddress/styles.module.css | 0 .../common/BuyCryptoButton/index.tsx | 0 .../common/BuyCryptoButton/styles.module.css | 0 .../common/ChainIndicator/index.tsx | 0 .../common/ChainIndicator/styles.module.css | 0 .../components/common/ChainSwitcher/index.tsx | 0 .../common/ChainSwitcher/styles.module.css | 0 .../common/CheckWallet/index.test.tsx | 0 .../components/common/CheckWallet/index.tsx | 0 .../web/src}/components/common/Chip/index.tsx | 0 .../components/common/ChoiceButton/index.tsx | 0 .../common/ChoiceButton/styles.module.css | 0 .../common/ConnectWallet/AccountCenter.tsx | 0 .../ConnectWallet/ConnectWalletButton.tsx | 0 .../common/ConnectWallet/ConnectionCenter.tsx | 0 .../__tests__/AccountCenter.test.tsx | 0 .../__tests__/ConnectionCenter.test.tsx | 0 .../components/common/ConnectWallet/index.tsx | 0 .../common/ConnectWallet/styles.module.css | 0 .../common/ConnectWallet/useConnectWallet.ts | 0 .../components/common/ContextMenu/index.tsx | 0 .../common/ContextMenu/styles.module.css | 0 .../common/CookieAndTermBanner/index.tsx | 0 .../CookieAndTermBanner/styles.module.css | 0 .../common/CooldownButton/index.test.tsx | 0 .../common/CooldownButton/index.tsx | 0 .../__tests__/index.test.tsx | 0 .../common/CopyAddressButton/index.tsx | 0 .../common/CopyButton/index.stories.tsx | 0 .../components/common/CopyButton/index.tsx | 0 .../common/CopyTooltip/ConfirmCopyModal.tsx | 0 .../components/common/CopyTooltip/index.tsx | 0 .../common/CopyTooltip/styles.module.css | 0 .../common/Countdown/index.test.tsx | 0 .../components/common/Countdown/index.tsx | 0 .../components/common/CustomLink/index.tsx | 0 .../components/common/CustomTooltip/index.tsx | 0 .../common/DatePickerInput/index.tsx | 0 .../common/DateTime/DateTime.stories.tsx | 0 .../components/common/DateTime/DateTime.tsx | 0 .../common/DateTime/DateTimeContainer.tsx | 0 .../components/common/DateTime/index.test.tsx | 0 .../src}/components/common/DateTime/index.tsx | 0 .../common/Disclaimer/index.stories.tsx | 0 .../components/common/Disclaimer/index.tsx | 0 .../common/Disclaimer/styles.module.css | 0 .../components/common/EnhancedTable/index.tsx | 0 .../common/EnhancedTable/styles.module.css | 0 .../components/common/ErrorBoundary/index.tsx | 0 .../common/ErrorBoundary/styles.module.css | 0 .../SrcEthHashInfo/index.stories.tsx | 0 .../EthHashInfo/SrcEthHashInfo/index.tsx | 0 .../SrcEthHashInfo/styles.module.css | 0 .../common/EthHashInfo/index.stories.tsx | 0 .../common/EthHashInfo/index.test.tsx | 0 .../components/common/EthHashInfo/index.tsx | 0 .../common/ExplorerButton/index.tsx | 0 .../components/common/ExternalLink/index.tsx | 0 .../common/FiatValue/FiatValue.test.tsx | 0 .../components/common/FiatValue/index.tsx | 0 .../components/common/FileUpload/index.tsx | 0 .../common/FileUpload/styles.module.css | 0 .../src}/components/common/Footer/index.tsx | 0 .../common/Footer/styles.module.css | 0 .../common/GeoblockingProvider/index.tsx | 0 .../components/common/Header/index.test.tsx | 0 .../src}/components/common/Header/index.tsx | 0 .../common/Header/styles.module.css | 0 .../components/common/Identicon/index.tsx | 0 .../common/Identicon/styles.module.css | 0 .../components/common/ImageFallback/index.tsx | 0 .../common/InfiniteScroll/index.tsx | 0 .../common/InputValueHelper/index.tsx | 0 .../common/LegalDisclaimerContent/index.tsx | 0 .../LegalDisclaimerContent/styles.module.css | 0 .../src}/components/common/MetaTags/index.tsx | 0 .../components/common/ModalDialog/index.tsx | 0 .../common/ModalDialog/styles.module.css | 0 .../src}/components/common/Mui/index.test.tsx | 0 .../web/src}/components/common/Mui/index.tsx | 0 .../components/common/NameInput/index.tsx | 0 .../common/NamedAddressInfo/index.test.tsx | 0 .../common/NamedAddressInfo/index.tsx | 0 .../src}/components/common/NavTabs/index.tsx | 0 .../common/NavTabs/styles.module.css | 0 .../components/common/Navigate/index.test.tsx | 0 .../src}/components/common/Navigate/index.tsx | 0 .../components/common/NetworkInput/index.tsx | 0 .../common/NetworkInput/styles.module.css | 0 .../NetworkSelector/NetworkMultiSelector.tsx | 0 .../__tests__/NetworkMultiSelector.test.tsx | 0 .../common/NetworkSelector/index.tsx | 0 .../common/NetworkSelector/styles.module.css | 0 .../NetworkSelector/useChangeNetworkLink.ts | 0 .../components/common/Notifications/index.tsx | 0 .../common/Notifications/styles.module.css | 0 .../common/Notifications/useCounter.ts | 0 .../common/NumberField/index.test.ts | 0 .../components/common/NumberField/index.tsx | 0 .../__tests__/OnboardingTooltip.test.tsx | 0 .../common/OnboardingTooltip/index.tsx | 0 .../components/common/PageHeader/index.tsx | 0 .../common/PageHeader/styles.module.css | 0 .../common/PageLayout/SideDrawer.tsx | 0 .../components/common/PageLayout/index.tsx | 0 .../common/PageLayout/styles.module.css | 0 .../common/PagePlaceholder/index.tsx | 0 .../common/PagePlaceholder/styles.module.css | 0 .../common/PaginatedTxns/SkeletonTxList.tsx | 0 .../components/common/PaginatedTxns/index.tsx | 0 .../src}/components/common/Popup/index.tsx | 0 .../components/common/ProgressBar/index.tsx | 0 .../common/ProgressBar/styles.module.css | 0 .../src}/components/common/QRCode/index.tsx | 0 .../src}/components/common/SafeIcon/index.tsx | 0 .../common/SafeIcon/styles.module.css | 0 .../common/SafeLoadingError/index.tsx | 0 .../__tests__/SafeTokenWidget.test.tsx | 0 .../common/SafeTokenWidget/index.tsx | 0 .../common/SafeTokenWidget/styles.module.css | 0 .../common/SpendingLimitLabel/index.tsx | 0 .../src}/components/common/Sticky/index.tsx | 0 .../common/Table/DataRow.stories.tsx | 0 .../src}/components/common/Table/DataRow.tsx | 0 .../common/Table/DataTable.stories.tsx | 0 .../components/common/Table/DataTable.tsx | 0 .../src}/components/common/Table/EmptyRow.tsx | 0 .../components/common/Table/styles.module.css | 0 .../common/TokenAmount/index.stories.tsx | 0 .../common/TokenAmount/index.test.tsx | 0 .../components/common/TokenAmount/index.tsx | 0 .../common/TokenAmount/styles.module.css | 0 .../common/TokenAmountInput/index.tsx | 0 .../common/TokenAmountInput/styles.module.css | 0 .../common/TokenExplorerLink/index.tsx | 0 .../components/common/TokenIcon/index.tsx | 0 .../common/TokenIcon/styles.module.css | 0 .../src}/components/common/Track/index.tsx | 0 .../components/common/TxModalDialog/index.tsx | 0 .../common/TxModalDialog/styles.module.css | 0 .../components/common/UnreadBadge/index.tsx | 0 .../common/WalletBalance/index.test.tsx | 0 .../components/common/WalletBalance/index.tsx | 0 .../components/common/WalletIcon/index.tsx | 0 .../common/WalletInfo/index.test.tsx | 0 .../components/common/WalletInfo/index.tsx | 0 .../common/WalletInfo/styles.module.css | 0 .../common/WalletOverview/index.tsx | 0 .../common/WalletOverview/styles.module.css | 0 .../common/WalletProvider/index.tsx | 0 .../common/WidgetDisclaimer/index.tsx | 0 .../common/WidgetDisclaimer/styles.module.css | 0 .../common/icons/CircularIcon/index.tsx | 0 .../icons/CircularIcon/styles.module.css | 0 .../common/icons/KeyholeIcon/index.tsx | 0 .../common/icons/KeyholeIcon/keyhole.svg | 0 .../components/dashboard/Assets/index.tsx | 0 .../components/dashboard/FirstSteps/index.tsx | 0 .../dashboard/FirstSteps/styles.module.css | 0 .../GovernanceSection/GovernanceSection.tsx | 0 .../GovernanceSection/styles.module.css | 0 .../dashboard/Overview/Overview.tsx | 0 .../PendingTxs/PendingRecoveryListItem.tsx | 0 .../PendingTxs/PendingTxList.test.ts | 0 .../PendingTxs/PendingTxListItem.tsx | 0 .../dashboard/PendingTxs/PendingTxsList.tsx | 0 .../dashboard/PendingTxs/styles.module.css | 0 .../SafeAppsDashboardSection.tsx | 0 .../SafeAppsDashboardSection.test.tsx | 0 .../styles.module.css | 0 .../dashboard/StakingBanner/index.tsx | 0 .../dashboard/StakingBanner/styles.module.css | 0 .../web/src}/components/dashboard/index.tsx | 0 .../web/src}/components/dashboard/styled.tsx | 0 .../components/dashboard/styles.module.css | 0 .../components/new-safe/CardStepper/index.tsx | 0 .../new-safe/CardStepper/styles.module.css | 0 .../new-safe/CardStepper/useCardStepper.ts | 0 .../components/new-safe/OwnerRow/index.tsx | 0 .../new-safe/OwnerRow/styles.module.css | 0 .../components/new-safe/ReviewRow/index.tsx | 0 .../new-safe/create/AdvancedCreateSafe.tsx | 0 .../new-safe/create/CreateSafeInfos/index.tsx | 0 .../new-safe/create/InfoWidget/index.tsx | 0 .../create/InfoWidget/styles.module.css | 0 .../new-safe/create/NetworkWarning/index.tsx | 0 .../create/NoWalletConnectedWarning/index.tsx | 0 .../new-safe/create/OverviewWidget/index.tsx | 0 .../create/OverviewWidget/styles.module.css | 0 .../useEstimateSafeCreationGas.test.ts | 0 .../__tests__/useSyncSafeCreationStep.test.ts | 0 .../src}/components/new-safe/create/index.tsx | 0 .../new-safe/create/logic/address-book.ts | 0 .../new-safe/create/logic/index.test.ts | 0 .../components/new-safe/create/logic/index.ts | 0 .../new-safe/create/logic/utils.test.ts | 0 .../components/new-safe/create/logic/utils.ts | 0 .../steps/AdvancedOptionsStep/index.tsx | 0 .../create/steps/OwnerPolicyStep/index.tsx | 0 .../OwnerPolicyStep/useSafeSetupHints.ts | 0 .../create/steps/ReviewStep/index.test.tsx | 0 .../create/steps/ReviewStep/index.tsx | 0 .../create/steps/ReviewStep/styles.module.css | 0 .../create/steps/SetNameStep/index.tsx | 0 .../steps/SetNameStep/styles.module.css | 0 .../steps/StatusStep/LoadingSpinner/index.tsx | 0 .../LoadingSpinner/styles.module.css | 0 .../create/steps/StatusStep/StatusMessage.tsx | 0 .../create/steps/StatusStep/StatusStep.tsx | 0 .../create/steps/StatusStep/index.tsx | 0 .../create/steps/StatusStep/styles.module.css | 0 .../steps/StatusStep/useUndeployedSafe.ts | 0 .../new-safe/create/styles.module.css | 0 .../components/new-safe/create/types.d.ts | 0 .../create/useEstimateSafeCreationGas.ts | 0 .../create/useSyncSafeCreationStep.ts | 0 .../src}/components/new-safe/load/index.tsx | 0 .../load/steps/SafeOwnerStep/index.tsx | 0 .../load/steps/SafeReviewStep/index.tsx | 0 .../load/steps/SetAddressStep/index.tsx | 0 .../components/nfts/NftCollections/index.tsx | 0 .../src}/components/nfts/NftGrid/index.tsx | 0 .../components/nfts/NftPreviewModal/index.tsx | 0 .../nfts/NftPreviewModal/styles.module.css | 0 .../components/nfts/NftSendForm/index.tsx | 0 .../web/src}/components/nfts/config.ts | 0 .../NotificationCenter/index.tsx | 0 .../NotificationCenter/styles.module.css | 0 .../NotificationCenterItem/index.tsx | 0 .../NotificationCenterItem/styles.module.css | 0 .../NotificationCenterList/index.tsx | 0 .../NotificationCenterList/styles.module.css | 0 .../safe-apps/AddCustomAppModal/CustomApp.tsx | 0 .../CustomAppPlaceholder.tsx | 0 .../safe-apps/AddCustomAppModal/index.tsx | 0 .../AddCustomAppModal/styles.module.css | 0 .../safe-apps/AddCustomSafeAppCard/index.tsx | 0 .../safe-apps/AppFrame/SafeAppIframe.tsx | 0 .../AppFrame/ThirdPartyCookiesWarning.tsx | 0 .../AppFrame/TransactionQueueBar/index.tsx | 0 .../TransactionQueueBar/styles.module.css | 0 .../AppFrame/__tests__/AppFrame.test.tsx | 0 .../components/safe-apps/AppFrame/index.tsx | 0 .../safe-apps/AppFrame/styles.module.css | 0 .../safe-apps/AppFrame/useAppCommunicator.ts | 0 .../safe-apps/AppFrame/useAppIsLoading.ts | 0 .../safe-apps/AppFrame/useFromAppAnalytics.ts | 0 .../safe-apps/AppFrame/useGetSafeInfo.ts | 0 .../AppFrame/useThirdPartyCookies.ts | 0 .../AppFrame/useTransactionQueueBarState.ts | 0 .../NativeSwapsCard/index.stories.tsx | 0 .../safe-apps/NativeSwapsCard/index.tsx | 0 .../NativeSwapsCard/styles.module.css | 0 .../safe-apps/PermissionCheckbox.tsx | 0 .../safe-apps/PermissionsPrompt.tsx | 0 .../safe-apps/RemoveCustomAppModal.tsx | 0 .../safe-apps/SafeAppActionButtons/index.tsx | 0 .../safe-apps/SafeAppCard/index.tsx | 0 .../safe-apps/SafeAppCard/styles.module.css | 0 .../safe-apps/SafeAppIconCard/index.test.tsx | 0 .../safe-apps/SafeAppIconCard/index.tsx | 0 .../SafeAppLandingPage/AppActions.tsx | 0 .../SafeAppLandingPage/SafeAppDetails.tsx | 0 .../safe-apps/SafeAppLandingPage/TryDemo.tsx | 0 .../safe-apps/SafeAppLandingPage/constants.ts | 0 .../safe-apps/SafeAppLandingPage/index.tsx | 0 .../safe-apps/SafeAppList/index.tsx | 0 .../safe-apps/SafeAppList/styles.module.css | 0 .../safe-apps/SafeAppPreviewDrawer/index.tsx | 0 .../SafeAppPreviewDrawer/styles.module.css | 0 .../SafeAppSocialLinksCard.test.tsx | 0 .../SafeAppSocialLinksCard/index.tsx | 0 .../SafeAppSocialLinksCard/styles.module.css | 0 .../safe-apps/SafeAppTags/index.tsx | 0 .../safe-apps/SafeAppTags/styles.module.css | 0 .../SafeAppsLoadError.tsx | 0 .../safe-apps/SafeAppsErrorBoundary/index.tsx | 0 .../SafeAppsErrorBoundary/styles.module.css | 0 .../safe-apps/SafeAppsFilters/index.tsx | 0 .../SafeAppsFilters/styles.module.css | 0 .../safe-apps/SafeAppsHeader/index.tsx | 0 .../SafeAppsHeader/styles.module.css | 0 .../SafeAppsInfoModal/AllowedFeaturesList.tsx | 0 .../safe-apps/SafeAppsInfoModal/Domain.tsx | 0 .../safe-apps/SafeAppsInfoModal/Slider.tsx | 0 .../SafeAppsInfoModal/UnknownAppWarning.tsx | 0 .../safe-apps/SafeAppsInfoModal/constants.ts | 0 .../safe-apps/SafeAppsInfoModal/index.tsx | 0 .../SafeAppsInfoModal/styles.module.css | 0 .../SafeAppsInfoModal/useSafeAppsInfoModal.ts | 0 .../safe-apps/SafeAppsListHeader/index.tsx | 0 .../SafeAppsListHeader/styles.module.css | 0 .../safe-apps/SafeAppsSDKLink/index.tsx | 0 .../SafeAppsSDKLink/styles.module.css | 0 .../SafeAppsZeroResultsPlaceholder/index.tsx | 0 .../safe-apps/hooks/useShareSafeAppUrl.ts | 0 .../web/src}/components/safe-apps/types.ts | 0 .../web/src}/components/safe-apps/utils.ts | 0 .../safe-messages/DecodedMsg/index.tsx | 0 .../DecodedMsg/styles.module.css | 0 .../safe-messages/InfoBox/index.tsx | 0 .../safe-messages/InfoBox/styles.module.css | 0 .../components/safe-messages/Msg/index.tsx | 0 .../safe-messages/Msg/styles.module.css | 0 .../safe-messages/MsgDetails/index.tsx | 0 .../safe-messages/MsgList/index.tsx | 0 .../MsgListItem/ExpandableMsgItem.tsx | 0 .../safe-messages/MsgListItem/index.tsx | 0 .../safe-messages/MsgShareLink/index.tsx | 0 .../MsgSigners/MsgSigners.test.tsx | 0 .../safe-messages/MsgSigners/index.tsx | 0 .../MsgSigners/styles.module.css | 0 .../safe-messages/MsgSummary/index.tsx | 0 .../safe-messages/MsgType/index.tsx | 0 .../safe-messages/PaginatedMsgs/index.tsx | 0 .../safe-messages/SignMsgButton/index.tsx | 0 .../SingleMsg/SingleMsg.test.tsx | 0 .../safe-messages/SingleMsg/index.tsx | 0 .../settings/ContractVersion/index.tsx | 0 .../settings/DataManagement/FileListCard.tsx | 0 .../settings/DataManagement/ImportDialog.tsx | 0 .../DataManagement/ImportFileUpload.tsx | 0 .../useGlobalImportFileParser.test.ts | 0 .../settings/DataManagement/index.tsx | 0 .../settings/DataManagement/styles.module.css | 0 .../useGlobalImportFileParser.ts | 0 .../EnvHintButton/index.tsx | 0 .../EnvHintButton/styles.module.css | 0 .../settings/EnvironmentVariables/index.tsx | 0 .../FallbackHandler/__tests__/index.test.tsx | 0 .../settings/FallbackHandler/index.tsx | 0 .../settings/ProposersList/index.tsx | 0 .../GlobalPushNotifications.tsx | 0 .../__tests__/GlobalPushNotifications.test.ts | 0 .../PushNotifications/__tests__/logic.test.ts | 0 .../useNotificationPreferences.test.ts | 0 .../useNotificationRegistrations.test.ts | 0 .../__tests__/useNotificationTracking.test.ts | 0 .../hooks/useNotificationPreferences.ts | 0 .../hooks/useNotificationRegistrations.ts | 0 .../hooks/useNotificationTracking.ts | 0 .../settings/PushNotifications/index.tsx | 0 .../settings/PushNotifications/logic.ts | 0 .../PushNotifications/styles.module.css | 0 .../settings/RequiredConfirmations/index.tsx | 0 .../settings/SafeAppsPermissions/index.tsx | 0 .../SafeAppsSigningMethod/index.test.tsx | 0 .../settings/SafeAppsSigningMethod/index.tsx | 0 .../__tests__/SafeModules.test.tsx | 0 .../components/settings/SafeModules/index.tsx | 0 .../settings/SecurityLogin/index.tsx | 0 .../settings/SecuritySettings/index.tsx | 0 .../settings/SettingsHeader/index.test.tsx | 0 .../settings/SettingsHeader/index.tsx | 0 .../SpendingLimits/NoSpendingLimits.tsx | 0 .../SpendingLimits/SpendingLimitsTable.tsx | 0 .../settings/SpendingLimits/index.tsx | 0 .../__tests__/TransactionGuards.test.tsx | 0 .../settings/TransactionGuards/index.tsx | 0 .../TransactionGuards/styles.module.css | 0 .../settings/owner/EditOwnerDialog/index.tsx | 0 .../settings/owner/OwnerList/index.tsx | 0 .../components/sidebar/DebugToggle/index.tsx | 0 .../sidebar/IndexingStatus/index.tsx | 0 .../components/sidebar/NewTxButton/index.tsx | 0 .../sidebar/QrCodeButton/QrModal.tsx | 0 .../components/sidebar/QrCodeButton/index.tsx | 0 .../MultiAccountContextMenu.tsx | 0 .../sidebar/SafeListContextMenu/index.tsx | 0 .../sidebar/SafeListRemoveDialog/index.tsx | 0 .../src}/components/sidebar/Sidebar/index.tsx | 0 .../sidebar/Sidebar/styles.module.css | 0 .../sidebar/SidebarFooter/index.tsx | 0 .../sidebar/SidebarHeader/index.tsx | 0 .../sidebar/SidebarHeader/styles.module.css | 0 .../components/sidebar/SidebarList/index.tsx | 0 .../sidebar/SidebarList/styles.module.css | 0 .../sidebar/SidebarNavigation/config.tsx | 0 .../sidebar/SidebarNavigation/index.tsx | 0 .../sidebar/WatchlistAddButton/index.tsx | 0 .../components/theme/SafeThemeProvider.tsx | 0 .../web/src}/components/theme/darkPalette.ts | 0 .../web/src}/components/theme/lightPalette.ts | 0 .../web/src}/components/theme/safeTheme.ts | 0 .../web/src}/components/theme/typography.ts | 0 .../BatchExecuteHoverProvider.tsx | 0 .../transactions/BatchExecuteButton/index.tsx | 0 .../transactions/BulkTxListGroup/index.tsx | 0 .../BulkTxListGroup/styles.module.css | 0 .../transactions/ExecuteTxButton/index.tsx | 0 .../transactions/GroupLabel/index.tsx | 0 .../transactions/GroupLabel/styles.module.css | 0 .../ReplaceTxHoverProvider.tsx | 0 .../transactions/GroupedTxListItems/index.tsx | 0 .../GroupedTxListItems/styles.module.css | 0 .../HexEncodedData/HexEncodedData.test.tsx | 0 .../HexEncodedData.test.tsx.snap | 0 .../transactions/HexEncodedData/index.tsx | 0 .../HexEncodedData/styles.module.css | 0 .../ImitationTransactionWarning/index.tsx | 0 .../styles.module.css | 0 .../transactions/InfoDetails/index.tsx | 0 .../InfoDetails/styles.module.css | 0 .../transactions/MaliciousTxWarning/index.tsx | 0 .../transactions/RejectTxButton/index.tsx | 0 .../transactions/SafeCreationTx/index.tsx | 0 .../SafeCreationTx/styles.module.css | 0 .../transactions/SignTxButton/index.test.tsx | 0 .../transactions/SignTxButton/index.tsx | 0 .../SignTxButton/styles.module.css | 0 .../SignedMessagesHelpLink/index.tsx | 0 .../transactions/SingleTx/SingleTx.test.tsx | 0 .../transactions/SingleTx/index.tsx | 0 .../TrustedToggle/TrustedToggleButton.tsx | 0 .../transactions/TrustedToggle/index.tsx | 0 .../transactions/TxConfirmations/index.tsx | 0 .../transactions/TxDateLabel/index.tsx | 0 .../TxDateLabel/styles.module.css | 0 .../transactions/TxDetails/SafeTxGasForm.tsx | 0 .../Summary/SafeTxHashDataRow/index.tsx | 0 .../TxDetails/Summary/TxDataRow/index.tsx | 0 .../transactions/TxDetails/Summary/index.tsx | 0 .../TxDetails/Summary/styles.module.css | 0 .../TxData/DecodedData/MethodCall.tsx | 0 .../DecodedData/MethodDetails/index.tsx | 0 .../TxData/DecodedData/Multisend/index.tsx | 0 .../DecodedData/Multisend/styles.module.css | 0 .../SingleTxDecoded/index.test.tsx | 0 .../DecodedData/SingleTxDecoded/index.tsx | 0 .../SingleTxDecoded/styles.module.css | 0 .../ValueArray/ValueArray.test.tsx | 0 .../TxData/DecodedData/ValueArray/index.tsx | 0 .../DecodedData/ValueArray/styles.module.css | 0 .../TxData/DecodedData/index.test.tsx | 0 .../TxDetails/TxData/DecodedData/index.tsx | 0 .../TxData/MigrationToL2TxData/index.tsx | 0 .../ExecTransaction/index.tsx | 0 .../NestedTransaction/NestedTransaction.tsx | 0 .../OnChainConfirmation/index.tsx | 0 .../TxDetails/TxData/Rejection/index.tsx | 0 .../TxDetails/TxData/SafeUpdate/index.tsx | 0 .../TxDetails/TxData/SettingsChange/index.tsx | 0 .../TxDetails/TxData/SpendingLimits/index.tsx | 0 .../TxData/SpendingLimits/styles.module.css | 0 .../TxData/Transfer/TransferActions.tsx | 0 .../TxDetails/TxData/Transfer/index.test.tsx | 0 .../TxDetails/TxData/Transfer/index.tsx | 0 .../transactions/TxDetails/TxData/index.tsx | 0 .../transactions/TxDetails/index.tsx | 0 .../transactions/TxDetails/styles.module.css | 0 .../TxFilterForm/TxFilterForm.test.tsx | 0 .../transactions/TxFilterForm/index.tsx | 0 .../TxFilterForm/styles.module.css | 0 .../transactions/TxHeader/index.tsx | 0 .../components/transactions/TxInfo/index.tsx | 0 .../transactions/TxInfo/styles.module.css | 0 .../components/transactions/TxList/index.tsx | 0 .../transactions/TxList/styles.module.css | 0 .../TxListItem/ExpandableTransactionItem.tsx | 0 .../transactions/TxListItem/index.tsx | 0 .../transactions/TxListItem/styles.module.css | 0 .../transactions/TxNavigation/index.tsx | 0 .../transactions/TxShareLink/index.tsx | 0 .../transactions/TxSigners/index.tsx | 0 .../transactions/TxSigners/styles.module.css | 0 .../TxStatusChip/index.stories.tsx | 0 .../transactions/TxStatusChip/index.tsx | 0 .../transactions/TxStatusLabel/index.tsx | 0 .../transactions/TxSummary/QueueActions.tsx | 0 .../transactions/TxSummary/index.test.tsx | 0 .../transactions/TxSummary/index.tsx | 0 .../transactions/TxSummary/styles.module.css | 0 .../components/transactions/TxType/index.tsx | 0 .../transactions/TxType/styles.module.css | 0 .../components/transactions/Warning/index.tsx | 0 .../transactions/Warning/styles.module.css | 0 .../components/tx-flow/SafeTxProvider.tsx | 0 .../components/tx-flow/TxInfoProvider.tsx | 0 .../tx-flow/common/OwnerList/index.tsx | 0 .../common/OwnerList/styles.module.css | 0 .../components/tx-flow/common/TxButton.tsx | 0 .../tx-flow/common/TxCard/index.tsx | 0 .../tx-flow/common/TxLayout/index.tsx | 0 .../tx-flow/common/TxLayout/styles.module.css | 0 .../tx-flow/common/TxNonce/index.tsx | 0 .../tx-flow/common/TxNonce/styles.module.css | 0 .../tx-flow/common/TxStatusWidget/index.tsx | 0 .../common/TxStatusWidget/styles.module.css | 0 .../components/tx-flow/common/constants.ts | 0 .../tx-flow/common/styles.module.css | 0 .../tx-flow/flows/AddOwner/ChooseOwner.tsx | 0 .../tx-flow/flows/AddOwner/ReviewOwner.tsx | 0 .../tx-flow/flows/AddOwner/context.ts | 0 .../tx-flow/flows/AddOwner/index.tsx | 0 .../CancelRecoveryFlowReview.tsx | 0 .../CancelRecovery/CancelRecoveryOverview.tsx | 0 .../tx-flow/flows/CancelRecovery/index.tsx | 0 .../flows/CancelRecovery/styles.module.css | 0 .../flows/ChangeThreshold/ChooseThreshold.tsx | 0 .../ChangeThreshold/ReviewChangeThreshold.tsx | 0 .../tx-flow/flows/ChangeThreshold/context.tsx | 0 .../tx-flow/flows/ChangeThreshold/index.tsx | 0 .../tx-flow/flows/ConfirmBatch/index.tsx | 0 .../flows/ConfirmTx/ConfirmProposedTx.tsx | 0 .../tx-flow/flows/ConfirmTx/index.tsx | 0 .../tx-flow/flows/ExecuteBatch/DecodedTxs.tsx | 0 .../flows/ExecuteBatch/ReviewBatch.tsx | 0 .../tx-flow/flows/ExecuteBatch/index.tsx | 0 .../flows/NestedTxSuccessScreen/index.tsx | 0 .../NestedTxSuccessScreen/styles.module.css | 0 .../NewSpendingLimit/CreateSpendingLimit.tsx | 0 .../NewSpendingLimit/ReviewSpendingLimit.tsx | 0 .../__tests__/SpendingLimitForm.test.ts | 0 .../tx-flow/flows/NewSpendingLimit/index.tsx | 0 .../components/tx-flow/flows/NewTx/index.tsx | 0 .../tx-flow/flows/NewTx/styles.module.css | 0 .../flows/NftTransfer/ReviewNftBatch.tsx | 0 .../flows/NftTransfer/SendNftBatch.tsx | 0 .../tx-flow/flows/NftTransfer/index.tsx | 0 .../RecoverAccountFlowReview.tsx | 0 .../RecoverAccountFlowSetup.tsx | 0 .../__tests__/RecoverAccountFlowSetup.test.ts | 0 .../tx-flow/flows/RecoverAccount/index.tsx | 0 .../RecoveryAttempt/RecoveryAttemptReview.tsx | 0 .../tx-flow/flows/RecoveryAttempt/index.tsx | 0 .../tx-flow/flows/RejectTx/RejectTx.tsx | 0 .../tx-flow/flows/RejectTx/index.tsx | 0 .../flows/RemoveGuard/ReviewRemoveGuard.tsx | 0 .../tx-flow/flows/RemoveGuard/index.tsx | 0 .../flows/RemoveModule/ReviewRemoveModule.tsx | 0 .../tx-flow/flows/RemoveModule/index.tsx | 0 .../flows/RemoveOwner/ReviewRemoveOwner.tsx | 0 .../flows/RemoveOwner/SetThreshold.tsx | 0 .../tx-flow/flows/RemoveOwner/index.tsx | 0 .../flows/RemoveOwner/styles.module.css | 0 .../RemoveRecoveryFlowOverview.tsx | 0 .../RemoveRecoveryFlowReview.tsx | 0 .../tx-flow/flows/RemoveRecovery/index.tsx | 0 .../RemoveSpendingLimit.tsx | 0 .../flows/RemoveSpendingLimit/index.tsx | 0 .../tx-flow/flows/ReplaceOwner/index.tsx | 0 .../tx-flow/flows/ReplaceTx/DeleteTxModal.tsx | 0 .../tx-flow/flows/ReplaceTx/index.tsx | 0 .../tx-flow/flows/ReplaceTx/styles.module.css | 0 .../flows/SafeAppsTx/ReviewSafeAppsTx.tsx | 0 .../tx-flow/flows/SafeAppsTx/index.tsx | 0 .../flows/SignMessage/SignMessage.test.tsx | 0 .../tx-flow/flows/SignMessage/SignMessage.tsx | 0 .../tx-flow/flows/SignMessage/index.tsx | 0 .../ReviewSignMessageOnChain.test.tsx | 0 .../ReviewSignMessageOnChain.tsx | 0 .../flows/SignMessageOnChain/index.tsx | 0 .../flows/SuccessScreen/StatusMessage.tsx | 0 .../flows/SuccessScreen/StatusStepper.tsx | 0 .../tx-flow/flows/SuccessScreen/index.tsx | 0 .../SuccessScreen/statuses/DefaultStatus.tsx | 0 .../SuccessScreen/statuses/IndexingStatus.tsx | 0 .../statuses/ProcessingStatus.tsx | 0 .../flows/SuccessScreen/styles.module.css | 0 .../TokenTransfer/CreateTokenTransfer.tsx | 0 .../TokenTransfer/ReviewSpendingLimitTx.tsx | 0 .../TokenTransfer/ReviewTokenTransfer.tsx | 0 .../flows/TokenTransfer/ReviewTokenTx.tsx | 0 .../flows/TokenTransfer/SendAmountBlock.tsx | 0 .../TokenTransfer/SpendingLimitRow/index.tsx | 0 .../SpendingLimitRow/styles.module.css | 0 .../__tests__/CreateTokenTransfer.test.tsx | 0 .../TokenTransfer/__tests__/utils.test.ts | 0 .../tx-flow/flows/TokenTransfer/index.tsx | 0 .../tx-flow/flows/TokenTransfer/utils.ts | 0 .../flows/UpdateSafe/UpdateSafeReview.tsx | 0 .../tx-flow/flows/UpdateSafe/index.tsx | 0 .../RecovererSmartContractWarning.tsx | 0 .../UpsertRecoveryFlowIntro.tsx | 0 .../UpsertRecoveryFlowReview.tsx | 0 .../UpsertRecoveryFlowSettings.tsx | 0 .../tx-flow/flows/UpsertRecovery/index.tsx | 0 .../flows/UpsertRecovery/styles.module.css | 0 .../UpsertRecovery/useRecoveryPeriods.ts | 0 .../tx-flow/flows/UpsertRecovery/utils.ts | 0 .../src}/components/tx-flow/flows/index.ts | 0 .../web/src}/components/tx-flow/index.tsx | 0 .../src}/components/tx-flow/useTxStepper.tsx | 0 .../tx/AdvancedParams/AdvancedParamsForm.tsx | 0 .../tx/AdvancedParams/GasLimitInput.tsx | 0 .../components/tx/AdvancedParams/index.tsx | 0 .../components/tx/AdvancedParams/types.ts | 0 .../tx/AdvancedParams/useAdvancedParams.ts | 0 .../tx/AdvancedParams/useUserNonce.ts | 0 .../tx/ApprovalEditor/ApprovalEditor.test.tsx | 0 .../ApprovalEditorForm.test.tsx | 0 .../tx/ApprovalEditor/ApprovalEditorForm.tsx | 0 .../tx/ApprovalEditor/ApprovalItem.tsx | 0 .../tx/ApprovalEditor/ApprovalValueField.tsx | 0 .../tx/ApprovalEditor/Approvals.tsx | 0 .../ApprovalEditor/EditableApprovalItem.tsx | 0 .../tx/ApprovalEditor/SpenderField.tsx | 0 .../hooks/useApprovalInfos.test.ts | 0 .../ApprovalEditor/hooks/useApprovalInfos.ts | 0 .../components/tx/ApprovalEditor/index.tsx | 0 .../tx/ApprovalEditor/styles.module.css | 0 .../tx/ApprovalEditor/utils/approvals.ts | 0 .../src}/components/tx/BalanceInfo/index.tsx | 0 .../tx/BalanceInfo/styles.module.css | 0 .../ConfirmationOrderHeader.tsx | 0 .../components/tx/DecodedTx/HelpTooltip.tsx | 0 .../components/tx/DecodedTx/index.test.tsx | 0 .../src}/components/tx/DecodedTx/index.tsx | 0 .../src}/components/tx/ErrorMessage/index.tsx | 0 .../tx/ErrorMessage/styles.module.css | 0 .../components/tx/ExecuteCheckbox/index.tsx | 0 .../tx/ExecuteCheckbox/styles.module.css | 0 .../tx/ExecutionMethodSelector/index.tsx | 0 .../ExecutionMethodSelector/styles.module.css | 0 .../src}/components/tx/FieldsGrid/index.tsx | 0 .../tx/GasParams/GasParams.test.tsx | 0 .../src}/components/tx/GasParams/index.tsx | 0 .../components/tx/GasParams/styles.module.css | 0 .../tx/RemainingRelays/index.test.tsx | 0 .../components/tx/RemainingRelays/index.tsx | 0 .../components/tx/SendFromBlock/index.tsx | 0 .../tx/SendFromBlock/styles.module.css | 0 .../src}/components/tx/SendToBlock/index.tsx | 0 .../tx/SignOrExecuteForm/BatchButton.tsx | 0 .../SignOrExecuteForm/ConfirmationTitle.tsx | 0 .../tx/SignOrExecuteForm/ExecuteForm.tsx | 0 .../__test__/ExecuteThroughRoleForm.test.tsx | 0 .../__test__/hooks.test.ts | 0 .../ExecuteThroughRoleForm/hooks.ts | 0 .../ExecuteThroughRoleForm/index.tsx | 0 .../tx/SignOrExecuteForm/NonOwnerError.tsx | 0 .../tx/SignOrExecuteForm/ProposerForm.tsx | 0 .../RiskConfirmationError.tsx | 0 .../tx/SignOrExecuteForm/SignForm.tsx | 0 .../SignOrExecuteForm/SignOrExecuteForm.tsx | 0 .../SignOrExecuteSkeleton.tsx | 0 .../tx/SignOrExecuteForm/SignerForm/index.tsx | 0 .../SignerForm/styles.module.css | 0 .../tx/SignOrExecuteForm/TxChecks.tsx | 0 .../UnknownContractError.tsx | 0 .../WalletRejectionError.tsx | 0 .../__tests__/ExecuteForm.test.tsx | 0 .../__tests__/SignForm.test.tsx | 0 .../__tests__/SignOrExecute.test.tsx | 0 .../__tests__/SignOrExecuteForm.test.tsx | 0 .../__tests__/SignerForm.test.tsx | 0 .../__snapshots__/SignOrExecute.test.tsx.snap | 0 .../SignOrExecuteForm/__tests__/hooks.test.ts | 0 .../components/tx/SignOrExecuteForm/hooks.ts | 0 .../components/tx/SignOrExecuteForm/index.tsx | 0 .../tx/SignOrExecuteForm/styles.module.css | 0 .../tx/SignOrExecuteForm/tracking.ts | 0 .../src}/components/tx/SponsoredBy/index.tsx | 0 .../tx/SponsoredBy/styles.module.css | 0 .../components/tx/SuccessMessage/index.tsx | 0 .../tx/SuccessMessage/styles.module.css | 0 .../BatchTransactions.stories.tsx | 0 .../BatchTransactions.test.tsx | 0 .../BatchTransactions.test.tsx.snap | 0 .../BatchTransactions/index.tsx | 0 .../BatchTransactions/mockData.ts | 0 .../ChangeThreshold.stories.tsx | 0 .../ChangeThreshold/ChangeThreshold.test.tsx | 0 .../ChangeThreshold.test.tsx.snap | 0 .../ChangeThreshold/index.tsx | 0 .../ConfirmationView.test.tsx | 0 .../MigrateToL2Information/index.tsx | 0 .../SettingsChange/SettingsChange.stories.tsx | 0 .../SettingsChange/SettingsChange.test.tsx | 0 .../SettingsChange.test.tsx.snap | 0 .../SettingsChange/index.tsx | 0 .../SettingsChange/mockData.ts | 0 .../tx/confirmation-views/StakingTx/index.tsx | 0 .../tx/confirmation-views/SwapOrder/index.tsx | 0 .../confirmation-views/UpdateSafe/index.tsx | 0 .../ConfirmationView.test.tsx.snap | 0 .../tx/confirmation-views/index.tsx | 0 .../tx/confirmation-views/types.d.ts | 0 .../components/tx/confirmation-views/utils.ts | 0 .../tx/security/SecurityWarnings.tsx | 0 .../blockaid/BlockaidBalanceChange.tsx | 0 .../tx/security/blockaid/BlockaidHint.tsx | 0 .../blockaid/__tests__/useBlockaid.test.ts | 0 .../components/tx/security/blockaid/index.tsx | 0 .../tx/security/blockaid/styles.module.css | 0 .../tx/security/blockaid/useBlockaid.ts | 0 .../tx/security/shared/TxSecurityContext.tsx | 0 .../tx/security/shared/styles.module.css | 0 .../tenderly/__tests__/useSimulation.test.ts | 0 .../security/tenderly/__tests__/utils.test.ts | 0 .../components/tx/security/tenderly/index.tsx | 0 .../tx/security/tenderly/styles.module.css | 0 .../components/tx/security/tenderly/types.ts | 0 .../tx/security/tenderly/useSimulation.ts | 0 .../components/tx/security/tenderly/utils.ts | 0 .../tx/security/useDelegateCallModule.ts | 0 .../web/src}/components/tx/security/utils.ts | 0 .../web/src}/components/welcome/NewSafe.tsx | 0 .../welcome/WelcomeLogin/WalletLogin.tsx | 0 .../__tests__/WalletLogin.test.tsx | 0 .../components/welcome/WelcomeLogin/index.tsx | 0 .../welcome/WelcomeLogin/styles.module.css | 0 .../src}/components/welcome/styles.module.css | 0 .../wrappers/DisclaimerWrapper/index.test.tsx | 0 .../wrappers/DisclaimerWrapper/index.tsx | 0 .../wrappers/FeatureWrapper/index.test.tsx | 0 .../wrappers/FeatureWrapper/index.tsx | 0 .../wrappers/SanctionWrapper/index.test.tsx | 0 .../wrappers/SanctionWrapper/index.tsx | 0 {src => apps/web/src}/config/chains.ts | 0 {src => apps/web/src}/config/constants.ts | 0 {src => apps/web/src}/config/routes.ts | 0 .../web/src}/config/securityHeaders.ts | 0 {src => apps/web/src}/definitions.d.ts | 0 .../bridge/components/Bridge/index.tsx | 0 .../components/BridgeWidget/index.test.tsx | 0 .../bridge/components/BridgeWidget/index.tsx | 0 .../bridge/hooks/useIsBridgeFeatureEnabled.ts | 0 .../counterfactual/ActivateAccountButton.tsx | 0 .../counterfactual/ActivateAccountFlow.tsx | 0 .../features/counterfactual/CheckBalance.tsx | 0 .../counterfactual/CounterfactualForm.tsx | 0 .../counterfactual/CounterfactualHooks.tsx | 0 .../CounterfactualStatusButton.tsx | 0 .../CounterfactualSuccessScreen.tsx | 0 .../features/counterfactual/FirstTxFlow.tsx | 0 .../counterfactual/LazyCounterfactual.tsx | 0 .../counterfactual/PayNowPayLater.tsx | 0 .../__tests__/useDeployGasLimit.test.ts | 0 .../counterfactual/__tests__/utils.test.ts | 0 .../counterfactual/hooks/useDeployGasLimit.ts | 0 .../hooks/useIsCounterfactualSafe.ts | 0 .../hooks/usePendingSafeNotifications.ts | 0 .../hooks/usePendingSafeStatuses.ts | 0 .../services/safeCreationEvents.ts | 0 .../store/undeployedSafesSlice.ts | 0 .../features/counterfactual/styles.module.css | 0 .../web/src}/features/counterfactual/utils.ts | 0 .../components/CreateSafeOnNewChain/index.tsx | 0 .../components/NetworkLogosList/index.tsx | 0 .../NetworkLogosList/styles.module.css | 0 .../ChangeSignerSetupWarning.tsx | 0 .../InconsistentSignerSetupWarning.tsx | 0 .../__tests__/useCompatibleNetworks.test.ts | 0 .../__tests__/useSafeCreationData.test.ts | 0 .../multichain/hooks/useCompatibleNetworks.ts | 0 .../multichain/hooks/useIsMultichainSafe.ts | 0 .../multichain/hooks/useSafeCreationData.ts | 0 .../utils/extract-migration-data.ts | 0 .../features/multichain/utils/utils.test.ts | 0 .../src}/features/multichain/utils/utils.ts | 0 .../components/AccountInfoChips/index.tsx | 0 .../AccountInfoChips/styles.module.css | 0 .../AccountItems/MultiAccountItem.tsx | 0 .../AccountItems/SingleAccountItem.tsx | 0 .../components/AccountItems/styles.module.css | 0 .../components/AccountListFilters/index.tsx | 0 .../components/AccountsHeader/index.tsx | 0 .../components/AccountsList/index.test.tsx | 0 .../components/AccountsList/index.tsx | 0 .../components/AddNetworkButton/index.tsx | 0 .../myAccounts/components/AllSafes/index.tsx | 0 .../components/CreateButton/index.tsx | 0 .../components/DataWidget/index.tsx | 0 .../components/DataWidget/styles.module.css | 0 .../components/FilteredSafes/index.test.tsx | 0 .../components/FilteredSafes/index.tsx | 0 .../components/OrderByButton/index.tsx | 0 .../components/PinnedSafes/index.test.tsx | 0 .../components/PinnedSafes/index.tsx | 0 .../components/QueueActions/index.tsx | 0 .../components/QueueActions/styles.module.css | 0 .../myAccounts/components/SafesList/index.tsx | 0 .../hooks/__tests__/useAllSafes.test.ts | 0 .../hooks/__tests__/useAllSafesGrouped.ts | 0 .../myAccounts/hooks/useAllOwnedSafes.ts | 0 .../features/myAccounts/hooks/useAllSafes.ts | 0 .../myAccounts/hooks/useAllSafesGrouped.ts | 0 .../features/myAccounts/hooks/useGetHref.ts | 0 .../features/myAccounts/hooks/useHasSafes.ts | 0 .../myAccounts/hooks/useSafesSearch.ts | 0 .../myAccounts/hooks/useTrackedSafesCount.ts | 0 .../myAccounts/hooks/useVisitedSafes.ts | 0 .../web/src}/features/myAccounts/index.tsx | 0 .../features/myAccounts/styles.module.css | 0 .../src}/features/myAccounts/utils/utils.ts | 0 .../components/DeleteProposerDialog.tsx | 0 .../components/EditProposerDialog.tsx | 0 .../proposers/components/TxProposalChip.tsx | 0 .../proposers/components/UpsertProposer.tsx | 0 .../src}/features/proposers/utils/utils.ts | 0 .../components/CancelRecoveryButton/index.tsx | 0 .../ExecuteRecoveryButton/index.tsx | 0 .../GroupedRecoveryListItems/index.tsx | 0 .../styles.module.css | 0 .../components/Recovery/LazyRecovery.tsx | 0 .../recovery/components/Recovery/index.tsx | 0 .../RecoveryCards/RecoveryInProgressCard.tsx | 0 .../RecoveryCards/RecoveryProposalCard.tsx | 0 .../__tests__/RecoveryInProgressCard.test.tsx | 0 .../__tests__/RecoveryProposalCard.test.tsx | 0 .../RecoveryCards/styles.module.css | 0 .../RecoveryContext/RecoveryContextHooks.tsx | 0 .../useRecoveryDelayModifiers.test.ts | 0 .../__tests__/useRecoveryPendingTxs.test.ts | 0 .../__tests__/useRecoveryState.test.tsx | 0 .../useRecoverySuccessEvents.test.ts | 0 .../components/RecoveryContext/index.tsx | 0 .../useRecoveryDelayModifiers.ts | 0 .../RecoveryContext/useRecoveryPendingTxs.ts | 0 .../RecoveryContext/useRecoveryState.ts | 0 .../useRecoverySuccessEvents.ts | 0 .../components/RecoveryDescription/index.tsx | 0 .../components/RecoveryDetails/index.tsx | 0 .../components/RecoveryHeader/index.test.tsx | 0 .../components/RecoveryHeader/index.tsx | 0 .../components/RecoveryInfo/index.tsx | 0 .../RecoveryList/LazyRecoveryList.tsx | 0 .../components/RecoveryList/index.tsx | 0 .../RecoveryListItemContext.tsx | 0 .../components/RecoveryListItem/index.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components/RecoveryModal/index.test.tsx | 0 .../components/RecoveryModal/index.tsx | 0 .../ChooseRecoveryMethodModal.tsx | 0 .../RecoverySettings/DelayModifierRow.tsx | 0 .../RecoverySettings/ZkEmailFakeDoorModal.tsx | 0 .../components/RecoverySettings/index.tsx | 0 .../RecoverySettings/styles.module.css | 0 .../components/RecoverySigners/index.tsx | 0 .../components/RecoveryStatus/index.tsx | 0 .../components/RecoverySummary/index.tsx | 0 .../components/RecoveryType/index.tsx | 0 .../RecoveryValidationErrors/index.tsx | 0 .../__tests__/useIsValidExecution.test.ts | 0 .../useIsValidRecoveryExecution.test.ts | 0 .../__tests__/useRecoveryTxState.test.tsx | 0 .../features/recovery/hooks/useIsRecoverer.ts | 0 .../recovery/hooks/useIsRecoveryEnabled.ts | 0 .../recovery/hooks/useIsRecoverySupported.ts | 0 .../hooks/useIsValidRecoveryExecution.ts | 0 .../features/recovery/hooks/useRecovery.ts | 0 .../recovery/hooks/useRecoveryQueue.ts | 0 .../hooks/useRecoveryTxNotification.ts | 0 .../recovery/hooks/useRecoveryTxState.ts | 0 .../services/__tests__/delay-modifier.test.ts | 0 .../services/__tests__/proxies.test.ts | 0 .../services/__tests__/recovery-state.test.ts | 0 .../services/__tests__/selectors.test.ts | 0 .../recovery/services/__tests__/setup.test.ts | 0 .../__tests__/transaction-list.test.ts | 0 .../services/__tests__/transaction.test.ts | 0 .../recovery/services/delay-modifier.ts | 0 .../features/recovery/services/proxies.ts | 0 .../recovery/services/recovery-sender.ts | 0 .../recovery/services/recovery-state.ts | 0 .../recovery/services/recoveryEvents.ts | 0 .../features/recovery/services/selectors.ts | 0 .../src}/features/recovery/services/setup.ts | 0 .../recovery/services/transaction-list.ts | 0 .../features/recovery/services/transaction.ts | 0 .../EnableAccountBanner/index.stories.tsx | 0 .../components/EnableAccountBanner/index.tsx | 0 .../EnableAccountBanner/style.module.css | 0 .../speedup/components/SpeedUpModal.tsx | 0 .../speedup/components/SpeedUpMonitor.tsx | 0 .../speedup/hooks/useSafeTransaction.tsx | 0 .../features/speedup/utils/IsSpeedableTx.tsx | 0 .../utils/__tests__/IsSpeedableTx.test.ts | 0 .../stake/components/InfoTooltip/index.tsx | 0 .../stake/components/StakeButton/index.tsx | 0 .../stake/components/StakePage/index.tsx | 0 .../StakingConfirmationTx/Deposit.tsx | 0 .../components/StakingConfirmationTx/Exit.tsx | 0 .../StakingConfirmationTx/Withdraw.tsx | 0 .../StakingConfirmationTx/index.tsx | 0 .../stake/components/StakingStatus/index.tsx | 0 .../StakingTxDepositDetails/index.tsx | 0 .../components/StakingTxDepositInfo/index.tsx | 0 .../components/StakingTxExitDetails/index.tsx | 0 .../components/StakingTxExitInfo/index.tsx | 0 .../StakingTxWithdrawDetails/index.tsx | 0 .../StakingTxWithdrawInfo/index.tsx | 0 .../stake/components/StakingWidget/index.tsx | 0 .../web/src}/features/stake/constants.ts | 0 .../web/src}/features/stake/helpers/utils.ts | 0 .../stake/hooks/useGetStakeWidgetUrl.ts | 0 .../stake/hooks/useIsStakingBannerEnabled.ts | 0 .../stake/hooks/useIsSwapFeatureEnabled.ts | 0 .../src}/features/stake/useStakeConsent.ts | 0 .../swap/components/HelpIconTooltip/index.tsx | 0 .../swap/components/OrderId/index.stories.tsx | 0 .../swap/components/OrderId/index.tsx | 0 .../components/StatusLabel/index.stories.tsx | 0 .../swap/components/StatusLabel/index.tsx | 0 .../swap/components/SwapButton/index.tsx | 0 .../swap/components/SwapOrder/index.tsx | 0 .../SwapOrder/rows/PartBuyAmount.tsx | 0 .../SwapOrder/rows/PartDuration.tsx | 0 .../SwapOrder/rows/PartSellAmount.tsx | 0 .../components/SwapOrder/rows/SurplusFee.tsx | 0 .../components/SwapOrder/styles.module.css | 0 .../components/SwapOrder/swap.stories.tsx | 0 .../components/SwapOrder/twap.stories.tsx | 0 .../OrderFeeConfirmationView.tsx | 0 .../index.stories.tsx | 0 .../SwapOrderConfirmationView/index.tsx | 0 .../styles.module.css | 0 .../components/SwapProgress/index.stories.tsx | 0 .../swap/components/SwapProgress/index.tsx | 0 .../components/SwapTokens/index.stories.tsx | 0 .../swap/components/SwapTokens/index.tsx | 0 .../swap/components/SwapTxInfo/SwapTx.tsx | 0 .../TwapFallbackHandlerWarning/index.tsx | 0 .../web/src}/features/swap/constants.ts | 0 .../swap/helpers/__tests__/fee.test.ts | 0 .../swap/helpers/__tests__/utils.test.ts | 0 .../features/swap/helpers/data/stablecoins.ts | 0 .../web/src}/features/swap/helpers/fee.ts | 0 .../features/swap/helpers/swapOrderBuilder.ts | 0 .../web/src}/features/swap/helpers/utils.ts | 0 .../hooks/__tests__/useIsExpiredSwap.test.ts | 0 .../features/swap/hooks/useIsExpiredSwap.ts | 0 .../swap/hooks/useIsSwapFeatureEnabled.ts | 0 {src => apps/web/src}/features/swap/index.tsx | 0 .../features/swap/store/swapParamsSlice.ts | 0 .../web/src}/features/swap/styles.module.css | 0 {src => apps/web/src}/features/swap/types.ts | 0 .../web/src}/features/swap/useSwapConsent.ts | 0 .../OutreachPopup/OutreachPopup.tsx | 0 .../components/OutreachPopup/index.tsx | 0 .../OutreachPopup/styles.module.css | 0 .../features/targetedOutreach/constants.ts | 0 .../__tests__/useShowOutreachPopup.test.ts | 0 .../hooks/useShowOutreachPopup.tsx | 0 .../walletconnect/WalletConnectContext.tsx | 0 .../__tests__/WalletConnectContext.test.tsx | 0 .../WalletConnectProvider/index.tsx | 0 .../components/WalletConnectUi/index.tsx | 0 .../components/WcConnectionForm/index.tsx | 0 .../WcConnectionForm/styles.module.css | 0 .../components/WcConnectionState/index.tsx | 0 .../WcConnectionState/styles.module.css | 0 .../components/WcErrorMessage/index.tsx | 0 .../WcErrorMessage/styles.module.css | 0 .../components/WcHeaderWidget/WcIcon.tsx | 0 .../components/WcHeaderWidget/index.tsx | 0 .../components/WcHints/index.tsx | 0 .../components/WcHints/styles.module.css | 0 .../components/WcInput/index.tsx | 0 .../components/WcLogoHeader/index.tsx | 0 .../components/WcLogoHeader/styles.module.css | 0 .../WcProposalForm/CompatibilityWarning.tsx | 0 .../WcProposalForm/ProposalVerification.tsx | 0 .../__tests__/useCompatibilityWarning.test.ts | 0 .../components/WcProposalForm/index.tsx | 0 .../WcProposalForm/styles.module.css | 0 .../WcProposalForm/useCompatibilityWarning.ts | 0 .../components/WcSessionList/WcNoSessions.tsx | 0 .../components/WcSessionList/index.tsx | 0 .../WcSessionList/styles.module.css | 0 .../components/WcSessionManager/index.tsx | 0 .../walletconnect/components/index.tsx | 0 .../src}/features/walletconnect/constants.ts | 0 .../useWalletConnectSearchParamUri.test.ts | 0 .../useWalletConnectSessions.test.tsx | 0 .../hooks/useWalletConnectClipboardUri.ts | 0 .../hooks/useWalletConnectSearchParamUri.ts | 0 .../hooks/useWalletConnectSessions.ts | 0 .../features/walletconnect/hooks/useWcUri.ts | 0 .../services/WalletConnectWallet.ts | 0 .../__tests__/WalletConnectWallet.test.ts | 0 .../services/__tests__/utils.test.ts | 0 .../walletconnect/services/tracking.ts | 0 .../features/walletconnect/services/utils.ts | 0 .../web/src}/hooks/Beamer/useBeamer.ts | 0 .../__tests__/useAddressResolver.test.ts | 0 .../src}/hooks/__tests__/useAdjustUrl.test.ts | 0 .../web/src}/hooks/__tests__/useAsync.test.ts | 0 .../src}/hooks/__tests__/useBalances.test.ts | 0 .../hooks/__tests__/useBatchedTxs.test.ts | 0 .../src}/hooks/__tests__/useChainId.test.ts | 0 .../web/src}/hooks/__tests__/useClock.test.ts | 0 .../src}/hooks/__tests__/useDebounce.test.ts | 0 .../src}/hooks/__tests__/useDecodeTx.test.ts | 0 .../src}/hooks/__tests__/useGasLimit.test.ts | 0 .../src}/hooks/__tests__/useGasPrice.test.ts | 0 .../__tests__/useIntervalCounter.test.ts | 0 .../hooks/__tests__/useLoadBalances.test.ts | 0 .../hooks/__tests__/useLoadChains.test.ts | 0 .../__tests__/useLoadSpendingLimits.test.ts | 0 .../__tests__/useNestedSafeOwners.test.ts | 0 .../hooks/__tests__/usePendingActions.test.ts | 0 .../hooks/__tests__/usePendingTxs.test.ts | 0 .../hooks/__tests__/usePreviousNonces.test.ts | 0 .../hooks/__tests__/useRankedSafeApps.test.ts | 0 .../__tests__/useRemainingRelays.test.ts | 0 .../hooks/__tests__/useRemoteSafeApps.test.ts | 0 .../hooks/__tests__/useSafeAddress.test.ts | 0 .../__tests__/useSafeNotifications.test.ts | 0 .../__tests__/useSafeTokenAllocation.test.ts | 0 .../__tests__/useSanctionedAddress.test.ts | 0 .../__tests__/useTxPendingStatus.test.ts | 0 .../src}/hooks/__tests__/useTxQueue.test.ts | 0 .../hooks/__tests__/useTxTracking.test.ts | 0 .../__tests__/useVisibleBalances.test.ts | 0 .../hooks/__tests__/useWalletCanPay.test.ts | 0 .../coreSDK/__tests__/safeCoreSDK.test.ts | 0 .../__tests__/useInitSafeCoreSDK.test.ts | 0 .../web/src}/hooks/coreSDK/safeCoreSDK.ts | 0 .../src}/hooks/coreSDK/useInitSafeCoreSDK.ts | 0 .../helpers/__tests__/config.test.ts | 0 .../src}/hooks/loadables/helpers/config.ts | 0 .../src}/hooks/loadables/useLoadBalances.ts | 0 .../web/src}/hooks/loadables/useLoadChains.ts | 0 .../src}/hooks/loadables/useLoadSafeInfo.ts | 0 .../hooks/loadables/useLoadSafeMessages.ts | 0 .../hooks/loadables/useLoadSpendingLimits.ts | 0 .../src}/hooks/loadables/useLoadTxHistory.ts | 0 .../src}/hooks/loadables/useLoadTxQueue.ts | 0 .../__tests__/useIsSafeMessagePending.test.ts | 0 .../useIsSafeMessageSignableBy.test.ts | 0 .../useSafeMessageNotifications.test.ts | 0 .../useSafeMessagePendingStatuses.test.ts | 0 .../__tests__/useSafeMessageStatus.test.ts | 0 .../hooks/messages/useDecodedSafeMessage.ts | 0 .../hooks/messages/useIsSafeMessagePending.ts | 0 .../messages/useIsSafeMessageSignableBy.ts | 0 .../web/src}/hooks/messages/useSafeMessage.ts | 0 .../messages/useSafeMessageNotifications.ts | 0 .../messages/useSafeMessagePendingStatuses.ts | 0 .../hooks/messages/useSafeMessageStatus.ts | 0 .../src}/hooks/messages/useSafeMessages.ts | 0 .../src}/hooks/messages/useSafeMsgTracking.ts | 0 .../messages/useSyncSafeMessageSigner.ts | 0 .../__tests__/useCategoryFilter.test.ts | 0 .../src}/hooks/safe-apps/permissions/index.ts | 0 .../permissions/useBrowserPermissions.ts | 0 .../permissions/useSafePermissions.ts | 0 .../safe-apps/useAppsFilterByCategory.ts | 0 .../useAppsFilterByOptimizedForBatch.ts | 0 .../web/src}/hooks/safe-apps/useAppsSearch.ts | 0 .../src}/hooks/safe-apps/useCategoryFilter.ts | 0 .../safe-apps/useCustomAppCommunicator.tsx | 0 .../src}/hooks/safe-apps/useCustomSafeApps.ts | 0 .../src}/hooks/safe-apps/useOpenedSafeApps.ts | 0 .../src}/hooks/safe-apps/usePinnedSafeApps.ts | 0 .../src}/hooks/safe-apps/useRankedSafeApps.ts | 0 .../src}/hooks/safe-apps/useRemoteSafeApps.ts | 0 .../src}/hooks/safe-apps/useRemoveAppModal.ts | 0 .../hooks/safe-apps/useSafeAppFromBackend.ts | 0 .../hooks/safe-apps/useSafeAppFromManifest.ts | 0 .../safe-apps/useSafeAppPreviewDrawer.ts | 0 .../web/src}/hooks/safe-apps/useSafeAppUrl.ts | 0 .../web/src}/hooks/safe-apps/useSafeApps.ts | 0 .../hooks/safe-apps/useSafeAppsFilters.ts | 0 .../src}/hooks/safe-apps/useTxBuilderApp.ts | 0 {src => apps/web/src}/hooks/useAddressBook.ts | 0 .../web/src}/hooks/useAddressResolver.ts | 0 {src => apps/web/src}/hooks/useAdjustUrl.ts | 0 .../web/src}/hooks/useAllAddressBooks.ts | 0 {src => apps/web/src}/hooks/useAsync.ts | 0 {src => apps/web/src}/hooks/useBalances.ts | 0 {src => apps/web/src}/hooks/useBatchedTxs.ts | 0 {src => apps/web/src}/hooks/useChainId.ts | 0 {src => apps/web/src}/hooks/useChains.ts | 0 .../web/src}/hooks/useChangedValue.ts | 0 {src => apps/web/src}/hooks/useClock.ts | 0 .../web/src}/hooks/useCollectibles.ts | 0 {src => apps/web/src}/hooks/useDarkMode.ts | 0 {src => apps/web/src}/hooks/useDebounce.ts | 0 {src => apps/web/src}/hooks/useDecodeTx.ts | 0 {src => apps/web/src}/hooks/useDraftBatch.ts | 0 {src => apps/web/src}/hooks/useGasLimit.ts | 0 {src => apps/web/src}/hooks/useGasPrice.ts | 0 .../web/src}/hooks/useHiddenTokens.ts | 0 .../web/src}/hooks/useHighlightHiddenTab.ts | 0 {src => apps/web/src}/hooks/useInitSession.ts | 0 .../web/src}/hooks/useIntervalCounter.ts | 0 .../hooks/useIsGeoblockedFeatureEnabled.ts | 0 {src => apps/web/src}/hooks/useIsMac.ts | 0 .../web/src}/hooks/useIsNestedSafeOwner.ts | 0 .../web/src}/hooks/useIsOfficialHost.ts | 0 .../useIsOnlySpendingLimitBeneficiary.tsx | 0 {src => apps/web/src}/hooks/useIsPending.ts | 0 {src => apps/web/src}/hooks/useIsSafeOwner.ts | 0 .../web/src}/hooks/useIsSidebarRoute.ts | 0 .../web/src}/hooks/useIsValidExecution.ts | 0 .../web/src}/hooks/useIsWrongChain.ts | 0 {src => apps/web/src}/hooks/useLastSafe.ts | 0 .../web/src}/hooks/useLoadableStores.ts | 0 .../web/src}/hooks/useMasterCopies.ts | 0 .../web/src}/hooks/useMnemonicName/dict.ts | 0 .../web/src}/hooks/useMnemonicName/index.ts | 0 .../useMnemonicName/useMnemonicName.test.ts | 0 .../web/src}/hooks/useNestedSafeOwners.tsx | 0 {src => apps/web/src}/hooks/useOnceVisible.ts | 0 {src => apps/web/src}/hooks/useOrigin.ts | 0 {src => apps/web/src}/hooks/useOwnedSafes.ts | 0 .../web/src}/hooks/usePendingActions.ts | 0 {src => apps/web/src}/hooks/usePendingTxs.ts | 0 .../web/src}/hooks/usePreviousNonces.ts | 0 {src => apps/web/src}/hooks/useProposers.ts | 0 .../web/src}/hooks/useRemainingRelays.ts | 0 {src => apps/web/src}/hooks/useSafeAddress.ts | 0 {src => apps/web/src}/hooks/useSafeInfo.ts | 0 .../web/src}/hooks/useSafeNotifications.ts | 0 .../web/src}/hooks/useSafeTokenAllocation.ts | 0 .../web/src}/hooks/useSafeTokenEnabled.ts | 0 .../web/src}/hooks/useSanctionedAddress.ts | 0 .../web/src}/hooks/useSpendingLimit.ts | 0 .../web/src}/hooks/useSpendingLimitGas.ts | 0 .../web/src}/hooks/useTransactionStatus.ts | 0 .../web/src}/hooks/useTransactionType.tsx | 0 {src => apps/web/src}/hooks/useTxDetails.ts | 0 {src => apps/web/src}/hooks/useTxHistory.ts | 0 .../web/src}/hooks/useTxNotifications.ts | 0 .../web/src}/hooks/useTxPendingStatuses.ts | 0 {src => apps/web/src}/hooks/useTxQueue.ts | 0 {src => apps/web/src}/hooks/useTxTracking.ts | 0 .../web/src}/hooks/useVisibleBalances.ts | 0 .../web/src}/hooks/useWalletCanPay.ts | 0 .../web/src}/hooks/useWalletCanRelay.ts | 0 .../wallets/__tests__/useOnboard.test.ts | 0 {src => apps/web/src}/hooks/wallets/consts.ts | 0 .../web/src}/hooks/wallets/useInitWeb3.ts | 0 .../web/src}/hooks/wallets/useOnboard.ts | 0 .../hooks/wallets/useSelectAvailableSigner.ts | 0 .../web/src}/hooks/wallets/useWallet.ts | 0 .../src}/hooks/wallets/useWalletBalance.ts | 0 .../web/src}/hooks/wallets/wallets.ts | 0 {src => apps/web/src}/hooks/wallets/web3.ts | 0 .../web/src}/markdown/privacy/privacy.md | 0 {src => apps/web/src}/markdown/terms/terms.md | 0 .../web/src}/markdown/terms/version.ts | 0 {src => apps/web/src}/pages/403.tsx | 0 {src => apps/web/src}/pages/404.tsx | 0 {src => apps/web/src}/pages/_app.tsx | 0 {src => apps/web/src}/pages/_document.tsx | 0 {src => apps/web/src}/pages/_offline.tsx | 0 {src => apps/web/src}/pages/addOwner.tsx | 0 {src => apps/web/src}/pages/address-book.tsx | 0 .../web/src}/pages/apps/bookmarked.tsx | 0 {src => apps/web/src}/pages/apps/custom.tsx | 0 {src => apps/web/src}/pages/apps/index.tsx | 0 {src => apps/web/src}/pages/apps/open.tsx | 0 .../web/src}/pages/balances/index.tsx | 0 {src => apps/web/src}/pages/balances/nfts.tsx | 0 {src => apps/web/src}/pages/bridge.tsx | 0 {src => apps/web/src}/pages/cookie.tsx | 0 {src => apps/web/src}/pages/home.tsx | 0 {src => apps/web/src}/pages/imprint.tsx | 0 {src => apps/web/src}/pages/index.tsx | 0 {src => apps/web/src}/pages/licenses.tsx | 0 .../src}/pages/new-safe/advanced-create.tsx | 0 .../web/src}/pages/new-safe/create.tsx | 0 {src => apps/web/src}/pages/new-safe/load.tsx | 0 {src => apps/web/src}/pages/privacy.tsx | 0 .../web/src}/pages/settings/appearance.tsx | 0 .../web/src}/pages/settings/cookies.tsx | 0 {src => apps/web/src}/pages/settings/data.tsx | 0 .../pages/settings/environment-variables.tsx | 0 .../web/src}/pages/settings/index.tsx | 0 .../web/src}/pages/settings/modules.tsx | 0 .../web/src}/pages/settings/notifications.tsx | 0 .../src}/pages/settings/safe-apps/index.tsx | 0 .../web/src}/pages/settings/security.tsx | 0 .../web/src}/pages/settings/setup.tsx | 0 .../web/src}/pages/share/safe-app.tsx | 0 {src => apps/web/src}/pages/stake.tsx | 0 {src => apps/web/src}/pages/swap.tsx | 0 {src => apps/web/src}/pages/terms.tsx | 0 .../web/src}/pages/transactions/history.tsx | 0 .../web/src}/pages/transactions/index.tsx | 0 .../web/src}/pages/transactions/messages.tsx | 0 .../web/src}/pages/transactions/msg.tsx | 0 .../web/src}/pages/transactions/queue.tsx | 0 .../web/src}/pages/transactions/tx.tsx | 0 {src => apps/web/src}/pages/wc.tsx | 0 .../web/src}/pages/welcome/accounts.tsx | 0 {src => apps/web/src}/pages/welcome/index.tsx | 0 .../__tests__/notifications.test.ts | 0 .../firebase-messaging-sw.ts | 0 .../firebase-messaging/notification-mapper.ts | 0 .../firebase-messaging/notifications.ts | 0 .../firebase-messaging/webhook-types.ts | 0 .../web/src}/service-workers/index.ts | 0 {src => apps/web/src}/services/EventBus.ts | 0 .../web/src}/services/ExternalStore.ts | 0 .../web/src}/services/analytics/TagManager.ts | 0 .../analytics/__tests__/TagManager.test.ts | 0 .../services/analytics/__tests__/gtm.test.ts | 0 .../analytics/__tests__/tx-tracking.test.ts | 0 .../services/analytics/events/addressBook.ts | 0 .../src}/services/analytics/events/assets.ts | 0 .../services/analytics/events/batching.ts | 0 .../src}/services/analytics/events/bridge.ts | 0 .../analytics/events/counterfactual.ts | 0 .../analytics/events/createLoadSafe.ts | 0 .../src}/services/analytics/events/index.ts | 0 .../src}/services/analytics/events/modals.ts | 0 .../src}/services/analytics/events/nfts.ts | 0 .../services/analytics/events/outreach.ts | 0 .../services/analytics/events/overview.ts | 0 .../analytics/events/push-notifications.ts | 0 .../services/analytics/events/recovery.ts | 0 .../services/analytics/events/reject-tx.ts | 0 .../services/analytics/events/safeApps.ts | 0 .../services/analytics/events/settings.ts | 0 .../src}/services/analytics/events/stake.ts | 0 .../src}/services/analytics/events/swaps.ts | 0 .../services/analytics/events/transactions.ts | 0 .../src}/services/analytics/events/txList.ts | 0 .../src}/services/analytics/events/wallet.ts | 0 .../analytics/events/walletconnect.ts | 0 .../web/src}/services/analytics/gtm.ts | 0 .../web/src}/services/analytics/index.ts | 0 .../web/src}/services/analytics/spindl.ts | 0 .../src}/services/analytics/tx-tracking.ts | 0 .../web/src}/services/analytics/types.ts | 0 .../web/src}/services/analytics/useGtm.ts | 0 .../src}/services/analytics/useMetaEvents.ts | 0 .../web/src}/services/beamer/index.ts | 0 .../web/src}/services/beamer/types.ts | 0 .../services/contracts/ContractErrorCodes.ts | 0 .../contracts/__tests__/deployments.test.ts | 0 .../contracts/__tests__/safeContracts.test.ts | 0 .../src}/services/contracts/deployments.ts | 0 .../src}/services/contracts/safeContracts.ts | 0 .../contracts/spendingLimitContracts.ts | 0 .../web/src}/services/ens/index.test.ts | 0 {src => apps/web/src}/services/ens/index.ts | 0 .../src}/services/exceptions/ErrorCodes.ts | 0 .../exceptions/__tests__/index.test.ts | 0 .../exceptions/__tests__/utils.test.ts | 0 .../web/src}/services/exceptions/index.ts | 0 .../web/src}/services/exceptions/utils.ts | 0 .../src}/services/local-storage/Storage.ts | 0 .../local-storage/__tests__/local.test.ts | 0 .../__tests__/useLocalStorage.test.ts | 0 .../web/src}/services/local-storage/local.ts | 0 .../src}/services/local-storage/session.ts | 0 .../services/local-storage/storageHelpers.ts | 0 .../services/local-storage/useLocalStorage.ts | 0 .../src}/services/ls-migration/addedSafes.ts | 0 .../src}/services/ls-migration/addressBook.ts | 0 .../web/src}/services/ls-migration/common.ts | 0 .../src}/services/ls-migration/tests.test.ts | 0 {src => apps/web/src}/services/onboard.ts | 0 .../src}/services/onboard/ledger-module.ts | 0 .../private-key-module/PkModulePopup.tsx | 0 .../src}/services/private-key-module/icon.ts | 0 .../src}/services/private-key-module/index.ts | 0 .../private-key-module/pk-popup-store.ts | 0 .../services/push-notifications/firebase.ts | 0 .../push-notifications/preferences.ts | 0 .../services/push-notifications/tracking.ts | 0 .../services/safe-apps/AppCommunicator.ts | 0 .../web/src}/services/safe-apps/manifest.ts | 0 .../safe-apps/track-app-usage-count.ts | 0 .../__tests__/safeMsgSender.test.ts | 0 .../services/safe-messages/safeMsgEvents.ts | 0 .../safe-messages/safeMsgNotifications.ts | 0 .../services/safe-messages/safeMsgSender.ts | 0 .../safe-wallet-provider/index.test.ts | 0 .../services/safe-wallet-provider/index.ts | 0 .../notifications.test.ts | 0 .../safe-wallet-provider/notifications.ts | 0 .../useSafeWalletProvider.test.tsx | 0 .../useSafeWalletProvider.tsx | 0 .../security/modules/ApprovalModule/index.ts | 0 .../security/modules/BlockaidModule/index.ts | 0 .../security/modules/BlockaidModule/types.ts | 0 .../modules/DelegateCallModule/index.test.ts | 0 .../modules/DelegateCallModule/index.ts | 0 .../src}/services/security/modules/types.ts | 0 {src => apps/web/src}/services/sentry.ts | 0 {src => apps/web/src}/services/siwe/index.ts | 0 .../web/src}/services/tracking/abTesting.ts | 0 .../src}/services/tracking/useAbTesting.ts | 0 .../src}/services/transactions/index.tests.ts | 0 .../web/src}/services/transactions/index.ts | 0 .../tx/__tests__/encodeSignatures.test.ts | 0 .../tx/__tests__/extractTxInfo.test.ts | 0 .../services/tx/__tests__/relaying.test.ts | 0 .../tx/__tests__/safeUpdateParams.test.ts | 0 .../tx/__tests__/spendingLimitParams.test.ts | 0 .../tx/__tests__/tokenTransferParams.test.ts | 0 .../services/tx/__tests__/txEvents.test.ts | 0 .../services/tx/__tests__/txMonitor.test.ts | 0 .../web/src}/services/tx/encodeSignatures.ts | 0 .../web/src}/services/tx/extractTxInfo.ts | 0 .../src}/services/tx/proposeTransaction.ts | 0 {src => apps/web/src}/services/tx/relaying.ts | 0 .../web/src}/services/tx/safeUpdateParams.ts | 0 .../src}/services/tx/spendingLimitParams.ts | 0 .../src}/services/tx/tokenTransferParams.ts | 0 .../tx/tx-sender/__tests__/sdk.test.ts | 0 .../tx/tx-sender/__tests__/ts-sender.test.ts | 0 .../web/src}/services/tx/tx-sender/create.ts | 0 .../src}/services/tx/tx-sender/dispatch.ts | 0 .../web/src}/services/tx/tx-sender/index.ts | 0 .../services/tx/tx-sender/recommendedNonce.ts | 0 .../web/src}/services/tx/tx-sender/sdk.ts | 0 .../services/tx/tx-sender/spendingLimit.ts | 0 {src => apps/web/src}/services/tx/txEvents.ts | 0 .../web/src}/services/tx/txMonitor.ts | 0 .../store/__tests__/addedSafesSlice.test.ts | 0 .../store/__tests__/addressBookSlice.test.ts | 0 .../src}/store/__tests__/broadcast.test.ts | 0 .../web/src}/store/__tests__/index.test.ts | 0 .../store/__tests__/pendingTxsSlice.test.ts | 0 .../store/__tests__/safeAppsSlice.test.ts | 0 .../store/__tests__/safeMessagesSlice.test.ts | 0 .../store/__tests__/safeOverviews.test.ts | 0 .../store/__tests__/settingsSlice.test.ts | 0 .../store/__tests__/swapOrderSlice.test.ts | 0 .../store/__tests__/txHistorySlice.test.ts | 0 .../src}/store/__tests__/txQueueSlice.test.ts | 0 .../web/src}/store/addedSafesSlice.ts | 0 .../web/src}/store/addressBookSlice.ts | 0 .../web/src}/store/api/gateway/index.ts | 0 .../web/src}/store/api/gateway/proposers.ts | 0 .../src}/store/api/gateway/safeOverviews.ts | 0 {src => apps/web/src}/store/api/ofac.ts | 0 {src => apps/web/src}/store/api/safePass.ts | 0 {src => apps/web/src}/store/balancesSlice.ts | 0 {src => apps/web/src}/store/batchSlice.ts | 0 {src => apps/web/src}/store/broadcast.ts | 0 {src => apps/web/src}/store/chainsSlice.ts | 0 {src => apps/web/src}/store/common.ts | 0 .../web/src}/store/cookiesAndTermsSlice.ts | 0 {src => apps/web/src}/store/index.ts | 0 .../web/src}/store/notificationsSlice.ts | 0 .../web/src}/store/orderByPreferenceSlice.ts | 0 .../src}/store/pendingSafeMessagesSlice.ts | 0 .../web/src}/store/pendingTxsSlice.ts | 0 {src => apps/web/src}/store/persistStore.ts | 0 {src => apps/web/src}/store/popupSlice.ts | 0 {src => apps/web/src}/store/safeAppsSlice.ts | 0 {src => apps/web/src}/store/safeInfoSlice.ts | 0 .../web/src}/store/safeMessagesSlice.ts | 0 {src => apps/web/src}/store/sessionSlice.ts | 0 {src => apps/web/src}/store/settingsSlice.ts | 0 {src => apps/web/src}/store/slices.ts | 0 .../web/src}/store/spendingLimitsSlice.ts | 0 {src => apps/web/src}/store/swapOrderSlice.ts | 0 {src => apps/web/src}/store/txHistorySlice.ts | 0 {src => apps/web/src}/store/txQueueSlice.ts | 0 .../web/src}/store/useHydrateStore.ts | 0 .../web/src}/store/visitedSafesSlice.ts | 0 {src => apps/web/src}/stories/Configure.mdx | 0 .../web/src}/stories/storeDecorator.tsx | 0 .../web/src}/styles/accordion.module.css | 0 {src => apps/web/src}/styles/globals.css | 0 .../web/src}/styles/inputs.module.css | 0 {src => apps/web/src}/styles/onboard.css | 0 {src => apps/web/src}/styles/spacings.ts | 0 {src => apps/web/src}/styles/vars.css | 0 {src => apps/web/src}/tests/Builder.ts | 0 .../web/src}/tests/builders/chains.ts | 0 .../src}/tests/builders/eip1193Provider.ts | 0 .../web/src}/tests/builders/messages.ts | 0 .../web/src}/tests/builders/pendingTx.ts | 0 {src => apps/web/src}/tests/builders/safe.ts | 0 .../web/src}/tests/builders/safeItem.ts | 0 .../web/src}/tests/builders/safeMessage.ts | 0 .../web/src}/tests/builders/safeTx.ts | 0 {src => apps/web/src}/tests/builders/utils.ts | 0 .../web/src}/tests/builders/wallet.ts | 0 {src => apps/web/src}/tests/mocks/chains.ts | 0 .../web/src}/tests/mocks/contractManager.ts | 0 .../web/src}/tests/mocks/providers.ts | 0 .../web/src}/tests/mocks/transactions.ts | 0 .../web/src}/tests/pages/404.test.tsx | 0 .../web/src}/tests/pages/apps-share.test.tsx | 0 .../web/src}/tests/pages/apps.test.tsx | 0 {src => apps/web/src}/tests/test-utils.tsx | 0 {src => apps/web/src}/tests/transactions.ts | 0 .../web/src}/utils/SimpleTxWatcher.ts | 0 .../utils/__tests__/SimpleTxWatcher.test.ts | 0 .../src}/utils/__tests__/addresses.test.ts | 0 .../web/src}/utils/__tests__/chains.test.ts | 0 .../web/src}/utils/__tests__/date.test.ts | 0 .../src}/utils/__tests__/formatNumber.test.ts | 0 .../src}/utils/__tests__/formatters.test.ts | 0 .../web/src}/utils/__tests__/gateway.test.ts | 0 .../web/src}/utils/__tests__/helpers.test.ts | 0 .../src}/utils/__tests__/mad-props.test.tsx | 0 .../src}/utils/__tests__/safe-hashes.test.ts | 0 .../utils/__tests__/safe-messages.test.ts | 0 .../utils/__tests__/safe-migrations.test.ts | 0 .../src}/utils/__tests__/safe-version.test.ts | 0 .../web/src}/utils/__tests__/signers.test.ts | 0 .../web/src}/utils/__tests__/tokens.test.ts | 0 .../__tests__/transaction-guards.test.ts | 0 .../src}/utils/__tests__/transactions.test.ts | 0 .../utils/__tests__/tx-history-filter.test.ts | 0 .../web/src}/utils/__tests__/tx-list.test.ts | 0 .../web/src}/utils/__tests__/url.test.ts | 0 .../src}/utils/__tests__/validation.test.ts | 0 .../web/src}/utils/__tests__/wallets.test.ts | 0 .../web/src}/utils/__tests__/web3.test.ts | 0 {src => apps/web/src}/utils/addresses.ts | 0 {src => apps/web/src}/utils/chains.ts | 0 {src => apps/web/src}/utils/clipboard.ts | 0 .../web/src}/utils/createEmotionCache.ts | 0 {src => apps/web/src}/utils/date.ts | 0 {src => apps/web/src}/utils/ethers-utils.ts | 0 {src => apps/web/src}/utils/formatNumber.ts | 0 {src => apps/web/src}/utils/formatters.ts | 0 {src => apps/web/src}/utils/gateway.ts | 0 {src => apps/web/src}/utils/helpers.ts | 0 {src => apps/web/src}/utils/hex.ts | 0 {src => apps/web/src}/utils/mad-props.tsx | 0 .../web/src}/utils/nested-safe-wallet.ts | 0 .../utils/providers/UncheckedJsonRpcSigner.ts | 0 {src => apps/web/src}/utils/relaying.ts | 0 {src => apps/web/src}/utils/safe-hashes.ts | 0 .../web/src}/utils/safe-message-guards.ts | 0 {src => apps/web/src}/utils/safe-messages.ts | 0 .../web/src}/utils/safe-migrations.ts | 0 {src => apps/web/src}/utils/safe-versions.ts | 0 {src => apps/web/src}/utils/signers.ts | 0 {src => apps/web/src}/utils/tokens.ts | 0 .../web/src}/utils/transaction-calldata.ts | 0 .../web/src}/utils/transaction-guards.ts | 0 {src => apps/web/src}/utils/transactions.ts | 0 .../web/src}/utils/tx-history-filter.ts | 0 {src => apps/web/src}/utils/tx-link.ts | 0 {src => apps/web/src}/utils/tx-list.ts | 0 {src => apps/web/src}/utils/url.ts | 0 {src => apps/web/src}/utils/validation.ts | 0 {src => apps/web/src}/utils/wallets.ts | 0 {src => apps/web/src}/utils/web3.ts | 0 tsconfig.json => apps/web/tsconfig.json | 2 +- yarn.lock => apps/web/yarn.lock | 0 1883 files changed, 62 insertions(+), 1 deletion(-) rename .dockerignore => apps/web/.dockerignore (100%) rename .env.example => apps/web/.env.example (100%) create mode 100644 apps/web/.gitignore rename .prettierrc => apps/web/.prettierrc (100%) rename {.storybook => apps/web/.storybook}/main.ts (100%) rename {.storybook => apps/web/.storybook}/preview.ts (100%) rename Dockerfile => apps/web/Dockerfile (100%) rename LICENSE => apps/web/LICENSE (100%) rename README.md => apps/web/README.md (100%) rename cypress.config.js => apps/web/cypress.config.js (100%) rename {cypress => apps/web/cypress}/ci.json (100%) rename {cypress => apps/web/cypress}/e2e/happypath/recovery_hp_1.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath/recovery_hp_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath/recovery_hp_3.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath/recovery_hp_4.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath/sendfunds_connected_wallet.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath/sendfunds_queue_1.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath/sendfunds_relay.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath/tx_history_filter_hp_1.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath/tx_history_filter_hp_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath_2/add_owner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath_2/multichain_create_safe.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath_2/proposers.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/happypath_2/swaps.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/address_book.page.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/assets.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/batches.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/create_tx.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/create_wallet.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/dashboard.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/import_export.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/load_safe.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/main.page.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/messages.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/modals.page.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/modals/message_confirmation.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/modules.page.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/navigation.page.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/nfts.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/owners.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/proposers.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/recovery.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/safeapps.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/sidebar.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/spending_limits.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/staking.page.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/swaps.pages.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/tables.page.js (100%) rename {cypress => apps/web/cypress}/e2e/pages/transactions.page.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/add_owner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/create_tx.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/load_safe.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/messages_onchain.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/multichain_network.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/nfts.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/recovery.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/remove_owner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/sidebar.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/sidebar_3.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/spending_limits.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/swaps_history_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/swaps_tokens.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/tokens.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/tx_history.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/prodhealthcheck/tx_history_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/add_owner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/address_book.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/address_book_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/balances_pagination.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/batch_tx.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/bulk_execution.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/create_safe_cf.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/create_safe_simple.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/create_safe_simple_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/create_tx.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/load_safe.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/load_safe_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/messages_onchain.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/messages_popup.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/multichain_create_safe.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/multichain_create_safe_flow.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/multichain_network.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/multichain_networkswitch.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/multichain_setup.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/multichain_sidebar.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/nfts.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/proposers.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/proposers_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/recovery.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/recovery_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/remove_owner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/replace_owner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/sidebar.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/sidebar_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/sidebar_3.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/sidebar_4.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/sidebar_5.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/sidebar_6.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/sidebar_7.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/sidebar_nonowner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/spending_limits.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/spending_limits_nonowner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/staking_history.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/swaps.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/swaps_history.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/swaps_history_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/swaps_tokens.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/tokens.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/twaps.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/twaps_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/twaps_history.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/tx_decoding.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/tx_history.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/tx_history_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/tx_history_3.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/regression/tx_history_4.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/apps_list.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/browser_permissions.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/constants.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/drain_account.spec.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/info_modal.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/permissions_settings.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/preview_drawer.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/safe_permissions.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/tx-builder.2spec.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/tx-builder.spec.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/safe-apps/tx_modal.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/add_owner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/address_book.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/assets.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/batch_tx.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/create_safe_cf.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/create_safe_simple.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/create_tx.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/create_tx_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/dashboard.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/import_export_data.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/import_export_data_2.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/landing.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/load_safe.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/messages_offchain.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/nfts.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/replace_owner.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/spending_limits.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/tokens.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/tx_history.cy.js (100%) rename {cypress => apps/web/cypress}/e2e/smoke/tx_history_filter.cy.js (100%) rename {cypress => apps/web/cypress}/fixtures/address_book_addedsafes.csv (100%) rename {cypress => apps/web/cypress}/fixtures/address_book_duplicated.csv (100%) rename {cypress => apps/web/cypress}/fixtures/address_book_empty_test.csv (100%) rename {cypress => apps/web/cypress}/fixtures/address_book_networks.csv (100%) rename {cypress => apps/web/cypress}/fixtures/address_book_test.csv (100%) rename {cypress => apps/web/cypress}/fixtures/balances.json (100%) rename {cypress => apps/web/cypress}/fixtures/data_import.json (100%) rename {cypress => apps/web/cypress}/fixtures/invalid_image_QR_test.png (100%) rename {cypress => apps/web/cypress}/fixtures/safe-app.html (100%) rename {cypress => apps/web/cypress}/fixtures/safes/funds.json (100%) rename {cypress => apps/web/cypress}/fixtures/safes/nfts.json (100%) rename {cypress => apps/web/cypress}/fixtures/safes/recovery.json (100%) rename {cypress => apps/web/cypress}/fixtures/safes/safeapps.json (100%) rename {cypress => apps/web/cypress}/fixtures/safes/static.json (100%) rename {cypress => apps/web/cypress}/fixtures/sepolia_test_safe_QR.png (100%) rename {cypress => apps/web/cypress}/fixtures/staking_data.json (100%) rename {cypress => apps/web/cypress}/fixtures/swaps_data.json (100%) rename {cypress => apps/web/cypress}/fixtures/test-empty-batch.json (100%) rename {cypress => apps/web/cypress}/fixtures/test-invalid-batch.json (100%) rename {cypress => apps/web/cypress}/fixtures/test-mainnet-batch.json (100%) rename {cypress => apps/web/cypress}/fixtures/test-modified-batch.json (100%) rename {cypress => apps/web/cypress}/fixtures/test-working-batch.json (100%) rename {cypress => apps/web/cypress}/fixtures/txhistory_data_data.json (100%) rename {cypress => apps/web/cypress}/fixtures/txhistory_incoming_data.json (100%) rename {cypress => apps/web/cypress}/fixtures/txmessages_data.json (100%) rename {cypress => apps/web/cypress}/plugins/index.js (100%) rename {cypress => apps/web/cypress}/snapshots/actual/cypress/e2e/regression/tx_decoding.cy.js/tx_decoding.png (100%) rename {cypress => apps/web/cypress}/support/api/contracts.js (100%) rename {cypress => apps/web/cypress}/support/api/utils_ether.js (100%) rename {cypress => apps/web/cypress}/support/api/utils_protocolkit.js (100%) rename {cypress => apps/web/cypress}/support/commands.js (100%) rename {cypress => apps/web/cypress}/support/constants.js (100%) rename {cypress => apps/web/cypress}/support/e2e.js (100%) rename {cypress => apps/web/cypress}/support/localstorage_data.js (100%) rename {cypress => apps/web/cypress}/support/safe-apps-commands.js (100%) rename {cypress => apps/web/cypress}/support/safes/safesHandler.js (100%) rename {cypress => apps/web/cypress}/support/utils/checkers.js (100%) rename {cypress => apps/web/cypress}/support/utils/ethers.js (100%) rename {cypress => apps/web/cypress}/support/utils/gtag.js (100%) rename {cypress => apps/web/cypress}/support/utils/txquery.js (100%) rename {cypress => apps/web/cypress}/support/utils/wallet.js (100%) rename {docs => apps/web/docs}/code-style.md (100%) rename {docs => apps/web/docs}/environments.md (100%) rename {docs => apps/web/docs}/release-procedure.md (100%) rename {docs => apps/web/docs}/update-terms.md (100%) rename eslint.config.mjs => apps/web/eslint.config.mjs (100%) rename jest.config.cjs => apps/web/jest.config.cjs (100%) rename jest.setup.js => apps/web/jest.setup.js (100%) rename {mocks => apps/web/mocks}/svg.js (100%) rename next-env.d.ts => apps/web/next-env.d.ts (100%) rename next.config.mjs => apps/web/next.config.mjs (100%) rename package.json => apps/web/package.json (100%) rename {public => apps/web/public}/.well-known/apple-app-site-association (100%) rename {public => apps/web/public}/favicon.ico (100%) rename {public => apps/web/public}/favicons/android-chrome-192x192.png (100%) rename {public => apps/web/public}/favicons/android-chrome-512x512.png (100%) rename {public => apps/web/public}/favicons/apple-touch-icon.png (100%) rename {public => apps/web/public}/favicons/favicon-16x16.png (100%) rename {public => apps/web/public}/favicons/favicon-32x32.png (100%) rename {public => apps/web/public}/favicons/favicon-dot.ico (100%) rename {public => apps/web/public}/favicons/favicon.ico (100%) rename {public => apps/web/public}/favicons/logo_120x120.png (100%) rename {public => apps/web/public}/favicons/mstile-144x144.png (100%) rename {public => apps/web/public}/favicons/mstile-150x150.png (100%) rename {public => apps/web/public}/favicons/mstile-310x150.png (100%) rename {public => apps/web/public}/favicons/mstile-310x310.png (100%) rename {public => apps/web/public}/favicons/mstile-70x70.png (100%) rename {public => apps/web/public}/favicons/safari-pinned-tab.svg (100%) rename {public => apps/web/public}/fonts/DMSans700.woff2 (100%) rename {public => apps/web/public}/fonts/DMSansRegular.woff2 (100%) rename {public => apps/web/public}/fonts/fonts.css (100%) rename {public => apps/web/public}/images/address-book/address-book.svg (100%) rename {public => apps/web/public}/images/address-book/no-entries.svg (100%) rename {public => apps/web/public}/images/apps/add-custom-app.svg (100%) rename {public => apps/web/public}/images/apps/app-placeholder.svg (100%) rename {public => apps/web/public}/images/apps/apps-demo.svg (100%) rename {public => apps/web/public}/images/apps/apps-icon.svg (100%) rename {public => apps/web/public}/images/apps/batch-icon.svg (100%) rename {public => apps/web/public}/images/apps/bookmark.svg (100%) rename {public => apps/web/public}/images/apps/bookmarked.svg (100%) rename {public => apps/web/public}/images/apps/code-icon.svg (100%) rename {public => apps/web/public}/images/apps/explore.svg (100%) rename {public => apps/web/public}/images/apps/grid-view-icon.svg (100%) rename {public => apps/web/public}/images/apps/list-view-icon.svg (100%) rename {public => apps/web/public}/images/apps/network-error.svg (100%) rename {public => apps/web/public}/images/balances/no-assets.svg (100%) rename {public => apps/web/public}/images/common/add-outlined.svg (100%) rename {public => apps/web/public}/images/common/add.svg (100%) rename {public => apps/web/public}/images/common/alert.svg (100%) rename {public => apps/web/public}/images/common/arrow-down.svg (100%) rename {public => apps/web/public}/images/common/arrow-nw.svg (100%) rename {public => apps/web/public}/images/common/arrow-se.svg (100%) rename {public => apps/web/public}/images/common/arrow-top-right.svg (100%) rename {public => apps/web/public}/images/common/asterix.svg (100%) rename {public => apps/web/public}/images/common/bar-chart.svg (100%) rename {public => apps/web/public}/images/common/batch.svg (100%) rename {public => apps/web/public}/images/common/block.svg (100%) rename {public => apps/web/public}/images/common/bridge.svg (100%) rename {public => apps/web/public}/images/common/cancel.svg (100%) rename {public => apps/web/public}/images/common/caret-down.svg (100%) rename {public => apps/web/public}/images/common/check-filled.svg (100%) rename {public => apps/web/public}/images/common/check.svg (100%) rename {public => apps/web/public}/images/common/circle-check.svg (100%) rename {public => apps/web/public}/images/common/circle-partial-fill.svg (100%) rename {public => apps/web/public}/images/common/circle.svg (100%) rename {public => apps/web/public}/images/common/clock.svg (100%) rename {public => apps/web/public}/images/common/close.svg (100%) rename {public => apps/web/public}/images/common/connection-dots.svg (100%) rename {public => apps/web/public}/images/common/copy.svg (100%) rename {public => apps/web/public}/images/common/created.svg (100%) rename {public => apps/web/public}/images/common/delete.svg (100%) rename {public => apps/web/public}/images/common/discord-icon.svg (100%) rename {public => apps/web/public}/images/common/document_signature.svg (100%) rename {public => apps/web/public}/images/common/dot.svg (100%) rename {public => apps/web/public}/images/common/download-cloud.svg (100%) rename {public => apps/web/public}/images/common/drag.svg (100%) rename {public => apps/web/public}/images/common/edit.svg (100%) rename {public => apps/web/public}/images/common/empty-batch.svg (100%) rename {public => apps/web/public}/images/common/error.png (100%) rename {public => apps/web/public}/images/common/export.svg (100%) rename {public => apps/web/public}/images/common/gas-station.svg (100%) rename {public => apps/web/public}/images/common/gnosis-chain-logo.png (100%) rename {public => apps/web/public}/images/common/ic-rocket-speedup.svg (100%) rename {public => apps/web/public}/images/common/ic-swaps.svg (100%) rename {public => apps/web/public}/images/common/import.svg (100%) rename {public => apps/web/public}/images/common/kiln.svg (100%) rename {public => apps/web/public}/images/common/lightbulb.svg (100%) rename {public => apps/web/public}/images/common/link.svg (100%) rename {public => apps/web/public}/images/common/loading.svg (100%) rename {public => apps/web/public}/images/common/lock-small.svg (100%) rename {public => apps/web/public}/images/common/lock-warning.svg (100%) rename {public => apps/web/public}/images/common/lock.svg (100%) rename {public => apps/web/public}/images/common/minus.svg (100%) rename {public => apps/web/public}/images/common/multisend.svg (100%) rename {public => apps/web/public}/images/common/network-error.svg (100%) rename {public => apps/web/public}/images/common/nft-atomic0.svg (100%) rename {public => apps/web/public}/images/common/nft-blur.svg (100%) rename {public => apps/web/public}/images/common/nft-etherscan.svg (100%) rename {public => apps/web/public}/images/common/nft-gnosisscan.svg (100%) rename {public => apps/web/public}/images/common/nft-opensea.svg (100%) rename {public => apps/web/public}/images/common/nft-placeholder.png (100%) rename {public => apps/web/public}/images/common/nft-polygonscan.svg (100%) rename {public => apps/web/public}/images/common/nft-zapper.svg (100%) rename {public => apps/web/public}/images/common/nft-zerion.svg (100%) rename {public => apps/web/public}/images/common/nft.svg (100%) rename {public => apps/web/public}/images/common/notifications.svg (100%) rename {public => apps/web/public}/images/common/outreach-popup-avatar.png (100%) rename {public => apps/web/public}/images/common/owners.svg (100%) rename {public => apps/web/public}/images/common/plus.svg (100%) rename {public => apps/web/public}/images/common/propose-recovery-dark.svg (100%) rename {public => apps/web/public}/images/common/propose-recovery-light.svg (100%) rename {public => apps/web/public}/images/common/qr.svg (100%) rename {public => apps/web/public}/images/common/question.svg (100%) rename {public => apps/web/public}/images/common/ramp_logo.svg (100%) rename {public => apps/web/public}/images/common/recovery-pending.svg (100%) rename {public => apps/web/public}/images/common/recovery-plus.svg (100%) rename {public => apps/web/public}/images/common/recovery.svg (100%) rename {public => apps/web/public}/images/common/recovery_custom.svg (100%) rename {public => apps/web/public}/images/common/recovery_sygnum.svg (100%) rename {public => apps/web/public}/images/common/relayer.svg (100%) rename {public => apps/web/public}/images/common/rocket.svg (100%) rename {public => apps/web/public}/images/common/safe-pass-logo.svg (100%) rename {public => apps/web/public}/images/common/safe-pass-star.svg (100%) rename {public => apps/web/public}/images/common/safe-swap-dark.svg (100%) rename {public => apps/web/public}/images/common/safe-swap.svg (100%) rename {public => apps/web/public}/images/common/safe-token.svg (100%) rename {public => apps/web/public}/images/common/save-address.svg (100%) rename {public => apps/web/public}/images/common/search.svg (100%) rename {public => apps/web/public}/images/common/share.svg (100%) rename {public => apps/web/public}/images/common/shield-off.svg (100%) rename {public => apps/web/public}/images/common/shield.svg (100%) rename {public => apps/web/public}/images/common/stake-illustration-dark.svg (100%) rename {public => apps/web/public}/images/common/stake-illustration-light.svg (100%) rename {public => apps/web/public}/images/common/stake.svg (100%) rename {public => apps/web/public}/images/common/success.svg (100%) rename {public => apps/web/public}/images/common/swap-empty-dark.svg (100%) rename {public => apps/web/public}/images/common/swap-empty-light.svg (100%) rename {public => apps/web/public}/images/common/swap.svg (100%) rename {public => apps/web/public}/images/common/token-placeholder.svg (100%) rename {public => apps/web/public}/images/common/tx-failed.svg (100%) rename {public => apps/web/public}/images/common/walletconnect.svg (100%) rename {public => apps/web/public}/images/common/zkemail-logo.svg (100%) rename {public => apps/web/public}/images/logo-no-text.svg (100%) rename {public => apps/web/public}/images/logo-round.svg (100%) rename {public => apps/web/public}/images/logo-text.svg (100%) rename {public => apps/web/public}/images/logo.svg (100%) rename {public => apps/web/public}/images/messages/created.svg (100%) rename {public => apps/web/public}/images/messages/dot.svg (100%) rename {public => apps/web/public}/images/messages/link.svg (100%) rename {public => apps/web/public}/images/messages/no-messages.svg (100%) rename {public => apps/web/public}/images/messages/required.svg (100%) rename {public => apps/web/public}/images/messages/signed.svg (100%) rename {public => apps/web/public}/images/notifications/alert.svg (100%) rename {public => apps/web/public}/images/notifications/error.svg (100%) rename {public => apps/web/public}/images/notifications/info.svg (100%) rename {public => apps/web/public}/images/notifications/no-notifications.svg (100%) rename {public => apps/web/public}/images/notifications/push-notification.svg (100%) rename {public => apps/web/public}/images/notifications/success.svg (100%) rename {public => apps/web/public}/images/notifications/warning.svg (100%) rename {public => apps/web/public}/images/open/safe-creation-error.svg (100%) rename {public => apps/web/public}/images/open/safe-creation-process.gif (100%) rename {public => apps/web/public}/images/open/safe-creation.svg (100%) rename {public => apps/web/public}/images/safe-logo-green.png (100%) rename {public => apps/web/public}/images/settings/data/file.svg (100%) rename {public => apps/web/public}/images/settings/permissions/shield.svg (100%) rename {public => apps/web/public}/images/settings/setup/replace-owner.svg (100%) rename {public => apps/web/public}/images/settings/spending-limit/asset-amount.svg (100%) rename {public => apps/web/public}/images/settings/spending-limit/beneficiary.svg (100%) rename {public => apps/web/public}/images/settings/spending-limit/speed.svg (100%) rename {public => apps/web/public}/images/settings/spending-limit/time.svg (100%) rename {public => apps/web/public}/images/sidebar/address-book.svg (100%) rename {public => apps/web/public}/images/sidebar/apps.svg (100%) rename {public => apps/web/public}/images/sidebar/assets.svg (100%) rename {public => apps/web/public}/images/sidebar/copy-bold.svg (100%) rename {public => apps/web/public}/images/sidebar/help-center.svg (100%) rename {public => apps/web/public}/images/sidebar/home.svg (100%) rename {public => apps/web/public}/images/sidebar/link-bold.svg (100%) rename {public => apps/web/public}/images/sidebar/link.svg (100%) rename {public => apps/web/public}/images/sidebar/multichain-account.svg (100%) rename {public => apps/web/public}/images/sidebar/qr-bold.svg (100%) rename {public => apps/web/public}/images/sidebar/settings.svg (100%) rename {public => apps/web/public}/images/sidebar/transactions.svg (100%) rename {public => apps/web/public}/images/sidebar/whats-new.svg (100%) rename {public => apps/web/public}/images/social-share.png (100%) rename {public => apps/web/public}/images/transactions/blockaid-icon.svg (100%) rename {public => apps/web/public}/images/transactions/circle-cross-red.svg (100%) rename {public => apps/web/public}/images/transactions/custom.svg (100%) rename {public => apps/web/public}/images/transactions/ghost.svg (100%) rename {public => apps/web/public}/images/transactions/incoming.svg (100%) rename {public => apps/web/public}/images/transactions/nestedTx.svg (100%) rename {public => apps/web/public}/images/transactions/new-tx.svg (100%) rename {public => apps/web/public}/images/transactions/no-transactions.svg (100%) rename {public => apps/web/public}/images/transactions/outgoing.svg (100%) rename {public => apps/web/public}/images/transactions/recovery-execution.svg (100%) rename {public => apps/web/public}/images/transactions/recovery-recoverer.svg (100%) rename {public => apps/web/public}/images/transactions/redefine-dark-mode.png (100%) rename {public => apps/web/public}/images/transactions/redefine.png (100%) rename {public => apps/web/public}/images/transactions/replace-tx.svg (100%) rename {public => apps/web/public}/images/transactions/rocket.svg (100%) rename {public => apps/web/public}/images/transactions/settings.svg (100%) rename {public => apps/web/public}/images/transactions/signature.svg (100%) rename {public => apps/web/public}/images/transactions/tenderly-dark.svg (100%) rename {public => apps/web/public}/images/transactions/tenderly-light.svg (100%) rename {public => apps/web/public}/images/transactions/transactions.svg (100%) rename {public => apps/web/public}/images/transactions/zodiac-roles.svg (100%) rename {public => apps/web/public}/images/welcome/load-safe.svg (100%) rename {public => apps/web/public}/images/welcome/logo-google.svg (100%) rename {public => apps/web/public}/images/welcome/new-safe.svg (100%) rename {public => apps/web/public}/safe.webmanifest (100%) rename {scripts => apps/web/scripts}/cmp.sh (100%) rename {scripts => apps/web/scripts}/css-vars.ts (100%) rename {scripts => apps/web/scripts}/generate-routes.js (100%) rename {scripts => apps/web/scripts}/github/download_bundle_analyser_artifact.sh (100%) rename {scripts => apps/web/scripts}/github/prepare_production_deployment.sh (100%) rename {scripts => apps/web/scripts}/github/s3_upload.sh (100%) rename {src => apps/web/src}/components/address-book/AddressBookHeader/index.tsx (100%) rename {src => apps/web/src}/components/address-book/AddressBookTable/index.tsx (100%) rename {src => apps/web/src}/components/address-book/AddressBookTable/styles.module.css (100%) rename {src => apps/web/src}/components/address-book/EntryDialog/index.tsx (100%) rename {src => apps/web/src}/components/address-book/ExportDialog/index.test.tsx (100%) rename {src => apps/web/src}/components/address-book/ExportDialog/index.tsx (100%) rename {src => apps/web/src}/components/address-book/ImportDialog/__tests__/validation.test.ts (100%) rename {src => apps/web/src}/components/address-book/ImportDialog/index.tsx (100%) rename {src => apps/web/src}/components/address-book/ImportDialog/styles.module.css (100%) rename {src => apps/web/src}/components/address-book/ImportDialog/validation.ts (100%) rename {src => apps/web/src}/components/address-book/RemoveDialog/index.tsx (100%) rename {src => apps/web/src}/components/balances/AssetsHeader/index.tsx (100%) rename {src => apps/web/src}/components/balances/AssetsTable/SendButton.tsx (100%) rename {src => apps/web/src}/components/balances/AssetsTable/index.test.tsx (100%) rename {src => apps/web/src}/components/balances/AssetsTable/index.tsx (100%) rename {src => apps/web/src}/components/balances/AssetsTable/styles.module.css (100%) rename {src => apps/web/src}/components/balances/AssetsTable/useHideAssets.ts (100%) rename {src => apps/web/src}/components/balances/CurrencySelect/__tests__/useCurrencies.test.ts (100%) rename {src => apps/web/src}/components/balances/CurrencySelect/index.tsx (100%) rename {src => apps/web/src}/components/balances/CurrencySelect/useCurrencies.ts (100%) rename {src => apps/web/src}/components/balances/HiddenTokenButton/index.test.tsx (100%) rename {src => apps/web/src}/components/balances/HiddenTokenButton/index.tsx (100%) rename {src => apps/web/src}/components/balances/HiddenTokenButton/styles.module.css (100%) rename {src => apps/web/src}/components/balances/TokenListSelect/index.tsx (100%) rename {src => apps/web/src}/components/balances/TokenMenu/index.tsx (100%) rename {src => apps/web/src}/components/balances/TokenMenu/styles.module.css (100%) rename {src => apps/web/src}/components/batch/BatchIndicator/BatchTooltip.tsx (100%) rename {src => apps/web/src}/components/batch/BatchIndicator/index.tsx (100%) rename {src => apps/web/src}/components/batch/BatchSidebar/BatchTxItem.tsx (100%) rename {src => apps/web/src}/components/batch/BatchSidebar/BatchTxList.tsx (100%) rename {src => apps/web/src}/components/batch/BatchSidebar/EmptyBatch.tsx (100%) rename {src => apps/web/src}/components/batch/BatchSidebar/index.tsx (100%) rename {src => apps/web/src}/components/batch/BatchSidebar/styles.module.css (100%) rename {src => apps/web/src}/components/common/AddFunds/index.tsx (100%) rename {src => apps/web/src}/components/common/AddressBookInput/index.test.tsx (100%) rename {src => apps/web/src}/components/common/AddressBookInput/index.tsx (100%) rename {src => apps/web/src}/components/common/AddressBookInput/styles.module.css (100%) rename {src => apps/web/src}/components/common/AddressInput/index.test.tsx (100%) rename {src => apps/web/src}/components/common/AddressInput/index.tsx (100%) rename {src => apps/web/src}/components/common/AddressInput/styles.module.css (100%) rename {src => apps/web/src}/components/common/AddressInput/useNameResolver.ts (100%) rename {src => apps/web/src}/components/common/AddressInputReadOnly/index.tsx (100%) rename {src => apps/web/src}/components/common/AddressInputReadOnly/styles.module.css (100%) rename {src => apps/web/src}/components/common/BlockedAddress/index.tsx (100%) rename {src => apps/web/src}/components/common/BlockedAddress/styles.module.css (100%) rename {src => apps/web/src}/components/common/BuyCryptoButton/index.tsx (100%) rename {src => apps/web/src}/components/common/BuyCryptoButton/styles.module.css (100%) rename {src => apps/web/src}/components/common/ChainIndicator/index.tsx (100%) rename {src => apps/web/src}/components/common/ChainIndicator/styles.module.css (100%) rename {src => apps/web/src}/components/common/ChainSwitcher/index.tsx (100%) rename {src => apps/web/src}/components/common/ChainSwitcher/styles.module.css (100%) rename {src => apps/web/src}/components/common/CheckWallet/index.test.tsx (100%) rename {src => apps/web/src}/components/common/CheckWallet/index.tsx (100%) rename {src => apps/web/src}/components/common/Chip/index.tsx (100%) rename {src => apps/web/src}/components/common/ChoiceButton/index.tsx (100%) rename {src => apps/web/src}/components/common/ChoiceButton/styles.module.css (100%) rename {src => apps/web/src}/components/common/ConnectWallet/AccountCenter.tsx (100%) rename {src => apps/web/src}/components/common/ConnectWallet/ConnectWalletButton.tsx (100%) rename {src => apps/web/src}/components/common/ConnectWallet/ConnectionCenter.tsx (100%) rename {src => apps/web/src}/components/common/ConnectWallet/__tests__/AccountCenter.test.tsx (100%) rename {src => apps/web/src}/components/common/ConnectWallet/__tests__/ConnectionCenter.test.tsx (100%) rename {src => apps/web/src}/components/common/ConnectWallet/index.tsx (100%) rename {src => apps/web/src}/components/common/ConnectWallet/styles.module.css (100%) rename {src => apps/web/src}/components/common/ConnectWallet/useConnectWallet.ts (100%) rename {src => apps/web/src}/components/common/ContextMenu/index.tsx (100%) rename {src => apps/web/src}/components/common/ContextMenu/styles.module.css (100%) rename {src => apps/web/src}/components/common/CookieAndTermBanner/index.tsx (100%) rename {src => apps/web/src}/components/common/CookieAndTermBanner/styles.module.css (100%) rename {src => apps/web/src}/components/common/CooldownButton/index.test.tsx (100%) rename {src => apps/web/src}/components/common/CooldownButton/index.tsx (100%) rename {src => apps/web/src}/components/common/CopyAddressButton/__tests__/index.test.tsx (100%) rename {src => apps/web/src}/components/common/CopyAddressButton/index.tsx (100%) rename {src => apps/web/src}/components/common/CopyButton/index.stories.tsx (100%) rename {src => apps/web/src}/components/common/CopyButton/index.tsx (100%) rename {src => apps/web/src}/components/common/CopyTooltip/ConfirmCopyModal.tsx (100%) rename {src => apps/web/src}/components/common/CopyTooltip/index.tsx (100%) rename {src => apps/web/src}/components/common/CopyTooltip/styles.module.css (100%) rename {src => apps/web/src}/components/common/Countdown/index.test.tsx (100%) rename {src => apps/web/src}/components/common/Countdown/index.tsx (100%) rename {src => apps/web/src}/components/common/CustomLink/index.tsx (100%) rename {src => apps/web/src}/components/common/CustomTooltip/index.tsx (100%) rename {src => apps/web/src}/components/common/DatePickerInput/index.tsx (100%) rename {src => apps/web/src}/components/common/DateTime/DateTime.stories.tsx (100%) rename {src => apps/web/src}/components/common/DateTime/DateTime.tsx (100%) rename {src => apps/web/src}/components/common/DateTime/DateTimeContainer.tsx (100%) rename {src => apps/web/src}/components/common/DateTime/index.test.tsx (100%) rename {src => apps/web/src}/components/common/DateTime/index.tsx (100%) rename {src => apps/web/src}/components/common/Disclaimer/index.stories.tsx (100%) rename {src => apps/web/src}/components/common/Disclaimer/index.tsx (100%) rename {src => apps/web/src}/components/common/Disclaimer/styles.module.css (100%) rename {src => apps/web/src}/components/common/EnhancedTable/index.tsx (100%) rename {src => apps/web/src}/components/common/EnhancedTable/styles.module.css (100%) rename {src => apps/web/src}/components/common/ErrorBoundary/index.tsx (100%) rename {src => apps/web/src}/components/common/ErrorBoundary/styles.module.css (100%) rename {src => apps/web/src}/components/common/EthHashInfo/SrcEthHashInfo/index.stories.tsx (100%) rename {src => apps/web/src}/components/common/EthHashInfo/SrcEthHashInfo/index.tsx (100%) rename {src => apps/web/src}/components/common/EthHashInfo/SrcEthHashInfo/styles.module.css (100%) rename {src => apps/web/src}/components/common/EthHashInfo/index.stories.tsx (100%) rename {src => apps/web/src}/components/common/EthHashInfo/index.test.tsx (100%) rename {src => apps/web/src}/components/common/EthHashInfo/index.tsx (100%) rename {src => apps/web/src}/components/common/ExplorerButton/index.tsx (100%) rename {src => apps/web/src}/components/common/ExternalLink/index.tsx (100%) rename {src => apps/web/src}/components/common/FiatValue/FiatValue.test.tsx (100%) rename {src => apps/web/src}/components/common/FiatValue/index.tsx (100%) rename {src => apps/web/src}/components/common/FileUpload/index.tsx (100%) rename {src => apps/web/src}/components/common/FileUpload/styles.module.css (100%) rename {src => apps/web/src}/components/common/Footer/index.tsx (100%) rename {src => apps/web/src}/components/common/Footer/styles.module.css (100%) rename {src => apps/web/src}/components/common/GeoblockingProvider/index.tsx (100%) rename {src => apps/web/src}/components/common/Header/index.test.tsx (100%) rename {src => apps/web/src}/components/common/Header/index.tsx (100%) rename {src => apps/web/src}/components/common/Header/styles.module.css (100%) rename {src => apps/web/src}/components/common/Identicon/index.tsx (100%) rename {src => apps/web/src}/components/common/Identicon/styles.module.css (100%) rename {src => apps/web/src}/components/common/ImageFallback/index.tsx (100%) rename {src => apps/web/src}/components/common/InfiniteScroll/index.tsx (100%) rename {src => apps/web/src}/components/common/InputValueHelper/index.tsx (100%) rename {src => apps/web/src}/components/common/LegalDisclaimerContent/index.tsx (100%) rename {src => apps/web/src}/components/common/LegalDisclaimerContent/styles.module.css (100%) rename {src => apps/web/src}/components/common/MetaTags/index.tsx (100%) rename {src => apps/web/src}/components/common/ModalDialog/index.tsx (100%) rename {src => apps/web/src}/components/common/ModalDialog/styles.module.css (100%) rename {src => apps/web/src}/components/common/Mui/index.test.tsx (100%) rename {src => apps/web/src}/components/common/Mui/index.tsx (100%) rename {src => apps/web/src}/components/common/NameInput/index.tsx (100%) rename {src => apps/web/src}/components/common/NamedAddressInfo/index.test.tsx (100%) rename {src => apps/web/src}/components/common/NamedAddressInfo/index.tsx (100%) rename {src => apps/web/src}/components/common/NavTabs/index.tsx (100%) rename {src => apps/web/src}/components/common/NavTabs/styles.module.css (100%) rename {src => apps/web/src}/components/common/Navigate/index.test.tsx (100%) rename {src => apps/web/src}/components/common/Navigate/index.tsx (100%) rename {src => apps/web/src}/components/common/NetworkInput/index.tsx (100%) rename {src => apps/web/src}/components/common/NetworkInput/styles.module.css (100%) rename {src => apps/web/src}/components/common/NetworkSelector/NetworkMultiSelector.tsx (100%) rename {src => apps/web/src}/components/common/NetworkSelector/__tests__/NetworkMultiSelector.test.tsx (100%) rename {src => apps/web/src}/components/common/NetworkSelector/index.tsx (100%) rename {src => apps/web/src}/components/common/NetworkSelector/styles.module.css (100%) rename {src => apps/web/src}/components/common/NetworkSelector/useChangeNetworkLink.ts (100%) rename {src => apps/web/src}/components/common/Notifications/index.tsx (100%) rename {src => apps/web/src}/components/common/Notifications/styles.module.css (100%) rename {src => apps/web/src}/components/common/Notifications/useCounter.ts (100%) rename {src => apps/web/src}/components/common/NumberField/index.test.ts (100%) rename {src => apps/web/src}/components/common/NumberField/index.tsx (100%) rename {src => apps/web/src}/components/common/OnboardingTooltip/__tests__/OnboardingTooltip.test.tsx (100%) rename {src => apps/web/src}/components/common/OnboardingTooltip/index.tsx (100%) rename {src => apps/web/src}/components/common/PageHeader/index.tsx (100%) rename {src => apps/web/src}/components/common/PageHeader/styles.module.css (100%) rename {src => apps/web/src}/components/common/PageLayout/SideDrawer.tsx (100%) rename {src => apps/web/src}/components/common/PageLayout/index.tsx (100%) rename {src => apps/web/src}/components/common/PageLayout/styles.module.css (100%) rename {src => apps/web/src}/components/common/PagePlaceholder/index.tsx (100%) rename {src => apps/web/src}/components/common/PagePlaceholder/styles.module.css (100%) rename {src => apps/web/src}/components/common/PaginatedTxns/SkeletonTxList.tsx (100%) rename {src => apps/web/src}/components/common/PaginatedTxns/index.tsx (100%) rename {src => apps/web/src}/components/common/Popup/index.tsx (100%) rename {src => apps/web/src}/components/common/ProgressBar/index.tsx (100%) rename {src => apps/web/src}/components/common/ProgressBar/styles.module.css (100%) rename {src => apps/web/src}/components/common/QRCode/index.tsx (100%) rename {src => apps/web/src}/components/common/SafeIcon/index.tsx (100%) rename {src => apps/web/src}/components/common/SafeIcon/styles.module.css (100%) rename {src => apps/web/src}/components/common/SafeLoadingError/index.tsx (100%) rename {src => apps/web/src}/components/common/SafeTokenWidget/__tests__/SafeTokenWidget.test.tsx (100%) rename {src => apps/web/src}/components/common/SafeTokenWidget/index.tsx (100%) rename {src => apps/web/src}/components/common/SafeTokenWidget/styles.module.css (100%) rename {src => apps/web/src}/components/common/SpendingLimitLabel/index.tsx (100%) rename {src => apps/web/src}/components/common/Sticky/index.tsx (100%) rename {src => apps/web/src}/components/common/Table/DataRow.stories.tsx (100%) rename {src => apps/web/src}/components/common/Table/DataRow.tsx (100%) rename {src => apps/web/src}/components/common/Table/DataTable.stories.tsx (100%) rename {src => apps/web/src}/components/common/Table/DataTable.tsx (100%) rename {src => apps/web/src}/components/common/Table/EmptyRow.tsx (100%) rename {src => apps/web/src}/components/common/Table/styles.module.css (100%) rename {src => apps/web/src}/components/common/TokenAmount/index.stories.tsx (100%) rename {src => apps/web/src}/components/common/TokenAmount/index.test.tsx (100%) rename {src => apps/web/src}/components/common/TokenAmount/index.tsx (100%) rename {src => apps/web/src}/components/common/TokenAmount/styles.module.css (100%) rename {src => apps/web/src}/components/common/TokenAmountInput/index.tsx (100%) rename {src => apps/web/src}/components/common/TokenAmountInput/styles.module.css (100%) rename {src => apps/web/src}/components/common/TokenExplorerLink/index.tsx (100%) rename {src => apps/web/src}/components/common/TokenIcon/index.tsx (100%) rename {src => apps/web/src}/components/common/TokenIcon/styles.module.css (100%) rename {src => apps/web/src}/components/common/Track/index.tsx (100%) rename {src => apps/web/src}/components/common/TxModalDialog/index.tsx (100%) rename {src => apps/web/src}/components/common/TxModalDialog/styles.module.css (100%) rename {src => apps/web/src}/components/common/UnreadBadge/index.tsx (100%) rename {src => apps/web/src}/components/common/WalletBalance/index.test.tsx (100%) rename {src => apps/web/src}/components/common/WalletBalance/index.tsx (100%) rename {src => apps/web/src}/components/common/WalletIcon/index.tsx (100%) rename {src => apps/web/src}/components/common/WalletInfo/index.test.tsx (100%) rename {src => apps/web/src}/components/common/WalletInfo/index.tsx (100%) rename {src => apps/web/src}/components/common/WalletInfo/styles.module.css (100%) rename {src => apps/web/src}/components/common/WalletOverview/index.tsx (100%) rename {src => apps/web/src}/components/common/WalletOverview/styles.module.css (100%) rename {src => apps/web/src}/components/common/WalletProvider/index.tsx (100%) rename {src => apps/web/src}/components/common/WidgetDisclaimer/index.tsx (100%) rename {src => apps/web/src}/components/common/WidgetDisclaimer/styles.module.css (100%) rename {src => apps/web/src}/components/common/icons/CircularIcon/index.tsx (100%) rename {src => apps/web/src}/components/common/icons/CircularIcon/styles.module.css (100%) rename {src => apps/web/src}/components/common/icons/KeyholeIcon/index.tsx (100%) rename {src => apps/web/src}/components/common/icons/KeyholeIcon/keyhole.svg (100%) rename {src => apps/web/src}/components/dashboard/Assets/index.tsx (100%) rename {src => apps/web/src}/components/dashboard/FirstSteps/index.tsx (100%) rename {src => apps/web/src}/components/dashboard/FirstSteps/styles.module.css (100%) rename {src => apps/web/src}/components/dashboard/GovernanceSection/GovernanceSection.tsx (100%) rename {src => apps/web/src}/components/dashboard/GovernanceSection/styles.module.css (100%) rename {src => apps/web/src}/components/dashboard/Overview/Overview.tsx (100%) rename {src => apps/web/src}/components/dashboard/PendingTxs/PendingRecoveryListItem.tsx (100%) rename {src => apps/web/src}/components/dashboard/PendingTxs/PendingTxList.test.ts (100%) rename {src => apps/web/src}/components/dashboard/PendingTxs/PendingTxListItem.tsx (100%) rename {src => apps/web/src}/components/dashboard/PendingTxs/PendingTxsList.tsx (100%) rename {src => apps/web/src}/components/dashboard/PendingTxs/styles.module.css (100%) rename {src => apps/web/src}/components/dashboard/SafeAppsDashboardSection/SafeAppsDashboardSection.tsx (100%) rename {src => apps/web/src}/components/dashboard/SafeAppsDashboardSection/__tests__/SafeAppsDashboardSection.test.tsx (100%) rename {src => apps/web/src}/components/dashboard/SafeAppsDashboardSection/styles.module.css (100%) rename {src => apps/web/src}/components/dashboard/StakingBanner/index.tsx (100%) rename {src => apps/web/src}/components/dashboard/StakingBanner/styles.module.css (100%) rename {src => apps/web/src}/components/dashboard/index.tsx (100%) rename {src => apps/web/src}/components/dashboard/styled.tsx (100%) rename {src => apps/web/src}/components/dashboard/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/CardStepper/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/CardStepper/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/CardStepper/useCardStepper.ts (100%) rename {src => apps/web/src}/components/new-safe/OwnerRow/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/OwnerRow/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/ReviewRow/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/AdvancedCreateSafe.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/CreateSafeInfos/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/InfoWidget/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/InfoWidget/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/create/NetworkWarning/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/NoWalletConnectedWarning/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/OverviewWidget/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/OverviewWidget/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/create/__tests__/useEstimateSafeCreationGas.test.ts (100%) rename {src => apps/web/src}/components/new-safe/create/__tests__/useSyncSafeCreationStep.test.ts (100%) rename {src => apps/web/src}/components/new-safe/create/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/logic/address-book.ts (100%) rename {src => apps/web/src}/components/new-safe/create/logic/index.test.ts (100%) rename {src => apps/web/src}/components/new-safe/create/logic/index.ts (100%) rename {src => apps/web/src}/components/new-safe/create/logic/utils.test.ts (100%) rename {src => apps/web/src}/components/new-safe/create/logic/utils.ts (100%) rename {src => apps/web/src}/components/new-safe/create/steps/AdvancedOptionsStep/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/OwnerPolicyStep/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/OwnerPolicyStep/useSafeSetupHints.ts (100%) rename {src => apps/web/src}/components/new-safe/create/steps/ReviewStep/index.test.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/ReviewStep/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/ReviewStep/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/create/steps/SetNameStep/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/SetNameStep/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/create/steps/StatusStep/LoadingSpinner/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/StatusStep/LoadingSpinner/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/create/steps/StatusStep/StatusMessage.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/StatusStep/StatusStep.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/StatusStep/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/create/steps/StatusStep/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/create/steps/StatusStep/useUndeployedSafe.ts (100%) rename {src => apps/web/src}/components/new-safe/create/styles.module.css (100%) rename {src => apps/web/src}/components/new-safe/create/types.d.ts (100%) rename {src => apps/web/src}/components/new-safe/create/useEstimateSafeCreationGas.ts (100%) rename {src => apps/web/src}/components/new-safe/create/useSyncSafeCreationStep.ts (100%) rename {src => apps/web/src}/components/new-safe/load/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/load/steps/SafeOwnerStep/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/load/steps/SafeReviewStep/index.tsx (100%) rename {src => apps/web/src}/components/new-safe/load/steps/SetAddressStep/index.tsx (100%) rename {src => apps/web/src}/components/nfts/NftCollections/index.tsx (100%) rename {src => apps/web/src}/components/nfts/NftGrid/index.tsx (100%) rename {src => apps/web/src}/components/nfts/NftPreviewModal/index.tsx (100%) rename {src => apps/web/src}/components/nfts/NftPreviewModal/styles.module.css (100%) rename {src => apps/web/src}/components/nfts/NftSendForm/index.tsx (100%) rename {src => apps/web/src}/components/nfts/config.ts (100%) rename {src => apps/web/src}/components/notification-center/NotificationCenter/index.tsx (100%) rename {src => apps/web/src}/components/notification-center/NotificationCenter/styles.module.css (100%) rename {src => apps/web/src}/components/notification-center/NotificationCenterItem/index.tsx (100%) rename {src => apps/web/src}/components/notification-center/NotificationCenterItem/styles.module.css (100%) rename {src => apps/web/src}/components/notification-center/NotificationCenterList/index.tsx (100%) rename {src => apps/web/src}/components/notification-center/NotificationCenterList/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/AddCustomAppModal/CustomApp.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AddCustomAppModal/CustomAppPlaceholder.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AddCustomAppModal/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AddCustomAppModal/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/AddCustomSafeAppCard/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/SafeAppIframe.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/ThirdPartyCookiesWarning.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/TransactionQueueBar/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/TransactionQueueBar/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/__tests__/AppFrame.test.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/useAppCommunicator.ts (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/useAppIsLoading.ts (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/useFromAppAnalytics.ts (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/useGetSafeInfo.ts (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/useThirdPartyCookies.ts (100%) rename {src => apps/web/src}/components/safe-apps/AppFrame/useTransactionQueueBarState.ts (100%) rename {src => apps/web/src}/components/safe-apps/NativeSwapsCard/index.stories.tsx (100%) rename {src => apps/web/src}/components/safe-apps/NativeSwapsCard/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/NativeSwapsCard/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/PermissionCheckbox.tsx (100%) rename {src => apps/web/src}/components/safe-apps/PermissionsPrompt.tsx (100%) rename {src => apps/web/src}/components/safe-apps/RemoveCustomAppModal.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppActionButtons/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppCard/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppCard/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppIconCard/index.test.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppIconCard/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppLandingPage/AppActions.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppLandingPage/SafeAppDetails.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppLandingPage/TryDemo.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppLandingPage/constants.ts (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppLandingPage/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppList/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppList/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppPreviewDrawer/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppPreviewDrawer/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppSocialLinksCard/SafeAppSocialLinksCard.test.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppSocialLinksCard/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppSocialLinksCard/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppTags/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppTags/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsErrorBoundary/SafeAppsLoadError.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsErrorBoundary/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsErrorBoundary/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsFilters/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsFilters/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsHeader/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsHeader/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsInfoModal/AllowedFeaturesList.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsInfoModal/Domain.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsInfoModal/Slider.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsInfoModal/UnknownAppWarning.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsInfoModal/constants.ts (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsInfoModal/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsInfoModal/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsInfoModal/useSafeAppsInfoModal.ts (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsListHeader/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsListHeader/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsSDKLink/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsSDKLink/styles.module.css (100%) rename {src => apps/web/src}/components/safe-apps/SafeAppsZeroResultsPlaceholder/index.tsx (100%) rename {src => apps/web/src}/components/safe-apps/hooks/useShareSafeAppUrl.ts (100%) rename {src => apps/web/src}/components/safe-apps/types.ts (100%) rename {src => apps/web/src}/components/safe-apps/utils.ts (100%) rename {src => apps/web/src}/components/safe-messages/DecodedMsg/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/DecodedMsg/styles.module.css (100%) rename {src => apps/web/src}/components/safe-messages/InfoBox/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/InfoBox/styles.module.css (100%) rename {src => apps/web/src}/components/safe-messages/Msg/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/Msg/styles.module.css (100%) rename {src => apps/web/src}/components/safe-messages/MsgDetails/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/MsgList/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/MsgListItem/ExpandableMsgItem.tsx (100%) rename {src => apps/web/src}/components/safe-messages/MsgListItem/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/MsgShareLink/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/MsgSigners/MsgSigners.test.tsx (100%) rename {src => apps/web/src}/components/safe-messages/MsgSigners/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/MsgSigners/styles.module.css (100%) rename {src => apps/web/src}/components/safe-messages/MsgSummary/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/MsgType/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/PaginatedMsgs/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/SignMsgButton/index.tsx (100%) rename {src => apps/web/src}/components/safe-messages/SingleMsg/SingleMsg.test.tsx (100%) rename {src => apps/web/src}/components/safe-messages/SingleMsg/index.tsx (100%) rename {src => apps/web/src}/components/settings/ContractVersion/index.tsx (100%) rename {src => apps/web/src}/components/settings/DataManagement/FileListCard.tsx (100%) rename {src => apps/web/src}/components/settings/DataManagement/ImportDialog.tsx (100%) rename {src => apps/web/src}/components/settings/DataManagement/ImportFileUpload.tsx (100%) rename {src => apps/web/src}/components/settings/DataManagement/__tests__/useGlobalImportFileParser.test.ts (100%) rename {src => apps/web/src}/components/settings/DataManagement/index.tsx (100%) rename {src => apps/web/src}/components/settings/DataManagement/styles.module.css (100%) rename {src => apps/web/src}/components/settings/DataManagement/useGlobalImportFileParser.ts (100%) rename {src => apps/web/src}/components/settings/EnvironmentVariables/EnvHintButton/index.tsx (100%) rename {src => apps/web/src}/components/settings/EnvironmentVariables/EnvHintButton/styles.module.css (100%) rename {src => apps/web/src}/components/settings/EnvironmentVariables/index.tsx (100%) rename {src => apps/web/src}/components/settings/FallbackHandler/__tests__/index.test.tsx (100%) rename {src => apps/web/src}/components/settings/FallbackHandler/index.tsx (100%) rename {src => apps/web/src}/components/settings/ProposersList/index.tsx (100%) rename {src => apps/web/src}/components/settings/PushNotifications/GlobalPushNotifications.tsx (100%) rename {src => apps/web/src}/components/settings/PushNotifications/__tests__/GlobalPushNotifications.test.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/__tests__/logic.test.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/hooks/__tests__/useNotificationPreferences.test.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/hooks/__tests__/useNotificationRegistrations.test.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/hooks/__tests__/useNotificationTracking.test.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/hooks/useNotificationPreferences.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/hooks/useNotificationRegistrations.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/hooks/useNotificationTracking.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/index.tsx (100%) rename {src => apps/web/src}/components/settings/PushNotifications/logic.ts (100%) rename {src => apps/web/src}/components/settings/PushNotifications/styles.module.css (100%) rename {src => apps/web/src}/components/settings/RequiredConfirmations/index.tsx (100%) rename {src => apps/web/src}/components/settings/SafeAppsPermissions/index.tsx (100%) rename {src => apps/web/src}/components/settings/SafeAppsSigningMethod/index.test.tsx (100%) rename {src => apps/web/src}/components/settings/SafeAppsSigningMethod/index.tsx (100%) rename {src => apps/web/src}/components/settings/SafeModules/__tests__/SafeModules.test.tsx (100%) rename {src => apps/web/src}/components/settings/SafeModules/index.tsx (100%) rename {src => apps/web/src}/components/settings/SecurityLogin/index.tsx (100%) rename {src => apps/web/src}/components/settings/SecuritySettings/index.tsx (100%) rename {src => apps/web/src}/components/settings/SettingsHeader/index.test.tsx (100%) rename {src => apps/web/src}/components/settings/SettingsHeader/index.tsx (100%) rename {src => apps/web/src}/components/settings/SpendingLimits/NoSpendingLimits.tsx (100%) rename {src => apps/web/src}/components/settings/SpendingLimits/SpendingLimitsTable.tsx (100%) rename {src => apps/web/src}/components/settings/SpendingLimits/index.tsx (100%) rename {src => apps/web/src}/components/settings/TransactionGuards/__tests__/TransactionGuards.test.tsx (100%) rename {src => apps/web/src}/components/settings/TransactionGuards/index.tsx (100%) rename {src => apps/web/src}/components/settings/TransactionGuards/styles.module.css (100%) rename {src => apps/web/src}/components/settings/owner/EditOwnerDialog/index.tsx (100%) rename {src => apps/web/src}/components/settings/owner/OwnerList/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/DebugToggle/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/IndexingStatus/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/NewTxButton/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/QrCodeButton/QrModal.tsx (100%) rename {src => apps/web/src}/components/sidebar/QrCodeButton/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/SafeListContextMenu/MultiAccountContextMenu.tsx (100%) rename {src => apps/web/src}/components/sidebar/SafeListContextMenu/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/SafeListRemoveDialog/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/Sidebar/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/Sidebar/styles.module.css (100%) rename {src => apps/web/src}/components/sidebar/SidebarFooter/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/SidebarHeader/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/SidebarHeader/styles.module.css (100%) rename {src => apps/web/src}/components/sidebar/SidebarList/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/SidebarList/styles.module.css (100%) rename {src => apps/web/src}/components/sidebar/SidebarNavigation/config.tsx (100%) rename {src => apps/web/src}/components/sidebar/SidebarNavigation/index.tsx (100%) rename {src => apps/web/src}/components/sidebar/WatchlistAddButton/index.tsx (100%) rename {src => apps/web/src}/components/theme/SafeThemeProvider.tsx (100%) rename {src => apps/web/src}/components/theme/darkPalette.ts (100%) rename {src => apps/web/src}/components/theme/lightPalette.ts (100%) rename {src => apps/web/src}/components/theme/safeTheme.ts (100%) rename {src => apps/web/src}/components/theme/typography.ts (100%) rename {src => apps/web/src}/components/transactions/BatchExecuteButton/BatchExecuteHoverProvider.tsx (100%) rename {src => apps/web/src}/components/transactions/BatchExecuteButton/index.tsx (100%) rename {src => apps/web/src}/components/transactions/BulkTxListGroup/index.tsx (100%) rename {src => apps/web/src}/components/transactions/BulkTxListGroup/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/ExecuteTxButton/index.tsx (100%) rename {src => apps/web/src}/components/transactions/GroupLabel/index.tsx (100%) rename {src => apps/web/src}/components/transactions/GroupLabel/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/GroupedTxListItems/ReplaceTxHoverProvider.tsx (100%) rename {src => apps/web/src}/components/transactions/GroupedTxListItems/index.tsx (100%) rename {src => apps/web/src}/components/transactions/GroupedTxListItems/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/HexEncodedData/HexEncodedData.test.tsx (100%) rename {src => apps/web/src}/components/transactions/HexEncodedData/__snapshots__/HexEncodedData.test.tsx.snap (100%) rename {src => apps/web/src}/components/transactions/HexEncodedData/index.tsx (100%) rename {src => apps/web/src}/components/transactions/HexEncodedData/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/ImitationTransactionWarning/index.tsx (100%) rename {src => apps/web/src}/components/transactions/ImitationTransactionWarning/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/InfoDetails/index.tsx (100%) rename {src => apps/web/src}/components/transactions/InfoDetails/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/MaliciousTxWarning/index.tsx (100%) rename {src => apps/web/src}/components/transactions/RejectTxButton/index.tsx (100%) rename {src => apps/web/src}/components/transactions/SafeCreationTx/index.tsx (100%) rename {src => apps/web/src}/components/transactions/SafeCreationTx/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/SignTxButton/index.test.tsx (100%) rename {src => apps/web/src}/components/transactions/SignTxButton/index.tsx (100%) rename {src => apps/web/src}/components/transactions/SignTxButton/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/SignedMessagesHelpLink/index.tsx (100%) rename {src => apps/web/src}/components/transactions/SingleTx/SingleTx.test.tsx (100%) rename {src => apps/web/src}/components/transactions/SingleTx/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TrustedToggle/TrustedToggleButton.tsx (100%) rename {src => apps/web/src}/components/transactions/TrustedToggle/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxConfirmations/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDateLabel/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDateLabel/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxDetails/SafeTxGasForm.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/Summary/SafeTxHashDataRow/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/Summary/TxDataRow/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/Summary/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/Summary/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/MethodCall.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/MethodDetails/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/Multisend/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/Multisend/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.test.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/ValueArray/ValueArray.test.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/ValueArray/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/ValueArray/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/index.test.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/DecodedData/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/MigrationToL2TxData/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/NestedTransaction/ExecTransaction/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/NestedTransaction/NestedTransaction.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/NestedTransaction/OnChainConfirmation/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/Rejection/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/SafeUpdate/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/SettingsChange/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/SpendingLimits/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/SpendingLimits/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/Transfer/TransferActions.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/Transfer/index.test.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/Transfer/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/TxData/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxDetails/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxFilterForm/TxFilterForm.test.tsx (100%) rename {src => apps/web/src}/components/transactions/TxFilterForm/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxFilterForm/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxHeader/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxInfo/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxInfo/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxList/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxList/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxListItem/ExpandableTransactionItem.tsx (100%) rename {src => apps/web/src}/components/transactions/TxListItem/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxListItem/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxNavigation/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxShareLink/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxSigners/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxSigners/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxStatusChip/index.stories.tsx (100%) rename {src => apps/web/src}/components/transactions/TxStatusChip/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxStatusLabel/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxSummary/QueueActions.tsx (100%) rename {src => apps/web/src}/components/transactions/TxSummary/index.test.tsx (100%) rename {src => apps/web/src}/components/transactions/TxSummary/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxSummary/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/TxType/index.tsx (100%) rename {src => apps/web/src}/components/transactions/TxType/styles.module.css (100%) rename {src => apps/web/src}/components/transactions/Warning/index.tsx (100%) rename {src => apps/web/src}/components/transactions/Warning/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/SafeTxProvider.tsx (100%) rename {src => apps/web/src}/components/tx-flow/TxInfoProvider.tsx (100%) rename {src => apps/web/src}/components/tx-flow/common/OwnerList/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/common/OwnerList/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/common/TxButton.tsx (100%) rename {src => apps/web/src}/components/tx-flow/common/TxCard/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/common/TxLayout/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/common/TxLayout/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/common/TxNonce/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/common/TxNonce/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/common/TxStatusWidget/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/common/TxStatusWidget/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/common/constants.ts (100%) rename {src => apps/web/src}/components/tx-flow/common/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/AddOwner/ChooseOwner.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/AddOwner/ReviewOwner.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/AddOwner/context.ts (100%) rename {src => apps/web/src}/components/tx-flow/flows/AddOwner/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/CancelRecovery/CancelRecoveryFlowReview.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/CancelRecovery/CancelRecoveryOverview.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/CancelRecovery/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/CancelRecovery/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/ChangeThreshold/ChooseThreshold.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ChangeThreshold/ReviewChangeThreshold.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ChangeThreshold/context.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ChangeThreshold/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ConfirmBatch/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ConfirmTx/ConfirmProposedTx.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ConfirmTx/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ExecuteBatch/DecodedTxs.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ExecuteBatch/ReviewBatch.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ExecuteBatch/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/NestedTxSuccessScreen/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/NestedTxSuccessScreen/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/NewSpendingLimit/CreateSpendingLimit.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/NewSpendingLimit/ReviewSpendingLimit.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/NewSpendingLimit/__tests__/SpendingLimitForm.test.ts (100%) rename {src => apps/web/src}/components/tx-flow/flows/NewSpendingLimit/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/NewTx/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/NewTx/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/NftTransfer/ReviewNftBatch.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/NftTransfer/SendNftBatch.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/NftTransfer/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowReview.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowSetup.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RecoverAccount/__tests__/RecoverAccountFlowSetup.test.ts (100%) rename {src => apps/web/src}/components/tx-flow/flows/RecoverAccount/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RecoveryAttempt/RecoveryAttemptReview.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RecoveryAttempt/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RejectTx/RejectTx.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RejectTx/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveGuard/ReviewRemoveGuard.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveGuard/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveModule/ReviewRemoveModule.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveModule/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveOwner/ReviewRemoveOwner.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveOwner/SetThreshold.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveOwner/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveOwner/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowOverview.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowReview.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveRecovery/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveSpendingLimit/RemoveSpendingLimit.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/RemoveSpendingLimit/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ReplaceOwner/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ReplaceTx/DeleteTxModal.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ReplaceTx/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/ReplaceTx/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/SafeAppsTx/ReviewSafeAppsTx.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SafeAppsTx/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SignMessage/SignMessage.test.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SignMessage/SignMessage.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SignMessage/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.test.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SignMessageOnChain/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SuccessScreen/StatusMessage.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SuccessScreen/StatusStepper.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SuccessScreen/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SuccessScreen/statuses/DefaultStatus.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SuccessScreen/statuses/IndexingStatus.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SuccessScreen/statuses/ProcessingStatus.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/SuccessScreen/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/CreateTokenTransfer.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/ReviewSpendingLimitTx.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/ReviewTokenTransfer.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/ReviewTokenTx.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/SendAmountBlock.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/__tests__/CreateTokenTransfer.test.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/__tests__/utils.test.ts (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/TokenTransfer/utils.ts (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpdateSafe/UpdateSafeReview.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpdateSafe/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpsertRecovery/RecovererSmartContractWarning.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowIntro.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowReview.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowSettings.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpsertRecovery/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpsertRecovery/styles.module.css (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpsertRecovery/useRecoveryPeriods.ts (100%) rename {src => apps/web/src}/components/tx-flow/flows/UpsertRecovery/utils.ts (100%) rename {src => apps/web/src}/components/tx-flow/flows/index.ts (100%) rename {src => apps/web/src}/components/tx-flow/index.tsx (100%) rename {src => apps/web/src}/components/tx-flow/useTxStepper.tsx (100%) rename {src => apps/web/src}/components/tx/AdvancedParams/AdvancedParamsForm.tsx (100%) rename {src => apps/web/src}/components/tx/AdvancedParams/GasLimitInput.tsx (100%) rename {src => apps/web/src}/components/tx/AdvancedParams/index.tsx (100%) rename {src => apps/web/src}/components/tx/AdvancedParams/types.ts (100%) rename {src => apps/web/src}/components/tx/AdvancedParams/useAdvancedParams.ts (100%) rename {src => apps/web/src}/components/tx/AdvancedParams/useUserNonce.ts (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/ApprovalEditor.test.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/ApprovalEditorForm.test.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/ApprovalEditorForm.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/ApprovalItem.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/ApprovalValueField.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/Approvals.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/EditableApprovalItem.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/SpenderField.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/hooks/useApprovalInfos.test.ts (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/hooks/useApprovalInfos.ts (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/index.tsx (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/styles.module.css (100%) rename {src => apps/web/src}/components/tx/ApprovalEditor/utils/approvals.ts (100%) rename {src => apps/web/src}/components/tx/BalanceInfo/index.tsx (100%) rename {src => apps/web/src}/components/tx/BalanceInfo/styles.module.css (100%) rename {src => apps/web/src}/components/tx/ConfirmationOrder/ConfirmationOrderHeader.tsx (100%) rename {src => apps/web/src}/components/tx/DecodedTx/HelpTooltip.tsx (100%) rename {src => apps/web/src}/components/tx/DecodedTx/index.test.tsx (100%) rename {src => apps/web/src}/components/tx/DecodedTx/index.tsx (100%) rename {src => apps/web/src}/components/tx/ErrorMessage/index.tsx (100%) rename {src => apps/web/src}/components/tx/ErrorMessage/styles.module.css (100%) rename {src => apps/web/src}/components/tx/ExecuteCheckbox/index.tsx (100%) rename {src => apps/web/src}/components/tx/ExecuteCheckbox/styles.module.css (100%) rename {src => apps/web/src}/components/tx/ExecutionMethodSelector/index.tsx (100%) rename {src => apps/web/src}/components/tx/ExecutionMethodSelector/styles.module.css (100%) rename {src => apps/web/src}/components/tx/FieldsGrid/index.tsx (100%) rename {src => apps/web/src}/components/tx/GasParams/GasParams.test.tsx (100%) rename {src => apps/web/src}/components/tx/GasParams/index.tsx (100%) rename {src => apps/web/src}/components/tx/GasParams/styles.module.css (100%) rename {src => apps/web/src}/components/tx/RemainingRelays/index.test.tsx (100%) rename {src => apps/web/src}/components/tx/RemainingRelays/index.tsx (100%) rename {src => apps/web/src}/components/tx/SendFromBlock/index.tsx (100%) rename {src => apps/web/src}/components/tx/SendFromBlock/styles.module.css (100%) rename {src => apps/web/src}/components/tx/SendToBlock/index.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/BatchButton.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/ConfirmationTitle.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/ExecuteForm.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/ExecuteThroughRoleForm.test.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/hooks.test.ts (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/hooks.ts (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/index.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/NonOwnerError.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/ProposerForm.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/RiskConfirmationError.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/SignForm.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/SignOrExecuteForm.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/SignOrExecuteSkeleton.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/SignerForm/index.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/SignerForm/styles.module.css (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/TxChecks.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/UnknownContractError.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/WalletRejectionError.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/__tests__/ExecuteForm.test.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/__tests__/SignForm.test.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/__tests__/SignOrExecute.test.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/__tests__/SignOrExecuteForm.test.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/__tests__/SignerForm.test.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/__tests__/__snapshots__/SignOrExecute.test.tsx.snap (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/__tests__/hooks.test.ts (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/hooks.ts (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/index.tsx (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/styles.module.css (100%) rename {src => apps/web/src}/components/tx/SignOrExecuteForm/tracking.ts (100%) rename {src => apps/web/src}/components/tx/SponsoredBy/index.tsx (100%) rename {src => apps/web/src}/components/tx/SponsoredBy/styles.module.css (100%) rename {src => apps/web/src}/components/tx/SuccessMessage/index.tsx (100%) rename {src => apps/web/src}/components/tx/SuccessMessage/styles.module.css (100%) rename {src => apps/web/src}/components/tx/confirmation-views/BatchTransactions/BatchTransactions.stories.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/BatchTransactions/BatchTransactions.test.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/BatchTransactions/__snapshots__/BatchTransactions.test.tsx.snap (100%) rename {src => apps/web/src}/components/tx/confirmation-views/BatchTransactions/index.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/BatchTransactions/mockData.ts (100%) rename {src => apps/web/src}/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.stories.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.test.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/ChangeThreshold/__snapshots__/ChangeThreshold.test.tsx.snap (100%) rename {src => apps/web/src}/components/tx/confirmation-views/ChangeThreshold/index.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/ConfirmationView.test.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/MigrateToL2Information/index.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/SettingsChange/SettingsChange.stories.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/SettingsChange/SettingsChange.test.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/SettingsChange/__snapshots__/SettingsChange.test.tsx.snap (100%) rename {src => apps/web/src}/components/tx/confirmation-views/SettingsChange/index.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/SettingsChange/mockData.ts (100%) rename {src => apps/web/src}/components/tx/confirmation-views/StakingTx/index.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/SwapOrder/index.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/UpdateSafe/index.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/__snapshots__/ConfirmationView.test.tsx.snap (100%) rename {src => apps/web/src}/components/tx/confirmation-views/index.tsx (100%) rename {src => apps/web/src}/components/tx/confirmation-views/types.d.ts (100%) rename {src => apps/web/src}/components/tx/confirmation-views/utils.ts (100%) rename {src => apps/web/src}/components/tx/security/SecurityWarnings.tsx (100%) rename {src => apps/web/src}/components/tx/security/blockaid/BlockaidBalanceChange.tsx (100%) rename {src => apps/web/src}/components/tx/security/blockaid/BlockaidHint.tsx (100%) rename {src => apps/web/src}/components/tx/security/blockaid/__tests__/useBlockaid.test.ts (100%) rename {src => apps/web/src}/components/tx/security/blockaid/index.tsx (100%) rename {src => apps/web/src}/components/tx/security/blockaid/styles.module.css (100%) rename {src => apps/web/src}/components/tx/security/blockaid/useBlockaid.ts (100%) rename {src => apps/web/src}/components/tx/security/shared/TxSecurityContext.tsx (100%) rename {src => apps/web/src}/components/tx/security/shared/styles.module.css (100%) rename {src => apps/web/src}/components/tx/security/tenderly/__tests__/useSimulation.test.ts (100%) rename {src => apps/web/src}/components/tx/security/tenderly/__tests__/utils.test.ts (100%) rename {src => apps/web/src}/components/tx/security/tenderly/index.tsx (100%) rename {src => apps/web/src}/components/tx/security/tenderly/styles.module.css (100%) rename {src => apps/web/src}/components/tx/security/tenderly/types.ts (100%) rename {src => apps/web/src}/components/tx/security/tenderly/useSimulation.ts (100%) rename {src => apps/web/src}/components/tx/security/tenderly/utils.ts (100%) rename {src => apps/web/src}/components/tx/security/useDelegateCallModule.ts (100%) rename {src => apps/web/src}/components/tx/security/utils.ts (100%) rename {src => apps/web/src}/components/welcome/NewSafe.tsx (100%) rename {src => apps/web/src}/components/welcome/WelcomeLogin/WalletLogin.tsx (100%) rename {src => apps/web/src}/components/welcome/WelcomeLogin/__tests__/WalletLogin.test.tsx (100%) rename {src => apps/web/src}/components/welcome/WelcomeLogin/index.tsx (100%) rename {src => apps/web/src}/components/welcome/WelcomeLogin/styles.module.css (100%) rename {src => apps/web/src}/components/welcome/styles.module.css (100%) rename {src => apps/web/src}/components/wrappers/DisclaimerWrapper/index.test.tsx (100%) rename {src => apps/web/src}/components/wrappers/DisclaimerWrapper/index.tsx (100%) rename {src => apps/web/src}/components/wrappers/FeatureWrapper/index.test.tsx (100%) rename {src => apps/web/src}/components/wrappers/FeatureWrapper/index.tsx (100%) rename {src => apps/web/src}/components/wrappers/SanctionWrapper/index.test.tsx (100%) rename {src => apps/web/src}/components/wrappers/SanctionWrapper/index.tsx (100%) rename {src => apps/web/src}/config/chains.ts (100%) rename {src => apps/web/src}/config/constants.ts (100%) rename {src => apps/web/src}/config/routes.ts (100%) rename {src => apps/web/src}/config/securityHeaders.ts (100%) rename {src => apps/web/src}/definitions.d.ts (100%) rename {src => apps/web/src}/features/bridge/components/Bridge/index.tsx (100%) rename {src => apps/web/src}/features/bridge/components/BridgeWidget/index.test.tsx (100%) rename {src => apps/web/src}/features/bridge/components/BridgeWidget/index.tsx (100%) rename {src => apps/web/src}/features/bridge/hooks/useIsBridgeFeatureEnabled.ts (100%) rename {src => apps/web/src}/features/counterfactual/ActivateAccountButton.tsx (100%) rename {src => apps/web/src}/features/counterfactual/ActivateAccountFlow.tsx (100%) rename {src => apps/web/src}/features/counterfactual/CheckBalance.tsx (100%) rename {src => apps/web/src}/features/counterfactual/CounterfactualForm.tsx (100%) rename {src => apps/web/src}/features/counterfactual/CounterfactualHooks.tsx (100%) rename {src => apps/web/src}/features/counterfactual/CounterfactualStatusButton.tsx (100%) rename {src => apps/web/src}/features/counterfactual/CounterfactualSuccessScreen.tsx (100%) rename {src => apps/web/src}/features/counterfactual/FirstTxFlow.tsx (100%) rename {src => apps/web/src}/features/counterfactual/LazyCounterfactual.tsx (100%) rename {src => apps/web/src}/features/counterfactual/PayNowPayLater.tsx (100%) rename {src => apps/web/src}/features/counterfactual/__tests__/useDeployGasLimit.test.ts (100%) rename {src => apps/web/src}/features/counterfactual/__tests__/utils.test.ts (100%) rename {src => apps/web/src}/features/counterfactual/hooks/useDeployGasLimit.ts (100%) rename {src => apps/web/src}/features/counterfactual/hooks/useIsCounterfactualSafe.ts (100%) rename {src => apps/web/src}/features/counterfactual/hooks/usePendingSafeNotifications.ts (100%) rename {src => apps/web/src}/features/counterfactual/hooks/usePendingSafeStatuses.ts (100%) rename {src => apps/web/src}/features/counterfactual/services/safeCreationEvents.ts (100%) rename {src => apps/web/src}/features/counterfactual/store/undeployedSafesSlice.ts (100%) rename {src => apps/web/src}/features/counterfactual/styles.module.css (100%) rename {src => apps/web/src}/features/counterfactual/utils.ts (100%) rename {src => apps/web/src}/features/multichain/components/CreateSafeOnNewChain/index.tsx (100%) rename {src => apps/web/src}/features/multichain/components/NetworkLogosList/index.tsx (100%) rename {src => apps/web/src}/features/multichain/components/NetworkLogosList/styles.module.css (100%) rename {src => apps/web/src}/features/multichain/components/SignerSetupWarning/ChangeSignerSetupWarning.tsx (100%) rename {src => apps/web/src}/features/multichain/components/SignerSetupWarning/InconsistentSignerSetupWarning.tsx (100%) rename {src => apps/web/src}/features/multichain/hooks/__tests__/useCompatibleNetworks.test.ts (100%) rename {src => apps/web/src}/features/multichain/hooks/__tests__/useSafeCreationData.test.ts (100%) rename {src => apps/web/src}/features/multichain/hooks/useCompatibleNetworks.ts (100%) rename {src => apps/web/src}/features/multichain/hooks/useIsMultichainSafe.ts (100%) rename {src => apps/web/src}/features/multichain/hooks/useSafeCreationData.ts (100%) rename {src => apps/web/src}/features/multichain/utils/extract-migration-data.ts (100%) rename {src => apps/web/src}/features/multichain/utils/utils.test.ts (100%) rename {src => apps/web/src}/features/multichain/utils/utils.ts (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountInfoChips/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountInfoChips/styles.module.css (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountItems/MultiAccountItem.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountItems/SingleAccountItem.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountItems/styles.module.css (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountListFilters/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountsHeader/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountsList/index.test.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/AccountsList/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/AddNetworkButton/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/AllSafes/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/CreateButton/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/DataWidget/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/DataWidget/styles.module.css (100%) rename {src => apps/web/src}/features/myAccounts/components/FilteredSafes/index.test.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/FilteredSafes/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/OrderByButton/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/PinnedSafes/index.test.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/PinnedSafes/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/QueueActions/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/components/QueueActions/styles.module.css (100%) rename {src => apps/web/src}/features/myAccounts/components/SafesList/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/hooks/__tests__/useAllSafes.test.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/__tests__/useAllSafesGrouped.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/useAllOwnedSafes.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/useAllSafes.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/useAllSafesGrouped.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/useGetHref.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/useHasSafes.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/useSafesSearch.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/useTrackedSafesCount.ts (100%) rename {src => apps/web/src}/features/myAccounts/hooks/useVisitedSafes.ts (100%) rename {src => apps/web/src}/features/myAccounts/index.tsx (100%) rename {src => apps/web/src}/features/myAccounts/styles.module.css (100%) rename {src => apps/web/src}/features/myAccounts/utils/utils.ts (100%) rename {src => apps/web/src}/features/proposers/components/DeleteProposerDialog.tsx (100%) rename {src => apps/web/src}/features/proposers/components/EditProposerDialog.tsx (100%) rename {src => apps/web/src}/features/proposers/components/TxProposalChip.tsx (100%) rename {src => apps/web/src}/features/proposers/components/UpsertProposer.tsx (100%) rename {src => apps/web/src}/features/proposers/utils/utils.ts (100%) rename {src => apps/web/src}/features/recovery/components/CancelRecoveryButton/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/ExecuteRecoveryButton/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/GroupedRecoveryListItems/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/GroupedRecoveryListItems/styles.module.css (100%) rename {src => apps/web/src}/features/recovery/components/Recovery/LazyRecovery.tsx (100%) rename {src => apps/web/src}/features/recovery/components/Recovery/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryCards/RecoveryInProgressCard.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryCards/RecoveryProposalCard.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryCards/__tests__/RecoveryInProgressCard.test.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryCards/__tests__/RecoveryProposalCard.test.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryCards/styles.module.css (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/RecoveryContextHooks.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/__tests__/useRecoveryDelayModifiers.test.ts (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/__tests__/useRecoveryPendingTxs.test.ts (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/__tests__/useRecoveryState.test.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/__tests__/useRecoverySuccessEvents.test.ts (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/useRecoveryDelayModifiers.ts (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/useRecoveryPendingTxs.ts (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/useRecoveryState.ts (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryContext/useRecoverySuccessEvents.ts (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryDescription/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryDetails/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryHeader/index.test.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryHeader/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryInfo/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryList/LazyRecoveryList.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryList/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryListItem/RecoveryListItemContext.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryListItem/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryModal/__snapshots__/index.test.tsx.snap (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryModal/index.test.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryModal/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoverySettings/ChooseRecoveryMethodModal.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoverySettings/DelayModifierRow.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoverySettings/ZkEmailFakeDoorModal.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoverySettings/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoverySettings/styles.module.css (100%) rename {src => apps/web/src}/features/recovery/components/RecoverySigners/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryStatus/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoverySummary/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryType/index.tsx (100%) rename {src => apps/web/src}/features/recovery/components/RecoveryValidationErrors/index.tsx (100%) rename {src => apps/web/src}/features/recovery/hooks/__tests__/useIsValidExecution.test.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/__tests__/useIsValidRecoveryExecution.test.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/__tests__/useRecoveryTxState.test.tsx (100%) rename {src => apps/web/src}/features/recovery/hooks/useIsRecoverer.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/useIsRecoveryEnabled.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/useIsRecoverySupported.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/useIsValidRecoveryExecution.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/useRecovery.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/useRecoveryQueue.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/useRecoveryTxNotification.ts (100%) rename {src => apps/web/src}/features/recovery/hooks/useRecoveryTxState.ts (100%) rename {src => apps/web/src}/features/recovery/services/__tests__/delay-modifier.test.ts (100%) rename {src => apps/web/src}/features/recovery/services/__tests__/proxies.test.ts (100%) rename {src => apps/web/src}/features/recovery/services/__tests__/recovery-state.test.ts (100%) rename {src => apps/web/src}/features/recovery/services/__tests__/selectors.test.ts (100%) rename {src => apps/web/src}/features/recovery/services/__tests__/setup.test.ts (100%) rename {src => apps/web/src}/features/recovery/services/__tests__/transaction-list.test.ts (100%) rename {src => apps/web/src}/features/recovery/services/__tests__/transaction.test.ts (100%) rename {src => apps/web/src}/features/recovery/services/delay-modifier.ts (100%) rename {src => apps/web/src}/features/recovery/services/proxies.ts (100%) rename {src => apps/web/src}/features/recovery/services/recovery-sender.ts (100%) rename {src => apps/web/src}/features/recovery/services/recovery-state.ts (100%) rename {src => apps/web/src}/features/recovery/services/recoveryEvents.ts (100%) rename {src => apps/web/src}/features/recovery/services/selectors.ts (100%) rename {src => apps/web/src}/features/recovery/services/setup.ts (100%) rename {src => apps/web/src}/features/recovery/services/transaction-list.ts (100%) rename {src => apps/web/src}/features/recovery/services/transaction.ts (100%) rename {src => apps/web/src}/features/siweAccounts/components/EnableAccountBanner/index.stories.tsx (100%) rename {src => apps/web/src}/features/siweAccounts/components/EnableAccountBanner/index.tsx (100%) rename {src => apps/web/src}/features/siweAccounts/components/EnableAccountBanner/style.module.css (100%) rename {src => apps/web/src}/features/speedup/components/SpeedUpModal.tsx (100%) rename {src => apps/web/src}/features/speedup/components/SpeedUpMonitor.tsx (100%) rename {src => apps/web/src}/features/speedup/hooks/useSafeTransaction.tsx (100%) rename {src => apps/web/src}/features/speedup/utils/IsSpeedableTx.tsx (100%) rename {src => apps/web/src}/features/speedup/utils/__tests__/IsSpeedableTx.test.ts (100%) rename {src => apps/web/src}/features/stake/components/InfoTooltip/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakeButton/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakePage/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingConfirmationTx/Deposit.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingConfirmationTx/Exit.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingConfirmationTx/Withdraw.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingConfirmationTx/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingStatus/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingTxDepositDetails/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingTxDepositInfo/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingTxExitDetails/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingTxExitInfo/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingTxWithdrawDetails/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingTxWithdrawInfo/index.tsx (100%) rename {src => apps/web/src}/features/stake/components/StakingWidget/index.tsx (100%) rename {src => apps/web/src}/features/stake/constants.ts (100%) rename {src => apps/web/src}/features/stake/helpers/utils.ts (100%) rename {src => apps/web/src}/features/stake/hooks/useGetStakeWidgetUrl.ts (100%) rename {src => apps/web/src}/features/stake/hooks/useIsStakingBannerEnabled.ts (100%) rename {src => apps/web/src}/features/stake/hooks/useIsSwapFeatureEnabled.ts (100%) rename {src => apps/web/src}/features/stake/useStakeConsent.ts (100%) rename {src => apps/web/src}/features/swap/components/HelpIconTooltip/index.tsx (100%) rename {src => apps/web/src}/features/swap/components/OrderId/index.stories.tsx (100%) rename {src => apps/web/src}/features/swap/components/OrderId/index.tsx (100%) rename {src => apps/web/src}/features/swap/components/StatusLabel/index.stories.tsx (100%) rename {src => apps/web/src}/features/swap/components/StatusLabel/index.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapButton/index.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrder/index.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrder/rows/PartBuyAmount.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrder/rows/PartDuration.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrder/rows/PartSellAmount.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrder/rows/SurplusFee.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrder/styles.module.css (100%) rename {src => apps/web/src}/features/swap/components/SwapOrder/swap.stories.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrder/twap.stories.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrderConfirmationView/OrderFeeConfirmationView.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrderConfirmationView/index.stories.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrderConfirmationView/index.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapOrderConfirmationView/styles.module.css (100%) rename {src => apps/web/src}/features/swap/components/SwapProgress/index.stories.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapProgress/index.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapTokens/index.stories.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapTokens/index.tsx (100%) rename {src => apps/web/src}/features/swap/components/SwapTxInfo/SwapTx.tsx (100%) rename {src => apps/web/src}/features/swap/components/TwapFallbackHandlerWarning/index.tsx (100%) rename {src => apps/web/src}/features/swap/constants.ts (100%) rename {src => apps/web/src}/features/swap/helpers/__tests__/fee.test.ts (100%) rename {src => apps/web/src}/features/swap/helpers/__tests__/utils.test.ts (100%) rename {src => apps/web/src}/features/swap/helpers/data/stablecoins.ts (100%) rename {src => apps/web/src}/features/swap/helpers/fee.ts (100%) rename {src => apps/web/src}/features/swap/helpers/swapOrderBuilder.ts (100%) rename {src => apps/web/src}/features/swap/helpers/utils.ts (100%) rename {src => apps/web/src}/features/swap/hooks/__tests__/useIsExpiredSwap.test.ts (100%) rename {src => apps/web/src}/features/swap/hooks/useIsExpiredSwap.ts (100%) rename {src => apps/web/src}/features/swap/hooks/useIsSwapFeatureEnabled.ts (100%) rename {src => apps/web/src}/features/swap/index.tsx (100%) rename {src => apps/web/src}/features/swap/store/swapParamsSlice.ts (100%) rename {src => apps/web/src}/features/swap/styles.module.css (100%) rename {src => apps/web/src}/features/swap/types.ts (100%) rename {src => apps/web/src}/features/swap/useSwapConsent.ts (100%) rename {src => apps/web/src}/features/targetedOutreach/components/OutreachPopup/OutreachPopup.tsx (100%) rename {src => apps/web/src}/features/targetedOutreach/components/OutreachPopup/index.tsx (100%) rename {src => apps/web/src}/features/targetedOutreach/components/OutreachPopup/styles.module.css (100%) rename {src => apps/web/src}/features/targetedOutreach/constants.ts (100%) rename {src => apps/web/src}/features/targetedOutreach/hooks/__tests__/useShowOutreachPopup.test.ts (100%) rename {src => apps/web/src}/features/targetedOutreach/hooks/useShowOutreachPopup.tsx (100%) rename {src => apps/web/src}/features/walletconnect/WalletConnectContext.tsx (100%) rename {src => apps/web/src}/features/walletconnect/__tests__/WalletConnectContext.test.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WalletConnectProvider/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WalletConnectUi/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcConnectionForm/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcConnectionForm/styles.module.css (100%) rename {src => apps/web/src}/features/walletconnect/components/WcConnectionState/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcConnectionState/styles.module.css (100%) rename {src => apps/web/src}/features/walletconnect/components/WcErrorMessage/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcErrorMessage/styles.module.css (100%) rename {src => apps/web/src}/features/walletconnect/components/WcHeaderWidget/WcIcon.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcHeaderWidget/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcHints/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcHints/styles.module.css (100%) rename {src => apps/web/src}/features/walletconnect/components/WcInput/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcLogoHeader/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcLogoHeader/styles.module.css (100%) rename {src => apps/web/src}/features/walletconnect/components/WcProposalForm/CompatibilityWarning.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcProposalForm/ProposalVerification.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcProposalForm/__tests__/useCompatibilityWarning.test.ts (100%) rename {src => apps/web/src}/features/walletconnect/components/WcProposalForm/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcProposalForm/styles.module.css (100%) rename {src => apps/web/src}/features/walletconnect/components/WcProposalForm/useCompatibilityWarning.ts (100%) rename {src => apps/web/src}/features/walletconnect/components/WcSessionList/WcNoSessions.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcSessionList/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/WcSessionList/styles.module.css (100%) rename {src => apps/web/src}/features/walletconnect/components/WcSessionManager/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/components/index.tsx (100%) rename {src => apps/web/src}/features/walletconnect/constants.ts (100%) rename {src => apps/web/src}/features/walletconnect/hooks/__tests__/useWalletConnectSearchParamUri.test.ts (100%) rename {src => apps/web/src}/features/walletconnect/hooks/__tests__/useWalletConnectSessions.test.tsx (100%) rename {src => apps/web/src}/features/walletconnect/hooks/useWalletConnectClipboardUri.ts (100%) rename {src => apps/web/src}/features/walletconnect/hooks/useWalletConnectSearchParamUri.ts (100%) rename {src => apps/web/src}/features/walletconnect/hooks/useWalletConnectSessions.ts (100%) rename {src => apps/web/src}/features/walletconnect/hooks/useWcUri.ts (100%) rename {src => apps/web/src}/features/walletconnect/services/WalletConnectWallet.ts (100%) rename {src => apps/web/src}/features/walletconnect/services/__tests__/WalletConnectWallet.test.ts (100%) rename {src => apps/web/src}/features/walletconnect/services/__tests__/utils.test.ts (100%) rename {src => apps/web/src}/features/walletconnect/services/tracking.ts (100%) rename {src => apps/web/src}/features/walletconnect/services/utils.ts (100%) rename {src => apps/web/src}/hooks/Beamer/useBeamer.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useAddressResolver.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useAdjustUrl.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useAsync.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useBalances.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useBatchedTxs.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useChainId.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useClock.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useDebounce.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useDecodeTx.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useGasLimit.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useGasPrice.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useIntervalCounter.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useLoadBalances.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useLoadChains.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useLoadSpendingLimits.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useNestedSafeOwners.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/usePendingActions.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/usePendingTxs.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/usePreviousNonces.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useRankedSafeApps.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useRemainingRelays.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useRemoteSafeApps.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useSafeAddress.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useSafeNotifications.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useSafeTokenAllocation.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useSanctionedAddress.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useTxPendingStatus.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useTxQueue.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useTxTracking.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useVisibleBalances.test.ts (100%) rename {src => apps/web/src}/hooks/__tests__/useWalletCanPay.test.ts (100%) rename {src => apps/web/src}/hooks/coreSDK/__tests__/safeCoreSDK.test.ts (100%) rename {src => apps/web/src}/hooks/coreSDK/__tests__/useInitSafeCoreSDK.test.ts (100%) rename {src => apps/web/src}/hooks/coreSDK/safeCoreSDK.ts (100%) rename {src => apps/web/src}/hooks/coreSDK/useInitSafeCoreSDK.ts (100%) rename {src => apps/web/src}/hooks/loadables/helpers/__tests__/config.test.ts (100%) rename {src => apps/web/src}/hooks/loadables/helpers/config.ts (100%) rename {src => apps/web/src}/hooks/loadables/useLoadBalances.ts (100%) rename {src => apps/web/src}/hooks/loadables/useLoadChains.ts (100%) rename {src => apps/web/src}/hooks/loadables/useLoadSafeInfo.ts (100%) rename {src => apps/web/src}/hooks/loadables/useLoadSafeMessages.ts (100%) rename {src => apps/web/src}/hooks/loadables/useLoadSpendingLimits.ts (100%) rename {src => apps/web/src}/hooks/loadables/useLoadTxHistory.ts (100%) rename {src => apps/web/src}/hooks/loadables/useLoadTxQueue.ts (100%) rename {src => apps/web/src}/hooks/messages/__tests__/useIsSafeMessagePending.test.ts (100%) rename {src => apps/web/src}/hooks/messages/__tests__/useIsSafeMessageSignableBy.test.ts (100%) rename {src => apps/web/src}/hooks/messages/__tests__/useSafeMessageNotifications.test.ts (100%) rename {src => apps/web/src}/hooks/messages/__tests__/useSafeMessagePendingStatuses.test.ts (100%) rename {src => apps/web/src}/hooks/messages/__tests__/useSafeMessageStatus.test.ts (100%) rename {src => apps/web/src}/hooks/messages/useDecodedSafeMessage.ts (100%) rename {src => apps/web/src}/hooks/messages/useIsSafeMessagePending.ts (100%) rename {src => apps/web/src}/hooks/messages/useIsSafeMessageSignableBy.ts (100%) rename {src => apps/web/src}/hooks/messages/useSafeMessage.ts (100%) rename {src => apps/web/src}/hooks/messages/useSafeMessageNotifications.ts (100%) rename {src => apps/web/src}/hooks/messages/useSafeMessagePendingStatuses.ts (100%) rename {src => apps/web/src}/hooks/messages/useSafeMessageStatus.ts (100%) rename {src => apps/web/src}/hooks/messages/useSafeMessages.ts (100%) rename {src => apps/web/src}/hooks/messages/useSafeMsgTracking.ts (100%) rename {src => apps/web/src}/hooks/messages/useSyncSafeMessageSigner.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/__tests__/useCategoryFilter.test.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/permissions/index.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/permissions/useBrowserPermissions.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/permissions/useSafePermissions.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useAppsFilterByCategory.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useAppsFilterByOptimizedForBatch.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useAppsSearch.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useCategoryFilter.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useCustomAppCommunicator.tsx (100%) rename {src => apps/web/src}/hooks/safe-apps/useCustomSafeApps.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useOpenedSafeApps.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/usePinnedSafeApps.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useRankedSafeApps.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useRemoteSafeApps.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useRemoveAppModal.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useSafeAppFromBackend.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useSafeAppFromManifest.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useSafeAppPreviewDrawer.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useSafeAppUrl.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useSafeApps.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useSafeAppsFilters.ts (100%) rename {src => apps/web/src}/hooks/safe-apps/useTxBuilderApp.ts (100%) rename {src => apps/web/src}/hooks/useAddressBook.ts (100%) rename {src => apps/web/src}/hooks/useAddressResolver.ts (100%) rename {src => apps/web/src}/hooks/useAdjustUrl.ts (100%) rename {src => apps/web/src}/hooks/useAllAddressBooks.ts (100%) rename {src => apps/web/src}/hooks/useAsync.ts (100%) rename {src => apps/web/src}/hooks/useBalances.ts (100%) rename {src => apps/web/src}/hooks/useBatchedTxs.ts (100%) rename {src => apps/web/src}/hooks/useChainId.ts (100%) rename {src => apps/web/src}/hooks/useChains.ts (100%) rename {src => apps/web/src}/hooks/useChangedValue.ts (100%) rename {src => apps/web/src}/hooks/useClock.ts (100%) rename {src => apps/web/src}/hooks/useCollectibles.ts (100%) rename {src => apps/web/src}/hooks/useDarkMode.ts (100%) rename {src => apps/web/src}/hooks/useDebounce.ts (100%) rename {src => apps/web/src}/hooks/useDecodeTx.ts (100%) rename {src => apps/web/src}/hooks/useDraftBatch.ts (100%) rename {src => apps/web/src}/hooks/useGasLimit.ts (100%) rename {src => apps/web/src}/hooks/useGasPrice.ts (100%) rename {src => apps/web/src}/hooks/useHiddenTokens.ts (100%) rename {src => apps/web/src}/hooks/useHighlightHiddenTab.ts (100%) rename {src => apps/web/src}/hooks/useInitSession.ts (100%) rename {src => apps/web/src}/hooks/useIntervalCounter.ts (100%) rename {src => apps/web/src}/hooks/useIsGeoblockedFeatureEnabled.ts (100%) rename {src => apps/web/src}/hooks/useIsMac.ts (100%) rename {src => apps/web/src}/hooks/useIsNestedSafeOwner.ts (100%) rename {src => apps/web/src}/hooks/useIsOfficialHost.ts (100%) rename {src => apps/web/src}/hooks/useIsOnlySpendingLimitBeneficiary.tsx (100%) rename {src => apps/web/src}/hooks/useIsPending.ts (100%) rename {src => apps/web/src}/hooks/useIsSafeOwner.ts (100%) rename {src => apps/web/src}/hooks/useIsSidebarRoute.ts (100%) rename {src => apps/web/src}/hooks/useIsValidExecution.ts (100%) rename {src => apps/web/src}/hooks/useIsWrongChain.ts (100%) rename {src => apps/web/src}/hooks/useLastSafe.ts (100%) rename {src => apps/web/src}/hooks/useLoadableStores.ts (100%) rename {src => apps/web/src}/hooks/useMasterCopies.ts (100%) rename {src => apps/web/src}/hooks/useMnemonicName/dict.ts (100%) rename {src => apps/web/src}/hooks/useMnemonicName/index.ts (100%) rename {src => apps/web/src}/hooks/useMnemonicName/useMnemonicName.test.ts (100%) rename {src => apps/web/src}/hooks/useNestedSafeOwners.tsx (100%) rename {src => apps/web/src}/hooks/useOnceVisible.ts (100%) rename {src => apps/web/src}/hooks/useOrigin.ts (100%) rename {src => apps/web/src}/hooks/useOwnedSafes.ts (100%) rename {src => apps/web/src}/hooks/usePendingActions.ts (100%) rename {src => apps/web/src}/hooks/usePendingTxs.ts (100%) rename {src => apps/web/src}/hooks/usePreviousNonces.ts (100%) rename {src => apps/web/src}/hooks/useProposers.ts (100%) rename {src => apps/web/src}/hooks/useRemainingRelays.ts (100%) rename {src => apps/web/src}/hooks/useSafeAddress.ts (100%) rename {src => apps/web/src}/hooks/useSafeInfo.ts (100%) rename {src => apps/web/src}/hooks/useSafeNotifications.ts (100%) rename {src => apps/web/src}/hooks/useSafeTokenAllocation.ts (100%) rename {src => apps/web/src}/hooks/useSafeTokenEnabled.ts (100%) rename {src => apps/web/src}/hooks/useSanctionedAddress.ts (100%) rename {src => apps/web/src}/hooks/useSpendingLimit.ts (100%) rename {src => apps/web/src}/hooks/useSpendingLimitGas.ts (100%) rename {src => apps/web/src}/hooks/useTransactionStatus.ts (100%) rename {src => apps/web/src}/hooks/useTransactionType.tsx (100%) rename {src => apps/web/src}/hooks/useTxDetails.ts (100%) rename {src => apps/web/src}/hooks/useTxHistory.ts (100%) rename {src => apps/web/src}/hooks/useTxNotifications.ts (100%) rename {src => apps/web/src}/hooks/useTxPendingStatuses.ts (100%) rename {src => apps/web/src}/hooks/useTxQueue.ts (100%) rename {src => apps/web/src}/hooks/useTxTracking.ts (100%) rename {src => apps/web/src}/hooks/useVisibleBalances.ts (100%) rename {src => apps/web/src}/hooks/useWalletCanPay.ts (100%) rename {src => apps/web/src}/hooks/useWalletCanRelay.ts (100%) rename {src => apps/web/src}/hooks/wallets/__tests__/useOnboard.test.ts (100%) rename {src => apps/web/src}/hooks/wallets/consts.ts (100%) rename {src => apps/web/src}/hooks/wallets/useInitWeb3.ts (100%) rename {src => apps/web/src}/hooks/wallets/useOnboard.ts (100%) rename {src => apps/web/src}/hooks/wallets/useSelectAvailableSigner.ts (100%) rename {src => apps/web/src}/hooks/wallets/useWallet.ts (100%) rename {src => apps/web/src}/hooks/wallets/useWalletBalance.ts (100%) rename {src => apps/web/src}/hooks/wallets/wallets.ts (100%) rename {src => apps/web/src}/hooks/wallets/web3.ts (100%) rename {src => apps/web/src}/markdown/privacy/privacy.md (100%) rename {src => apps/web/src}/markdown/terms/terms.md (100%) rename {src => apps/web/src}/markdown/terms/version.ts (100%) rename {src => apps/web/src}/pages/403.tsx (100%) rename {src => apps/web/src}/pages/404.tsx (100%) rename {src => apps/web/src}/pages/_app.tsx (100%) rename {src => apps/web/src}/pages/_document.tsx (100%) rename {src => apps/web/src}/pages/_offline.tsx (100%) rename {src => apps/web/src}/pages/addOwner.tsx (100%) rename {src => apps/web/src}/pages/address-book.tsx (100%) rename {src => apps/web/src}/pages/apps/bookmarked.tsx (100%) rename {src => apps/web/src}/pages/apps/custom.tsx (100%) rename {src => apps/web/src}/pages/apps/index.tsx (100%) rename {src => apps/web/src}/pages/apps/open.tsx (100%) rename {src => apps/web/src}/pages/balances/index.tsx (100%) rename {src => apps/web/src}/pages/balances/nfts.tsx (100%) rename {src => apps/web/src}/pages/bridge.tsx (100%) rename {src => apps/web/src}/pages/cookie.tsx (100%) rename {src => apps/web/src}/pages/home.tsx (100%) rename {src => apps/web/src}/pages/imprint.tsx (100%) rename {src => apps/web/src}/pages/index.tsx (100%) rename {src => apps/web/src}/pages/licenses.tsx (100%) rename {src => apps/web/src}/pages/new-safe/advanced-create.tsx (100%) rename {src => apps/web/src}/pages/new-safe/create.tsx (100%) rename {src => apps/web/src}/pages/new-safe/load.tsx (100%) rename {src => apps/web/src}/pages/privacy.tsx (100%) rename {src => apps/web/src}/pages/settings/appearance.tsx (100%) rename {src => apps/web/src}/pages/settings/cookies.tsx (100%) rename {src => apps/web/src}/pages/settings/data.tsx (100%) rename {src => apps/web/src}/pages/settings/environment-variables.tsx (100%) rename {src => apps/web/src}/pages/settings/index.tsx (100%) rename {src => apps/web/src}/pages/settings/modules.tsx (100%) rename {src => apps/web/src}/pages/settings/notifications.tsx (100%) rename {src => apps/web/src}/pages/settings/safe-apps/index.tsx (100%) rename {src => apps/web/src}/pages/settings/security.tsx (100%) rename {src => apps/web/src}/pages/settings/setup.tsx (100%) rename {src => apps/web/src}/pages/share/safe-app.tsx (100%) rename {src => apps/web/src}/pages/stake.tsx (100%) rename {src => apps/web/src}/pages/swap.tsx (100%) rename {src => apps/web/src}/pages/terms.tsx (100%) rename {src => apps/web/src}/pages/transactions/history.tsx (100%) rename {src => apps/web/src}/pages/transactions/index.tsx (100%) rename {src => apps/web/src}/pages/transactions/messages.tsx (100%) rename {src => apps/web/src}/pages/transactions/msg.tsx (100%) rename {src => apps/web/src}/pages/transactions/queue.tsx (100%) rename {src => apps/web/src}/pages/transactions/tx.tsx (100%) rename {src => apps/web/src}/pages/wc.tsx (100%) rename {src => apps/web/src}/pages/welcome/accounts.tsx (100%) rename {src => apps/web/src}/pages/welcome/index.tsx (100%) rename {src => apps/web/src}/service-workers/firebase-messaging/__tests__/notifications.test.ts (100%) rename {src => apps/web/src}/service-workers/firebase-messaging/firebase-messaging-sw.ts (100%) rename {src => apps/web/src}/service-workers/firebase-messaging/notification-mapper.ts (100%) rename {src => apps/web/src}/service-workers/firebase-messaging/notifications.ts (100%) rename {src => apps/web/src}/service-workers/firebase-messaging/webhook-types.ts (100%) rename {src => apps/web/src}/service-workers/index.ts (100%) rename {src => apps/web/src}/services/EventBus.ts (100%) rename {src => apps/web/src}/services/ExternalStore.ts (100%) rename {src => apps/web/src}/services/analytics/TagManager.ts (100%) rename {src => apps/web/src}/services/analytics/__tests__/TagManager.test.ts (100%) rename {src => apps/web/src}/services/analytics/__tests__/gtm.test.ts (100%) rename {src => apps/web/src}/services/analytics/__tests__/tx-tracking.test.ts (100%) rename {src => apps/web/src}/services/analytics/events/addressBook.ts (100%) rename {src => apps/web/src}/services/analytics/events/assets.ts (100%) rename {src => apps/web/src}/services/analytics/events/batching.ts (100%) rename {src => apps/web/src}/services/analytics/events/bridge.ts (100%) rename {src => apps/web/src}/services/analytics/events/counterfactual.ts (100%) rename {src => apps/web/src}/services/analytics/events/createLoadSafe.ts (100%) rename {src => apps/web/src}/services/analytics/events/index.ts (100%) rename {src => apps/web/src}/services/analytics/events/modals.ts (100%) rename {src => apps/web/src}/services/analytics/events/nfts.ts (100%) rename {src => apps/web/src}/services/analytics/events/outreach.ts (100%) rename {src => apps/web/src}/services/analytics/events/overview.ts (100%) rename {src => apps/web/src}/services/analytics/events/push-notifications.ts (100%) rename {src => apps/web/src}/services/analytics/events/recovery.ts (100%) rename {src => apps/web/src}/services/analytics/events/reject-tx.ts (100%) rename {src => apps/web/src}/services/analytics/events/safeApps.ts (100%) rename {src => apps/web/src}/services/analytics/events/settings.ts (100%) rename {src => apps/web/src}/services/analytics/events/stake.ts (100%) rename {src => apps/web/src}/services/analytics/events/swaps.ts (100%) rename {src => apps/web/src}/services/analytics/events/transactions.ts (100%) rename {src => apps/web/src}/services/analytics/events/txList.ts (100%) rename {src => apps/web/src}/services/analytics/events/wallet.ts (100%) rename {src => apps/web/src}/services/analytics/events/walletconnect.ts (100%) rename {src => apps/web/src}/services/analytics/gtm.ts (100%) rename {src => apps/web/src}/services/analytics/index.ts (100%) rename {src => apps/web/src}/services/analytics/spindl.ts (100%) rename {src => apps/web/src}/services/analytics/tx-tracking.ts (100%) rename {src => apps/web/src}/services/analytics/types.ts (100%) rename {src => apps/web/src}/services/analytics/useGtm.ts (100%) rename {src => apps/web/src}/services/analytics/useMetaEvents.ts (100%) rename {src => apps/web/src}/services/beamer/index.ts (100%) rename {src => apps/web/src}/services/beamer/types.ts (100%) rename {src => apps/web/src}/services/contracts/ContractErrorCodes.ts (100%) rename {src => apps/web/src}/services/contracts/__tests__/deployments.test.ts (100%) rename {src => apps/web/src}/services/contracts/__tests__/safeContracts.test.ts (100%) rename {src => apps/web/src}/services/contracts/deployments.ts (100%) rename {src => apps/web/src}/services/contracts/safeContracts.ts (100%) rename {src => apps/web/src}/services/contracts/spendingLimitContracts.ts (100%) rename {src => apps/web/src}/services/ens/index.test.ts (100%) rename {src => apps/web/src}/services/ens/index.ts (100%) rename {src => apps/web/src}/services/exceptions/ErrorCodes.ts (100%) rename {src => apps/web/src}/services/exceptions/__tests__/index.test.ts (100%) rename {src => apps/web/src}/services/exceptions/__tests__/utils.test.ts (100%) rename {src => apps/web/src}/services/exceptions/index.ts (100%) rename {src => apps/web/src}/services/exceptions/utils.ts (100%) rename {src => apps/web/src}/services/local-storage/Storage.ts (100%) rename {src => apps/web/src}/services/local-storage/__tests__/local.test.ts (100%) rename {src => apps/web/src}/services/local-storage/__tests__/useLocalStorage.test.ts (100%) rename {src => apps/web/src}/services/local-storage/local.ts (100%) rename {src => apps/web/src}/services/local-storage/session.ts (100%) rename {src => apps/web/src}/services/local-storage/storageHelpers.ts (100%) rename {src => apps/web/src}/services/local-storage/useLocalStorage.ts (100%) rename {src => apps/web/src}/services/ls-migration/addedSafes.ts (100%) rename {src => apps/web/src}/services/ls-migration/addressBook.ts (100%) rename {src => apps/web/src}/services/ls-migration/common.ts (100%) rename {src => apps/web/src}/services/ls-migration/tests.test.ts (100%) rename {src => apps/web/src}/services/onboard.ts (100%) rename {src => apps/web/src}/services/onboard/ledger-module.ts (100%) rename {src => apps/web/src}/services/private-key-module/PkModulePopup.tsx (100%) rename {src => apps/web/src}/services/private-key-module/icon.ts (100%) rename {src => apps/web/src}/services/private-key-module/index.ts (100%) rename {src => apps/web/src}/services/private-key-module/pk-popup-store.ts (100%) rename {src => apps/web/src}/services/push-notifications/firebase.ts (100%) rename {src => apps/web/src}/services/push-notifications/preferences.ts (100%) rename {src => apps/web/src}/services/push-notifications/tracking.ts (100%) rename {src => apps/web/src}/services/safe-apps/AppCommunicator.ts (100%) rename {src => apps/web/src}/services/safe-apps/manifest.ts (100%) rename {src => apps/web/src}/services/safe-apps/track-app-usage-count.ts (100%) rename {src => apps/web/src}/services/safe-messages/__tests__/safeMsgSender.test.ts (100%) rename {src => apps/web/src}/services/safe-messages/safeMsgEvents.ts (100%) rename {src => apps/web/src}/services/safe-messages/safeMsgNotifications.ts (100%) rename {src => apps/web/src}/services/safe-messages/safeMsgSender.ts (100%) rename {src => apps/web/src}/services/safe-wallet-provider/index.test.ts (100%) rename {src => apps/web/src}/services/safe-wallet-provider/index.ts (100%) rename {src => apps/web/src}/services/safe-wallet-provider/notifications.test.ts (100%) rename {src => apps/web/src}/services/safe-wallet-provider/notifications.ts (100%) rename {src => apps/web/src}/services/safe-wallet-provider/useSafeWalletProvider.test.tsx (100%) rename {src => apps/web/src}/services/safe-wallet-provider/useSafeWalletProvider.tsx (100%) rename {src => apps/web/src}/services/security/modules/ApprovalModule/index.ts (100%) rename {src => apps/web/src}/services/security/modules/BlockaidModule/index.ts (100%) rename {src => apps/web/src}/services/security/modules/BlockaidModule/types.ts (100%) rename {src => apps/web/src}/services/security/modules/DelegateCallModule/index.test.ts (100%) rename {src => apps/web/src}/services/security/modules/DelegateCallModule/index.ts (100%) rename {src => apps/web/src}/services/security/modules/types.ts (100%) rename {src => apps/web/src}/services/sentry.ts (100%) rename {src => apps/web/src}/services/siwe/index.ts (100%) rename {src => apps/web/src}/services/tracking/abTesting.ts (100%) rename {src => apps/web/src}/services/tracking/useAbTesting.ts (100%) rename {src => apps/web/src}/services/transactions/index.tests.ts (100%) rename {src => apps/web/src}/services/transactions/index.ts (100%) rename {src => apps/web/src}/services/tx/__tests__/encodeSignatures.test.ts (100%) rename {src => apps/web/src}/services/tx/__tests__/extractTxInfo.test.ts (100%) rename {src => apps/web/src}/services/tx/__tests__/relaying.test.ts (100%) rename {src => apps/web/src}/services/tx/__tests__/safeUpdateParams.test.ts (100%) rename {src => apps/web/src}/services/tx/__tests__/spendingLimitParams.test.ts (100%) rename {src => apps/web/src}/services/tx/__tests__/tokenTransferParams.test.ts (100%) rename {src => apps/web/src}/services/tx/__tests__/txEvents.test.ts (100%) rename {src => apps/web/src}/services/tx/__tests__/txMonitor.test.ts (100%) rename {src => apps/web/src}/services/tx/encodeSignatures.ts (100%) rename {src => apps/web/src}/services/tx/extractTxInfo.ts (100%) rename {src => apps/web/src}/services/tx/proposeTransaction.ts (100%) rename {src => apps/web/src}/services/tx/relaying.ts (100%) rename {src => apps/web/src}/services/tx/safeUpdateParams.ts (100%) rename {src => apps/web/src}/services/tx/spendingLimitParams.ts (100%) rename {src => apps/web/src}/services/tx/tokenTransferParams.ts (100%) rename {src => apps/web/src}/services/tx/tx-sender/__tests__/sdk.test.ts (100%) rename {src => apps/web/src}/services/tx/tx-sender/__tests__/ts-sender.test.ts (100%) rename {src => apps/web/src}/services/tx/tx-sender/create.ts (100%) rename {src => apps/web/src}/services/tx/tx-sender/dispatch.ts (100%) rename {src => apps/web/src}/services/tx/tx-sender/index.ts (100%) rename {src => apps/web/src}/services/tx/tx-sender/recommendedNonce.ts (100%) rename {src => apps/web/src}/services/tx/tx-sender/sdk.ts (100%) rename {src => apps/web/src}/services/tx/tx-sender/spendingLimit.ts (100%) rename {src => apps/web/src}/services/tx/txEvents.ts (100%) rename {src => apps/web/src}/services/tx/txMonitor.ts (100%) rename {src => apps/web/src}/store/__tests__/addedSafesSlice.test.ts (100%) rename {src => apps/web/src}/store/__tests__/addressBookSlice.test.ts (100%) rename {src => apps/web/src}/store/__tests__/broadcast.test.ts (100%) rename {src => apps/web/src}/store/__tests__/index.test.ts (100%) rename {src => apps/web/src}/store/__tests__/pendingTxsSlice.test.ts (100%) rename {src => apps/web/src}/store/__tests__/safeAppsSlice.test.ts (100%) rename {src => apps/web/src}/store/__tests__/safeMessagesSlice.test.ts (100%) rename {src => apps/web/src}/store/__tests__/safeOverviews.test.ts (100%) rename {src => apps/web/src}/store/__tests__/settingsSlice.test.ts (100%) rename {src => apps/web/src}/store/__tests__/swapOrderSlice.test.ts (100%) rename {src => apps/web/src}/store/__tests__/txHistorySlice.test.ts (100%) rename {src => apps/web/src}/store/__tests__/txQueueSlice.test.ts (100%) rename {src => apps/web/src}/store/addedSafesSlice.ts (100%) rename {src => apps/web/src}/store/addressBookSlice.ts (100%) rename {src => apps/web/src}/store/api/gateway/index.ts (100%) rename {src => apps/web/src}/store/api/gateway/proposers.ts (100%) rename {src => apps/web/src}/store/api/gateway/safeOverviews.ts (100%) rename {src => apps/web/src}/store/api/ofac.ts (100%) rename {src => apps/web/src}/store/api/safePass.ts (100%) rename {src => apps/web/src}/store/balancesSlice.ts (100%) rename {src => apps/web/src}/store/batchSlice.ts (100%) rename {src => apps/web/src}/store/broadcast.ts (100%) rename {src => apps/web/src}/store/chainsSlice.ts (100%) rename {src => apps/web/src}/store/common.ts (100%) rename {src => apps/web/src}/store/cookiesAndTermsSlice.ts (100%) rename {src => apps/web/src}/store/index.ts (100%) rename {src => apps/web/src}/store/notificationsSlice.ts (100%) rename {src => apps/web/src}/store/orderByPreferenceSlice.ts (100%) rename {src => apps/web/src}/store/pendingSafeMessagesSlice.ts (100%) rename {src => apps/web/src}/store/pendingTxsSlice.ts (100%) rename {src => apps/web/src}/store/persistStore.ts (100%) rename {src => apps/web/src}/store/popupSlice.ts (100%) rename {src => apps/web/src}/store/safeAppsSlice.ts (100%) rename {src => apps/web/src}/store/safeInfoSlice.ts (100%) rename {src => apps/web/src}/store/safeMessagesSlice.ts (100%) rename {src => apps/web/src}/store/sessionSlice.ts (100%) rename {src => apps/web/src}/store/settingsSlice.ts (100%) rename {src => apps/web/src}/store/slices.ts (100%) rename {src => apps/web/src}/store/spendingLimitsSlice.ts (100%) rename {src => apps/web/src}/store/swapOrderSlice.ts (100%) rename {src => apps/web/src}/store/txHistorySlice.ts (100%) rename {src => apps/web/src}/store/txQueueSlice.ts (100%) rename {src => apps/web/src}/store/useHydrateStore.ts (100%) rename {src => apps/web/src}/store/visitedSafesSlice.ts (100%) rename {src => apps/web/src}/stories/Configure.mdx (100%) rename {src => apps/web/src}/stories/storeDecorator.tsx (100%) rename {src => apps/web/src}/styles/accordion.module.css (100%) rename {src => apps/web/src}/styles/globals.css (100%) rename {src => apps/web/src}/styles/inputs.module.css (100%) rename {src => apps/web/src}/styles/onboard.css (100%) rename {src => apps/web/src}/styles/spacings.ts (100%) rename {src => apps/web/src}/styles/vars.css (100%) rename {src => apps/web/src}/tests/Builder.ts (100%) rename {src => apps/web/src}/tests/builders/chains.ts (100%) rename {src => apps/web/src}/tests/builders/eip1193Provider.ts (100%) rename {src => apps/web/src}/tests/builders/messages.ts (100%) rename {src => apps/web/src}/tests/builders/pendingTx.ts (100%) rename {src => apps/web/src}/tests/builders/safe.ts (100%) rename {src => apps/web/src}/tests/builders/safeItem.ts (100%) rename {src => apps/web/src}/tests/builders/safeMessage.ts (100%) rename {src => apps/web/src}/tests/builders/safeTx.ts (100%) rename {src => apps/web/src}/tests/builders/utils.ts (100%) rename {src => apps/web/src}/tests/builders/wallet.ts (100%) rename {src => apps/web/src}/tests/mocks/chains.ts (100%) rename {src => apps/web/src}/tests/mocks/contractManager.ts (100%) rename {src => apps/web/src}/tests/mocks/providers.ts (100%) rename {src => apps/web/src}/tests/mocks/transactions.ts (100%) rename {src => apps/web/src}/tests/pages/404.test.tsx (100%) rename {src => apps/web/src}/tests/pages/apps-share.test.tsx (100%) rename {src => apps/web/src}/tests/pages/apps.test.tsx (100%) rename {src => apps/web/src}/tests/test-utils.tsx (100%) rename {src => apps/web/src}/tests/transactions.ts (100%) rename {src => apps/web/src}/utils/SimpleTxWatcher.ts (100%) rename {src => apps/web/src}/utils/__tests__/SimpleTxWatcher.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/addresses.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/chains.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/date.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/formatNumber.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/formatters.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/gateway.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/helpers.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/mad-props.test.tsx (100%) rename {src => apps/web/src}/utils/__tests__/safe-hashes.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/safe-messages.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/safe-migrations.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/safe-version.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/signers.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/tokens.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/transaction-guards.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/transactions.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/tx-history-filter.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/tx-list.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/url.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/validation.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/wallets.test.ts (100%) rename {src => apps/web/src}/utils/__tests__/web3.test.ts (100%) rename {src => apps/web/src}/utils/addresses.ts (100%) rename {src => apps/web/src}/utils/chains.ts (100%) rename {src => apps/web/src}/utils/clipboard.ts (100%) rename {src => apps/web/src}/utils/createEmotionCache.ts (100%) rename {src => apps/web/src}/utils/date.ts (100%) rename {src => apps/web/src}/utils/ethers-utils.ts (100%) rename {src => apps/web/src}/utils/formatNumber.ts (100%) rename {src => apps/web/src}/utils/formatters.ts (100%) rename {src => apps/web/src}/utils/gateway.ts (100%) rename {src => apps/web/src}/utils/helpers.ts (100%) rename {src => apps/web/src}/utils/hex.ts (100%) rename {src => apps/web/src}/utils/mad-props.tsx (100%) rename {src => apps/web/src}/utils/nested-safe-wallet.ts (100%) rename {src => apps/web/src}/utils/providers/UncheckedJsonRpcSigner.ts (100%) rename {src => apps/web/src}/utils/relaying.ts (100%) rename {src => apps/web/src}/utils/safe-hashes.ts (100%) rename {src => apps/web/src}/utils/safe-message-guards.ts (100%) rename {src => apps/web/src}/utils/safe-messages.ts (100%) rename {src => apps/web/src}/utils/safe-migrations.ts (100%) rename {src => apps/web/src}/utils/safe-versions.ts (100%) rename {src => apps/web/src}/utils/signers.ts (100%) rename {src => apps/web/src}/utils/tokens.ts (100%) rename {src => apps/web/src}/utils/transaction-calldata.ts (100%) rename {src => apps/web/src}/utils/transaction-guards.ts (100%) rename {src => apps/web/src}/utils/transactions.ts (100%) rename {src => apps/web/src}/utils/tx-history-filter.ts (100%) rename {src => apps/web/src}/utils/tx-link.ts (100%) rename {src => apps/web/src}/utils/tx-list.ts (100%) rename {src => apps/web/src}/utils/url.ts (100%) rename {src => apps/web/src}/utils/validation.ts (100%) rename {src => apps/web/src}/utils/wallets.ts (100%) rename {src => apps/web/src}/utils/web3.ts (100%) rename tsconfig.json => apps/web/tsconfig.json (96%) rename yarn.lock => apps/web/yarn.lock (100%) diff --git a/.dockerignore b/apps/web/.dockerignore similarity index 100% rename from .dockerignore rename to apps/web/.dockerignore diff --git a/.env.example b/apps/web/.env.example similarity index 100% rename from .env.example rename to apps/web/.env.example diff --git a/apps/web/.gitignore b/apps/web/.gitignore new file mode 100644 index 0000000000..ade4b1731e --- /dev/null +++ b/apps/web/.gitignore @@ -0,0 +1,61 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# types +/src/types/contracts/ + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem +.idea + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo + +# yalc +.yalc +yalc.lock +.env + +/cypress/videos +/cypress/screenshots +/cypress/downloads + +/public/sw.js +/public/sw.js.map +/public/worker-*.js +/public/workbox-*.js +/public/workbox-*.js.map +/public/fallback* +/public/*.js.LICENSE.txt +certificates +*storybook.log + +# Yarn v4 +.yarn/* diff --git a/.prettierrc b/apps/web/.prettierrc similarity index 100% rename from .prettierrc rename to apps/web/.prettierrc diff --git a/.storybook/main.ts b/apps/web/.storybook/main.ts similarity index 100% rename from .storybook/main.ts rename to apps/web/.storybook/main.ts diff --git a/.storybook/preview.ts b/apps/web/.storybook/preview.ts similarity index 100% rename from .storybook/preview.ts rename to apps/web/.storybook/preview.ts diff --git a/Dockerfile b/apps/web/Dockerfile similarity index 100% rename from Dockerfile rename to apps/web/Dockerfile diff --git a/LICENSE b/apps/web/LICENSE similarity index 100% rename from LICENSE rename to apps/web/LICENSE diff --git a/README.md b/apps/web/README.md similarity index 100% rename from README.md rename to apps/web/README.md diff --git a/cypress.config.js b/apps/web/cypress.config.js similarity index 100% rename from cypress.config.js rename to apps/web/cypress.config.js diff --git a/cypress/ci.json b/apps/web/cypress/ci.json similarity index 100% rename from cypress/ci.json rename to apps/web/cypress/ci.json diff --git a/cypress/e2e/happypath/recovery_hp_1.cy.js b/apps/web/cypress/e2e/happypath/recovery_hp_1.cy.js similarity index 100% rename from cypress/e2e/happypath/recovery_hp_1.cy.js rename to apps/web/cypress/e2e/happypath/recovery_hp_1.cy.js diff --git a/cypress/e2e/happypath/recovery_hp_2.cy.js b/apps/web/cypress/e2e/happypath/recovery_hp_2.cy.js similarity index 100% rename from cypress/e2e/happypath/recovery_hp_2.cy.js rename to apps/web/cypress/e2e/happypath/recovery_hp_2.cy.js diff --git a/cypress/e2e/happypath/recovery_hp_3.cy.js b/apps/web/cypress/e2e/happypath/recovery_hp_3.cy.js similarity index 100% rename from cypress/e2e/happypath/recovery_hp_3.cy.js rename to apps/web/cypress/e2e/happypath/recovery_hp_3.cy.js diff --git a/cypress/e2e/happypath/recovery_hp_4.cy.js b/apps/web/cypress/e2e/happypath/recovery_hp_4.cy.js similarity index 100% rename from cypress/e2e/happypath/recovery_hp_4.cy.js rename to apps/web/cypress/e2e/happypath/recovery_hp_4.cy.js diff --git a/cypress/e2e/happypath/sendfunds_connected_wallet.cy.js b/apps/web/cypress/e2e/happypath/sendfunds_connected_wallet.cy.js similarity index 100% rename from cypress/e2e/happypath/sendfunds_connected_wallet.cy.js rename to apps/web/cypress/e2e/happypath/sendfunds_connected_wallet.cy.js diff --git a/cypress/e2e/happypath/sendfunds_queue_1.cy.js b/apps/web/cypress/e2e/happypath/sendfunds_queue_1.cy.js similarity index 100% rename from cypress/e2e/happypath/sendfunds_queue_1.cy.js rename to apps/web/cypress/e2e/happypath/sendfunds_queue_1.cy.js diff --git a/cypress/e2e/happypath/sendfunds_relay.cy.js b/apps/web/cypress/e2e/happypath/sendfunds_relay.cy.js similarity index 100% rename from cypress/e2e/happypath/sendfunds_relay.cy.js rename to apps/web/cypress/e2e/happypath/sendfunds_relay.cy.js diff --git a/cypress/e2e/happypath/tx_history_filter_hp_1.cy.js b/apps/web/cypress/e2e/happypath/tx_history_filter_hp_1.cy.js similarity index 100% rename from cypress/e2e/happypath/tx_history_filter_hp_1.cy.js rename to apps/web/cypress/e2e/happypath/tx_history_filter_hp_1.cy.js diff --git a/cypress/e2e/happypath/tx_history_filter_hp_2.cy.js b/apps/web/cypress/e2e/happypath/tx_history_filter_hp_2.cy.js similarity index 100% rename from cypress/e2e/happypath/tx_history_filter_hp_2.cy.js rename to apps/web/cypress/e2e/happypath/tx_history_filter_hp_2.cy.js diff --git a/cypress/e2e/happypath_2/add_owner.cy.js b/apps/web/cypress/e2e/happypath_2/add_owner.cy.js similarity index 100% rename from cypress/e2e/happypath_2/add_owner.cy.js rename to apps/web/cypress/e2e/happypath_2/add_owner.cy.js diff --git a/cypress/e2e/happypath_2/multichain_create_safe.cy.js b/apps/web/cypress/e2e/happypath_2/multichain_create_safe.cy.js similarity index 100% rename from cypress/e2e/happypath_2/multichain_create_safe.cy.js rename to apps/web/cypress/e2e/happypath_2/multichain_create_safe.cy.js diff --git a/cypress/e2e/happypath_2/proposers.cy.js b/apps/web/cypress/e2e/happypath_2/proposers.cy.js similarity index 100% rename from cypress/e2e/happypath_2/proposers.cy.js rename to apps/web/cypress/e2e/happypath_2/proposers.cy.js diff --git a/cypress/e2e/happypath_2/swaps.cy.js b/apps/web/cypress/e2e/happypath_2/swaps.cy.js similarity index 100% rename from cypress/e2e/happypath_2/swaps.cy.js rename to apps/web/cypress/e2e/happypath_2/swaps.cy.js diff --git a/cypress/e2e/pages/address_book.page.js b/apps/web/cypress/e2e/pages/address_book.page.js similarity index 100% rename from cypress/e2e/pages/address_book.page.js rename to apps/web/cypress/e2e/pages/address_book.page.js diff --git a/cypress/e2e/pages/assets.pages.js b/apps/web/cypress/e2e/pages/assets.pages.js similarity index 100% rename from cypress/e2e/pages/assets.pages.js rename to apps/web/cypress/e2e/pages/assets.pages.js diff --git a/cypress/e2e/pages/batches.pages.js b/apps/web/cypress/e2e/pages/batches.pages.js similarity index 100% rename from cypress/e2e/pages/batches.pages.js rename to apps/web/cypress/e2e/pages/batches.pages.js diff --git a/cypress/e2e/pages/create_tx.pages.js b/apps/web/cypress/e2e/pages/create_tx.pages.js similarity index 100% rename from cypress/e2e/pages/create_tx.pages.js rename to apps/web/cypress/e2e/pages/create_tx.pages.js diff --git a/cypress/e2e/pages/create_wallet.pages.js b/apps/web/cypress/e2e/pages/create_wallet.pages.js similarity index 100% rename from cypress/e2e/pages/create_wallet.pages.js rename to apps/web/cypress/e2e/pages/create_wallet.pages.js diff --git a/cypress/e2e/pages/dashboard.pages.js b/apps/web/cypress/e2e/pages/dashboard.pages.js similarity index 100% rename from cypress/e2e/pages/dashboard.pages.js rename to apps/web/cypress/e2e/pages/dashboard.pages.js diff --git a/cypress/e2e/pages/import_export.pages.js b/apps/web/cypress/e2e/pages/import_export.pages.js similarity index 100% rename from cypress/e2e/pages/import_export.pages.js rename to apps/web/cypress/e2e/pages/import_export.pages.js diff --git a/cypress/e2e/pages/load_safe.pages.js b/apps/web/cypress/e2e/pages/load_safe.pages.js similarity index 100% rename from cypress/e2e/pages/load_safe.pages.js rename to apps/web/cypress/e2e/pages/load_safe.pages.js diff --git a/cypress/e2e/pages/main.page.js b/apps/web/cypress/e2e/pages/main.page.js similarity index 100% rename from cypress/e2e/pages/main.page.js rename to apps/web/cypress/e2e/pages/main.page.js diff --git a/cypress/e2e/pages/messages.pages.js b/apps/web/cypress/e2e/pages/messages.pages.js similarity index 100% rename from cypress/e2e/pages/messages.pages.js rename to apps/web/cypress/e2e/pages/messages.pages.js diff --git a/cypress/e2e/pages/modals.page.js b/apps/web/cypress/e2e/pages/modals.page.js similarity index 100% rename from cypress/e2e/pages/modals.page.js rename to apps/web/cypress/e2e/pages/modals.page.js diff --git a/cypress/e2e/pages/modals/message_confirmation.pages.js b/apps/web/cypress/e2e/pages/modals/message_confirmation.pages.js similarity index 100% rename from cypress/e2e/pages/modals/message_confirmation.pages.js rename to apps/web/cypress/e2e/pages/modals/message_confirmation.pages.js diff --git a/cypress/e2e/pages/modules.page.js b/apps/web/cypress/e2e/pages/modules.page.js similarity index 100% rename from cypress/e2e/pages/modules.page.js rename to apps/web/cypress/e2e/pages/modules.page.js diff --git a/cypress/e2e/pages/navigation.page.js b/apps/web/cypress/e2e/pages/navigation.page.js similarity index 100% rename from cypress/e2e/pages/navigation.page.js rename to apps/web/cypress/e2e/pages/navigation.page.js diff --git a/cypress/e2e/pages/nfts.pages.js b/apps/web/cypress/e2e/pages/nfts.pages.js similarity index 100% rename from cypress/e2e/pages/nfts.pages.js rename to apps/web/cypress/e2e/pages/nfts.pages.js diff --git a/cypress/e2e/pages/owners.pages.js b/apps/web/cypress/e2e/pages/owners.pages.js similarity index 100% rename from cypress/e2e/pages/owners.pages.js rename to apps/web/cypress/e2e/pages/owners.pages.js diff --git a/cypress/e2e/pages/proposers.pages.js b/apps/web/cypress/e2e/pages/proposers.pages.js similarity index 100% rename from cypress/e2e/pages/proposers.pages.js rename to apps/web/cypress/e2e/pages/proposers.pages.js diff --git a/cypress/e2e/pages/recovery.pages.js b/apps/web/cypress/e2e/pages/recovery.pages.js similarity index 100% rename from cypress/e2e/pages/recovery.pages.js rename to apps/web/cypress/e2e/pages/recovery.pages.js diff --git a/cypress/e2e/pages/safeapps.pages.js b/apps/web/cypress/e2e/pages/safeapps.pages.js similarity index 100% rename from cypress/e2e/pages/safeapps.pages.js rename to apps/web/cypress/e2e/pages/safeapps.pages.js diff --git a/cypress/e2e/pages/sidebar.pages.js b/apps/web/cypress/e2e/pages/sidebar.pages.js similarity index 100% rename from cypress/e2e/pages/sidebar.pages.js rename to apps/web/cypress/e2e/pages/sidebar.pages.js diff --git a/cypress/e2e/pages/spending_limits.pages.js b/apps/web/cypress/e2e/pages/spending_limits.pages.js similarity index 100% rename from cypress/e2e/pages/spending_limits.pages.js rename to apps/web/cypress/e2e/pages/spending_limits.pages.js diff --git a/cypress/e2e/pages/staking.page.js b/apps/web/cypress/e2e/pages/staking.page.js similarity index 100% rename from cypress/e2e/pages/staking.page.js rename to apps/web/cypress/e2e/pages/staking.page.js diff --git a/cypress/e2e/pages/swaps.pages.js b/apps/web/cypress/e2e/pages/swaps.pages.js similarity index 100% rename from cypress/e2e/pages/swaps.pages.js rename to apps/web/cypress/e2e/pages/swaps.pages.js diff --git a/cypress/e2e/pages/tables.page.js b/apps/web/cypress/e2e/pages/tables.page.js similarity index 100% rename from cypress/e2e/pages/tables.page.js rename to apps/web/cypress/e2e/pages/tables.page.js diff --git a/cypress/e2e/pages/transactions.page.js b/apps/web/cypress/e2e/pages/transactions.page.js similarity index 100% rename from cypress/e2e/pages/transactions.page.js rename to apps/web/cypress/e2e/pages/transactions.page.js diff --git a/cypress/e2e/prodhealthcheck/add_owner.cy.js b/apps/web/cypress/e2e/prodhealthcheck/add_owner.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/add_owner.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/add_owner.cy.js diff --git a/cypress/e2e/prodhealthcheck/create_tx.cy.js b/apps/web/cypress/e2e/prodhealthcheck/create_tx.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/create_tx.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/create_tx.cy.js diff --git a/cypress/e2e/prodhealthcheck/load_safe.cy.js b/apps/web/cypress/e2e/prodhealthcheck/load_safe.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/load_safe.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/load_safe.cy.js diff --git a/cypress/e2e/prodhealthcheck/messages_onchain.cy.js b/apps/web/cypress/e2e/prodhealthcheck/messages_onchain.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/messages_onchain.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/messages_onchain.cy.js diff --git a/cypress/e2e/prodhealthcheck/multichain_network.cy.js b/apps/web/cypress/e2e/prodhealthcheck/multichain_network.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/multichain_network.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/multichain_network.cy.js diff --git a/cypress/e2e/prodhealthcheck/nfts.cy.js b/apps/web/cypress/e2e/prodhealthcheck/nfts.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/nfts.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/nfts.cy.js diff --git a/cypress/e2e/prodhealthcheck/recovery.cy.js b/apps/web/cypress/e2e/prodhealthcheck/recovery.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/recovery.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/recovery.cy.js diff --git a/cypress/e2e/prodhealthcheck/remove_owner.cy.js b/apps/web/cypress/e2e/prodhealthcheck/remove_owner.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/remove_owner.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/remove_owner.cy.js diff --git a/cypress/e2e/prodhealthcheck/sidebar.cy.js b/apps/web/cypress/e2e/prodhealthcheck/sidebar.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/sidebar.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/sidebar.cy.js diff --git a/cypress/e2e/prodhealthcheck/sidebar_3.cy.js b/apps/web/cypress/e2e/prodhealthcheck/sidebar_3.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/sidebar_3.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/sidebar_3.cy.js diff --git a/cypress/e2e/prodhealthcheck/spending_limits.cy.js b/apps/web/cypress/e2e/prodhealthcheck/spending_limits.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/spending_limits.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/spending_limits.cy.js diff --git a/cypress/e2e/prodhealthcheck/swaps_history_2.cy.js b/apps/web/cypress/e2e/prodhealthcheck/swaps_history_2.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/swaps_history_2.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/swaps_history_2.cy.js diff --git a/cypress/e2e/prodhealthcheck/swaps_tokens.cy.js b/apps/web/cypress/e2e/prodhealthcheck/swaps_tokens.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/swaps_tokens.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/swaps_tokens.cy.js diff --git a/cypress/e2e/prodhealthcheck/tokens.cy.js b/apps/web/cypress/e2e/prodhealthcheck/tokens.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/tokens.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/tokens.cy.js diff --git a/cypress/e2e/prodhealthcheck/tx_history.cy.js b/apps/web/cypress/e2e/prodhealthcheck/tx_history.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/tx_history.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/tx_history.cy.js diff --git a/cypress/e2e/prodhealthcheck/tx_history_2.cy.js b/apps/web/cypress/e2e/prodhealthcheck/tx_history_2.cy.js similarity index 100% rename from cypress/e2e/prodhealthcheck/tx_history_2.cy.js rename to apps/web/cypress/e2e/prodhealthcheck/tx_history_2.cy.js diff --git a/cypress/e2e/regression/add_owner.cy.js b/apps/web/cypress/e2e/regression/add_owner.cy.js similarity index 100% rename from cypress/e2e/regression/add_owner.cy.js rename to apps/web/cypress/e2e/regression/add_owner.cy.js diff --git a/cypress/e2e/regression/address_book.cy.js b/apps/web/cypress/e2e/regression/address_book.cy.js similarity index 100% rename from cypress/e2e/regression/address_book.cy.js rename to apps/web/cypress/e2e/regression/address_book.cy.js diff --git a/cypress/e2e/regression/address_book_2.cy.js b/apps/web/cypress/e2e/regression/address_book_2.cy.js similarity index 100% rename from cypress/e2e/regression/address_book_2.cy.js rename to apps/web/cypress/e2e/regression/address_book_2.cy.js diff --git a/cypress/e2e/regression/balances_pagination.cy.js b/apps/web/cypress/e2e/regression/balances_pagination.cy.js similarity index 100% rename from cypress/e2e/regression/balances_pagination.cy.js rename to apps/web/cypress/e2e/regression/balances_pagination.cy.js diff --git a/cypress/e2e/regression/batch_tx.cy.js b/apps/web/cypress/e2e/regression/batch_tx.cy.js similarity index 100% rename from cypress/e2e/regression/batch_tx.cy.js rename to apps/web/cypress/e2e/regression/batch_tx.cy.js diff --git a/cypress/e2e/regression/bulk_execution.cy.js b/apps/web/cypress/e2e/regression/bulk_execution.cy.js similarity index 100% rename from cypress/e2e/regression/bulk_execution.cy.js rename to apps/web/cypress/e2e/regression/bulk_execution.cy.js diff --git a/cypress/e2e/regression/create_safe_cf.cy.js b/apps/web/cypress/e2e/regression/create_safe_cf.cy.js similarity index 100% rename from cypress/e2e/regression/create_safe_cf.cy.js rename to apps/web/cypress/e2e/regression/create_safe_cf.cy.js diff --git a/cypress/e2e/regression/create_safe_simple.cy.js b/apps/web/cypress/e2e/regression/create_safe_simple.cy.js similarity index 100% rename from cypress/e2e/regression/create_safe_simple.cy.js rename to apps/web/cypress/e2e/regression/create_safe_simple.cy.js diff --git a/cypress/e2e/regression/create_safe_simple_2.cy.js b/apps/web/cypress/e2e/regression/create_safe_simple_2.cy.js similarity index 100% rename from cypress/e2e/regression/create_safe_simple_2.cy.js rename to apps/web/cypress/e2e/regression/create_safe_simple_2.cy.js diff --git a/cypress/e2e/regression/create_tx.cy.js b/apps/web/cypress/e2e/regression/create_tx.cy.js similarity index 100% rename from cypress/e2e/regression/create_tx.cy.js rename to apps/web/cypress/e2e/regression/create_tx.cy.js diff --git a/cypress/e2e/regression/load_safe.cy.js b/apps/web/cypress/e2e/regression/load_safe.cy.js similarity index 100% rename from cypress/e2e/regression/load_safe.cy.js rename to apps/web/cypress/e2e/regression/load_safe.cy.js diff --git a/cypress/e2e/regression/load_safe_2.cy.js b/apps/web/cypress/e2e/regression/load_safe_2.cy.js similarity index 100% rename from cypress/e2e/regression/load_safe_2.cy.js rename to apps/web/cypress/e2e/regression/load_safe_2.cy.js diff --git a/cypress/e2e/regression/messages_onchain.cy.js b/apps/web/cypress/e2e/regression/messages_onchain.cy.js similarity index 100% rename from cypress/e2e/regression/messages_onchain.cy.js rename to apps/web/cypress/e2e/regression/messages_onchain.cy.js diff --git a/cypress/e2e/regression/messages_popup.cy.js b/apps/web/cypress/e2e/regression/messages_popup.cy.js similarity index 100% rename from cypress/e2e/regression/messages_popup.cy.js rename to apps/web/cypress/e2e/regression/messages_popup.cy.js diff --git a/cypress/e2e/regression/multichain_create_safe.cy.js b/apps/web/cypress/e2e/regression/multichain_create_safe.cy.js similarity index 100% rename from cypress/e2e/regression/multichain_create_safe.cy.js rename to apps/web/cypress/e2e/regression/multichain_create_safe.cy.js diff --git a/cypress/e2e/regression/multichain_create_safe_flow.cy.js b/apps/web/cypress/e2e/regression/multichain_create_safe_flow.cy.js similarity index 100% rename from cypress/e2e/regression/multichain_create_safe_flow.cy.js rename to apps/web/cypress/e2e/regression/multichain_create_safe_flow.cy.js diff --git a/cypress/e2e/regression/multichain_network.cy.js b/apps/web/cypress/e2e/regression/multichain_network.cy.js similarity index 100% rename from cypress/e2e/regression/multichain_network.cy.js rename to apps/web/cypress/e2e/regression/multichain_network.cy.js diff --git a/cypress/e2e/regression/multichain_networkswitch.cy.js b/apps/web/cypress/e2e/regression/multichain_networkswitch.cy.js similarity index 100% rename from cypress/e2e/regression/multichain_networkswitch.cy.js rename to apps/web/cypress/e2e/regression/multichain_networkswitch.cy.js diff --git a/cypress/e2e/regression/multichain_setup.cy.js b/apps/web/cypress/e2e/regression/multichain_setup.cy.js similarity index 100% rename from cypress/e2e/regression/multichain_setup.cy.js rename to apps/web/cypress/e2e/regression/multichain_setup.cy.js diff --git a/cypress/e2e/regression/multichain_sidebar.cy.js b/apps/web/cypress/e2e/regression/multichain_sidebar.cy.js similarity index 100% rename from cypress/e2e/regression/multichain_sidebar.cy.js rename to apps/web/cypress/e2e/regression/multichain_sidebar.cy.js diff --git a/cypress/e2e/regression/nfts.cy.js b/apps/web/cypress/e2e/regression/nfts.cy.js similarity index 100% rename from cypress/e2e/regression/nfts.cy.js rename to apps/web/cypress/e2e/regression/nfts.cy.js diff --git a/cypress/e2e/regression/proposers.cy.js b/apps/web/cypress/e2e/regression/proposers.cy.js similarity index 100% rename from cypress/e2e/regression/proposers.cy.js rename to apps/web/cypress/e2e/regression/proposers.cy.js diff --git a/cypress/e2e/regression/proposers_2.cy.js b/apps/web/cypress/e2e/regression/proposers_2.cy.js similarity index 100% rename from cypress/e2e/regression/proposers_2.cy.js rename to apps/web/cypress/e2e/regression/proposers_2.cy.js diff --git a/cypress/e2e/regression/recovery.cy.js b/apps/web/cypress/e2e/regression/recovery.cy.js similarity index 100% rename from cypress/e2e/regression/recovery.cy.js rename to apps/web/cypress/e2e/regression/recovery.cy.js diff --git a/cypress/e2e/regression/recovery_2.cy.js b/apps/web/cypress/e2e/regression/recovery_2.cy.js similarity index 100% rename from cypress/e2e/regression/recovery_2.cy.js rename to apps/web/cypress/e2e/regression/recovery_2.cy.js diff --git a/cypress/e2e/regression/remove_owner.cy.js b/apps/web/cypress/e2e/regression/remove_owner.cy.js similarity index 100% rename from cypress/e2e/regression/remove_owner.cy.js rename to apps/web/cypress/e2e/regression/remove_owner.cy.js diff --git a/cypress/e2e/regression/replace_owner.cy.js b/apps/web/cypress/e2e/regression/replace_owner.cy.js similarity index 100% rename from cypress/e2e/regression/replace_owner.cy.js rename to apps/web/cypress/e2e/regression/replace_owner.cy.js diff --git a/cypress/e2e/regression/sidebar.cy.js b/apps/web/cypress/e2e/regression/sidebar.cy.js similarity index 100% rename from cypress/e2e/regression/sidebar.cy.js rename to apps/web/cypress/e2e/regression/sidebar.cy.js diff --git a/cypress/e2e/regression/sidebar_2.cy.js b/apps/web/cypress/e2e/regression/sidebar_2.cy.js similarity index 100% rename from cypress/e2e/regression/sidebar_2.cy.js rename to apps/web/cypress/e2e/regression/sidebar_2.cy.js diff --git a/cypress/e2e/regression/sidebar_3.cy.js b/apps/web/cypress/e2e/regression/sidebar_3.cy.js similarity index 100% rename from cypress/e2e/regression/sidebar_3.cy.js rename to apps/web/cypress/e2e/regression/sidebar_3.cy.js diff --git a/cypress/e2e/regression/sidebar_4.cy.js b/apps/web/cypress/e2e/regression/sidebar_4.cy.js similarity index 100% rename from cypress/e2e/regression/sidebar_4.cy.js rename to apps/web/cypress/e2e/regression/sidebar_4.cy.js diff --git a/cypress/e2e/regression/sidebar_5.cy.js b/apps/web/cypress/e2e/regression/sidebar_5.cy.js similarity index 100% rename from cypress/e2e/regression/sidebar_5.cy.js rename to apps/web/cypress/e2e/regression/sidebar_5.cy.js diff --git a/cypress/e2e/regression/sidebar_6.cy.js b/apps/web/cypress/e2e/regression/sidebar_6.cy.js similarity index 100% rename from cypress/e2e/regression/sidebar_6.cy.js rename to apps/web/cypress/e2e/regression/sidebar_6.cy.js diff --git a/cypress/e2e/regression/sidebar_7.cy.js b/apps/web/cypress/e2e/regression/sidebar_7.cy.js similarity index 100% rename from cypress/e2e/regression/sidebar_7.cy.js rename to apps/web/cypress/e2e/regression/sidebar_7.cy.js diff --git a/cypress/e2e/regression/sidebar_nonowner.cy.js b/apps/web/cypress/e2e/regression/sidebar_nonowner.cy.js similarity index 100% rename from cypress/e2e/regression/sidebar_nonowner.cy.js rename to apps/web/cypress/e2e/regression/sidebar_nonowner.cy.js diff --git a/cypress/e2e/regression/spending_limits.cy.js b/apps/web/cypress/e2e/regression/spending_limits.cy.js similarity index 100% rename from cypress/e2e/regression/spending_limits.cy.js rename to apps/web/cypress/e2e/regression/spending_limits.cy.js diff --git a/cypress/e2e/regression/spending_limits_nonowner.cy.js b/apps/web/cypress/e2e/regression/spending_limits_nonowner.cy.js similarity index 100% rename from cypress/e2e/regression/spending_limits_nonowner.cy.js rename to apps/web/cypress/e2e/regression/spending_limits_nonowner.cy.js diff --git a/cypress/e2e/regression/staking_history.cy.js b/apps/web/cypress/e2e/regression/staking_history.cy.js similarity index 100% rename from cypress/e2e/regression/staking_history.cy.js rename to apps/web/cypress/e2e/regression/staking_history.cy.js diff --git a/cypress/e2e/regression/swaps.cy.js b/apps/web/cypress/e2e/regression/swaps.cy.js similarity index 100% rename from cypress/e2e/regression/swaps.cy.js rename to apps/web/cypress/e2e/regression/swaps.cy.js diff --git a/cypress/e2e/regression/swaps_history.cy.js b/apps/web/cypress/e2e/regression/swaps_history.cy.js similarity index 100% rename from cypress/e2e/regression/swaps_history.cy.js rename to apps/web/cypress/e2e/regression/swaps_history.cy.js diff --git a/cypress/e2e/regression/swaps_history_2.cy.js b/apps/web/cypress/e2e/regression/swaps_history_2.cy.js similarity index 100% rename from cypress/e2e/regression/swaps_history_2.cy.js rename to apps/web/cypress/e2e/regression/swaps_history_2.cy.js diff --git a/cypress/e2e/regression/swaps_tokens.cy.js b/apps/web/cypress/e2e/regression/swaps_tokens.cy.js similarity index 100% rename from cypress/e2e/regression/swaps_tokens.cy.js rename to apps/web/cypress/e2e/regression/swaps_tokens.cy.js diff --git a/cypress/e2e/regression/tokens.cy.js b/apps/web/cypress/e2e/regression/tokens.cy.js similarity index 100% rename from cypress/e2e/regression/tokens.cy.js rename to apps/web/cypress/e2e/regression/tokens.cy.js diff --git a/cypress/e2e/regression/twaps.cy.js b/apps/web/cypress/e2e/regression/twaps.cy.js similarity index 100% rename from cypress/e2e/regression/twaps.cy.js rename to apps/web/cypress/e2e/regression/twaps.cy.js diff --git a/cypress/e2e/regression/twaps_2.cy.js b/apps/web/cypress/e2e/regression/twaps_2.cy.js similarity index 100% rename from cypress/e2e/regression/twaps_2.cy.js rename to apps/web/cypress/e2e/regression/twaps_2.cy.js diff --git a/cypress/e2e/regression/twaps_history.cy.js b/apps/web/cypress/e2e/regression/twaps_history.cy.js similarity index 100% rename from cypress/e2e/regression/twaps_history.cy.js rename to apps/web/cypress/e2e/regression/twaps_history.cy.js diff --git a/cypress/e2e/regression/tx_decoding.cy.js b/apps/web/cypress/e2e/regression/tx_decoding.cy.js similarity index 100% rename from cypress/e2e/regression/tx_decoding.cy.js rename to apps/web/cypress/e2e/regression/tx_decoding.cy.js diff --git a/cypress/e2e/regression/tx_history.cy.js b/apps/web/cypress/e2e/regression/tx_history.cy.js similarity index 100% rename from cypress/e2e/regression/tx_history.cy.js rename to apps/web/cypress/e2e/regression/tx_history.cy.js diff --git a/cypress/e2e/regression/tx_history_2.cy.js b/apps/web/cypress/e2e/regression/tx_history_2.cy.js similarity index 100% rename from cypress/e2e/regression/tx_history_2.cy.js rename to apps/web/cypress/e2e/regression/tx_history_2.cy.js diff --git a/cypress/e2e/regression/tx_history_3.cy.js b/apps/web/cypress/e2e/regression/tx_history_3.cy.js similarity index 100% rename from cypress/e2e/regression/tx_history_3.cy.js rename to apps/web/cypress/e2e/regression/tx_history_3.cy.js diff --git a/cypress/e2e/regression/tx_history_4.cy.js b/apps/web/cypress/e2e/regression/tx_history_4.cy.js similarity index 100% rename from cypress/e2e/regression/tx_history_4.cy.js rename to apps/web/cypress/e2e/regression/tx_history_4.cy.js diff --git a/cypress/e2e/safe-apps/apps_list.cy.js b/apps/web/cypress/e2e/safe-apps/apps_list.cy.js similarity index 100% rename from cypress/e2e/safe-apps/apps_list.cy.js rename to apps/web/cypress/e2e/safe-apps/apps_list.cy.js diff --git a/cypress/e2e/safe-apps/browser_permissions.cy.js b/apps/web/cypress/e2e/safe-apps/browser_permissions.cy.js similarity index 100% rename from cypress/e2e/safe-apps/browser_permissions.cy.js rename to apps/web/cypress/e2e/safe-apps/browser_permissions.cy.js diff --git a/cypress/e2e/safe-apps/constants.js b/apps/web/cypress/e2e/safe-apps/constants.js similarity index 100% rename from cypress/e2e/safe-apps/constants.js rename to apps/web/cypress/e2e/safe-apps/constants.js diff --git a/cypress/e2e/safe-apps/drain_account.spec.cy.js b/apps/web/cypress/e2e/safe-apps/drain_account.spec.cy.js similarity index 100% rename from cypress/e2e/safe-apps/drain_account.spec.cy.js rename to apps/web/cypress/e2e/safe-apps/drain_account.spec.cy.js diff --git a/cypress/e2e/safe-apps/info_modal.cy.js b/apps/web/cypress/e2e/safe-apps/info_modal.cy.js similarity index 100% rename from cypress/e2e/safe-apps/info_modal.cy.js rename to apps/web/cypress/e2e/safe-apps/info_modal.cy.js diff --git a/cypress/e2e/safe-apps/permissions_settings.cy.js b/apps/web/cypress/e2e/safe-apps/permissions_settings.cy.js similarity index 100% rename from cypress/e2e/safe-apps/permissions_settings.cy.js rename to apps/web/cypress/e2e/safe-apps/permissions_settings.cy.js diff --git a/cypress/e2e/safe-apps/preview_drawer.cy.js b/apps/web/cypress/e2e/safe-apps/preview_drawer.cy.js similarity index 100% rename from cypress/e2e/safe-apps/preview_drawer.cy.js rename to apps/web/cypress/e2e/safe-apps/preview_drawer.cy.js diff --git a/cypress/e2e/safe-apps/safe_permissions.cy.js b/apps/web/cypress/e2e/safe-apps/safe_permissions.cy.js similarity index 100% rename from cypress/e2e/safe-apps/safe_permissions.cy.js rename to apps/web/cypress/e2e/safe-apps/safe_permissions.cy.js diff --git a/cypress/e2e/safe-apps/tx-builder.2spec.cy.js b/apps/web/cypress/e2e/safe-apps/tx-builder.2spec.cy.js similarity index 100% rename from cypress/e2e/safe-apps/tx-builder.2spec.cy.js rename to apps/web/cypress/e2e/safe-apps/tx-builder.2spec.cy.js diff --git a/cypress/e2e/safe-apps/tx-builder.spec.cy.js b/apps/web/cypress/e2e/safe-apps/tx-builder.spec.cy.js similarity index 100% rename from cypress/e2e/safe-apps/tx-builder.spec.cy.js rename to apps/web/cypress/e2e/safe-apps/tx-builder.spec.cy.js diff --git a/cypress/e2e/safe-apps/tx_modal.cy.js b/apps/web/cypress/e2e/safe-apps/tx_modal.cy.js similarity index 100% rename from cypress/e2e/safe-apps/tx_modal.cy.js rename to apps/web/cypress/e2e/safe-apps/tx_modal.cy.js diff --git a/cypress/e2e/smoke/add_owner.cy.js b/apps/web/cypress/e2e/smoke/add_owner.cy.js similarity index 100% rename from cypress/e2e/smoke/add_owner.cy.js rename to apps/web/cypress/e2e/smoke/add_owner.cy.js diff --git a/cypress/e2e/smoke/address_book.cy.js b/apps/web/cypress/e2e/smoke/address_book.cy.js similarity index 100% rename from cypress/e2e/smoke/address_book.cy.js rename to apps/web/cypress/e2e/smoke/address_book.cy.js diff --git a/cypress/e2e/smoke/assets.cy.js b/apps/web/cypress/e2e/smoke/assets.cy.js similarity index 100% rename from cypress/e2e/smoke/assets.cy.js rename to apps/web/cypress/e2e/smoke/assets.cy.js diff --git a/cypress/e2e/smoke/batch_tx.cy.js b/apps/web/cypress/e2e/smoke/batch_tx.cy.js similarity index 100% rename from cypress/e2e/smoke/batch_tx.cy.js rename to apps/web/cypress/e2e/smoke/batch_tx.cy.js diff --git a/cypress/e2e/smoke/create_safe_cf.cy.js b/apps/web/cypress/e2e/smoke/create_safe_cf.cy.js similarity index 100% rename from cypress/e2e/smoke/create_safe_cf.cy.js rename to apps/web/cypress/e2e/smoke/create_safe_cf.cy.js diff --git a/cypress/e2e/smoke/create_safe_simple.cy.js b/apps/web/cypress/e2e/smoke/create_safe_simple.cy.js similarity index 100% rename from cypress/e2e/smoke/create_safe_simple.cy.js rename to apps/web/cypress/e2e/smoke/create_safe_simple.cy.js diff --git a/cypress/e2e/smoke/create_tx.cy.js b/apps/web/cypress/e2e/smoke/create_tx.cy.js similarity index 100% rename from cypress/e2e/smoke/create_tx.cy.js rename to apps/web/cypress/e2e/smoke/create_tx.cy.js diff --git a/cypress/e2e/smoke/create_tx_2.cy.js b/apps/web/cypress/e2e/smoke/create_tx_2.cy.js similarity index 100% rename from cypress/e2e/smoke/create_tx_2.cy.js rename to apps/web/cypress/e2e/smoke/create_tx_2.cy.js diff --git a/cypress/e2e/smoke/dashboard.cy.js b/apps/web/cypress/e2e/smoke/dashboard.cy.js similarity index 100% rename from cypress/e2e/smoke/dashboard.cy.js rename to apps/web/cypress/e2e/smoke/dashboard.cy.js diff --git a/cypress/e2e/smoke/import_export_data.cy.js b/apps/web/cypress/e2e/smoke/import_export_data.cy.js similarity index 100% rename from cypress/e2e/smoke/import_export_data.cy.js rename to apps/web/cypress/e2e/smoke/import_export_data.cy.js diff --git a/cypress/e2e/smoke/import_export_data_2.cy.js b/apps/web/cypress/e2e/smoke/import_export_data_2.cy.js similarity index 100% rename from cypress/e2e/smoke/import_export_data_2.cy.js rename to apps/web/cypress/e2e/smoke/import_export_data_2.cy.js diff --git a/cypress/e2e/smoke/landing.cy.js b/apps/web/cypress/e2e/smoke/landing.cy.js similarity index 100% rename from cypress/e2e/smoke/landing.cy.js rename to apps/web/cypress/e2e/smoke/landing.cy.js diff --git a/cypress/e2e/smoke/load_safe.cy.js b/apps/web/cypress/e2e/smoke/load_safe.cy.js similarity index 100% rename from cypress/e2e/smoke/load_safe.cy.js rename to apps/web/cypress/e2e/smoke/load_safe.cy.js diff --git a/cypress/e2e/smoke/messages_offchain.cy.js b/apps/web/cypress/e2e/smoke/messages_offchain.cy.js similarity index 100% rename from cypress/e2e/smoke/messages_offchain.cy.js rename to apps/web/cypress/e2e/smoke/messages_offchain.cy.js diff --git a/cypress/e2e/smoke/nfts.cy.js b/apps/web/cypress/e2e/smoke/nfts.cy.js similarity index 100% rename from cypress/e2e/smoke/nfts.cy.js rename to apps/web/cypress/e2e/smoke/nfts.cy.js diff --git a/cypress/e2e/smoke/replace_owner.cy.js b/apps/web/cypress/e2e/smoke/replace_owner.cy.js similarity index 100% rename from cypress/e2e/smoke/replace_owner.cy.js rename to apps/web/cypress/e2e/smoke/replace_owner.cy.js diff --git a/cypress/e2e/smoke/spending_limits.cy.js b/apps/web/cypress/e2e/smoke/spending_limits.cy.js similarity index 100% rename from cypress/e2e/smoke/spending_limits.cy.js rename to apps/web/cypress/e2e/smoke/spending_limits.cy.js diff --git a/cypress/e2e/smoke/tokens.cy.js b/apps/web/cypress/e2e/smoke/tokens.cy.js similarity index 100% rename from cypress/e2e/smoke/tokens.cy.js rename to apps/web/cypress/e2e/smoke/tokens.cy.js diff --git a/cypress/e2e/smoke/tx_history.cy.js b/apps/web/cypress/e2e/smoke/tx_history.cy.js similarity index 100% rename from cypress/e2e/smoke/tx_history.cy.js rename to apps/web/cypress/e2e/smoke/tx_history.cy.js diff --git a/cypress/e2e/smoke/tx_history_filter.cy.js b/apps/web/cypress/e2e/smoke/tx_history_filter.cy.js similarity index 100% rename from cypress/e2e/smoke/tx_history_filter.cy.js rename to apps/web/cypress/e2e/smoke/tx_history_filter.cy.js diff --git a/cypress/fixtures/address_book_addedsafes.csv b/apps/web/cypress/fixtures/address_book_addedsafes.csv similarity index 100% rename from cypress/fixtures/address_book_addedsafes.csv rename to apps/web/cypress/fixtures/address_book_addedsafes.csv diff --git a/cypress/fixtures/address_book_duplicated.csv b/apps/web/cypress/fixtures/address_book_duplicated.csv similarity index 100% rename from cypress/fixtures/address_book_duplicated.csv rename to apps/web/cypress/fixtures/address_book_duplicated.csv diff --git a/cypress/fixtures/address_book_empty_test.csv b/apps/web/cypress/fixtures/address_book_empty_test.csv similarity index 100% rename from cypress/fixtures/address_book_empty_test.csv rename to apps/web/cypress/fixtures/address_book_empty_test.csv diff --git a/cypress/fixtures/address_book_networks.csv b/apps/web/cypress/fixtures/address_book_networks.csv similarity index 100% rename from cypress/fixtures/address_book_networks.csv rename to apps/web/cypress/fixtures/address_book_networks.csv diff --git a/cypress/fixtures/address_book_test.csv b/apps/web/cypress/fixtures/address_book_test.csv similarity index 100% rename from cypress/fixtures/address_book_test.csv rename to apps/web/cypress/fixtures/address_book_test.csv diff --git a/cypress/fixtures/balances.json b/apps/web/cypress/fixtures/balances.json similarity index 100% rename from cypress/fixtures/balances.json rename to apps/web/cypress/fixtures/balances.json diff --git a/cypress/fixtures/data_import.json b/apps/web/cypress/fixtures/data_import.json similarity index 100% rename from cypress/fixtures/data_import.json rename to apps/web/cypress/fixtures/data_import.json diff --git a/cypress/fixtures/invalid_image_QR_test.png b/apps/web/cypress/fixtures/invalid_image_QR_test.png similarity index 100% rename from cypress/fixtures/invalid_image_QR_test.png rename to apps/web/cypress/fixtures/invalid_image_QR_test.png diff --git a/cypress/fixtures/safe-app.html b/apps/web/cypress/fixtures/safe-app.html similarity index 100% rename from cypress/fixtures/safe-app.html rename to apps/web/cypress/fixtures/safe-app.html diff --git a/cypress/fixtures/safes/funds.json b/apps/web/cypress/fixtures/safes/funds.json similarity index 100% rename from cypress/fixtures/safes/funds.json rename to apps/web/cypress/fixtures/safes/funds.json diff --git a/cypress/fixtures/safes/nfts.json b/apps/web/cypress/fixtures/safes/nfts.json similarity index 100% rename from cypress/fixtures/safes/nfts.json rename to apps/web/cypress/fixtures/safes/nfts.json diff --git a/cypress/fixtures/safes/recovery.json b/apps/web/cypress/fixtures/safes/recovery.json similarity index 100% rename from cypress/fixtures/safes/recovery.json rename to apps/web/cypress/fixtures/safes/recovery.json diff --git a/cypress/fixtures/safes/safeapps.json b/apps/web/cypress/fixtures/safes/safeapps.json similarity index 100% rename from cypress/fixtures/safes/safeapps.json rename to apps/web/cypress/fixtures/safes/safeapps.json diff --git a/cypress/fixtures/safes/static.json b/apps/web/cypress/fixtures/safes/static.json similarity index 100% rename from cypress/fixtures/safes/static.json rename to apps/web/cypress/fixtures/safes/static.json diff --git a/cypress/fixtures/sepolia_test_safe_QR.png b/apps/web/cypress/fixtures/sepolia_test_safe_QR.png similarity index 100% rename from cypress/fixtures/sepolia_test_safe_QR.png rename to apps/web/cypress/fixtures/sepolia_test_safe_QR.png diff --git a/cypress/fixtures/staking_data.json b/apps/web/cypress/fixtures/staking_data.json similarity index 100% rename from cypress/fixtures/staking_data.json rename to apps/web/cypress/fixtures/staking_data.json diff --git a/cypress/fixtures/swaps_data.json b/apps/web/cypress/fixtures/swaps_data.json similarity index 100% rename from cypress/fixtures/swaps_data.json rename to apps/web/cypress/fixtures/swaps_data.json diff --git a/cypress/fixtures/test-empty-batch.json b/apps/web/cypress/fixtures/test-empty-batch.json similarity index 100% rename from cypress/fixtures/test-empty-batch.json rename to apps/web/cypress/fixtures/test-empty-batch.json diff --git a/cypress/fixtures/test-invalid-batch.json b/apps/web/cypress/fixtures/test-invalid-batch.json similarity index 100% rename from cypress/fixtures/test-invalid-batch.json rename to apps/web/cypress/fixtures/test-invalid-batch.json diff --git a/cypress/fixtures/test-mainnet-batch.json b/apps/web/cypress/fixtures/test-mainnet-batch.json similarity index 100% rename from cypress/fixtures/test-mainnet-batch.json rename to apps/web/cypress/fixtures/test-mainnet-batch.json diff --git a/cypress/fixtures/test-modified-batch.json b/apps/web/cypress/fixtures/test-modified-batch.json similarity index 100% rename from cypress/fixtures/test-modified-batch.json rename to apps/web/cypress/fixtures/test-modified-batch.json diff --git a/cypress/fixtures/test-working-batch.json b/apps/web/cypress/fixtures/test-working-batch.json similarity index 100% rename from cypress/fixtures/test-working-batch.json rename to apps/web/cypress/fixtures/test-working-batch.json diff --git a/cypress/fixtures/txhistory_data_data.json b/apps/web/cypress/fixtures/txhistory_data_data.json similarity index 100% rename from cypress/fixtures/txhistory_data_data.json rename to apps/web/cypress/fixtures/txhistory_data_data.json diff --git a/cypress/fixtures/txhistory_incoming_data.json b/apps/web/cypress/fixtures/txhistory_incoming_data.json similarity index 100% rename from cypress/fixtures/txhistory_incoming_data.json rename to apps/web/cypress/fixtures/txhistory_incoming_data.json diff --git a/cypress/fixtures/txmessages_data.json b/apps/web/cypress/fixtures/txmessages_data.json similarity index 100% rename from cypress/fixtures/txmessages_data.json rename to apps/web/cypress/fixtures/txmessages_data.json diff --git a/cypress/plugins/index.js b/apps/web/cypress/plugins/index.js similarity index 100% rename from cypress/plugins/index.js rename to apps/web/cypress/plugins/index.js diff --git a/cypress/snapshots/actual/cypress/e2e/regression/tx_decoding.cy.js/tx_decoding.png b/apps/web/cypress/snapshots/actual/cypress/e2e/regression/tx_decoding.cy.js/tx_decoding.png similarity index 100% rename from cypress/snapshots/actual/cypress/e2e/regression/tx_decoding.cy.js/tx_decoding.png rename to apps/web/cypress/snapshots/actual/cypress/e2e/regression/tx_decoding.cy.js/tx_decoding.png diff --git a/cypress/support/api/contracts.js b/apps/web/cypress/support/api/contracts.js similarity index 100% rename from cypress/support/api/contracts.js rename to apps/web/cypress/support/api/contracts.js diff --git a/cypress/support/api/utils_ether.js b/apps/web/cypress/support/api/utils_ether.js similarity index 100% rename from cypress/support/api/utils_ether.js rename to apps/web/cypress/support/api/utils_ether.js diff --git a/cypress/support/api/utils_protocolkit.js b/apps/web/cypress/support/api/utils_protocolkit.js similarity index 100% rename from cypress/support/api/utils_protocolkit.js rename to apps/web/cypress/support/api/utils_protocolkit.js diff --git a/cypress/support/commands.js b/apps/web/cypress/support/commands.js similarity index 100% rename from cypress/support/commands.js rename to apps/web/cypress/support/commands.js diff --git a/cypress/support/constants.js b/apps/web/cypress/support/constants.js similarity index 100% rename from cypress/support/constants.js rename to apps/web/cypress/support/constants.js diff --git a/cypress/support/e2e.js b/apps/web/cypress/support/e2e.js similarity index 100% rename from cypress/support/e2e.js rename to apps/web/cypress/support/e2e.js diff --git a/cypress/support/localstorage_data.js b/apps/web/cypress/support/localstorage_data.js similarity index 100% rename from cypress/support/localstorage_data.js rename to apps/web/cypress/support/localstorage_data.js diff --git a/cypress/support/safe-apps-commands.js b/apps/web/cypress/support/safe-apps-commands.js similarity index 100% rename from cypress/support/safe-apps-commands.js rename to apps/web/cypress/support/safe-apps-commands.js diff --git a/cypress/support/safes/safesHandler.js b/apps/web/cypress/support/safes/safesHandler.js similarity index 100% rename from cypress/support/safes/safesHandler.js rename to apps/web/cypress/support/safes/safesHandler.js diff --git a/cypress/support/utils/checkers.js b/apps/web/cypress/support/utils/checkers.js similarity index 100% rename from cypress/support/utils/checkers.js rename to apps/web/cypress/support/utils/checkers.js diff --git a/cypress/support/utils/ethers.js b/apps/web/cypress/support/utils/ethers.js similarity index 100% rename from cypress/support/utils/ethers.js rename to apps/web/cypress/support/utils/ethers.js diff --git a/cypress/support/utils/gtag.js b/apps/web/cypress/support/utils/gtag.js similarity index 100% rename from cypress/support/utils/gtag.js rename to apps/web/cypress/support/utils/gtag.js diff --git a/cypress/support/utils/txquery.js b/apps/web/cypress/support/utils/txquery.js similarity index 100% rename from cypress/support/utils/txquery.js rename to apps/web/cypress/support/utils/txquery.js diff --git a/cypress/support/utils/wallet.js b/apps/web/cypress/support/utils/wallet.js similarity index 100% rename from cypress/support/utils/wallet.js rename to apps/web/cypress/support/utils/wallet.js diff --git a/docs/code-style.md b/apps/web/docs/code-style.md similarity index 100% rename from docs/code-style.md rename to apps/web/docs/code-style.md diff --git a/docs/environments.md b/apps/web/docs/environments.md similarity index 100% rename from docs/environments.md rename to apps/web/docs/environments.md diff --git a/docs/release-procedure.md b/apps/web/docs/release-procedure.md similarity index 100% rename from docs/release-procedure.md rename to apps/web/docs/release-procedure.md diff --git a/docs/update-terms.md b/apps/web/docs/update-terms.md similarity index 100% rename from docs/update-terms.md rename to apps/web/docs/update-terms.md diff --git a/eslint.config.mjs b/apps/web/eslint.config.mjs similarity index 100% rename from eslint.config.mjs rename to apps/web/eslint.config.mjs diff --git a/jest.config.cjs b/apps/web/jest.config.cjs similarity index 100% rename from jest.config.cjs rename to apps/web/jest.config.cjs diff --git a/jest.setup.js b/apps/web/jest.setup.js similarity index 100% rename from jest.setup.js rename to apps/web/jest.setup.js diff --git a/mocks/svg.js b/apps/web/mocks/svg.js similarity index 100% rename from mocks/svg.js rename to apps/web/mocks/svg.js diff --git a/next-env.d.ts b/apps/web/next-env.d.ts similarity index 100% rename from next-env.d.ts rename to apps/web/next-env.d.ts diff --git a/next.config.mjs b/apps/web/next.config.mjs similarity index 100% rename from next.config.mjs rename to apps/web/next.config.mjs diff --git a/package.json b/apps/web/package.json similarity index 100% rename from package.json rename to apps/web/package.json diff --git a/public/.well-known/apple-app-site-association b/apps/web/public/.well-known/apple-app-site-association similarity index 100% rename from public/.well-known/apple-app-site-association rename to apps/web/public/.well-known/apple-app-site-association diff --git a/public/favicon.ico b/apps/web/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to apps/web/public/favicon.ico diff --git a/public/favicons/android-chrome-192x192.png b/apps/web/public/favicons/android-chrome-192x192.png similarity index 100% rename from public/favicons/android-chrome-192x192.png rename to apps/web/public/favicons/android-chrome-192x192.png diff --git a/public/favicons/android-chrome-512x512.png b/apps/web/public/favicons/android-chrome-512x512.png similarity index 100% rename from public/favicons/android-chrome-512x512.png rename to apps/web/public/favicons/android-chrome-512x512.png diff --git a/public/favicons/apple-touch-icon.png b/apps/web/public/favicons/apple-touch-icon.png similarity index 100% rename from public/favicons/apple-touch-icon.png rename to apps/web/public/favicons/apple-touch-icon.png diff --git a/public/favicons/favicon-16x16.png b/apps/web/public/favicons/favicon-16x16.png similarity index 100% rename from public/favicons/favicon-16x16.png rename to apps/web/public/favicons/favicon-16x16.png diff --git a/public/favicons/favicon-32x32.png b/apps/web/public/favicons/favicon-32x32.png similarity index 100% rename from public/favicons/favicon-32x32.png rename to apps/web/public/favicons/favicon-32x32.png diff --git a/public/favicons/favicon-dot.ico b/apps/web/public/favicons/favicon-dot.ico similarity index 100% rename from public/favicons/favicon-dot.ico rename to apps/web/public/favicons/favicon-dot.ico diff --git a/public/favicons/favicon.ico b/apps/web/public/favicons/favicon.ico similarity index 100% rename from public/favicons/favicon.ico rename to apps/web/public/favicons/favicon.ico diff --git a/public/favicons/logo_120x120.png b/apps/web/public/favicons/logo_120x120.png similarity index 100% rename from public/favicons/logo_120x120.png rename to apps/web/public/favicons/logo_120x120.png diff --git a/public/favicons/mstile-144x144.png b/apps/web/public/favicons/mstile-144x144.png similarity index 100% rename from public/favicons/mstile-144x144.png rename to apps/web/public/favicons/mstile-144x144.png diff --git a/public/favicons/mstile-150x150.png b/apps/web/public/favicons/mstile-150x150.png similarity index 100% rename from public/favicons/mstile-150x150.png rename to apps/web/public/favicons/mstile-150x150.png diff --git a/public/favicons/mstile-310x150.png b/apps/web/public/favicons/mstile-310x150.png similarity index 100% rename from public/favicons/mstile-310x150.png rename to apps/web/public/favicons/mstile-310x150.png diff --git a/public/favicons/mstile-310x310.png b/apps/web/public/favicons/mstile-310x310.png similarity index 100% rename from public/favicons/mstile-310x310.png rename to apps/web/public/favicons/mstile-310x310.png diff --git a/public/favicons/mstile-70x70.png b/apps/web/public/favicons/mstile-70x70.png similarity index 100% rename from public/favicons/mstile-70x70.png rename to apps/web/public/favicons/mstile-70x70.png diff --git a/public/favicons/safari-pinned-tab.svg b/apps/web/public/favicons/safari-pinned-tab.svg similarity index 100% rename from public/favicons/safari-pinned-tab.svg rename to apps/web/public/favicons/safari-pinned-tab.svg diff --git a/public/fonts/DMSans700.woff2 b/apps/web/public/fonts/DMSans700.woff2 similarity index 100% rename from public/fonts/DMSans700.woff2 rename to apps/web/public/fonts/DMSans700.woff2 diff --git a/public/fonts/DMSansRegular.woff2 b/apps/web/public/fonts/DMSansRegular.woff2 similarity index 100% rename from public/fonts/DMSansRegular.woff2 rename to apps/web/public/fonts/DMSansRegular.woff2 diff --git a/public/fonts/fonts.css b/apps/web/public/fonts/fonts.css similarity index 100% rename from public/fonts/fonts.css rename to apps/web/public/fonts/fonts.css diff --git a/public/images/address-book/address-book.svg b/apps/web/public/images/address-book/address-book.svg similarity index 100% rename from public/images/address-book/address-book.svg rename to apps/web/public/images/address-book/address-book.svg diff --git a/public/images/address-book/no-entries.svg b/apps/web/public/images/address-book/no-entries.svg similarity index 100% rename from public/images/address-book/no-entries.svg rename to apps/web/public/images/address-book/no-entries.svg diff --git a/public/images/apps/add-custom-app.svg b/apps/web/public/images/apps/add-custom-app.svg similarity index 100% rename from public/images/apps/add-custom-app.svg rename to apps/web/public/images/apps/add-custom-app.svg diff --git a/public/images/apps/app-placeholder.svg b/apps/web/public/images/apps/app-placeholder.svg similarity index 100% rename from public/images/apps/app-placeholder.svg rename to apps/web/public/images/apps/app-placeholder.svg diff --git a/public/images/apps/apps-demo.svg b/apps/web/public/images/apps/apps-demo.svg similarity index 100% rename from public/images/apps/apps-demo.svg rename to apps/web/public/images/apps/apps-demo.svg diff --git a/public/images/apps/apps-icon.svg b/apps/web/public/images/apps/apps-icon.svg similarity index 100% rename from public/images/apps/apps-icon.svg rename to apps/web/public/images/apps/apps-icon.svg diff --git a/public/images/apps/batch-icon.svg b/apps/web/public/images/apps/batch-icon.svg similarity index 100% rename from public/images/apps/batch-icon.svg rename to apps/web/public/images/apps/batch-icon.svg diff --git a/public/images/apps/bookmark.svg b/apps/web/public/images/apps/bookmark.svg similarity index 100% rename from public/images/apps/bookmark.svg rename to apps/web/public/images/apps/bookmark.svg diff --git a/public/images/apps/bookmarked.svg b/apps/web/public/images/apps/bookmarked.svg similarity index 100% rename from public/images/apps/bookmarked.svg rename to apps/web/public/images/apps/bookmarked.svg diff --git a/public/images/apps/code-icon.svg b/apps/web/public/images/apps/code-icon.svg similarity index 100% rename from public/images/apps/code-icon.svg rename to apps/web/public/images/apps/code-icon.svg diff --git a/public/images/apps/explore.svg b/apps/web/public/images/apps/explore.svg similarity index 100% rename from public/images/apps/explore.svg rename to apps/web/public/images/apps/explore.svg diff --git a/public/images/apps/grid-view-icon.svg b/apps/web/public/images/apps/grid-view-icon.svg similarity index 100% rename from public/images/apps/grid-view-icon.svg rename to apps/web/public/images/apps/grid-view-icon.svg diff --git a/public/images/apps/list-view-icon.svg b/apps/web/public/images/apps/list-view-icon.svg similarity index 100% rename from public/images/apps/list-view-icon.svg rename to apps/web/public/images/apps/list-view-icon.svg diff --git a/public/images/apps/network-error.svg b/apps/web/public/images/apps/network-error.svg similarity index 100% rename from public/images/apps/network-error.svg rename to apps/web/public/images/apps/network-error.svg diff --git a/public/images/balances/no-assets.svg b/apps/web/public/images/balances/no-assets.svg similarity index 100% rename from public/images/balances/no-assets.svg rename to apps/web/public/images/balances/no-assets.svg diff --git a/public/images/common/add-outlined.svg b/apps/web/public/images/common/add-outlined.svg similarity index 100% rename from public/images/common/add-outlined.svg rename to apps/web/public/images/common/add-outlined.svg diff --git a/public/images/common/add.svg b/apps/web/public/images/common/add.svg similarity index 100% rename from public/images/common/add.svg rename to apps/web/public/images/common/add.svg diff --git a/public/images/common/alert.svg b/apps/web/public/images/common/alert.svg similarity index 100% rename from public/images/common/alert.svg rename to apps/web/public/images/common/alert.svg diff --git a/public/images/common/arrow-down.svg b/apps/web/public/images/common/arrow-down.svg similarity index 100% rename from public/images/common/arrow-down.svg rename to apps/web/public/images/common/arrow-down.svg diff --git a/public/images/common/arrow-nw.svg b/apps/web/public/images/common/arrow-nw.svg similarity index 100% rename from public/images/common/arrow-nw.svg rename to apps/web/public/images/common/arrow-nw.svg diff --git a/public/images/common/arrow-se.svg b/apps/web/public/images/common/arrow-se.svg similarity index 100% rename from public/images/common/arrow-se.svg rename to apps/web/public/images/common/arrow-se.svg diff --git a/public/images/common/arrow-top-right.svg b/apps/web/public/images/common/arrow-top-right.svg similarity index 100% rename from public/images/common/arrow-top-right.svg rename to apps/web/public/images/common/arrow-top-right.svg diff --git a/public/images/common/asterix.svg b/apps/web/public/images/common/asterix.svg similarity index 100% rename from public/images/common/asterix.svg rename to apps/web/public/images/common/asterix.svg diff --git a/public/images/common/bar-chart.svg b/apps/web/public/images/common/bar-chart.svg similarity index 100% rename from public/images/common/bar-chart.svg rename to apps/web/public/images/common/bar-chart.svg diff --git a/public/images/common/batch.svg b/apps/web/public/images/common/batch.svg similarity index 100% rename from public/images/common/batch.svg rename to apps/web/public/images/common/batch.svg diff --git a/public/images/common/block.svg b/apps/web/public/images/common/block.svg similarity index 100% rename from public/images/common/block.svg rename to apps/web/public/images/common/block.svg diff --git a/public/images/common/bridge.svg b/apps/web/public/images/common/bridge.svg similarity index 100% rename from public/images/common/bridge.svg rename to apps/web/public/images/common/bridge.svg diff --git a/public/images/common/cancel.svg b/apps/web/public/images/common/cancel.svg similarity index 100% rename from public/images/common/cancel.svg rename to apps/web/public/images/common/cancel.svg diff --git a/public/images/common/caret-down.svg b/apps/web/public/images/common/caret-down.svg similarity index 100% rename from public/images/common/caret-down.svg rename to apps/web/public/images/common/caret-down.svg diff --git a/public/images/common/check-filled.svg b/apps/web/public/images/common/check-filled.svg similarity index 100% rename from public/images/common/check-filled.svg rename to apps/web/public/images/common/check-filled.svg diff --git a/public/images/common/check.svg b/apps/web/public/images/common/check.svg similarity index 100% rename from public/images/common/check.svg rename to apps/web/public/images/common/check.svg diff --git a/public/images/common/circle-check.svg b/apps/web/public/images/common/circle-check.svg similarity index 100% rename from public/images/common/circle-check.svg rename to apps/web/public/images/common/circle-check.svg diff --git a/public/images/common/circle-partial-fill.svg b/apps/web/public/images/common/circle-partial-fill.svg similarity index 100% rename from public/images/common/circle-partial-fill.svg rename to apps/web/public/images/common/circle-partial-fill.svg diff --git a/public/images/common/circle.svg b/apps/web/public/images/common/circle.svg similarity index 100% rename from public/images/common/circle.svg rename to apps/web/public/images/common/circle.svg diff --git a/public/images/common/clock.svg b/apps/web/public/images/common/clock.svg similarity index 100% rename from public/images/common/clock.svg rename to apps/web/public/images/common/clock.svg diff --git a/public/images/common/close.svg b/apps/web/public/images/common/close.svg similarity index 100% rename from public/images/common/close.svg rename to apps/web/public/images/common/close.svg diff --git a/public/images/common/connection-dots.svg b/apps/web/public/images/common/connection-dots.svg similarity index 100% rename from public/images/common/connection-dots.svg rename to apps/web/public/images/common/connection-dots.svg diff --git a/public/images/common/copy.svg b/apps/web/public/images/common/copy.svg similarity index 100% rename from public/images/common/copy.svg rename to apps/web/public/images/common/copy.svg diff --git a/public/images/common/created.svg b/apps/web/public/images/common/created.svg similarity index 100% rename from public/images/common/created.svg rename to apps/web/public/images/common/created.svg diff --git a/public/images/common/delete.svg b/apps/web/public/images/common/delete.svg similarity index 100% rename from public/images/common/delete.svg rename to apps/web/public/images/common/delete.svg diff --git a/public/images/common/discord-icon.svg b/apps/web/public/images/common/discord-icon.svg similarity index 100% rename from public/images/common/discord-icon.svg rename to apps/web/public/images/common/discord-icon.svg diff --git a/public/images/common/document_signature.svg b/apps/web/public/images/common/document_signature.svg similarity index 100% rename from public/images/common/document_signature.svg rename to apps/web/public/images/common/document_signature.svg diff --git a/public/images/common/dot.svg b/apps/web/public/images/common/dot.svg similarity index 100% rename from public/images/common/dot.svg rename to apps/web/public/images/common/dot.svg diff --git a/public/images/common/download-cloud.svg b/apps/web/public/images/common/download-cloud.svg similarity index 100% rename from public/images/common/download-cloud.svg rename to apps/web/public/images/common/download-cloud.svg diff --git a/public/images/common/drag.svg b/apps/web/public/images/common/drag.svg similarity index 100% rename from public/images/common/drag.svg rename to apps/web/public/images/common/drag.svg diff --git a/public/images/common/edit.svg b/apps/web/public/images/common/edit.svg similarity index 100% rename from public/images/common/edit.svg rename to apps/web/public/images/common/edit.svg diff --git a/public/images/common/empty-batch.svg b/apps/web/public/images/common/empty-batch.svg similarity index 100% rename from public/images/common/empty-batch.svg rename to apps/web/public/images/common/empty-batch.svg diff --git a/public/images/common/error.png b/apps/web/public/images/common/error.png similarity index 100% rename from public/images/common/error.png rename to apps/web/public/images/common/error.png diff --git a/public/images/common/export.svg b/apps/web/public/images/common/export.svg similarity index 100% rename from public/images/common/export.svg rename to apps/web/public/images/common/export.svg diff --git a/public/images/common/gas-station.svg b/apps/web/public/images/common/gas-station.svg similarity index 100% rename from public/images/common/gas-station.svg rename to apps/web/public/images/common/gas-station.svg diff --git a/public/images/common/gnosis-chain-logo.png b/apps/web/public/images/common/gnosis-chain-logo.png similarity index 100% rename from public/images/common/gnosis-chain-logo.png rename to apps/web/public/images/common/gnosis-chain-logo.png diff --git a/public/images/common/ic-rocket-speedup.svg b/apps/web/public/images/common/ic-rocket-speedup.svg similarity index 100% rename from public/images/common/ic-rocket-speedup.svg rename to apps/web/public/images/common/ic-rocket-speedup.svg diff --git a/public/images/common/ic-swaps.svg b/apps/web/public/images/common/ic-swaps.svg similarity index 100% rename from public/images/common/ic-swaps.svg rename to apps/web/public/images/common/ic-swaps.svg diff --git a/public/images/common/import.svg b/apps/web/public/images/common/import.svg similarity index 100% rename from public/images/common/import.svg rename to apps/web/public/images/common/import.svg diff --git a/public/images/common/kiln.svg b/apps/web/public/images/common/kiln.svg similarity index 100% rename from public/images/common/kiln.svg rename to apps/web/public/images/common/kiln.svg diff --git a/public/images/common/lightbulb.svg b/apps/web/public/images/common/lightbulb.svg similarity index 100% rename from public/images/common/lightbulb.svg rename to apps/web/public/images/common/lightbulb.svg diff --git a/public/images/common/link.svg b/apps/web/public/images/common/link.svg similarity index 100% rename from public/images/common/link.svg rename to apps/web/public/images/common/link.svg diff --git a/public/images/common/loading.svg b/apps/web/public/images/common/loading.svg similarity index 100% rename from public/images/common/loading.svg rename to apps/web/public/images/common/loading.svg diff --git a/public/images/common/lock-small.svg b/apps/web/public/images/common/lock-small.svg similarity index 100% rename from public/images/common/lock-small.svg rename to apps/web/public/images/common/lock-small.svg diff --git a/public/images/common/lock-warning.svg b/apps/web/public/images/common/lock-warning.svg similarity index 100% rename from public/images/common/lock-warning.svg rename to apps/web/public/images/common/lock-warning.svg diff --git a/public/images/common/lock.svg b/apps/web/public/images/common/lock.svg similarity index 100% rename from public/images/common/lock.svg rename to apps/web/public/images/common/lock.svg diff --git a/public/images/common/minus.svg b/apps/web/public/images/common/minus.svg similarity index 100% rename from public/images/common/minus.svg rename to apps/web/public/images/common/minus.svg diff --git a/public/images/common/multisend.svg b/apps/web/public/images/common/multisend.svg similarity index 100% rename from public/images/common/multisend.svg rename to apps/web/public/images/common/multisend.svg diff --git a/public/images/common/network-error.svg b/apps/web/public/images/common/network-error.svg similarity index 100% rename from public/images/common/network-error.svg rename to apps/web/public/images/common/network-error.svg diff --git a/public/images/common/nft-atomic0.svg b/apps/web/public/images/common/nft-atomic0.svg similarity index 100% rename from public/images/common/nft-atomic0.svg rename to apps/web/public/images/common/nft-atomic0.svg diff --git a/public/images/common/nft-blur.svg b/apps/web/public/images/common/nft-blur.svg similarity index 100% rename from public/images/common/nft-blur.svg rename to apps/web/public/images/common/nft-blur.svg diff --git a/public/images/common/nft-etherscan.svg b/apps/web/public/images/common/nft-etherscan.svg similarity index 100% rename from public/images/common/nft-etherscan.svg rename to apps/web/public/images/common/nft-etherscan.svg diff --git a/public/images/common/nft-gnosisscan.svg b/apps/web/public/images/common/nft-gnosisscan.svg similarity index 100% rename from public/images/common/nft-gnosisscan.svg rename to apps/web/public/images/common/nft-gnosisscan.svg diff --git a/public/images/common/nft-opensea.svg b/apps/web/public/images/common/nft-opensea.svg similarity index 100% rename from public/images/common/nft-opensea.svg rename to apps/web/public/images/common/nft-opensea.svg diff --git a/public/images/common/nft-placeholder.png b/apps/web/public/images/common/nft-placeholder.png similarity index 100% rename from public/images/common/nft-placeholder.png rename to apps/web/public/images/common/nft-placeholder.png diff --git a/public/images/common/nft-polygonscan.svg b/apps/web/public/images/common/nft-polygonscan.svg similarity index 100% rename from public/images/common/nft-polygonscan.svg rename to apps/web/public/images/common/nft-polygonscan.svg diff --git a/public/images/common/nft-zapper.svg b/apps/web/public/images/common/nft-zapper.svg similarity index 100% rename from public/images/common/nft-zapper.svg rename to apps/web/public/images/common/nft-zapper.svg diff --git a/public/images/common/nft-zerion.svg b/apps/web/public/images/common/nft-zerion.svg similarity index 100% rename from public/images/common/nft-zerion.svg rename to apps/web/public/images/common/nft-zerion.svg diff --git a/public/images/common/nft.svg b/apps/web/public/images/common/nft.svg similarity index 100% rename from public/images/common/nft.svg rename to apps/web/public/images/common/nft.svg diff --git a/public/images/common/notifications.svg b/apps/web/public/images/common/notifications.svg similarity index 100% rename from public/images/common/notifications.svg rename to apps/web/public/images/common/notifications.svg diff --git a/public/images/common/outreach-popup-avatar.png b/apps/web/public/images/common/outreach-popup-avatar.png similarity index 100% rename from public/images/common/outreach-popup-avatar.png rename to apps/web/public/images/common/outreach-popup-avatar.png diff --git a/public/images/common/owners.svg b/apps/web/public/images/common/owners.svg similarity index 100% rename from public/images/common/owners.svg rename to apps/web/public/images/common/owners.svg diff --git a/public/images/common/plus.svg b/apps/web/public/images/common/plus.svg similarity index 100% rename from public/images/common/plus.svg rename to apps/web/public/images/common/plus.svg diff --git a/public/images/common/propose-recovery-dark.svg b/apps/web/public/images/common/propose-recovery-dark.svg similarity index 100% rename from public/images/common/propose-recovery-dark.svg rename to apps/web/public/images/common/propose-recovery-dark.svg diff --git a/public/images/common/propose-recovery-light.svg b/apps/web/public/images/common/propose-recovery-light.svg similarity index 100% rename from public/images/common/propose-recovery-light.svg rename to apps/web/public/images/common/propose-recovery-light.svg diff --git a/public/images/common/qr.svg b/apps/web/public/images/common/qr.svg similarity index 100% rename from public/images/common/qr.svg rename to apps/web/public/images/common/qr.svg diff --git a/public/images/common/question.svg b/apps/web/public/images/common/question.svg similarity index 100% rename from public/images/common/question.svg rename to apps/web/public/images/common/question.svg diff --git a/public/images/common/ramp_logo.svg b/apps/web/public/images/common/ramp_logo.svg similarity index 100% rename from public/images/common/ramp_logo.svg rename to apps/web/public/images/common/ramp_logo.svg diff --git a/public/images/common/recovery-pending.svg b/apps/web/public/images/common/recovery-pending.svg similarity index 100% rename from public/images/common/recovery-pending.svg rename to apps/web/public/images/common/recovery-pending.svg diff --git a/public/images/common/recovery-plus.svg b/apps/web/public/images/common/recovery-plus.svg similarity index 100% rename from public/images/common/recovery-plus.svg rename to apps/web/public/images/common/recovery-plus.svg diff --git a/public/images/common/recovery.svg b/apps/web/public/images/common/recovery.svg similarity index 100% rename from public/images/common/recovery.svg rename to apps/web/public/images/common/recovery.svg diff --git a/public/images/common/recovery_custom.svg b/apps/web/public/images/common/recovery_custom.svg similarity index 100% rename from public/images/common/recovery_custom.svg rename to apps/web/public/images/common/recovery_custom.svg diff --git a/public/images/common/recovery_sygnum.svg b/apps/web/public/images/common/recovery_sygnum.svg similarity index 100% rename from public/images/common/recovery_sygnum.svg rename to apps/web/public/images/common/recovery_sygnum.svg diff --git a/public/images/common/relayer.svg b/apps/web/public/images/common/relayer.svg similarity index 100% rename from public/images/common/relayer.svg rename to apps/web/public/images/common/relayer.svg diff --git a/public/images/common/rocket.svg b/apps/web/public/images/common/rocket.svg similarity index 100% rename from public/images/common/rocket.svg rename to apps/web/public/images/common/rocket.svg diff --git a/public/images/common/safe-pass-logo.svg b/apps/web/public/images/common/safe-pass-logo.svg similarity index 100% rename from public/images/common/safe-pass-logo.svg rename to apps/web/public/images/common/safe-pass-logo.svg diff --git a/public/images/common/safe-pass-star.svg b/apps/web/public/images/common/safe-pass-star.svg similarity index 100% rename from public/images/common/safe-pass-star.svg rename to apps/web/public/images/common/safe-pass-star.svg diff --git a/public/images/common/safe-swap-dark.svg b/apps/web/public/images/common/safe-swap-dark.svg similarity index 100% rename from public/images/common/safe-swap-dark.svg rename to apps/web/public/images/common/safe-swap-dark.svg diff --git a/public/images/common/safe-swap.svg b/apps/web/public/images/common/safe-swap.svg similarity index 100% rename from public/images/common/safe-swap.svg rename to apps/web/public/images/common/safe-swap.svg diff --git a/public/images/common/safe-token.svg b/apps/web/public/images/common/safe-token.svg similarity index 100% rename from public/images/common/safe-token.svg rename to apps/web/public/images/common/safe-token.svg diff --git a/public/images/common/save-address.svg b/apps/web/public/images/common/save-address.svg similarity index 100% rename from public/images/common/save-address.svg rename to apps/web/public/images/common/save-address.svg diff --git a/public/images/common/search.svg b/apps/web/public/images/common/search.svg similarity index 100% rename from public/images/common/search.svg rename to apps/web/public/images/common/search.svg diff --git a/public/images/common/share.svg b/apps/web/public/images/common/share.svg similarity index 100% rename from public/images/common/share.svg rename to apps/web/public/images/common/share.svg diff --git a/public/images/common/shield-off.svg b/apps/web/public/images/common/shield-off.svg similarity index 100% rename from public/images/common/shield-off.svg rename to apps/web/public/images/common/shield-off.svg diff --git a/public/images/common/shield.svg b/apps/web/public/images/common/shield.svg similarity index 100% rename from public/images/common/shield.svg rename to apps/web/public/images/common/shield.svg diff --git a/public/images/common/stake-illustration-dark.svg b/apps/web/public/images/common/stake-illustration-dark.svg similarity index 100% rename from public/images/common/stake-illustration-dark.svg rename to apps/web/public/images/common/stake-illustration-dark.svg diff --git a/public/images/common/stake-illustration-light.svg b/apps/web/public/images/common/stake-illustration-light.svg similarity index 100% rename from public/images/common/stake-illustration-light.svg rename to apps/web/public/images/common/stake-illustration-light.svg diff --git a/public/images/common/stake.svg b/apps/web/public/images/common/stake.svg similarity index 100% rename from public/images/common/stake.svg rename to apps/web/public/images/common/stake.svg diff --git a/public/images/common/success.svg b/apps/web/public/images/common/success.svg similarity index 100% rename from public/images/common/success.svg rename to apps/web/public/images/common/success.svg diff --git a/public/images/common/swap-empty-dark.svg b/apps/web/public/images/common/swap-empty-dark.svg similarity index 100% rename from public/images/common/swap-empty-dark.svg rename to apps/web/public/images/common/swap-empty-dark.svg diff --git a/public/images/common/swap-empty-light.svg b/apps/web/public/images/common/swap-empty-light.svg similarity index 100% rename from public/images/common/swap-empty-light.svg rename to apps/web/public/images/common/swap-empty-light.svg diff --git a/public/images/common/swap.svg b/apps/web/public/images/common/swap.svg similarity index 100% rename from public/images/common/swap.svg rename to apps/web/public/images/common/swap.svg diff --git a/public/images/common/token-placeholder.svg b/apps/web/public/images/common/token-placeholder.svg similarity index 100% rename from public/images/common/token-placeholder.svg rename to apps/web/public/images/common/token-placeholder.svg diff --git a/public/images/common/tx-failed.svg b/apps/web/public/images/common/tx-failed.svg similarity index 100% rename from public/images/common/tx-failed.svg rename to apps/web/public/images/common/tx-failed.svg diff --git a/public/images/common/walletconnect.svg b/apps/web/public/images/common/walletconnect.svg similarity index 100% rename from public/images/common/walletconnect.svg rename to apps/web/public/images/common/walletconnect.svg diff --git a/public/images/common/zkemail-logo.svg b/apps/web/public/images/common/zkemail-logo.svg similarity index 100% rename from public/images/common/zkemail-logo.svg rename to apps/web/public/images/common/zkemail-logo.svg diff --git a/public/images/logo-no-text.svg b/apps/web/public/images/logo-no-text.svg similarity index 100% rename from public/images/logo-no-text.svg rename to apps/web/public/images/logo-no-text.svg diff --git a/public/images/logo-round.svg b/apps/web/public/images/logo-round.svg similarity index 100% rename from public/images/logo-round.svg rename to apps/web/public/images/logo-round.svg diff --git a/public/images/logo-text.svg b/apps/web/public/images/logo-text.svg similarity index 100% rename from public/images/logo-text.svg rename to apps/web/public/images/logo-text.svg diff --git a/public/images/logo.svg b/apps/web/public/images/logo.svg similarity index 100% rename from public/images/logo.svg rename to apps/web/public/images/logo.svg diff --git a/public/images/messages/created.svg b/apps/web/public/images/messages/created.svg similarity index 100% rename from public/images/messages/created.svg rename to apps/web/public/images/messages/created.svg diff --git a/public/images/messages/dot.svg b/apps/web/public/images/messages/dot.svg similarity index 100% rename from public/images/messages/dot.svg rename to apps/web/public/images/messages/dot.svg diff --git a/public/images/messages/link.svg b/apps/web/public/images/messages/link.svg similarity index 100% rename from public/images/messages/link.svg rename to apps/web/public/images/messages/link.svg diff --git a/public/images/messages/no-messages.svg b/apps/web/public/images/messages/no-messages.svg similarity index 100% rename from public/images/messages/no-messages.svg rename to apps/web/public/images/messages/no-messages.svg diff --git a/public/images/messages/required.svg b/apps/web/public/images/messages/required.svg similarity index 100% rename from public/images/messages/required.svg rename to apps/web/public/images/messages/required.svg diff --git a/public/images/messages/signed.svg b/apps/web/public/images/messages/signed.svg similarity index 100% rename from public/images/messages/signed.svg rename to apps/web/public/images/messages/signed.svg diff --git a/public/images/notifications/alert.svg b/apps/web/public/images/notifications/alert.svg similarity index 100% rename from public/images/notifications/alert.svg rename to apps/web/public/images/notifications/alert.svg diff --git a/public/images/notifications/error.svg b/apps/web/public/images/notifications/error.svg similarity index 100% rename from public/images/notifications/error.svg rename to apps/web/public/images/notifications/error.svg diff --git a/public/images/notifications/info.svg b/apps/web/public/images/notifications/info.svg similarity index 100% rename from public/images/notifications/info.svg rename to apps/web/public/images/notifications/info.svg diff --git a/public/images/notifications/no-notifications.svg b/apps/web/public/images/notifications/no-notifications.svg similarity index 100% rename from public/images/notifications/no-notifications.svg rename to apps/web/public/images/notifications/no-notifications.svg diff --git a/public/images/notifications/push-notification.svg b/apps/web/public/images/notifications/push-notification.svg similarity index 100% rename from public/images/notifications/push-notification.svg rename to apps/web/public/images/notifications/push-notification.svg diff --git a/public/images/notifications/success.svg b/apps/web/public/images/notifications/success.svg similarity index 100% rename from public/images/notifications/success.svg rename to apps/web/public/images/notifications/success.svg diff --git a/public/images/notifications/warning.svg b/apps/web/public/images/notifications/warning.svg similarity index 100% rename from public/images/notifications/warning.svg rename to apps/web/public/images/notifications/warning.svg diff --git a/public/images/open/safe-creation-error.svg b/apps/web/public/images/open/safe-creation-error.svg similarity index 100% rename from public/images/open/safe-creation-error.svg rename to apps/web/public/images/open/safe-creation-error.svg diff --git a/public/images/open/safe-creation-process.gif b/apps/web/public/images/open/safe-creation-process.gif similarity index 100% rename from public/images/open/safe-creation-process.gif rename to apps/web/public/images/open/safe-creation-process.gif diff --git a/public/images/open/safe-creation.svg b/apps/web/public/images/open/safe-creation.svg similarity index 100% rename from public/images/open/safe-creation.svg rename to apps/web/public/images/open/safe-creation.svg diff --git a/public/images/safe-logo-green.png b/apps/web/public/images/safe-logo-green.png similarity index 100% rename from public/images/safe-logo-green.png rename to apps/web/public/images/safe-logo-green.png diff --git a/public/images/settings/data/file.svg b/apps/web/public/images/settings/data/file.svg similarity index 100% rename from public/images/settings/data/file.svg rename to apps/web/public/images/settings/data/file.svg diff --git a/public/images/settings/permissions/shield.svg b/apps/web/public/images/settings/permissions/shield.svg similarity index 100% rename from public/images/settings/permissions/shield.svg rename to apps/web/public/images/settings/permissions/shield.svg diff --git a/public/images/settings/setup/replace-owner.svg b/apps/web/public/images/settings/setup/replace-owner.svg similarity index 100% rename from public/images/settings/setup/replace-owner.svg rename to apps/web/public/images/settings/setup/replace-owner.svg diff --git a/public/images/settings/spending-limit/asset-amount.svg b/apps/web/public/images/settings/spending-limit/asset-amount.svg similarity index 100% rename from public/images/settings/spending-limit/asset-amount.svg rename to apps/web/public/images/settings/spending-limit/asset-amount.svg diff --git a/public/images/settings/spending-limit/beneficiary.svg b/apps/web/public/images/settings/spending-limit/beneficiary.svg similarity index 100% rename from public/images/settings/spending-limit/beneficiary.svg rename to apps/web/public/images/settings/spending-limit/beneficiary.svg diff --git a/public/images/settings/spending-limit/speed.svg b/apps/web/public/images/settings/spending-limit/speed.svg similarity index 100% rename from public/images/settings/spending-limit/speed.svg rename to apps/web/public/images/settings/spending-limit/speed.svg diff --git a/public/images/settings/spending-limit/time.svg b/apps/web/public/images/settings/spending-limit/time.svg similarity index 100% rename from public/images/settings/spending-limit/time.svg rename to apps/web/public/images/settings/spending-limit/time.svg diff --git a/public/images/sidebar/address-book.svg b/apps/web/public/images/sidebar/address-book.svg similarity index 100% rename from public/images/sidebar/address-book.svg rename to apps/web/public/images/sidebar/address-book.svg diff --git a/public/images/sidebar/apps.svg b/apps/web/public/images/sidebar/apps.svg similarity index 100% rename from public/images/sidebar/apps.svg rename to apps/web/public/images/sidebar/apps.svg diff --git a/public/images/sidebar/assets.svg b/apps/web/public/images/sidebar/assets.svg similarity index 100% rename from public/images/sidebar/assets.svg rename to apps/web/public/images/sidebar/assets.svg diff --git a/public/images/sidebar/copy-bold.svg b/apps/web/public/images/sidebar/copy-bold.svg similarity index 100% rename from public/images/sidebar/copy-bold.svg rename to apps/web/public/images/sidebar/copy-bold.svg diff --git a/public/images/sidebar/help-center.svg b/apps/web/public/images/sidebar/help-center.svg similarity index 100% rename from public/images/sidebar/help-center.svg rename to apps/web/public/images/sidebar/help-center.svg diff --git a/public/images/sidebar/home.svg b/apps/web/public/images/sidebar/home.svg similarity index 100% rename from public/images/sidebar/home.svg rename to apps/web/public/images/sidebar/home.svg diff --git a/public/images/sidebar/link-bold.svg b/apps/web/public/images/sidebar/link-bold.svg similarity index 100% rename from public/images/sidebar/link-bold.svg rename to apps/web/public/images/sidebar/link-bold.svg diff --git a/public/images/sidebar/link.svg b/apps/web/public/images/sidebar/link.svg similarity index 100% rename from public/images/sidebar/link.svg rename to apps/web/public/images/sidebar/link.svg diff --git a/public/images/sidebar/multichain-account.svg b/apps/web/public/images/sidebar/multichain-account.svg similarity index 100% rename from public/images/sidebar/multichain-account.svg rename to apps/web/public/images/sidebar/multichain-account.svg diff --git a/public/images/sidebar/qr-bold.svg b/apps/web/public/images/sidebar/qr-bold.svg similarity index 100% rename from public/images/sidebar/qr-bold.svg rename to apps/web/public/images/sidebar/qr-bold.svg diff --git a/public/images/sidebar/settings.svg b/apps/web/public/images/sidebar/settings.svg similarity index 100% rename from public/images/sidebar/settings.svg rename to apps/web/public/images/sidebar/settings.svg diff --git a/public/images/sidebar/transactions.svg b/apps/web/public/images/sidebar/transactions.svg similarity index 100% rename from public/images/sidebar/transactions.svg rename to apps/web/public/images/sidebar/transactions.svg diff --git a/public/images/sidebar/whats-new.svg b/apps/web/public/images/sidebar/whats-new.svg similarity index 100% rename from public/images/sidebar/whats-new.svg rename to apps/web/public/images/sidebar/whats-new.svg diff --git a/public/images/social-share.png b/apps/web/public/images/social-share.png similarity index 100% rename from public/images/social-share.png rename to apps/web/public/images/social-share.png diff --git a/public/images/transactions/blockaid-icon.svg b/apps/web/public/images/transactions/blockaid-icon.svg similarity index 100% rename from public/images/transactions/blockaid-icon.svg rename to apps/web/public/images/transactions/blockaid-icon.svg diff --git a/public/images/transactions/circle-cross-red.svg b/apps/web/public/images/transactions/circle-cross-red.svg similarity index 100% rename from public/images/transactions/circle-cross-red.svg rename to apps/web/public/images/transactions/circle-cross-red.svg diff --git a/public/images/transactions/custom.svg b/apps/web/public/images/transactions/custom.svg similarity index 100% rename from public/images/transactions/custom.svg rename to apps/web/public/images/transactions/custom.svg diff --git a/public/images/transactions/ghost.svg b/apps/web/public/images/transactions/ghost.svg similarity index 100% rename from public/images/transactions/ghost.svg rename to apps/web/public/images/transactions/ghost.svg diff --git a/public/images/transactions/incoming.svg b/apps/web/public/images/transactions/incoming.svg similarity index 100% rename from public/images/transactions/incoming.svg rename to apps/web/public/images/transactions/incoming.svg diff --git a/public/images/transactions/nestedTx.svg b/apps/web/public/images/transactions/nestedTx.svg similarity index 100% rename from public/images/transactions/nestedTx.svg rename to apps/web/public/images/transactions/nestedTx.svg diff --git a/public/images/transactions/new-tx.svg b/apps/web/public/images/transactions/new-tx.svg similarity index 100% rename from public/images/transactions/new-tx.svg rename to apps/web/public/images/transactions/new-tx.svg diff --git a/public/images/transactions/no-transactions.svg b/apps/web/public/images/transactions/no-transactions.svg similarity index 100% rename from public/images/transactions/no-transactions.svg rename to apps/web/public/images/transactions/no-transactions.svg diff --git a/public/images/transactions/outgoing.svg b/apps/web/public/images/transactions/outgoing.svg similarity index 100% rename from public/images/transactions/outgoing.svg rename to apps/web/public/images/transactions/outgoing.svg diff --git a/public/images/transactions/recovery-execution.svg b/apps/web/public/images/transactions/recovery-execution.svg similarity index 100% rename from public/images/transactions/recovery-execution.svg rename to apps/web/public/images/transactions/recovery-execution.svg diff --git a/public/images/transactions/recovery-recoverer.svg b/apps/web/public/images/transactions/recovery-recoverer.svg similarity index 100% rename from public/images/transactions/recovery-recoverer.svg rename to apps/web/public/images/transactions/recovery-recoverer.svg diff --git a/public/images/transactions/redefine-dark-mode.png b/apps/web/public/images/transactions/redefine-dark-mode.png similarity index 100% rename from public/images/transactions/redefine-dark-mode.png rename to apps/web/public/images/transactions/redefine-dark-mode.png diff --git a/public/images/transactions/redefine.png b/apps/web/public/images/transactions/redefine.png similarity index 100% rename from public/images/transactions/redefine.png rename to apps/web/public/images/transactions/redefine.png diff --git a/public/images/transactions/replace-tx.svg b/apps/web/public/images/transactions/replace-tx.svg similarity index 100% rename from public/images/transactions/replace-tx.svg rename to apps/web/public/images/transactions/replace-tx.svg diff --git a/public/images/transactions/rocket.svg b/apps/web/public/images/transactions/rocket.svg similarity index 100% rename from public/images/transactions/rocket.svg rename to apps/web/public/images/transactions/rocket.svg diff --git a/public/images/transactions/settings.svg b/apps/web/public/images/transactions/settings.svg similarity index 100% rename from public/images/transactions/settings.svg rename to apps/web/public/images/transactions/settings.svg diff --git a/public/images/transactions/signature.svg b/apps/web/public/images/transactions/signature.svg similarity index 100% rename from public/images/transactions/signature.svg rename to apps/web/public/images/transactions/signature.svg diff --git a/public/images/transactions/tenderly-dark.svg b/apps/web/public/images/transactions/tenderly-dark.svg similarity index 100% rename from public/images/transactions/tenderly-dark.svg rename to apps/web/public/images/transactions/tenderly-dark.svg diff --git a/public/images/transactions/tenderly-light.svg b/apps/web/public/images/transactions/tenderly-light.svg similarity index 100% rename from public/images/transactions/tenderly-light.svg rename to apps/web/public/images/transactions/tenderly-light.svg diff --git a/public/images/transactions/transactions.svg b/apps/web/public/images/transactions/transactions.svg similarity index 100% rename from public/images/transactions/transactions.svg rename to apps/web/public/images/transactions/transactions.svg diff --git a/public/images/transactions/zodiac-roles.svg b/apps/web/public/images/transactions/zodiac-roles.svg similarity index 100% rename from public/images/transactions/zodiac-roles.svg rename to apps/web/public/images/transactions/zodiac-roles.svg diff --git a/public/images/welcome/load-safe.svg b/apps/web/public/images/welcome/load-safe.svg similarity index 100% rename from public/images/welcome/load-safe.svg rename to apps/web/public/images/welcome/load-safe.svg diff --git a/public/images/welcome/logo-google.svg b/apps/web/public/images/welcome/logo-google.svg similarity index 100% rename from public/images/welcome/logo-google.svg rename to apps/web/public/images/welcome/logo-google.svg diff --git a/public/images/welcome/new-safe.svg b/apps/web/public/images/welcome/new-safe.svg similarity index 100% rename from public/images/welcome/new-safe.svg rename to apps/web/public/images/welcome/new-safe.svg diff --git a/public/safe.webmanifest b/apps/web/public/safe.webmanifest similarity index 100% rename from public/safe.webmanifest rename to apps/web/public/safe.webmanifest diff --git a/scripts/cmp.sh b/apps/web/scripts/cmp.sh similarity index 100% rename from scripts/cmp.sh rename to apps/web/scripts/cmp.sh diff --git a/scripts/css-vars.ts b/apps/web/scripts/css-vars.ts similarity index 100% rename from scripts/css-vars.ts rename to apps/web/scripts/css-vars.ts diff --git a/scripts/generate-routes.js b/apps/web/scripts/generate-routes.js similarity index 100% rename from scripts/generate-routes.js rename to apps/web/scripts/generate-routes.js diff --git a/scripts/github/download_bundle_analyser_artifact.sh b/apps/web/scripts/github/download_bundle_analyser_artifact.sh similarity index 100% rename from scripts/github/download_bundle_analyser_artifact.sh rename to apps/web/scripts/github/download_bundle_analyser_artifact.sh diff --git a/scripts/github/prepare_production_deployment.sh b/apps/web/scripts/github/prepare_production_deployment.sh similarity index 100% rename from scripts/github/prepare_production_deployment.sh rename to apps/web/scripts/github/prepare_production_deployment.sh diff --git a/scripts/github/s3_upload.sh b/apps/web/scripts/github/s3_upload.sh similarity index 100% rename from scripts/github/s3_upload.sh rename to apps/web/scripts/github/s3_upload.sh diff --git a/src/components/address-book/AddressBookHeader/index.tsx b/apps/web/src/components/address-book/AddressBookHeader/index.tsx similarity index 100% rename from src/components/address-book/AddressBookHeader/index.tsx rename to apps/web/src/components/address-book/AddressBookHeader/index.tsx diff --git a/src/components/address-book/AddressBookTable/index.tsx b/apps/web/src/components/address-book/AddressBookTable/index.tsx similarity index 100% rename from src/components/address-book/AddressBookTable/index.tsx rename to apps/web/src/components/address-book/AddressBookTable/index.tsx diff --git a/src/components/address-book/AddressBookTable/styles.module.css b/apps/web/src/components/address-book/AddressBookTable/styles.module.css similarity index 100% rename from src/components/address-book/AddressBookTable/styles.module.css rename to apps/web/src/components/address-book/AddressBookTable/styles.module.css diff --git a/src/components/address-book/EntryDialog/index.tsx b/apps/web/src/components/address-book/EntryDialog/index.tsx similarity index 100% rename from src/components/address-book/EntryDialog/index.tsx rename to apps/web/src/components/address-book/EntryDialog/index.tsx diff --git a/src/components/address-book/ExportDialog/index.test.tsx b/apps/web/src/components/address-book/ExportDialog/index.test.tsx similarity index 100% rename from src/components/address-book/ExportDialog/index.test.tsx rename to apps/web/src/components/address-book/ExportDialog/index.test.tsx diff --git a/src/components/address-book/ExportDialog/index.tsx b/apps/web/src/components/address-book/ExportDialog/index.tsx similarity index 100% rename from src/components/address-book/ExportDialog/index.tsx rename to apps/web/src/components/address-book/ExportDialog/index.tsx diff --git a/src/components/address-book/ImportDialog/__tests__/validation.test.ts b/apps/web/src/components/address-book/ImportDialog/__tests__/validation.test.ts similarity index 100% rename from src/components/address-book/ImportDialog/__tests__/validation.test.ts rename to apps/web/src/components/address-book/ImportDialog/__tests__/validation.test.ts diff --git a/src/components/address-book/ImportDialog/index.tsx b/apps/web/src/components/address-book/ImportDialog/index.tsx similarity index 100% rename from src/components/address-book/ImportDialog/index.tsx rename to apps/web/src/components/address-book/ImportDialog/index.tsx diff --git a/src/components/address-book/ImportDialog/styles.module.css b/apps/web/src/components/address-book/ImportDialog/styles.module.css similarity index 100% rename from src/components/address-book/ImportDialog/styles.module.css rename to apps/web/src/components/address-book/ImportDialog/styles.module.css diff --git a/src/components/address-book/ImportDialog/validation.ts b/apps/web/src/components/address-book/ImportDialog/validation.ts similarity index 100% rename from src/components/address-book/ImportDialog/validation.ts rename to apps/web/src/components/address-book/ImportDialog/validation.ts diff --git a/src/components/address-book/RemoveDialog/index.tsx b/apps/web/src/components/address-book/RemoveDialog/index.tsx similarity index 100% rename from src/components/address-book/RemoveDialog/index.tsx rename to apps/web/src/components/address-book/RemoveDialog/index.tsx diff --git a/src/components/balances/AssetsHeader/index.tsx b/apps/web/src/components/balances/AssetsHeader/index.tsx similarity index 100% rename from src/components/balances/AssetsHeader/index.tsx rename to apps/web/src/components/balances/AssetsHeader/index.tsx diff --git a/src/components/balances/AssetsTable/SendButton.tsx b/apps/web/src/components/balances/AssetsTable/SendButton.tsx similarity index 100% rename from src/components/balances/AssetsTable/SendButton.tsx rename to apps/web/src/components/balances/AssetsTable/SendButton.tsx diff --git a/src/components/balances/AssetsTable/index.test.tsx b/apps/web/src/components/balances/AssetsTable/index.test.tsx similarity index 100% rename from src/components/balances/AssetsTable/index.test.tsx rename to apps/web/src/components/balances/AssetsTable/index.test.tsx diff --git a/src/components/balances/AssetsTable/index.tsx b/apps/web/src/components/balances/AssetsTable/index.tsx similarity index 100% rename from src/components/balances/AssetsTable/index.tsx rename to apps/web/src/components/balances/AssetsTable/index.tsx diff --git a/src/components/balances/AssetsTable/styles.module.css b/apps/web/src/components/balances/AssetsTable/styles.module.css similarity index 100% rename from src/components/balances/AssetsTable/styles.module.css rename to apps/web/src/components/balances/AssetsTable/styles.module.css diff --git a/src/components/balances/AssetsTable/useHideAssets.ts b/apps/web/src/components/balances/AssetsTable/useHideAssets.ts similarity index 100% rename from src/components/balances/AssetsTable/useHideAssets.ts rename to apps/web/src/components/balances/AssetsTable/useHideAssets.ts diff --git a/src/components/balances/CurrencySelect/__tests__/useCurrencies.test.ts b/apps/web/src/components/balances/CurrencySelect/__tests__/useCurrencies.test.ts similarity index 100% rename from src/components/balances/CurrencySelect/__tests__/useCurrencies.test.ts rename to apps/web/src/components/balances/CurrencySelect/__tests__/useCurrencies.test.ts diff --git a/src/components/balances/CurrencySelect/index.tsx b/apps/web/src/components/balances/CurrencySelect/index.tsx similarity index 100% rename from src/components/balances/CurrencySelect/index.tsx rename to apps/web/src/components/balances/CurrencySelect/index.tsx diff --git a/src/components/balances/CurrencySelect/useCurrencies.ts b/apps/web/src/components/balances/CurrencySelect/useCurrencies.ts similarity index 100% rename from src/components/balances/CurrencySelect/useCurrencies.ts rename to apps/web/src/components/balances/CurrencySelect/useCurrencies.ts diff --git a/src/components/balances/HiddenTokenButton/index.test.tsx b/apps/web/src/components/balances/HiddenTokenButton/index.test.tsx similarity index 100% rename from src/components/balances/HiddenTokenButton/index.test.tsx rename to apps/web/src/components/balances/HiddenTokenButton/index.test.tsx diff --git a/src/components/balances/HiddenTokenButton/index.tsx b/apps/web/src/components/balances/HiddenTokenButton/index.tsx similarity index 100% rename from src/components/balances/HiddenTokenButton/index.tsx rename to apps/web/src/components/balances/HiddenTokenButton/index.tsx diff --git a/src/components/balances/HiddenTokenButton/styles.module.css b/apps/web/src/components/balances/HiddenTokenButton/styles.module.css similarity index 100% rename from src/components/balances/HiddenTokenButton/styles.module.css rename to apps/web/src/components/balances/HiddenTokenButton/styles.module.css diff --git a/src/components/balances/TokenListSelect/index.tsx b/apps/web/src/components/balances/TokenListSelect/index.tsx similarity index 100% rename from src/components/balances/TokenListSelect/index.tsx rename to apps/web/src/components/balances/TokenListSelect/index.tsx diff --git a/src/components/balances/TokenMenu/index.tsx b/apps/web/src/components/balances/TokenMenu/index.tsx similarity index 100% rename from src/components/balances/TokenMenu/index.tsx rename to apps/web/src/components/balances/TokenMenu/index.tsx diff --git a/src/components/balances/TokenMenu/styles.module.css b/apps/web/src/components/balances/TokenMenu/styles.module.css similarity index 100% rename from src/components/balances/TokenMenu/styles.module.css rename to apps/web/src/components/balances/TokenMenu/styles.module.css diff --git a/src/components/batch/BatchIndicator/BatchTooltip.tsx b/apps/web/src/components/batch/BatchIndicator/BatchTooltip.tsx similarity index 100% rename from src/components/batch/BatchIndicator/BatchTooltip.tsx rename to apps/web/src/components/batch/BatchIndicator/BatchTooltip.tsx diff --git a/src/components/batch/BatchIndicator/index.tsx b/apps/web/src/components/batch/BatchIndicator/index.tsx similarity index 100% rename from src/components/batch/BatchIndicator/index.tsx rename to apps/web/src/components/batch/BatchIndicator/index.tsx diff --git a/src/components/batch/BatchSidebar/BatchTxItem.tsx b/apps/web/src/components/batch/BatchSidebar/BatchTxItem.tsx similarity index 100% rename from src/components/batch/BatchSidebar/BatchTxItem.tsx rename to apps/web/src/components/batch/BatchSidebar/BatchTxItem.tsx diff --git a/src/components/batch/BatchSidebar/BatchTxList.tsx b/apps/web/src/components/batch/BatchSidebar/BatchTxList.tsx similarity index 100% rename from src/components/batch/BatchSidebar/BatchTxList.tsx rename to apps/web/src/components/batch/BatchSidebar/BatchTxList.tsx diff --git a/src/components/batch/BatchSidebar/EmptyBatch.tsx b/apps/web/src/components/batch/BatchSidebar/EmptyBatch.tsx similarity index 100% rename from src/components/batch/BatchSidebar/EmptyBatch.tsx rename to apps/web/src/components/batch/BatchSidebar/EmptyBatch.tsx diff --git a/src/components/batch/BatchSidebar/index.tsx b/apps/web/src/components/batch/BatchSidebar/index.tsx similarity index 100% rename from src/components/batch/BatchSidebar/index.tsx rename to apps/web/src/components/batch/BatchSidebar/index.tsx diff --git a/src/components/batch/BatchSidebar/styles.module.css b/apps/web/src/components/batch/BatchSidebar/styles.module.css similarity index 100% rename from src/components/batch/BatchSidebar/styles.module.css rename to apps/web/src/components/batch/BatchSidebar/styles.module.css diff --git a/src/components/common/AddFunds/index.tsx b/apps/web/src/components/common/AddFunds/index.tsx similarity index 100% rename from src/components/common/AddFunds/index.tsx rename to apps/web/src/components/common/AddFunds/index.tsx diff --git a/src/components/common/AddressBookInput/index.test.tsx b/apps/web/src/components/common/AddressBookInput/index.test.tsx similarity index 100% rename from src/components/common/AddressBookInput/index.test.tsx rename to apps/web/src/components/common/AddressBookInput/index.test.tsx diff --git a/src/components/common/AddressBookInput/index.tsx b/apps/web/src/components/common/AddressBookInput/index.tsx similarity index 100% rename from src/components/common/AddressBookInput/index.tsx rename to apps/web/src/components/common/AddressBookInput/index.tsx diff --git a/src/components/common/AddressBookInput/styles.module.css b/apps/web/src/components/common/AddressBookInput/styles.module.css similarity index 100% rename from src/components/common/AddressBookInput/styles.module.css rename to apps/web/src/components/common/AddressBookInput/styles.module.css diff --git a/src/components/common/AddressInput/index.test.tsx b/apps/web/src/components/common/AddressInput/index.test.tsx similarity index 100% rename from src/components/common/AddressInput/index.test.tsx rename to apps/web/src/components/common/AddressInput/index.test.tsx diff --git a/src/components/common/AddressInput/index.tsx b/apps/web/src/components/common/AddressInput/index.tsx similarity index 100% rename from src/components/common/AddressInput/index.tsx rename to apps/web/src/components/common/AddressInput/index.tsx diff --git a/src/components/common/AddressInput/styles.module.css b/apps/web/src/components/common/AddressInput/styles.module.css similarity index 100% rename from src/components/common/AddressInput/styles.module.css rename to apps/web/src/components/common/AddressInput/styles.module.css diff --git a/src/components/common/AddressInput/useNameResolver.ts b/apps/web/src/components/common/AddressInput/useNameResolver.ts similarity index 100% rename from src/components/common/AddressInput/useNameResolver.ts rename to apps/web/src/components/common/AddressInput/useNameResolver.ts diff --git a/src/components/common/AddressInputReadOnly/index.tsx b/apps/web/src/components/common/AddressInputReadOnly/index.tsx similarity index 100% rename from src/components/common/AddressInputReadOnly/index.tsx rename to apps/web/src/components/common/AddressInputReadOnly/index.tsx diff --git a/src/components/common/AddressInputReadOnly/styles.module.css b/apps/web/src/components/common/AddressInputReadOnly/styles.module.css similarity index 100% rename from src/components/common/AddressInputReadOnly/styles.module.css rename to apps/web/src/components/common/AddressInputReadOnly/styles.module.css diff --git a/src/components/common/BlockedAddress/index.tsx b/apps/web/src/components/common/BlockedAddress/index.tsx similarity index 100% rename from src/components/common/BlockedAddress/index.tsx rename to apps/web/src/components/common/BlockedAddress/index.tsx diff --git a/src/components/common/BlockedAddress/styles.module.css b/apps/web/src/components/common/BlockedAddress/styles.module.css similarity index 100% rename from src/components/common/BlockedAddress/styles.module.css rename to apps/web/src/components/common/BlockedAddress/styles.module.css diff --git a/src/components/common/BuyCryptoButton/index.tsx b/apps/web/src/components/common/BuyCryptoButton/index.tsx similarity index 100% rename from src/components/common/BuyCryptoButton/index.tsx rename to apps/web/src/components/common/BuyCryptoButton/index.tsx diff --git a/src/components/common/BuyCryptoButton/styles.module.css b/apps/web/src/components/common/BuyCryptoButton/styles.module.css similarity index 100% rename from src/components/common/BuyCryptoButton/styles.module.css rename to apps/web/src/components/common/BuyCryptoButton/styles.module.css diff --git a/src/components/common/ChainIndicator/index.tsx b/apps/web/src/components/common/ChainIndicator/index.tsx similarity index 100% rename from src/components/common/ChainIndicator/index.tsx rename to apps/web/src/components/common/ChainIndicator/index.tsx diff --git a/src/components/common/ChainIndicator/styles.module.css b/apps/web/src/components/common/ChainIndicator/styles.module.css similarity index 100% rename from src/components/common/ChainIndicator/styles.module.css rename to apps/web/src/components/common/ChainIndicator/styles.module.css diff --git a/src/components/common/ChainSwitcher/index.tsx b/apps/web/src/components/common/ChainSwitcher/index.tsx similarity index 100% rename from src/components/common/ChainSwitcher/index.tsx rename to apps/web/src/components/common/ChainSwitcher/index.tsx diff --git a/src/components/common/ChainSwitcher/styles.module.css b/apps/web/src/components/common/ChainSwitcher/styles.module.css similarity index 100% rename from src/components/common/ChainSwitcher/styles.module.css rename to apps/web/src/components/common/ChainSwitcher/styles.module.css diff --git a/src/components/common/CheckWallet/index.test.tsx b/apps/web/src/components/common/CheckWallet/index.test.tsx similarity index 100% rename from src/components/common/CheckWallet/index.test.tsx rename to apps/web/src/components/common/CheckWallet/index.test.tsx diff --git a/src/components/common/CheckWallet/index.tsx b/apps/web/src/components/common/CheckWallet/index.tsx similarity index 100% rename from src/components/common/CheckWallet/index.tsx rename to apps/web/src/components/common/CheckWallet/index.tsx diff --git a/src/components/common/Chip/index.tsx b/apps/web/src/components/common/Chip/index.tsx similarity index 100% rename from src/components/common/Chip/index.tsx rename to apps/web/src/components/common/Chip/index.tsx diff --git a/src/components/common/ChoiceButton/index.tsx b/apps/web/src/components/common/ChoiceButton/index.tsx similarity index 100% rename from src/components/common/ChoiceButton/index.tsx rename to apps/web/src/components/common/ChoiceButton/index.tsx diff --git a/src/components/common/ChoiceButton/styles.module.css b/apps/web/src/components/common/ChoiceButton/styles.module.css similarity index 100% rename from src/components/common/ChoiceButton/styles.module.css rename to apps/web/src/components/common/ChoiceButton/styles.module.css diff --git a/src/components/common/ConnectWallet/AccountCenter.tsx b/apps/web/src/components/common/ConnectWallet/AccountCenter.tsx similarity index 100% rename from src/components/common/ConnectWallet/AccountCenter.tsx rename to apps/web/src/components/common/ConnectWallet/AccountCenter.tsx diff --git a/src/components/common/ConnectWallet/ConnectWalletButton.tsx b/apps/web/src/components/common/ConnectWallet/ConnectWalletButton.tsx similarity index 100% rename from src/components/common/ConnectWallet/ConnectWalletButton.tsx rename to apps/web/src/components/common/ConnectWallet/ConnectWalletButton.tsx diff --git a/src/components/common/ConnectWallet/ConnectionCenter.tsx b/apps/web/src/components/common/ConnectWallet/ConnectionCenter.tsx similarity index 100% rename from src/components/common/ConnectWallet/ConnectionCenter.tsx rename to apps/web/src/components/common/ConnectWallet/ConnectionCenter.tsx diff --git a/src/components/common/ConnectWallet/__tests__/AccountCenter.test.tsx b/apps/web/src/components/common/ConnectWallet/__tests__/AccountCenter.test.tsx similarity index 100% rename from src/components/common/ConnectWallet/__tests__/AccountCenter.test.tsx rename to apps/web/src/components/common/ConnectWallet/__tests__/AccountCenter.test.tsx diff --git a/src/components/common/ConnectWallet/__tests__/ConnectionCenter.test.tsx b/apps/web/src/components/common/ConnectWallet/__tests__/ConnectionCenter.test.tsx similarity index 100% rename from src/components/common/ConnectWallet/__tests__/ConnectionCenter.test.tsx rename to apps/web/src/components/common/ConnectWallet/__tests__/ConnectionCenter.test.tsx diff --git a/src/components/common/ConnectWallet/index.tsx b/apps/web/src/components/common/ConnectWallet/index.tsx similarity index 100% rename from src/components/common/ConnectWallet/index.tsx rename to apps/web/src/components/common/ConnectWallet/index.tsx diff --git a/src/components/common/ConnectWallet/styles.module.css b/apps/web/src/components/common/ConnectWallet/styles.module.css similarity index 100% rename from src/components/common/ConnectWallet/styles.module.css rename to apps/web/src/components/common/ConnectWallet/styles.module.css diff --git a/src/components/common/ConnectWallet/useConnectWallet.ts b/apps/web/src/components/common/ConnectWallet/useConnectWallet.ts similarity index 100% rename from src/components/common/ConnectWallet/useConnectWallet.ts rename to apps/web/src/components/common/ConnectWallet/useConnectWallet.ts diff --git a/src/components/common/ContextMenu/index.tsx b/apps/web/src/components/common/ContextMenu/index.tsx similarity index 100% rename from src/components/common/ContextMenu/index.tsx rename to apps/web/src/components/common/ContextMenu/index.tsx diff --git a/src/components/common/ContextMenu/styles.module.css b/apps/web/src/components/common/ContextMenu/styles.module.css similarity index 100% rename from src/components/common/ContextMenu/styles.module.css rename to apps/web/src/components/common/ContextMenu/styles.module.css diff --git a/src/components/common/CookieAndTermBanner/index.tsx b/apps/web/src/components/common/CookieAndTermBanner/index.tsx similarity index 100% rename from src/components/common/CookieAndTermBanner/index.tsx rename to apps/web/src/components/common/CookieAndTermBanner/index.tsx diff --git a/src/components/common/CookieAndTermBanner/styles.module.css b/apps/web/src/components/common/CookieAndTermBanner/styles.module.css similarity index 100% rename from src/components/common/CookieAndTermBanner/styles.module.css rename to apps/web/src/components/common/CookieAndTermBanner/styles.module.css diff --git a/src/components/common/CooldownButton/index.test.tsx b/apps/web/src/components/common/CooldownButton/index.test.tsx similarity index 100% rename from src/components/common/CooldownButton/index.test.tsx rename to apps/web/src/components/common/CooldownButton/index.test.tsx diff --git a/src/components/common/CooldownButton/index.tsx b/apps/web/src/components/common/CooldownButton/index.tsx similarity index 100% rename from src/components/common/CooldownButton/index.tsx rename to apps/web/src/components/common/CooldownButton/index.tsx diff --git a/src/components/common/CopyAddressButton/__tests__/index.test.tsx b/apps/web/src/components/common/CopyAddressButton/__tests__/index.test.tsx similarity index 100% rename from src/components/common/CopyAddressButton/__tests__/index.test.tsx rename to apps/web/src/components/common/CopyAddressButton/__tests__/index.test.tsx diff --git a/src/components/common/CopyAddressButton/index.tsx b/apps/web/src/components/common/CopyAddressButton/index.tsx similarity index 100% rename from src/components/common/CopyAddressButton/index.tsx rename to apps/web/src/components/common/CopyAddressButton/index.tsx diff --git a/src/components/common/CopyButton/index.stories.tsx b/apps/web/src/components/common/CopyButton/index.stories.tsx similarity index 100% rename from src/components/common/CopyButton/index.stories.tsx rename to apps/web/src/components/common/CopyButton/index.stories.tsx diff --git a/src/components/common/CopyButton/index.tsx b/apps/web/src/components/common/CopyButton/index.tsx similarity index 100% rename from src/components/common/CopyButton/index.tsx rename to apps/web/src/components/common/CopyButton/index.tsx diff --git a/src/components/common/CopyTooltip/ConfirmCopyModal.tsx b/apps/web/src/components/common/CopyTooltip/ConfirmCopyModal.tsx similarity index 100% rename from src/components/common/CopyTooltip/ConfirmCopyModal.tsx rename to apps/web/src/components/common/CopyTooltip/ConfirmCopyModal.tsx diff --git a/src/components/common/CopyTooltip/index.tsx b/apps/web/src/components/common/CopyTooltip/index.tsx similarity index 100% rename from src/components/common/CopyTooltip/index.tsx rename to apps/web/src/components/common/CopyTooltip/index.tsx diff --git a/src/components/common/CopyTooltip/styles.module.css b/apps/web/src/components/common/CopyTooltip/styles.module.css similarity index 100% rename from src/components/common/CopyTooltip/styles.module.css rename to apps/web/src/components/common/CopyTooltip/styles.module.css diff --git a/src/components/common/Countdown/index.test.tsx b/apps/web/src/components/common/Countdown/index.test.tsx similarity index 100% rename from src/components/common/Countdown/index.test.tsx rename to apps/web/src/components/common/Countdown/index.test.tsx diff --git a/src/components/common/Countdown/index.tsx b/apps/web/src/components/common/Countdown/index.tsx similarity index 100% rename from src/components/common/Countdown/index.tsx rename to apps/web/src/components/common/Countdown/index.tsx diff --git a/src/components/common/CustomLink/index.tsx b/apps/web/src/components/common/CustomLink/index.tsx similarity index 100% rename from src/components/common/CustomLink/index.tsx rename to apps/web/src/components/common/CustomLink/index.tsx diff --git a/src/components/common/CustomTooltip/index.tsx b/apps/web/src/components/common/CustomTooltip/index.tsx similarity index 100% rename from src/components/common/CustomTooltip/index.tsx rename to apps/web/src/components/common/CustomTooltip/index.tsx diff --git a/src/components/common/DatePickerInput/index.tsx b/apps/web/src/components/common/DatePickerInput/index.tsx similarity index 100% rename from src/components/common/DatePickerInput/index.tsx rename to apps/web/src/components/common/DatePickerInput/index.tsx diff --git a/src/components/common/DateTime/DateTime.stories.tsx b/apps/web/src/components/common/DateTime/DateTime.stories.tsx similarity index 100% rename from src/components/common/DateTime/DateTime.stories.tsx rename to apps/web/src/components/common/DateTime/DateTime.stories.tsx diff --git a/src/components/common/DateTime/DateTime.tsx b/apps/web/src/components/common/DateTime/DateTime.tsx similarity index 100% rename from src/components/common/DateTime/DateTime.tsx rename to apps/web/src/components/common/DateTime/DateTime.tsx diff --git a/src/components/common/DateTime/DateTimeContainer.tsx b/apps/web/src/components/common/DateTime/DateTimeContainer.tsx similarity index 100% rename from src/components/common/DateTime/DateTimeContainer.tsx rename to apps/web/src/components/common/DateTime/DateTimeContainer.tsx diff --git a/src/components/common/DateTime/index.test.tsx b/apps/web/src/components/common/DateTime/index.test.tsx similarity index 100% rename from src/components/common/DateTime/index.test.tsx rename to apps/web/src/components/common/DateTime/index.test.tsx diff --git a/src/components/common/DateTime/index.tsx b/apps/web/src/components/common/DateTime/index.tsx similarity index 100% rename from src/components/common/DateTime/index.tsx rename to apps/web/src/components/common/DateTime/index.tsx diff --git a/src/components/common/Disclaimer/index.stories.tsx b/apps/web/src/components/common/Disclaimer/index.stories.tsx similarity index 100% rename from src/components/common/Disclaimer/index.stories.tsx rename to apps/web/src/components/common/Disclaimer/index.stories.tsx diff --git a/src/components/common/Disclaimer/index.tsx b/apps/web/src/components/common/Disclaimer/index.tsx similarity index 100% rename from src/components/common/Disclaimer/index.tsx rename to apps/web/src/components/common/Disclaimer/index.tsx diff --git a/src/components/common/Disclaimer/styles.module.css b/apps/web/src/components/common/Disclaimer/styles.module.css similarity index 100% rename from src/components/common/Disclaimer/styles.module.css rename to apps/web/src/components/common/Disclaimer/styles.module.css diff --git a/src/components/common/EnhancedTable/index.tsx b/apps/web/src/components/common/EnhancedTable/index.tsx similarity index 100% rename from src/components/common/EnhancedTable/index.tsx rename to apps/web/src/components/common/EnhancedTable/index.tsx diff --git a/src/components/common/EnhancedTable/styles.module.css b/apps/web/src/components/common/EnhancedTable/styles.module.css similarity index 100% rename from src/components/common/EnhancedTable/styles.module.css rename to apps/web/src/components/common/EnhancedTable/styles.module.css diff --git a/src/components/common/ErrorBoundary/index.tsx b/apps/web/src/components/common/ErrorBoundary/index.tsx similarity index 100% rename from src/components/common/ErrorBoundary/index.tsx rename to apps/web/src/components/common/ErrorBoundary/index.tsx diff --git a/src/components/common/ErrorBoundary/styles.module.css b/apps/web/src/components/common/ErrorBoundary/styles.module.css similarity index 100% rename from src/components/common/ErrorBoundary/styles.module.css rename to apps/web/src/components/common/ErrorBoundary/styles.module.css diff --git a/src/components/common/EthHashInfo/SrcEthHashInfo/index.stories.tsx b/apps/web/src/components/common/EthHashInfo/SrcEthHashInfo/index.stories.tsx similarity index 100% rename from src/components/common/EthHashInfo/SrcEthHashInfo/index.stories.tsx rename to apps/web/src/components/common/EthHashInfo/SrcEthHashInfo/index.stories.tsx diff --git a/src/components/common/EthHashInfo/SrcEthHashInfo/index.tsx b/apps/web/src/components/common/EthHashInfo/SrcEthHashInfo/index.tsx similarity index 100% rename from src/components/common/EthHashInfo/SrcEthHashInfo/index.tsx rename to apps/web/src/components/common/EthHashInfo/SrcEthHashInfo/index.tsx diff --git a/src/components/common/EthHashInfo/SrcEthHashInfo/styles.module.css b/apps/web/src/components/common/EthHashInfo/SrcEthHashInfo/styles.module.css similarity index 100% rename from src/components/common/EthHashInfo/SrcEthHashInfo/styles.module.css rename to apps/web/src/components/common/EthHashInfo/SrcEthHashInfo/styles.module.css diff --git a/src/components/common/EthHashInfo/index.stories.tsx b/apps/web/src/components/common/EthHashInfo/index.stories.tsx similarity index 100% rename from src/components/common/EthHashInfo/index.stories.tsx rename to apps/web/src/components/common/EthHashInfo/index.stories.tsx diff --git a/src/components/common/EthHashInfo/index.test.tsx b/apps/web/src/components/common/EthHashInfo/index.test.tsx similarity index 100% rename from src/components/common/EthHashInfo/index.test.tsx rename to apps/web/src/components/common/EthHashInfo/index.test.tsx diff --git a/src/components/common/EthHashInfo/index.tsx b/apps/web/src/components/common/EthHashInfo/index.tsx similarity index 100% rename from src/components/common/EthHashInfo/index.tsx rename to apps/web/src/components/common/EthHashInfo/index.tsx diff --git a/src/components/common/ExplorerButton/index.tsx b/apps/web/src/components/common/ExplorerButton/index.tsx similarity index 100% rename from src/components/common/ExplorerButton/index.tsx rename to apps/web/src/components/common/ExplorerButton/index.tsx diff --git a/src/components/common/ExternalLink/index.tsx b/apps/web/src/components/common/ExternalLink/index.tsx similarity index 100% rename from src/components/common/ExternalLink/index.tsx rename to apps/web/src/components/common/ExternalLink/index.tsx diff --git a/src/components/common/FiatValue/FiatValue.test.tsx b/apps/web/src/components/common/FiatValue/FiatValue.test.tsx similarity index 100% rename from src/components/common/FiatValue/FiatValue.test.tsx rename to apps/web/src/components/common/FiatValue/FiatValue.test.tsx diff --git a/src/components/common/FiatValue/index.tsx b/apps/web/src/components/common/FiatValue/index.tsx similarity index 100% rename from src/components/common/FiatValue/index.tsx rename to apps/web/src/components/common/FiatValue/index.tsx diff --git a/src/components/common/FileUpload/index.tsx b/apps/web/src/components/common/FileUpload/index.tsx similarity index 100% rename from src/components/common/FileUpload/index.tsx rename to apps/web/src/components/common/FileUpload/index.tsx diff --git a/src/components/common/FileUpload/styles.module.css b/apps/web/src/components/common/FileUpload/styles.module.css similarity index 100% rename from src/components/common/FileUpload/styles.module.css rename to apps/web/src/components/common/FileUpload/styles.module.css diff --git a/src/components/common/Footer/index.tsx b/apps/web/src/components/common/Footer/index.tsx similarity index 100% rename from src/components/common/Footer/index.tsx rename to apps/web/src/components/common/Footer/index.tsx diff --git a/src/components/common/Footer/styles.module.css b/apps/web/src/components/common/Footer/styles.module.css similarity index 100% rename from src/components/common/Footer/styles.module.css rename to apps/web/src/components/common/Footer/styles.module.css diff --git a/src/components/common/GeoblockingProvider/index.tsx b/apps/web/src/components/common/GeoblockingProvider/index.tsx similarity index 100% rename from src/components/common/GeoblockingProvider/index.tsx rename to apps/web/src/components/common/GeoblockingProvider/index.tsx diff --git a/src/components/common/Header/index.test.tsx b/apps/web/src/components/common/Header/index.test.tsx similarity index 100% rename from src/components/common/Header/index.test.tsx rename to apps/web/src/components/common/Header/index.test.tsx diff --git a/src/components/common/Header/index.tsx b/apps/web/src/components/common/Header/index.tsx similarity index 100% rename from src/components/common/Header/index.tsx rename to apps/web/src/components/common/Header/index.tsx diff --git a/src/components/common/Header/styles.module.css b/apps/web/src/components/common/Header/styles.module.css similarity index 100% rename from src/components/common/Header/styles.module.css rename to apps/web/src/components/common/Header/styles.module.css diff --git a/src/components/common/Identicon/index.tsx b/apps/web/src/components/common/Identicon/index.tsx similarity index 100% rename from src/components/common/Identicon/index.tsx rename to apps/web/src/components/common/Identicon/index.tsx diff --git a/src/components/common/Identicon/styles.module.css b/apps/web/src/components/common/Identicon/styles.module.css similarity index 100% rename from src/components/common/Identicon/styles.module.css rename to apps/web/src/components/common/Identicon/styles.module.css diff --git a/src/components/common/ImageFallback/index.tsx b/apps/web/src/components/common/ImageFallback/index.tsx similarity index 100% rename from src/components/common/ImageFallback/index.tsx rename to apps/web/src/components/common/ImageFallback/index.tsx diff --git a/src/components/common/InfiniteScroll/index.tsx b/apps/web/src/components/common/InfiniteScroll/index.tsx similarity index 100% rename from src/components/common/InfiniteScroll/index.tsx rename to apps/web/src/components/common/InfiniteScroll/index.tsx diff --git a/src/components/common/InputValueHelper/index.tsx b/apps/web/src/components/common/InputValueHelper/index.tsx similarity index 100% rename from src/components/common/InputValueHelper/index.tsx rename to apps/web/src/components/common/InputValueHelper/index.tsx diff --git a/src/components/common/LegalDisclaimerContent/index.tsx b/apps/web/src/components/common/LegalDisclaimerContent/index.tsx similarity index 100% rename from src/components/common/LegalDisclaimerContent/index.tsx rename to apps/web/src/components/common/LegalDisclaimerContent/index.tsx diff --git a/src/components/common/LegalDisclaimerContent/styles.module.css b/apps/web/src/components/common/LegalDisclaimerContent/styles.module.css similarity index 100% rename from src/components/common/LegalDisclaimerContent/styles.module.css rename to apps/web/src/components/common/LegalDisclaimerContent/styles.module.css diff --git a/src/components/common/MetaTags/index.tsx b/apps/web/src/components/common/MetaTags/index.tsx similarity index 100% rename from src/components/common/MetaTags/index.tsx rename to apps/web/src/components/common/MetaTags/index.tsx diff --git a/src/components/common/ModalDialog/index.tsx b/apps/web/src/components/common/ModalDialog/index.tsx similarity index 100% rename from src/components/common/ModalDialog/index.tsx rename to apps/web/src/components/common/ModalDialog/index.tsx diff --git a/src/components/common/ModalDialog/styles.module.css b/apps/web/src/components/common/ModalDialog/styles.module.css similarity index 100% rename from src/components/common/ModalDialog/styles.module.css rename to apps/web/src/components/common/ModalDialog/styles.module.css diff --git a/src/components/common/Mui/index.test.tsx b/apps/web/src/components/common/Mui/index.test.tsx similarity index 100% rename from src/components/common/Mui/index.test.tsx rename to apps/web/src/components/common/Mui/index.test.tsx diff --git a/src/components/common/Mui/index.tsx b/apps/web/src/components/common/Mui/index.tsx similarity index 100% rename from src/components/common/Mui/index.tsx rename to apps/web/src/components/common/Mui/index.tsx diff --git a/src/components/common/NameInput/index.tsx b/apps/web/src/components/common/NameInput/index.tsx similarity index 100% rename from src/components/common/NameInput/index.tsx rename to apps/web/src/components/common/NameInput/index.tsx diff --git a/src/components/common/NamedAddressInfo/index.test.tsx b/apps/web/src/components/common/NamedAddressInfo/index.test.tsx similarity index 100% rename from src/components/common/NamedAddressInfo/index.test.tsx rename to apps/web/src/components/common/NamedAddressInfo/index.test.tsx diff --git a/src/components/common/NamedAddressInfo/index.tsx b/apps/web/src/components/common/NamedAddressInfo/index.tsx similarity index 100% rename from src/components/common/NamedAddressInfo/index.tsx rename to apps/web/src/components/common/NamedAddressInfo/index.tsx diff --git a/src/components/common/NavTabs/index.tsx b/apps/web/src/components/common/NavTabs/index.tsx similarity index 100% rename from src/components/common/NavTabs/index.tsx rename to apps/web/src/components/common/NavTabs/index.tsx diff --git a/src/components/common/NavTabs/styles.module.css b/apps/web/src/components/common/NavTabs/styles.module.css similarity index 100% rename from src/components/common/NavTabs/styles.module.css rename to apps/web/src/components/common/NavTabs/styles.module.css diff --git a/src/components/common/Navigate/index.test.tsx b/apps/web/src/components/common/Navigate/index.test.tsx similarity index 100% rename from src/components/common/Navigate/index.test.tsx rename to apps/web/src/components/common/Navigate/index.test.tsx diff --git a/src/components/common/Navigate/index.tsx b/apps/web/src/components/common/Navigate/index.tsx similarity index 100% rename from src/components/common/Navigate/index.tsx rename to apps/web/src/components/common/Navigate/index.tsx diff --git a/src/components/common/NetworkInput/index.tsx b/apps/web/src/components/common/NetworkInput/index.tsx similarity index 100% rename from src/components/common/NetworkInput/index.tsx rename to apps/web/src/components/common/NetworkInput/index.tsx diff --git a/src/components/common/NetworkInput/styles.module.css b/apps/web/src/components/common/NetworkInput/styles.module.css similarity index 100% rename from src/components/common/NetworkInput/styles.module.css rename to apps/web/src/components/common/NetworkInput/styles.module.css diff --git a/src/components/common/NetworkSelector/NetworkMultiSelector.tsx b/apps/web/src/components/common/NetworkSelector/NetworkMultiSelector.tsx similarity index 100% rename from src/components/common/NetworkSelector/NetworkMultiSelector.tsx rename to apps/web/src/components/common/NetworkSelector/NetworkMultiSelector.tsx diff --git a/src/components/common/NetworkSelector/__tests__/NetworkMultiSelector.test.tsx b/apps/web/src/components/common/NetworkSelector/__tests__/NetworkMultiSelector.test.tsx similarity index 100% rename from src/components/common/NetworkSelector/__tests__/NetworkMultiSelector.test.tsx rename to apps/web/src/components/common/NetworkSelector/__tests__/NetworkMultiSelector.test.tsx diff --git a/src/components/common/NetworkSelector/index.tsx b/apps/web/src/components/common/NetworkSelector/index.tsx similarity index 100% rename from src/components/common/NetworkSelector/index.tsx rename to apps/web/src/components/common/NetworkSelector/index.tsx diff --git a/src/components/common/NetworkSelector/styles.module.css b/apps/web/src/components/common/NetworkSelector/styles.module.css similarity index 100% rename from src/components/common/NetworkSelector/styles.module.css rename to apps/web/src/components/common/NetworkSelector/styles.module.css diff --git a/src/components/common/NetworkSelector/useChangeNetworkLink.ts b/apps/web/src/components/common/NetworkSelector/useChangeNetworkLink.ts similarity index 100% rename from src/components/common/NetworkSelector/useChangeNetworkLink.ts rename to apps/web/src/components/common/NetworkSelector/useChangeNetworkLink.ts diff --git a/src/components/common/Notifications/index.tsx b/apps/web/src/components/common/Notifications/index.tsx similarity index 100% rename from src/components/common/Notifications/index.tsx rename to apps/web/src/components/common/Notifications/index.tsx diff --git a/src/components/common/Notifications/styles.module.css b/apps/web/src/components/common/Notifications/styles.module.css similarity index 100% rename from src/components/common/Notifications/styles.module.css rename to apps/web/src/components/common/Notifications/styles.module.css diff --git a/src/components/common/Notifications/useCounter.ts b/apps/web/src/components/common/Notifications/useCounter.ts similarity index 100% rename from src/components/common/Notifications/useCounter.ts rename to apps/web/src/components/common/Notifications/useCounter.ts diff --git a/src/components/common/NumberField/index.test.ts b/apps/web/src/components/common/NumberField/index.test.ts similarity index 100% rename from src/components/common/NumberField/index.test.ts rename to apps/web/src/components/common/NumberField/index.test.ts diff --git a/src/components/common/NumberField/index.tsx b/apps/web/src/components/common/NumberField/index.tsx similarity index 100% rename from src/components/common/NumberField/index.tsx rename to apps/web/src/components/common/NumberField/index.tsx diff --git a/src/components/common/OnboardingTooltip/__tests__/OnboardingTooltip.test.tsx b/apps/web/src/components/common/OnboardingTooltip/__tests__/OnboardingTooltip.test.tsx similarity index 100% rename from src/components/common/OnboardingTooltip/__tests__/OnboardingTooltip.test.tsx rename to apps/web/src/components/common/OnboardingTooltip/__tests__/OnboardingTooltip.test.tsx diff --git a/src/components/common/OnboardingTooltip/index.tsx b/apps/web/src/components/common/OnboardingTooltip/index.tsx similarity index 100% rename from src/components/common/OnboardingTooltip/index.tsx rename to apps/web/src/components/common/OnboardingTooltip/index.tsx diff --git a/src/components/common/PageHeader/index.tsx b/apps/web/src/components/common/PageHeader/index.tsx similarity index 100% rename from src/components/common/PageHeader/index.tsx rename to apps/web/src/components/common/PageHeader/index.tsx diff --git a/src/components/common/PageHeader/styles.module.css b/apps/web/src/components/common/PageHeader/styles.module.css similarity index 100% rename from src/components/common/PageHeader/styles.module.css rename to apps/web/src/components/common/PageHeader/styles.module.css diff --git a/src/components/common/PageLayout/SideDrawer.tsx b/apps/web/src/components/common/PageLayout/SideDrawer.tsx similarity index 100% rename from src/components/common/PageLayout/SideDrawer.tsx rename to apps/web/src/components/common/PageLayout/SideDrawer.tsx diff --git a/src/components/common/PageLayout/index.tsx b/apps/web/src/components/common/PageLayout/index.tsx similarity index 100% rename from src/components/common/PageLayout/index.tsx rename to apps/web/src/components/common/PageLayout/index.tsx diff --git a/src/components/common/PageLayout/styles.module.css b/apps/web/src/components/common/PageLayout/styles.module.css similarity index 100% rename from src/components/common/PageLayout/styles.module.css rename to apps/web/src/components/common/PageLayout/styles.module.css diff --git a/src/components/common/PagePlaceholder/index.tsx b/apps/web/src/components/common/PagePlaceholder/index.tsx similarity index 100% rename from src/components/common/PagePlaceholder/index.tsx rename to apps/web/src/components/common/PagePlaceholder/index.tsx diff --git a/src/components/common/PagePlaceholder/styles.module.css b/apps/web/src/components/common/PagePlaceholder/styles.module.css similarity index 100% rename from src/components/common/PagePlaceholder/styles.module.css rename to apps/web/src/components/common/PagePlaceholder/styles.module.css diff --git a/src/components/common/PaginatedTxns/SkeletonTxList.tsx b/apps/web/src/components/common/PaginatedTxns/SkeletonTxList.tsx similarity index 100% rename from src/components/common/PaginatedTxns/SkeletonTxList.tsx rename to apps/web/src/components/common/PaginatedTxns/SkeletonTxList.tsx diff --git a/src/components/common/PaginatedTxns/index.tsx b/apps/web/src/components/common/PaginatedTxns/index.tsx similarity index 100% rename from src/components/common/PaginatedTxns/index.tsx rename to apps/web/src/components/common/PaginatedTxns/index.tsx diff --git a/src/components/common/Popup/index.tsx b/apps/web/src/components/common/Popup/index.tsx similarity index 100% rename from src/components/common/Popup/index.tsx rename to apps/web/src/components/common/Popup/index.tsx diff --git a/src/components/common/ProgressBar/index.tsx b/apps/web/src/components/common/ProgressBar/index.tsx similarity index 100% rename from src/components/common/ProgressBar/index.tsx rename to apps/web/src/components/common/ProgressBar/index.tsx diff --git a/src/components/common/ProgressBar/styles.module.css b/apps/web/src/components/common/ProgressBar/styles.module.css similarity index 100% rename from src/components/common/ProgressBar/styles.module.css rename to apps/web/src/components/common/ProgressBar/styles.module.css diff --git a/src/components/common/QRCode/index.tsx b/apps/web/src/components/common/QRCode/index.tsx similarity index 100% rename from src/components/common/QRCode/index.tsx rename to apps/web/src/components/common/QRCode/index.tsx diff --git a/src/components/common/SafeIcon/index.tsx b/apps/web/src/components/common/SafeIcon/index.tsx similarity index 100% rename from src/components/common/SafeIcon/index.tsx rename to apps/web/src/components/common/SafeIcon/index.tsx diff --git a/src/components/common/SafeIcon/styles.module.css b/apps/web/src/components/common/SafeIcon/styles.module.css similarity index 100% rename from src/components/common/SafeIcon/styles.module.css rename to apps/web/src/components/common/SafeIcon/styles.module.css diff --git a/src/components/common/SafeLoadingError/index.tsx b/apps/web/src/components/common/SafeLoadingError/index.tsx similarity index 100% rename from src/components/common/SafeLoadingError/index.tsx rename to apps/web/src/components/common/SafeLoadingError/index.tsx diff --git a/src/components/common/SafeTokenWidget/__tests__/SafeTokenWidget.test.tsx b/apps/web/src/components/common/SafeTokenWidget/__tests__/SafeTokenWidget.test.tsx similarity index 100% rename from src/components/common/SafeTokenWidget/__tests__/SafeTokenWidget.test.tsx rename to apps/web/src/components/common/SafeTokenWidget/__tests__/SafeTokenWidget.test.tsx diff --git a/src/components/common/SafeTokenWidget/index.tsx b/apps/web/src/components/common/SafeTokenWidget/index.tsx similarity index 100% rename from src/components/common/SafeTokenWidget/index.tsx rename to apps/web/src/components/common/SafeTokenWidget/index.tsx diff --git a/src/components/common/SafeTokenWidget/styles.module.css b/apps/web/src/components/common/SafeTokenWidget/styles.module.css similarity index 100% rename from src/components/common/SafeTokenWidget/styles.module.css rename to apps/web/src/components/common/SafeTokenWidget/styles.module.css diff --git a/src/components/common/SpendingLimitLabel/index.tsx b/apps/web/src/components/common/SpendingLimitLabel/index.tsx similarity index 100% rename from src/components/common/SpendingLimitLabel/index.tsx rename to apps/web/src/components/common/SpendingLimitLabel/index.tsx diff --git a/src/components/common/Sticky/index.tsx b/apps/web/src/components/common/Sticky/index.tsx similarity index 100% rename from src/components/common/Sticky/index.tsx rename to apps/web/src/components/common/Sticky/index.tsx diff --git a/src/components/common/Table/DataRow.stories.tsx b/apps/web/src/components/common/Table/DataRow.stories.tsx similarity index 100% rename from src/components/common/Table/DataRow.stories.tsx rename to apps/web/src/components/common/Table/DataRow.stories.tsx diff --git a/src/components/common/Table/DataRow.tsx b/apps/web/src/components/common/Table/DataRow.tsx similarity index 100% rename from src/components/common/Table/DataRow.tsx rename to apps/web/src/components/common/Table/DataRow.tsx diff --git a/src/components/common/Table/DataTable.stories.tsx b/apps/web/src/components/common/Table/DataTable.stories.tsx similarity index 100% rename from src/components/common/Table/DataTable.stories.tsx rename to apps/web/src/components/common/Table/DataTable.stories.tsx diff --git a/src/components/common/Table/DataTable.tsx b/apps/web/src/components/common/Table/DataTable.tsx similarity index 100% rename from src/components/common/Table/DataTable.tsx rename to apps/web/src/components/common/Table/DataTable.tsx diff --git a/src/components/common/Table/EmptyRow.tsx b/apps/web/src/components/common/Table/EmptyRow.tsx similarity index 100% rename from src/components/common/Table/EmptyRow.tsx rename to apps/web/src/components/common/Table/EmptyRow.tsx diff --git a/src/components/common/Table/styles.module.css b/apps/web/src/components/common/Table/styles.module.css similarity index 100% rename from src/components/common/Table/styles.module.css rename to apps/web/src/components/common/Table/styles.module.css diff --git a/src/components/common/TokenAmount/index.stories.tsx b/apps/web/src/components/common/TokenAmount/index.stories.tsx similarity index 100% rename from src/components/common/TokenAmount/index.stories.tsx rename to apps/web/src/components/common/TokenAmount/index.stories.tsx diff --git a/src/components/common/TokenAmount/index.test.tsx b/apps/web/src/components/common/TokenAmount/index.test.tsx similarity index 100% rename from src/components/common/TokenAmount/index.test.tsx rename to apps/web/src/components/common/TokenAmount/index.test.tsx diff --git a/src/components/common/TokenAmount/index.tsx b/apps/web/src/components/common/TokenAmount/index.tsx similarity index 100% rename from src/components/common/TokenAmount/index.tsx rename to apps/web/src/components/common/TokenAmount/index.tsx diff --git a/src/components/common/TokenAmount/styles.module.css b/apps/web/src/components/common/TokenAmount/styles.module.css similarity index 100% rename from src/components/common/TokenAmount/styles.module.css rename to apps/web/src/components/common/TokenAmount/styles.module.css diff --git a/src/components/common/TokenAmountInput/index.tsx b/apps/web/src/components/common/TokenAmountInput/index.tsx similarity index 100% rename from src/components/common/TokenAmountInput/index.tsx rename to apps/web/src/components/common/TokenAmountInput/index.tsx diff --git a/src/components/common/TokenAmountInput/styles.module.css b/apps/web/src/components/common/TokenAmountInput/styles.module.css similarity index 100% rename from src/components/common/TokenAmountInput/styles.module.css rename to apps/web/src/components/common/TokenAmountInput/styles.module.css diff --git a/src/components/common/TokenExplorerLink/index.tsx b/apps/web/src/components/common/TokenExplorerLink/index.tsx similarity index 100% rename from src/components/common/TokenExplorerLink/index.tsx rename to apps/web/src/components/common/TokenExplorerLink/index.tsx diff --git a/src/components/common/TokenIcon/index.tsx b/apps/web/src/components/common/TokenIcon/index.tsx similarity index 100% rename from src/components/common/TokenIcon/index.tsx rename to apps/web/src/components/common/TokenIcon/index.tsx diff --git a/src/components/common/TokenIcon/styles.module.css b/apps/web/src/components/common/TokenIcon/styles.module.css similarity index 100% rename from src/components/common/TokenIcon/styles.module.css rename to apps/web/src/components/common/TokenIcon/styles.module.css diff --git a/src/components/common/Track/index.tsx b/apps/web/src/components/common/Track/index.tsx similarity index 100% rename from src/components/common/Track/index.tsx rename to apps/web/src/components/common/Track/index.tsx diff --git a/src/components/common/TxModalDialog/index.tsx b/apps/web/src/components/common/TxModalDialog/index.tsx similarity index 100% rename from src/components/common/TxModalDialog/index.tsx rename to apps/web/src/components/common/TxModalDialog/index.tsx diff --git a/src/components/common/TxModalDialog/styles.module.css b/apps/web/src/components/common/TxModalDialog/styles.module.css similarity index 100% rename from src/components/common/TxModalDialog/styles.module.css rename to apps/web/src/components/common/TxModalDialog/styles.module.css diff --git a/src/components/common/UnreadBadge/index.tsx b/apps/web/src/components/common/UnreadBadge/index.tsx similarity index 100% rename from src/components/common/UnreadBadge/index.tsx rename to apps/web/src/components/common/UnreadBadge/index.tsx diff --git a/src/components/common/WalletBalance/index.test.tsx b/apps/web/src/components/common/WalletBalance/index.test.tsx similarity index 100% rename from src/components/common/WalletBalance/index.test.tsx rename to apps/web/src/components/common/WalletBalance/index.test.tsx diff --git a/src/components/common/WalletBalance/index.tsx b/apps/web/src/components/common/WalletBalance/index.tsx similarity index 100% rename from src/components/common/WalletBalance/index.tsx rename to apps/web/src/components/common/WalletBalance/index.tsx diff --git a/src/components/common/WalletIcon/index.tsx b/apps/web/src/components/common/WalletIcon/index.tsx similarity index 100% rename from src/components/common/WalletIcon/index.tsx rename to apps/web/src/components/common/WalletIcon/index.tsx diff --git a/src/components/common/WalletInfo/index.test.tsx b/apps/web/src/components/common/WalletInfo/index.test.tsx similarity index 100% rename from src/components/common/WalletInfo/index.test.tsx rename to apps/web/src/components/common/WalletInfo/index.test.tsx diff --git a/src/components/common/WalletInfo/index.tsx b/apps/web/src/components/common/WalletInfo/index.tsx similarity index 100% rename from src/components/common/WalletInfo/index.tsx rename to apps/web/src/components/common/WalletInfo/index.tsx diff --git a/src/components/common/WalletInfo/styles.module.css b/apps/web/src/components/common/WalletInfo/styles.module.css similarity index 100% rename from src/components/common/WalletInfo/styles.module.css rename to apps/web/src/components/common/WalletInfo/styles.module.css diff --git a/src/components/common/WalletOverview/index.tsx b/apps/web/src/components/common/WalletOverview/index.tsx similarity index 100% rename from src/components/common/WalletOverview/index.tsx rename to apps/web/src/components/common/WalletOverview/index.tsx diff --git a/src/components/common/WalletOverview/styles.module.css b/apps/web/src/components/common/WalletOverview/styles.module.css similarity index 100% rename from src/components/common/WalletOverview/styles.module.css rename to apps/web/src/components/common/WalletOverview/styles.module.css diff --git a/src/components/common/WalletProvider/index.tsx b/apps/web/src/components/common/WalletProvider/index.tsx similarity index 100% rename from src/components/common/WalletProvider/index.tsx rename to apps/web/src/components/common/WalletProvider/index.tsx diff --git a/src/components/common/WidgetDisclaimer/index.tsx b/apps/web/src/components/common/WidgetDisclaimer/index.tsx similarity index 100% rename from src/components/common/WidgetDisclaimer/index.tsx rename to apps/web/src/components/common/WidgetDisclaimer/index.tsx diff --git a/src/components/common/WidgetDisclaimer/styles.module.css b/apps/web/src/components/common/WidgetDisclaimer/styles.module.css similarity index 100% rename from src/components/common/WidgetDisclaimer/styles.module.css rename to apps/web/src/components/common/WidgetDisclaimer/styles.module.css diff --git a/src/components/common/icons/CircularIcon/index.tsx b/apps/web/src/components/common/icons/CircularIcon/index.tsx similarity index 100% rename from src/components/common/icons/CircularIcon/index.tsx rename to apps/web/src/components/common/icons/CircularIcon/index.tsx diff --git a/src/components/common/icons/CircularIcon/styles.module.css b/apps/web/src/components/common/icons/CircularIcon/styles.module.css similarity index 100% rename from src/components/common/icons/CircularIcon/styles.module.css rename to apps/web/src/components/common/icons/CircularIcon/styles.module.css diff --git a/src/components/common/icons/KeyholeIcon/index.tsx b/apps/web/src/components/common/icons/KeyholeIcon/index.tsx similarity index 100% rename from src/components/common/icons/KeyholeIcon/index.tsx rename to apps/web/src/components/common/icons/KeyholeIcon/index.tsx diff --git a/src/components/common/icons/KeyholeIcon/keyhole.svg b/apps/web/src/components/common/icons/KeyholeIcon/keyhole.svg similarity index 100% rename from src/components/common/icons/KeyholeIcon/keyhole.svg rename to apps/web/src/components/common/icons/KeyholeIcon/keyhole.svg diff --git a/src/components/dashboard/Assets/index.tsx b/apps/web/src/components/dashboard/Assets/index.tsx similarity index 100% rename from src/components/dashboard/Assets/index.tsx rename to apps/web/src/components/dashboard/Assets/index.tsx diff --git a/src/components/dashboard/FirstSteps/index.tsx b/apps/web/src/components/dashboard/FirstSteps/index.tsx similarity index 100% rename from src/components/dashboard/FirstSteps/index.tsx rename to apps/web/src/components/dashboard/FirstSteps/index.tsx diff --git a/src/components/dashboard/FirstSteps/styles.module.css b/apps/web/src/components/dashboard/FirstSteps/styles.module.css similarity index 100% rename from src/components/dashboard/FirstSteps/styles.module.css rename to apps/web/src/components/dashboard/FirstSteps/styles.module.css diff --git a/src/components/dashboard/GovernanceSection/GovernanceSection.tsx b/apps/web/src/components/dashboard/GovernanceSection/GovernanceSection.tsx similarity index 100% rename from src/components/dashboard/GovernanceSection/GovernanceSection.tsx rename to apps/web/src/components/dashboard/GovernanceSection/GovernanceSection.tsx diff --git a/src/components/dashboard/GovernanceSection/styles.module.css b/apps/web/src/components/dashboard/GovernanceSection/styles.module.css similarity index 100% rename from src/components/dashboard/GovernanceSection/styles.module.css rename to apps/web/src/components/dashboard/GovernanceSection/styles.module.css diff --git a/src/components/dashboard/Overview/Overview.tsx b/apps/web/src/components/dashboard/Overview/Overview.tsx similarity index 100% rename from src/components/dashboard/Overview/Overview.tsx rename to apps/web/src/components/dashboard/Overview/Overview.tsx diff --git a/src/components/dashboard/PendingTxs/PendingRecoveryListItem.tsx b/apps/web/src/components/dashboard/PendingTxs/PendingRecoveryListItem.tsx similarity index 100% rename from src/components/dashboard/PendingTxs/PendingRecoveryListItem.tsx rename to apps/web/src/components/dashboard/PendingTxs/PendingRecoveryListItem.tsx diff --git a/src/components/dashboard/PendingTxs/PendingTxList.test.ts b/apps/web/src/components/dashboard/PendingTxs/PendingTxList.test.ts similarity index 100% rename from src/components/dashboard/PendingTxs/PendingTxList.test.ts rename to apps/web/src/components/dashboard/PendingTxs/PendingTxList.test.ts diff --git a/src/components/dashboard/PendingTxs/PendingTxListItem.tsx b/apps/web/src/components/dashboard/PendingTxs/PendingTxListItem.tsx similarity index 100% rename from src/components/dashboard/PendingTxs/PendingTxListItem.tsx rename to apps/web/src/components/dashboard/PendingTxs/PendingTxListItem.tsx diff --git a/src/components/dashboard/PendingTxs/PendingTxsList.tsx b/apps/web/src/components/dashboard/PendingTxs/PendingTxsList.tsx similarity index 100% rename from src/components/dashboard/PendingTxs/PendingTxsList.tsx rename to apps/web/src/components/dashboard/PendingTxs/PendingTxsList.tsx diff --git a/src/components/dashboard/PendingTxs/styles.module.css b/apps/web/src/components/dashboard/PendingTxs/styles.module.css similarity index 100% rename from src/components/dashboard/PendingTxs/styles.module.css rename to apps/web/src/components/dashboard/PendingTxs/styles.module.css diff --git a/src/components/dashboard/SafeAppsDashboardSection/SafeAppsDashboardSection.tsx b/apps/web/src/components/dashboard/SafeAppsDashboardSection/SafeAppsDashboardSection.tsx similarity index 100% rename from src/components/dashboard/SafeAppsDashboardSection/SafeAppsDashboardSection.tsx rename to apps/web/src/components/dashboard/SafeAppsDashboardSection/SafeAppsDashboardSection.tsx diff --git a/src/components/dashboard/SafeAppsDashboardSection/__tests__/SafeAppsDashboardSection.test.tsx b/apps/web/src/components/dashboard/SafeAppsDashboardSection/__tests__/SafeAppsDashboardSection.test.tsx similarity index 100% rename from src/components/dashboard/SafeAppsDashboardSection/__tests__/SafeAppsDashboardSection.test.tsx rename to apps/web/src/components/dashboard/SafeAppsDashboardSection/__tests__/SafeAppsDashboardSection.test.tsx diff --git a/src/components/dashboard/SafeAppsDashboardSection/styles.module.css b/apps/web/src/components/dashboard/SafeAppsDashboardSection/styles.module.css similarity index 100% rename from src/components/dashboard/SafeAppsDashboardSection/styles.module.css rename to apps/web/src/components/dashboard/SafeAppsDashboardSection/styles.module.css diff --git a/src/components/dashboard/StakingBanner/index.tsx b/apps/web/src/components/dashboard/StakingBanner/index.tsx similarity index 100% rename from src/components/dashboard/StakingBanner/index.tsx rename to apps/web/src/components/dashboard/StakingBanner/index.tsx diff --git a/src/components/dashboard/StakingBanner/styles.module.css b/apps/web/src/components/dashboard/StakingBanner/styles.module.css similarity index 100% rename from src/components/dashboard/StakingBanner/styles.module.css rename to apps/web/src/components/dashboard/StakingBanner/styles.module.css diff --git a/src/components/dashboard/index.tsx b/apps/web/src/components/dashboard/index.tsx similarity index 100% rename from src/components/dashboard/index.tsx rename to apps/web/src/components/dashboard/index.tsx diff --git a/src/components/dashboard/styled.tsx b/apps/web/src/components/dashboard/styled.tsx similarity index 100% rename from src/components/dashboard/styled.tsx rename to apps/web/src/components/dashboard/styled.tsx diff --git a/src/components/dashboard/styles.module.css b/apps/web/src/components/dashboard/styles.module.css similarity index 100% rename from src/components/dashboard/styles.module.css rename to apps/web/src/components/dashboard/styles.module.css diff --git a/src/components/new-safe/CardStepper/index.tsx b/apps/web/src/components/new-safe/CardStepper/index.tsx similarity index 100% rename from src/components/new-safe/CardStepper/index.tsx rename to apps/web/src/components/new-safe/CardStepper/index.tsx diff --git a/src/components/new-safe/CardStepper/styles.module.css b/apps/web/src/components/new-safe/CardStepper/styles.module.css similarity index 100% rename from src/components/new-safe/CardStepper/styles.module.css rename to apps/web/src/components/new-safe/CardStepper/styles.module.css diff --git a/src/components/new-safe/CardStepper/useCardStepper.ts b/apps/web/src/components/new-safe/CardStepper/useCardStepper.ts similarity index 100% rename from src/components/new-safe/CardStepper/useCardStepper.ts rename to apps/web/src/components/new-safe/CardStepper/useCardStepper.ts diff --git a/src/components/new-safe/OwnerRow/index.tsx b/apps/web/src/components/new-safe/OwnerRow/index.tsx similarity index 100% rename from src/components/new-safe/OwnerRow/index.tsx rename to apps/web/src/components/new-safe/OwnerRow/index.tsx diff --git a/src/components/new-safe/OwnerRow/styles.module.css b/apps/web/src/components/new-safe/OwnerRow/styles.module.css similarity index 100% rename from src/components/new-safe/OwnerRow/styles.module.css rename to apps/web/src/components/new-safe/OwnerRow/styles.module.css diff --git a/src/components/new-safe/ReviewRow/index.tsx b/apps/web/src/components/new-safe/ReviewRow/index.tsx similarity index 100% rename from src/components/new-safe/ReviewRow/index.tsx rename to apps/web/src/components/new-safe/ReviewRow/index.tsx diff --git a/src/components/new-safe/create/AdvancedCreateSafe.tsx b/apps/web/src/components/new-safe/create/AdvancedCreateSafe.tsx similarity index 100% rename from src/components/new-safe/create/AdvancedCreateSafe.tsx rename to apps/web/src/components/new-safe/create/AdvancedCreateSafe.tsx diff --git a/src/components/new-safe/create/CreateSafeInfos/index.tsx b/apps/web/src/components/new-safe/create/CreateSafeInfos/index.tsx similarity index 100% rename from src/components/new-safe/create/CreateSafeInfos/index.tsx rename to apps/web/src/components/new-safe/create/CreateSafeInfos/index.tsx diff --git a/src/components/new-safe/create/InfoWidget/index.tsx b/apps/web/src/components/new-safe/create/InfoWidget/index.tsx similarity index 100% rename from src/components/new-safe/create/InfoWidget/index.tsx rename to apps/web/src/components/new-safe/create/InfoWidget/index.tsx diff --git a/src/components/new-safe/create/InfoWidget/styles.module.css b/apps/web/src/components/new-safe/create/InfoWidget/styles.module.css similarity index 100% rename from src/components/new-safe/create/InfoWidget/styles.module.css rename to apps/web/src/components/new-safe/create/InfoWidget/styles.module.css diff --git a/src/components/new-safe/create/NetworkWarning/index.tsx b/apps/web/src/components/new-safe/create/NetworkWarning/index.tsx similarity index 100% rename from src/components/new-safe/create/NetworkWarning/index.tsx rename to apps/web/src/components/new-safe/create/NetworkWarning/index.tsx diff --git a/src/components/new-safe/create/NoWalletConnectedWarning/index.tsx b/apps/web/src/components/new-safe/create/NoWalletConnectedWarning/index.tsx similarity index 100% rename from src/components/new-safe/create/NoWalletConnectedWarning/index.tsx rename to apps/web/src/components/new-safe/create/NoWalletConnectedWarning/index.tsx diff --git a/src/components/new-safe/create/OverviewWidget/index.tsx b/apps/web/src/components/new-safe/create/OverviewWidget/index.tsx similarity index 100% rename from src/components/new-safe/create/OverviewWidget/index.tsx rename to apps/web/src/components/new-safe/create/OverviewWidget/index.tsx diff --git a/src/components/new-safe/create/OverviewWidget/styles.module.css b/apps/web/src/components/new-safe/create/OverviewWidget/styles.module.css similarity index 100% rename from src/components/new-safe/create/OverviewWidget/styles.module.css rename to apps/web/src/components/new-safe/create/OverviewWidget/styles.module.css diff --git a/src/components/new-safe/create/__tests__/useEstimateSafeCreationGas.test.ts b/apps/web/src/components/new-safe/create/__tests__/useEstimateSafeCreationGas.test.ts similarity index 100% rename from src/components/new-safe/create/__tests__/useEstimateSafeCreationGas.test.ts rename to apps/web/src/components/new-safe/create/__tests__/useEstimateSafeCreationGas.test.ts diff --git a/src/components/new-safe/create/__tests__/useSyncSafeCreationStep.test.ts b/apps/web/src/components/new-safe/create/__tests__/useSyncSafeCreationStep.test.ts similarity index 100% rename from src/components/new-safe/create/__tests__/useSyncSafeCreationStep.test.ts rename to apps/web/src/components/new-safe/create/__tests__/useSyncSafeCreationStep.test.ts diff --git a/src/components/new-safe/create/index.tsx b/apps/web/src/components/new-safe/create/index.tsx similarity index 100% rename from src/components/new-safe/create/index.tsx rename to apps/web/src/components/new-safe/create/index.tsx diff --git a/src/components/new-safe/create/logic/address-book.ts b/apps/web/src/components/new-safe/create/logic/address-book.ts similarity index 100% rename from src/components/new-safe/create/logic/address-book.ts rename to apps/web/src/components/new-safe/create/logic/address-book.ts diff --git a/src/components/new-safe/create/logic/index.test.ts b/apps/web/src/components/new-safe/create/logic/index.test.ts similarity index 100% rename from src/components/new-safe/create/logic/index.test.ts rename to apps/web/src/components/new-safe/create/logic/index.test.ts diff --git a/src/components/new-safe/create/logic/index.ts b/apps/web/src/components/new-safe/create/logic/index.ts similarity index 100% rename from src/components/new-safe/create/logic/index.ts rename to apps/web/src/components/new-safe/create/logic/index.ts diff --git a/src/components/new-safe/create/logic/utils.test.ts b/apps/web/src/components/new-safe/create/logic/utils.test.ts similarity index 100% rename from src/components/new-safe/create/logic/utils.test.ts rename to apps/web/src/components/new-safe/create/logic/utils.test.ts diff --git a/src/components/new-safe/create/logic/utils.ts b/apps/web/src/components/new-safe/create/logic/utils.ts similarity index 100% rename from src/components/new-safe/create/logic/utils.ts rename to apps/web/src/components/new-safe/create/logic/utils.ts diff --git a/src/components/new-safe/create/steps/AdvancedOptionsStep/index.tsx b/apps/web/src/components/new-safe/create/steps/AdvancedOptionsStep/index.tsx similarity index 100% rename from src/components/new-safe/create/steps/AdvancedOptionsStep/index.tsx rename to apps/web/src/components/new-safe/create/steps/AdvancedOptionsStep/index.tsx diff --git a/src/components/new-safe/create/steps/OwnerPolicyStep/index.tsx b/apps/web/src/components/new-safe/create/steps/OwnerPolicyStep/index.tsx similarity index 100% rename from src/components/new-safe/create/steps/OwnerPolicyStep/index.tsx rename to apps/web/src/components/new-safe/create/steps/OwnerPolicyStep/index.tsx diff --git a/src/components/new-safe/create/steps/OwnerPolicyStep/useSafeSetupHints.ts b/apps/web/src/components/new-safe/create/steps/OwnerPolicyStep/useSafeSetupHints.ts similarity index 100% rename from src/components/new-safe/create/steps/OwnerPolicyStep/useSafeSetupHints.ts rename to apps/web/src/components/new-safe/create/steps/OwnerPolicyStep/useSafeSetupHints.ts diff --git a/src/components/new-safe/create/steps/ReviewStep/index.test.tsx b/apps/web/src/components/new-safe/create/steps/ReviewStep/index.test.tsx similarity index 100% rename from src/components/new-safe/create/steps/ReviewStep/index.test.tsx rename to apps/web/src/components/new-safe/create/steps/ReviewStep/index.test.tsx diff --git a/src/components/new-safe/create/steps/ReviewStep/index.tsx b/apps/web/src/components/new-safe/create/steps/ReviewStep/index.tsx similarity index 100% rename from src/components/new-safe/create/steps/ReviewStep/index.tsx rename to apps/web/src/components/new-safe/create/steps/ReviewStep/index.tsx diff --git a/src/components/new-safe/create/steps/ReviewStep/styles.module.css b/apps/web/src/components/new-safe/create/steps/ReviewStep/styles.module.css similarity index 100% rename from src/components/new-safe/create/steps/ReviewStep/styles.module.css rename to apps/web/src/components/new-safe/create/steps/ReviewStep/styles.module.css diff --git a/src/components/new-safe/create/steps/SetNameStep/index.tsx b/apps/web/src/components/new-safe/create/steps/SetNameStep/index.tsx similarity index 100% rename from src/components/new-safe/create/steps/SetNameStep/index.tsx rename to apps/web/src/components/new-safe/create/steps/SetNameStep/index.tsx diff --git a/src/components/new-safe/create/steps/SetNameStep/styles.module.css b/apps/web/src/components/new-safe/create/steps/SetNameStep/styles.module.css similarity index 100% rename from src/components/new-safe/create/steps/SetNameStep/styles.module.css rename to apps/web/src/components/new-safe/create/steps/SetNameStep/styles.module.css diff --git a/src/components/new-safe/create/steps/StatusStep/LoadingSpinner/index.tsx b/apps/web/src/components/new-safe/create/steps/StatusStep/LoadingSpinner/index.tsx similarity index 100% rename from src/components/new-safe/create/steps/StatusStep/LoadingSpinner/index.tsx rename to apps/web/src/components/new-safe/create/steps/StatusStep/LoadingSpinner/index.tsx diff --git a/src/components/new-safe/create/steps/StatusStep/LoadingSpinner/styles.module.css b/apps/web/src/components/new-safe/create/steps/StatusStep/LoadingSpinner/styles.module.css similarity index 100% rename from src/components/new-safe/create/steps/StatusStep/LoadingSpinner/styles.module.css rename to apps/web/src/components/new-safe/create/steps/StatusStep/LoadingSpinner/styles.module.css diff --git a/src/components/new-safe/create/steps/StatusStep/StatusMessage.tsx b/apps/web/src/components/new-safe/create/steps/StatusStep/StatusMessage.tsx similarity index 100% rename from src/components/new-safe/create/steps/StatusStep/StatusMessage.tsx rename to apps/web/src/components/new-safe/create/steps/StatusStep/StatusMessage.tsx diff --git a/src/components/new-safe/create/steps/StatusStep/StatusStep.tsx b/apps/web/src/components/new-safe/create/steps/StatusStep/StatusStep.tsx similarity index 100% rename from src/components/new-safe/create/steps/StatusStep/StatusStep.tsx rename to apps/web/src/components/new-safe/create/steps/StatusStep/StatusStep.tsx diff --git a/src/components/new-safe/create/steps/StatusStep/index.tsx b/apps/web/src/components/new-safe/create/steps/StatusStep/index.tsx similarity index 100% rename from src/components/new-safe/create/steps/StatusStep/index.tsx rename to apps/web/src/components/new-safe/create/steps/StatusStep/index.tsx diff --git a/src/components/new-safe/create/steps/StatusStep/styles.module.css b/apps/web/src/components/new-safe/create/steps/StatusStep/styles.module.css similarity index 100% rename from src/components/new-safe/create/steps/StatusStep/styles.module.css rename to apps/web/src/components/new-safe/create/steps/StatusStep/styles.module.css diff --git a/src/components/new-safe/create/steps/StatusStep/useUndeployedSafe.ts b/apps/web/src/components/new-safe/create/steps/StatusStep/useUndeployedSafe.ts similarity index 100% rename from src/components/new-safe/create/steps/StatusStep/useUndeployedSafe.ts rename to apps/web/src/components/new-safe/create/steps/StatusStep/useUndeployedSafe.ts diff --git a/src/components/new-safe/create/styles.module.css b/apps/web/src/components/new-safe/create/styles.module.css similarity index 100% rename from src/components/new-safe/create/styles.module.css rename to apps/web/src/components/new-safe/create/styles.module.css diff --git a/src/components/new-safe/create/types.d.ts b/apps/web/src/components/new-safe/create/types.d.ts similarity index 100% rename from src/components/new-safe/create/types.d.ts rename to apps/web/src/components/new-safe/create/types.d.ts diff --git a/src/components/new-safe/create/useEstimateSafeCreationGas.ts b/apps/web/src/components/new-safe/create/useEstimateSafeCreationGas.ts similarity index 100% rename from src/components/new-safe/create/useEstimateSafeCreationGas.ts rename to apps/web/src/components/new-safe/create/useEstimateSafeCreationGas.ts diff --git a/src/components/new-safe/create/useSyncSafeCreationStep.ts b/apps/web/src/components/new-safe/create/useSyncSafeCreationStep.ts similarity index 100% rename from src/components/new-safe/create/useSyncSafeCreationStep.ts rename to apps/web/src/components/new-safe/create/useSyncSafeCreationStep.ts diff --git a/src/components/new-safe/load/index.tsx b/apps/web/src/components/new-safe/load/index.tsx similarity index 100% rename from src/components/new-safe/load/index.tsx rename to apps/web/src/components/new-safe/load/index.tsx diff --git a/src/components/new-safe/load/steps/SafeOwnerStep/index.tsx b/apps/web/src/components/new-safe/load/steps/SafeOwnerStep/index.tsx similarity index 100% rename from src/components/new-safe/load/steps/SafeOwnerStep/index.tsx rename to apps/web/src/components/new-safe/load/steps/SafeOwnerStep/index.tsx diff --git a/src/components/new-safe/load/steps/SafeReviewStep/index.tsx b/apps/web/src/components/new-safe/load/steps/SafeReviewStep/index.tsx similarity index 100% rename from src/components/new-safe/load/steps/SafeReviewStep/index.tsx rename to apps/web/src/components/new-safe/load/steps/SafeReviewStep/index.tsx diff --git a/src/components/new-safe/load/steps/SetAddressStep/index.tsx b/apps/web/src/components/new-safe/load/steps/SetAddressStep/index.tsx similarity index 100% rename from src/components/new-safe/load/steps/SetAddressStep/index.tsx rename to apps/web/src/components/new-safe/load/steps/SetAddressStep/index.tsx diff --git a/src/components/nfts/NftCollections/index.tsx b/apps/web/src/components/nfts/NftCollections/index.tsx similarity index 100% rename from src/components/nfts/NftCollections/index.tsx rename to apps/web/src/components/nfts/NftCollections/index.tsx diff --git a/src/components/nfts/NftGrid/index.tsx b/apps/web/src/components/nfts/NftGrid/index.tsx similarity index 100% rename from src/components/nfts/NftGrid/index.tsx rename to apps/web/src/components/nfts/NftGrid/index.tsx diff --git a/src/components/nfts/NftPreviewModal/index.tsx b/apps/web/src/components/nfts/NftPreviewModal/index.tsx similarity index 100% rename from src/components/nfts/NftPreviewModal/index.tsx rename to apps/web/src/components/nfts/NftPreviewModal/index.tsx diff --git a/src/components/nfts/NftPreviewModal/styles.module.css b/apps/web/src/components/nfts/NftPreviewModal/styles.module.css similarity index 100% rename from src/components/nfts/NftPreviewModal/styles.module.css rename to apps/web/src/components/nfts/NftPreviewModal/styles.module.css diff --git a/src/components/nfts/NftSendForm/index.tsx b/apps/web/src/components/nfts/NftSendForm/index.tsx similarity index 100% rename from src/components/nfts/NftSendForm/index.tsx rename to apps/web/src/components/nfts/NftSendForm/index.tsx diff --git a/src/components/nfts/config.ts b/apps/web/src/components/nfts/config.ts similarity index 100% rename from src/components/nfts/config.ts rename to apps/web/src/components/nfts/config.ts diff --git a/src/components/notification-center/NotificationCenter/index.tsx b/apps/web/src/components/notification-center/NotificationCenter/index.tsx similarity index 100% rename from src/components/notification-center/NotificationCenter/index.tsx rename to apps/web/src/components/notification-center/NotificationCenter/index.tsx diff --git a/src/components/notification-center/NotificationCenter/styles.module.css b/apps/web/src/components/notification-center/NotificationCenter/styles.module.css similarity index 100% rename from src/components/notification-center/NotificationCenter/styles.module.css rename to apps/web/src/components/notification-center/NotificationCenter/styles.module.css diff --git a/src/components/notification-center/NotificationCenterItem/index.tsx b/apps/web/src/components/notification-center/NotificationCenterItem/index.tsx similarity index 100% rename from src/components/notification-center/NotificationCenterItem/index.tsx rename to apps/web/src/components/notification-center/NotificationCenterItem/index.tsx diff --git a/src/components/notification-center/NotificationCenterItem/styles.module.css b/apps/web/src/components/notification-center/NotificationCenterItem/styles.module.css similarity index 100% rename from src/components/notification-center/NotificationCenterItem/styles.module.css rename to apps/web/src/components/notification-center/NotificationCenterItem/styles.module.css diff --git a/src/components/notification-center/NotificationCenterList/index.tsx b/apps/web/src/components/notification-center/NotificationCenterList/index.tsx similarity index 100% rename from src/components/notification-center/NotificationCenterList/index.tsx rename to apps/web/src/components/notification-center/NotificationCenterList/index.tsx diff --git a/src/components/notification-center/NotificationCenterList/styles.module.css b/apps/web/src/components/notification-center/NotificationCenterList/styles.module.css similarity index 100% rename from src/components/notification-center/NotificationCenterList/styles.module.css rename to apps/web/src/components/notification-center/NotificationCenterList/styles.module.css diff --git a/src/components/safe-apps/AddCustomAppModal/CustomApp.tsx b/apps/web/src/components/safe-apps/AddCustomAppModal/CustomApp.tsx similarity index 100% rename from src/components/safe-apps/AddCustomAppModal/CustomApp.tsx rename to apps/web/src/components/safe-apps/AddCustomAppModal/CustomApp.tsx diff --git a/src/components/safe-apps/AddCustomAppModal/CustomAppPlaceholder.tsx b/apps/web/src/components/safe-apps/AddCustomAppModal/CustomAppPlaceholder.tsx similarity index 100% rename from src/components/safe-apps/AddCustomAppModal/CustomAppPlaceholder.tsx rename to apps/web/src/components/safe-apps/AddCustomAppModal/CustomAppPlaceholder.tsx diff --git a/src/components/safe-apps/AddCustomAppModal/index.tsx b/apps/web/src/components/safe-apps/AddCustomAppModal/index.tsx similarity index 100% rename from src/components/safe-apps/AddCustomAppModal/index.tsx rename to apps/web/src/components/safe-apps/AddCustomAppModal/index.tsx diff --git a/src/components/safe-apps/AddCustomAppModal/styles.module.css b/apps/web/src/components/safe-apps/AddCustomAppModal/styles.module.css similarity index 100% rename from src/components/safe-apps/AddCustomAppModal/styles.module.css rename to apps/web/src/components/safe-apps/AddCustomAppModal/styles.module.css diff --git a/src/components/safe-apps/AddCustomSafeAppCard/index.tsx b/apps/web/src/components/safe-apps/AddCustomSafeAppCard/index.tsx similarity index 100% rename from src/components/safe-apps/AddCustomSafeAppCard/index.tsx rename to apps/web/src/components/safe-apps/AddCustomSafeAppCard/index.tsx diff --git a/src/components/safe-apps/AppFrame/SafeAppIframe.tsx b/apps/web/src/components/safe-apps/AppFrame/SafeAppIframe.tsx similarity index 100% rename from src/components/safe-apps/AppFrame/SafeAppIframe.tsx rename to apps/web/src/components/safe-apps/AppFrame/SafeAppIframe.tsx diff --git a/src/components/safe-apps/AppFrame/ThirdPartyCookiesWarning.tsx b/apps/web/src/components/safe-apps/AppFrame/ThirdPartyCookiesWarning.tsx similarity index 100% rename from src/components/safe-apps/AppFrame/ThirdPartyCookiesWarning.tsx rename to apps/web/src/components/safe-apps/AppFrame/ThirdPartyCookiesWarning.tsx diff --git a/src/components/safe-apps/AppFrame/TransactionQueueBar/index.tsx b/apps/web/src/components/safe-apps/AppFrame/TransactionQueueBar/index.tsx similarity index 100% rename from src/components/safe-apps/AppFrame/TransactionQueueBar/index.tsx rename to apps/web/src/components/safe-apps/AppFrame/TransactionQueueBar/index.tsx diff --git a/src/components/safe-apps/AppFrame/TransactionQueueBar/styles.module.css b/apps/web/src/components/safe-apps/AppFrame/TransactionQueueBar/styles.module.css similarity index 100% rename from src/components/safe-apps/AppFrame/TransactionQueueBar/styles.module.css rename to apps/web/src/components/safe-apps/AppFrame/TransactionQueueBar/styles.module.css diff --git a/src/components/safe-apps/AppFrame/__tests__/AppFrame.test.tsx b/apps/web/src/components/safe-apps/AppFrame/__tests__/AppFrame.test.tsx similarity index 100% rename from src/components/safe-apps/AppFrame/__tests__/AppFrame.test.tsx rename to apps/web/src/components/safe-apps/AppFrame/__tests__/AppFrame.test.tsx diff --git a/src/components/safe-apps/AppFrame/index.tsx b/apps/web/src/components/safe-apps/AppFrame/index.tsx similarity index 100% rename from src/components/safe-apps/AppFrame/index.tsx rename to apps/web/src/components/safe-apps/AppFrame/index.tsx diff --git a/src/components/safe-apps/AppFrame/styles.module.css b/apps/web/src/components/safe-apps/AppFrame/styles.module.css similarity index 100% rename from src/components/safe-apps/AppFrame/styles.module.css rename to apps/web/src/components/safe-apps/AppFrame/styles.module.css diff --git a/src/components/safe-apps/AppFrame/useAppCommunicator.ts b/apps/web/src/components/safe-apps/AppFrame/useAppCommunicator.ts similarity index 100% rename from src/components/safe-apps/AppFrame/useAppCommunicator.ts rename to apps/web/src/components/safe-apps/AppFrame/useAppCommunicator.ts diff --git a/src/components/safe-apps/AppFrame/useAppIsLoading.ts b/apps/web/src/components/safe-apps/AppFrame/useAppIsLoading.ts similarity index 100% rename from src/components/safe-apps/AppFrame/useAppIsLoading.ts rename to apps/web/src/components/safe-apps/AppFrame/useAppIsLoading.ts diff --git a/src/components/safe-apps/AppFrame/useFromAppAnalytics.ts b/apps/web/src/components/safe-apps/AppFrame/useFromAppAnalytics.ts similarity index 100% rename from src/components/safe-apps/AppFrame/useFromAppAnalytics.ts rename to apps/web/src/components/safe-apps/AppFrame/useFromAppAnalytics.ts diff --git a/src/components/safe-apps/AppFrame/useGetSafeInfo.ts b/apps/web/src/components/safe-apps/AppFrame/useGetSafeInfo.ts similarity index 100% rename from src/components/safe-apps/AppFrame/useGetSafeInfo.ts rename to apps/web/src/components/safe-apps/AppFrame/useGetSafeInfo.ts diff --git a/src/components/safe-apps/AppFrame/useThirdPartyCookies.ts b/apps/web/src/components/safe-apps/AppFrame/useThirdPartyCookies.ts similarity index 100% rename from src/components/safe-apps/AppFrame/useThirdPartyCookies.ts rename to apps/web/src/components/safe-apps/AppFrame/useThirdPartyCookies.ts diff --git a/src/components/safe-apps/AppFrame/useTransactionQueueBarState.ts b/apps/web/src/components/safe-apps/AppFrame/useTransactionQueueBarState.ts similarity index 100% rename from src/components/safe-apps/AppFrame/useTransactionQueueBarState.ts rename to apps/web/src/components/safe-apps/AppFrame/useTransactionQueueBarState.ts diff --git a/src/components/safe-apps/NativeSwapsCard/index.stories.tsx b/apps/web/src/components/safe-apps/NativeSwapsCard/index.stories.tsx similarity index 100% rename from src/components/safe-apps/NativeSwapsCard/index.stories.tsx rename to apps/web/src/components/safe-apps/NativeSwapsCard/index.stories.tsx diff --git a/src/components/safe-apps/NativeSwapsCard/index.tsx b/apps/web/src/components/safe-apps/NativeSwapsCard/index.tsx similarity index 100% rename from src/components/safe-apps/NativeSwapsCard/index.tsx rename to apps/web/src/components/safe-apps/NativeSwapsCard/index.tsx diff --git a/src/components/safe-apps/NativeSwapsCard/styles.module.css b/apps/web/src/components/safe-apps/NativeSwapsCard/styles.module.css similarity index 100% rename from src/components/safe-apps/NativeSwapsCard/styles.module.css rename to apps/web/src/components/safe-apps/NativeSwapsCard/styles.module.css diff --git a/src/components/safe-apps/PermissionCheckbox.tsx b/apps/web/src/components/safe-apps/PermissionCheckbox.tsx similarity index 100% rename from src/components/safe-apps/PermissionCheckbox.tsx rename to apps/web/src/components/safe-apps/PermissionCheckbox.tsx diff --git a/src/components/safe-apps/PermissionsPrompt.tsx b/apps/web/src/components/safe-apps/PermissionsPrompt.tsx similarity index 100% rename from src/components/safe-apps/PermissionsPrompt.tsx rename to apps/web/src/components/safe-apps/PermissionsPrompt.tsx diff --git a/src/components/safe-apps/RemoveCustomAppModal.tsx b/apps/web/src/components/safe-apps/RemoveCustomAppModal.tsx similarity index 100% rename from src/components/safe-apps/RemoveCustomAppModal.tsx rename to apps/web/src/components/safe-apps/RemoveCustomAppModal.tsx diff --git a/src/components/safe-apps/SafeAppActionButtons/index.tsx b/apps/web/src/components/safe-apps/SafeAppActionButtons/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppActionButtons/index.tsx rename to apps/web/src/components/safe-apps/SafeAppActionButtons/index.tsx diff --git a/src/components/safe-apps/SafeAppCard/index.tsx b/apps/web/src/components/safe-apps/SafeAppCard/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppCard/index.tsx rename to apps/web/src/components/safe-apps/SafeAppCard/index.tsx diff --git a/src/components/safe-apps/SafeAppCard/styles.module.css b/apps/web/src/components/safe-apps/SafeAppCard/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppCard/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppCard/styles.module.css diff --git a/src/components/safe-apps/SafeAppIconCard/index.test.tsx b/apps/web/src/components/safe-apps/SafeAppIconCard/index.test.tsx similarity index 100% rename from src/components/safe-apps/SafeAppIconCard/index.test.tsx rename to apps/web/src/components/safe-apps/SafeAppIconCard/index.test.tsx diff --git a/src/components/safe-apps/SafeAppIconCard/index.tsx b/apps/web/src/components/safe-apps/SafeAppIconCard/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppIconCard/index.tsx rename to apps/web/src/components/safe-apps/SafeAppIconCard/index.tsx diff --git a/src/components/safe-apps/SafeAppLandingPage/AppActions.tsx b/apps/web/src/components/safe-apps/SafeAppLandingPage/AppActions.tsx similarity index 100% rename from src/components/safe-apps/SafeAppLandingPage/AppActions.tsx rename to apps/web/src/components/safe-apps/SafeAppLandingPage/AppActions.tsx diff --git a/src/components/safe-apps/SafeAppLandingPage/SafeAppDetails.tsx b/apps/web/src/components/safe-apps/SafeAppLandingPage/SafeAppDetails.tsx similarity index 100% rename from src/components/safe-apps/SafeAppLandingPage/SafeAppDetails.tsx rename to apps/web/src/components/safe-apps/SafeAppLandingPage/SafeAppDetails.tsx diff --git a/src/components/safe-apps/SafeAppLandingPage/TryDemo.tsx b/apps/web/src/components/safe-apps/SafeAppLandingPage/TryDemo.tsx similarity index 100% rename from src/components/safe-apps/SafeAppLandingPage/TryDemo.tsx rename to apps/web/src/components/safe-apps/SafeAppLandingPage/TryDemo.tsx diff --git a/src/components/safe-apps/SafeAppLandingPage/constants.ts b/apps/web/src/components/safe-apps/SafeAppLandingPage/constants.ts similarity index 100% rename from src/components/safe-apps/SafeAppLandingPage/constants.ts rename to apps/web/src/components/safe-apps/SafeAppLandingPage/constants.ts diff --git a/src/components/safe-apps/SafeAppLandingPage/index.tsx b/apps/web/src/components/safe-apps/SafeAppLandingPage/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppLandingPage/index.tsx rename to apps/web/src/components/safe-apps/SafeAppLandingPage/index.tsx diff --git a/src/components/safe-apps/SafeAppList/index.tsx b/apps/web/src/components/safe-apps/SafeAppList/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppList/index.tsx rename to apps/web/src/components/safe-apps/SafeAppList/index.tsx diff --git a/src/components/safe-apps/SafeAppList/styles.module.css b/apps/web/src/components/safe-apps/SafeAppList/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppList/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppList/styles.module.css diff --git a/src/components/safe-apps/SafeAppPreviewDrawer/index.tsx b/apps/web/src/components/safe-apps/SafeAppPreviewDrawer/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppPreviewDrawer/index.tsx rename to apps/web/src/components/safe-apps/SafeAppPreviewDrawer/index.tsx diff --git a/src/components/safe-apps/SafeAppPreviewDrawer/styles.module.css b/apps/web/src/components/safe-apps/SafeAppPreviewDrawer/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppPreviewDrawer/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppPreviewDrawer/styles.module.css diff --git a/src/components/safe-apps/SafeAppSocialLinksCard/SafeAppSocialLinksCard.test.tsx b/apps/web/src/components/safe-apps/SafeAppSocialLinksCard/SafeAppSocialLinksCard.test.tsx similarity index 100% rename from src/components/safe-apps/SafeAppSocialLinksCard/SafeAppSocialLinksCard.test.tsx rename to apps/web/src/components/safe-apps/SafeAppSocialLinksCard/SafeAppSocialLinksCard.test.tsx diff --git a/src/components/safe-apps/SafeAppSocialLinksCard/index.tsx b/apps/web/src/components/safe-apps/SafeAppSocialLinksCard/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppSocialLinksCard/index.tsx rename to apps/web/src/components/safe-apps/SafeAppSocialLinksCard/index.tsx diff --git a/src/components/safe-apps/SafeAppSocialLinksCard/styles.module.css b/apps/web/src/components/safe-apps/SafeAppSocialLinksCard/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppSocialLinksCard/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppSocialLinksCard/styles.module.css diff --git a/src/components/safe-apps/SafeAppTags/index.tsx b/apps/web/src/components/safe-apps/SafeAppTags/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppTags/index.tsx rename to apps/web/src/components/safe-apps/SafeAppTags/index.tsx diff --git a/src/components/safe-apps/SafeAppTags/styles.module.css b/apps/web/src/components/safe-apps/SafeAppTags/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppTags/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppTags/styles.module.css diff --git a/src/components/safe-apps/SafeAppsErrorBoundary/SafeAppsLoadError.tsx b/apps/web/src/components/safe-apps/SafeAppsErrorBoundary/SafeAppsLoadError.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsErrorBoundary/SafeAppsLoadError.tsx rename to apps/web/src/components/safe-apps/SafeAppsErrorBoundary/SafeAppsLoadError.tsx diff --git a/src/components/safe-apps/SafeAppsErrorBoundary/index.tsx b/apps/web/src/components/safe-apps/SafeAppsErrorBoundary/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsErrorBoundary/index.tsx rename to apps/web/src/components/safe-apps/SafeAppsErrorBoundary/index.tsx diff --git a/src/components/safe-apps/SafeAppsErrorBoundary/styles.module.css b/apps/web/src/components/safe-apps/SafeAppsErrorBoundary/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppsErrorBoundary/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppsErrorBoundary/styles.module.css diff --git a/src/components/safe-apps/SafeAppsFilters/index.tsx b/apps/web/src/components/safe-apps/SafeAppsFilters/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsFilters/index.tsx rename to apps/web/src/components/safe-apps/SafeAppsFilters/index.tsx diff --git a/src/components/safe-apps/SafeAppsFilters/styles.module.css b/apps/web/src/components/safe-apps/SafeAppsFilters/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppsFilters/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppsFilters/styles.module.css diff --git a/src/components/safe-apps/SafeAppsHeader/index.tsx b/apps/web/src/components/safe-apps/SafeAppsHeader/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsHeader/index.tsx rename to apps/web/src/components/safe-apps/SafeAppsHeader/index.tsx diff --git a/src/components/safe-apps/SafeAppsHeader/styles.module.css b/apps/web/src/components/safe-apps/SafeAppsHeader/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppsHeader/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppsHeader/styles.module.css diff --git a/src/components/safe-apps/SafeAppsInfoModal/AllowedFeaturesList.tsx b/apps/web/src/components/safe-apps/SafeAppsInfoModal/AllowedFeaturesList.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsInfoModal/AllowedFeaturesList.tsx rename to apps/web/src/components/safe-apps/SafeAppsInfoModal/AllowedFeaturesList.tsx diff --git a/src/components/safe-apps/SafeAppsInfoModal/Domain.tsx b/apps/web/src/components/safe-apps/SafeAppsInfoModal/Domain.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsInfoModal/Domain.tsx rename to apps/web/src/components/safe-apps/SafeAppsInfoModal/Domain.tsx diff --git a/src/components/safe-apps/SafeAppsInfoModal/Slider.tsx b/apps/web/src/components/safe-apps/SafeAppsInfoModal/Slider.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsInfoModal/Slider.tsx rename to apps/web/src/components/safe-apps/SafeAppsInfoModal/Slider.tsx diff --git a/src/components/safe-apps/SafeAppsInfoModal/UnknownAppWarning.tsx b/apps/web/src/components/safe-apps/SafeAppsInfoModal/UnknownAppWarning.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsInfoModal/UnknownAppWarning.tsx rename to apps/web/src/components/safe-apps/SafeAppsInfoModal/UnknownAppWarning.tsx diff --git a/src/components/safe-apps/SafeAppsInfoModal/constants.ts b/apps/web/src/components/safe-apps/SafeAppsInfoModal/constants.ts similarity index 100% rename from src/components/safe-apps/SafeAppsInfoModal/constants.ts rename to apps/web/src/components/safe-apps/SafeAppsInfoModal/constants.ts diff --git a/src/components/safe-apps/SafeAppsInfoModal/index.tsx b/apps/web/src/components/safe-apps/SafeAppsInfoModal/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsInfoModal/index.tsx rename to apps/web/src/components/safe-apps/SafeAppsInfoModal/index.tsx diff --git a/src/components/safe-apps/SafeAppsInfoModal/styles.module.css b/apps/web/src/components/safe-apps/SafeAppsInfoModal/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppsInfoModal/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppsInfoModal/styles.module.css diff --git a/src/components/safe-apps/SafeAppsInfoModal/useSafeAppsInfoModal.ts b/apps/web/src/components/safe-apps/SafeAppsInfoModal/useSafeAppsInfoModal.ts similarity index 100% rename from src/components/safe-apps/SafeAppsInfoModal/useSafeAppsInfoModal.ts rename to apps/web/src/components/safe-apps/SafeAppsInfoModal/useSafeAppsInfoModal.ts diff --git a/src/components/safe-apps/SafeAppsListHeader/index.tsx b/apps/web/src/components/safe-apps/SafeAppsListHeader/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsListHeader/index.tsx rename to apps/web/src/components/safe-apps/SafeAppsListHeader/index.tsx diff --git a/src/components/safe-apps/SafeAppsListHeader/styles.module.css b/apps/web/src/components/safe-apps/SafeAppsListHeader/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppsListHeader/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppsListHeader/styles.module.css diff --git a/src/components/safe-apps/SafeAppsSDKLink/index.tsx b/apps/web/src/components/safe-apps/SafeAppsSDKLink/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsSDKLink/index.tsx rename to apps/web/src/components/safe-apps/SafeAppsSDKLink/index.tsx diff --git a/src/components/safe-apps/SafeAppsSDKLink/styles.module.css b/apps/web/src/components/safe-apps/SafeAppsSDKLink/styles.module.css similarity index 100% rename from src/components/safe-apps/SafeAppsSDKLink/styles.module.css rename to apps/web/src/components/safe-apps/SafeAppsSDKLink/styles.module.css diff --git a/src/components/safe-apps/SafeAppsZeroResultsPlaceholder/index.tsx b/apps/web/src/components/safe-apps/SafeAppsZeroResultsPlaceholder/index.tsx similarity index 100% rename from src/components/safe-apps/SafeAppsZeroResultsPlaceholder/index.tsx rename to apps/web/src/components/safe-apps/SafeAppsZeroResultsPlaceholder/index.tsx diff --git a/src/components/safe-apps/hooks/useShareSafeAppUrl.ts b/apps/web/src/components/safe-apps/hooks/useShareSafeAppUrl.ts similarity index 100% rename from src/components/safe-apps/hooks/useShareSafeAppUrl.ts rename to apps/web/src/components/safe-apps/hooks/useShareSafeAppUrl.ts diff --git a/src/components/safe-apps/types.ts b/apps/web/src/components/safe-apps/types.ts similarity index 100% rename from src/components/safe-apps/types.ts rename to apps/web/src/components/safe-apps/types.ts diff --git a/src/components/safe-apps/utils.ts b/apps/web/src/components/safe-apps/utils.ts similarity index 100% rename from src/components/safe-apps/utils.ts rename to apps/web/src/components/safe-apps/utils.ts diff --git a/src/components/safe-messages/DecodedMsg/index.tsx b/apps/web/src/components/safe-messages/DecodedMsg/index.tsx similarity index 100% rename from src/components/safe-messages/DecodedMsg/index.tsx rename to apps/web/src/components/safe-messages/DecodedMsg/index.tsx diff --git a/src/components/safe-messages/DecodedMsg/styles.module.css b/apps/web/src/components/safe-messages/DecodedMsg/styles.module.css similarity index 100% rename from src/components/safe-messages/DecodedMsg/styles.module.css rename to apps/web/src/components/safe-messages/DecodedMsg/styles.module.css diff --git a/src/components/safe-messages/InfoBox/index.tsx b/apps/web/src/components/safe-messages/InfoBox/index.tsx similarity index 100% rename from src/components/safe-messages/InfoBox/index.tsx rename to apps/web/src/components/safe-messages/InfoBox/index.tsx diff --git a/src/components/safe-messages/InfoBox/styles.module.css b/apps/web/src/components/safe-messages/InfoBox/styles.module.css similarity index 100% rename from src/components/safe-messages/InfoBox/styles.module.css rename to apps/web/src/components/safe-messages/InfoBox/styles.module.css diff --git a/src/components/safe-messages/Msg/index.tsx b/apps/web/src/components/safe-messages/Msg/index.tsx similarity index 100% rename from src/components/safe-messages/Msg/index.tsx rename to apps/web/src/components/safe-messages/Msg/index.tsx diff --git a/src/components/safe-messages/Msg/styles.module.css b/apps/web/src/components/safe-messages/Msg/styles.module.css similarity index 100% rename from src/components/safe-messages/Msg/styles.module.css rename to apps/web/src/components/safe-messages/Msg/styles.module.css diff --git a/src/components/safe-messages/MsgDetails/index.tsx b/apps/web/src/components/safe-messages/MsgDetails/index.tsx similarity index 100% rename from src/components/safe-messages/MsgDetails/index.tsx rename to apps/web/src/components/safe-messages/MsgDetails/index.tsx diff --git a/src/components/safe-messages/MsgList/index.tsx b/apps/web/src/components/safe-messages/MsgList/index.tsx similarity index 100% rename from src/components/safe-messages/MsgList/index.tsx rename to apps/web/src/components/safe-messages/MsgList/index.tsx diff --git a/src/components/safe-messages/MsgListItem/ExpandableMsgItem.tsx b/apps/web/src/components/safe-messages/MsgListItem/ExpandableMsgItem.tsx similarity index 100% rename from src/components/safe-messages/MsgListItem/ExpandableMsgItem.tsx rename to apps/web/src/components/safe-messages/MsgListItem/ExpandableMsgItem.tsx diff --git a/src/components/safe-messages/MsgListItem/index.tsx b/apps/web/src/components/safe-messages/MsgListItem/index.tsx similarity index 100% rename from src/components/safe-messages/MsgListItem/index.tsx rename to apps/web/src/components/safe-messages/MsgListItem/index.tsx diff --git a/src/components/safe-messages/MsgShareLink/index.tsx b/apps/web/src/components/safe-messages/MsgShareLink/index.tsx similarity index 100% rename from src/components/safe-messages/MsgShareLink/index.tsx rename to apps/web/src/components/safe-messages/MsgShareLink/index.tsx diff --git a/src/components/safe-messages/MsgSigners/MsgSigners.test.tsx b/apps/web/src/components/safe-messages/MsgSigners/MsgSigners.test.tsx similarity index 100% rename from src/components/safe-messages/MsgSigners/MsgSigners.test.tsx rename to apps/web/src/components/safe-messages/MsgSigners/MsgSigners.test.tsx diff --git a/src/components/safe-messages/MsgSigners/index.tsx b/apps/web/src/components/safe-messages/MsgSigners/index.tsx similarity index 100% rename from src/components/safe-messages/MsgSigners/index.tsx rename to apps/web/src/components/safe-messages/MsgSigners/index.tsx diff --git a/src/components/safe-messages/MsgSigners/styles.module.css b/apps/web/src/components/safe-messages/MsgSigners/styles.module.css similarity index 100% rename from src/components/safe-messages/MsgSigners/styles.module.css rename to apps/web/src/components/safe-messages/MsgSigners/styles.module.css diff --git a/src/components/safe-messages/MsgSummary/index.tsx b/apps/web/src/components/safe-messages/MsgSummary/index.tsx similarity index 100% rename from src/components/safe-messages/MsgSummary/index.tsx rename to apps/web/src/components/safe-messages/MsgSummary/index.tsx diff --git a/src/components/safe-messages/MsgType/index.tsx b/apps/web/src/components/safe-messages/MsgType/index.tsx similarity index 100% rename from src/components/safe-messages/MsgType/index.tsx rename to apps/web/src/components/safe-messages/MsgType/index.tsx diff --git a/src/components/safe-messages/PaginatedMsgs/index.tsx b/apps/web/src/components/safe-messages/PaginatedMsgs/index.tsx similarity index 100% rename from src/components/safe-messages/PaginatedMsgs/index.tsx rename to apps/web/src/components/safe-messages/PaginatedMsgs/index.tsx diff --git a/src/components/safe-messages/SignMsgButton/index.tsx b/apps/web/src/components/safe-messages/SignMsgButton/index.tsx similarity index 100% rename from src/components/safe-messages/SignMsgButton/index.tsx rename to apps/web/src/components/safe-messages/SignMsgButton/index.tsx diff --git a/src/components/safe-messages/SingleMsg/SingleMsg.test.tsx b/apps/web/src/components/safe-messages/SingleMsg/SingleMsg.test.tsx similarity index 100% rename from src/components/safe-messages/SingleMsg/SingleMsg.test.tsx rename to apps/web/src/components/safe-messages/SingleMsg/SingleMsg.test.tsx diff --git a/src/components/safe-messages/SingleMsg/index.tsx b/apps/web/src/components/safe-messages/SingleMsg/index.tsx similarity index 100% rename from src/components/safe-messages/SingleMsg/index.tsx rename to apps/web/src/components/safe-messages/SingleMsg/index.tsx diff --git a/src/components/settings/ContractVersion/index.tsx b/apps/web/src/components/settings/ContractVersion/index.tsx similarity index 100% rename from src/components/settings/ContractVersion/index.tsx rename to apps/web/src/components/settings/ContractVersion/index.tsx diff --git a/src/components/settings/DataManagement/FileListCard.tsx b/apps/web/src/components/settings/DataManagement/FileListCard.tsx similarity index 100% rename from src/components/settings/DataManagement/FileListCard.tsx rename to apps/web/src/components/settings/DataManagement/FileListCard.tsx diff --git a/src/components/settings/DataManagement/ImportDialog.tsx b/apps/web/src/components/settings/DataManagement/ImportDialog.tsx similarity index 100% rename from src/components/settings/DataManagement/ImportDialog.tsx rename to apps/web/src/components/settings/DataManagement/ImportDialog.tsx diff --git a/src/components/settings/DataManagement/ImportFileUpload.tsx b/apps/web/src/components/settings/DataManagement/ImportFileUpload.tsx similarity index 100% rename from src/components/settings/DataManagement/ImportFileUpload.tsx rename to apps/web/src/components/settings/DataManagement/ImportFileUpload.tsx diff --git a/src/components/settings/DataManagement/__tests__/useGlobalImportFileParser.test.ts b/apps/web/src/components/settings/DataManagement/__tests__/useGlobalImportFileParser.test.ts similarity index 100% rename from src/components/settings/DataManagement/__tests__/useGlobalImportFileParser.test.ts rename to apps/web/src/components/settings/DataManagement/__tests__/useGlobalImportFileParser.test.ts diff --git a/src/components/settings/DataManagement/index.tsx b/apps/web/src/components/settings/DataManagement/index.tsx similarity index 100% rename from src/components/settings/DataManagement/index.tsx rename to apps/web/src/components/settings/DataManagement/index.tsx diff --git a/src/components/settings/DataManagement/styles.module.css b/apps/web/src/components/settings/DataManagement/styles.module.css similarity index 100% rename from src/components/settings/DataManagement/styles.module.css rename to apps/web/src/components/settings/DataManagement/styles.module.css diff --git a/src/components/settings/DataManagement/useGlobalImportFileParser.ts b/apps/web/src/components/settings/DataManagement/useGlobalImportFileParser.ts similarity index 100% rename from src/components/settings/DataManagement/useGlobalImportFileParser.ts rename to apps/web/src/components/settings/DataManagement/useGlobalImportFileParser.ts diff --git a/src/components/settings/EnvironmentVariables/EnvHintButton/index.tsx b/apps/web/src/components/settings/EnvironmentVariables/EnvHintButton/index.tsx similarity index 100% rename from src/components/settings/EnvironmentVariables/EnvHintButton/index.tsx rename to apps/web/src/components/settings/EnvironmentVariables/EnvHintButton/index.tsx diff --git a/src/components/settings/EnvironmentVariables/EnvHintButton/styles.module.css b/apps/web/src/components/settings/EnvironmentVariables/EnvHintButton/styles.module.css similarity index 100% rename from src/components/settings/EnvironmentVariables/EnvHintButton/styles.module.css rename to apps/web/src/components/settings/EnvironmentVariables/EnvHintButton/styles.module.css diff --git a/src/components/settings/EnvironmentVariables/index.tsx b/apps/web/src/components/settings/EnvironmentVariables/index.tsx similarity index 100% rename from src/components/settings/EnvironmentVariables/index.tsx rename to apps/web/src/components/settings/EnvironmentVariables/index.tsx diff --git a/src/components/settings/FallbackHandler/__tests__/index.test.tsx b/apps/web/src/components/settings/FallbackHandler/__tests__/index.test.tsx similarity index 100% rename from src/components/settings/FallbackHandler/__tests__/index.test.tsx rename to apps/web/src/components/settings/FallbackHandler/__tests__/index.test.tsx diff --git a/src/components/settings/FallbackHandler/index.tsx b/apps/web/src/components/settings/FallbackHandler/index.tsx similarity index 100% rename from src/components/settings/FallbackHandler/index.tsx rename to apps/web/src/components/settings/FallbackHandler/index.tsx diff --git a/src/components/settings/ProposersList/index.tsx b/apps/web/src/components/settings/ProposersList/index.tsx similarity index 100% rename from src/components/settings/ProposersList/index.tsx rename to apps/web/src/components/settings/ProposersList/index.tsx diff --git a/src/components/settings/PushNotifications/GlobalPushNotifications.tsx b/apps/web/src/components/settings/PushNotifications/GlobalPushNotifications.tsx similarity index 100% rename from src/components/settings/PushNotifications/GlobalPushNotifications.tsx rename to apps/web/src/components/settings/PushNotifications/GlobalPushNotifications.tsx diff --git a/src/components/settings/PushNotifications/__tests__/GlobalPushNotifications.test.ts b/apps/web/src/components/settings/PushNotifications/__tests__/GlobalPushNotifications.test.ts similarity index 100% rename from src/components/settings/PushNotifications/__tests__/GlobalPushNotifications.test.ts rename to apps/web/src/components/settings/PushNotifications/__tests__/GlobalPushNotifications.test.ts diff --git a/src/components/settings/PushNotifications/__tests__/logic.test.ts b/apps/web/src/components/settings/PushNotifications/__tests__/logic.test.ts similarity index 100% rename from src/components/settings/PushNotifications/__tests__/logic.test.ts rename to apps/web/src/components/settings/PushNotifications/__tests__/logic.test.ts diff --git a/src/components/settings/PushNotifications/hooks/__tests__/useNotificationPreferences.test.ts b/apps/web/src/components/settings/PushNotifications/hooks/__tests__/useNotificationPreferences.test.ts similarity index 100% rename from src/components/settings/PushNotifications/hooks/__tests__/useNotificationPreferences.test.ts rename to apps/web/src/components/settings/PushNotifications/hooks/__tests__/useNotificationPreferences.test.ts diff --git a/src/components/settings/PushNotifications/hooks/__tests__/useNotificationRegistrations.test.ts b/apps/web/src/components/settings/PushNotifications/hooks/__tests__/useNotificationRegistrations.test.ts similarity index 100% rename from src/components/settings/PushNotifications/hooks/__tests__/useNotificationRegistrations.test.ts rename to apps/web/src/components/settings/PushNotifications/hooks/__tests__/useNotificationRegistrations.test.ts diff --git a/src/components/settings/PushNotifications/hooks/__tests__/useNotificationTracking.test.ts b/apps/web/src/components/settings/PushNotifications/hooks/__tests__/useNotificationTracking.test.ts similarity index 100% rename from src/components/settings/PushNotifications/hooks/__tests__/useNotificationTracking.test.ts rename to apps/web/src/components/settings/PushNotifications/hooks/__tests__/useNotificationTracking.test.ts diff --git a/src/components/settings/PushNotifications/hooks/useNotificationPreferences.ts b/apps/web/src/components/settings/PushNotifications/hooks/useNotificationPreferences.ts similarity index 100% rename from src/components/settings/PushNotifications/hooks/useNotificationPreferences.ts rename to apps/web/src/components/settings/PushNotifications/hooks/useNotificationPreferences.ts diff --git a/src/components/settings/PushNotifications/hooks/useNotificationRegistrations.ts b/apps/web/src/components/settings/PushNotifications/hooks/useNotificationRegistrations.ts similarity index 100% rename from src/components/settings/PushNotifications/hooks/useNotificationRegistrations.ts rename to apps/web/src/components/settings/PushNotifications/hooks/useNotificationRegistrations.ts diff --git a/src/components/settings/PushNotifications/hooks/useNotificationTracking.ts b/apps/web/src/components/settings/PushNotifications/hooks/useNotificationTracking.ts similarity index 100% rename from src/components/settings/PushNotifications/hooks/useNotificationTracking.ts rename to apps/web/src/components/settings/PushNotifications/hooks/useNotificationTracking.ts diff --git a/src/components/settings/PushNotifications/index.tsx b/apps/web/src/components/settings/PushNotifications/index.tsx similarity index 100% rename from src/components/settings/PushNotifications/index.tsx rename to apps/web/src/components/settings/PushNotifications/index.tsx diff --git a/src/components/settings/PushNotifications/logic.ts b/apps/web/src/components/settings/PushNotifications/logic.ts similarity index 100% rename from src/components/settings/PushNotifications/logic.ts rename to apps/web/src/components/settings/PushNotifications/logic.ts diff --git a/src/components/settings/PushNotifications/styles.module.css b/apps/web/src/components/settings/PushNotifications/styles.module.css similarity index 100% rename from src/components/settings/PushNotifications/styles.module.css rename to apps/web/src/components/settings/PushNotifications/styles.module.css diff --git a/src/components/settings/RequiredConfirmations/index.tsx b/apps/web/src/components/settings/RequiredConfirmations/index.tsx similarity index 100% rename from src/components/settings/RequiredConfirmations/index.tsx rename to apps/web/src/components/settings/RequiredConfirmations/index.tsx diff --git a/src/components/settings/SafeAppsPermissions/index.tsx b/apps/web/src/components/settings/SafeAppsPermissions/index.tsx similarity index 100% rename from src/components/settings/SafeAppsPermissions/index.tsx rename to apps/web/src/components/settings/SafeAppsPermissions/index.tsx diff --git a/src/components/settings/SafeAppsSigningMethod/index.test.tsx b/apps/web/src/components/settings/SafeAppsSigningMethod/index.test.tsx similarity index 100% rename from src/components/settings/SafeAppsSigningMethod/index.test.tsx rename to apps/web/src/components/settings/SafeAppsSigningMethod/index.test.tsx diff --git a/src/components/settings/SafeAppsSigningMethod/index.tsx b/apps/web/src/components/settings/SafeAppsSigningMethod/index.tsx similarity index 100% rename from src/components/settings/SafeAppsSigningMethod/index.tsx rename to apps/web/src/components/settings/SafeAppsSigningMethod/index.tsx diff --git a/src/components/settings/SafeModules/__tests__/SafeModules.test.tsx b/apps/web/src/components/settings/SafeModules/__tests__/SafeModules.test.tsx similarity index 100% rename from src/components/settings/SafeModules/__tests__/SafeModules.test.tsx rename to apps/web/src/components/settings/SafeModules/__tests__/SafeModules.test.tsx diff --git a/src/components/settings/SafeModules/index.tsx b/apps/web/src/components/settings/SafeModules/index.tsx similarity index 100% rename from src/components/settings/SafeModules/index.tsx rename to apps/web/src/components/settings/SafeModules/index.tsx diff --git a/src/components/settings/SecurityLogin/index.tsx b/apps/web/src/components/settings/SecurityLogin/index.tsx similarity index 100% rename from src/components/settings/SecurityLogin/index.tsx rename to apps/web/src/components/settings/SecurityLogin/index.tsx diff --git a/src/components/settings/SecuritySettings/index.tsx b/apps/web/src/components/settings/SecuritySettings/index.tsx similarity index 100% rename from src/components/settings/SecuritySettings/index.tsx rename to apps/web/src/components/settings/SecuritySettings/index.tsx diff --git a/src/components/settings/SettingsHeader/index.test.tsx b/apps/web/src/components/settings/SettingsHeader/index.test.tsx similarity index 100% rename from src/components/settings/SettingsHeader/index.test.tsx rename to apps/web/src/components/settings/SettingsHeader/index.test.tsx diff --git a/src/components/settings/SettingsHeader/index.tsx b/apps/web/src/components/settings/SettingsHeader/index.tsx similarity index 100% rename from src/components/settings/SettingsHeader/index.tsx rename to apps/web/src/components/settings/SettingsHeader/index.tsx diff --git a/src/components/settings/SpendingLimits/NoSpendingLimits.tsx b/apps/web/src/components/settings/SpendingLimits/NoSpendingLimits.tsx similarity index 100% rename from src/components/settings/SpendingLimits/NoSpendingLimits.tsx rename to apps/web/src/components/settings/SpendingLimits/NoSpendingLimits.tsx diff --git a/src/components/settings/SpendingLimits/SpendingLimitsTable.tsx b/apps/web/src/components/settings/SpendingLimits/SpendingLimitsTable.tsx similarity index 100% rename from src/components/settings/SpendingLimits/SpendingLimitsTable.tsx rename to apps/web/src/components/settings/SpendingLimits/SpendingLimitsTable.tsx diff --git a/src/components/settings/SpendingLimits/index.tsx b/apps/web/src/components/settings/SpendingLimits/index.tsx similarity index 100% rename from src/components/settings/SpendingLimits/index.tsx rename to apps/web/src/components/settings/SpendingLimits/index.tsx diff --git a/src/components/settings/TransactionGuards/__tests__/TransactionGuards.test.tsx b/apps/web/src/components/settings/TransactionGuards/__tests__/TransactionGuards.test.tsx similarity index 100% rename from src/components/settings/TransactionGuards/__tests__/TransactionGuards.test.tsx rename to apps/web/src/components/settings/TransactionGuards/__tests__/TransactionGuards.test.tsx diff --git a/src/components/settings/TransactionGuards/index.tsx b/apps/web/src/components/settings/TransactionGuards/index.tsx similarity index 100% rename from src/components/settings/TransactionGuards/index.tsx rename to apps/web/src/components/settings/TransactionGuards/index.tsx diff --git a/src/components/settings/TransactionGuards/styles.module.css b/apps/web/src/components/settings/TransactionGuards/styles.module.css similarity index 100% rename from src/components/settings/TransactionGuards/styles.module.css rename to apps/web/src/components/settings/TransactionGuards/styles.module.css diff --git a/src/components/settings/owner/EditOwnerDialog/index.tsx b/apps/web/src/components/settings/owner/EditOwnerDialog/index.tsx similarity index 100% rename from src/components/settings/owner/EditOwnerDialog/index.tsx rename to apps/web/src/components/settings/owner/EditOwnerDialog/index.tsx diff --git a/src/components/settings/owner/OwnerList/index.tsx b/apps/web/src/components/settings/owner/OwnerList/index.tsx similarity index 100% rename from src/components/settings/owner/OwnerList/index.tsx rename to apps/web/src/components/settings/owner/OwnerList/index.tsx diff --git a/src/components/sidebar/DebugToggle/index.tsx b/apps/web/src/components/sidebar/DebugToggle/index.tsx similarity index 100% rename from src/components/sidebar/DebugToggle/index.tsx rename to apps/web/src/components/sidebar/DebugToggle/index.tsx diff --git a/src/components/sidebar/IndexingStatus/index.tsx b/apps/web/src/components/sidebar/IndexingStatus/index.tsx similarity index 100% rename from src/components/sidebar/IndexingStatus/index.tsx rename to apps/web/src/components/sidebar/IndexingStatus/index.tsx diff --git a/src/components/sidebar/NewTxButton/index.tsx b/apps/web/src/components/sidebar/NewTxButton/index.tsx similarity index 100% rename from src/components/sidebar/NewTxButton/index.tsx rename to apps/web/src/components/sidebar/NewTxButton/index.tsx diff --git a/src/components/sidebar/QrCodeButton/QrModal.tsx b/apps/web/src/components/sidebar/QrCodeButton/QrModal.tsx similarity index 100% rename from src/components/sidebar/QrCodeButton/QrModal.tsx rename to apps/web/src/components/sidebar/QrCodeButton/QrModal.tsx diff --git a/src/components/sidebar/QrCodeButton/index.tsx b/apps/web/src/components/sidebar/QrCodeButton/index.tsx similarity index 100% rename from src/components/sidebar/QrCodeButton/index.tsx rename to apps/web/src/components/sidebar/QrCodeButton/index.tsx diff --git a/src/components/sidebar/SafeListContextMenu/MultiAccountContextMenu.tsx b/apps/web/src/components/sidebar/SafeListContextMenu/MultiAccountContextMenu.tsx similarity index 100% rename from src/components/sidebar/SafeListContextMenu/MultiAccountContextMenu.tsx rename to apps/web/src/components/sidebar/SafeListContextMenu/MultiAccountContextMenu.tsx diff --git a/src/components/sidebar/SafeListContextMenu/index.tsx b/apps/web/src/components/sidebar/SafeListContextMenu/index.tsx similarity index 100% rename from src/components/sidebar/SafeListContextMenu/index.tsx rename to apps/web/src/components/sidebar/SafeListContextMenu/index.tsx diff --git a/src/components/sidebar/SafeListRemoveDialog/index.tsx b/apps/web/src/components/sidebar/SafeListRemoveDialog/index.tsx similarity index 100% rename from src/components/sidebar/SafeListRemoveDialog/index.tsx rename to apps/web/src/components/sidebar/SafeListRemoveDialog/index.tsx diff --git a/src/components/sidebar/Sidebar/index.tsx b/apps/web/src/components/sidebar/Sidebar/index.tsx similarity index 100% rename from src/components/sidebar/Sidebar/index.tsx rename to apps/web/src/components/sidebar/Sidebar/index.tsx diff --git a/src/components/sidebar/Sidebar/styles.module.css b/apps/web/src/components/sidebar/Sidebar/styles.module.css similarity index 100% rename from src/components/sidebar/Sidebar/styles.module.css rename to apps/web/src/components/sidebar/Sidebar/styles.module.css diff --git a/src/components/sidebar/SidebarFooter/index.tsx b/apps/web/src/components/sidebar/SidebarFooter/index.tsx similarity index 100% rename from src/components/sidebar/SidebarFooter/index.tsx rename to apps/web/src/components/sidebar/SidebarFooter/index.tsx diff --git a/src/components/sidebar/SidebarHeader/index.tsx b/apps/web/src/components/sidebar/SidebarHeader/index.tsx similarity index 100% rename from src/components/sidebar/SidebarHeader/index.tsx rename to apps/web/src/components/sidebar/SidebarHeader/index.tsx diff --git a/src/components/sidebar/SidebarHeader/styles.module.css b/apps/web/src/components/sidebar/SidebarHeader/styles.module.css similarity index 100% rename from src/components/sidebar/SidebarHeader/styles.module.css rename to apps/web/src/components/sidebar/SidebarHeader/styles.module.css diff --git a/src/components/sidebar/SidebarList/index.tsx b/apps/web/src/components/sidebar/SidebarList/index.tsx similarity index 100% rename from src/components/sidebar/SidebarList/index.tsx rename to apps/web/src/components/sidebar/SidebarList/index.tsx diff --git a/src/components/sidebar/SidebarList/styles.module.css b/apps/web/src/components/sidebar/SidebarList/styles.module.css similarity index 100% rename from src/components/sidebar/SidebarList/styles.module.css rename to apps/web/src/components/sidebar/SidebarList/styles.module.css diff --git a/src/components/sidebar/SidebarNavigation/config.tsx b/apps/web/src/components/sidebar/SidebarNavigation/config.tsx similarity index 100% rename from src/components/sidebar/SidebarNavigation/config.tsx rename to apps/web/src/components/sidebar/SidebarNavigation/config.tsx diff --git a/src/components/sidebar/SidebarNavigation/index.tsx b/apps/web/src/components/sidebar/SidebarNavigation/index.tsx similarity index 100% rename from src/components/sidebar/SidebarNavigation/index.tsx rename to apps/web/src/components/sidebar/SidebarNavigation/index.tsx diff --git a/src/components/sidebar/WatchlistAddButton/index.tsx b/apps/web/src/components/sidebar/WatchlistAddButton/index.tsx similarity index 100% rename from src/components/sidebar/WatchlistAddButton/index.tsx rename to apps/web/src/components/sidebar/WatchlistAddButton/index.tsx diff --git a/src/components/theme/SafeThemeProvider.tsx b/apps/web/src/components/theme/SafeThemeProvider.tsx similarity index 100% rename from src/components/theme/SafeThemeProvider.tsx rename to apps/web/src/components/theme/SafeThemeProvider.tsx diff --git a/src/components/theme/darkPalette.ts b/apps/web/src/components/theme/darkPalette.ts similarity index 100% rename from src/components/theme/darkPalette.ts rename to apps/web/src/components/theme/darkPalette.ts diff --git a/src/components/theme/lightPalette.ts b/apps/web/src/components/theme/lightPalette.ts similarity index 100% rename from src/components/theme/lightPalette.ts rename to apps/web/src/components/theme/lightPalette.ts diff --git a/src/components/theme/safeTheme.ts b/apps/web/src/components/theme/safeTheme.ts similarity index 100% rename from src/components/theme/safeTheme.ts rename to apps/web/src/components/theme/safeTheme.ts diff --git a/src/components/theme/typography.ts b/apps/web/src/components/theme/typography.ts similarity index 100% rename from src/components/theme/typography.ts rename to apps/web/src/components/theme/typography.ts diff --git a/src/components/transactions/BatchExecuteButton/BatchExecuteHoverProvider.tsx b/apps/web/src/components/transactions/BatchExecuteButton/BatchExecuteHoverProvider.tsx similarity index 100% rename from src/components/transactions/BatchExecuteButton/BatchExecuteHoverProvider.tsx rename to apps/web/src/components/transactions/BatchExecuteButton/BatchExecuteHoverProvider.tsx diff --git a/src/components/transactions/BatchExecuteButton/index.tsx b/apps/web/src/components/transactions/BatchExecuteButton/index.tsx similarity index 100% rename from src/components/transactions/BatchExecuteButton/index.tsx rename to apps/web/src/components/transactions/BatchExecuteButton/index.tsx diff --git a/src/components/transactions/BulkTxListGroup/index.tsx b/apps/web/src/components/transactions/BulkTxListGroup/index.tsx similarity index 100% rename from src/components/transactions/BulkTxListGroup/index.tsx rename to apps/web/src/components/transactions/BulkTxListGroup/index.tsx diff --git a/src/components/transactions/BulkTxListGroup/styles.module.css b/apps/web/src/components/transactions/BulkTxListGroup/styles.module.css similarity index 100% rename from src/components/transactions/BulkTxListGroup/styles.module.css rename to apps/web/src/components/transactions/BulkTxListGroup/styles.module.css diff --git a/src/components/transactions/ExecuteTxButton/index.tsx b/apps/web/src/components/transactions/ExecuteTxButton/index.tsx similarity index 100% rename from src/components/transactions/ExecuteTxButton/index.tsx rename to apps/web/src/components/transactions/ExecuteTxButton/index.tsx diff --git a/src/components/transactions/GroupLabel/index.tsx b/apps/web/src/components/transactions/GroupLabel/index.tsx similarity index 100% rename from src/components/transactions/GroupLabel/index.tsx rename to apps/web/src/components/transactions/GroupLabel/index.tsx diff --git a/src/components/transactions/GroupLabel/styles.module.css b/apps/web/src/components/transactions/GroupLabel/styles.module.css similarity index 100% rename from src/components/transactions/GroupLabel/styles.module.css rename to apps/web/src/components/transactions/GroupLabel/styles.module.css diff --git a/src/components/transactions/GroupedTxListItems/ReplaceTxHoverProvider.tsx b/apps/web/src/components/transactions/GroupedTxListItems/ReplaceTxHoverProvider.tsx similarity index 100% rename from src/components/transactions/GroupedTxListItems/ReplaceTxHoverProvider.tsx rename to apps/web/src/components/transactions/GroupedTxListItems/ReplaceTxHoverProvider.tsx diff --git a/src/components/transactions/GroupedTxListItems/index.tsx b/apps/web/src/components/transactions/GroupedTxListItems/index.tsx similarity index 100% rename from src/components/transactions/GroupedTxListItems/index.tsx rename to apps/web/src/components/transactions/GroupedTxListItems/index.tsx diff --git a/src/components/transactions/GroupedTxListItems/styles.module.css b/apps/web/src/components/transactions/GroupedTxListItems/styles.module.css similarity index 100% rename from src/components/transactions/GroupedTxListItems/styles.module.css rename to apps/web/src/components/transactions/GroupedTxListItems/styles.module.css diff --git a/src/components/transactions/HexEncodedData/HexEncodedData.test.tsx b/apps/web/src/components/transactions/HexEncodedData/HexEncodedData.test.tsx similarity index 100% rename from src/components/transactions/HexEncodedData/HexEncodedData.test.tsx rename to apps/web/src/components/transactions/HexEncodedData/HexEncodedData.test.tsx diff --git a/src/components/transactions/HexEncodedData/__snapshots__/HexEncodedData.test.tsx.snap b/apps/web/src/components/transactions/HexEncodedData/__snapshots__/HexEncodedData.test.tsx.snap similarity index 100% rename from src/components/transactions/HexEncodedData/__snapshots__/HexEncodedData.test.tsx.snap rename to apps/web/src/components/transactions/HexEncodedData/__snapshots__/HexEncodedData.test.tsx.snap diff --git a/src/components/transactions/HexEncodedData/index.tsx b/apps/web/src/components/transactions/HexEncodedData/index.tsx similarity index 100% rename from src/components/transactions/HexEncodedData/index.tsx rename to apps/web/src/components/transactions/HexEncodedData/index.tsx diff --git a/src/components/transactions/HexEncodedData/styles.module.css b/apps/web/src/components/transactions/HexEncodedData/styles.module.css similarity index 100% rename from src/components/transactions/HexEncodedData/styles.module.css rename to apps/web/src/components/transactions/HexEncodedData/styles.module.css diff --git a/src/components/transactions/ImitationTransactionWarning/index.tsx b/apps/web/src/components/transactions/ImitationTransactionWarning/index.tsx similarity index 100% rename from src/components/transactions/ImitationTransactionWarning/index.tsx rename to apps/web/src/components/transactions/ImitationTransactionWarning/index.tsx diff --git a/src/components/transactions/ImitationTransactionWarning/styles.module.css b/apps/web/src/components/transactions/ImitationTransactionWarning/styles.module.css similarity index 100% rename from src/components/transactions/ImitationTransactionWarning/styles.module.css rename to apps/web/src/components/transactions/ImitationTransactionWarning/styles.module.css diff --git a/src/components/transactions/InfoDetails/index.tsx b/apps/web/src/components/transactions/InfoDetails/index.tsx similarity index 100% rename from src/components/transactions/InfoDetails/index.tsx rename to apps/web/src/components/transactions/InfoDetails/index.tsx diff --git a/src/components/transactions/InfoDetails/styles.module.css b/apps/web/src/components/transactions/InfoDetails/styles.module.css similarity index 100% rename from src/components/transactions/InfoDetails/styles.module.css rename to apps/web/src/components/transactions/InfoDetails/styles.module.css diff --git a/src/components/transactions/MaliciousTxWarning/index.tsx b/apps/web/src/components/transactions/MaliciousTxWarning/index.tsx similarity index 100% rename from src/components/transactions/MaliciousTxWarning/index.tsx rename to apps/web/src/components/transactions/MaliciousTxWarning/index.tsx diff --git a/src/components/transactions/RejectTxButton/index.tsx b/apps/web/src/components/transactions/RejectTxButton/index.tsx similarity index 100% rename from src/components/transactions/RejectTxButton/index.tsx rename to apps/web/src/components/transactions/RejectTxButton/index.tsx diff --git a/src/components/transactions/SafeCreationTx/index.tsx b/apps/web/src/components/transactions/SafeCreationTx/index.tsx similarity index 100% rename from src/components/transactions/SafeCreationTx/index.tsx rename to apps/web/src/components/transactions/SafeCreationTx/index.tsx diff --git a/src/components/transactions/SafeCreationTx/styles.module.css b/apps/web/src/components/transactions/SafeCreationTx/styles.module.css similarity index 100% rename from src/components/transactions/SafeCreationTx/styles.module.css rename to apps/web/src/components/transactions/SafeCreationTx/styles.module.css diff --git a/src/components/transactions/SignTxButton/index.test.tsx b/apps/web/src/components/transactions/SignTxButton/index.test.tsx similarity index 100% rename from src/components/transactions/SignTxButton/index.test.tsx rename to apps/web/src/components/transactions/SignTxButton/index.test.tsx diff --git a/src/components/transactions/SignTxButton/index.tsx b/apps/web/src/components/transactions/SignTxButton/index.tsx similarity index 100% rename from src/components/transactions/SignTxButton/index.tsx rename to apps/web/src/components/transactions/SignTxButton/index.tsx diff --git a/src/components/transactions/SignTxButton/styles.module.css b/apps/web/src/components/transactions/SignTxButton/styles.module.css similarity index 100% rename from src/components/transactions/SignTxButton/styles.module.css rename to apps/web/src/components/transactions/SignTxButton/styles.module.css diff --git a/src/components/transactions/SignedMessagesHelpLink/index.tsx b/apps/web/src/components/transactions/SignedMessagesHelpLink/index.tsx similarity index 100% rename from src/components/transactions/SignedMessagesHelpLink/index.tsx rename to apps/web/src/components/transactions/SignedMessagesHelpLink/index.tsx diff --git a/src/components/transactions/SingleTx/SingleTx.test.tsx b/apps/web/src/components/transactions/SingleTx/SingleTx.test.tsx similarity index 100% rename from src/components/transactions/SingleTx/SingleTx.test.tsx rename to apps/web/src/components/transactions/SingleTx/SingleTx.test.tsx diff --git a/src/components/transactions/SingleTx/index.tsx b/apps/web/src/components/transactions/SingleTx/index.tsx similarity index 100% rename from src/components/transactions/SingleTx/index.tsx rename to apps/web/src/components/transactions/SingleTx/index.tsx diff --git a/src/components/transactions/TrustedToggle/TrustedToggleButton.tsx b/apps/web/src/components/transactions/TrustedToggle/TrustedToggleButton.tsx similarity index 100% rename from src/components/transactions/TrustedToggle/TrustedToggleButton.tsx rename to apps/web/src/components/transactions/TrustedToggle/TrustedToggleButton.tsx diff --git a/src/components/transactions/TrustedToggle/index.tsx b/apps/web/src/components/transactions/TrustedToggle/index.tsx similarity index 100% rename from src/components/transactions/TrustedToggle/index.tsx rename to apps/web/src/components/transactions/TrustedToggle/index.tsx diff --git a/src/components/transactions/TxConfirmations/index.tsx b/apps/web/src/components/transactions/TxConfirmations/index.tsx similarity index 100% rename from src/components/transactions/TxConfirmations/index.tsx rename to apps/web/src/components/transactions/TxConfirmations/index.tsx diff --git a/src/components/transactions/TxDateLabel/index.tsx b/apps/web/src/components/transactions/TxDateLabel/index.tsx similarity index 100% rename from src/components/transactions/TxDateLabel/index.tsx rename to apps/web/src/components/transactions/TxDateLabel/index.tsx diff --git a/src/components/transactions/TxDateLabel/styles.module.css b/apps/web/src/components/transactions/TxDateLabel/styles.module.css similarity index 100% rename from src/components/transactions/TxDateLabel/styles.module.css rename to apps/web/src/components/transactions/TxDateLabel/styles.module.css diff --git a/src/components/transactions/TxDetails/SafeTxGasForm.tsx b/apps/web/src/components/transactions/TxDetails/SafeTxGasForm.tsx similarity index 100% rename from src/components/transactions/TxDetails/SafeTxGasForm.tsx rename to apps/web/src/components/transactions/TxDetails/SafeTxGasForm.tsx diff --git a/src/components/transactions/TxDetails/Summary/SafeTxHashDataRow/index.tsx b/apps/web/src/components/transactions/TxDetails/Summary/SafeTxHashDataRow/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/Summary/SafeTxHashDataRow/index.tsx rename to apps/web/src/components/transactions/TxDetails/Summary/SafeTxHashDataRow/index.tsx diff --git a/src/components/transactions/TxDetails/Summary/TxDataRow/index.tsx b/apps/web/src/components/transactions/TxDetails/Summary/TxDataRow/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/Summary/TxDataRow/index.tsx rename to apps/web/src/components/transactions/TxDetails/Summary/TxDataRow/index.tsx diff --git a/src/components/transactions/TxDetails/Summary/index.tsx b/apps/web/src/components/transactions/TxDetails/Summary/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/Summary/index.tsx rename to apps/web/src/components/transactions/TxDetails/Summary/index.tsx diff --git a/src/components/transactions/TxDetails/Summary/styles.module.css b/apps/web/src/components/transactions/TxDetails/Summary/styles.module.css similarity index 100% rename from src/components/transactions/TxDetails/Summary/styles.module.css rename to apps/web/src/components/transactions/TxDetails/Summary/styles.module.css diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/MethodCall.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/MethodCall.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/MethodCall.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/MethodCall.tsx diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/MethodDetails/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/MethodDetails/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/MethodDetails/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/MethodDetails/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/Multisend/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/Multisend/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/Multisend/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/Multisend/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/Multisend/styles.module.css b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/Multisend/styles.module.css similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/Multisend/styles.module.css rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/Multisend/styles.module.css diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.test.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.test.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.test.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.test.tsx diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/styles.module.css b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/styles.module.css similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/styles.module.css rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/SingleTxDecoded/styles.module.css diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/ValueArray.test.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/ValueArray.test.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/ValueArray.test.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/ValueArray.test.tsx diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/styles.module.css b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/styles.module.css similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/styles.module.css rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/ValueArray/styles.module.css diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/index.test.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/index.test.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/index.test.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/index.test.tsx diff --git a/src/components/transactions/TxDetails/TxData/DecodedData/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/DecodedData/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/DecodedData/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/DecodedData/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/MigrationToL2TxData/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/MigrationToL2TxData/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/MigrationToL2TxData/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/MigrationToL2TxData/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/NestedTransaction/ExecTransaction/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/NestedTransaction/ExecTransaction/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/NestedTransaction/ExecTransaction/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/NestedTransaction/ExecTransaction/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/NestedTransaction/NestedTransaction.tsx b/apps/web/src/components/transactions/TxDetails/TxData/NestedTransaction/NestedTransaction.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/NestedTransaction/NestedTransaction.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/NestedTransaction/NestedTransaction.tsx diff --git a/src/components/transactions/TxDetails/TxData/NestedTransaction/OnChainConfirmation/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/NestedTransaction/OnChainConfirmation/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/NestedTransaction/OnChainConfirmation/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/NestedTransaction/OnChainConfirmation/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/Rejection/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/Rejection/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/Rejection/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/Rejection/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/SafeUpdate/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/SafeUpdate/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/SafeUpdate/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/SafeUpdate/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/SettingsChange/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/SettingsChange/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/SettingsChange/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/SettingsChange/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/SpendingLimits/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/SpendingLimits/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/SpendingLimits/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/SpendingLimits/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/SpendingLimits/styles.module.css b/apps/web/src/components/transactions/TxDetails/TxData/SpendingLimits/styles.module.css similarity index 100% rename from src/components/transactions/TxDetails/TxData/SpendingLimits/styles.module.css rename to apps/web/src/components/transactions/TxDetails/TxData/SpendingLimits/styles.module.css diff --git a/src/components/transactions/TxDetails/TxData/Transfer/TransferActions.tsx b/apps/web/src/components/transactions/TxDetails/TxData/Transfer/TransferActions.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/Transfer/TransferActions.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/Transfer/TransferActions.tsx diff --git a/src/components/transactions/TxDetails/TxData/Transfer/index.test.tsx b/apps/web/src/components/transactions/TxDetails/TxData/Transfer/index.test.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/Transfer/index.test.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/Transfer/index.test.tsx diff --git a/src/components/transactions/TxDetails/TxData/Transfer/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/Transfer/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/Transfer/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/Transfer/index.tsx diff --git a/src/components/transactions/TxDetails/TxData/index.tsx b/apps/web/src/components/transactions/TxDetails/TxData/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/TxData/index.tsx rename to apps/web/src/components/transactions/TxDetails/TxData/index.tsx diff --git a/src/components/transactions/TxDetails/index.tsx b/apps/web/src/components/transactions/TxDetails/index.tsx similarity index 100% rename from src/components/transactions/TxDetails/index.tsx rename to apps/web/src/components/transactions/TxDetails/index.tsx diff --git a/src/components/transactions/TxDetails/styles.module.css b/apps/web/src/components/transactions/TxDetails/styles.module.css similarity index 100% rename from src/components/transactions/TxDetails/styles.module.css rename to apps/web/src/components/transactions/TxDetails/styles.module.css diff --git a/src/components/transactions/TxFilterForm/TxFilterForm.test.tsx b/apps/web/src/components/transactions/TxFilterForm/TxFilterForm.test.tsx similarity index 100% rename from src/components/transactions/TxFilterForm/TxFilterForm.test.tsx rename to apps/web/src/components/transactions/TxFilterForm/TxFilterForm.test.tsx diff --git a/src/components/transactions/TxFilterForm/index.tsx b/apps/web/src/components/transactions/TxFilterForm/index.tsx similarity index 100% rename from src/components/transactions/TxFilterForm/index.tsx rename to apps/web/src/components/transactions/TxFilterForm/index.tsx diff --git a/src/components/transactions/TxFilterForm/styles.module.css b/apps/web/src/components/transactions/TxFilterForm/styles.module.css similarity index 100% rename from src/components/transactions/TxFilterForm/styles.module.css rename to apps/web/src/components/transactions/TxFilterForm/styles.module.css diff --git a/src/components/transactions/TxHeader/index.tsx b/apps/web/src/components/transactions/TxHeader/index.tsx similarity index 100% rename from src/components/transactions/TxHeader/index.tsx rename to apps/web/src/components/transactions/TxHeader/index.tsx diff --git a/src/components/transactions/TxInfo/index.tsx b/apps/web/src/components/transactions/TxInfo/index.tsx similarity index 100% rename from src/components/transactions/TxInfo/index.tsx rename to apps/web/src/components/transactions/TxInfo/index.tsx diff --git a/src/components/transactions/TxInfo/styles.module.css b/apps/web/src/components/transactions/TxInfo/styles.module.css similarity index 100% rename from src/components/transactions/TxInfo/styles.module.css rename to apps/web/src/components/transactions/TxInfo/styles.module.css diff --git a/src/components/transactions/TxList/index.tsx b/apps/web/src/components/transactions/TxList/index.tsx similarity index 100% rename from src/components/transactions/TxList/index.tsx rename to apps/web/src/components/transactions/TxList/index.tsx diff --git a/src/components/transactions/TxList/styles.module.css b/apps/web/src/components/transactions/TxList/styles.module.css similarity index 100% rename from src/components/transactions/TxList/styles.module.css rename to apps/web/src/components/transactions/TxList/styles.module.css diff --git a/src/components/transactions/TxListItem/ExpandableTransactionItem.tsx b/apps/web/src/components/transactions/TxListItem/ExpandableTransactionItem.tsx similarity index 100% rename from src/components/transactions/TxListItem/ExpandableTransactionItem.tsx rename to apps/web/src/components/transactions/TxListItem/ExpandableTransactionItem.tsx diff --git a/src/components/transactions/TxListItem/index.tsx b/apps/web/src/components/transactions/TxListItem/index.tsx similarity index 100% rename from src/components/transactions/TxListItem/index.tsx rename to apps/web/src/components/transactions/TxListItem/index.tsx diff --git a/src/components/transactions/TxListItem/styles.module.css b/apps/web/src/components/transactions/TxListItem/styles.module.css similarity index 100% rename from src/components/transactions/TxListItem/styles.module.css rename to apps/web/src/components/transactions/TxListItem/styles.module.css diff --git a/src/components/transactions/TxNavigation/index.tsx b/apps/web/src/components/transactions/TxNavigation/index.tsx similarity index 100% rename from src/components/transactions/TxNavigation/index.tsx rename to apps/web/src/components/transactions/TxNavigation/index.tsx diff --git a/src/components/transactions/TxShareLink/index.tsx b/apps/web/src/components/transactions/TxShareLink/index.tsx similarity index 100% rename from src/components/transactions/TxShareLink/index.tsx rename to apps/web/src/components/transactions/TxShareLink/index.tsx diff --git a/src/components/transactions/TxSigners/index.tsx b/apps/web/src/components/transactions/TxSigners/index.tsx similarity index 100% rename from src/components/transactions/TxSigners/index.tsx rename to apps/web/src/components/transactions/TxSigners/index.tsx diff --git a/src/components/transactions/TxSigners/styles.module.css b/apps/web/src/components/transactions/TxSigners/styles.module.css similarity index 100% rename from src/components/transactions/TxSigners/styles.module.css rename to apps/web/src/components/transactions/TxSigners/styles.module.css diff --git a/src/components/transactions/TxStatusChip/index.stories.tsx b/apps/web/src/components/transactions/TxStatusChip/index.stories.tsx similarity index 100% rename from src/components/transactions/TxStatusChip/index.stories.tsx rename to apps/web/src/components/transactions/TxStatusChip/index.stories.tsx diff --git a/src/components/transactions/TxStatusChip/index.tsx b/apps/web/src/components/transactions/TxStatusChip/index.tsx similarity index 100% rename from src/components/transactions/TxStatusChip/index.tsx rename to apps/web/src/components/transactions/TxStatusChip/index.tsx diff --git a/src/components/transactions/TxStatusLabel/index.tsx b/apps/web/src/components/transactions/TxStatusLabel/index.tsx similarity index 100% rename from src/components/transactions/TxStatusLabel/index.tsx rename to apps/web/src/components/transactions/TxStatusLabel/index.tsx diff --git a/src/components/transactions/TxSummary/QueueActions.tsx b/apps/web/src/components/transactions/TxSummary/QueueActions.tsx similarity index 100% rename from src/components/transactions/TxSummary/QueueActions.tsx rename to apps/web/src/components/transactions/TxSummary/QueueActions.tsx diff --git a/src/components/transactions/TxSummary/index.test.tsx b/apps/web/src/components/transactions/TxSummary/index.test.tsx similarity index 100% rename from src/components/transactions/TxSummary/index.test.tsx rename to apps/web/src/components/transactions/TxSummary/index.test.tsx diff --git a/src/components/transactions/TxSummary/index.tsx b/apps/web/src/components/transactions/TxSummary/index.tsx similarity index 100% rename from src/components/transactions/TxSummary/index.tsx rename to apps/web/src/components/transactions/TxSummary/index.tsx diff --git a/src/components/transactions/TxSummary/styles.module.css b/apps/web/src/components/transactions/TxSummary/styles.module.css similarity index 100% rename from src/components/transactions/TxSummary/styles.module.css rename to apps/web/src/components/transactions/TxSummary/styles.module.css diff --git a/src/components/transactions/TxType/index.tsx b/apps/web/src/components/transactions/TxType/index.tsx similarity index 100% rename from src/components/transactions/TxType/index.tsx rename to apps/web/src/components/transactions/TxType/index.tsx diff --git a/src/components/transactions/TxType/styles.module.css b/apps/web/src/components/transactions/TxType/styles.module.css similarity index 100% rename from src/components/transactions/TxType/styles.module.css rename to apps/web/src/components/transactions/TxType/styles.module.css diff --git a/src/components/transactions/Warning/index.tsx b/apps/web/src/components/transactions/Warning/index.tsx similarity index 100% rename from src/components/transactions/Warning/index.tsx rename to apps/web/src/components/transactions/Warning/index.tsx diff --git a/src/components/transactions/Warning/styles.module.css b/apps/web/src/components/transactions/Warning/styles.module.css similarity index 100% rename from src/components/transactions/Warning/styles.module.css rename to apps/web/src/components/transactions/Warning/styles.module.css diff --git a/src/components/tx-flow/SafeTxProvider.tsx b/apps/web/src/components/tx-flow/SafeTxProvider.tsx similarity index 100% rename from src/components/tx-flow/SafeTxProvider.tsx rename to apps/web/src/components/tx-flow/SafeTxProvider.tsx diff --git a/src/components/tx-flow/TxInfoProvider.tsx b/apps/web/src/components/tx-flow/TxInfoProvider.tsx similarity index 100% rename from src/components/tx-flow/TxInfoProvider.tsx rename to apps/web/src/components/tx-flow/TxInfoProvider.tsx diff --git a/src/components/tx-flow/common/OwnerList/index.tsx b/apps/web/src/components/tx-flow/common/OwnerList/index.tsx similarity index 100% rename from src/components/tx-flow/common/OwnerList/index.tsx rename to apps/web/src/components/tx-flow/common/OwnerList/index.tsx diff --git a/src/components/tx-flow/common/OwnerList/styles.module.css b/apps/web/src/components/tx-flow/common/OwnerList/styles.module.css similarity index 100% rename from src/components/tx-flow/common/OwnerList/styles.module.css rename to apps/web/src/components/tx-flow/common/OwnerList/styles.module.css diff --git a/src/components/tx-flow/common/TxButton.tsx b/apps/web/src/components/tx-flow/common/TxButton.tsx similarity index 100% rename from src/components/tx-flow/common/TxButton.tsx rename to apps/web/src/components/tx-flow/common/TxButton.tsx diff --git a/src/components/tx-flow/common/TxCard/index.tsx b/apps/web/src/components/tx-flow/common/TxCard/index.tsx similarity index 100% rename from src/components/tx-flow/common/TxCard/index.tsx rename to apps/web/src/components/tx-flow/common/TxCard/index.tsx diff --git a/src/components/tx-flow/common/TxLayout/index.tsx b/apps/web/src/components/tx-flow/common/TxLayout/index.tsx similarity index 100% rename from src/components/tx-flow/common/TxLayout/index.tsx rename to apps/web/src/components/tx-flow/common/TxLayout/index.tsx diff --git a/src/components/tx-flow/common/TxLayout/styles.module.css b/apps/web/src/components/tx-flow/common/TxLayout/styles.module.css similarity index 100% rename from src/components/tx-flow/common/TxLayout/styles.module.css rename to apps/web/src/components/tx-flow/common/TxLayout/styles.module.css diff --git a/src/components/tx-flow/common/TxNonce/index.tsx b/apps/web/src/components/tx-flow/common/TxNonce/index.tsx similarity index 100% rename from src/components/tx-flow/common/TxNonce/index.tsx rename to apps/web/src/components/tx-flow/common/TxNonce/index.tsx diff --git a/src/components/tx-flow/common/TxNonce/styles.module.css b/apps/web/src/components/tx-flow/common/TxNonce/styles.module.css similarity index 100% rename from src/components/tx-flow/common/TxNonce/styles.module.css rename to apps/web/src/components/tx-flow/common/TxNonce/styles.module.css diff --git a/src/components/tx-flow/common/TxStatusWidget/index.tsx b/apps/web/src/components/tx-flow/common/TxStatusWidget/index.tsx similarity index 100% rename from src/components/tx-flow/common/TxStatusWidget/index.tsx rename to apps/web/src/components/tx-flow/common/TxStatusWidget/index.tsx diff --git a/src/components/tx-flow/common/TxStatusWidget/styles.module.css b/apps/web/src/components/tx-flow/common/TxStatusWidget/styles.module.css similarity index 100% rename from src/components/tx-flow/common/TxStatusWidget/styles.module.css rename to apps/web/src/components/tx-flow/common/TxStatusWidget/styles.module.css diff --git a/src/components/tx-flow/common/constants.ts b/apps/web/src/components/tx-flow/common/constants.ts similarity index 100% rename from src/components/tx-flow/common/constants.ts rename to apps/web/src/components/tx-flow/common/constants.ts diff --git a/src/components/tx-flow/common/styles.module.css b/apps/web/src/components/tx-flow/common/styles.module.css similarity index 100% rename from src/components/tx-flow/common/styles.module.css rename to apps/web/src/components/tx-flow/common/styles.module.css diff --git a/src/components/tx-flow/flows/AddOwner/ChooseOwner.tsx b/apps/web/src/components/tx-flow/flows/AddOwner/ChooseOwner.tsx similarity index 100% rename from src/components/tx-flow/flows/AddOwner/ChooseOwner.tsx rename to apps/web/src/components/tx-flow/flows/AddOwner/ChooseOwner.tsx diff --git a/src/components/tx-flow/flows/AddOwner/ReviewOwner.tsx b/apps/web/src/components/tx-flow/flows/AddOwner/ReviewOwner.tsx similarity index 100% rename from src/components/tx-flow/flows/AddOwner/ReviewOwner.tsx rename to apps/web/src/components/tx-flow/flows/AddOwner/ReviewOwner.tsx diff --git a/src/components/tx-flow/flows/AddOwner/context.ts b/apps/web/src/components/tx-flow/flows/AddOwner/context.ts similarity index 100% rename from src/components/tx-flow/flows/AddOwner/context.ts rename to apps/web/src/components/tx-flow/flows/AddOwner/context.ts diff --git a/src/components/tx-flow/flows/AddOwner/index.tsx b/apps/web/src/components/tx-flow/flows/AddOwner/index.tsx similarity index 100% rename from src/components/tx-flow/flows/AddOwner/index.tsx rename to apps/web/src/components/tx-flow/flows/AddOwner/index.tsx diff --git a/src/components/tx-flow/flows/CancelRecovery/CancelRecoveryFlowReview.tsx b/apps/web/src/components/tx-flow/flows/CancelRecovery/CancelRecoveryFlowReview.tsx similarity index 100% rename from src/components/tx-flow/flows/CancelRecovery/CancelRecoveryFlowReview.tsx rename to apps/web/src/components/tx-flow/flows/CancelRecovery/CancelRecoveryFlowReview.tsx diff --git a/src/components/tx-flow/flows/CancelRecovery/CancelRecoveryOverview.tsx b/apps/web/src/components/tx-flow/flows/CancelRecovery/CancelRecoveryOverview.tsx similarity index 100% rename from src/components/tx-flow/flows/CancelRecovery/CancelRecoveryOverview.tsx rename to apps/web/src/components/tx-flow/flows/CancelRecovery/CancelRecoveryOverview.tsx diff --git a/src/components/tx-flow/flows/CancelRecovery/index.tsx b/apps/web/src/components/tx-flow/flows/CancelRecovery/index.tsx similarity index 100% rename from src/components/tx-flow/flows/CancelRecovery/index.tsx rename to apps/web/src/components/tx-flow/flows/CancelRecovery/index.tsx diff --git a/src/components/tx-flow/flows/CancelRecovery/styles.module.css b/apps/web/src/components/tx-flow/flows/CancelRecovery/styles.module.css similarity index 100% rename from src/components/tx-flow/flows/CancelRecovery/styles.module.css rename to apps/web/src/components/tx-flow/flows/CancelRecovery/styles.module.css diff --git a/src/components/tx-flow/flows/ChangeThreshold/ChooseThreshold.tsx b/apps/web/src/components/tx-flow/flows/ChangeThreshold/ChooseThreshold.tsx similarity index 100% rename from src/components/tx-flow/flows/ChangeThreshold/ChooseThreshold.tsx rename to apps/web/src/components/tx-flow/flows/ChangeThreshold/ChooseThreshold.tsx diff --git a/src/components/tx-flow/flows/ChangeThreshold/ReviewChangeThreshold.tsx b/apps/web/src/components/tx-flow/flows/ChangeThreshold/ReviewChangeThreshold.tsx similarity index 100% rename from src/components/tx-flow/flows/ChangeThreshold/ReviewChangeThreshold.tsx rename to apps/web/src/components/tx-flow/flows/ChangeThreshold/ReviewChangeThreshold.tsx diff --git a/src/components/tx-flow/flows/ChangeThreshold/context.tsx b/apps/web/src/components/tx-flow/flows/ChangeThreshold/context.tsx similarity index 100% rename from src/components/tx-flow/flows/ChangeThreshold/context.tsx rename to apps/web/src/components/tx-flow/flows/ChangeThreshold/context.tsx diff --git a/src/components/tx-flow/flows/ChangeThreshold/index.tsx b/apps/web/src/components/tx-flow/flows/ChangeThreshold/index.tsx similarity index 100% rename from src/components/tx-flow/flows/ChangeThreshold/index.tsx rename to apps/web/src/components/tx-flow/flows/ChangeThreshold/index.tsx diff --git a/src/components/tx-flow/flows/ConfirmBatch/index.tsx b/apps/web/src/components/tx-flow/flows/ConfirmBatch/index.tsx similarity index 100% rename from src/components/tx-flow/flows/ConfirmBatch/index.tsx rename to apps/web/src/components/tx-flow/flows/ConfirmBatch/index.tsx diff --git a/src/components/tx-flow/flows/ConfirmTx/ConfirmProposedTx.tsx b/apps/web/src/components/tx-flow/flows/ConfirmTx/ConfirmProposedTx.tsx similarity index 100% rename from src/components/tx-flow/flows/ConfirmTx/ConfirmProposedTx.tsx rename to apps/web/src/components/tx-flow/flows/ConfirmTx/ConfirmProposedTx.tsx diff --git a/src/components/tx-flow/flows/ConfirmTx/index.tsx b/apps/web/src/components/tx-flow/flows/ConfirmTx/index.tsx similarity index 100% rename from src/components/tx-flow/flows/ConfirmTx/index.tsx rename to apps/web/src/components/tx-flow/flows/ConfirmTx/index.tsx diff --git a/src/components/tx-flow/flows/ExecuteBatch/DecodedTxs.tsx b/apps/web/src/components/tx-flow/flows/ExecuteBatch/DecodedTxs.tsx similarity index 100% rename from src/components/tx-flow/flows/ExecuteBatch/DecodedTxs.tsx rename to apps/web/src/components/tx-flow/flows/ExecuteBatch/DecodedTxs.tsx diff --git a/src/components/tx-flow/flows/ExecuteBatch/ReviewBatch.tsx b/apps/web/src/components/tx-flow/flows/ExecuteBatch/ReviewBatch.tsx similarity index 100% rename from src/components/tx-flow/flows/ExecuteBatch/ReviewBatch.tsx rename to apps/web/src/components/tx-flow/flows/ExecuteBatch/ReviewBatch.tsx diff --git a/src/components/tx-flow/flows/ExecuteBatch/index.tsx b/apps/web/src/components/tx-flow/flows/ExecuteBatch/index.tsx similarity index 100% rename from src/components/tx-flow/flows/ExecuteBatch/index.tsx rename to apps/web/src/components/tx-flow/flows/ExecuteBatch/index.tsx diff --git a/src/components/tx-flow/flows/NestedTxSuccessScreen/index.tsx b/apps/web/src/components/tx-flow/flows/NestedTxSuccessScreen/index.tsx similarity index 100% rename from src/components/tx-flow/flows/NestedTxSuccessScreen/index.tsx rename to apps/web/src/components/tx-flow/flows/NestedTxSuccessScreen/index.tsx diff --git a/src/components/tx-flow/flows/NestedTxSuccessScreen/styles.module.css b/apps/web/src/components/tx-flow/flows/NestedTxSuccessScreen/styles.module.css similarity index 100% rename from src/components/tx-flow/flows/NestedTxSuccessScreen/styles.module.css rename to apps/web/src/components/tx-flow/flows/NestedTxSuccessScreen/styles.module.css diff --git a/src/components/tx-flow/flows/NewSpendingLimit/CreateSpendingLimit.tsx b/apps/web/src/components/tx-flow/flows/NewSpendingLimit/CreateSpendingLimit.tsx similarity index 100% rename from src/components/tx-flow/flows/NewSpendingLimit/CreateSpendingLimit.tsx rename to apps/web/src/components/tx-flow/flows/NewSpendingLimit/CreateSpendingLimit.tsx diff --git a/src/components/tx-flow/flows/NewSpendingLimit/ReviewSpendingLimit.tsx b/apps/web/src/components/tx-flow/flows/NewSpendingLimit/ReviewSpendingLimit.tsx similarity index 100% rename from src/components/tx-flow/flows/NewSpendingLimit/ReviewSpendingLimit.tsx rename to apps/web/src/components/tx-flow/flows/NewSpendingLimit/ReviewSpendingLimit.tsx diff --git a/src/components/tx-flow/flows/NewSpendingLimit/__tests__/SpendingLimitForm.test.ts b/apps/web/src/components/tx-flow/flows/NewSpendingLimit/__tests__/SpendingLimitForm.test.ts similarity index 100% rename from src/components/tx-flow/flows/NewSpendingLimit/__tests__/SpendingLimitForm.test.ts rename to apps/web/src/components/tx-flow/flows/NewSpendingLimit/__tests__/SpendingLimitForm.test.ts diff --git a/src/components/tx-flow/flows/NewSpendingLimit/index.tsx b/apps/web/src/components/tx-flow/flows/NewSpendingLimit/index.tsx similarity index 100% rename from src/components/tx-flow/flows/NewSpendingLimit/index.tsx rename to apps/web/src/components/tx-flow/flows/NewSpendingLimit/index.tsx diff --git a/src/components/tx-flow/flows/NewTx/index.tsx b/apps/web/src/components/tx-flow/flows/NewTx/index.tsx similarity index 100% rename from src/components/tx-flow/flows/NewTx/index.tsx rename to apps/web/src/components/tx-flow/flows/NewTx/index.tsx diff --git a/src/components/tx-flow/flows/NewTx/styles.module.css b/apps/web/src/components/tx-flow/flows/NewTx/styles.module.css similarity index 100% rename from src/components/tx-flow/flows/NewTx/styles.module.css rename to apps/web/src/components/tx-flow/flows/NewTx/styles.module.css diff --git a/src/components/tx-flow/flows/NftTransfer/ReviewNftBatch.tsx b/apps/web/src/components/tx-flow/flows/NftTransfer/ReviewNftBatch.tsx similarity index 100% rename from src/components/tx-flow/flows/NftTransfer/ReviewNftBatch.tsx rename to apps/web/src/components/tx-flow/flows/NftTransfer/ReviewNftBatch.tsx diff --git a/src/components/tx-flow/flows/NftTransfer/SendNftBatch.tsx b/apps/web/src/components/tx-flow/flows/NftTransfer/SendNftBatch.tsx similarity index 100% rename from src/components/tx-flow/flows/NftTransfer/SendNftBatch.tsx rename to apps/web/src/components/tx-flow/flows/NftTransfer/SendNftBatch.tsx diff --git a/src/components/tx-flow/flows/NftTransfer/index.tsx b/apps/web/src/components/tx-flow/flows/NftTransfer/index.tsx similarity index 100% rename from src/components/tx-flow/flows/NftTransfer/index.tsx rename to apps/web/src/components/tx-flow/flows/NftTransfer/index.tsx diff --git a/src/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowReview.tsx b/apps/web/src/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowReview.tsx similarity index 100% rename from src/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowReview.tsx rename to apps/web/src/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowReview.tsx diff --git a/src/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowSetup.tsx b/apps/web/src/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowSetup.tsx similarity index 100% rename from src/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowSetup.tsx rename to apps/web/src/components/tx-flow/flows/RecoverAccount/RecoverAccountFlowSetup.tsx diff --git a/src/components/tx-flow/flows/RecoverAccount/__tests__/RecoverAccountFlowSetup.test.ts b/apps/web/src/components/tx-flow/flows/RecoverAccount/__tests__/RecoverAccountFlowSetup.test.ts similarity index 100% rename from src/components/tx-flow/flows/RecoverAccount/__tests__/RecoverAccountFlowSetup.test.ts rename to apps/web/src/components/tx-flow/flows/RecoverAccount/__tests__/RecoverAccountFlowSetup.test.ts diff --git a/src/components/tx-flow/flows/RecoverAccount/index.tsx b/apps/web/src/components/tx-flow/flows/RecoverAccount/index.tsx similarity index 100% rename from src/components/tx-flow/flows/RecoverAccount/index.tsx rename to apps/web/src/components/tx-flow/flows/RecoverAccount/index.tsx diff --git a/src/components/tx-flow/flows/RecoveryAttempt/RecoveryAttemptReview.tsx b/apps/web/src/components/tx-flow/flows/RecoveryAttempt/RecoveryAttemptReview.tsx similarity index 100% rename from src/components/tx-flow/flows/RecoveryAttempt/RecoveryAttemptReview.tsx rename to apps/web/src/components/tx-flow/flows/RecoveryAttempt/RecoveryAttemptReview.tsx diff --git a/src/components/tx-flow/flows/RecoveryAttempt/index.tsx b/apps/web/src/components/tx-flow/flows/RecoveryAttempt/index.tsx similarity index 100% rename from src/components/tx-flow/flows/RecoveryAttempt/index.tsx rename to apps/web/src/components/tx-flow/flows/RecoveryAttempt/index.tsx diff --git a/src/components/tx-flow/flows/RejectTx/RejectTx.tsx b/apps/web/src/components/tx-flow/flows/RejectTx/RejectTx.tsx similarity index 100% rename from src/components/tx-flow/flows/RejectTx/RejectTx.tsx rename to apps/web/src/components/tx-flow/flows/RejectTx/RejectTx.tsx diff --git a/src/components/tx-flow/flows/RejectTx/index.tsx b/apps/web/src/components/tx-flow/flows/RejectTx/index.tsx similarity index 100% rename from src/components/tx-flow/flows/RejectTx/index.tsx rename to apps/web/src/components/tx-flow/flows/RejectTx/index.tsx diff --git a/src/components/tx-flow/flows/RemoveGuard/ReviewRemoveGuard.tsx b/apps/web/src/components/tx-flow/flows/RemoveGuard/ReviewRemoveGuard.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveGuard/ReviewRemoveGuard.tsx rename to apps/web/src/components/tx-flow/flows/RemoveGuard/ReviewRemoveGuard.tsx diff --git a/src/components/tx-flow/flows/RemoveGuard/index.tsx b/apps/web/src/components/tx-flow/flows/RemoveGuard/index.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveGuard/index.tsx rename to apps/web/src/components/tx-flow/flows/RemoveGuard/index.tsx diff --git a/src/components/tx-flow/flows/RemoveModule/ReviewRemoveModule.tsx b/apps/web/src/components/tx-flow/flows/RemoveModule/ReviewRemoveModule.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveModule/ReviewRemoveModule.tsx rename to apps/web/src/components/tx-flow/flows/RemoveModule/ReviewRemoveModule.tsx diff --git a/src/components/tx-flow/flows/RemoveModule/index.tsx b/apps/web/src/components/tx-flow/flows/RemoveModule/index.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveModule/index.tsx rename to apps/web/src/components/tx-flow/flows/RemoveModule/index.tsx diff --git a/src/components/tx-flow/flows/RemoveOwner/ReviewRemoveOwner.tsx b/apps/web/src/components/tx-flow/flows/RemoveOwner/ReviewRemoveOwner.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveOwner/ReviewRemoveOwner.tsx rename to apps/web/src/components/tx-flow/flows/RemoveOwner/ReviewRemoveOwner.tsx diff --git a/src/components/tx-flow/flows/RemoveOwner/SetThreshold.tsx b/apps/web/src/components/tx-flow/flows/RemoveOwner/SetThreshold.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveOwner/SetThreshold.tsx rename to apps/web/src/components/tx-flow/flows/RemoveOwner/SetThreshold.tsx diff --git a/src/components/tx-flow/flows/RemoveOwner/index.tsx b/apps/web/src/components/tx-flow/flows/RemoveOwner/index.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveOwner/index.tsx rename to apps/web/src/components/tx-flow/flows/RemoveOwner/index.tsx diff --git a/src/components/tx-flow/flows/RemoveOwner/styles.module.css b/apps/web/src/components/tx-flow/flows/RemoveOwner/styles.module.css similarity index 100% rename from src/components/tx-flow/flows/RemoveOwner/styles.module.css rename to apps/web/src/components/tx-flow/flows/RemoveOwner/styles.module.css diff --git a/src/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowOverview.tsx b/apps/web/src/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowOverview.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowOverview.tsx rename to apps/web/src/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowOverview.tsx diff --git a/src/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowReview.tsx b/apps/web/src/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowReview.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowReview.tsx rename to apps/web/src/components/tx-flow/flows/RemoveRecovery/RemoveRecoveryFlowReview.tsx diff --git a/src/components/tx-flow/flows/RemoveRecovery/index.tsx b/apps/web/src/components/tx-flow/flows/RemoveRecovery/index.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveRecovery/index.tsx rename to apps/web/src/components/tx-flow/flows/RemoveRecovery/index.tsx diff --git a/src/components/tx-flow/flows/RemoveSpendingLimit/RemoveSpendingLimit.tsx b/apps/web/src/components/tx-flow/flows/RemoveSpendingLimit/RemoveSpendingLimit.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveSpendingLimit/RemoveSpendingLimit.tsx rename to apps/web/src/components/tx-flow/flows/RemoveSpendingLimit/RemoveSpendingLimit.tsx diff --git a/src/components/tx-flow/flows/RemoveSpendingLimit/index.tsx b/apps/web/src/components/tx-flow/flows/RemoveSpendingLimit/index.tsx similarity index 100% rename from src/components/tx-flow/flows/RemoveSpendingLimit/index.tsx rename to apps/web/src/components/tx-flow/flows/RemoveSpendingLimit/index.tsx diff --git a/src/components/tx-flow/flows/ReplaceOwner/index.tsx b/apps/web/src/components/tx-flow/flows/ReplaceOwner/index.tsx similarity index 100% rename from src/components/tx-flow/flows/ReplaceOwner/index.tsx rename to apps/web/src/components/tx-flow/flows/ReplaceOwner/index.tsx diff --git a/src/components/tx-flow/flows/ReplaceTx/DeleteTxModal.tsx b/apps/web/src/components/tx-flow/flows/ReplaceTx/DeleteTxModal.tsx similarity index 100% rename from src/components/tx-flow/flows/ReplaceTx/DeleteTxModal.tsx rename to apps/web/src/components/tx-flow/flows/ReplaceTx/DeleteTxModal.tsx diff --git a/src/components/tx-flow/flows/ReplaceTx/index.tsx b/apps/web/src/components/tx-flow/flows/ReplaceTx/index.tsx similarity index 100% rename from src/components/tx-flow/flows/ReplaceTx/index.tsx rename to apps/web/src/components/tx-flow/flows/ReplaceTx/index.tsx diff --git a/src/components/tx-flow/flows/ReplaceTx/styles.module.css b/apps/web/src/components/tx-flow/flows/ReplaceTx/styles.module.css similarity index 100% rename from src/components/tx-flow/flows/ReplaceTx/styles.module.css rename to apps/web/src/components/tx-flow/flows/ReplaceTx/styles.module.css diff --git a/src/components/tx-flow/flows/SafeAppsTx/ReviewSafeAppsTx.tsx b/apps/web/src/components/tx-flow/flows/SafeAppsTx/ReviewSafeAppsTx.tsx similarity index 100% rename from src/components/tx-flow/flows/SafeAppsTx/ReviewSafeAppsTx.tsx rename to apps/web/src/components/tx-flow/flows/SafeAppsTx/ReviewSafeAppsTx.tsx diff --git a/src/components/tx-flow/flows/SafeAppsTx/index.tsx b/apps/web/src/components/tx-flow/flows/SafeAppsTx/index.tsx similarity index 100% rename from src/components/tx-flow/flows/SafeAppsTx/index.tsx rename to apps/web/src/components/tx-flow/flows/SafeAppsTx/index.tsx diff --git a/src/components/tx-flow/flows/SignMessage/SignMessage.test.tsx b/apps/web/src/components/tx-flow/flows/SignMessage/SignMessage.test.tsx similarity index 100% rename from src/components/tx-flow/flows/SignMessage/SignMessage.test.tsx rename to apps/web/src/components/tx-flow/flows/SignMessage/SignMessage.test.tsx diff --git a/src/components/tx-flow/flows/SignMessage/SignMessage.tsx b/apps/web/src/components/tx-flow/flows/SignMessage/SignMessage.tsx similarity index 100% rename from src/components/tx-flow/flows/SignMessage/SignMessage.tsx rename to apps/web/src/components/tx-flow/flows/SignMessage/SignMessage.tsx diff --git a/src/components/tx-flow/flows/SignMessage/index.tsx b/apps/web/src/components/tx-flow/flows/SignMessage/index.tsx similarity index 100% rename from src/components/tx-flow/flows/SignMessage/index.tsx rename to apps/web/src/components/tx-flow/flows/SignMessage/index.tsx diff --git a/src/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.test.tsx b/apps/web/src/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.test.tsx similarity index 100% rename from src/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.test.tsx rename to apps/web/src/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.test.tsx diff --git a/src/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.tsx b/apps/web/src/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.tsx similarity index 100% rename from src/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.tsx rename to apps/web/src/components/tx-flow/flows/SignMessageOnChain/ReviewSignMessageOnChain.tsx diff --git a/src/components/tx-flow/flows/SignMessageOnChain/index.tsx b/apps/web/src/components/tx-flow/flows/SignMessageOnChain/index.tsx similarity index 100% rename from src/components/tx-flow/flows/SignMessageOnChain/index.tsx rename to apps/web/src/components/tx-flow/flows/SignMessageOnChain/index.tsx diff --git a/src/components/tx-flow/flows/SuccessScreen/StatusMessage.tsx b/apps/web/src/components/tx-flow/flows/SuccessScreen/StatusMessage.tsx similarity index 100% rename from src/components/tx-flow/flows/SuccessScreen/StatusMessage.tsx rename to apps/web/src/components/tx-flow/flows/SuccessScreen/StatusMessage.tsx diff --git a/src/components/tx-flow/flows/SuccessScreen/StatusStepper.tsx b/apps/web/src/components/tx-flow/flows/SuccessScreen/StatusStepper.tsx similarity index 100% rename from src/components/tx-flow/flows/SuccessScreen/StatusStepper.tsx rename to apps/web/src/components/tx-flow/flows/SuccessScreen/StatusStepper.tsx diff --git a/src/components/tx-flow/flows/SuccessScreen/index.tsx b/apps/web/src/components/tx-flow/flows/SuccessScreen/index.tsx similarity index 100% rename from src/components/tx-flow/flows/SuccessScreen/index.tsx rename to apps/web/src/components/tx-flow/flows/SuccessScreen/index.tsx diff --git a/src/components/tx-flow/flows/SuccessScreen/statuses/DefaultStatus.tsx b/apps/web/src/components/tx-flow/flows/SuccessScreen/statuses/DefaultStatus.tsx similarity index 100% rename from src/components/tx-flow/flows/SuccessScreen/statuses/DefaultStatus.tsx rename to apps/web/src/components/tx-flow/flows/SuccessScreen/statuses/DefaultStatus.tsx diff --git a/src/components/tx-flow/flows/SuccessScreen/statuses/IndexingStatus.tsx b/apps/web/src/components/tx-flow/flows/SuccessScreen/statuses/IndexingStatus.tsx similarity index 100% rename from src/components/tx-flow/flows/SuccessScreen/statuses/IndexingStatus.tsx rename to apps/web/src/components/tx-flow/flows/SuccessScreen/statuses/IndexingStatus.tsx diff --git a/src/components/tx-flow/flows/SuccessScreen/statuses/ProcessingStatus.tsx b/apps/web/src/components/tx-flow/flows/SuccessScreen/statuses/ProcessingStatus.tsx similarity index 100% rename from src/components/tx-flow/flows/SuccessScreen/statuses/ProcessingStatus.tsx rename to apps/web/src/components/tx-flow/flows/SuccessScreen/statuses/ProcessingStatus.tsx diff --git a/src/components/tx-flow/flows/SuccessScreen/styles.module.css b/apps/web/src/components/tx-flow/flows/SuccessScreen/styles.module.css similarity index 100% rename from src/components/tx-flow/flows/SuccessScreen/styles.module.css rename to apps/web/src/components/tx-flow/flows/SuccessScreen/styles.module.css diff --git a/src/components/tx-flow/flows/TokenTransfer/CreateTokenTransfer.tsx b/apps/web/src/components/tx-flow/flows/TokenTransfer/CreateTokenTransfer.tsx similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/CreateTokenTransfer.tsx rename to apps/web/src/components/tx-flow/flows/TokenTransfer/CreateTokenTransfer.tsx diff --git a/src/components/tx-flow/flows/TokenTransfer/ReviewSpendingLimitTx.tsx b/apps/web/src/components/tx-flow/flows/TokenTransfer/ReviewSpendingLimitTx.tsx similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/ReviewSpendingLimitTx.tsx rename to apps/web/src/components/tx-flow/flows/TokenTransfer/ReviewSpendingLimitTx.tsx diff --git a/src/components/tx-flow/flows/TokenTransfer/ReviewTokenTransfer.tsx b/apps/web/src/components/tx-flow/flows/TokenTransfer/ReviewTokenTransfer.tsx similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/ReviewTokenTransfer.tsx rename to apps/web/src/components/tx-flow/flows/TokenTransfer/ReviewTokenTransfer.tsx diff --git a/src/components/tx-flow/flows/TokenTransfer/ReviewTokenTx.tsx b/apps/web/src/components/tx-flow/flows/TokenTransfer/ReviewTokenTx.tsx similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/ReviewTokenTx.tsx rename to apps/web/src/components/tx-flow/flows/TokenTransfer/ReviewTokenTx.tsx diff --git a/src/components/tx-flow/flows/TokenTransfer/SendAmountBlock.tsx b/apps/web/src/components/tx-flow/flows/TokenTransfer/SendAmountBlock.tsx similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/SendAmountBlock.tsx rename to apps/web/src/components/tx-flow/flows/TokenTransfer/SendAmountBlock.tsx diff --git a/src/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/index.tsx b/apps/web/src/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/index.tsx similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/index.tsx rename to apps/web/src/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/index.tsx diff --git a/src/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/styles.module.css b/apps/web/src/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/styles.module.css similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/styles.module.css rename to apps/web/src/components/tx-flow/flows/TokenTransfer/SpendingLimitRow/styles.module.css diff --git a/src/components/tx-flow/flows/TokenTransfer/__tests__/CreateTokenTransfer.test.tsx b/apps/web/src/components/tx-flow/flows/TokenTransfer/__tests__/CreateTokenTransfer.test.tsx similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/__tests__/CreateTokenTransfer.test.tsx rename to apps/web/src/components/tx-flow/flows/TokenTransfer/__tests__/CreateTokenTransfer.test.tsx diff --git a/src/components/tx-flow/flows/TokenTransfer/__tests__/utils.test.ts b/apps/web/src/components/tx-flow/flows/TokenTransfer/__tests__/utils.test.ts similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/__tests__/utils.test.ts rename to apps/web/src/components/tx-flow/flows/TokenTransfer/__tests__/utils.test.ts diff --git a/src/components/tx-flow/flows/TokenTransfer/index.tsx b/apps/web/src/components/tx-flow/flows/TokenTransfer/index.tsx similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/index.tsx rename to apps/web/src/components/tx-flow/flows/TokenTransfer/index.tsx diff --git a/src/components/tx-flow/flows/TokenTransfer/utils.ts b/apps/web/src/components/tx-flow/flows/TokenTransfer/utils.ts similarity index 100% rename from src/components/tx-flow/flows/TokenTransfer/utils.ts rename to apps/web/src/components/tx-flow/flows/TokenTransfer/utils.ts diff --git a/src/components/tx-flow/flows/UpdateSafe/UpdateSafeReview.tsx b/apps/web/src/components/tx-flow/flows/UpdateSafe/UpdateSafeReview.tsx similarity index 100% rename from src/components/tx-flow/flows/UpdateSafe/UpdateSafeReview.tsx rename to apps/web/src/components/tx-flow/flows/UpdateSafe/UpdateSafeReview.tsx diff --git a/src/components/tx-flow/flows/UpdateSafe/index.tsx b/apps/web/src/components/tx-flow/flows/UpdateSafe/index.tsx similarity index 100% rename from src/components/tx-flow/flows/UpdateSafe/index.tsx rename to apps/web/src/components/tx-flow/flows/UpdateSafe/index.tsx diff --git a/src/components/tx-flow/flows/UpsertRecovery/RecovererSmartContractWarning.tsx b/apps/web/src/components/tx-flow/flows/UpsertRecovery/RecovererSmartContractWarning.tsx similarity index 100% rename from src/components/tx-flow/flows/UpsertRecovery/RecovererSmartContractWarning.tsx rename to apps/web/src/components/tx-flow/flows/UpsertRecovery/RecovererSmartContractWarning.tsx diff --git a/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowIntro.tsx b/apps/web/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowIntro.tsx similarity index 100% rename from src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowIntro.tsx rename to apps/web/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowIntro.tsx diff --git a/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowReview.tsx b/apps/web/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowReview.tsx similarity index 100% rename from src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowReview.tsx rename to apps/web/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowReview.tsx diff --git a/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowSettings.tsx b/apps/web/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowSettings.tsx similarity index 100% rename from src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowSettings.tsx rename to apps/web/src/components/tx-flow/flows/UpsertRecovery/UpsertRecoveryFlowSettings.tsx diff --git a/src/components/tx-flow/flows/UpsertRecovery/index.tsx b/apps/web/src/components/tx-flow/flows/UpsertRecovery/index.tsx similarity index 100% rename from src/components/tx-flow/flows/UpsertRecovery/index.tsx rename to apps/web/src/components/tx-flow/flows/UpsertRecovery/index.tsx diff --git a/src/components/tx-flow/flows/UpsertRecovery/styles.module.css b/apps/web/src/components/tx-flow/flows/UpsertRecovery/styles.module.css similarity index 100% rename from src/components/tx-flow/flows/UpsertRecovery/styles.module.css rename to apps/web/src/components/tx-flow/flows/UpsertRecovery/styles.module.css diff --git a/src/components/tx-flow/flows/UpsertRecovery/useRecoveryPeriods.ts b/apps/web/src/components/tx-flow/flows/UpsertRecovery/useRecoveryPeriods.ts similarity index 100% rename from src/components/tx-flow/flows/UpsertRecovery/useRecoveryPeriods.ts rename to apps/web/src/components/tx-flow/flows/UpsertRecovery/useRecoveryPeriods.ts diff --git a/src/components/tx-flow/flows/UpsertRecovery/utils.ts b/apps/web/src/components/tx-flow/flows/UpsertRecovery/utils.ts similarity index 100% rename from src/components/tx-flow/flows/UpsertRecovery/utils.ts rename to apps/web/src/components/tx-flow/flows/UpsertRecovery/utils.ts diff --git a/src/components/tx-flow/flows/index.ts b/apps/web/src/components/tx-flow/flows/index.ts similarity index 100% rename from src/components/tx-flow/flows/index.ts rename to apps/web/src/components/tx-flow/flows/index.ts diff --git a/src/components/tx-flow/index.tsx b/apps/web/src/components/tx-flow/index.tsx similarity index 100% rename from src/components/tx-flow/index.tsx rename to apps/web/src/components/tx-flow/index.tsx diff --git a/src/components/tx-flow/useTxStepper.tsx b/apps/web/src/components/tx-flow/useTxStepper.tsx similarity index 100% rename from src/components/tx-flow/useTxStepper.tsx rename to apps/web/src/components/tx-flow/useTxStepper.tsx diff --git a/src/components/tx/AdvancedParams/AdvancedParamsForm.tsx b/apps/web/src/components/tx/AdvancedParams/AdvancedParamsForm.tsx similarity index 100% rename from src/components/tx/AdvancedParams/AdvancedParamsForm.tsx rename to apps/web/src/components/tx/AdvancedParams/AdvancedParamsForm.tsx diff --git a/src/components/tx/AdvancedParams/GasLimitInput.tsx b/apps/web/src/components/tx/AdvancedParams/GasLimitInput.tsx similarity index 100% rename from src/components/tx/AdvancedParams/GasLimitInput.tsx rename to apps/web/src/components/tx/AdvancedParams/GasLimitInput.tsx diff --git a/src/components/tx/AdvancedParams/index.tsx b/apps/web/src/components/tx/AdvancedParams/index.tsx similarity index 100% rename from src/components/tx/AdvancedParams/index.tsx rename to apps/web/src/components/tx/AdvancedParams/index.tsx diff --git a/src/components/tx/AdvancedParams/types.ts b/apps/web/src/components/tx/AdvancedParams/types.ts similarity index 100% rename from src/components/tx/AdvancedParams/types.ts rename to apps/web/src/components/tx/AdvancedParams/types.ts diff --git a/src/components/tx/AdvancedParams/useAdvancedParams.ts b/apps/web/src/components/tx/AdvancedParams/useAdvancedParams.ts similarity index 100% rename from src/components/tx/AdvancedParams/useAdvancedParams.ts rename to apps/web/src/components/tx/AdvancedParams/useAdvancedParams.ts diff --git a/src/components/tx/AdvancedParams/useUserNonce.ts b/apps/web/src/components/tx/AdvancedParams/useUserNonce.ts similarity index 100% rename from src/components/tx/AdvancedParams/useUserNonce.ts rename to apps/web/src/components/tx/AdvancedParams/useUserNonce.ts diff --git a/src/components/tx/ApprovalEditor/ApprovalEditor.test.tsx b/apps/web/src/components/tx/ApprovalEditor/ApprovalEditor.test.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/ApprovalEditor.test.tsx rename to apps/web/src/components/tx/ApprovalEditor/ApprovalEditor.test.tsx diff --git a/src/components/tx/ApprovalEditor/ApprovalEditorForm.test.tsx b/apps/web/src/components/tx/ApprovalEditor/ApprovalEditorForm.test.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/ApprovalEditorForm.test.tsx rename to apps/web/src/components/tx/ApprovalEditor/ApprovalEditorForm.test.tsx diff --git a/src/components/tx/ApprovalEditor/ApprovalEditorForm.tsx b/apps/web/src/components/tx/ApprovalEditor/ApprovalEditorForm.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/ApprovalEditorForm.tsx rename to apps/web/src/components/tx/ApprovalEditor/ApprovalEditorForm.tsx diff --git a/src/components/tx/ApprovalEditor/ApprovalItem.tsx b/apps/web/src/components/tx/ApprovalEditor/ApprovalItem.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/ApprovalItem.tsx rename to apps/web/src/components/tx/ApprovalEditor/ApprovalItem.tsx diff --git a/src/components/tx/ApprovalEditor/ApprovalValueField.tsx b/apps/web/src/components/tx/ApprovalEditor/ApprovalValueField.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/ApprovalValueField.tsx rename to apps/web/src/components/tx/ApprovalEditor/ApprovalValueField.tsx diff --git a/src/components/tx/ApprovalEditor/Approvals.tsx b/apps/web/src/components/tx/ApprovalEditor/Approvals.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/Approvals.tsx rename to apps/web/src/components/tx/ApprovalEditor/Approvals.tsx diff --git a/src/components/tx/ApprovalEditor/EditableApprovalItem.tsx b/apps/web/src/components/tx/ApprovalEditor/EditableApprovalItem.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/EditableApprovalItem.tsx rename to apps/web/src/components/tx/ApprovalEditor/EditableApprovalItem.tsx diff --git a/src/components/tx/ApprovalEditor/SpenderField.tsx b/apps/web/src/components/tx/ApprovalEditor/SpenderField.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/SpenderField.tsx rename to apps/web/src/components/tx/ApprovalEditor/SpenderField.tsx diff --git a/src/components/tx/ApprovalEditor/hooks/useApprovalInfos.test.ts b/apps/web/src/components/tx/ApprovalEditor/hooks/useApprovalInfos.test.ts similarity index 100% rename from src/components/tx/ApprovalEditor/hooks/useApprovalInfos.test.ts rename to apps/web/src/components/tx/ApprovalEditor/hooks/useApprovalInfos.test.ts diff --git a/src/components/tx/ApprovalEditor/hooks/useApprovalInfos.ts b/apps/web/src/components/tx/ApprovalEditor/hooks/useApprovalInfos.ts similarity index 100% rename from src/components/tx/ApprovalEditor/hooks/useApprovalInfos.ts rename to apps/web/src/components/tx/ApprovalEditor/hooks/useApprovalInfos.ts diff --git a/src/components/tx/ApprovalEditor/index.tsx b/apps/web/src/components/tx/ApprovalEditor/index.tsx similarity index 100% rename from src/components/tx/ApprovalEditor/index.tsx rename to apps/web/src/components/tx/ApprovalEditor/index.tsx diff --git a/src/components/tx/ApprovalEditor/styles.module.css b/apps/web/src/components/tx/ApprovalEditor/styles.module.css similarity index 100% rename from src/components/tx/ApprovalEditor/styles.module.css rename to apps/web/src/components/tx/ApprovalEditor/styles.module.css diff --git a/src/components/tx/ApprovalEditor/utils/approvals.ts b/apps/web/src/components/tx/ApprovalEditor/utils/approvals.ts similarity index 100% rename from src/components/tx/ApprovalEditor/utils/approvals.ts rename to apps/web/src/components/tx/ApprovalEditor/utils/approvals.ts diff --git a/src/components/tx/BalanceInfo/index.tsx b/apps/web/src/components/tx/BalanceInfo/index.tsx similarity index 100% rename from src/components/tx/BalanceInfo/index.tsx rename to apps/web/src/components/tx/BalanceInfo/index.tsx diff --git a/src/components/tx/BalanceInfo/styles.module.css b/apps/web/src/components/tx/BalanceInfo/styles.module.css similarity index 100% rename from src/components/tx/BalanceInfo/styles.module.css rename to apps/web/src/components/tx/BalanceInfo/styles.module.css diff --git a/src/components/tx/ConfirmationOrder/ConfirmationOrderHeader.tsx b/apps/web/src/components/tx/ConfirmationOrder/ConfirmationOrderHeader.tsx similarity index 100% rename from src/components/tx/ConfirmationOrder/ConfirmationOrderHeader.tsx rename to apps/web/src/components/tx/ConfirmationOrder/ConfirmationOrderHeader.tsx diff --git a/src/components/tx/DecodedTx/HelpTooltip.tsx b/apps/web/src/components/tx/DecodedTx/HelpTooltip.tsx similarity index 100% rename from src/components/tx/DecodedTx/HelpTooltip.tsx rename to apps/web/src/components/tx/DecodedTx/HelpTooltip.tsx diff --git a/src/components/tx/DecodedTx/index.test.tsx b/apps/web/src/components/tx/DecodedTx/index.test.tsx similarity index 100% rename from src/components/tx/DecodedTx/index.test.tsx rename to apps/web/src/components/tx/DecodedTx/index.test.tsx diff --git a/src/components/tx/DecodedTx/index.tsx b/apps/web/src/components/tx/DecodedTx/index.tsx similarity index 100% rename from src/components/tx/DecodedTx/index.tsx rename to apps/web/src/components/tx/DecodedTx/index.tsx diff --git a/src/components/tx/ErrorMessage/index.tsx b/apps/web/src/components/tx/ErrorMessage/index.tsx similarity index 100% rename from src/components/tx/ErrorMessage/index.tsx rename to apps/web/src/components/tx/ErrorMessage/index.tsx diff --git a/src/components/tx/ErrorMessage/styles.module.css b/apps/web/src/components/tx/ErrorMessage/styles.module.css similarity index 100% rename from src/components/tx/ErrorMessage/styles.module.css rename to apps/web/src/components/tx/ErrorMessage/styles.module.css diff --git a/src/components/tx/ExecuteCheckbox/index.tsx b/apps/web/src/components/tx/ExecuteCheckbox/index.tsx similarity index 100% rename from src/components/tx/ExecuteCheckbox/index.tsx rename to apps/web/src/components/tx/ExecuteCheckbox/index.tsx diff --git a/src/components/tx/ExecuteCheckbox/styles.module.css b/apps/web/src/components/tx/ExecuteCheckbox/styles.module.css similarity index 100% rename from src/components/tx/ExecuteCheckbox/styles.module.css rename to apps/web/src/components/tx/ExecuteCheckbox/styles.module.css diff --git a/src/components/tx/ExecutionMethodSelector/index.tsx b/apps/web/src/components/tx/ExecutionMethodSelector/index.tsx similarity index 100% rename from src/components/tx/ExecutionMethodSelector/index.tsx rename to apps/web/src/components/tx/ExecutionMethodSelector/index.tsx diff --git a/src/components/tx/ExecutionMethodSelector/styles.module.css b/apps/web/src/components/tx/ExecutionMethodSelector/styles.module.css similarity index 100% rename from src/components/tx/ExecutionMethodSelector/styles.module.css rename to apps/web/src/components/tx/ExecutionMethodSelector/styles.module.css diff --git a/src/components/tx/FieldsGrid/index.tsx b/apps/web/src/components/tx/FieldsGrid/index.tsx similarity index 100% rename from src/components/tx/FieldsGrid/index.tsx rename to apps/web/src/components/tx/FieldsGrid/index.tsx diff --git a/src/components/tx/GasParams/GasParams.test.tsx b/apps/web/src/components/tx/GasParams/GasParams.test.tsx similarity index 100% rename from src/components/tx/GasParams/GasParams.test.tsx rename to apps/web/src/components/tx/GasParams/GasParams.test.tsx diff --git a/src/components/tx/GasParams/index.tsx b/apps/web/src/components/tx/GasParams/index.tsx similarity index 100% rename from src/components/tx/GasParams/index.tsx rename to apps/web/src/components/tx/GasParams/index.tsx diff --git a/src/components/tx/GasParams/styles.module.css b/apps/web/src/components/tx/GasParams/styles.module.css similarity index 100% rename from src/components/tx/GasParams/styles.module.css rename to apps/web/src/components/tx/GasParams/styles.module.css diff --git a/src/components/tx/RemainingRelays/index.test.tsx b/apps/web/src/components/tx/RemainingRelays/index.test.tsx similarity index 100% rename from src/components/tx/RemainingRelays/index.test.tsx rename to apps/web/src/components/tx/RemainingRelays/index.test.tsx diff --git a/src/components/tx/RemainingRelays/index.tsx b/apps/web/src/components/tx/RemainingRelays/index.tsx similarity index 100% rename from src/components/tx/RemainingRelays/index.tsx rename to apps/web/src/components/tx/RemainingRelays/index.tsx diff --git a/src/components/tx/SendFromBlock/index.tsx b/apps/web/src/components/tx/SendFromBlock/index.tsx similarity index 100% rename from src/components/tx/SendFromBlock/index.tsx rename to apps/web/src/components/tx/SendFromBlock/index.tsx diff --git a/src/components/tx/SendFromBlock/styles.module.css b/apps/web/src/components/tx/SendFromBlock/styles.module.css similarity index 100% rename from src/components/tx/SendFromBlock/styles.module.css rename to apps/web/src/components/tx/SendFromBlock/styles.module.css diff --git a/src/components/tx/SendToBlock/index.tsx b/apps/web/src/components/tx/SendToBlock/index.tsx similarity index 100% rename from src/components/tx/SendToBlock/index.tsx rename to apps/web/src/components/tx/SendToBlock/index.tsx diff --git a/src/components/tx/SignOrExecuteForm/BatchButton.tsx b/apps/web/src/components/tx/SignOrExecuteForm/BatchButton.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/BatchButton.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/BatchButton.tsx diff --git a/src/components/tx/SignOrExecuteForm/ConfirmationTitle.tsx b/apps/web/src/components/tx/SignOrExecuteForm/ConfirmationTitle.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/ConfirmationTitle.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/ConfirmationTitle.tsx diff --git a/src/components/tx/SignOrExecuteForm/ExecuteForm.tsx b/apps/web/src/components/tx/SignOrExecuteForm/ExecuteForm.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/ExecuteForm.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/ExecuteForm.tsx diff --git a/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/ExecuteThroughRoleForm.test.tsx b/apps/web/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/ExecuteThroughRoleForm.test.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/ExecuteThroughRoleForm.test.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/ExecuteThroughRoleForm.test.tsx diff --git a/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/hooks.test.ts b/apps/web/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/hooks.test.ts similarity index 100% rename from src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/hooks.test.ts rename to apps/web/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/__test__/hooks.test.ts diff --git a/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/hooks.ts b/apps/web/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/hooks.ts similarity index 100% rename from src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/hooks.ts rename to apps/web/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/hooks.ts diff --git a/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/index.tsx b/apps/web/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/index.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/index.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/ExecuteThroughRoleForm/index.tsx diff --git a/src/components/tx/SignOrExecuteForm/NonOwnerError.tsx b/apps/web/src/components/tx/SignOrExecuteForm/NonOwnerError.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/NonOwnerError.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/NonOwnerError.tsx diff --git a/src/components/tx/SignOrExecuteForm/ProposerForm.tsx b/apps/web/src/components/tx/SignOrExecuteForm/ProposerForm.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/ProposerForm.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/ProposerForm.tsx diff --git a/src/components/tx/SignOrExecuteForm/RiskConfirmationError.tsx b/apps/web/src/components/tx/SignOrExecuteForm/RiskConfirmationError.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/RiskConfirmationError.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/RiskConfirmationError.tsx diff --git a/src/components/tx/SignOrExecuteForm/SignForm.tsx b/apps/web/src/components/tx/SignOrExecuteForm/SignForm.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/SignForm.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/SignForm.tsx diff --git a/src/components/tx/SignOrExecuteForm/SignOrExecuteForm.tsx b/apps/web/src/components/tx/SignOrExecuteForm/SignOrExecuteForm.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/SignOrExecuteForm.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/SignOrExecuteForm.tsx diff --git a/src/components/tx/SignOrExecuteForm/SignOrExecuteSkeleton.tsx b/apps/web/src/components/tx/SignOrExecuteForm/SignOrExecuteSkeleton.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/SignOrExecuteSkeleton.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/SignOrExecuteSkeleton.tsx diff --git a/src/components/tx/SignOrExecuteForm/SignerForm/index.tsx b/apps/web/src/components/tx/SignOrExecuteForm/SignerForm/index.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/SignerForm/index.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/SignerForm/index.tsx diff --git a/src/components/tx/SignOrExecuteForm/SignerForm/styles.module.css b/apps/web/src/components/tx/SignOrExecuteForm/SignerForm/styles.module.css similarity index 100% rename from src/components/tx/SignOrExecuteForm/SignerForm/styles.module.css rename to apps/web/src/components/tx/SignOrExecuteForm/SignerForm/styles.module.css diff --git a/src/components/tx/SignOrExecuteForm/TxChecks.tsx b/apps/web/src/components/tx/SignOrExecuteForm/TxChecks.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/TxChecks.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/TxChecks.tsx diff --git a/src/components/tx/SignOrExecuteForm/UnknownContractError.tsx b/apps/web/src/components/tx/SignOrExecuteForm/UnknownContractError.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/UnknownContractError.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/UnknownContractError.tsx diff --git a/src/components/tx/SignOrExecuteForm/WalletRejectionError.tsx b/apps/web/src/components/tx/SignOrExecuteForm/WalletRejectionError.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/WalletRejectionError.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/WalletRejectionError.tsx diff --git a/src/components/tx/SignOrExecuteForm/__tests__/ExecuteForm.test.tsx b/apps/web/src/components/tx/SignOrExecuteForm/__tests__/ExecuteForm.test.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/__tests__/ExecuteForm.test.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/__tests__/ExecuteForm.test.tsx diff --git a/src/components/tx/SignOrExecuteForm/__tests__/SignForm.test.tsx b/apps/web/src/components/tx/SignOrExecuteForm/__tests__/SignForm.test.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/__tests__/SignForm.test.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/__tests__/SignForm.test.tsx diff --git a/src/components/tx/SignOrExecuteForm/__tests__/SignOrExecute.test.tsx b/apps/web/src/components/tx/SignOrExecuteForm/__tests__/SignOrExecute.test.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/__tests__/SignOrExecute.test.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/__tests__/SignOrExecute.test.tsx diff --git a/src/components/tx/SignOrExecuteForm/__tests__/SignOrExecuteForm.test.tsx b/apps/web/src/components/tx/SignOrExecuteForm/__tests__/SignOrExecuteForm.test.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/__tests__/SignOrExecuteForm.test.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/__tests__/SignOrExecuteForm.test.tsx diff --git a/src/components/tx/SignOrExecuteForm/__tests__/SignerForm.test.tsx b/apps/web/src/components/tx/SignOrExecuteForm/__tests__/SignerForm.test.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/__tests__/SignerForm.test.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/__tests__/SignerForm.test.tsx diff --git a/src/components/tx/SignOrExecuteForm/__tests__/__snapshots__/SignOrExecute.test.tsx.snap b/apps/web/src/components/tx/SignOrExecuteForm/__tests__/__snapshots__/SignOrExecute.test.tsx.snap similarity index 100% rename from src/components/tx/SignOrExecuteForm/__tests__/__snapshots__/SignOrExecute.test.tsx.snap rename to apps/web/src/components/tx/SignOrExecuteForm/__tests__/__snapshots__/SignOrExecute.test.tsx.snap diff --git a/src/components/tx/SignOrExecuteForm/__tests__/hooks.test.ts b/apps/web/src/components/tx/SignOrExecuteForm/__tests__/hooks.test.ts similarity index 100% rename from src/components/tx/SignOrExecuteForm/__tests__/hooks.test.ts rename to apps/web/src/components/tx/SignOrExecuteForm/__tests__/hooks.test.ts diff --git a/src/components/tx/SignOrExecuteForm/hooks.ts b/apps/web/src/components/tx/SignOrExecuteForm/hooks.ts similarity index 100% rename from src/components/tx/SignOrExecuteForm/hooks.ts rename to apps/web/src/components/tx/SignOrExecuteForm/hooks.ts diff --git a/src/components/tx/SignOrExecuteForm/index.tsx b/apps/web/src/components/tx/SignOrExecuteForm/index.tsx similarity index 100% rename from src/components/tx/SignOrExecuteForm/index.tsx rename to apps/web/src/components/tx/SignOrExecuteForm/index.tsx diff --git a/src/components/tx/SignOrExecuteForm/styles.module.css b/apps/web/src/components/tx/SignOrExecuteForm/styles.module.css similarity index 100% rename from src/components/tx/SignOrExecuteForm/styles.module.css rename to apps/web/src/components/tx/SignOrExecuteForm/styles.module.css diff --git a/src/components/tx/SignOrExecuteForm/tracking.ts b/apps/web/src/components/tx/SignOrExecuteForm/tracking.ts similarity index 100% rename from src/components/tx/SignOrExecuteForm/tracking.ts rename to apps/web/src/components/tx/SignOrExecuteForm/tracking.ts diff --git a/src/components/tx/SponsoredBy/index.tsx b/apps/web/src/components/tx/SponsoredBy/index.tsx similarity index 100% rename from src/components/tx/SponsoredBy/index.tsx rename to apps/web/src/components/tx/SponsoredBy/index.tsx diff --git a/src/components/tx/SponsoredBy/styles.module.css b/apps/web/src/components/tx/SponsoredBy/styles.module.css similarity index 100% rename from src/components/tx/SponsoredBy/styles.module.css rename to apps/web/src/components/tx/SponsoredBy/styles.module.css diff --git a/src/components/tx/SuccessMessage/index.tsx b/apps/web/src/components/tx/SuccessMessage/index.tsx similarity index 100% rename from src/components/tx/SuccessMessage/index.tsx rename to apps/web/src/components/tx/SuccessMessage/index.tsx diff --git a/src/components/tx/SuccessMessage/styles.module.css b/apps/web/src/components/tx/SuccessMessage/styles.module.css similarity index 100% rename from src/components/tx/SuccessMessage/styles.module.css rename to apps/web/src/components/tx/SuccessMessage/styles.module.css diff --git a/src/components/tx/confirmation-views/BatchTransactions/BatchTransactions.stories.tsx b/apps/web/src/components/tx/confirmation-views/BatchTransactions/BatchTransactions.stories.tsx similarity index 100% rename from src/components/tx/confirmation-views/BatchTransactions/BatchTransactions.stories.tsx rename to apps/web/src/components/tx/confirmation-views/BatchTransactions/BatchTransactions.stories.tsx diff --git a/src/components/tx/confirmation-views/BatchTransactions/BatchTransactions.test.tsx b/apps/web/src/components/tx/confirmation-views/BatchTransactions/BatchTransactions.test.tsx similarity index 100% rename from src/components/tx/confirmation-views/BatchTransactions/BatchTransactions.test.tsx rename to apps/web/src/components/tx/confirmation-views/BatchTransactions/BatchTransactions.test.tsx diff --git a/src/components/tx/confirmation-views/BatchTransactions/__snapshots__/BatchTransactions.test.tsx.snap b/apps/web/src/components/tx/confirmation-views/BatchTransactions/__snapshots__/BatchTransactions.test.tsx.snap similarity index 100% rename from src/components/tx/confirmation-views/BatchTransactions/__snapshots__/BatchTransactions.test.tsx.snap rename to apps/web/src/components/tx/confirmation-views/BatchTransactions/__snapshots__/BatchTransactions.test.tsx.snap diff --git a/src/components/tx/confirmation-views/BatchTransactions/index.tsx b/apps/web/src/components/tx/confirmation-views/BatchTransactions/index.tsx similarity index 100% rename from src/components/tx/confirmation-views/BatchTransactions/index.tsx rename to apps/web/src/components/tx/confirmation-views/BatchTransactions/index.tsx diff --git a/src/components/tx/confirmation-views/BatchTransactions/mockData.ts b/apps/web/src/components/tx/confirmation-views/BatchTransactions/mockData.ts similarity index 100% rename from src/components/tx/confirmation-views/BatchTransactions/mockData.ts rename to apps/web/src/components/tx/confirmation-views/BatchTransactions/mockData.ts diff --git a/src/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.stories.tsx b/apps/web/src/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.stories.tsx similarity index 100% rename from src/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.stories.tsx rename to apps/web/src/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.stories.tsx diff --git a/src/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.test.tsx b/apps/web/src/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.test.tsx similarity index 100% rename from src/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.test.tsx rename to apps/web/src/components/tx/confirmation-views/ChangeThreshold/ChangeThreshold.test.tsx diff --git a/src/components/tx/confirmation-views/ChangeThreshold/__snapshots__/ChangeThreshold.test.tsx.snap b/apps/web/src/components/tx/confirmation-views/ChangeThreshold/__snapshots__/ChangeThreshold.test.tsx.snap similarity index 100% rename from src/components/tx/confirmation-views/ChangeThreshold/__snapshots__/ChangeThreshold.test.tsx.snap rename to apps/web/src/components/tx/confirmation-views/ChangeThreshold/__snapshots__/ChangeThreshold.test.tsx.snap diff --git a/src/components/tx/confirmation-views/ChangeThreshold/index.tsx b/apps/web/src/components/tx/confirmation-views/ChangeThreshold/index.tsx similarity index 100% rename from src/components/tx/confirmation-views/ChangeThreshold/index.tsx rename to apps/web/src/components/tx/confirmation-views/ChangeThreshold/index.tsx diff --git a/src/components/tx/confirmation-views/ConfirmationView.test.tsx b/apps/web/src/components/tx/confirmation-views/ConfirmationView.test.tsx similarity index 100% rename from src/components/tx/confirmation-views/ConfirmationView.test.tsx rename to apps/web/src/components/tx/confirmation-views/ConfirmationView.test.tsx diff --git a/src/components/tx/confirmation-views/MigrateToL2Information/index.tsx b/apps/web/src/components/tx/confirmation-views/MigrateToL2Information/index.tsx similarity index 100% rename from src/components/tx/confirmation-views/MigrateToL2Information/index.tsx rename to apps/web/src/components/tx/confirmation-views/MigrateToL2Information/index.tsx diff --git a/src/components/tx/confirmation-views/SettingsChange/SettingsChange.stories.tsx b/apps/web/src/components/tx/confirmation-views/SettingsChange/SettingsChange.stories.tsx similarity index 100% rename from src/components/tx/confirmation-views/SettingsChange/SettingsChange.stories.tsx rename to apps/web/src/components/tx/confirmation-views/SettingsChange/SettingsChange.stories.tsx diff --git a/src/components/tx/confirmation-views/SettingsChange/SettingsChange.test.tsx b/apps/web/src/components/tx/confirmation-views/SettingsChange/SettingsChange.test.tsx similarity index 100% rename from src/components/tx/confirmation-views/SettingsChange/SettingsChange.test.tsx rename to apps/web/src/components/tx/confirmation-views/SettingsChange/SettingsChange.test.tsx diff --git a/src/components/tx/confirmation-views/SettingsChange/__snapshots__/SettingsChange.test.tsx.snap b/apps/web/src/components/tx/confirmation-views/SettingsChange/__snapshots__/SettingsChange.test.tsx.snap similarity index 100% rename from src/components/tx/confirmation-views/SettingsChange/__snapshots__/SettingsChange.test.tsx.snap rename to apps/web/src/components/tx/confirmation-views/SettingsChange/__snapshots__/SettingsChange.test.tsx.snap diff --git a/src/components/tx/confirmation-views/SettingsChange/index.tsx b/apps/web/src/components/tx/confirmation-views/SettingsChange/index.tsx similarity index 100% rename from src/components/tx/confirmation-views/SettingsChange/index.tsx rename to apps/web/src/components/tx/confirmation-views/SettingsChange/index.tsx diff --git a/src/components/tx/confirmation-views/SettingsChange/mockData.ts b/apps/web/src/components/tx/confirmation-views/SettingsChange/mockData.ts similarity index 100% rename from src/components/tx/confirmation-views/SettingsChange/mockData.ts rename to apps/web/src/components/tx/confirmation-views/SettingsChange/mockData.ts diff --git a/src/components/tx/confirmation-views/StakingTx/index.tsx b/apps/web/src/components/tx/confirmation-views/StakingTx/index.tsx similarity index 100% rename from src/components/tx/confirmation-views/StakingTx/index.tsx rename to apps/web/src/components/tx/confirmation-views/StakingTx/index.tsx diff --git a/src/components/tx/confirmation-views/SwapOrder/index.tsx b/apps/web/src/components/tx/confirmation-views/SwapOrder/index.tsx similarity index 100% rename from src/components/tx/confirmation-views/SwapOrder/index.tsx rename to apps/web/src/components/tx/confirmation-views/SwapOrder/index.tsx diff --git a/src/components/tx/confirmation-views/UpdateSafe/index.tsx b/apps/web/src/components/tx/confirmation-views/UpdateSafe/index.tsx similarity index 100% rename from src/components/tx/confirmation-views/UpdateSafe/index.tsx rename to apps/web/src/components/tx/confirmation-views/UpdateSafe/index.tsx diff --git a/src/components/tx/confirmation-views/__snapshots__/ConfirmationView.test.tsx.snap b/apps/web/src/components/tx/confirmation-views/__snapshots__/ConfirmationView.test.tsx.snap similarity index 100% rename from src/components/tx/confirmation-views/__snapshots__/ConfirmationView.test.tsx.snap rename to apps/web/src/components/tx/confirmation-views/__snapshots__/ConfirmationView.test.tsx.snap diff --git a/src/components/tx/confirmation-views/index.tsx b/apps/web/src/components/tx/confirmation-views/index.tsx similarity index 100% rename from src/components/tx/confirmation-views/index.tsx rename to apps/web/src/components/tx/confirmation-views/index.tsx diff --git a/src/components/tx/confirmation-views/types.d.ts b/apps/web/src/components/tx/confirmation-views/types.d.ts similarity index 100% rename from src/components/tx/confirmation-views/types.d.ts rename to apps/web/src/components/tx/confirmation-views/types.d.ts diff --git a/src/components/tx/confirmation-views/utils.ts b/apps/web/src/components/tx/confirmation-views/utils.ts similarity index 100% rename from src/components/tx/confirmation-views/utils.ts rename to apps/web/src/components/tx/confirmation-views/utils.ts diff --git a/src/components/tx/security/SecurityWarnings.tsx b/apps/web/src/components/tx/security/SecurityWarnings.tsx similarity index 100% rename from src/components/tx/security/SecurityWarnings.tsx rename to apps/web/src/components/tx/security/SecurityWarnings.tsx diff --git a/src/components/tx/security/blockaid/BlockaidBalanceChange.tsx b/apps/web/src/components/tx/security/blockaid/BlockaidBalanceChange.tsx similarity index 100% rename from src/components/tx/security/blockaid/BlockaidBalanceChange.tsx rename to apps/web/src/components/tx/security/blockaid/BlockaidBalanceChange.tsx diff --git a/src/components/tx/security/blockaid/BlockaidHint.tsx b/apps/web/src/components/tx/security/blockaid/BlockaidHint.tsx similarity index 100% rename from src/components/tx/security/blockaid/BlockaidHint.tsx rename to apps/web/src/components/tx/security/blockaid/BlockaidHint.tsx diff --git a/src/components/tx/security/blockaid/__tests__/useBlockaid.test.ts b/apps/web/src/components/tx/security/blockaid/__tests__/useBlockaid.test.ts similarity index 100% rename from src/components/tx/security/blockaid/__tests__/useBlockaid.test.ts rename to apps/web/src/components/tx/security/blockaid/__tests__/useBlockaid.test.ts diff --git a/src/components/tx/security/blockaid/index.tsx b/apps/web/src/components/tx/security/blockaid/index.tsx similarity index 100% rename from src/components/tx/security/blockaid/index.tsx rename to apps/web/src/components/tx/security/blockaid/index.tsx diff --git a/src/components/tx/security/blockaid/styles.module.css b/apps/web/src/components/tx/security/blockaid/styles.module.css similarity index 100% rename from src/components/tx/security/blockaid/styles.module.css rename to apps/web/src/components/tx/security/blockaid/styles.module.css diff --git a/src/components/tx/security/blockaid/useBlockaid.ts b/apps/web/src/components/tx/security/blockaid/useBlockaid.ts similarity index 100% rename from src/components/tx/security/blockaid/useBlockaid.ts rename to apps/web/src/components/tx/security/blockaid/useBlockaid.ts diff --git a/src/components/tx/security/shared/TxSecurityContext.tsx b/apps/web/src/components/tx/security/shared/TxSecurityContext.tsx similarity index 100% rename from src/components/tx/security/shared/TxSecurityContext.tsx rename to apps/web/src/components/tx/security/shared/TxSecurityContext.tsx diff --git a/src/components/tx/security/shared/styles.module.css b/apps/web/src/components/tx/security/shared/styles.module.css similarity index 100% rename from src/components/tx/security/shared/styles.module.css rename to apps/web/src/components/tx/security/shared/styles.module.css diff --git a/src/components/tx/security/tenderly/__tests__/useSimulation.test.ts b/apps/web/src/components/tx/security/tenderly/__tests__/useSimulation.test.ts similarity index 100% rename from src/components/tx/security/tenderly/__tests__/useSimulation.test.ts rename to apps/web/src/components/tx/security/tenderly/__tests__/useSimulation.test.ts diff --git a/src/components/tx/security/tenderly/__tests__/utils.test.ts b/apps/web/src/components/tx/security/tenderly/__tests__/utils.test.ts similarity index 100% rename from src/components/tx/security/tenderly/__tests__/utils.test.ts rename to apps/web/src/components/tx/security/tenderly/__tests__/utils.test.ts diff --git a/src/components/tx/security/tenderly/index.tsx b/apps/web/src/components/tx/security/tenderly/index.tsx similarity index 100% rename from src/components/tx/security/tenderly/index.tsx rename to apps/web/src/components/tx/security/tenderly/index.tsx diff --git a/src/components/tx/security/tenderly/styles.module.css b/apps/web/src/components/tx/security/tenderly/styles.module.css similarity index 100% rename from src/components/tx/security/tenderly/styles.module.css rename to apps/web/src/components/tx/security/tenderly/styles.module.css diff --git a/src/components/tx/security/tenderly/types.ts b/apps/web/src/components/tx/security/tenderly/types.ts similarity index 100% rename from src/components/tx/security/tenderly/types.ts rename to apps/web/src/components/tx/security/tenderly/types.ts diff --git a/src/components/tx/security/tenderly/useSimulation.ts b/apps/web/src/components/tx/security/tenderly/useSimulation.ts similarity index 100% rename from src/components/tx/security/tenderly/useSimulation.ts rename to apps/web/src/components/tx/security/tenderly/useSimulation.ts diff --git a/src/components/tx/security/tenderly/utils.ts b/apps/web/src/components/tx/security/tenderly/utils.ts similarity index 100% rename from src/components/tx/security/tenderly/utils.ts rename to apps/web/src/components/tx/security/tenderly/utils.ts diff --git a/src/components/tx/security/useDelegateCallModule.ts b/apps/web/src/components/tx/security/useDelegateCallModule.ts similarity index 100% rename from src/components/tx/security/useDelegateCallModule.ts rename to apps/web/src/components/tx/security/useDelegateCallModule.ts diff --git a/src/components/tx/security/utils.ts b/apps/web/src/components/tx/security/utils.ts similarity index 100% rename from src/components/tx/security/utils.ts rename to apps/web/src/components/tx/security/utils.ts diff --git a/src/components/welcome/NewSafe.tsx b/apps/web/src/components/welcome/NewSafe.tsx similarity index 100% rename from src/components/welcome/NewSafe.tsx rename to apps/web/src/components/welcome/NewSafe.tsx diff --git a/src/components/welcome/WelcomeLogin/WalletLogin.tsx b/apps/web/src/components/welcome/WelcomeLogin/WalletLogin.tsx similarity index 100% rename from src/components/welcome/WelcomeLogin/WalletLogin.tsx rename to apps/web/src/components/welcome/WelcomeLogin/WalletLogin.tsx diff --git a/src/components/welcome/WelcomeLogin/__tests__/WalletLogin.test.tsx b/apps/web/src/components/welcome/WelcomeLogin/__tests__/WalletLogin.test.tsx similarity index 100% rename from src/components/welcome/WelcomeLogin/__tests__/WalletLogin.test.tsx rename to apps/web/src/components/welcome/WelcomeLogin/__tests__/WalletLogin.test.tsx diff --git a/src/components/welcome/WelcomeLogin/index.tsx b/apps/web/src/components/welcome/WelcomeLogin/index.tsx similarity index 100% rename from src/components/welcome/WelcomeLogin/index.tsx rename to apps/web/src/components/welcome/WelcomeLogin/index.tsx diff --git a/src/components/welcome/WelcomeLogin/styles.module.css b/apps/web/src/components/welcome/WelcomeLogin/styles.module.css similarity index 100% rename from src/components/welcome/WelcomeLogin/styles.module.css rename to apps/web/src/components/welcome/WelcomeLogin/styles.module.css diff --git a/src/components/welcome/styles.module.css b/apps/web/src/components/welcome/styles.module.css similarity index 100% rename from src/components/welcome/styles.module.css rename to apps/web/src/components/welcome/styles.module.css diff --git a/src/components/wrappers/DisclaimerWrapper/index.test.tsx b/apps/web/src/components/wrappers/DisclaimerWrapper/index.test.tsx similarity index 100% rename from src/components/wrappers/DisclaimerWrapper/index.test.tsx rename to apps/web/src/components/wrappers/DisclaimerWrapper/index.test.tsx diff --git a/src/components/wrappers/DisclaimerWrapper/index.tsx b/apps/web/src/components/wrappers/DisclaimerWrapper/index.tsx similarity index 100% rename from src/components/wrappers/DisclaimerWrapper/index.tsx rename to apps/web/src/components/wrappers/DisclaimerWrapper/index.tsx diff --git a/src/components/wrappers/FeatureWrapper/index.test.tsx b/apps/web/src/components/wrappers/FeatureWrapper/index.test.tsx similarity index 100% rename from src/components/wrappers/FeatureWrapper/index.test.tsx rename to apps/web/src/components/wrappers/FeatureWrapper/index.test.tsx diff --git a/src/components/wrappers/FeatureWrapper/index.tsx b/apps/web/src/components/wrappers/FeatureWrapper/index.tsx similarity index 100% rename from src/components/wrappers/FeatureWrapper/index.tsx rename to apps/web/src/components/wrappers/FeatureWrapper/index.tsx diff --git a/src/components/wrappers/SanctionWrapper/index.test.tsx b/apps/web/src/components/wrappers/SanctionWrapper/index.test.tsx similarity index 100% rename from src/components/wrappers/SanctionWrapper/index.test.tsx rename to apps/web/src/components/wrappers/SanctionWrapper/index.test.tsx diff --git a/src/components/wrappers/SanctionWrapper/index.tsx b/apps/web/src/components/wrappers/SanctionWrapper/index.tsx similarity index 100% rename from src/components/wrappers/SanctionWrapper/index.tsx rename to apps/web/src/components/wrappers/SanctionWrapper/index.tsx diff --git a/src/config/chains.ts b/apps/web/src/config/chains.ts similarity index 100% rename from src/config/chains.ts rename to apps/web/src/config/chains.ts diff --git a/src/config/constants.ts b/apps/web/src/config/constants.ts similarity index 100% rename from src/config/constants.ts rename to apps/web/src/config/constants.ts diff --git a/src/config/routes.ts b/apps/web/src/config/routes.ts similarity index 100% rename from src/config/routes.ts rename to apps/web/src/config/routes.ts diff --git a/src/config/securityHeaders.ts b/apps/web/src/config/securityHeaders.ts similarity index 100% rename from src/config/securityHeaders.ts rename to apps/web/src/config/securityHeaders.ts diff --git a/src/definitions.d.ts b/apps/web/src/definitions.d.ts similarity index 100% rename from src/definitions.d.ts rename to apps/web/src/definitions.d.ts diff --git a/src/features/bridge/components/Bridge/index.tsx b/apps/web/src/features/bridge/components/Bridge/index.tsx similarity index 100% rename from src/features/bridge/components/Bridge/index.tsx rename to apps/web/src/features/bridge/components/Bridge/index.tsx diff --git a/src/features/bridge/components/BridgeWidget/index.test.tsx b/apps/web/src/features/bridge/components/BridgeWidget/index.test.tsx similarity index 100% rename from src/features/bridge/components/BridgeWidget/index.test.tsx rename to apps/web/src/features/bridge/components/BridgeWidget/index.test.tsx diff --git a/src/features/bridge/components/BridgeWidget/index.tsx b/apps/web/src/features/bridge/components/BridgeWidget/index.tsx similarity index 100% rename from src/features/bridge/components/BridgeWidget/index.tsx rename to apps/web/src/features/bridge/components/BridgeWidget/index.tsx diff --git a/src/features/bridge/hooks/useIsBridgeFeatureEnabled.ts b/apps/web/src/features/bridge/hooks/useIsBridgeFeatureEnabled.ts similarity index 100% rename from src/features/bridge/hooks/useIsBridgeFeatureEnabled.ts rename to apps/web/src/features/bridge/hooks/useIsBridgeFeatureEnabled.ts diff --git a/src/features/counterfactual/ActivateAccountButton.tsx b/apps/web/src/features/counterfactual/ActivateAccountButton.tsx similarity index 100% rename from src/features/counterfactual/ActivateAccountButton.tsx rename to apps/web/src/features/counterfactual/ActivateAccountButton.tsx diff --git a/src/features/counterfactual/ActivateAccountFlow.tsx b/apps/web/src/features/counterfactual/ActivateAccountFlow.tsx similarity index 100% rename from src/features/counterfactual/ActivateAccountFlow.tsx rename to apps/web/src/features/counterfactual/ActivateAccountFlow.tsx diff --git a/src/features/counterfactual/CheckBalance.tsx b/apps/web/src/features/counterfactual/CheckBalance.tsx similarity index 100% rename from src/features/counterfactual/CheckBalance.tsx rename to apps/web/src/features/counterfactual/CheckBalance.tsx diff --git a/src/features/counterfactual/CounterfactualForm.tsx b/apps/web/src/features/counterfactual/CounterfactualForm.tsx similarity index 100% rename from src/features/counterfactual/CounterfactualForm.tsx rename to apps/web/src/features/counterfactual/CounterfactualForm.tsx diff --git a/src/features/counterfactual/CounterfactualHooks.tsx b/apps/web/src/features/counterfactual/CounterfactualHooks.tsx similarity index 100% rename from src/features/counterfactual/CounterfactualHooks.tsx rename to apps/web/src/features/counterfactual/CounterfactualHooks.tsx diff --git a/src/features/counterfactual/CounterfactualStatusButton.tsx b/apps/web/src/features/counterfactual/CounterfactualStatusButton.tsx similarity index 100% rename from src/features/counterfactual/CounterfactualStatusButton.tsx rename to apps/web/src/features/counterfactual/CounterfactualStatusButton.tsx diff --git a/src/features/counterfactual/CounterfactualSuccessScreen.tsx b/apps/web/src/features/counterfactual/CounterfactualSuccessScreen.tsx similarity index 100% rename from src/features/counterfactual/CounterfactualSuccessScreen.tsx rename to apps/web/src/features/counterfactual/CounterfactualSuccessScreen.tsx diff --git a/src/features/counterfactual/FirstTxFlow.tsx b/apps/web/src/features/counterfactual/FirstTxFlow.tsx similarity index 100% rename from src/features/counterfactual/FirstTxFlow.tsx rename to apps/web/src/features/counterfactual/FirstTxFlow.tsx diff --git a/src/features/counterfactual/LazyCounterfactual.tsx b/apps/web/src/features/counterfactual/LazyCounterfactual.tsx similarity index 100% rename from src/features/counterfactual/LazyCounterfactual.tsx rename to apps/web/src/features/counterfactual/LazyCounterfactual.tsx diff --git a/src/features/counterfactual/PayNowPayLater.tsx b/apps/web/src/features/counterfactual/PayNowPayLater.tsx similarity index 100% rename from src/features/counterfactual/PayNowPayLater.tsx rename to apps/web/src/features/counterfactual/PayNowPayLater.tsx diff --git a/src/features/counterfactual/__tests__/useDeployGasLimit.test.ts b/apps/web/src/features/counterfactual/__tests__/useDeployGasLimit.test.ts similarity index 100% rename from src/features/counterfactual/__tests__/useDeployGasLimit.test.ts rename to apps/web/src/features/counterfactual/__tests__/useDeployGasLimit.test.ts diff --git a/src/features/counterfactual/__tests__/utils.test.ts b/apps/web/src/features/counterfactual/__tests__/utils.test.ts similarity index 100% rename from src/features/counterfactual/__tests__/utils.test.ts rename to apps/web/src/features/counterfactual/__tests__/utils.test.ts diff --git a/src/features/counterfactual/hooks/useDeployGasLimit.ts b/apps/web/src/features/counterfactual/hooks/useDeployGasLimit.ts similarity index 100% rename from src/features/counterfactual/hooks/useDeployGasLimit.ts rename to apps/web/src/features/counterfactual/hooks/useDeployGasLimit.ts diff --git a/src/features/counterfactual/hooks/useIsCounterfactualSafe.ts b/apps/web/src/features/counterfactual/hooks/useIsCounterfactualSafe.ts similarity index 100% rename from src/features/counterfactual/hooks/useIsCounterfactualSafe.ts rename to apps/web/src/features/counterfactual/hooks/useIsCounterfactualSafe.ts diff --git a/src/features/counterfactual/hooks/usePendingSafeNotifications.ts b/apps/web/src/features/counterfactual/hooks/usePendingSafeNotifications.ts similarity index 100% rename from src/features/counterfactual/hooks/usePendingSafeNotifications.ts rename to apps/web/src/features/counterfactual/hooks/usePendingSafeNotifications.ts diff --git a/src/features/counterfactual/hooks/usePendingSafeStatuses.ts b/apps/web/src/features/counterfactual/hooks/usePendingSafeStatuses.ts similarity index 100% rename from src/features/counterfactual/hooks/usePendingSafeStatuses.ts rename to apps/web/src/features/counterfactual/hooks/usePendingSafeStatuses.ts diff --git a/src/features/counterfactual/services/safeCreationEvents.ts b/apps/web/src/features/counterfactual/services/safeCreationEvents.ts similarity index 100% rename from src/features/counterfactual/services/safeCreationEvents.ts rename to apps/web/src/features/counterfactual/services/safeCreationEvents.ts diff --git a/src/features/counterfactual/store/undeployedSafesSlice.ts b/apps/web/src/features/counterfactual/store/undeployedSafesSlice.ts similarity index 100% rename from src/features/counterfactual/store/undeployedSafesSlice.ts rename to apps/web/src/features/counterfactual/store/undeployedSafesSlice.ts diff --git a/src/features/counterfactual/styles.module.css b/apps/web/src/features/counterfactual/styles.module.css similarity index 100% rename from src/features/counterfactual/styles.module.css rename to apps/web/src/features/counterfactual/styles.module.css diff --git a/src/features/counterfactual/utils.ts b/apps/web/src/features/counterfactual/utils.ts similarity index 100% rename from src/features/counterfactual/utils.ts rename to apps/web/src/features/counterfactual/utils.ts diff --git a/src/features/multichain/components/CreateSafeOnNewChain/index.tsx b/apps/web/src/features/multichain/components/CreateSafeOnNewChain/index.tsx similarity index 100% rename from src/features/multichain/components/CreateSafeOnNewChain/index.tsx rename to apps/web/src/features/multichain/components/CreateSafeOnNewChain/index.tsx diff --git a/src/features/multichain/components/NetworkLogosList/index.tsx b/apps/web/src/features/multichain/components/NetworkLogosList/index.tsx similarity index 100% rename from src/features/multichain/components/NetworkLogosList/index.tsx rename to apps/web/src/features/multichain/components/NetworkLogosList/index.tsx diff --git a/src/features/multichain/components/NetworkLogosList/styles.module.css b/apps/web/src/features/multichain/components/NetworkLogosList/styles.module.css similarity index 100% rename from src/features/multichain/components/NetworkLogosList/styles.module.css rename to apps/web/src/features/multichain/components/NetworkLogosList/styles.module.css diff --git a/src/features/multichain/components/SignerSetupWarning/ChangeSignerSetupWarning.tsx b/apps/web/src/features/multichain/components/SignerSetupWarning/ChangeSignerSetupWarning.tsx similarity index 100% rename from src/features/multichain/components/SignerSetupWarning/ChangeSignerSetupWarning.tsx rename to apps/web/src/features/multichain/components/SignerSetupWarning/ChangeSignerSetupWarning.tsx diff --git a/src/features/multichain/components/SignerSetupWarning/InconsistentSignerSetupWarning.tsx b/apps/web/src/features/multichain/components/SignerSetupWarning/InconsistentSignerSetupWarning.tsx similarity index 100% rename from src/features/multichain/components/SignerSetupWarning/InconsistentSignerSetupWarning.tsx rename to apps/web/src/features/multichain/components/SignerSetupWarning/InconsistentSignerSetupWarning.tsx diff --git a/src/features/multichain/hooks/__tests__/useCompatibleNetworks.test.ts b/apps/web/src/features/multichain/hooks/__tests__/useCompatibleNetworks.test.ts similarity index 100% rename from src/features/multichain/hooks/__tests__/useCompatibleNetworks.test.ts rename to apps/web/src/features/multichain/hooks/__tests__/useCompatibleNetworks.test.ts diff --git a/src/features/multichain/hooks/__tests__/useSafeCreationData.test.ts b/apps/web/src/features/multichain/hooks/__tests__/useSafeCreationData.test.ts similarity index 100% rename from src/features/multichain/hooks/__tests__/useSafeCreationData.test.ts rename to apps/web/src/features/multichain/hooks/__tests__/useSafeCreationData.test.ts diff --git a/src/features/multichain/hooks/useCompatibleNetworks.ts b/apps/web/src/features/multichain/hooks/useCompatibleNetworks.ts similarity index 100% rename from src/features/multichain/hooks/useCompatibleNetworks.ts rename to apps/web/src/features/multichain/hooks/useCompatibleNetworks.ts diff --git a/src/features/multichain/hooks/useIsMultichainSafe.ts b/apps/web/src/features/multichain/hooks/useIsMultichainSafe.ts similarity index 100% rename from src/features/multichain/hooks/useIsMultichainSafe.ts rename to apps/web/src/features/multichain/hooks/useIsMultichainSafe.ts diff --git a/src/features/multichain/hooks/useSafeCreationData.ts b/apps/web/src/features/multichain/hooks/useSafeCreationData.ts similarity index 100% rename from src/features/multichain/hooks/useSafeCreationData.ts rename to apps/web/src/features/multichain/hooks/useSafeCreationData.ts diff --git a/src/features/multichain/utils/extract-migration-data.ts b/apps/web/src/features/multichain/utils/extract-migration-data.ts similarity index 100% rename from src/features/multichain/utils/extract-migration-data.ts rename to apps/web/src/features/multichain/utils/extract-migration-data.ts diff --git a/src/features/multichain/utils/utils.test.ts b/apps/web/src/features/multichain/utils/utils.test.ts similarity index 100% rename from src/features/multichain/utils/utils.test.ts rename to apps/web/src/features/multichain/utils/utils.test.ts diff --git a/src/features/multichain/utils/utils.ts b/apps/web/src/features/multichain/utils/utils.ts similarity index 100% rename from src/features/multichain/utils/utils.ts rename to apps/web/src/features/multichain/utils/utils.ts diff --git a/src/features/myAccounts/components/AccountInfoChips/index.tsx b/apps/web/src/features/myAccounts/components/AccountInfoChips/index.tsx similarity index 100% rename from src/features/myAccounts/components/AccountInfoChips/index.tsx rename to apps/web/src/features/myAccounts/components/AccountInfoChips/index.tsx diff --git a/src/features/myAccounts/components/AccountInfoChips/styles.module.css b/apps/web/src/features/myAccounts/components/AccountInfoChips/styles.module.css similarity index 100% rename from src/features/myAccounts/components/AccountInfoChips/styles.module.css rename to apps/web/src/features/myAccounts/components/AccountInfoChips/styles.module.css diff --git a/src/features/myAccounts/components/AccountItems/MultiAccountItem.tsx b/apps/web/src/features/myAccounts/components/AccountItems/MultiAccountItem.tsx similarity index 100% rename from src/features/myAccounts/components/AccountItems/MultiAccountItem.tsx rename to apps/web/src/features/myAccounts/components/AccountItems/MultiAccountItem.tsx diff --git a/src/features/myAccounts/components/AccountItems/SingleAccountItem.tsx b/apps/web/src/features/myAccounts/components/AccountItems/SingleAccountItem.tsx similarity index 100% rename from src/features/myAccounts/components/AccountItems/SingleAccountItem.tsx rename to apps/web/src/features/myAccounts/components/AccountItems/SingleAccountItem.tsx diff --git a/src/features/myAccounts/components/AccountItems/styles.module.css b/apps/web/src/features/myAccounts/components/AccountItems/styles.module.css similarity index 100% rename from src/features/myAccounts/components/AccountItems/styles.module.css rename to apps/web/src/features/myAccounts/components/AccountItems/styles.module.css diff --git a/src/features/myAccounts/components/AccountListFilters/index.tsx b/apps/web/src/features/myAccounts/components/AccountListFilters/index.tsx similarity index 100% rename from src/features/myAccounts/components/AccountListFilters/index.tsx rename to apps/web/src/features/myAccounts/components/AccountListFilters/index.tsx diff --git a/src/features/myAccounts/components/AccountsHeader/index.tsx b/apps/web/src/features/myAccounts/components/AccountsHeader/index.tsx similarity index 100% rename from src/features/myAccounts/components/AccountsHeader/index.tsx rename to apps/web/src/features/myAccounts/components/AccountsHeader/index.tsx diff --git a/src/features/myAccounts/components/AccountsList/index.test.tsx b/apps/web/src/features/myAccounts/components/AccountsList/index.test.tsx similarity index 100% rename from src/features/myAccounts/components/AccountsList/index.test.tsx rename to apps/web/src/features/myAccounts/components/AccountsList/index.test.tsx diff --git a/src/features/myAccounts/components/AccountsList/index.tsx b/apps/web/src/features/myAccounts/components/AccountsList/index.tsx similarity index 100% rename from src/features/myAccounts/components/AccountsList/index.tsx rename to apps/web/src/features/myAccounts/components/AccountsList/index.tsx diff --git a/src/features/myAccounts/components/AddNetworkButton/index.tsx b/apps/web/src/features/myAccounts/components/AddNetworkButton/index.tsx similarity index 100% rename from src/features/myAccounts/components/AddNetworkButton/index.tsx rename to apps/web/src/features/myAccounts/components/AddNetworkButton/index.tsx diff --git a/src/features/myAccounts/components/AllSafes/index.tsx b/apps/web/src/features/myAccounts/components/AllSafes/index.tsx similarity index 100% rename from src/features/myAccounts/components/AllSafes/index.tsx rename to apps/web/src/features/myAccounts/components/AllSafes/index.tsx diff --git a/src/features/myAccounts/components/CreateButton/index.tsx b/apps/web/src/features/myAccounts/components/CreateButton/index.tsx similarity index 100% rename from src/features/myAccounts/components/CreateButton/index.tsx rename to apps/web/src/features/myAccounts/components/CreateButton/index.tsx diff --git a/src/features/myAccounts/components/DataWidget/index.tsx b/apps/web/src/features/myAccounts/components/DataWidget/index.tsx similarity index 100% rename from src/features/myAccounts/components/DataWidget/index.tsx rename to apps/web/src/features/myAccounts/components/DataWidget/index.tsx diff --git a/src/features/myAccounts/components/DataWidget/styles.module.css b/apps/web/src/features/myAccounts/components/DataWidget/styles.module.css similarity index 100% rename from src/features/myAccounts/components/DataWidget/styles.module.css rename to apps/web/src/features/myAccounts/components/DataWidget/styles.module.css diff --git a/src/features/myAccounts/components/FilteredSafes/index.test.tsx b/apps/web/src/features/myAccounts/components/FilteredSafes/index.test.tsx similarity index 100% rename from src/features/myAccounts/components/FilteredSafes/index.test.tsx rename to apps/web/src/features/myAccounts/components/FilteredSafes/index.test.tsx diff --git a/src/features/myAccounts/components/FilteredSafes/index.tsx b/apps/web/src/features/myAccounts/components/FilteredSafes/index.tsx similarity index 100% rename from src/features/myAccounts/components/FilteredSafes/index.tsx rename to apps/web/src/features/myAccounts/components/FilteredSafes/index.tsx diff --git a/src/features/myAccounts/components/OrderByButton/index.tsx b/apps/web/src/features/myAccounts/components/OrderByButton/index.tsx similarity index 100% rename from src/features/myAccounts/components/OrderByButton/index.tsx rename to apps/web/src/features/myAccounts/components/OrderByButton/index.tsx diff --git a/src/features/myAccounts/components/PinnedSafes/index.test.tsx b/apps/web/src/features/myAccounts/components/PinnedSafes/index.test.tsx similarity index 100% rename from src/features/myAccounts/components/PinnedSafes/index.test.tsx rename to apps/web/src/features/myAccounts/components/PinnedSafes/index.test.tsx diff --git a/src/features/myAccounts/components/PinnedSafes/index.tsx b/apps/web/src/features/myAccounts/components/PinnedSafes/index.tsx similarity index 100% rename from src/features/myAccounts/components/PinnedSafes/index.tsx rename to apps/web/src/features/myAccounts/components/PinnedSafes/index.tsx diff --git a/src/features/myAccounts/components/QueueActions/index.tsx b/apps/web/src/features/myAccounts/components/QueueActions/index.tsx similarity index 100% rename from src/features/myAccounts/components/QueueActions/index.tsx rename to apps/web/src/features/myAccounts/components/QueueActions/index.tsx diff --git a/src/features/myAccounts/components/QueueActions/styles.module.css b/apps/web/src/features/myAccounts/components/QueueActions/styles.module.css similarity index 100% rename from src/features/myAccounts/components/QueueActions/styles.module.css rename to apps/web/src/features/myAccounts/components/QueueActions/styles.module.css diff --git a/src/features/myAccounts/components/SafesList/index.tsx b/apps/web/src/features/myAccounts/components/SafesList/index.tsx similarity index 100% rename from src/features/myAccounts/components/SafesList/index.tsx rename to apps/web/src/features/myAccounts/components/SafesList/index.tsx diff --git a/src/features/myAccounts/hooks/__tests__/useAllSafes.test.ts b/apps/web/src/features/myAccounts/hooks/__tests__/useAllSafes.test.ts similarity index 100% rename from src/features/myAccounts/hooks/__tests__/useAllSafes.test.ts rename to apps/web/src/features/myAccounts/hooks/__tests__/useAllSafes.test.ts diff --git a/src/features/myAccounts/hooks/__tests__/useAllSafesGrouped.ts b/apps/web/src/features/myAccounts/hooks/__tests__/useAllSafesGrouped.ts similarity index 100% rename from src/features/myAccounts/hooks/__tests__/useAllSafesGrouped.ts rename to apps/web/src/features/myAccounts/hooks/__tests__/useAllSafesGrouped.ts diff --git a/src/features/myAccounts/hooks/useAllOwnedSafes.ts b/apps/web/src/features/myAccounts/hooks/useAllOwnedSafes.ts similarity index 100% rename from src/features/myAccounts/hooks/useAllOwnedSafes.ts rename to apps/web/src/features/myAccounts/hooks/useAllOwnedSafes.ts diff --git a/src/features/myAccounts/hooks/useAllSafes.ts b/apps/web/src/features/myAccounts/hooks/useAllSafes.ts similarity index 100% rename from src/features/myAccounts/hooks/useAllSafes.ts rename to apps/web/src/features/myAccounts/hooks/useAllSafes.ts diff --git a/src/features/myAccounts/hooks/useAllSafesGrouped.ts b/apps/web/src/features/myAccounts/hooks/useAllSafesGrouped.ts similarity index 100% rename from src/features/myAccounts/hooks/useAllSafesGrouped.ts rename to apps/web/src/features/myAccounts/hooks/useAllSafesGrouped.ts diff --git a/src/features/myAccounts/hooks/useGetHref.ts b/apps/web/src/features/myAccounts/hooks/useGetHref.ts similarity index 100% rename from src/features/myAccounts/hooks/useGetHref.ts rename to apps/web/src/features/myAccounts/hooks/useGetHref.ts diff --git a/src/features/myAccounts/hooks/useHasSafes.ts b/apps/web/src/features/myAccounts/hooks/useHasSafes.ts similarity index 100% rename from src/features/myAccounts/hooks/useHasSafes.ts rename to apps/web/src/features/myAccounts/hooks/useHasSafes.ts diff --git a/src/features/myAccounts/hooks/useSafesSearch.ts b/apps/web/src/features/myAccounts/hooks/useSafesSearch.ts similarity index 100% rename from src/features/myAccounts/hooks/useSafesSearch.ts rename to apps/web/src/features/myAccounts/hooks/useSafesSearch.ts diff --git a/src/features/myAccounts/hooks/useTrackedSafesCount.ts b/apps/web/src/features/myAccounts/hooks/useTrackedSafesCount.ts similarity index 100% rename from src/features/myAccounts/hooks/useTrackedSafesCount.ts rename to apps/web/src/features/myAccounts/hooks/useTrackedSafesCount.ts diff --git a/src/features/myAccounts/hooks/useVisitedSafes.ts b/apps/web/src/features/myAccounts/hooks/useVisitedSafes.ts similarity index 100% rename from src/features/myAccounts/hooks/useVisitedSafes.ts rename to apps/web/src/features/myAccounts/hooks/useVisitedSafes.ts diff --git a/src/features/myAccounts/index.tsx b/apps/web/src/features/myAccounts/index.tsx similarity index 100% rename from src/features/myAccounts/index.tsx rename to apps/web/src/features/myAccounts/index.tsx diff --git a/src/features/myAccounts/styles.module.css b/apps/web/src/features/myAccounts/styles.module.css similarity index 100% rename from src/features/myAccounts/styles.module.css rename to apps/web/src/features/myAccounts/styles.module.css diff --git a/src/features/myAccounts/utils/utils.ts b/apps/web/src/features/myAccounts/utils/utils.ts similarity index 100% rename from src/features/myAccounts/utils/utils.ts rename to apps/web/src/features/myAccounts/utils/utils.ts diff --git a/src/features/proposers/components/DeleteProposerDialog.tsx b/apps/web/src/features/proposers/components/DeleteProposerDialog.tsx similarity index 100% rename from src/features/proposers/components/DeleteProposerDialog.tsx rename to apps/web/src/features/proposers/components/DeleteProposerDialog.tsx diff --git a/src/features/proposers/components/EditProposerDialog.tsx b/apps/web/src/features/proposers/components/EditProposerDialog.tsx similarity index 100% rename from src/features/proposers/components/EditProposerDialog.tsx rename to apps/web/src/features/proposers/components/EditProposerDialog.tsx diff --git a/src/features/proposers/components/TxProposalChip.tsx b/apps/web/src/features/proposers/components/TxProposalChip.tsx similarity index 100% rename from src/features/proposers/components/TxProposalChip.tsx rename to apps/web/src/features/proposers/components/TxProposalChip.tsx diff --git a/src/features/proposers/components/UpsertProposer.tsx b/apps/web/src/features/proposers/components/UpsertProposer.tsx similarity index 100% rename from src/features/proposers/components/UpsertProposer.tsx rename to apps/web/src/features/proposers/components/UpsertProposer.tsx diff --git a/src/features/proposers/utils/utils.ts b/apps/web/src/features/proposers/utils/utils.ts similarity index 100% rename from src/features/proposers/utils/utils.ts rename to apps/web/src/features/proposers/utils/utils.ts diff --git a/src/features/recovery/components/CancelRecoveryButton/index.tsx b/apps/web/src/features/recovery/components/CancelRecoveryButton/index.tsx similarity index 100% rename from src/features/recovery/components/CancelRecoveryButton/index.tsx rename to apps/web/src/features/recovery/components/CancelRecoveryButton/index.tsx diff --git a/src/features/recovery/components/ExecuteRecoveryButton/index.tsx b/apps/web/src/features/recovery/components/ExecuteRecoveryButton/index.tsx similarity index 100% rename from src/features/recovery/components/ExecuteRecoveryButton/index.tsx rename to apps/web/src/features/recovery/components/ExecuteRecoveryButton/index.tsx diff --git a/src/features/recovery/components/GroupedRecoveryListItems/index.tsx b/apps/web/src/features/recovery/components/GroupedRecoveryListItems/index.tsx similarity index 100% rename from src/features/recovery/components/GroupedRecoveryListItems/index.tsx rename to apps/web/src/features/recovery/components/GroupedRecoveryListItems/index.tsx diff --git a/src/features/recovery/components/GroupedRecoveryListItems/styles.module.css b/apps/web/src/features/recovery/components/GroupedRecoveryListItems/styles.module.css similarity index 100% rename from src/features/recovery/components/GroupedRecoveryListItems/styles.module.css rename to apps/web/src/features/recovery/components/GroupedRecoveryListItems/styles.module.css diff --git a/src/features/recovery/components/Recovery/LazyRecovery.tsx b/apps/web/src/features/recovery/components/Recovery/LazyRecovery.tsx similarity index 100% rename from src/features/recovery/components/Recovery/LazyRecovery.tsx rename to apps/web/src/features/recovery/components/Recovery/LazyRecovery.tsx diff --git a/src/features/recovery/components/Recovery/index.tsx b/apps/web/src/features/recovery/components/Recovery/index.tsx similarity index 100% rename from src/features/recovery/components/Recovery/index.tsx rename to apps/web/src/features/recovery/components/Recovery/index.tsx diff --git a/src/features/recovery/components/RecoveryCards/RecoveryInProgressCard.tsx b/apps/web/src/features/recovery/components/RecoveryCards/RecoveryInProgressCard.tsx similarity index 100% rename from src/features/recovery/components/RecoveryCards/RecoveryInProgressCard.tsx rename to apps/web/src/features/recovery/components/RecoveryCards/RecoveryInProgressCard.tsx diff --git a/src/features/recovery/components/RecoveryCards/RecoveryProposalCard.tsx b/apps/web/src/features/recovery/components/RecoveryCards/RecoveryProposalCard.tsx similarity index 100% rename from src/features/recovery/components/RecoveryCards/RecoveryProposalCard.tsx rename to apps/web/src/features/recovery/components/RecoveryCards/RecoveryProposalCard.tsx diff --git a/src/features/recovery/components/RecoveryCards/__tests__/RecoveryInProgressCard.test.tsx b/apps/web/src/features/recovery/components/RecoveryCards/__tests__/RecoveryInProgressCard.test.tsx similarity index 100% rename from src/features/recovery/components/RecoveryCards/__tests__/RecoveryInProgressCard.test.tsx rename to apps/web/src/features/recovery/components/RecoveryCards/__tests__/RecoveryInProgressCard.test.tsx diff --git a/src/features/recovery/components/RecoveryCards/__tests__/RecoveryProposalCard.test.tsx b/apps/web/src/features/recovery/components/RecoveryCards/__tests__/RecoveryProposalCard.test.tsx similarity index 100% rename from src/features/recovery/components/RecoveryCards/__tests__/RecoveryProposalCard.test.tsx rename to apps/web/src/features/recovery/components/RecoveryCards/__tests__/RecoveryProposalCard.test.tsx diff --git a/src/features/recovery/components/RecoveryCards/styles.module.css b/apps/web/src/features/recovery/components/RecoveryCards/styles.module.css similarity index 100% rename from src/features/recovery/components/RecoveryCards/styles.module.css rename to apps/web/src/features/recovery/components/RecoveryCards/styles.module.css diff --git a/src/features/recovery/components/RecoveryContext/RecoveryContextHooks.tsx b/apps/web/src/features/recovery/components/RecoveryContext/RecoveryContextHooks.tsx similarity index 100% rename from src/features/recovery/components/RecoveryContext/RecoveryContextHooks.tsx rename to apps/web/src/features/recovery/components/RecoveryContext/RecoveryContextHooks.tsx diff --git a/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryDelayModifiers.test.ts b/apps/web/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryDelayModifiers.test.ts similarity index 100% rename from src/features/recovery/components/RecoveryContext/__tests__/useRecoveryDelayModifiers.test.ts rename to apps/web/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryDelayModifiers.test.ts diff --git a/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryPendingTxs.test.ts b/apps/web/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryPendingTxs.test.ts similarity index 100% rename from src/features/recovery/components/RecoveryContext/__tests__/useRecoveryPendingTxs.test.ts rename to apps/web/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryPendingTxs.test.ts diff --git a/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryState.test.tsx b/apps/web/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryState.test.tsx similarity index 100% rename from src/features/recovery/components/RecoveryContext/__tests__/useRecoveryState.test.tsx rename to apps/web/src/features/recovery/components/RecoveryContext/__tests__/useRecoveryState.test.tsx diff --git a/src/features/recovery/components/RecoveryContext/__tests__/useRecoverySuccessEvents.test.ts b/apps/web/src/features/recovery/components/RecoveryContext/__tests__/useRecoverySuccessEvents.test.ts similarity index 100% rename from src/features/recovery/components/RecoveryContext/__tests__/useRecoverySuccessEvents.test.ts rename to apps/web/src/features/recovery/components/RecoveryContext/__tests__/useRecoverySuccessEvents.test.ts diff --git a/src/features/recovery/components/RecoveryContext/index.tsx b/apps/web/src/features/recovery/components/RecoveryContext/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryContext/index.tsx rename to apps/web/src/features/recovery/components/RecoveryContext/index.tsx diff --git a/src/features/recovery/components/RecoveryContext/useRecoveryDelayModifiers.ts b/apps/web/src/features/recovery/components/RecoveryContext/useRecoveryDelayModifiers.ts similarity index 100% rename from src/features/recovery/components/RecoveryContext/useRecoveryDelayModifiers.ts rename to apps/web/src/features/recovery/components/RecoveryContext/useRecoveryDelayModifiers.ts diff --git a/src/features/recovery/components/RecoveryContext/useRecoveryPendingTxs.ts b/apps/web/src/features/recovery/components/RecoveryContext/useRecoveryPendingTxs.ts similarity index 100% rename from src/features/recovery/components/RecoveryContext/useRecoveryPendingTxs.ts rename to apps/web/src/features/recovery/components/RecoveryContext/useRecoveryPendingTxs.ts diff --git a/src/features/recovery/components/RecoveryContext/useRecoveryState.ts b/apps/web/src/features/recovery/components/RecoveryContext/useRecoveryState.ts similarity index 100% rename from src/features/recovery/components/RecoveryContext/useRecoveryState.ts rename to apps/web/src/features/recovery/components/RecoveryContext/useRecoveryState.ts diff --git a/src/features/recovery/components/RecoveryContext/useRecoverySuccessEvents.ts b/apps/web/src/features/recovery/components/RecoveryContext/useRecoverySuccessEvents.ts similarity index 100% rename from src/features/recovery/components/RecoveryContext/useRecoverySuccessEvents.ts rename to apps/web/src/features/recovery/components/RecoveryContext/useRecoverySuccessEvents.ts diff --git a/src/features/recovery/components/RecoveryDescription/index.tsx b/apps/web/src/features/recovery/components/RecoveryDescription/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryDescription/index.tsx rename to apps/web/src/features/recovery/components/RecoveryDescription/index.tsx diff --git a/src/features/recovery/components/RecoveryDetails/index.tsx b/apps/web/src/features/recovery/components/RecoveryDetails/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryDetails/index.tsx rename to apps/web/src/features/recovery/components/RecoveryDetails/index.tsx diff --git a/src/features/recovery/components/RecoveryHeader/index.test.tsx b/apps/web/src/features/recovery/components/RecoveryHeader/index.test.tsx similarity index 100% rename from src/features/recovery/components/RecoveryHeader/index.test.tsx rename to apps/web/src/features/recovery/components/RecoveryHeader/index.test.tsx diff --git a/src/features/recovery/components/RecoveryHeader/index.tsx b/apps/web/src/features/recovery/components/RecoveryHeader/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryHeader/index.tsx rename to apps/web/src/features/recovery/components/RecoveryHeader/index.tsx diff --git a/src/features/recovery/components/RecoveryInfo/index.tsx b/apps/web/src/features/recovery/components/RecoveryInfo/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryInfo/index.tsx rename to apps/web/src/features/recovery/components/RecoveryInfo/index.tsx diff --git a/src/features/recovery/components/RecoveryList/LazyRecoveryList.tsx b/apps/web/src/features/recovery/components/RecoveryList/LazyRecoveryList.tsx similarity index 100% rename from src/features/recovery/components/RecoveryList/LazyRecoveryList.tsx rename to apps/web/src/features/recovery/components/RecoveryList/LazyRecoveryList.tsx diff --git a/src/features/recovery/components/RecoveryList/index.tsx b/apps/web/src/features/recovery/components/RecoveryList/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryList/index.tsx rename to apps/web/src/features/recovery/components/RecoveryList/index.tsx diff --git a/src/features/recovery/components/RecoveryListItem/RecoveryListItemContext.tsx b/apps/web/src/features/recovery/components/RecoveryListItem/RecoveryListItemContext.tsx similarity index 100% rename from src/features/recovery/components/RecoveryListItem/RecoveryListItemContext.tsx rename to apps/web/src/features/recovery/components/RecoveryListItem/RecoveryListItemContext.tsx diff --git a/src/features/recovery/components/RecoveryListItem/index.tsx b/apps/web/src/features/recovery/components/RecoveryListItem/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryListItem/index.tsx rename to apps/web/src/features/recovery/components/RecoveryListItem/index.tsx diff --git a/src/features/recovery/components/RecoveryModal/__snapshots__/index.test.tsx.snap b/apps/web/src/features/recovery/components/RecoveryModal/__snapshots__/index.test.tsx.snap similarity index 100% rename from src/features/recovery/components/RecoveryModal/__snapshots__/index.test.tsx.snap rename to apps/web/src/features/recovery/components/RecoveryModal/__snapshots__/index.test.tsx.snap diff --git a/src/features/recovery/components/RecoveryModal/index.test.tsx b/apps/web/src/features/recovery/components/RecoveryModal/index.test.tsx similarity index 100% rename from src/features/recovery/components/RecoveryModal/index.test.tsx rename to apps/web/src/features/recovery/components/RecoveryModal/index.test.tsx diff --git a/src/features/recovery/components/RecoveryModal/index.tsx b/apps/web/src/features/recovery/components/RecoveryModal/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryModal/index.tsx rename to apps/web/src/features/recovery/components/RecoveryModal/index.tsx diff --git a/src/features/recovery/components/RecoverySettings/ChooseRecoveryMethodModal.tsx b/apps/web/src/features/recovery/components/RecoverySettings/ChooseRecoveryMethodModal.tsx similarity index 100% rename from src/features/recovery/components/RecoverySettings/ChooseRecoveryMethodModal.tsx rename to apps/web/src/features/recovery/components/RecoverySettings/ChooseRecoveryMethodModal.tsx diff --git a/src/features/recovery/components/RecoverySettings/DelayModifierRow.tsx b/apps/web/src/features/recovery/components/RecoverySettings/DelayModifierRow.tsx similarity index 100% rename from src/features/recovery/components/RecoverySettings/DelayModifierRow.tsx rename to apps/web/src/features/recovery/components/RecoverySettings/DelayModifierRow.tsx diff --git a/src/features/recovery/components/RecoverySettings/ZkEmailFakeDoorModal.tsx b/apps/web/src/features/recovery/components/RecoverySettings/ZkEmailFakeDoorModal.tsx similarity index 100% rename from src/features/recovery/components/RecoverySettings/ZkEmailFakeDoorModal.tsx rename to apps/web/src/features/recovery/components/RecoverySettings/ZkEmailFakeDoorModal.tsx diff --git a/src/features/recovery/components/RecoverySettings/index.tsx b/apps/web/src/features/recovery/components/RecoverySettings/index.tsx similarity index 100% rename from src/features/recovery/components/RecoverySettings/index.tsx rename to apps/web/src/features/recovery/components/RecoverySettings/index.tsx diff --git a/src/features/recovery/components/RecoverySettings/styles.module.css b/apps/web/src/features/recovery/components/RecoverySettings/styles.module.css similarity index 100% rename from src/features/recovery/components/RecoverySettings/styles.module.css rename to apps/web/src/features/recovery/components/RecoverySettings/styles.module.css diff --git a/src/features/recovery/components/RecoverySigners/index.tsx b/apps/web/src/features/recovery/components/RecoverySigners/index.tsx similarity index 100% rename from src/features/recovery/components/RecoverySigners/index.tsx rename to apps/web/src/features/recovery/components/RecoverySigners/index.tsx diff --git a/src/features/recovery/components/RecoveryStatus/index.tsx b/apps/web/src/features/recovery/components/RecoveryStatus/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryStatus/index.tsx rename to apps/web/src/features/recovery/components/RecoveryStatus/index.tsx diff --git a/src/features/recovery/components/RecoverySummary/index.tsx b/apps/web/src/features/recovery/components/RecoverySummary/index.tsx similarity index 100% rename from src/features/recovery/components/RecoverySummary/index.tsx rename to apps/web/src/features/recovery/components/RecoverySummary/index.tsx diff --git a/src/features/recovery/components/RecoveryType/index.tsx b/apps/web/src/features/recovery/components/RecoveryType/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryType/index.tsx rename to apps/web/src/features/recovery/components/RecoveryType/index.tsx diff --git a/src/features/recovery/components/RecoveryValidationErrors/index.tsx b/apps/web/src/features/recovery/components/RecoveryValidationErrors/index.tsx similarity index 100% rename from src/features/recovery/components/RecoveryValidationErrors/index.tsx rename to apps/web/src/features/recovery/components/RecoveryValidationErrors/index.tsx diff --git a/src/features/recovery/hooks/__tests__/useIsValidExecution.test.ts b/apps/web/src/features/recovery/hooks/__tests__/useIsValidExecution.test.ts similarity index 100% rename from src/features/recovery/hooks/__tests__/useIsValidExecution.test.ts rename to apps/web/src/features/recovery/hooks/__tests__/useIsValidExecution.test.ts diff --git a/src/features/recovery/hooks/__tests__/useIsValidRecoveryExecution.test.ts b/apps/web/src/features/recovery/hooks/__tests__/useIsValidRecoveryExecution.test.ts similarity index 100% rename from src/features/recovery/hooks/__tests__/useIsValidRecoveryExecution.test.ts rename to apps/web/src/features/recovery/hooks/__tests__/useIsValidRecoveryExecution.test.ts diff --git a/src/features/recovery/hooks/__tests__/useRecoveryTxState.test.tsx b/apps/web/src/features/recovery/hooks/__tests__/useRecoveryTxState.test.tsx similarity index 100% rename from src/features/recovery/hooks/__tests__/useRecoveryTxState.test.tsx rename to apps/web/src/features/recovery/hooks/__tests__/useRecoveryTxState.test.tsx diff --git a/src/features/recovery/hooks/useIsRecoverer.ts b/apps/web/src/features/recovery/hooks/useIsRecoverer.ts similarity index 100% rename from src/features/recovery/hooks/useIsRecoverer.ts rename to apps/web/src/features/recovery/hooks/useIsRecoverer.ts diff --git a/src/features/recovery/hooks/useIsRecoveryEnabled.ts b/apps/web/src/features/recovery/hooks/useIsRecoveryEnabled.ts similarity index 100% rename from src/features/recovery/hooks/useIsRecoveryEnabled.ts rename to apps/web/src/features/recovery/hooks/useIsRecoveryEnabled.ts diff --git a/src/features/recovery/hooks/useIsRecoverySupported.ts b/apps/web/src/features/recovery/hooks/useIsRecoverySupported.ts similarity index 100% rename from src/features/recovery/hooks/useIsRecoverySupported.ts rename to apps/web/src/features/recovery/hooks/useIsRecoverySupported.ts diff --git a/src/features/recovery/hooks/useIsValidRecoveryExecution.ts b/apps/web/src/features/recovery/hooks/useIsValidRecoveryExecution.ts similarity index 100% rename from src/features/recovery/hooks/useIsValidRecoveryExecution.ts rename to apps/web/src/features/recovery/hooks/useIsValidRecoveryExecution.ts diff --git a/src/features/recovery/hooks/useRecovery.ts b/apps/web/src/features/recovery/hooks/useRecovery.ts similarity index 100% rename from src/features/recovery/hooks/useRecovery.ts rename to apps/web/src/features/recovery/hooks/useRecovery.ts diff --git a/src/features/recovery/hooks/useRecoveryQueue.ts b/apps/web/src/features/recovery/hooks/useRecoveryQueue.ts similarity index 100% rename from src/features/recovery/hooks/useRecoveryQueue.ts rename to apps/web/src/features/recovery/hooks/useRecoveryQueue.ts diff --git a/src/features/recovery/hooks/useRecoveryTxNotification.ts b/apps/web/src/features/recovery/hooks/useRecoveryTxNotification.ts similarity index 100% rename from src/features/recovery/hooks/useRecoveryTxNotification.ts rename to apps/web/src/features/recovery/hooks/useRecoveryTxNotification.ts diff --git a/src/features/recovery/hooks/useRecoveryTxState.ts b/apps/web/src/features/recovery/hooks/useRecoveryTxState.ts similarity index 100% rename from src/features/recovery/hooks/useRecoveryTxState.ts rename to apps/web/src/features/recovery/hooks/useRecoveryTxState.ts diff --git a/src/features/recovery/services/__tests__/delay-modifier.test.ts b/apps/web/src/features/recovery/services/__tests__/delay-modifier.test.ts similarity index 100% rename from src/features/recovery/services/__tests__/delay-modifier.test.ts rename to apps/web/src/features/recovery/services/__tests__/delay-modifier.test.ts diff --git a/src/features/recovery/services/__tests__/proxies.test.ts b/apps/web/src/features/recovery/services/__tests__/proxies.test.ts similarity index 100% rename from src/features/recovery/services/__tests__/proxies.test.ts rename to apps/web/src/features/recovery/services/__tests__/proxies.test.ts diff --git a/src/features/recovery/services/__tests__/recovery-state.test.ts b/apps/web/src/features/recovery/services/__tests__/recovery-state.test.ts similarity index 100% rename from src/features/recovery/services/__tests__/recovery-state.test.ts rename to apps/web/src/features/recovery/services/__tests__/recovery-state.test.ts diff --git a/src/features/recovery/services/__tests__/selectors.test.ts b/apps/web/src/features/recovery/services/__tests__/selectors.test.ts similarity index 100% rename from src/features/recovery/services/__tests__/selectors.test.ts rename to apps/web/src/features/recovery/services/__tests__/selectors.test.ts diff --git a/src/features/recovery/services/__tests__/setup.test.ts b/apps/web/src/features/recovery/services/__tests__/setup.test.ts similarity index 100% rename from src/features/recovery/services/__tests__/setup.test.ts rename to apps/web/src/features/recovery/services/__tests__/setup.test.ts diff --git a/src/features/recovery/services/__tests__/transaction-list.test.ts b/apps/web/src/features/recovery/services/__tests__/transaction-list.test.ts similarity index 100% rename from src/features/recovery/services/__tests__/transaction-list.test.ts rename to apps/web/src/features/recovery/services/__tests__/transaction-list.test.ts diff --git a/src/features/recovery/services/__tests__/transaction.test.ts b/apps/web/src/features/recovery/services/__tests__/transaction.test.ts similarity index 100% rename from src/features/recovery/services/__tests__/transaction.test.ts rename to apps/web/src/features/recovery/services/__tests__/transaction.test.ts diff --git a/src/features/recovery/services/delay-modifier.ts b/apps/web/src/features/recovery/services/delay-modifier.ts similarity index 100% rename from src/features/recovery/services/delay-modifier.ts rename to apps/web/src/features/recovery/services/delay-modifier.ts diff --git a/src/features/recovery/services/proxies.ts b/apps/web/src/features/recovery/services/proxies.ts similarity index 100% rename from src/features/recovery/services/proxies.ts rename to apps/web/src/features/recovery/services/proxies.ts diff --git a/src/features/recovery/services/recovery-sender.ts b/apps/web/src/features/recovery/services/recovery-sender.ts similarity index 100% rename from src/features/recovery/services/recovery-sender.ts rename to apps/web/src/features/recovery/services/recovery-sender.ts diff --git a/src/features/recovery/services/recovery-state.ts b/apps/web/src/features/recovery/services/recovery-state.ts similarity index 100% rename from src/features/recovery/services/recovery-state.ts rename to apps/web/src/features/recovery/services/recovery-state.ts diff --git a/src/features/recovery/services/recoveryEvents.ts b/apps/web/src/features/recovery/services/recoveryEvents.ts similarity index 100% rename from src/features/recovery/services/recoveryEvents.ts rename to apps/web/src/features/recovery/services/recoveryEvents.ts diff --git a/src/features/recovery/services/selectors.ts b/apps/web/src/features/recovery/services/selectors.ts similarity index 100% rename from src/features/recovery/services/selectors.ts rename to apps/web/src/features/recovery/services/selectors.ts diff --git a/src/features/recovery/services/setup.ts b/apps/web/src/features/recovery/services/setup.ts similarity index 100% rename from src/features/recovery/services/setup.ts rename to apps/web/src/features/recovery/services/setup.ts diff --git a/src/features/recovery/services/transaction-list.ts b/apps/web/src/features/recovery/services/transaction-list.ts similarity index 100% rename from src/features/recovery/services/transaction-list.ts rename to apps/web/src/features/recovery/services/transaction-list.ts diff --git a/src/features/recovery/services/transaction.ts b/apps/web/src/features/recovery/services/transaction.ts similarity index 100% rename from src/features/recovery/services/transaction.ts rename to apps/web/src/features/recovery/services/transaction.ts diff --git a/src/features/siweAccounts/components/EnableAccountBanner/index.stories.tsx b/apps/web/src/features/siweAccounts/components/EnableAccountBanner/index.stories.tsx similarity index 100% rename from src/features/siweAccounts/components/EnableAccountBanner/index.stories.tsx rename to apps/web/src/features/siweAccounts/components/EnableAccountBanner/index.stories.tsx diff --git a/src/features/siweAccounts/components/EnableAccountBanner/index.tsx b/apps/web/src/features/siweAccounts/components/EnableAccountBanner/index.tsx similarity index 100% rename from src/features/siweAccounts/components/EnableAccountBanner/index.tsx rename to apps/web/src/features/siweAccounts/components/EnableAccountBanner/index.tsx diff --git a/src/features/siweAccounts/components/EnableAccountBanner/style.module.css b/apps/web/src/features/siweAccounts/components/EnableAccountBanner/style.module.css similarity index 100% rename from src/features/siweAccounts/components/EnableAccountBanner/style.module.css rename to apps/web/src/features/siweAccounts/components/EnableAccountBanner/style.module.css diff --git a/src/features/speedup/components/SpeedUpModal.tsx b/apps/web/src/features/speedup/components/SpeedUpModal.tsx similarity index 100% rename from src/features/speedup/components/SpeedUpModal.tsx rename to apps/web/src/features/speedup/components/SpeedUpModal.tsx diff --git a/src/features/speedup/components/SpeedUpMonitor.tsx b/apps/web/src/features/speedup/components/SpeedUpMonitor.tsx similarity index 100% rename from src/features/speedup/components/SpeedUpMonitor.tsx rename to apps/web/src/features/speedup/components/SpeedUpMonitor.tsx diff --git a/src/features/speedup/hooks/useSafeTransaction.tsx b/apps/web/src/features/speedup/hooks/useSafeTransaction.tsx similarity index 100% rename from src/features/speedup/hooks/useSafeTransaction.tsx rename to apps/web/src/features/speedup/hooks/useSafeTransaction.tsx diff --git a/src/features/speedup/utils/IsSpeedableTx.tsx b/apps/web/src/features/speedup/utils/IsSpeedableTx.tsx similarity index 100% rename from src/features/speedup/utils/IsSpeedableTx.tsx rename to apps/web/src/features/speedup/utils/IsSpeedableTx.tsx diff --git a/src/features/speedup/utils/__tests__/IsSpeedableTx.test.ts b/apps/web/src/features/speedup/utils/__tests__/IsSpeedableTx.test.ts similarity index 100% rename from src/features/speedup/utils/__tests__/IsSpeedableTx.test.ts rename to apps/web/src/features/speedup/utils/__tests__/IsSpeedableTx.test.ts diff --git a/src/features/stake/components/InfoTooltip/index.tsx b/apps/web/src/features/stake/components/InfoTooltip/index.tsx similarity index 100% rename from src/features/stake/components/InfoTooltip/index.tsx rename to apps/web/src/features/stake/components/InfoTooltip/index.tsx diff --git a/src/features/stake/components/StakeButton/index.tsx b/apps/web/src/features/stake/components/StakeButton/index.tsx similarity index 100% rename from src/features/stake/components/StakeButton/index.tsx rename to apps/web/src/features/stake/components/StakeButton/index.tsx diff --git a/src/features/stake/components/StakePage/index.tsx b/apps/web/src/features/stake/components/StakePage/index.tsx similarity index 100% rename from src/features/stake/components/StakePage/index.tsx rename to apps/web/src/features/stake/components/StakePage/index.tsx diff --git a/src/features/stake/components/StakingConfirmationTx/Deposit.tsx b/apps/web/src/features/stake/components/StakingConfirmationTx/Deposit.tsx similarity index 100% rename from src/features/stake/components/StakingConfirmationTx/Deposit.tsx rename to apps/web/src/features/stake/components/StakingConfirmationTx/Deposit.tsx diff --git a/src/features/stake/components/StakingConfirmationTx/Exit.tsx b/apps/web/src/features/stake/components/StakingConfirmationTx/Exit.tsx similarity index 100% rename from src/features/stake/components/StakingConfirmationTx/Exit.tsx rename to apps/web/src/features/stake/components/StakingConfirmationTx/Exit.tsx diff --git a/src/features/stake/components/StakingConfirmationTx/Withdraw.tsx b/apps/web/src/features/stake/components/StakingConfirmationTx/Withdraw.tsx similarity index 100% rename from src/features/stake/components/StakingConfirmationTx/Withdraw.tsx rename to apps/web/src/features/stake/components/StakingConfirmationTx/Withdraw.tsx diff --git a/src/features/stake/components/StakingConfirmationTx/index.tsx b/apps/web/src/features/stake/components/StakingConfirmationTx/index.tsx similarity index 100% rename from src/features/stake/components/StakingConfirmationTx/index.tsx rename to apps/web/src/features/stake/components/StakingConfirmationTx/index.tsx diff --git a/src/features/stake/components/StakingStatus/index.tsx b/apps/web/src/features/stake/components/StakingStatus/index.tsx similarity index 100% rename from src/features/stake/components/StakingStatus/index.tsx rename to apps/web/src/features/stake/components/StakingStatus/index.tsx diff --git a/src/features/stake/components/StakingTxDepositDetails/index.tsx b/apps/web/src/features/stake/components/StakingTxDepositDetails/index.tsx similarity index 100% rename from src/features/stake/components/StakingTxDepositDetails/index.tsx rename to apps/web/src/features/stake/components/StakingTxDepositDetails/index.tsx diff --git a/src/features/stake/components/StakingTxDepositInfo/index.tsx b/apps/web/src/features/stake/components/StakingTxDepositInfo/index.tsx similarity index 100% rename from src/features/stake/components/StakingTxDepositInfo/index.tsx rename to apps/web/src/features/stake/components/StakingTxDepositInfo/index.tsx diff --git a/src/features/stake/components/StakingTxExitDetails/index.tsx b/apps/web/src/features/stake/components/StakingTxExitDetails/index.tsx similarity index 100% rename from src/features/stake/components/StakingTxExitDetails/index.tsx rename to apps/web/src/features/stake/components/StakingTxExitDetails/index.tsx diff --git a/src/features/stake/components/StakingTxExitInfo/index.tsx b/apps/web/src/features/stake/components/StakingTxExitInfo/index.tsx similarity index 100% rename from src/features/stake/components/StakingTxExitInfo/index.tsx rename to apps/web/src/features/stake/components/StakingTxExitInfo/index.tsx diff --git a/src/features/stake/components/StakingTxWithdrawDetails/index.tsx b/apps/web/src/features/stake/components/StakingTxWithdrawDetails/index.tsx similarity index 100% rename from src/features/stake/components/StakingTxWithdrawDetails/index.tsx rename to apps/web/src/features/stake/components/StakingTxWithdrawDetails/index.tsx diff --git a/src/features/stake/components/StakingTxWithdrawInfo/index.tsx b/apps/web/src/features/stake/components/StakingTxWithdrawInfo/index.tsx similarity index 100% rename from src/features/stake/components/StakingTxWithdrawInfo/index.tsx rename to apps/web/src/features/stake/components/StakingTxWithdrawInfo/index.tsx diff --git a/src/features/stake/components/StakingWidget/index.tsx b/apps/web/src/features/stake/components/StakingWidget/index.tsx similarity index 100% rename from src/features/stake/components/StakingWidget/index.tsx rename to apps/web/src/features/stake/components/StakingWidget/index.tsx diff --git a/src/features/stake/constants.ts b/apps/web/src/features/stake/constants.ts similarity index 100% rename from src/features/stake/constants.ts rename to apps/web/src/features/stake/constants.ts diff --git a/src/features/stake/helpers/utils.ts b/apps/web/src/features/stake/helpers/utils.ts similarity index 100% rename from src/features/stake/helpers/utils.ts rename to apps/web/src/features/stake/helpers/utils.ts diff --git a/src/features/stake/hooks/useGetStakeWidgetUrl.ts b/apps/web/src/features/stake/hooks/useGetStakeWidgetUrl.ts similarity index 100% rename from src/features/stake/hooks/useGetStakeWidgetUrl.ts rename to apps/web/src/features/stake/hooks/useGetStakeWidgetUrl.ts diff --git a/src/features/stake/hooks/useIsStakingBannerEnabled.ts b/apps/web/src/features/stake/hooks/useIsStakingBannerEnabled.ts similarity index 100% rename from src/features/stake/hooks/useIsStakingBannerEnabled.ts rename to apps/web/src/features/stake/hooks/useIsStakingBannerEnabled.ts diff --git a/src/features/stake/hooks/useIsSwapFeatureEnabled.ts b/apps/web/src/features/stake/hooks/useIsSwapFeatureEnabled.ts similarity index 100% rename from src/features/stake/hooks/useIsSwapFeatureEnabled.ts rename to apps/web/src/features/stake/hooks/useIsSwapFeatureEnabled.ts diff --git a/src/features/stake/useStakeConsent.ts b/apps/web/src/features/stake/useStakeConsent.ts similarity index 100% rename from src/features/stake/useStakeConsent.ts rename to apps/web/src/features/stake/useStakeConsent.ts diff --git a/src/features/swap/components/HelpIconTooltip/index.tsx b/apps/web/src/features/swap/components/HelpIconTooltip/index.tsx similarity index 100% rename from src/features/swap/components/HelpIconTooltip/index.tsx rename to apps/web/src/features/swap/components/HelpIconTooltip/index.tsx diff --git a/src/features/swap/components/OrderId/index.stories.tsx b/apps/web/src/features/swap/components/OrderId/index.stories.tsx similarity index 100% rename from src/features/swap/components/OrderId/index.stories.tsx rename to apps/web/src/features/swap/components/OrderId/index.stories.tsx diff --git a/src/features/swap/components/OrderId/index.tsx b/apps/web/src/features/swap/components/OrderId/index.tsx similarity index 100% rename from src/features/swap/components/OrderId/index.tsx rename to apps/web/src/features/swap/components/OrderId/index.tsx diff --git a/src/features/swap/components/StatusLabel/index.stories.tsx b/apps/web/src/features/swap/components/StatusLabel/index.stories.tsx similarity index 100% rename from src/features/swap/components/StatusLabel/index.stories.tsx rename to apps/web/src/features/swap/components/StatusLabel/index.stories.tsx diff --git a/src/features/swap/components/StatusLabel/index.tsx b/apps/web/src/features/swap/components/StatusLabel/index.tsx similarity index 100% rename from src/features/swap/components/StatusLabel/index.tsx rename to apps/web/src/features/swap/components/StatusLabel/index.tsx diff --git a/src/features/swap/components/SwapButton/index.tsx b/apps/web/src/features/swap/components/SwapButton/index.tsx similarity index 100% rename from src/features/swap/components/SwapButton/index.tsx rename to apps/web/src/features/swap/components/SwapButton/index.tsx diff --git a/src/features/swap/components/SwapOrder/index.tsx b/apps/web/src/features/swap/components/SwapOrder/index.tsx similarity index 100% rename from src/features/swap/components/SwapOrder/index.tsx rename to apps/web/src/features/swap/components/SwapOrder/index.tsx diff --git a/src/features/swap/components/SwapOrder/rows/PartBuyAmount.tsx b/apps/web/src/features/swap/components/SwapOrder/rows/PartBuyAmount.tsx similarity index 100% rename from src/features/swap/components/SwapOrder/rows/PartBuyAmount.tsx rename to apps/web/src/features/swap/components/SwapOrder/rows/PartBuyAmount.tsx diff --git a/src/features/swap/components/SwapOrder/rows/PartDuration.tsx b/apps/web/src/features/swap/components/SwapOrder/rows/PartDuration.tsx similarity index 100% rename from src/features/swap/components/SwapOrder/rows/PartDuration.tsx rename to apps/web/src/features/swap/components/SwapOrder/rows/PartDuration.tsx diff --git a/src/features/swap/components/SwapOrder/rows/PartSellAmount.tsx b/apps/web/src/features/swap/components/SwapOrder/rows/PartSellAmount.tsx similarity index 100% rename from src/features/swap/components/SwapOrder/rows/PartSellAmount.tsx rename to apps/web/src/features/swap/components/SwapOrder/rows/PartSellAmount.tsx diff --git a/src/features/swap/components/SwapOrder/rows/SurplusFee.tsx b/apps/web/src/features/swap/components/SwapOrder/rows/SurplusFee.tsx similarity index 100% rename from src/features/swap/components/SwapOrder/rows/SurplusFee.tsx rename to apps/web/src/features/swap/components/SwapOrder/rows/SurplusFee.tsx diff --git a/src/features/swap/components/SwapOrder/styles.module.css b/apps/web/src/features/swap/components/SwapOrder/styles.module.css similarity index 100% rename from src/features/swap/components/SwapOrder/styles.module.css rename to apps/web/src/features/swap/components/SwapOrder/styles.module.css diff --git a/src/features/swap/components/SwapOrder/swap.stories.tsx b/apps/web/src/features/swap/components/SwapOrder/swap.stories.tsx similarity index 100% rename from src/features/swap/components/SwapOrder/swap.stories.tsx rename to apps/web/src/features/swap/components/SwapOrder/swap.stories.tsx diff --git a/src/features/swap/components/SwapOrder/twap.stories.tsx b/apps/web/src/features/swap/components/SwapOrder/twap.stories.tsx similarity index 100% rename from src/features/swap/components/SwapOrder/twap.stories.tsx rename to apps/web/src/features/swap/components/SwapOrder/twap.stories.tsx diff --git a/src/features/swap/components/SwapOrderConfirmationView/OrderFeeConfirmationView.tsx b/apps/web/src/features/swap/components/SwapOrderConfirmationView/OrderFeeConfirmationView.tsx similarity index 100% rename from src/features/swap/components/SwapOrderConfirmationView/OrderFeeConfirmationView.tsx rename to apps/web/src/features/swap/components/SwapOrderConfirmationView/OrderFeeConfirmationView.tsx diff --git a/src/features/swap/components/SwapOrderConfirmationView/index.stories.tsx b/apps/web/src/features/swap/components/SwapOrderConfirmationView/index.stories.tsx similarity index 100% rename from src/features/swap/components/SwapOrderConfirmationView/index.stories.tsx rename to apps/web/src/features/swap/components/SwapOrderConfirmationView/index.stories.tsx diff --git a/src/features/swap/components/SwapOrderConfirmationView/index.tsx b/apps/web/src/features/swap/components/SwapOrderConfirmationView/index.tsx similarity index 100% rename from src/features/swap/components/SwapOrderConfirmationView/index.tsx rename to apps/web/src/features/swap/components/SwapOrderConfirmationView/index.tsx diff --git a/src/features/swap/components/SwapOrderConfirmationView/styles.module.css b/apps/web/src/features/swap/components/SwapOrderConfirmationView/styles.module.css similarity index 100% rename from src/features/swap/components/SwapOrderConfirmationView/styles.module.css rename to apps/web/src/features/swap/components/SwapOrderConfirmationView/styles.module.css diff --git a/src/features/swap/components/SwapProgress/index.stories.tsx b/apps/web/src/features/swap/components/SwapProgress/index.stories.tsx similarity index 100% rename from src/features/swap/components/SwapProgress/index.stories.tsx rename to apps/web/src/features/swap/components/SwapProgress/index.stories.tsx diff --git a/src/features/swap/components/SwapProgress/index.tsx b/apps/web/src/features/swap/components/SwapProgress/index.tsx similarity index 100% rename from src/features/swap/components/SwapProgress/index.tsx rename to apps/web/src/features/swap/components/SwapProgress/index.tsx diff --git a/src/features/swap/components/SwapTokens/index.stories.tsx b/apps/web/src/features/swap/components/SwapTokens/index.stories.tsx similarity index 100% rename from src/features/swap/components/SwapTokens/index.stories.tsx rename to apps/web/src/features/swap/components/SwapTokens/index.stories.tsx diff --git a/src/features/swap/components/SwapTokens/index.tsx b/apps/web/src/features/swap/components/SwapTokens/index.tsx similarity index 100% rename from src/features/swap/components/SwapTokens/index.tsx rename to apps/web/src/features/swap/components/SwapTokens/index.tsx diff --git a/src/features/swap/components/SwapTxInfo/SwapTx.tsx b/apps/web/src/features/swap/components/SwapTxInfo/SwapTx.tsx similarity index 100% rename from src/features/swap/components/SwapTxInfo/SwapTx.tsx rename to apps/web/src/features/swap/components/SwapTxInfo/SwapTx.tsx diff --git a/src/features/swap/components/TwapFallbackHandlerWarning/index.tsx b/apps/web/src/features/swap/components/TwapFallbackHandlerWarning/index.tsx similarity index 100% rename from src/features/swap/components/TwapFallbackHandlerWarning/index.tsx rename to apps/web/src/features/swap/components/TwapFallbackHandlerWarning/index.tsx diff --git a/src/features/swap/constants.ts b/apps/web/src/features/swap/constants.ts similarity index 100% rename from src/features/swap/constants.ts rename to apps/web/src/features/swap/constants.ts diff --git a/src/features/swap/helpers/__tests__/fee.test.ts b/apps/web/src/features/swap/helpers/__tests__/fee.test.ts similarity index 100% rename from src/features/swap/helpers/__tests__/fee.test.ts rename to apps/web/src/features/swap/helpers/__tests__/fee.test.ts diff --git a/src/features/swap/helpers/__tests__/utils.test.ts b/apps/web/src/features/swap/helpers/__tests__/utils.test.ts similarity index 100% rename from src/features/swap/helpers/__tests__/utils.test.ts rename to apps/web/src/features/swap/helpers/__tests__/utils.test.ts diff --git a/src/features/swap/helpers/data/stablecoins.ts b/apps/web/src/features/swap/helpers/data/stablecoins.ts similarity index 100% rename from src/features/swap/helpers/data/stablecoins.ts rename to apps/web/src/features/swap/helpers/data/stablecoins.ts diff --git a/src/features/swap/helpers/fee.ts b/apps/web/src/features/swap/helpers/fee.ts similarity index 100% rename from src/features/swap/helpers/fee.ts rename to apps/web/src/features/swap/helpers/fee.ts diff --git a/src/features/swap/helpers/swapOrderBuilder.ts b/apps/web/src/features/swap/helpers/swapOrderBuilder.ts similarity index 100% rename from src/features/swap/helpers/swapOrderBuilder.ts rename to apps/web/src/features/swap/helpers/swapOrderBuilder.ts diff --git a/src/features/swap/helpers/utils.ts b/apps/web/src/features/swap/helpers/utils.ts similarity index 100% rename from src/features/swap/helpers/utils.ts rename to apps/web/src/features/swap/helpers/utils.ts diff --git a/src/features/swap/hooks/__tests__/useIsExpiredSwap.test.ts b/apps/web/src/features/swap/hooks/__tests__/useIsExpiredSwap.test.ts similarity index 100% rename from src/features/swap/hooks/__tests__/useIsExpiredSwap.test.ts rename to apps/web/src/features/swap/hooks/__tests__/useIsExpiredSwap.test.ts diff --git a/src/features/swap/hooks/useIsExpiredSwap.ts b/apps/web/src/features/swap/hooks/useIsExpiredSwap.ts similarity index 100% rename from src/features/swap/hooks/useIsExpiredSwap.ts rename to apps/web/src/features/swap/hooks/useIsExpiredSwap.ts diff --git a/src/features/swap/hooks/useIsSwapFeatureEnabled.ts b/apps/web/src/features/swap/hooks/useIsSwapFeatureEnabled.ts similarity index 100% rename from src/features/swap/hooks/useIsSwapFeatureEnabled.ts rename to apps/web/src/features/swap/hooks/useIsSwapFeatureEnabled.ts diff --git a/src/features/swap/index.tsx b/apps/web/src/features/swap/index.tsx similarity index 100% rename from src/features/swap/index.tsx rename to apps/web/src/features/swap/index.tsx diff --git a/src/features/swap/store/swapParamsSlice.ts b/apps/web/src/features/swap/store/swapParamsSlice.ts similarity index 100% rename from src/features/swap/store/swapParamsSlice.ts rename to apps/web/src/features/swap/store/swapParamsSlice.ts diff --git a/src/features/swap/styles.module.css b/apps/web/src/features/swap/styles.module.css similarity index 100% rename from src/features/swap/styles.module.css rename to apps/web/src/features/swap/styles.module.css diff --git a/src/features/swap/types.ts b/apps/web/src/features/swap/types.ts similarity index 100% rename from src/features/swap/types.ts rename to apps/web/src/features/swap/types.ts diff --git a/src/features/swap/useSwapConsent.ts b/apps/web/src/features/swap/useSwapConsent.ts similarity index 100% rename from src/features/swap/useSwapConsent.ts rename to apps/web/src/features/swap/useSwapConsent.ts diff --git a/src/features/targetedOutreach/components/OutreachPopup/OutreachPopup.tsx b/apps/web/src/features/targetedOutreach/components/OutreachPopup/OutreachPopup.tsx similarity index 100% rename from src/features/targetedOutreach/components/OutreachPopup/OutreachPopup.tsx rename to apps/web/src/features/targetedOutreach/components/OutreachPopup/OutreachPopup.tsx diff --git a/src/features/targetedOutreach/components/OutreachPopup/index.tsx b/apps/web/src/features/targetedOutreach/components/OutreachPopup/index.tsx similarity index 100% rename from src/features/targetedOutreach/components/OutreachPopup/index.tsx rename to apps/web/src/features/targetedOutreach/components/OutreachPopup/index.tsx diff --git a/src/features/targetedOutreach/components/OutreachPopup/styles.module.css b/apps/web/src/features/targetedOutreach/components/OutreachPopup/styles.module.css similarity index 100% rename from src/features/targetedOutreach/components/OutreachPopup/styles.module.css rename to apps/web/src/features/targetedOutreach/components/OutreachPopup/styles.module.css diff --git a/src/features/targetedOutreach/constants.ts b/apps/web/src/features/targetedOutreach/constants.ts similarity index 100% rename from src/features/targetedOutreach/constants.ts rename to apps/web/src/features/targetedOutreach/constants.ts diff --git a/src/features/targetedOutreach/hooks/__tests__/useShowOutreachPopup.test.ts b/apps/web/src/features/targetedOutreach/hooks/__tests__/useShowOutreachPopup.test.ts similarity index 100% rename from src/features/targetedOutreach/hooks/__tests__/useShowOutreachPopup.test.ts rename to apps/web/src/features/targetedOutreach/hooks/__tests__/useShowOutreachPopup.test.ts diff --git a/src/features/targetedOutreach/hooks/useShowOutreachPopup.tsx b/apps/web/src/features/targetedOutreach/hooks/useShowOutreachPopup.tsx similarity index 100% rename from src/features/targetedOutreach/hooks/useShowOutreachPopup.tsx rename to apps/web/src/features/targetedOutreach/hooks/useShowOutreachPopup.tsx diff --git a/src/features/walletconnect/WalletConnectContext.tsx b/apps/web/src/features/walletconnect/WalletConnectContext.tsx similarity index 100% rename from src/features/walletconnect/WalletConnectContext.tsx rename to apps/web/src/features/walletconnect/WalletConnectContext.tsx diff --git a/src/features/walletconnect/__tests__/WalletConnectContext.test.tsx b/apps/web/src/features/walletconnect/__tests__/WalletConnectContext.test.tsx similarity index 100% rename from src/features/walletconnect/__tests__/WalletConnectContext.test.tsx rename to apps/web/src/features/walletconnect/__tests__/WalletConnectContext.test.tsx diff --git a/src/features/walletconnect/components/WalletConnectProvider/index.tsx b/apps/web/src/features/walletconnect/components/WalletConnectProvider/index.tsx similarity index 100% rename from src/features/walletconnect/components/WalletConnectProvider/index.tsx rename to apps/web/src/features/walletconnect/components/WalletConnectProvider/index.tsx diff --git a/src/features/walletconnect/components/WalletConnectUi/index.tsx b/apps/web/src/features/walletconnect/components/WalletConnectUi/index.tsx similarity index 100% rename from src/features/walletconnect/components/WalletConnectUi/index.tsx rename to apps/web/src/features/walletconnect/components/WalletConnectUi/index.tsx diff --git a/src/features/walletconnect/components/WcConnectionForm/index.tsx b/apps/web/src/features/walletconnect/components/WcConnectionForm/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcConnectionForm/index.tsx rename to apps/web/src/features/walletconnect/components/WcConnectionForm/index.tsx diff --git a/src/features/walletconnect/components/WcConnectionForm/styles.module.css b/apps/web/src/features/walletconnect/components/WcConnectionForm/styles.module.css similarity index 100% rename from src/features/walletconnect/components/WcConnectionForm/styles.module.css rename to apps/web/src/features/walletconnect/components/WcConnectionForm/styles.module.css diff --git a/src/features/walletconnect/components/WcConnectionState/index.tsx b/apps/web/src/features/walletconnect/components/WcConnectionState/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcConnectionState/index.tsx rename to apps/web/src/features/walletconnect/components/WcConnectionState/index.tsx diff --git a/src/features/walletconnect/components/WcConnectionState/styles.module.css b/apps/web/src/features/walletconnect/components/WcConnectionState/styles.module.css similarity index 100% rename from src/features/walletconnect/components/WcConnectionState/styles.module.css rename to apps/web/src/features/walletconnect/components/WcConnectionState/styles.module.css diff --git a/src/features/walletconnect/components/WcErrorMessage/index.tsx b/apps/web/src/features/walletconnect/components/WcErrorMessage/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcErrorMessage/index.tsx rename to apps/web/src/features/walletconnect/components/WcErrorMessage/index.tsx diff --git a/src/features/walletconnect/components/WcErrorMessage/styles.module.css b/apps/web/src/features/walletconnect/components/WcErrorMessage/styles.module.css similarity index 100% rename from src/features/walletconnect/components/WcErrorMessage/styles.module.css rename to apps/web/src/features/walletconnect/components/WcErrorMessage/styles.module.css diff --git a/src/features/walletconnect/components/WcHeaderWidget/WcIcon.tsx b/apps/web/src/features/walletconnect/components/WcHeaderWidget/WcIcon.tsx similarity index 100% rename from src/features/walletconnect/components/WcHeaderWidget/WcIcon.tsx rename to apps/web/src/features/walletconnect/components/WcHeaderWidget/WcIcon.tsx diff --git a/src/features/walletconnect/components/WcHeaderWidget/index.tsx b/apps/web/src/features/walletconnect/components/WcHeaderWidget/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcHeaderWidget/index.tsx rename to apps/web/src/features/walletconnect/components/WcHeaderWidget/index.tsx diff --git a/src/features/walletconnect/components/WcHints/index.tsx b/apps/web/src/features/walletconnect/components/WcHints/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcHints/index.tsx rename to apps/web/src/features/walletconnect/components/WcHints/index.tsx diff --git a/src/features/walletconnect/components/WcHints/styles.module.css b/apps/web/src/features/walletconnect/components/WcHints/styles.module.css similarity index 100% rename from src/features/walletconnect/components/WcHints/styles.module.css rename to apps/web/src/features/walletconnect/components/WcHints/styles.module.css diff --git a/src/features/walletconnect/components/WcInput/index.tsx b/apps/web/src/features/walletconnect/components/WcInput/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcInput/index.tsx rename to apps/web/src/features/walletconnect/components/WcInput/index.tsx diff --git a/src/features/walletconnect/components/WcLogoHeader/index.tsx b/apps/web/src/features/walletconnect/components/WcLogoHeader/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcLogoHeader/index.tsx rename to apps/web/src/features/walletconnect/components/WcLogoHeader/index.tsx diff --git a/src/features/walletconnect/components/WcLogoHeader/styles.module.css b/apps/web/src/features/walletconnect/components/WcLogoHeader/styles.module.css similarity index 100% rename from src/features/walletconnect/components/WcLogoHeader/styles.module.css rename to apps/web/src/features/walletconnect/components/WcLogoHeader/styles.module.css diff --git a/src/features/walletconnect/components/WcProposalForm/CompatibilityWarning.tsx b/apps/web/src/features/walletconnect/components/WcProposalForm/CompatibilityWarning.tsx similarity index 100% rename from src/features/walletconnect/components/WcProposalForm/CompatibilityWarning.tsx rename to apps/web/src/features/walletconnect/components/WcProposalForm/CompatibilityWarning.tsx diff --git a/src/features/walletconnect/components/WcProposalForm/ProposalVerification.tsx b/apps/web/src/features/walletconnect/components/WcProposalForm/ProposalVerification.tsx similarity index 100% rename from src/features/walletconnect/components/WcProposalForm/ProposalVerification.tsx rename to apps/web/src/features/walletconnect/components/WcProposalForm/ProposalVerification.tsx diff --git a/src/features/walletconnect/components/WcProposalForm/__tests__/useCompatibilityWarning.test.ts b/apps/web/src/features/walletconnect/components/WcProposalForm/__tests__/useCompatibilityWarning.test.ts similarity index 100% rename from src/features/walletconnect/components/WcProposalForm/__tests__/useCompatibilityWarning.test.ts rename to apps/web/src/features/walletconnect/components/WcProposalForm/__tests__/useCompatibilityWarning.test.ts diff --git a/src/features/walletconnect/components/WcProposalForm/index.tsx b/apps/web/src/features/walletconnect/components/WcProposalForm/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcProposalForm/index.tsx rename to apps/web/src/features/walletconnect/components/WcProposalForm/index.tsx diff --git a/src/features/walletconnect/components/WcProposalForm/styles.module.css b/apps/web/src/features/walletconnect/components/WcProposalForm/styles.module.css similarity index 100% rename from src/features/walletconnect/components/WcProposalForm/styles.module.css rename to apps/web/src/features/walletconnect/components/WcProposalForm/styles.module.css diff --git a/src/features/walletconnect/components/WcProposalForm/useCompatibilityWarning.ts b/apps/web/src/features/walletconnect/components/WcProposalForm/useCompatibilityWarning.ts similarity index 100% rename from src/features/walletconnect/components/WcProposalForm/useCompatibilityWarning.ts rename to apps/web/src/features/walletconnect/components/WcProposalForm/useCompatibilityWarning.ts diff --git a/src/features/walletconnect/components/WcSessionList/WcNoSessions.tsx b/apps/web/src/features/walletconnect/components/WcSessionList/WcNoSessions.tsx similarity index 100% rename from src/features/walletconnect/components/WcSessionList/WcNoSessions.tsx rename to apps/web/src/features/walletconnect/components/WcSessionList/WcNoSessions.tsx diff --git a/src/features/walletconnect/components/WcSessionList/index.tsx b/apps/web/src/features/walletconnect/components/WcSessionList/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcSessionList/index.tsx rename to apps/web/src/features/walletconnect/components/WcSessionList/index.tsx diff --git a/src/features/walletconnect/components/WcSessionList/styles.module.css b/apps/web/src/features/walletconnect/components/WcSessionList/styles.module.css similarity index 100% rename from src/features/walletconnect/components/WcSessionList/styles.module.css rename to apps/web/src/features/walletconnect/components/WcSessionList/styles.module.css diff --git a/src/features/walletconnect/components/WcSessionManager/index.tsx b/apps/web/src/features/walletconnect/components/WcSessionManager/index.tsx similarity index 100% rename from src/features/walletconnect/components/WcSessionManager/index.tsx rename to apps/web/src/features/walletconnect/components/WcSessionManager/index.tsx diff --git a/src/features/walletconnect/components/index.tsx b/apps/web/src/features/walletconnect/components/index.tsx similarity index 100% rename from src/features/walletconnect/components/index.tsx rename to apps/web/src/features/walletconnect/components/index.tsx diff --git a/src/features/walletconnect/constants.ts b/apps/web/src/features/walletconnect/constants.ts similarity index 100% rename from src/features/walletconnect/constants.ts rename to apps/web/src/features/walletconnect/constants.ts diff --git a/src/features/walletconnect/hooks/__tests__/useWalletConnectSearchParamUri.test.ts b/apps/web/src/features/walletconnect/hooks/__tests__/useWalletConnectSearchParamUri.test.ts similarity index 100% rename from src/features/walletconnect/hooks/__tests__/useWalletConnectSearchParamUri.test.ts rename to apps/web/src/features/walletconnect/hooks/__tests__/useWalletConnectSearchParamUri.test.ts diff --git a/src/features/walletconnect/hooks/__tests__/useWalletConnectSessions.test.tsx b/apps/web/src/features/walletconnect/hooks/__tests__/useWalletConnectSessions.test.tsx similarity index 100% rename from src/features/walletconnect/hooks/__tests__/useWalletConnectSessions.test.tsx rename to apps/web/src/features/walletconnect/hooks/__tests__/useWalletConnectSessions.test.tsx diff --git a/src/features/walletconnect/hooks/useWalletConnectClipboardUri.ts b/apps/web/src/features/walletconnect/hooks/useWalletConnectClipboardUri.ts similarity index 100% rename from src/features/walletconnect/hooks/useWalletConnectClipboardUri.ts rename to apps/web/src/features/walletconnect/hooks/useWalletConnectClipboardUri.ts diff --git a/src/features/walletconnect/hooks/useWalletConnectSearchParamUri.ts b/apps/web/src/features/walletconnect/hooks/useWalletConnectSearchParamUri.ts similarity index 100% rename from src/features/walletconnect/hooks/useWalletConnectSearchParamUri.ts rename to apps/web/src/features/walletconnect/hooks/useWalletConnectSearchParamUri.ts diff --git a/src/features/walletconnect/hooks/useWalletConnectSessions.ts b/apps/web/src/features/walletconnect/hooks/useWalletConnectSessions.ts similarity index 100% rename from src/features/walletconnect/hooks/useWalletConnectSessions.ts rename to apps/web/src/features/walletconnect/hooks/useWalletConnectSessions.ts diff --git a/src/features/walletconnect/hooks/useWcUri.ts b/apps/web/src/features/walletconnect/hooks/useWcUri.ts similarity index 100% rename from src/features/walletconnect/hooks/useWcUri.ts rename to apps/web/src/features/walletconnect/hooks/useWcUri.ts diff --git a/src/features/walletconnect/services/WalletConnectWallet.ts b/apps/web/src/features/walletconnect/services/WalletConnectWallet.ts similarity index 100% rename from src/features/walletconnect/services/WalletConnectWallet.ts rename to apps/web/src/features/walletconnect/services/WalletConnectWallet.ts diff --git a/src/features/walletconnect/services/__tests__/WalletConnectWallet.test.ts b/apps/web/src/features/walletconnect/services/__tests__/WalletConnectWallet.test.ts similarity index 100% rename from src/features/walletconnect/services/__tests__/WalletConnectWallet.test.ts rename to apps/web/src/features/walletconnect/services/__tests__/WalletConnectWallet.test.ts diff --git a/src/features/walletconnect/services/__tests__/utils.test.ts b/apps/web/src/features/walletconnect/services/__tests__/utils.test.ts similarity index 100% rename from src/features/walletconnect/services/__tests__/utils.test.ts rename to apps/web/src/features/walletconnect/services/__tests__/utils.test.ts diff --git a/src/features/walletconnect/services/tracking.ts b/apps/web/src/features/walletconnect/services/tracking.ts similarity index 100% rename from src/features/walletconnect/services/tracking.ts rename to apps/web/src/features/walletconnect/services/tracking.ts diff --git a/src/features/walletconnect/services/utils.ts b/apps/web/src/features/walletconnect/services/utils.ts similarity index 100% rename from src/features/walletconnect/services/utils.ts rename to apps/web/src/features/walletconnect/services/utils.ts diff --git a/src/hooks/Beamer/useBeamer.ts b/apps/web/src/hooks/Beamer/useBeamer.ts similarity index 100% rename from src/hooks/Beamer/useBeamer.ts rename to apps/web/src/hooks/Beamer/useBeamer.ts diff --git a/src/hooks/__tests__/useAddressResolver.test.ts b/apps/web/src/hooks/__tests__/useAddressResolver.test.ts similarity index 100% rename from src/hooks/__tests__/useAddressResolver.test.ts rename to apps/web/src/hooks/__tests__/useAddressResolver.test.ts diff --git a/src/hooks/__tests__/useAdjustUrl.test.ts b/apps/web/src/hooks/__tests__/useAdjustUrl.test.ts similarity index 100% rename from src/hooks/__tests__/useAdjustUrl.test.ts rename to apps/web/src/hooks/__tests__/useAdjustUrl.test.ts diff --git a/src/hooks/__tests__/useAsync.test.ts b/apps/web/src/hooks/__tests__/useAsync.test.ts similarity index 100% rename from src/hooks/__tests__/useAsync.test.ts rename to apps/web/src/hooks/__tests__/useAsync.test.ts diff --git a/src/hooks/__tests__/useBalances.test.ts b/apps/web/src/hooks/__tests__/useBalances.test.ts similarity index 100% rename from src/hooks/__tests__/useBalances.test.ts rename to apps/web/src/hooks/__tests__/useBalances.test.ts diff --git a/src/hooks/__tests__/useBatchedTxs.test.ts b/apps/web/src/hooks/__tests__/useBatchedTxs.test.ts similarity index 100% rename from src/hooks/__tests__/useBatchedTxs.test.ts rename to apps/web/src/hooks/__tests__/useBatchedTxs.test.ts diff --git a/src/hooks/__tests__/useChainId.test.ts b/apps/web/src/hooks/__tests__/useChainId.test.ts similarity index 100% rename from src/hooks/__tests__/useChainId.test.ts rename to apps/web/src/hooks/__tests__/useChainId.test.ts diff --git a/src/hooks/__tests__/useClock.test.ts b/apps/web/src/hooks/__tests__/useClock.test.ts similarity index 100% rename from src/hooks/__tests__/useClock.test.ts rename to apps/web/src/hooks/__tests__/useClock.test.ts diff --git a/src/hooks/__tests__/useDebounce.test.ts b/apps/web/src/hooks/__tests__/useDebounce.test.ts similarity index 100% rename from src/hooks/__tests__/useDebounce.test.ts rename to apps/web/src/hooks/__tests__/useDebounce.test.ts diff --git a/src/hooks/__tests__/useDecodeTx.test.ts b/apps/web/src/hooks/__tests__/useDecodeTx.test.ts similarity index 100% rename from src/hooks/__tests__/useDecodeTx.test.ts rename to apps/web/src/hooks/__tests__/useDecodeTx.test.ts diff --git a/src/hooks/__tests__/useGasLimit.test.ts b/apps/web/src/hooks/__tests__/useGasLimit.test.ts similarity index 100% rename from src/hooks/__tests__/useGasLimit.test.ts rename to apps/web/src/hooks/__tests__/useGasLimit.test.ts diff --git a/src/hooks/__tests__/useGasPrice.test.ts b/apps/web/src/hooks/__tests__/useGasPrice.test.ts similarity index 100% rename from src/hooks/__tests__/useGasPrice.test.ts rename to apps/web/src/hooks/__tests__/useGasPrice.test.ts diff --git a/src/hooks/__tests__/useIntervalCounter.test.ts b/apps/web/src/hooks/__tests__/useIntervalCounter.test.ts similarity index 100% rename from src/hooks/__tests__/useIntervalCounter.test.ts rename to apps/web/src/hooks/__tests__/useIntervalCounter.test.ts diff --git a/src/hooks/__tests__/useLoadBalances.test.ts b/apps/web/src/hooks/__tests__/useLoadBalances.test.ts similarity index 100% rename from src/hooks/__tests__/useLoadBalances.test.ts rename to apps/web/src/hooks/__tests__/useLoadBalances.test.ts diff --git a/src/hooks/__tests__/useLoadChains.test.ts b/apps/web/src/hooks/__tests__/useLoadChains.test.ts similarity index 100% rename from src/hooks/__tests__/useLoadChains.test.ts rename to apps/web/src/hooks/__tests__/useLoadChains.test.ts diff --git a/src/hooks/__tests__/useLoadSpendingLimits.test.ts b/apps/web/src/hooks/__tests__/useLoadSpendingLimits.test.ts similarity index 100% rename from src/hooks/__tests__/useLoadSpendingLimits.test.ts rename to apps/web/src/hooks/__tests__/useLoadSpendingLimits.test.ts diff --git a/src/hooks/__tests__/useNestedSafeOwners.test.ts b/apps/web/src/hooks/__tests__/useNestedSafeOwners.test.ts similarity index 100% rename from src/hooks/__tests__/useNestedSafeOwners.test.ts rename to apps/web/src/hooks/__tests__/useNestedSafeOwners.test.ts diff --git a/src/hooks/__tests__/usePendingActions.test.ts b/apps/web/src/hooks/__tests__/usePendingActions.test.ts similarity index 100% rename from src/hooks/__tests__/usePendingActions.test.ts rename to apps/web/src/hooks/__tests__/usePendingActions.test.ts diff --git a/src/hooks/__tests__/usePendingTxs.test.ts b/apps/web/src/hooks/__tests__/usePendingTxs.test.ts similarity index 100% rename from src/hooks/__tests__/usePendingTxs.test.ts rename to apps/web/src/hooks/__tests__/usePendingTxs.test.ts diff --git a/src/hooks/__tests__/usePreviousNonces.test.ts b/apps/web/src/hooks/__tests__/usePreviousNonces.test.ts similarity index 100% rename from src/hooks/__tests__/usePreviousNonces.test.ts rename to apps/web/src/hooks/__tests__/usePreviousNonces.test.ts diff --git a/src/hooks/__tests__/useRankedSafeApps.test.ts b/apps/web/src/hooks/__tests__/useRankedSafeApps.test.ts similarity index 100% rename from src/hooks/__tests__/useRankedSafeApps.test.ts rename to apps/web/src/hooks/__tests__/useRankedSafeApps.test.ts diff --git a/src/hooks/__tests__/useRemainingRelays.test.ts b/apps/web/src/hooks/__tests__/useRemainingRelays.test.ts similarity index 100% rename from src/hooks/__tests__/useRemainingRelays.test.ts rename to apps/web/src/hooks/__tests__/useRemainingRelays.test.ts diff --git a/src/hooks/__tests__/useRemoteSafeApps.test.ts b/apps/web/src/hooks/__tests__/useRemoteSafeApps.test.ts similarity index 100% rename from src/hooks/__tests__/useRemoteSafeApps.test.ts rename to apps/web/src/hooks/__tests__/useRemoteSafeApps.test.ts diff --git a/src/hooks/__tests__/useSafeAddress.test.ts b/apps/web/src/hooks/__tests__/useSafeAddress.test.ts similarity index 100% rename from src/hooks/__tests__/useSafeAddress.test.ts rename to apps/web/src/hooks/__tests__/useSafeAddress.test.ts diff --git a/src/hooks/__tests__/useSafeNotifications.test.ts b/apps/web/src/hooks/__tests__/useSafeNotifications.test.ts similarity index 100% rename from src/hooks/__tests__/useSafeNotifications.test.ts rename to apps/web/src/hooks/__tests__/useSafeNotifications.test.ts diff --git a/src/hooks/__tests__/useSafeTokenAllocation.test.ts b/apps/web/src/hooks/__tests__/useSafeTokenAllocation.test.ts similarity index 100% rename from src/hooks/__tests__/useSafeTokenAllocation.test.ts rename to apps/web/src/hooks/__tests__/useSafeTokenAllocation.test.ts diff --git a/src/hooks/__tests__/useSanctionedAddress.test.ts b/apps/web/src/hooks/__tests__/useSanctionedAddress.test.ts similarity index 100% rename from src/hooks/__tests__/useSanctionedAddress.test.ts rename to apps/web/src/hooks/__tests__/useSanctionedAddress.test.ts diff --git a/src/hooks/__tests__/useTxPendingStatus.test.ts b/apps/web/src/hooks/__tests__/useTxPendingStatus.test.ts similarity index 100% rename from src/hooks/__tests__/useTxPendingStatus.test.ts rename to apps/web/src/hooks/__tests__/useTxPendingStatus.test.ts diff --git a/src/hooks/__tests__/useTxQueue.test.ts b/apps/web/src/hooks/__tests__/useTxQueue.test.ts similarity index 100% rename from src/hooks/__tests__/useTxQueue.test.ts rename to apps/web/src/hooks/__tests__/useTxQueue.test.ts diff --git a/src/hooks/__tests__/useTxTracking.test.ts b/apps/web/src/hooks/__tests__/useTxTracking.test.ts similarity index 100% rename from src/hooks/__tests__/useTxTracking.test.ts rename to apps/web/src/hooks/__tests__/useTxTracking.test.ts diff --git a/src/hooks/__tests__/useVisibleBalances.test.ts b/apps/web/src/hooks/__tests__/useVisibleBalances.test.ts similarity index 100% rename from src/hooks/__tests__/useVisibleBalances.test.ts rename to apps/web/src/hooks/__tests__/useVisibleBalances.test.ts diff --git a/src/hooks/__tests__/useWalletCanPay.test.ts b/apps/web/src/hooks/__tests__/useWalletCanPay.test.ts similarity index 100% rename from src/hooks/__tests__/useWalletCanPay.test.ts rename to apps/web/src/hooks/__tests__/useWalletCanPay.test.ts diff --git a/src/hooks/coreSDK/__tests__/safeCoreSDK.test.ts b/apps/web/src/hooks/coreSDK/__tests__/safeCoreSDK.test.ts similarity index 100% rename from src/hooks/coreSDK/__tests__/safeCoreSDK.test.ts rename to apps/web/src/hooks/coreSDK/__tests__/safeCoreSDK.test.ts diff --git a/src/hooks/coreSDK/__tests__/useInitSafeCoreSDK.test.ts b/apps/web/src/hooks/coreSDK/__tests__/useInitSafeCoreSDK.test.ts similarity index 100% rename from src/hooks/coreSDK/__tests__/useInitSafeCoreSDK.test.ts rename to apps/web/src/hooks/coreSDK/__tests__/useInitSafeCoreSDK.test.ts diff --git a/src/hooks/coreSDK/safeCoreSDK.ts b/apps/web/src/hooks/coreSDK/safeCoreSDK.ts similarity index 100% rename from src/hooks/coreSDK/safeCoreSDK.ts rename to apps/web/src/hooks/coreSDK/safeCoreSDK.ts diff --git a/src/hooks/coreSDK/useInitSafeCoreSDK.ts b/apps/web/src/hooks/coreSDK/useInitSafeCoreSDK.ts similarity index 100% rename from src/hooks/coreSDK/useInitSafeCoreSDK.ts rename to apps/web/src/hooks/coreSDK/useInitSafeCoreSDK.ts diff --git a/src/hooks/loadables/helpers/__tests__/config.test.ts b/apps/web/src/hooks/loadables/helpers/__tests__/config.test.ts similarity index 100% rename from src/hooks/loadables/helpers/__tests__/config.test.ts rename to apps/web/src/hooks/loadables/helpers/__tests__/config.test.ts diff --git a/src/hooks/loadables/helpers/config.ts b/apps/web/src/hooks/loadables/helpers/config.ts similarity index 100% rename from src/hooks/loadables/helpers/config.ts rename to apps/web/src/hooks/loadables/helpers/config.ts diff --git a/src/hooks/loadables/useLoadBalances.ts b/apps/web/src/hooks/loadables/useLoadBalances.ts similarity index 100% rename from src/hooks/loadables/useLoadBalances.ts rename to apps/web/src/hooks/loadables/useLoadBalances.ts diff --git a/src/hooks/loadables/useLoadChains.ts b/apps/web/src/hooks/loadables/useLoadChains.ts similarity index 100% rename from src/hooks/loadables/useLoadChains.ts rename to apps/web/src/hooks/loadables/useLoadChains.ts diff --git a/src/hooks/loadables/useLoadSafeInfo.ts b/apps/web/src/hooks/loadables/useLoadSafeInfo.ts similarity index 100% rename from src/hooks/loadables/useLoadSafeInfo.ts rename to apps/web/src/hooks/loadables/useLoadSafeInfo.ts diff --git a/src/hooks/loadables/useLoadSafeMessages.ts b/apps/web/src/hooks/loadables/useLoadSafeMessages.ts similarity index 100% rename from src/hooks/loadables/useLoadSafeMessages.ts rename to apps/web/src/hooks/loadables/useLoadSafeMessages.ts diff --git a/src/hooks/loadables/useLoadSpendingLimits.ts b/apps/web/src/hooks/loadables/useLoadSpendingLimits.ts similarity index 100% rename from src/hooks/loadables/useLoadSpendingLimits.ts rename to apps/web/src/hooks/loadables/useLoadSpendingLimits.ts diff --git a/src/hooks/loadables/useLoadTxHistory.ts b/apps/web/src/hooks/loadables/useLoadTxHistory.ts similarity index 100% rename from src/hooks/loadables/useLoadTxHistory.ts rename to apps/web/src/hooks/loadables/useLoadTxHistory.ts diff --git a/src/hooks/loadables/useLoadTxQueue.ts b/apps/web/src/hooks/loadables/useLoadTxQueue.ts similarity index 100% rename from src/hooks/loadables/useLoadTxQueue.ts rename to apps/web/src/hooks/loadables/useLoadTxQueue.ts diff --git a/src/hooks/messages/__tests__/useIsSafeMessagePending.test.ts b/apps/web/src/hooks/messages/__tests__/useIsSafeMessagePending.test.ts similarity index 100% rename from src/hooks/messages/__tests__/useIsSafeMessagePending.test.ts rename to apps/web/src/hooks/messages/__tests__/useIsSafeMessagePending.test.ts diff --git a/src/hooks/messages/__tests__/useIsSafeMessageSignableBy.test.ts b/apps/web/src/hooks/messages/__tests__/useIsSafeMessageSignableBy.test.ts similarity index 100% rename from src/hooks/messages/__tests__/useIsSafeMessageSignableBy.test.ts rename to apps/web/src/hooks/messages/__tests__/useIsSafeMessageSignableBy.test.ts diff --git a/src/hooks/messages/__tests__/useSafeMessageNotifications.test.ts b/apps/web/src/hooks/messages/__tests__/useSafeMessageNotifications.test.ts similarity index 100% rename from src/hooks/messages/__tests__/useSafeMessageNotifications.test.ts rename to apps/web/src/hooks/messages/__tests__/useSafeMessageNotifications.test.ts diff --git a/src/hooks/messages/__tests__/useSafeMessagePendingStatuses.test.ts b/apps/web/src/hooks/messages/__tests__/useSafeMessagePendingStatuses.test.ts similarity index 100% rename from src/hooks/messages/__tests__/useSafeMessagePendingStatuses.test.ts rename to apps/web/src/hooks/messages/__tests__/useSafeMessagePendingStatuses.test.ts diff --git a/src/hooks/messages/__tests__/useSafeMessageStatus.test.ts b/apps/web/src/hooks/messages/__tests__/useSafeMessageStatus.test.ts similarity index 100% rename from src/hooks/messages/__tests__/useSafeMessageStatus.test.ts rename to apps/web/src/hooks/messages/__tests__/useSafeMessageStatus.test.ts diff --git a/src/hooks/messages/useDecodedSafeMessage.ts b/apps/web/src/hooks/messages/useDecodedSafeMessage.ts similarity index 100% rename from src/hooks/messages/useDecodedSafeMessage.ts rename to apps/web/src/hooks/messages/useDecodedSafeMessage.ts diff --git a/src/hooks/messages/useIsSafeMessagePending.ts b/apps/web/src/hooks/messages/useIsSafeMessagePending.ts similarity index 100% rename from src/hooks/messages/useIsSafeMessagePending.ts rename to apps/web/src/hooks/messages/useIsSafeMessagePending.ts diff --git a/src/hooks/messages/useIsSafeMessageSignableBy.ts b/apps/web/src/hooks/messages/useIsSafeMessageSignableBy.ts similarity index 100% rename from src/hooks/messages/useIsSafeMessageSignableBy.ts rename to apps/web/src/hooks/messages/useIsSafeMessageSignableBy.ts diff --git a/src/hooks/messages/useSafeMessage.ts b/apps/web/src/hooks/messages/useSafeMessage.ts similarity index 100% rename from src/hooks/messages/useSafeMessage.ts rename to apps/web/src/hooks/messages/useSafeMessage.ts diff --git a/src/hooks/messages/useSafeMessageNotifications.ts b/apps/web/src/hooks/messages/useSafeMessageNotifications.ts similarity index 100% rename from src/hooks/messages/useSafeMessageNotifications.ts rename to apps/web/src/hooks/messages/useSafeMessageNotifications.ts diff --git a/src/hooks/messages/useSafeMessagePendingStatuses.ts b/apps/web/src/hooks/messages/useSafeMessagePendingStatuses.ts similarity index 100% rename from src/hooks/messages/useSafeMessagePendingStatuses.ts rename to apps/web/src/hooks/messages/useSafeMessagePendingStatuses.ts diff --git a/src/hooks/messages/useSafeMessageStatus.ts b/apps/web/src/hooks/messages/useSafeMessageStatus.ts similarity index 100% rename from src/hooks/messages/useSafeMessageStatus.ts rename to apps/web/src/hooks/messages/useSafeMessageStatus.ts diff --git a/src/hooks/messages/useSafeMessages.ts b/apps/web/src/hooks/messages/useSafeMessages.ts similarity index 100% rename from src/hooks/messages/useSafeMessages.ts rename to apps/web/src/hooks/messages/useSafeMessages.ts diff --git a/src/hooks/messages/useSafeMsgTracking.ts b/apps/web/src/hooks/messages/useSafeMsgTracking.ts similarity index 100% rename from src/hooks/messages/useSafeMsgTracking.ts rename to apps/web/src/hooks/messages/useSafeMsgTracking.ts diff --git a/src/hooks/messages/useSyncSafeMessageSigner.ts b/apps/web/src/hooks/messages/useSyncSafeMessageSigner.ts similarity index 100% rename from src/hooks/messages/useSyncSafeMessageSigner.ts rename to apps/web/src/hooks/messages/useSyncSafeMessageSigner.ts diff --git a/src/hooks/safe-apps/__tests__/useCategoryFilter.test.ts b/apps/web/src/hooks/safe-apps/__tests__/useCategoryFilter.test.ts similarity index 100% rename from src/hooks/safe-apps/__tests__/useCategoryFilter.test.ts rename to apps/web/src/hooks/safe-apps/__tests__/useCategoryFilter.test.ts diff --git a/src/hooks/safe-apps/permissions/index.ts b/apps/web/src/hooks/safe-apps/permissions/index.ts similarity index 100% rename from src/hooks/safe-apps/permissions/index.ts rename to apps/web/src/hooks/safe-apps/permissions/index.ts diff --git a/src/hooks/safe-apps/permissions/useBrowserPermissions.ts b/apps/web/src/hooks/safe-apps/permissions/useBrowserPermissions.ts similarity index 100% rename from src/hooks/safe-apps/permissions/useBrowserPermissions.ts rename to apps/web/src/hooks/safe-apps/permissions/useBrowserPermissions.ts diff --git a/src/hooks/safe-apps/permissions/useSafePermissions.ts b/apps/web/src/hooks/safe-apps/permissions/useSafePermissions.ts similarity index 100% rename from src/hooks/safe-apps/permissions/useSafePermissions.ts rename to apps/web/src/hooks/safe-apps/permissions/useSafePermissions.ts diff --git a/src/hooks/safe-apps/useAppsFilterByCategory.ts b/apps/web/src/hooks/safe-apps/useAppsFilterByCategory.ts similarity index 100% rename from src/hooks/safe-apps/useAppsFilterByCategory.ts rename to apps/web/src/hooks/safe-apps/useAppsFilterByCategory.ts diff --git a/src/hooks/safe-apps/useAppsFilterByOptimizedForBatch.ts b/apps/web/src/hooks/safe-apps/useAppsFilterByOptimizedForBatch.ts similarity index 100% rename from src/hooks/safe-apps/useAppsFilterByOptimizedForBatch.ts rename to apps/web/src/hooks/safe-apps/useAppsFilterByOptimizedForBatch.ts diff --git a/src/hooks/safe-apps/useAppsSearch.ts b/apps/web/src/hooks/safe-apps/useAppsSearch.ts similarity index 100% rename from src/hooks/safe-apps/useAppsSearch.ts rename to apps/web/src/hooks/safe-apps/useAppsSearch.ts diff --git a/src/hooks/safe-apps/useCategoryFilter.ts b/apps/web/src/hooks/safe-apps/useCategoryFilter.ts similarity index 100% rename from src/hooks/safe-apps/useCategoryFilter.ts rename to apps/web/src/hooks/safe-apps/useCategoryFilter.ts diff --git a/src/hooks/safe-apps/useCustomAppCommunicator.tsx b/apps/web/src/hooks/safe-apps/useCustomAppCommunicator.tsx similarity index 100% rename from src/hooks/safe-apps/useCustomAppCommunicator.tsx rename to apps/web/src/hooks/safe-apps/useCustomAppCommunicator.tsx diff --git a/src/hooks/safe-apps/useCustomSafeApps.ts b/apps/web/src/hooks/safe-apps/useCustomSafeApps.ts similarity index 100% rename from src/hooks/safe-apps/useCustomSafeApps.ts rename to apps/web/src/hooks/safe-apps/useCustomSafeApps.ts diff --git a/src/hooks/safe-apps/useOpenedSafeApps.ts b/apps/web/src/hooks/safe-apps/useOpenedSafeApps.ts similarity index 100% rename from src/hooks/safe-apps/useOpenedSafeApps.ts rename to apps/web/src/hooks/safe-apps/useOpenedSafeApps.ts diff --git a/src/hooks/safe-apps/usePinnedSafeApps.ts b/apps/web/src/hooks/safe-apps/usePinnedSafeApps.ts similarity index 100% rename from src/hooks/safe-apps/usePinnedSafeApps.ts rename to apps/web/src/hooks/safe-apps/usePinnedSafeApps.ts diff --git a/src/hooks/safe-apps/useRankedSafeApps.ts b/apps/web/src/hooks/safe-apps/useRankedSafeApps.ts similarity index 100% rename from src/hooks/safe-apps/useRankedSafeApps.ts rename to apps/web/src/hooks/safe-apps/useRankedSafeApps.ts diff --git a/src/hooks/safe-apps/useRemoteSafeApps.ts b/apps/web/src/hooks/safe-apps/useRemoteSafeApps.ts similarity index 100% rename from src/hooks/safe-apps/useRemoteSafeApps.ts rename to apps/web/src/hooks/safe-apps/useRemoteSafeApps.ts diff --git a/src/hooks/safe-apps/useRemoveAppModal.ts b/apps/web/src/hooks/safe-apps/useRemoveAppModal.ts similarity index 100% rename from src/hooks/safe-apps/useRemoveAppModal.ts rename to apps/web/src/hooks/safe-apps/useRemoveAppModal.ts diff --git a/src/hooks/safe-apps/useSafeAppFromBackend.ts b/apps/web/src/hooks/safe-apps/useSafeAppFromBackend.ts similarity index 100% rename from src/hooks/safe-apps/useSafeAppFromBackend.ts rename to apps/web/src/hooks/safe-apps/useSafeAppFromBackend.ts diff --git a/src/hooks/safe-apps/useSafeAppFromManifest.ts b/apps/web/src/hooks/safe-apps/useSafeAppFromManifest.ts similarity index 100% rename from src/hooks/safe-apps/useSafeAppFromManifest.ts rename to apps/web/src/hooks/safe-apps/useSafeAppFromManifest.ts diff --git a/src/hooks/safe-apps/useSafeAppPreviewDrawer.ts b/apps/web/src/hooks/safe-apps/useSafeAppPreviewDrawer.ts similarity index 100% rename from src/hooks/safe-apps/useSafeAppPreviewDrawer.ts rename to apps/web/src/hooks/safe-apps/useSafeAppPreviewDrawer.ts diff --git a/src/hooks/safe-apps/useSafeAppUrl.ts b/apps/web/src/hooks/safe-apps/useSafeAppUrl.ts similarity index 100% rename from src/hooks/safe-apps/useSafeAppUrl.ts rename to apps/web/src/hooks/safe-apps/useSafeAppUrl.ts diff --git a/src/hooks/safe-apps/useSafeApps.ts b/apps/web/src/hooks/safe-apps/useSafeApps.ts similarity index 100% rename from src/hooks/safe-apps/useSafeApps.ts rename to apps/web/src/hooks/safe-apps/useSafeApps.ts diff --git a/src/hooks/safe-apps/useSafeAppsFilters.ts b/apps/web/src/hooks/safe-apps/useSafeAppsFilters.ts similarity index 100% rename from src/hooks/safe-apps/useSafeAppsFilters.ts rename to apps/web/src/hooks/safe-apps/useSafeAppsFilters.ts diff --git a/src/hooks/safe-apps/useTxBuilderApp.ts b/apps/web/src/hooks/safe-apps/useTxBuilderApp.ts similarity index 100% rename from src/hooks/safe-apps/useTxBuilderApp.ts rename to apps/web/src/hooks/safe-apps/useTxBuilderApp.ts diff --git a/src/hooks/useAddressBook.ts b/apps/web/src/hooks/useAddressBook.ts similarity index 100% rename from src/hooks/useAddressBook.ts rename to apps/web/src/hooks/useAddressBook.ts diff --git a/src/hooks/useAddressResolver.ts b/apps/web/src/hooks/useAddressResolver.ts similarity index 100% rename from src/hooks/useAddressResolver.ts rename to apps/web/src/hooks/useAddressResolver.ts diff --git a/src/hooks/useAdjustUrl.ts b/apps/web/src/hooks/useAdjustUrl.ts similarity index 100% rename from src/hooks/useAdjustUrl.ts rename to apps/web/src/hooks/useAdjustUrl.ts diff --git a/src/hooks/useAllAddressBooks.ts b/apps/web/src/hooks/useAllAddressBooks.ts similarity index 100% rename from src/hooks/useAllAddressBooks.ts rename to apps/web/src/hooks/useAllAddressBooks.ts diff --git a/src/hooks/useAsync.ts b/apps/web/src/hooks/useAsync.ts similarity index 100% rename from src/hooks/useAsync.ts rename to apps/web/src/hooks/useAsync.ts diff --git a/src/hooks/useBalances.ts b/apps/web/src/hooks/useBalances.ts similarity index 100% rename from src/hooks/useBalances.ts rename to apps/web/src/hooks/useBalances.ts diff --git a/src/hooks/useBatchedTxs.ts b/apps/web/src/hooks/useBatchedTxs.ts similarity index 100% rename from src/hooks/useBatchedTxs.ts rename to apps/web/src/hooks/useBatchedTxs.ts diff --git a/src/hooks/useChainId.ts b/apps/web/src/hooks/useChainId.ts similarity index 100% rename from src/hooks/useChainId.ts rename to apps/web/src/hooks/useChainId.ts diff --git a/src/hooks/useChains.ts b/apps/web/src/hooks/useChains.ts similarity index 100% rename from src/hooks/useChains.ts rename to apps/web/src/hooks/useChains.ts diff --git a/src/hooks/useChangedValue.ts b/apps/web/src/hooks/useChangedValue.ts similarity index 100% rename from src/hooks/useChangedValue.ts rename to apps/web/src/hooks/useChangedValue.ts diff --git a/src/hooks/useClock.ts b/apps/web/src/hooks/useClock.ts similarity index 100% rename from src/hooks/useClock.ts rename to apps/web/src/hooks/useClock.ts diff --git a/src/hooks/useCollectibles.ts b/apps/web/src/hooks/useCollectibles.ts similarity index 100% rename from src/hooks/useCollectibles.ts rename to apps/web/src/hooks/useCollectibles.ts diff --git a/src/hooks/useDarkMode.ts b/apps/web/src/hooks/useDarkMode.ts similarity index 100% rename from src/hooks/useDarkMode.ts rename to apps/web/src/hooks/useDarkMode.ts diff --git a/src/hooks/useDebounce.ts b/apps/web/src/hooks/useDebounce.ts similarity index 100% rename from src/hooks/useDebounce.ts rename to apps/web/src/hooks/useDebounce.ts diff --git a/src/hooks/useDecodeTx.ts b/apps/web/src/hooks/useDecodeTx.ts similarity index 100% rename from src/hooks/useDecodeTx.ts rename to apps/web/src/hooks/useDecodeTx.ts diff --git a/src/hooks/useDraftBatch.ts b/apps/web/src/hooks/useDraftBatch.ts similarity index 100% rename from src/hooks/useDraftBatch.ts rename to apps/web/src/hooks/useDraftBatch.ts diff --git a/src/hooks/useGasLimit.ts b/apps/web/src/hooks/useGasLimit.ts similarity index 100% rename from src/hooks/useGasLimit.ts rename to apps/web/src/hooks/useGasLimit.ts diff --git a/src/hooks/useGasPrice.ts b/apps/web/src/hooks/useGasPrice.ts similarity index 100% rename from src/hooks/useGasPrice.ts rename to apps/web/src/hooks/useGasPrice.ts diff --git a/src/hooks/useHiddenTokens.ts b/apps/web/src/hooks/useHiddenTokens.ts similarity index 100% rename from src/hooks/useHiddenTokens.ts rename to apps/web/src/hooks/useHiddenTokens.ts diff --git a/src/hooks/useHighlightHiddenTab.ts b/apps/web/src/hooks/useHighlightHiddenTab.ts similarity index 100% rename from src/hooks/useHighlightHiddenTab.ts rename to apps/web/src/hooks/useHighlightHiddenTab.ts diff --git a/src/hooks/useInitSession.ts b/apps/web/src/hooks/useInitSession.ts similarity index 100% rename from src/hooks/useInitSession.ts rename to apps/web/src/hooks/useInitSession.ts diff --git a/src/hooks/useIntervalCounter.ts b/apps/web/src/hooks/useIntervalCounter.ts similarity index 100% rename from src/hooks/useIntervalCounter.ts rename to apps/web/src/hooks/useIntervalCounter.ts diff --git a/src/hooks/useIsGeoblockedFeatureEnabled.ts b/apps/web/src/hooks/useIsGeoblockedFeatureEnabled.ts similarity index 100% rename from src/hooks/useIsGeoblockedFeatureEnabled.ts rename to apps/web/src/hooks/useIsGeoblockedFeatureEnabled.ts diff --git a/src/hooks/useIsMac.ts b/apps/web/src/hooks/useIsMac.ts similarity index 100% rename from src/hooks/useIsMac.ts rename to apps/web/src/hooks/useIsMac.ts diff --git a/src/hooks/useIsNestedSafeOwner.ts b/apps/web/src/hooks/useIsNestedSafeOwner.ts similarity index 100% rename from src/hooks/useIsNestedSafeOwner.ts rename to apps/web/src/hooks/useIsNestedSafeOwner.ts diff --git a/src/hooks/useIsOfficialHost.ts b/apps/web/src/hooks/useIsOfficialHost.ts similarity index 100% rename from src/hooks/useIsOfficialHost.ts rename to apps/web/src/hooks/useIsOfficialHost.ts diff --git a/src/hooks/useIsOnlySpendingLimitBeneficiary.tsx b/apps/web/src/hooks/useIsOnlySpendingLimitBeneficiary.tsx similarity index 100% rename from src/hooks/useIsOnlySpendingLimitBeneficiary.tsx rename to apps/web/src/hooks/useIsOnlySpendingLimitBeneficiary.tsx diff --git a/src/hooks/useIsPending.ts b/apps/web/src/hooks/useIsPending.ts similarity index 100% rename from src/hooks/useIsPending.ts rename to apps/web/src/hooks/useIsPending.ts diff --git a/src/hooks/useIsSafeOwner.ts b/apps/web/src/hooks/useIsSafeOwner.ts similarity index 100% rename from src/hooks/useIsSafeOwner.ts rename to apps/web/src/hooks/useIsSafeOwner.ts diff --git a/src/hooks/useIsSidebarRoute.ts b/apps/web/src/hooks/useIsSidebarRoute.ts similarity index 100% rename from src/hooks/useIsSidebarRoute.ts rename to apps/web/src/hooks/useIsSidebarRoute.ts diff --git a/src/hooks/useIsValidExecution.ts b/apps/web/src/hooks/useIsValidExecution.ts similarity index 100% rename from src/hooks/useIsValidExecution.ts rename to apps/web/src/hooks/useIsValidExecution.ts diff --git a/src/hooks/useIsWrongChain.ts b/apps/web/src/hooks/useIsWrongChain.ts similarity index 100% rename from src/hooks/useIsWrongChain.ts rename to apps/web/src/hooks/useIsWrongChain.ts diff --git a/src/hooks/useLastSafe.ts b/apps/web/src/hooks/useLastSafe.ts similarity index 100% rename from src/hooks/useLastSafe.ts rename to apps/web/src/hooks/useLastSafe.ts diff --git a/src/hooks/useLoadableStores.ts b/apps/web/src/hooks/useLoadableStores.ts similarity index 100% rename from src/hooks/useLoadableStores.ts rename to apps/web/src/hooks/useLoadableStores.ts diff --git a/src/hooks/useMasterCopies.ts b/apps/web/src/hooks/useMasterCopies.ts similarity index 100% rename from src/hooks/useMasterCopies.ts rename to apps/web/src/hooks/useMasterCopies.ts diff --git a/src/hooks/useMnemonicName/dict.ts b/apps/web/src/hooks/useMnemonicName/dict.ts similarity index 100% rename from src/hooks/useMnemonicName/dict.ts rename to apps/web/src/hooks/useMnemonicName/dict.ts diff --git a/src/hooks/useMnemonicName/index.ts b/apps/web/src/hooks/useMnemonicName/index.ts similarity index 100% rename from src/hooks/useMnemonicName/index.ts rename to apps/web/src/hooks/useMnemonicName/index.ts diff --git a/src/hooks/useMnemonicName/useMnemonicName.test.ts b/apps/web/src/hooks/useMnemonicName/useMnemonicName.test.ts similarity index 100% rename from src/hooks/useMnemonicName/useMnemonicName.test.ts rename to apps/web/src/hooks/useMnemonicName/useMnemonicName.test.ts diff --git a/src/hooks/useNestedSafeOwners.tsx b/apps/web/src/hooks/useNestedSafeOwners.tsx similarity index 100% rename from src/hooks/useNestedSafeOwners.tsx rename to apps/web/src/hooks/useNestedSafeOwners.tsx diff --git a/src/hooks/useOnceVisible.ts b/apps/web/src/hooks/useOnceVisible.ts similarity index 100% rename from src/hooks/useOnceVisible.ts rename to apps/web/src/hooks/useOnceVisible.ts diff --git a/src/hooks/useOrigin.ts b/apps/web/src/hooks/useOrigin.ts similarity index 100% rename from src/hooks/useOrigin.ts rename to apps/web/src/hooks/useOrigin.ts diff --git a/src/hooks/useOwnedSafes.ts b/apps/web/src/hooks/useOwnedSafes.ts similarity index 100% rename from src/hooks/useOwnedSafes.ts rename to apps/web/src/hooks/useOwnedSafes.ts diff --git a/src/hooks/usePendingActions.ts b/apps/web/src/hooks/usePendingActions.ts similarity index 100% rename from src/hooks/usePendingActions.ts rename to apps/web/src/hooks/usePendingActions.ts diff --git a/src/hooks/usePendingTxs.ts b/apps/web/src/hooks/usePendingTxs.ts similarity index 100% rename from src/hooks/usePendingTxs.ts rename to apps/web/src/hooks/usePendingTxs.ts diff --git a/src/hooks/usePreviousNonces.ts b/apps/web/src/hooks/usePreviousNonces.ts similarity index 100% rename from src/hooks/usePreviousNonces.ts rename to apps/web/src/hooks/usePreviousNonces.ts diff --git a/src/hooks/useProposers.ts b/apps/web/src/hooks/useProposers.ts similarity index 100% rename from src/hooks/useProposers.ts rename to apps/web/src/hooks/useProposers.ts diff --git a/src/hooks/useRemainingRelays.ts b/apps/web/src/hooks/useRemainingRelays.ts similarity index 100% rename from src/hooks/useRemainingRelays.ts rename to apps/web/src/hooks/useRemainingRelays.ts diff --git a/src/hooks/useSafeAddress.ts b/apps/web/src/hooks/useSafeAddress.ts similarity index 100% rename from src/hooks/useSafeAddress.ts rename to apps/web/src/hooks/useSafeAddress.ts diff --git a/src/hooks/useSafeInfo.ts b/apps/web/src/hooks/useSafeInfo.ts similarity index 100% rename from src/hooks/useSafeInfo.ts rename to apps/web/src/hooks/useSafeInfo.ts diff --git a/src/hooks/useSafeNotifications.ts b/apps/web/src/hooks/useSafeNotifications.ts similarity index 100% rename from src/hooks/useSafeNotifications.ts rename to apps/web/src/hooks/useSafeNotifications.ts diff --git a/src/hooks/useSafeTokenAllocation.ts b/apps/web/src/hooks/useSafeTokenAllocation.ts similarity index 100% rename from src/hooks/useSafeTokenAllocation.ts rename to apps/web/src/hooks/useSafeTokenAllocation.ts diff --git a/src/hooks/useSafeTokenEnabled.ts b/apps/web/src/hooks/useSafeTokenEnabled.ts similarity index 100% rename from src/hooks/useSafeTokenEnabled.ts rename to apps/web/src/hooks/useSafeTokenEnabled.ts diff --git a/src/hooks/useSanctionedAddress.ts b/apps/web/src/hooks/useSanctionedAddress.ts similarity index 100% rename from src/hooks/useSanctionedAddress.ts rename to apps/web/src/hooks/useSanctionedAddress.ts diff --git a/src/hooks/useSpendingLimit.ts b/apps/web/src/hooks/useSpendingLimit.ts similarity index 100% rename from src/hooks/useSpendingLimit.ts rename to apps/web/src/hooks/useSpendingLimit.ts diff --git a/src/hooks/useSpendingLimitGas.ts b/apps/web/src/hooks/useSpendingLimitGas.ts similarity index 100% rename from src/hooks/useSpendingLimitGas.ts rename to apps/web/src/hooks/useSpendingLimitGas.ts diff --git a/src/hooks/useTransactionStatus.ts b/apps/web/src/hooks/useTransactionStatus.ts similarity index 100% rename from src/hooks/useTransactionStatus.ts rename to apps/web/src/hooks/useTransactionStatus.ts diff --git a/src/hooks/useTransactionType.tsx b/apps/web/src/hooks/useTransactionType.tsx similarity index 100% rename from src/hooks/useTransactionType.tsx rename to apps/web/src/hooks/useTransactionType.tsx diff --git a/src/hooks/useTxDetails.ts b/apps/web/src/hooks/useTxDetails.ts similarity index 100% rename from src/hooks/useTxDetails.ts rename to apps/web/src/hooks/useTxDetails.ts diff --git a/src/hooks/useTxHistory.ts b/apps/web/src/hooks/useTxHistory.ts similarity index 100% rename from src/hooks/useTxHistory.ts rename to apps/web/src/hooks/useTxHistory.ts diff --git a/src/hooks/useTxNotifications.ts b/apps/web/src/hooks/useTxNotifications.ts similarity index 100% rename from src/hooks/useTxNotifications.ts rename to apps/web/src/hooks/useTxNotifications.ts diff --git a/src/hooks/useTxPendingStatuses.ts b/apps/web/src/hooks/useTxPendingStatuses.ts similarity index 100% rename from src/hooks/useTxPendingStatuses.ts rename to apps/web/src/hooks/useTxPendingStatuses.ts diff --git a/src/hooks/useTxQueue.ts b/apps/web/src/hooks/useTxQueue.ts similarity index 100% rename from src/hooks/useTxQueue.ts rename to apps/web/src/hooks/useTxQueue.ts diff --git a/src/hooks/useTxTracking.ts b/apps/web/src/hooks/useTxTracking.ts similarity index 100% rename from src/hooks/useTxTracking.ts rename to apps/web/src/hooks/useTxTracking.ts diff --git a/src/hooks/useVisibleBalances.ts b/apps/web/src/hooks/useVisibleBalances.ts similarity index 100% rename from src/hooks/useVisibleBalances.ts rename to apps/web/src/hooks/useVisibleBalances.ts diff --git a/src/hooks/useWalletCanPay.ts b/apps/web/src/hooks/useWalletCanPay.ts similarity index 100% rename from src/hooks/useWalletCanPay.ts rename to apps/web/src/hooks/useWalletCanPay.ts diff --git a/src/hooks/useWalletCanRelay.ts b/apps/web/src/hooks/useWalletCanRelay.ts similarity index 100% rename from src/hooks/useWalletCanRelay.ts rename to apps/web/src/hooks/useWalletCanRelay.ts diff --git a/src/hooks/wallets/__tests__/useOnboard.test.ts b/apps/web/src/hooks/wallets/__tests__/useOnboard.test.ts similarity index 100% rename from src/hooks/wallets/__tests__/useOnboard.test.ts rename to apps/web/src/hooks/wallets/__tests__/useOnboard.test.ts diff --git a/src/hooks/wallets/consts.ts b/apps/web/src/hooks/wallets/consts.ts similarity index 100% rename from src/hooks/wallets/consts.ts rename to apps/web/src/hooks/wallets/consts.ts diff --git a/src/hooks/wallets/useInitWeb3.ts b/apps/web/src/hooks/wallets/useInitWeb3.ts similarity index 100% rename from src/hooks/wallets/useInitWeb3.ts rename to apps/web/src/hooks/wallets/useInitWeb3.ts diff --git a/src/hooks/wallets/useOnboard.ts b/apps/web/src/hooks/wallets/useOnboard.ts similarity index 100% rename from src/hooks/wallets/useOnboard.ts rename to apps/web/src/hooks/wallets/useOnboard.ts diff --git a/src/hooks/wallets/useSelectAvailableSigner.ts b/apps/web/src/hooks/wallets/useSelectAvailableSigner.ts similarity index 100% rename from src/hooks/wallets/useSelectAvailableSigner.ts rename to apps/web/src/hooks/wallets/useSelectAvailableSigner.ts diff --git a/src/hooks/wallets/useWallet.ts b/apps/web/src/hooks/wallets/useWallet.ts similarity index 100% rename from src/hooks/wallets/useWallet.ts rename to apps/web/src/hooks/wallets/useWallet.ts diff --git a/src/hooks/wallets/useWalletBalance.ts b/apps/web/src/hooks/wallets/useWalletBalance.ts similarity index 100% rename from src/hooks/wallets/useWalletBalance.ts rename to apps/web/src/hooks/wallets/useWalletBalance.ts diff --git a/src/hooks/wallets/wallets.ts b/apps/web/src/hooks/wallets/wallets.ts similarity index 100% rename from src/hooks/wallets/wallets.ts rename to apps/web/src/hooks/wallets/wallets.ts diff --git a/src/hooks/wallets/web3.ts b/apps/web/src/hooks/wallets/web3.ts similarity index 100% rename from src/hooks/wallets/web3.ts rename to apps/web/src/hooks/wallets/web3.ts diff --git a/src/markdown/privacy/privacy.md b/apps/web/src/markdown/privacy/privacy.md similarity index 100% rename from src/markdown/privacy/privacy.md rename to apps/web/src/markdown/privacy/privacy.md diff --git a/src/markdown/terms/terms.md b/apps/web/src/markdown/terms/terms.md similarity index 100% rename from src/markdown/terms/terms.md rename to apps/web/src/markdown/terms/terms.md diff --git a/src/markdown/terms/version.ts b/apps/web/src/markdown/terms/version.ts similarity index 100% rename from src/markdown/terms/version.ts rename to apps/web/src/markdown/terms/version.ts diff --git a/src/pages/403.tsx b/apps/web/src/pages/403.tsx similarity index 100% rename from src/pages/403.tsx rename to apps/web/src/pages/403.tsx diff --git a/src/pages/404.tsx b/apps/web/src/pages/404.tsx similarity index 100% rename from src/pages/404.tsx rename to apps/web/src/pages/404.tsx diff --git a/src/pages/_app.tsx b/apps/web/src/pages/_app.tsx similarity index 100% rename from src/pages/_app.tsx rename to apps/web/src/pages/_app.tsx diff --git a/src/pages/_document.tsx b/apps/web/src/pages/_document.tsx similarity index 100% rename from src/pages/_document.tsx rename to apps/web/src/pages/_document.tsx diff --git a/src/pages/_offline.tsx b/apps/web/src/pages/_offline.tsx similarity index 100% rename from src/pages/_offline.tsx rename to apps/web/src/pages/_offline.tsx diff --git a/src/pages/addOwner.tsx b/apps/web/src/pages/addOwner.tsx similarity index 100% rename from src/pages/addOwner.tsx rename to apps/web/src/pages/addOwner.tsx diff --git a/src/pages/address-book.tsx b/apps/web/src/pages/address-book.tsx similarity index 100% rename from src/pages/address-book.tsx rename to apps/web/src/pages/address-book.tsx diff --git a/src/pages/apps/bookmarked.tsx b/apps/web/src/pages/apps/bookmarked.tsx similarity index 100% rename from src/pages/apps/bookmarked.tsx rename to apps/web/src/pages/apps/bookmarked.tsx diff --git a/src/pages/apps/custom.tsx b/apps/web/src/pages/apps/custom.tsx similarity index 100% rename from src/pages/apps/custom.tsx rename to apps/web/src/pages/apps/custom.tsx diff --git a/src/pages/apps/index.tsx b/apps/web/src/pages/apps/index.tsx similarity index 100% rename from src/pages/apps/index.tsx rename to apps/web/src/pages/apps/index.tsx diff --git a/src/pages/apps/open.tsx b/apps/web/src/pages/apps/open.tsx similarity index 100% rename from src/pages/apps/open.tsx rename to apps/web/src/pages/apps/open.tsx diff --git a/src/pages/balances/index.tsx b/apps/web/src/pages/balances/index.tsx similarity index 100% rename from src/pages/balances/index.tsx rename to apps/web/src/pages/balances/index.tsx diff --git a/src/pages/balances/nfts.tsx b/apps/web/src/pages/balances/nfts.tsx similarity index 100% rename from src/pages/balances/nfts.tsx rename to apps/web/src/pages/balances/nfts.tsx diff --git a/src/pages/bridge.tsx b/apps/web/src/pages/bridge.tsx similarity index 100% rename from src/pages/bridge.tsx rename to apps/web/src/pages/bridge.tsx diff --git a/src/pages/cookie.tsx b/apps/web/src/pages/cookie.tsx similarity index 100% rename from src/pages/cookie.tsx rename to apps/web/src/pages/cookie.tsx diff --git a/src/pages/home.tsx b/apps/web/src/pages/home.tsx similarity index 100% rename from src/pages/home.tsx rename to apps/web/src/pages/home.tsx diff --git a/src/pages/imprint.tsx b/apps/web/src/pages/imprint.tsx similarity index 100% rename from src/pages/imprint.tsx rename to apps/web/src/pages/imprint.tsx diff --git a/src/pages/index.tsx b/apps/web/src/pages/index.tsx similarity index 100% rename from src/pages/index.tsx rename to apps/web/src/pages/index.tsx diff --git a/src/pages/licenses.tsx b/apps/web/src/pages/licenses.tsx similarity index 100% rename from src/pages/licenses.tsx rename to apps/web/src/pages/licenses.tsx diff --git a/src/pages/new-safe/advanced-create.tsx b/apps/web/src/pages/new-safe/advanced-create.tsx similarity index 100% rename from src/pages/new-safe/advanced-create.tsx rename to apps/web/src/pages/new-safe/advanced-create.tsx diff --git a/src/pages/new-safe/create.tsx b/apps/web/src/pages/new-safe/create.tsx similarity index 100% rename from src/pages/new-safe/create.tsx rename to apps/web/src/pages/new-safe/create.tsx diff --git a/src/pages/new-safe/load.tsx b/apps/web/src/pages/new-safe/load.tsx similarity index 100% rename from src/pages/new-safe/load.tsx rename to apps/web/src/pages/new-safe/load.tsx diff --git a/src/pages/privacy.tsx b/apps/web/src/pages/privacy.tsx similarity index 100% rename from src/pages/privacy.tsx rename to apps/web/src/pages/privacy.tsx diff --git a/src/pages/settings/appearance.tsx b/apps/web/src/pages/settings/appearance.tsx similarity index 100% rename from src/pages/settings/appearance.tsx rename to apps/web/src/pages/settings/appearance.tsx diff --git a/src/pages/settings/cookies.tsx b/apps/web/src/pages/settings/cookies.tsx similarity index 100% rename from src/pages/settings/cookies.tsx rename to apps/web/src/pages/settings/cookies.tsx diff --git a/src/pages/settings/data.tsx b/apps/web/src/pages/settings/data.tsx similarity index 100% rename from src/pages/settings/data.tsx rename to apps/web/src/pages/settings/data.tsx diff --git a/src/pages/settings/environment-variables.tsx b/apps/web/src/pages/settings/environment-variables.tsx similarity index 100% rename from src/pages/settings/environment-variables.tsx rename to apps/web/src/pages/settings/environment-variables.tsx diff --git a/src/pages/settings/index.tsx b/apps/web/src/pages/settings/index.tsx similarity index 100% rename from src/pages/settings/index.tsx rename to apps/web/src/pages/settings/index.tsx diff --git a/src/pages/settings/modules.tsx b/apps/web/src/pages/settings/modules.tsx similarity index 100% rename from src/pages/settings/modules.tsx rename to apps/web/src/pages/settings/modules.tsx diff --git a/src/pages/settings/notifications.tsx b/apps/web/src/pages/settings/notifications.tsx similarity index 100% rename from src/pages/settings/notifications.tsx rename to apps/web/src/pages/settings/notifications.tsx diff --git a/src/pages/settings/safe-apps/index.tsx b/apps/web/src/pages/settings/safe-apps/index.tsx similarity index 100% rename from src/pages/settings/safe-apps/index.tsx rename to apps/web/src/pages/settings/safe-apps/index.tsx diff --git a/src/pages/settings/security.tsx b/apps/web/src/pages/settings/security.tsx similarity index 100% rename from src/pages/settings/security.tsx rename to apps/web/src/pages/settings/security.tsx diff --git a/src/pages/settings/setup.tsx b/apps/web/src/pages/settings/setup.tsx similarity index 100% rename from src/pages/settings/setup.tsx rename to apps/web/src/pages/settings/setup.tsx diff --git a/src/pages/share/safe-app.tsx b/apps/web/src/pages/share/safe-app.tsx similarity index 100% rename from src/pages/share/safe-app.tsx rename to apps/web/src/pages/share/safe-app.tsx diff --git a/src/pages/stake.tsx b/apps/web/src/pages/stake.tsx similarity index 100% rename from src/pages/stake.tsx rename to apps/web/src/pages/stake.tsx diff --git a/src/pages/swap.tsx b/apps/web/src/pages/swap.tsx similarity index 100% rename from src/pages/swap.tsx rename to apps/web/src/pages/swap.tsx diff --git a/src/pages/terms.tsx b/apps/web/src/pages/terms.tsx similarity index 100% rename from src/pages/terms.tsx rename to apps/web/src/pages/terms.tsx diff --git a/src/pages/transactions/history.tsx b/apps/web/src/pages/transactions/history.tsx similarity index 100% rename from src/pages/transactions/history.tsx rename to apps/web/src/pages/transactions/history.tsx diff --git a/src/pages/transactions/index.tsx b/apps/web/src/pages/transactions/index.tsx similarity index 100% rename from src/pages/transactions/index.tsx rename to apps/web/src/pages/transactions/index.tsx diff --git a/src/pages/transactions/messages.tsx b/apps/web/src/pages/transactions/messages.tsx similarity index 100% rename from src/pages/transactions/messages.tsx rename to apps/web/src/pages/transactions/messages.tsx diff --git a/src/pages/transactions/msg.tsx b/apps/web/src/pages/transactions/msg.tsx similarity index 100% rename from src/pages/transactions/msg.tsx rename to apps/web/src/pages/transactions/msg.tsx diff --git a/src/pages/transactions/queue.tsx b/apps/web/src/pages/transactions/queue.tsx similarity index 100% rename from src/pages/transactions/queue.tsx rename to apps/web/src/pages/transactions/queue.tsx diff --git a/src/pages/transactions/tx.tsx b/apps/web/src/pages/transactions/tx.tsx similarity index 100% rename from src/pages/transactions/tx.tsx rename to apps/web/src/pages/transactions/tx.tsx diff --git a/src/pages/wc.tsx b/apps/web/src/pages/wc.tsx similarity index 100% rename from src/pages/wc.tsx rename to apps/web/src/pages/wc.tsx diff --git a/src/pages/welcome/accounts.tsx b/apps/web/src/pages/welcome/accounts.tsx similarity index 100% rename from src/pages/welcome/accounts.tsx rename to apps/web/src/pages/welcome/accounts.tsx diff --git a/src/pages/welcome/index.tsx b/apps/web/src/pages/welcome/index.tsx similarity index 100% rename from src/pages/welcome/index.tsx rename to apps/web/src/pages/welcome/index.tsx diff --git a/src/service-workers/firebase-messaging/__tests__/notifications.test.ts b/apps/web/src/service-workers/firebase-messaging/__tests__/notifications.test.ts similarity index 100% rename from src/service-workers/firebase-messaging/__tests__/notifications.test.ts rename to apps/web/src/service-workers/firebase-messaging/__tests__/notifications.test.ts diff --git a/src/service-workers/firebase-messaging/firebase-messaging-sw.ts b/apps/web/src/service-workers/firebase-messaging/firebase-messaging-sw.ts similarity index 100% rename from src/service-workers/firebase-messaging/firebase-messaging-sw.ts rename to apps/web/src/service-workers/firebase-messaging/firebase-messaging-sw.ts diff --git a/src/service-workers/firebase-messaging/notification-mapper.ts b/apps/web/src/service-workers/firebase-messaging/notification-mapper.ts similarity index 100% rename from src/service-workers/firebase-messaging/notification-mapper.ts rename to apps/web/src/service-workers/firebase-messaging/notification-mapper.ts diff --git a/src/service-workers/firebase-messaging/notifications.ts b/apps/web/src/service-workers/firebase-messaging/notifications.ts similarity index 100% rename from src/service-workers/firebase-messaging/notifications.ts rename to apps/web/src/service-workers/firebase-messaging/notifications.ts diff --git a/src/service-workers/firebase-messaging/webhook-types.ts b/apps/web/src/service-workers/firebase-messaging/webhook-types.ts similarity index 100% rename from src/service-workers/firebase-messaging/webhook-types.ts rename to apps/web/src/service-workers/firebase-messaging/webhook-types.ts diff --git a/src/service-workers/index.ts b/apps/web/src/service-workers/index.ts similarity index 100% rename from src/service-workers/index.ts rename to apps/web/src/service-workers/index.ts diff --git a/src/services/EventBus.ts b/apps/web/src/services/EventBus.ts similarity index 100% rename from src/services/EventBus.ts rename to apps/web/src/services/EventBus.ts diff --git a/src/services/ExternalStore.ts b/apps/web/src/services/ExternalStore.ts similarity index 100% rename from src/services/ExternalStore.ts rename to apps/web/src/services/ExternalStore.ts diff --git a/src/services/analytics/TagManager.ts b/apps/web/src/services/analytics/TagManager.ts similarity index 100% rename from src/services/analytics/TagManager.ts rename to apps/web/src/services/analytics/TagManager.ts diff --git a/src/services/analytics/__tests__/TagManager.test.ts b/apps/web/src/services/analytics/__tests__/TagManager.test.ts similarity index 100% rename from src/services/analytics/__tests__/TagManager.test.ts rename to apps/web/src/services/analytics/__tests__/TagManager.test.ts diff --git a/src/services/analytics/__tests__/gtm.test.ts b/apps/web/src/services/analytics/__tests__/gtm.test.ts similarity index 100% rename from src/services/analytics/__tests__/gtm.test.ts rename to apps/web/src/services/analytics/__tests__/gtm.test.ts diff --git a/src/services/analytics/__tests__/tx-tracking.test.ts b/apps/web/src/services/analytics/__tests__/tx-tracking.test.ts similarity index 100% rename from src/services/analytics/__tests__/tx-tracking.test.ts rename to apps/web/src/services/analytics/__tests__/tx-tracking.test.ts diff --git a/src/services/analytics/events/addressBook.ts b/apps/web/src/services/analytics/events/addressBook.ts similarity index 100% rename from src/services/analytics/events/addressBook.ts rename to apps/web/src/services/analytics/events/addressBook.ts diff --git a/src/services/analytics/events/assets.ts b/apps/web/src/services/analytics/events/assets.ts similarity index 100% rename from src/services/analytics/events/assets.ts rename to apps/web/src/services/analytics/events/assets.ts diff --git a/src/services/analytics/events/batching.ts b/apps/web/src/services/analytics/events/batching.ts similarity index 100% rename from src/services/analytics/events/batching.ts rename to apps/web/src/services/analytics/events/batching.ts diff --git a/src/services/analytics/events/bridge.ts b/apps/web/src/services/analytics/events/bridge.ts similarity index 100% rename from src/services/analytics/events/bridge.ts rename to apps/web/src/services/analytics/events/bridge.ts diff --git a/src/services/analytics/events/counterfactual.ts b/apps/web/src/services/analytics/events/counterfactual.ts similarity index 100% rename from src/services/analytics/events/counterfactual.ts rename to apps/web/src/services/analytics/events/counterfactual.ts diff --git a/src/services/analytics/events/createLoadSafe.ts b/apps/web/src/services/analytics/events/createLoadSafe.ts similarity index 100% rename from src/services/analytics/events/createLoadSafe.ts rename to apps/web/src/services/analytics/events/createLoadSafe.ts diff --git a/src/services/analytics/events/index.ts b/apps/web/src/services/analytics/events/index.ts similarity index 100% rename from src/services/analytics/events/index.ts rename to apps/web/src/services/analytics/events/index.ts diff --git a/src/services/analytics/events/modals.ts b/apps/web/src/services/analytics/events/modals.ts similarity index 100% rename from src/services/analytics/events/modals.ts rename to apps/web/src/services/analytics/events/modals.ts diff --git a/src/services/analytics/events/nfts.ts b/apps/web/src/services/analytics/events/nfts.ts similarity index 100% rename from src/services/analytics/events/nfts.ts rename to apps/web/src/services/analytics/events/nfts.ts diff --git a/src/services/analytics/events/outreach.ts b/apps/web/src/services/analytics/events/outreach.ts similarity index 100% rename from src/services/analytics/events/outreach.ts rename to apps/web/src/services/analytics/events/outreach.ts diff --git a/src/services/analytics/events/overview.ts b/apps/web/src/services/analytics/events/overview.ts similarity index 100% rename from src/services/analytics/events/overview.ts rename to apps/web/src/services/analytics/events/overview.ts diff --git a/src/services/analytics/events/push-notifications.ts b/apps/web/src/services/analytics/events/push-notifications.ts similarity index 100% rename from src/services/analytics/events/push-notifications.ts rename to apps/web/src/services/analytics/events/push-notifications.ts diff --git a/src/services/analytics/events/recovery.ts b/apps/web/src/services/analytics/events/recovery.ts similarity index 100% rename from src/services/analytics/events/recovery.ts rename to apps/web/src/services/analytics/events/recovery.ts diff --git a/src/services/analytics/events/reject-tx.ts b/apps/web/src/services/analytics/events/reject-tx.ts similarity index 100% rename from src/services/analytics/events/reject-tx.ts rename to apps/web/src/services/analytics/events/reject-tx.ts diff --git a/src/services/analytics/events/safeApps.ts b/apps/web/src/services/analytics/events/safeApps.ts similarity index 100% rename from src/services/analytics/events/safeApps.ts rename to apps/web/src/services/analytics/events/safeApps.ts diff --git a/src/services/analytics/events/settings.ts b/apps/web/src/services/analytics/events/settings.ts similarity index 100% rename from src/services/analytics/events/settings.ts rename to apps/web/src/services/analytics/events/settings.ts diff --git a/src/services/analytics/events/stake.ts b/apps/web/src/services/analytics/events/stake.ts similarity index 100% rename from src/services/analytics/events/stake.ts rename to apps/web/src/services/analytics/events/stake.ts diff --git a/src/services/analytics/events/swaps.ts b/apps/web/src/services/analytics/events/swaps.ts similarity index 100% rename from src/services/analytics/events/swaps.ts rename to apps/web/src/services/analytics/events/swaps.ts diff --git a/src/services/analytics/events/transactions.ts b/apps/web/src/services/analytics/events/transactions.ts similarity index 100% rename from src/services/analytics/events/transactions.ts rename to apps/web/src/services/analytics/events/transactions.ts diff --git a/src/services/analytics/events/txList.ts b/apps/web/src/services/analytics/events/txList.ts similarity index 100% rename from src/services/analytics/events/txList.ts rename to apps/web/src/services/analytics/events/txList.ts diff --git a/src/services/analytics/events/wallet.ts b/apps/web/src/services/analytics/events/wallet.ts similarity index 100% rename from src/services/analytics/events/wallet.ts rename to apps/web/src/services/analytics/events/wallet.ts diff --git a/src/services/analytics/events/walletconnect.ts b/apps/web/src/services/analytics/events/walletconnect.ts similarity index 100% rename from src/services/analytics/events/walletconnect.ts rename to apps/web/src/services/analytics/events/walletconnect.ts diff --git a/src/services/analytics/gtm.ts b/apps/web/src/services/analytics/gtm.ts similarity index 100% rename from src/services/analytics/gtm.ts rename to apps/web/src/services/analytics/gtm.ts diff --git a/src/services/analytics/index.ts b/apps/web/src/services/analytics/index.ts similarity index 100% rename from src/services/analytics/index.ts rename to apps/web/src/services/analytics/index.ts diff --git a/src/services/analytics/spindl.ts b/apps/web/src/services/analytics/spindl.ts similarity index 100% rename from src/services/analytics/spindl.ts rename to apps/web/src/services/analytics/spindl.ts diff --git a/src/services/analytics/tx-tracking.ts b/apps/web/src/services/analytics/tx-tracking.ts similarity index 100% rename from src/services/analytics/tx-tracking.ts rename to apps/web/src/services/analytics/tx-tracking.ts diff --git a/src/services/analytics/types.ts b/apps/web/src/services/analytics/types.ts similarity index 100% rename from src/services/analytics/types.ts rename to apps/web/src/services/analytics/types.ts diff --git a/src/services/analytics/useGtm.ts b/apps/web/src/services/analytics/useGtm.ts similarity index 100% rename from src/services/analytics/useGtm.ts rename to apps/web/src/services/analytics/useGtm.ts diff --git a/src/services/analytics/useMetaEvents.ts b/apps/web/src/services/analytics/useMetaEvents.ts similarity index 100% rename from src/services/analytics/useMetaEvents.ts rename to apps/web/src/services/analytics/useMetaEvents.ts diff --git a/src/services/beamer/index.ts b/apps/web/src/services/beamer/index.ts similarity index 100% rename from src/services/beamer/index.ts rename to apps/web/src/services/beamer/index.ts diff --git a/src/services/beamer/types.ts b/apps/web/src/services/beamer/types.ts similarity index 100% rename from src/services/beamer/types.ts rename to apps/web/src/services/beamer/types.ts diff --git a/src/services/contracts/ContractErrorCodes.ts b/apps/web/src/services/contracts/ContractErrorCodes.ts similarity index 100% rename from src/services/contracts/ContractErrorCodes.ts rename to apps/web/src/services/contracts/ContractErrorCodes.ts diff --git a/src/services/contracts/__tests__/deployments.test.ts b/apps/web/src/services/contracts/__tests__/deployments.test.ts similarity index 100% rename from src/services/contracts/__tests__/deployments.test.ts rename to apps/web/src/services/contracts/__tests__/deployments.test.ts diff --git a/src/services/contracts/__tests__/safeContracts.test.ts b/apps/web/src/services/contracts/__tests__/safeContracts.test.ts similarity index 100% rename from src/services/contracts/__tests__/safeContracts.test.ts rename to apps/web/src/services/contracts/__tests__/safeContracts.test.ts diff --git a/src/services/contracts/deployments.ts b/apps/web/src/services/contracts/deployments.ts similarity index 100% rename from src/services/contracts/deployments.ts rename to apps/web/src/services/contracts/deployments.ts diff --git a/src/services/contracts/safeContracts.ts b/apps/web/src/services/contracts/safeContracts.ts similarity index 100% rename from src/services/contracts/safeContracts.ts rename to apps/web/src/services/contracts/safeContracts.ts diff --git a/src/services/contracts/spendingLimitContracts.ts b/apps/web/src/services/contracts/spendingLimitContracts.ts similarity index 100% rename from src/services/contracts/spendingLimitContracts.ts rename to apps/web/src/services/contracts/spendingLimitContracts.ts diff --git a/src/services/ens/index.test.ts b/apps/web/src/services/ens/index.test.ts similarity index 100% rename from src/services/ens/index.test.ts rename to apps/web/src/services/ens/index.test.ts diff --git a/src/services/ens/index.ts b/apps/web/src/services/ens/index.ts similarity index 100% rename from src/services/ens/index.ts rename to apps/web/src/services/ens/index.ts diff --git a/src/services/exceptions/ErrorCodes.ts b/apps/web/src/services/exceptions/ErrorCodes.ts similarity index 100% rename from src/services/exceptions/ErrorCodes.ts rename to apps/web/src/services/exceptions/ErrorCodes.ts diff --git a/src/services/exceptions/__tests__/index.test.ts b/apps/web/src/services/exceptions/__tests__/index.test.ts similarity index 100% rename from src/services/exceptions/__tests__/index.test.ts rename to apps/web/src/services/exceptions/__tests__/index.test.ts diff --git a/src/services/exceptions/__tests__/utils.test.ts b/apps/web/src/services/exceptions/__tests__/utils.test.ts similarity index 100% rename from src/services/exceptions/__tests__/utils.test.ts rename to apps/web/src/services/exceptions/__tests__/utils.test.ts diff --git a/src/services/exceptions/index.ts b/apps/web/src/services/exceptions/index.ts similarity index 100% rename from src/services/exceptions/index.ts rename to apps/web/src/services/exceptions/index.ts diff --git a/src/services/exceptions/utils.ts b/apps/web/src/services/exceptions/utils.ts similarity index 100% rename from src/services/exceptions/utils.ts rename to apps/web/src/services/exceptions/utils.ts diff --git a/src/services/local-storage/Storage.ts b/apps/web/src/services/local-storage/Storage.ts similarity index 100% rename from src/services/local-storage/Storage.ts rename to apps/web/src/services/local-storage/Storage.ts diff --git a/src/services/local-storage/__tests__/local.test.ts b/apps/web/src/services/local-storage/__tests__/local.test.ts similarity index 100% rename from src/services/local-storage/__tests__/local.test.ts rename to apps/web/src/services/local-storage/__tests__/local.test.ts diff --git a/src/services/local-storage/__tests__/useLocalStorage.test.ts b/apps/web/src/services/local-storage/__tests__/useLocalStorage.test.ts similarity index 100% rename from src/services/local-storage/__tests__/useLocalStorage.test.ts rename to apps/web/src/services/local-storage/__tests__/useLocalStorage.test.ts diff --git a/src/services/local-storage/local.ts b/apps/web/src/services/local-storage/local.ts similarity index 100% rename from src/services/local-storage/local.ts rename to apps/web/src/services/local-storage/local.ts diff --git a/src/services/local-storage/session.ts b/apps/web/src/services/local-storage/session.ts similarity index 100% rename from src/services/local-storage/session.ts rename to apps/web/src/services/local-storage/session.ts diff --git a/src/services/local-storage/storageHelpers.ts b/apps/web/src/services/local-storage/storageHelpers.ts similarity index 100% rename from src/services/local-storage/storageHelpers.ts rename to apps/web/src/services/local-storage/storageHelpers.ts diff --git a/src/services/local-storage/useLocalStorage.ts b/apps/web/src/services/local-storage/useLocalStorage.ts similarity index 100% rename from src/services/local-storage/useLocalStorage.ts rename to apps/web/src/services/local-storage/useLocalStorage.ts diff --git a/src/services/ls-migration/addedSafes.ts b/apps/web/src/services/ls-migration/addedSafes.ts similarity index 100% rename from src/services/ls-migration/addedSafes.ts rename to apps/web/src/services/ls-migration/addedSafes.ts diff --git a/src/services/ls-migration/addressBook.ts b/apps/web/src/services/ls-migration/addressBook.ts similarity index 100% rename from src/services/ls-migration/addressBook.ts rename to apps/web/src/services/ls-migration/addressBook.ts diff --git a/src/services/ls-migration/common.ts b/apps/web/src/services/ls-migration/common.ts similarity index 100% rename from src/services/ls-migration/common.ts rename to apps/web/src/services/ls-migration/common.ts diff --git a/src/services/ls-migration/tests.test.ts b/apps/web/src/services/ls-migration/tests.test.ts similarity index 100% rename from src/services/ls-migration/tests.test.ts rename to apps/web/src/services/ls-migration/tests.test.ts diff --git a/src/services/onboard.ts b/apps/web/src/services/onboard.ts similarity index 100% rename from src/services/onboard.ts rename to apps/web/src/services/onboard.ts diff --git a/src/services/onboard/ledger-module.ts b/apps/web/src/services/onboard/ledger-module.ts similarity index 100% rename from src/services/onboard/ledger-module.ts rename to apps/web/src/services/onboard/ledger-module.ts diff --git a/src/services/private-key-module/PkModulePopup.tsx b/apps/web/src/services/private-key-module/PkModulePopup.tsx similarity index 100% rename from src/services/private-key-module/PkModulePopup.tsx rename to apps/web/src/services/private-key-module/PkModulePopup.tsx diff --git a/src/services/private-key-module/icon.ts b/apps/web/src/services/private-key-module/icon.ts similarity index 100% rename from src/services/private-key-module/icon.ts rename to apps/web/src/services/private-key-module/icon.ts diff --git a/src/services/private-key-module/index.ts b/apps/web/src/services/private-key-module/index.ts similarity index 100% rename from src/services/private-key-module/index.ts rename to apps/web/src/services/private-key-module/index.ts diff --git a/src/services/private-key-module/pk-popup-store.ts b/apps/web/src/services/private-key-module/pk-popup-store.ts similarity index 100% rename from src/services/private-key-module/pk-popup-store.ts rename to apps/web/src/services/private-key-module/pk-popup-store.ts diff --git a/src/services/push-notifications/firebase.ts b/apps/web/src/services/push-notifications/firebase.ts similarity index 100% rename from src/services/push-notifications/firebase.ts rename to apps/web/src/services/push-notifications/firebase.ts diff --git a/src/services/push-notifications/preferences.ts b/apps/web/src/services/push-notifications/preferences.ts similarity index 100% rename from src/services/push-notifications/preferences.ts rename to apps/web/src/services/push-notifications/preferences.ts diff --git a/src/services/push-notifications/tracking.ts b/apps/web/src/services/push-notifications/tracking.ts similarity index 100% rename from src/services/push-notifications/tracking.ts rename to apps/web/src/services/push-notifications/tracking.ts diff --git a/src/services/safe-apps/AppCommunicator.ts b/apps/web/src/services/safe-apps/AppCommunicator.ts similarity index 100% rename from src/services/safe-apps/AppCommunicator.ts rename to apps/web/src/services/safe-apps/AppCommunicator.ts diff --git a/src/services/safe-apps/manifest.ts b/apps/web/src/services/safe-apps/manifest.ts similarity index 100% rename from src/services/safe-apps/manifest.ts rename to apps/web/src/services/safe-apps/manifest.ts diff --git a/src/services/safe-apps/track-app-usage-count.ts b/apps/web/src/services/safe-apps/track-app-usage-count.ts similarity index 100% rename from src/services/safe-apps/track-app-usage-count.ts rename to apps/web/src/services/safe-apps/track-app-usage-count.ts diff --git a/src/services/safe-messages/__tests__/safeMsgSender.test.ts b/apps/web/src/services/safe-messages/__tests__/safeMsgSender.test.ts similarity index 100% rename from src/services/safe-messages/__tests__/safeMsgSender.test.ts rename to apps/web/src/services/safe-messages/__tests__/safeMsgSender.test.ts diff --git a/src/services/safe-messages/safeMsgEvents.ts b/apps/web/src/services/safe-messages/safeMsgEvents.ts similarity index 100% rename from src/services/safe-messages/safeMsgEvents.ts rename to apps/web/src/services/safe-messages/safeMsgEvents.ts diff --git a/src/services/safe-messages/safeMsgNotifications.ts b/apps/web/src/services/safe-messages/safeMsgNotifications.ts similarity index 100% rename from src/services/safe-messages/safeMsgNotifications.ts rename to apps/web/src/services/safe-messages/safeMsgNotifications.ts diff --git a/src/services/safe-messages/safeMsgSender.ts b/apps/web/src/services/safe-messages/safeMsgSender.ts similarity index 100% rename from src/services/safe-messages/safeMsgSender.ts rename to apps/web/src/services/safe-messages/safeMsgSender.ts diff --git a/src/services/safe-wallet-provider/index.test.ts b/apps/web/src/services/safe-wallet-provider/index.test.ts similarity index 100% rename from src/services/safe-wallet-provider/index.test.ts rename to apps/web/src/services/safe-wallet-provider/index.test.ts diff --git a/src/services/safe-wallet-provider/index.ts b/apps/web/src/services/safe-wallet-provider/index.ts similarity index 100% rename from src/services/safe-wallet-provider/index.ts rename to apps/web/src/services/safe-wallet-provider/index.ts diff --git a/src/services/safe-wallet-provider/notifications.test.ts b/apps/web/src/services/safe-wallet-provider/notifications.test.ts similarity index 100% rename from src/services/safe-wallet-provider/notifications.test.ts rename to apps/web/src/services/safe-wallet-provider/notifications.test.ts diff --git a/src/services/safe-wallet-provider/notifications.ts b/apps/web/src/services/safe-wallet-provider/notifications.ts similarity index 100% rename from src/services/safe-wallet-provider/notifications.ts rename to apps/web/src/services/safe-wallet-provider/notifications.ts diff --git a/src/services/safe-wallet-provider/useSafeWalletProvider.test.tsx b/apps/web/src/services/safe-wallet-provider/useSafeWalletProvider.test.tsx similarity index 100% rename from src/services/safe-wallet-provider/useSafeWalletProvider.test.tsx rename to apps/web/src/services/safe-wallet-provider/useSafeWalletProvider.test.tsx diff --git a/src/services/safe-wallet-provider/useSafeWalletProvider.tsx b/apps/web/src/services/safe-wallet-provider/useSafeWalletProvider.tsx similarity index 100% rename from src/services/safe-wallet-provider/useSafeWalletProvider.tsx rename to apps/web/src/services/safe-wallet-provider/useSafeWalletProvider.tsx diff --git a/src/services/security/modules/ApprovalModule/index.ts b/apps/web/src/services/security/modules/ApprovalModule/index.ts similarity index 100% rename from src/services/security/modules/ApprovalModule/index.ts rename to apps/web/src/services/security/modules/ApprovalModule/index.ts diff --git a/src/services/security/modules/BlockaidModule/index.ts b/apps/web/src/services/security/modules/BlockaidModule/index.ts similarity index 100% rename from src/services/security/modules/BlockaidModule/index.ts rename to apps/web/src/services/security/modules/BlockaidModule/index.ts diff --git a/src/services/security/modules/BlockaidModule/types.ts b/apps/web/src/services/security/modules/BlockaidModule/types.ts similarity index 100% rename from src/services/security/modules/BlockaidModule/types.ts rename to apps/web/src/services/security/modules/BlockaidModule/types.ts diff --git a/src/services/security/modules/DelegateCallModule/index.test.ts b/apps/web/src/services/security/modules/DelegateCallModule/index.test.ts similarity index 100% rename from src/services/security/modules/DelegateCallModule/index.test.ts rename to apps/web/src/services/security/modules/DelegateCallModule/index.test.ts diff --git a/src/services/security/modules/DelegateCallModule/index.ts b/apps/web/src/services/security/modules/DelegateCallModule/index.ts similarity index 100% rename from src/services/security/modules/DelegateCallModule/index.ts rename to apps/web/src/services/security/modules/DelegateCallModule/index.ts diff --git a/src/services/security/modules/types.ts b/apps/web/src/services/security/modules/types.ts similarity index 100% rename from src/services/security/modules/types.ts rename to apps/web/src/services/security/modules/types.ts diff --git a/src/services/sentry.ts b/apps/web/src/services/sentry.ts similarity index 100% rename from src/services/sentry.ts rename to apps/web/src/services/sentry.ts diff --git a/src/services/siwe/index.ts b/apps/web/src/services/siwe/index.ts similarity index 100% rename from src/services/siwe/index.ts rename to apps/web/src/services/siwe/index.ts diff --git a/src/services/tracking/abTesting.ts b/apps/web/src/services/tracking/abTesting.ts similarity index 100% rename from src/services/tracking/abTesting.ts rename to apps/web/src/services/tracking/abTesting.ts diff --git a/src/services/tracking/useAbTesting.ts b/apps/web/src/services/tracking/useAbTesting.ts similarity index 100% rename from src/services/tracking/useAbTesting.ts rename to apps/web/src/services/tracking/useAbTesting.ts diff --git a/src/services/transactions/index.tests.ts b/apps/web/src/services/transactions/index.tests.ts similarity index 100% rename from src/services/transactions/index.tests.ts rename to apps/web/src/services/transactions/index.tests.ts diff --git a/src/services/transactions/index.ts b/apps/web/src/services/transactions/index.ts similarity index 100% rename from src/services/transactions/index.ts rename to apps/web/src/services/transactions/index.ts diff --git a/src/services/tx/__tests__/encodeSignatures.test.ts b/apps/web/src/services/tx/__tests__/encodeSignatures.test.ts similarity index 100% rename from src/services/tx/__tests__/encodeSignatures.test.ts rename to apps/web/src/services/tx/__tests__/encodeSignatures.test.ts diff --git a/src/services/tx/__tests__/extractTxInfo.test.ts b/apps/web/src/services/tx/__tests__/extractTxInfo.test.ts similarity index 100% rename from src/services/tx/__tests__/extractTxInfo.test.ts rename to apps/web/src/services/tx/__tests__/extractTxInfo.test.ts diff --git a/src/services/tx/__tests__/relaying.test.ts b/apps/web/src/services/tx/__tests__/relaying.test.ts similarity index 100% rename from src/services/tx/__tests__/relaying.test.ts rename to apps/web/src/services/tx/__tests__/relaying.test.ts diff --git a/src/services/tx/__tests__/safeUpdateParams.test.ts b/apps/web/src/services/tx/__tests__/safeUpdateParams.test.ts similarity index 100% rename from src/services/tx/__tests__/safeUpdateParams.test.ts rename to apps/web/src/services/tx/__tests__/safeUpdateParams.test.ts diff --git a/src/services/tx/__tests__/spendingLimitParams.test.ts b/apps/web/src/services/tx/__tests__/spendingLimitParams.test.ts similarity index 100% rename from src/services/tx/__tests__/spendingLimitParams.test.ts rename to apps/web/src/services/tx/__tests__/spendingLimitParams.test.ts diff --git a/src/services/tx/__tests__/tokenTransferParams.test.ts b/apps/web/src/services/tx/__tests__/tokenTransferParams.test.ts similarity index 100% rename from src/services/tx/__tests__/tokenTransferParams.test.ts rename to apps/web/src/services/tx/__tests__/tokenTransferParams.test.ts diff --git a/src/services/tx/__tests__/txEvents.test.ts b/apps/web/src/services/tx/__tests__/txEvents.test.ts similarity index 100% rename from src/services/tx/__tests__/txEvents.test.ts rename to apps/web/src/services/tx/__tests__/txEvents.test.ts diff --git a/src/services/tx/__tests__/txMonitor.test.ts b/apps/web/src/services/tx/__tests__/txMonitor.test.ts similarity index 100% rename from src/services/tx/__tests__/txMonitor.test.ts rename to apps/web/src/services/tx/__tests__/txMonitor.test.ts diff --git a/src/services/tx/encodeSignatures.ts b/apps/web/src/services/tx/encodeSignatures.ts similarity index 100% rename from src/services/tx/encodeSignatures.ts rename to apps/web/src/services/tx/encodeSignatures.ts diff --git a/src/services/tx/extractTxInfo.ts b/apps/web/src/services/tx/extractTxInfo.ts similarity index 100% rename from src/services/tx/extractTxInfo.ts rename to apps/web/src/services/tx/extractTxInfo.ts diff --git a/src/services/tx/proposeTransaction.ts b/apps/web/src/services/tx/proposeTransaction.ts similarity index 100% rename from src/services/tx/proposeTransaction.ts rename to apps/web/src/services/tx/proposeTransaction.ts diff --git a/src/services/tx/relaying.ts b/apps/web/src/services/tx/relaying.ts similarity index 100% rename from src/services/tx/relaying.ts rename to apps/web/src/services/tx/relaying.ts diff --git a/src/services/tx/safeUpdateParams.ts b/apps/web/src/services/tx/safeUpdateParams.ts similarity index 100% rename from src/services/tx/safeUpdateParams.ts rename to apps/web/src/services/tx/safeUpdateParams.ts diff --git a/src/services/tx/spendingLimitParams.ts b/apps/web/src/services/tx/spendingLimitParams.ts similarity index 100% rename from src/services/tx/spendingLimitParams.ts rename to apps/web/src/services/tx/spendingLimitParams.ts diff --git a/src/services/tx/tokenTransferParams.ts b/apps/web/src/services/tx/tokenTransferParams.ts similarity index 100% rename from src/services/tx/tokenTransferParams.ts rename to apps/web/src/services/tx/tokenTransferParams.ts diff --git a/src/services/tx/tx-sender/__tests__/sdk.test.ts b/apps/web/src/services/tx/tx-sender/__tests__/sdk.test.ts similarity index 100% rename from src/services/tx/tx-sender/__tests__/sdk.test.ts rename to apps/web/src/services/tx/tx-sender/__tests__/sdk.test.ts diff --git a/src/services/tx/tx-sender/__tests__/ts-sender.test.ts b/apps/web/src/services/tx/tx-sender/__tests__/ts-sender.test.ts similarity index 100% rename from src/services/tx/tx-sender/__tests__/ts-sender.test.ts rename to apps/web/src/services/tx/tx-sender/__tests__/ts-sender.test.ts diff --git a/src/services/tx/tx-sender/create.ts b/apps/web/src/services/tx/tx-sender/create.ts similarity index 100% rename from src/services/tx/tx-sender/create.ts rename to apps/web/src/services/tx/tx-sender/create.ts diff --git a/src/services/tx/tx-sender/dispatch.ts b/apps/web/src/services/tx/tx-sender/dispatch.ts similarity index 100% rename from src/services/tx/tx-sender/dispatch.ts rename to apps/web/src/services/tx/tx-sender/dispatch.ts diff --git a/src/services/tx/tx-sender/index.ts b/apps/web/src/services/tx/tx-sender/index.ts similarity index 100% rename from src/services/tx/tx-sender/index.ts rename to apps/web/src/services/tx/tx-sender/index.ts diff --git a/src/services/tx/tx-sender/recommendedNonce.ts b/apps/web/src/services/tx/tx-sender/recommendedNonce.ts similarity index 100% rename from src/services/tx/tx-sender/recommendedNonce.ts rename to apps/web/src/services/tx/tx-sender/recommendedNonce.ts diff --git a/src/services/tx/tx-sender/sdk.ts b/apps/web/src/services/tx/tx-sender/sdk.ts similarity index 100% rename from src/services/tx/tx-sender/sdk.ts rename to apps/web/src/services/tx/tx-sender/sdk.ts diff --git a/src/services/tx/tx-sender/spendingLimit.ts b/apps/web/src/services/tx/tx-sender/spendingLimit.ts similarity index 100% rename from src/services/tx/tx-sender/spendingLimit.ts rename to apps/web/src/services/tx/tx-sender/spendingLimit.ts diff --git a/src/services/tx/txEvents.ts b/apps/web/src/services/tx/txEvents.ts similarity index 100% rename from src/services/tx/txEvents.ts rename to apps/web/src/services/tx/txEvents.ts diff --git a/src/services/tx/txMonitor.ts b/apps/web/src/services/tx/txMonitor.ts similarity index 100% rename from src/services/tx/txMonitor.ts rename to apps/web/src/services/tx/txMonitor.ts diff --git a/src/store/__tests__/addedSafesSlice.test.ts b/apps/web/src/store/__tests__/addedSafesSlice.test.ts similarity index 100% rename from src/store/__tests__/addedSafesSlice.test.ts rename to apps/web/src/store/__tests__/addedSafesSlice.test.ts diff --git a/src/store/__tests__/addressBookSlice.test.ts b/apps/web/src/store/__tests__/addressBookSlice.test.ts similarity index 100% rename from src/store/__tests__/addressBookSlice.test.ts rename to apps/web/src/store/__tests__/addressBookSlice.test.ts diff --git a/src/store/__tests__/broadcast.test.ts b/apps/web/src/store/__tests__/broadcast.test.ts similarity index 100% rename from src/store/__tests__/broadcast.test.ts rename to apps/web/src/store/__tests__/broadcast.test.ts diff --git a/src/store/__tests__/index.test.ts b/apps/web/src/store/__tests__/index.test.ts similarity index 100% rename from src/store/__tests__/index.test.ts rename to apps/web/src/store/__tests__/index.test.ts diff --git a/src/store/__tests__/pendingTxsSlice.test.ts b/apps/web/src/store/__tests__/pendingTxsSlice.test.ts similarity index 100% rename from src/store/__tests__/pendingTxsSlice.test.ts rename to apps/web/src/store/__tests__/pendingTxsSlice.test.ts diff --git a/src/store/__tests__/safeAppsSlice.test.ts b/apps/web/src/store/__tests__/safeAppsSlice.test.ts similarity index 100% rename from src/store/__tests__/safeAppsSlice.test.ts rename to apps/web/src/store/__tests__/safeAppsSlice.test.ts diff --git a/src/store/__tests__/safeMessagesSlice.test.ts b/apps/web/src/store/__tests__/safeMessagesSlice.test.ts similarity index 100% rename from src/store/__tests__/safeMessagesSlice.test.ts rename to apps/web/src/store/__tests__/safeMessagesSlice.test.ts diff --git a/src/store/__tests__/safeOverviews.test.ts b/apps/web/src/store/__tests__/safeOverviews.test.ts similarity index 100% rename from src/store/__tests__/safeOverviews.test.ts rename to apps/web/src/store/__tests__/safeOverviews.test.ts diff --git a/src/store/__tests__/settingsSlice.test.ts b/apps/web/src/store/__tests__/settingsSlice.test.ts similarity index 100% rename from src/store/__tests__/settingsSlice.test.ts rename to apps/web/src/store/__tests__/settingsSlice.test.ts diff --git a/src/store/__tests__/swapOrderSlice.test.ts b/apps/web/src/store/__tests__/swapOrderSlice.test.ts similarity index 100% rename from src/store/__tests__/swapOrderSlice.test.ts rename to apps/web/src/store/__tests__/swapOrderSlice.test.ts diff --git a/src/store/__tests__/txHistorySlice.test.ts b/apps/web/src/store/__tests__/txHistorySlice.test.ts similarity index 100% rename from src/store/__tests__/txHistorySlice.test.ts rename to apps/web/src/store/__tests__/txHistorySlice.test.ts diff --git a/src/store/__tests__/txQueueSlice.test.ts b/apps/web/src/store/__tests__/txQueueSlice.test.ts similarity index 100% rename from src/store/__tests__/txQueueSlice.test.ts rename to apps/web/src/store/__tests__/txQueueSlice.test.ts diff --git a/src/store/addedSafesSlice.ts b/apps/web/src/store/addedSafesSlice.ts similarity index 100% rename from src/store/addedSafesSlice.ts rename to apps/web/src/store/addedSafesSlice.ts diff --git a/src/store/addressBookSlice.ts b/apps/web/src/store/addressBookSlice.ts similarity index 100% rename from src/store/addressBookSlice.ts rename to apps/web/src/store/addressBookSlice.ts diff --git a/src/store/api/gateway/index.ts b/apps/web/src/store/api/gateway/index.ts similarity index 100% rename from src/store/api/gateway/index.ts rename to apps/web/src/store/api/gateway/index.ts diff --git a/src/store/api/gateway/proposers.ts b/apps/web/src/store/api/gateway/proposers.ts similarity index 100% rename from src/store/api/gateway/proposers.ts rename to apps/web/src/store/api/gateway/proposers.ts diff --git a/src/store/api/gateway/safeOverviews.ts b/apps/web/src/store/api/gateway/safeOverviews.ts similarity index 100% rename from src/store/api/gateway/safeOverviews.ts rename to apps/web/src/store/api/gateway/safeOverviews.ts diff --git a/src/store/api/ofac.ts b/apps/web/src/store/api/ofac.ts similarity index 100% rename from src/store/api/ofac.ts rename to apps/web/src/store/api/ofac.ts diff --git a/src/store/api/safePass.ts b/apps/web/src/store/api/safePass.ts similarity index 100% rename from src/store/api/safePass.ts rename to apps/web/src/store/api/safePass.ts diff --git a/src/store/balancesSlice.ts b/apps/web/src/store/balancesSlice.ts similarity index 100% rename from src/store/balancesSlice.ts rename to apps/web/src/store/balancesSlice.ts diff --git a/src/store/batchSlice.ts b/apps/web/src/store/batchSlice.ts similarity index 100% rename from src/store/batchSlice.ts rename to apps/web/src/store/batchSlice.ts diff --git a/src/store/broadcast.ts b/apps/web/src/store/broadcast.ts similarity index 100% rename from src/store/broadcast.ts rename to apps/web/src/store/broadcast.ts diff --git a/src/store/chainsSlice.ts b/apps/web/src/store/chainsSlice.ts similarity index 100% rename from src/store/chainsSlice.ts rename to apps/web/src/store/chainsSlice.ts diff --git a/src/store/common.ts b/apps/web/src/store/common.ts similarity index 100% rename from src/store/common.ts rename to apps/web/src/store/common.ts diff --git a/src/store/cookiesAndTermsSlice.ts b/apps/web/src/store/cookiesAndTermsSlice.ts similarity index 100% rename from src/store/cookiesAndTermsSlice.ts rename to apps/web/src/store/cookiesAndTermsSlice.ts diff --git a/src/store/index.ts b/apps/web/src/store/index.ts similarity index 100% rename from src/store/index.ts rename to apps/web/src/store/index.ts diff --git a/src/store/notificationsSlice.ts b/apps/web/src/store/notificationsSlice.ts similarity index 100% rename from src/store/notificationsSlice.ts rename to apps/web/src/store/notificationsSlice.ts diff --git a/src/store/orderByPreferenceSlice.ts b/apps/web/src/store/orderByPreferenceSlice.ts similarity index 100% rename from src/store/orderByPreferenceSlice.ts rename to apps/web/src/store/orderByPreferenceSlice.ts diff --git a/src/store/pendingSafeMessagesSlice.ts b/apps/web/src/store/pendingSafeMessagesSlice.ts similarity index 100% rename from src/store/pendingSafeMessagesSlice.ts rename to apps/web/src/store/pendingSafeMessagesSlice.ts diff --git a/src/store/pendingTxsSlice.ts b/apps/web/src/store/pendingTxsSlice.ts similarity index 100% rename from src/store/pendingTxsSlice.ts rename to apps/web/src/store/pendingTxsSlice.ts diff --git a/src/store/persistStore.ts b/apps/web/src/store/persistStore.ts similarity index 100% rename from src/store/persistStore.ts rename to apps/web/src/store/persistStore.ts diff --git a/src/store/popupSlice.ts b/apps/web/src/store/popupSlice.ts similarity index 100% rename from src/store/popupSlice.ts rename to apps/web/src/store/popupSlice.ts diff --git a/src/store/safeAppsSlice.ts b/apps/web/src/store/safeAppsSlice.ts similarity index 100% rename from src/store/safeAppsSlice.ts rename to apps/web/src/store/safeAppsSlice.ts diff --git a/src/store/safeInfoSlice.ts b/apps/web/src/store/safeInfoSlice.ts similarity index 100% rename from src/store/safeInfoSlice.ts rename to apps/web/src/store/safeInfoSlice.ts diff --git a/src/store/safeMessagesSlice.ts b/apps/web/src/store/safeMessagesSlice.ts similarity index 100% rename from src/store/safeMessagesSlice.ts rename to apps/web/src/store/safeMessagesSlice.ts diff --git a/src/store/sessionSlice.ts b/apps/web/src/store/sessionSlice.ts similarity index 100% rename from src/store/sessionSlice.ts rename to apps/web/src/store/sessionSlice.ts diff --git a/src/store/settingsSlice.ts b/apps/web/src/store/settingsSlice.ts similarity index 100% rename from src/store/settingsSlice.ts rename to apps/web/src/store/settingsSlice.ts diff --git a/src/store/slices.ts b/apps/web/src/store/slices.ts similarity index 100% rename from src/store/slices.ts rename to apps/web/src/store/slices.ts diff --git a/src/store/spendingLimitsSlice.ts b/apps/web/src/store/spendingLimitsSlice.ts similarity index 100% rename from src/store/spendingLimitsSlice.ts rename to apps/web/src/store/spendingLimitsSlice.ts diff --git a/src/store/swapOrderSlice.ts b/apps/web/src/store/swapOrderSlice.ts similarity index 100% rename from src/store/swapOrderSlice.ts rename to apps/web/src/store/swapOrderSlice.ts diff --git a/src/store/txHistorySlice.ts b/apps/web/src/store/txHistorySlice.ts similarity index 100% rename from src/store/txHistorySlice.ts rename to apps/web/src/store/txHistorySlice.ts diff --git a/src/store/txQueueSlice.ts b/apps/web/src/store/txQueueSlice.ts similarity index 100% rename from src/store/txQueueSlice.ts rename to apps/web/src/store/txQueueSlice.ts diff --git a/src/store/useHydrateStore.ts b/apps/web/src/store/useHydrateStore.ts similarity index 100% rename from src/store/useHydrateStore.ts rename to apps/web/src/store/useHydrateStore.ts diff --git a/src/store/visitedSafesSlice.ts b/apps/web/src/store/visitedSafesSlice.ts similarity index 100% rename from src/store/visitedSafesSlice.ts rename to apps/web/src/store/visitedSafesSlice.ts diff --git a/src/stories/Configure.mdx b/apps/web/src/stories/Configure.mdx similarity index 100% rename from src/stories/Configure.mdx rename to apps/web/src/stories/Configure.mdx diff --git a/src/stories/storeDecorator.tsx b/apps/web/src/stories/storeDecorator.tsx similarity index 100% rename from src/stories/storeDecorator.tsx rename to apps/web/src/stories/storeDecorator.tsx diff --git a/src/styles/accordion.module.css b/apps/web/src/styles/accordion.module.css similarity index 100% rename from src/styles/accordion.module.css rename to apps/web/src/styles/accordion.module.css diff --git a/src/styles/globals.css b/apps/web/src/styles/globals.css similarity index 100% rename from src/styles/globals.css rename to apps/web/src/styles/globals.css diff --git a/src/styles/inputs.module.css b/apps/web/src/styles/inputs.module.css similarity index 100% rename from src/styles/inputs.module.css rename to apps/web/src/styles/inputs.module.css diff --git a/src/styles/onboard.css b/apps/web/src/styles/onboard.css similarity index 100% rename from src/styles/onboard.css rename to apps/web/src/styles/onboard.css diff --git a/src/styles/spacings.ts b/apps/web/src/styles/spacings.ts similarity index 100% rename from src/styles/spacings.ts rename to apps/web/src/styles/spacings.ts diff --git a/src/styles/vars.css b/apps/web/src/styles/vars.css similarity index 100% rename from src/styles/vars.css rename to apps/web/src/styles/vars.css diff --git a/src/tests/Builder.ts b/apps/web/src/tests/Builder.ts similarity index 100% rename from src/tests/Builder.ts rename to apps/web/src/tests/Builder.ts diff --git a/src/tests/builders/chains.ts b/apps/web/src/tests/builders/chains.ts similarity index 100% rename from src/tests/builders/chains.ts rename to apps/web/src/tests/builders/chains.ts diff --git a/src/tests/builders/eip1193Provider.ts b/apps/web/src/tests/builders/eip1193Provider.ts similarity index 100% rename from src/tests/builders/eip1193Provider.ts rename to apps/web/src/tests/builders/eip1193Provider.ts diff --git a/src/tests/builders/messages.ts b/apps/web/src/tests/builders/messages.ts similarity index 100% rename from src/tests/builders/messages.ts rename to apps/web/src/tests/builders/messages.ts diff --git a/src/tests/builders/pendingTx.ts b/apps/web/src/tests/builders/pendingTx.ts similarity index 100% rename from src/tests/builders/pendingTx.ts rename to apps/web/src/tests/builders/pendingTx.ts diff --git a/src/tests/builders/safe.ts b/apps/web/src/tests/builders/safe.ts similarity index 100% rename from src/tests/builders/safe.ts rename to apps/web/src/tests/builders/safe.ts diff --git a/src/tests/builders/safeItem.ts b/apps/web/src/tests/builders/safeItem.ts similarity index 100% rename from src/tests/builders/safeItem.ts rename to apps/web/src/tests/builders/safeItem.ts diff --git a/src/tests/builders/safeMessage.ts b/apps/web/src/tests/builders/safeMessage.ts similarity index 100% rename from src/tests/builders/safeMessage.ts rename to apps/web/src/tests/builders/safeMessage.ts diff --git a/src/tests/builders/safeTx.ts b/apps/web/src/tests/builders/safeTx.ts similarity index 100% rename from src/tests/builders/safeTx.ts rename to apps/web/src/tests/builders/safeTx.ts diff --git a/src/tests/builders/utils.ts b/apps/web/src/tests/builders/utils.ts similarity index 100% rename from src/tests/builders/utils.ts rename to apps/web/src/tests/builders/utils.ts diff --git a/src/tests/builders/wallet.ts b/apps/web/src/tests/builders/wallet.ts similarity index 100% rename from src/tests/builders/wallet.ts rename to apps/web/src/tests/builders/wallet.ts diff --git a/src/tests/mocks/chains.ts b/apps/web/src/tests/mocks/chains.ts similarity index 100% rename from src/tests/mocks/chains.ts rename to apps/web/src/tests/mocks/chains.ts diff --git a/src/tests/mocks/contractManager.ts b/apps/web/src/tests/mocks/contractManager.ts similarity index 100% rename from src/tests/mocks/contractManager.ts rename to apps/web/src/tests/mocks/contractManager.ts diff --git a/src/tests/mocks/providers.ts b/apps/web/src/tests/mocks/providers.ts similarity index 100% rename from src/tests/mocks/providers.ts rename to apps/web/src/tests/mocks/providers.ts diff --git a/src/tests/mocks/transactions.ts b/apps/web/src/tests/mocks/transactions.ts similarity index 100% rename from src/tests/mocks/transactions.ts rename to apps/web/src/tests/mocks/transactions.ts diff --git a/src/tests/pages/404.test.tsx b/apps/web/src/tests/pages/404.test.tsx similarity index 100% rename from src/tests/pages/404.test.tsx rename to apps/web/src/tests/pages/404.test.tsx diff --git a/src/tests/pages/apps-share.test.tsx b/apps/web/src/tests/pages/apps-share.test.tsx similarity index 100% rename from src/tests/pages/apps-share.test.tsx rename to apps/web/src/tests/pages/apps-share.test.tsx diff --git a/src/tests/pages/apps.test.tsx b/apps/web/src/tests/pages/apps.test.tsx similarity index 100% rename from src/tests/pages/apps.test.tsx rename to apps/web/src/tests/pages/apps.test.tsx diff --git a/src/tests/test-utils.tsx b/apps/web/src/tests/test-utils.tsx similarity index 100% rename from src/tests/test-utils.tsx rename to apps/web/src/tests/test-utils.tsx diff --git a/src/tests/transactions.ts b/apps/web/src/tests/transactions.ts similarity index 100% rename from src/tests/transactions.ts rename to apps/web/src/tests/transactions.ts diff --git a/src/utils/SimpleTxWatcher.ts b/apps/web/src/utils/SimpleTxWatcher.ts similarity index 100% rename from src/utils/SimpleTxWatcher.ts rename to apps/web/src/utils/SimpleTxWatcher.ts diff --git a/src/utils/__tests__/SimpleTxWatcher.test.ts b/apps/web/src/utils/__tests__/SimpleTxWatcher.test.ts similarity index 100% rename from src/utils/__tests__/SimpleTxWatcher.test.ts rename to apps/web/src/utils/__tests__/SimpleTxWatcher.test.ts diff --git a/src/utils/__tests__/addresses.test.ts b/apps/web/src/utils/__tests__/addresses.test.ts similarity index 100% rename from src/utils/__tests__/addresses.test.ts rename to apps/web/src/utils/__tests__/addresses.test.ts diff --git a/src/utils/__tests__/chains.test.ts b/apps/web/src/utils/__tests__/chains.test.ts similarity index 100% rename from src/utils/__tests__/chains.test.ts rename to apps/web/src/utils/__tests__/chains.test.ts diff --git a/src/utils/__tests__/date.test.ts b/apps/web/src/utils/__tests__/date.test.ts similarity index 100% rename from src/utils/__tests__/date.test.ts rename to apps/web/src/utils/__tests__/date.test.ts diff --git a/src/utils/__tests__/formatNumber.test.ts b/apps/web/src/utils/__tests__/formatNumber.test.ts similarity index 100% rename from src/utils/__tests__/formatNumber.test.ts rename to apps/web/src/utils/__tests__/formatNumber.test.ts diff --git a/src/utils/__tests__/formatters.test.ts b/apps/web/src/utils/__tests__/formatters.test.ts similarity index 100% rename from src/utils/__tests__/formatters.test.ts rename to apps/web/src/utils/__tests__/formatters.test.ts diff --git a/src/utils/__tests__/gateway.test.ts b/apps/web/src/utils/__tests__/gateway.test.ts similarity index 100% rename from src/utils/__tests__/gateway.test.ts rename to apps/web/src/utils/__tests__/gateway.test.ts diff --git a/src/utils/__tests__/helpers.test.ts b/apps/web/src/utils/__tests__/helpers.test.ts similarity index 100% rename from src/utils/__tests__/helpers.test.ts rename to apps/web/src/utils/__tests__/helpers.test.ts diff --git a/src/utils/__tests__/mad-props.test.tsx b/apps/web/src/utils/__tests__/mad-props.test.tsx similarity index 100% rename from src/utils/__tests__/mad-props.test.tsx rename to apps/web/src/utils/__tests__/mad-props.test.tsx diff --git a/src/utils/__tests__/safe-hashes.test.ts b/apps/web/src/utils/__tests__/safe-hashes.test.ts similarity index 100% rename from src/utils/__tests__/safe-hashes.test.ts rename to apps/web/src/utils/__tests__/safe-hashes.test.ts diff --git a/src/utils/__tests__/safe-messages.test.ts b/apps/web/src/utils/__tests__/safe-messages.test.ts similarity index 100% rename from src/utils/__tests__/safe-messages.test.ts rename to apps/web/src/utils/__tests__/safe-messages.test.ts diff --git a/src/utils/__tests__/safe-migrations.test.ts b/apps/web/src/utils/__tests__/safe-migrations.test.ts similarity index 100% rename from src/utils/__tests__/safe-migrations.test.ts rename to apps/web/src/utils/__tests__/safe-migrations.test.ts diff --git a/src/utils/__tests__/safe-version.test.ts b/apps/web/src/utils/__tests__/safe-version.test.ts similarity index 100% rename from src/utils/__tests__/safe-version.test.ts rename to apps/web/src/utils/__tests__/safe-version.test.ts diff --git a/src/utils/__tests__/signers.test.ts b/apps/web/src/utils/__tests__/signers.test.ts similarity index 100% rename from src/utils/__tests__/signers.test.ts rename to apps/web/src/utils/__tests__/signers.test.ts diff --git a/src/utils/__tests__/tokens.test.ts b/apps/web/src/utils/__tests__/tokens.test.ts similarity index 100% rename from src/utils/__tests__/tokens.test.ts rename to apps/web/src/utils/__tests__/tokens.test.ts diff --git a/src/utils/__tests__/transaction-guards.test.ts b/apps/web/src/utils/__tests__/transaction-guards.test.ts similarity index 100% rename from src/utils/__tests__/transaction-guards.test.ts rename to apps/web/src/utils/__tests__/transaction-guards.test.ts diff --git a/src/utils/__tests__/transactions.test.ts b/apps/web/src/utils/__tests__/transactions.test.ts similarity index 100% rename from src/utils/__tests__/transactions.test.ts rename to apps/web/src/utils/__tests__/transactions.test.ts diff --git a/src/utils/__tests__/tx-history-filter.test.ts b/apps/web/src/utils/__tests__/tx-history-filter.test.ts similarity index 100% rename from src/utils/__tests__/tx-history-filter.test.ts rename to apps/web/src/utils/__tests__/tx-history-filter.test.ts diff --git a/src/utils/__tests__/tx-list.test.ts b/apps/web/src/utils/__tests__/tx-list.test.ts similarity index 100% rename from src/utils/__tests__/tx-list.test.ts rename to apps/web/src/utils/__tests__/tx-list.test.ts diff --git a/src/utils/__tests__/url.test.ts b/apps/web/src/utils/__tests__/url.test.ts similarity index 100% rename from src/utils/__tests__/url.test.ts rename to apps/web/src/utils/__tests__/url.test.ts diff --git a/src/utils/__tests__/validation.test.ts b/apps/web/src/utils/__tests__/validation.test.ts similarity index 100% rename from src/utils/__tests__/validation.test.ts rename to apps/web/src/utils/__tests__/validation.test.ts diff --git a/src/utils/__tests__/wallets.test.ts b/apps/web/src/utils/__tests__/wallets.test.ts similarity index 100% rename from src/utils/__tests__/wallets.test.ts rename to apps/web/src/utils/__tests__/wallets.test.ts diff --git a/src/utils/__tests__/web3.test.ts b/apps/web/src/utils/__tests__/web3.test.ts similarity index 100% rename from src/utils/__tests__/web3.test.ts rename to apps/web/src/utils/__tests__/web3.test.ts diff --git a/src/utils/addresses.ts b/apps/web/src/utils/addresses.ts similarity index 100% rename from src/utils/addresses.ts rename to apps/web/src/utils/addresses.ts diff --git a/src/utils/chains.ts b/apps/web/src/utils/chains.ts similarity index 100% rename from src/utils/chains.ts rename to apps/web/src/utils/chains.ts diff --git a/src/utils/clipboard.ts b/apps/web/src/utils/clipboard.ts similarity index 100% rename from src/utils/clipboard.ts rename to apps/web/src/utils/clipboard.ts diff --git a/src/utils/createEmotionCache.ts b/apps/web/src/utils/createEmotionCache.ts similarity index 100% rename from src/utils/createEmotionCache.ts rename to apps/web/src/utils/createEmotionCache.ts diff --git a/src/utils/date.ts b/apps/web/src/utils/date.ts similarity index 100% rename from src/utils/date.ts rename to apps/web/src/utils/date.ts diff --git a/src/utils/ethers-utils.ts b/apps/web/src/utils/ethers-utils.ts similarity index 100% rename from src/utils/ethers-utils.ts rename to apps/web/src/utils/ethers-utils.ts diff --git a/src/utils/formatNumber.ts b/apps/web/src/utils/formatNumber.ts similarity index 100% rename from src/utils/formatNumber.ts rename to apps/web/src/utils/formatNumber.ts diff --git a/src/utils/formatters.ts b/apps/web/src/utils/formatters.ts similarity index 100% rename from src/utils/formatters.ts rename to apps/web/src/utils/formatters.ts diff --git a/src/utils/gateway.ts b/apps/web/src/utils/gateway.ts similarity index 100% rename from src/utils/gateway.ts rename to apps/web/src/utils/gateway.ts diff --git a/src/utils/helpers.ts b/apps/web/src/utils/helpers.ts similarity index 100% rename from src/utils/helpers.ts rename to apps/web/src/utils/helpers.ts diff --git a/src/utils/hex.ts b/apps/web/src/utils/hex.ts similarity index 100% rename from src/utils/hex.ts rename to apps/web/src/utils/hex.ts diff --git a/src/utils/mad-props.tsx b/apps/web/src/utils/mad-props.tsx similarity index 100% rename from src/utils/mad-props.tsx rename to apps/web/src/utils/mad-props.tsx diff --git a/src/utils/nested-safe-wallet.ts b/apps/web/src/utils/nested-safe-wallet.ts similarity index 100% rename from src/utils/nested-safe-wallet.ts rename to apps/web/src/utils/nested-safe-wallet.ts diff --git a/src/utils/providers/UncheckedJsonRpcSigner.ts b/apps/web/src/utils/providers/UncheckedJsonRpcSigner.ts similarity index 100% rename from src/utils/providers/UncheckedJsonRpcSigner.ts rename to apps/web/src/utils/providers/UncheckedJsonRpcSigner.ts diff --git a/src/utils/relaying.ts b/apps/web/src/utils/relaying.ts similarity index 100% rename from src/utils/relaying.ts rename to apps/web/src/utils/relaying.ts diff --git a/src/utils/safe-hashes.ts b/apps/web/src/utils/safe-hashes.ts similarity index 100% rename from src/utils/safe-hashes.ts rename to apps/web/src/utils/safe-hashes.ts diff --git a/src/utils/safe-message-guards.ts b/apps/web/src/utils/safe-message-guards.ts similarity index 100% rename from src/utils/safe-message-guards.ts rename to apps/web/src/utils/safe-message-guards.ts diff --git a/src/utils/safe-messages.ts b/apps/web/src/utils/safe-messages.ts similarity index 100% rename from src/utils/safe-messages.ts rename to apps/web/src/utils/safe-messages.ts diff --git a/src/utils/safe-migrations.ts b/apps/web/src/utils/safe-migrations.ts similarity index 100% rename from src/utils/safe-migrations.ts rename to apps/web/src/utils/safe-migrations.ts diff --git a/src/utils/safe-versions.ts b/apps/web/src/utils/safe-versions.ts similarity index 100% rename from src/utils/safe-versions.ts rename to apps/web/src/utils/safe-versions.ts diff --git a/src/utils/signers.ts b/apps/web/src/utils/signers.ts similarity index 100% rename from src/utils/signers.ts rename to apps/web/src/utils/signers.ts diff --git a/src/utils/tokens.ts b/apps/web/src/utils/tokens.ts similarity index 100% rename from src/utils/tokens.ts rename to apps/web/src/utils/tokens.ts diff --git a/src/utils/transaction-calldata.ts b/apps/web/src/utils/transaction-calldata.ts similarity index 100% rename from src/utils/transaction-calldata.ts rename to apps/web/src/utils/transaction-calldata.ts diff --git a/src/utils/transaction-guards.ts b/apps/web/src/utils/transaction-guards.ts similarity index 100% rename from src/utils/transaction-guards.ts rename to apps/web/src/utils/transaction-guards.ts diff --git a/src/utils/transactions.ts b/apps/web/src/utils/transactions.ts similarity index 100% rename from src/utils/transactions.ts rename to apps/web/src/utils/transactions.ts diff --git a/src/utils/tx-history-filter.ts b/apps/web/src/utils/tx-history-filter.ts similarity index 100% rename from src/utils/tx-history-filter.ts rename to apps/web/src/utils/tx-history-filter.ts diff --git a/src/utils/tx-link.ts b/apps/web/src/utils/tx-link.ts similarity index 100% rename from src/utils/tx-link.ts rename to apps/web/src/utils/tx-link.ts diff --git a/src/utils/tx-list.ts b/apps/web/src/utils/tx-list.ts similarity index 100% rename from src/utils/tx-list.ts rename to apps/web/src/utils/tx-list.ts diff --git a/src/utils/url.ts b/apps/web/src/utils/url.ts similarity index 100% rename from src/utils/url.ts rename to apps/web/src/utils/url.ts diff --git a/src/utils/validation.ts b/apps/web/src/utils/validation.ts similarity index 100% rename from src/utils/validation.ts rename to apps/web/src/utils/validation.ts diff --git a/src/utils/wallets.ts b/apps/web/src/utils/wallets.ts similarity index 100% rename from src/utils/wallets.ts rename to apps/web/src/utils/wallets.ts diff --git a/src/utils/web3.ts b/apps/web/src/utils/web3.ts similarity index 100% rename from src/utils/web3.ts rename to apps/web/src/utils/web3.ts diff --git a/tsconfig.json b/apps/web/tsconfig.json similarity index 96% rename from tsconfig.json rename to apps/web/tsconfig.json index a62d5ebc10..421a51de55 100644 --- a/tsconfig.json +++ b/apps/web/tsconfig.json @@ -37,7 +37,7 @@ ] }, "include": [ - "next-env.d.ts", + "apps/web/next-env.d.ts", "src/definitions.d.ts", "**/*.ts", "**/*.tsx", diff --git a/yarn.lock b/apps/web/yarn.lock similarity index 100% rename from yarn.lock rename to apps/web/yarn.lock From a363a78dd609de7b658af837a705e69fe74080ad Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Wed, 18 Dec 2024 15:06:44 +0100 Subject: [PATCH 02/49] chore: setup monorepo add readme --- .nvmrc | 1 + apps/web/.prettierrc => .prettierrc | 0 README.md | 158 + apps/web/README.md | 78 +- apps/web/next.config.mjs | 4 +- apps/web/package.json | 8 +- package.json | 26 + apps/web/yarn.lock => yarn.lock | 10731 ++++++++++++-------------- 8 files changed, 5300 insertions(+), 5706 deletions(-) create mode 100644 .nvmrc rename apps/web/.prettierrc => .prettierrc (100%) create mode 100644 README.md create mode 100644 package.json rename apps/web/yarn.lock => yarn.lock (76%) diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000..0c163eae58 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ + v22.11.0 diff --git a/apps/web/.prettierrc b/.prettierrc similarity index 100% rename from apps/web/.prettierrc rename to .prettierrc diff --git a/README.md b/README.md new file mode 100644 index 0000000000..284f33509a --- /dev/null +++ b/README.md @@ -0,0 +1,158 @@ +# Safe Global Monorepo 🙋‍♂️ + +## Overview + +Welcome to the Safe Global Monorepo! This repository houses multiple applications and packages managed under a unified +structure using Yarn Workspaces. The monorepo setup simplifies dependency management and ensures consistent development +practices across projects. + +### Key Components + +- **apps/**: Contains application projects (e.g., `mobile` for the Safe Mobile App). +- **packages/**: Shared libraries and utilities. +- **config/**: Configuration files for the monorepo. + +## Getting Started + +To get started, ensure you have the required tools installed and follow these steps: + +### Prerequisites + +- **Node.js**: Install the latest stable version from [Node.js](https://nodejs.org/). +- **Yarn**: Use Yarn version 4.5.3 or later + +to install it with the latest node version you can simply do + +```bash +corepack enable +``` + +and then just run + +```bash +yarn +``` + +This will install the required version of yarn and resolve all dependencies. + +> [!INFO] +> +> Corepack is a tool to help with managing versions of your package managers. It exposes binary proxies for each supported package manager that, when called, will identify whatever package manager is +> configured for the current project, download it if needed, and finally run it. + +### Initial Setup + +1. Clone the repository: + +```bash +git clone +cd monorepo +``` + +2. Install dependencies: + +```bash +yarn install +``` + +## Monorepo Commands + +Here are some essential commands to help you navigate the monorepo: + +### Workspace Management + +- **Run a script in a specific workspace:** + +```bash +yarn workspace + + diff --git a/resources/icons/safe-icons/fonts/safe-icons.svg b/resources/icons/safe-icons/fonts/safe-icons.svg new file mode 100644 index 0000000000..38a4513088 --- /dev/null +++ b/resources/icons/safe-icons/fonts/safe-icons.svg @@ -0,0 +1,112 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/icons/safe-icons/fonts/safe-icons.ttf b/resources/icons/safe-icons/fonts/safe-icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..95dd9880525ad0a730ec1795eea922b6ead665d0 GIT binary patch literal 24648 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 literal 0 HcmV?d00001 diff --git a/resources/icons/safe-icons/fonts/safe-icons.woff b/resources/icons/safe-icons/fonts/safe-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..13341da035449dc47c53a40438bd946650783ef4 GIT binary patch literal 24724 zcmeHvd3aoBdGGnoI%n2%=FC2$Sv50~M!Pf`%d#ceNxZL#B`0y5#EF;KPHdBykc2># zuw;SIu%sLtdPy#g}ZMhV9dLgDwDS04G11Y_iG;M+QqLcf3zjKZ>Qf#x_ z{&Sy)k+p5*Q4CtGYCFU&(GfVZ1|>q zx1rywKZbabKX4Ko1`-@pAn`dJV;@9yibt_crOU$kVoMhzNu7BkcAca z^<$+({4t^U!c8yFzx*=N1cU`1W-tFkQg&{+293}8uy6CEt3R?4;2Y;YN21k=)L*Ga?IU{LU?=8_?1XqU9X)NP z)8^@D+Wt%-kt`IFiGsMFF%#!gK4%yghRvVjQldL{k ztCUqIt=SGl(s>Wb`RC89&P=8nN{F?Rls2Pj7EFlMGTXg+^=>*5Yuy9E&a|&Vd-#0o zaYwpRNk=V{Wt$D1j#eNVHAF;K&CIMONVA{!pbY4i&M*+$8DPynz`7Aa>1PA{H_Rf8 zPKEcIX9Y&+$NQaRQ;g1u_e=E<9~!JVwNQ3xc+6=XxkH2P;e^u)a)$=n!>ZF8Z_^8l zhf9%iG+K_70%}+{OJ>FJg;X`zU4`)ykakOd4q8VSvbgalg=>Y^3HJzZ6CS~S3?+w>^$KoB3#X(tF7j{I8fsZXnwm%s zDTz=&#f2c@-! zrX(k;+DdA5?466=Mr&HzZNXNGd#_=dsekB9Hel`zvygb?t6%IF2hytx#nowcWI!C0 zL{Sp$r;P4+I2){d$Zu)lxPg!TyGAXM=!zJoX|N-adOXo(*njoCjunY}zicp5V&FJ3=;{j6Bc_w?lRjYi(*_xm)zU;4aw#U53i|C7&V*B7n`*CXuU{F9IM z-_w^$CR6OnfxG*8?<^mQsG6M@H))!ENu(B!*TeRQ!(k&r;aY@U8IBl0YTp)<@w-27 z_8S^w?2xF5nosuyufFu^OYJ}J?&#>IXH3^rzhBjKqRT<&Tn8K(6D}6+7akYR2>(O) zuJEGppUlsa*fk>62!|yI!6j&4Y8u5C{!xI+a3TY_-hXSTi3&vEC6Y-m5xG>D%5!A6 z&`6#aMd`sYY-h7J+8nG6VJ}Aqfo7Y8edD;{7ds_9JuW8Q#yo&n=p2F7tdwjGsyfKB zB#y3@q&v^)4^bLOE6+NZH{cpTi4T=VHqt_gI!bpit%9OW0x0S%8KX?hhCSB5TKAQT zd;0sWLP7G!V;6UIb!2^}9<7>YP8Ve+`c$74kODqm)F1CpBKmqf-CD;z0XO3?R7 zJry?VF+Jw@$Nae-BNA66S(ZbZ(UVLLCIT^CH?&yRr}-o%q9PMj#rG*$l|)&THAzw_ zjY*O(XXvJ1j|H@dhW|)063GM<%&5%35^!In(ng%{Yv zFT7wM-Lq!v3-rhWeb3*^=0`Tp-z%>9!H0hE1M!A6d!AlBf9dp|zggCh z7F~FRsBuV86aUWnt*II?aT%i@stn;w4@DSgnz}Lx?7(Rl>ZV*-<(_2)Sbn8<<`S`Z zk9XFjA4trU)L+D$4HcE%72StNy0_&^sbnd?t!MOT&x&4!0~=#0z#da1)d<8^6sO5s)j!{R+xNntgE5>WM+RqQ7R=^kx4$i(LMIyWMM4kH&l^#mjYml zOp+U8vB7kDFgDh}2xz=1-k>DUP=`6AwZB*@DlF6yp-^em$c30(Di!y)A{`;7Aaj2U zD3;)78IR3rSLr{or$u2Siqz`0vZh9u8Y{5G@Dv+sjSYiGbi$*cO_7h>@&H@%8%sJR zhN&d3*3r7uKe>JThqiB@OlaE0vQO^lZMAN0wR&@sE?ul?v9C|6QT0ituqWGoCsh@k zFVb=7C>;@1d~h;fDC8&Oh+ia09gR3XjjSYHgaqp^SE=fsiQ=Dm->XzpwO{gLER3i_ zpNr38j>OvtRhm~4!yLnWIKa{6PXszZ*St_B%LhAyANfeI5();Nlr$OBl646v^2t!> z{5g+>LLdG}Fc_+!j)L98{wdN|5M^mEC-fCb5ou#ZC&%3@>1n<%;3#MlVj6B1B1phV z;RY#)O|ap_XPM&bKiYY;TCLh|j1HtzgHij=Zr^ZyU+L|}rqR|$cJs%pRpi@uMPsoj zySw|=N=K;jHtF?jYHY)%QF{mt(j0-Fj=EeJ_BCU`o6a^#Y)gD`*Imt;haJ=Lw5Kwb`tm;}O5stWk2UX}^cQ zDP}+7rO`MYShVu z-qWglzdz^q`%nA_zB>H&Ph?y;9A`*n%sIj3Y73)giy+B9f*bdbX#~FavrBz61p5(; z;m5M_SziXR53?Fkir&sCma8TS_VYNLVbEqk^tb~quu4C; z_N~#TWwGez@bflHj7FQW^Do7UJr7w?t7$!s3U5M%m>8vf=5rSR9diaeSG_~#oIx6g z%NGoKTbN|ujT=V%J%K_X5O@kiLPXaiAex>+v=I1;xZ6l1jQNkhKNt)Y15Yy$%05kG zPa_hfYu)YdKhU3rNFwIq*G1?M|3lM$s3q`dzPNVwtQPl)*@OVhrkf*8@h{AEpR zZwJ!=bOC!4K91q89H0x6q2$tL*!pFyxMR898B3MpdEO4tPXtIarir&NtD^no@>YEd zb8_2p$3gR|)3ET>V)rg@NBsOb8amgVwJ58K3Ee^yJh=e!8C(~U8<30wFM?^Vm$cRh z@z`8=R{|=+PEIhZ4JU#6rfQr>VFwRh+*q}$A>K#d7az30e$keqkHU2D}V}=}kJh$waalBN2AI$!RxL z8|oo;yRw?OqIV(!%Y);fJ*ZYazKS*RALle9MBYQvbUM9z<;sh$+_B@fYE@=Tu9R=t zyk(XMFu!uq%9Xp*Y5R;4RM_n1EjL%niqcuVefy3p*_pK~CuTG0xl;L-ZQHI8)u4iZ zHoIl>EtLwIxhun)wWrWvg*T`KRs4%rY}$fA&BdEkF9aO2q~6kMUajSImiD!@j<{HfpARTw=>Elhq!Rpa z@L@tVO9RSQ#j`Xhgcrue%LDbamya)2U|xl+I}fk@>N(r@O1p62-H%(TeWK|xCcd%1 zj$WVz7Coq`UTMbc~t}N3xQS>gP#Jm^<0o>w7-1E`LBcX34=GGg-~bk z!$B7OCu)xczkWZhr6bdz`5KUFbb=Qf7gh^fg}uT}kVZX-`2)-yF&;_cfNUgiWASB) zly=U7jzrIsXX)&orIUR2>_YhGXW3aNjpv>{GouHC`ive5 z{cIt0|3c_B3n6C@=I?aKbn*|UcRvhu~%b_=`@nq)Pa1G#Kucrnj@J-tiec#$3?G>m=&=JR-)U%6T7VR%*{@a}=Y; z!6iVmXNYogb)yd7M)+kNB+;B=ckm@i!Z@Q196E%H5GN2TgA?Si)N~;Ezmpg@9r+lS zctL(uaZxm9i|EusCI#M_Bz~7@r)AoLHoF=uXh--FC&#&+h{arURzWBav&^|^h#uF zZyl2~DQE@9-*p9NdYJ;5i=2|AR4zA-@rUwev?~@$`BB`6X7Jst=_~+-S=1qHkys*w zb}~`>rP|3pzZEESwP`E#Rw-`~wCIftpze z2jg6A?%Zz#cL`yH)BUudz)XuEMPy;cIwu9|-i78lk)Vqp*&HOjx*EBO_S>(|sX=v) zuu&%KsGr-z?dq%cFq`)4k+Of|mqJp{67eK9^gbauz?$j8EIaHrw4&1pq zc;wfm2hD ztA;sdcF6v0b{n)}+wbjKgH{yNd>@L9pd8=`#dx!W10$DAPVKK$LXs5~zl+S#9`J<0 zP$Is4Y-~+5FSBT5q^D=KX>MB^M;k^_83cTV-is#fZ%8q7w6||M8r`-ghD@|Ss2B$2 zp-gzRyIdL!hLXw4R*YX1?Es|ZVE#WNx?istulENs z(P-wd_)x4TF|%veLoKJ>HEVXcG2NewSvk#THF{o!M%NCHtb(A&jag;mVzi7FKW-(Z z41UqR_HThMGphS9*OI}%h;?+tPC*9M#vgX#ya^0g49gNXxo8SB*D0#Gf`X%;F>pC2>-fh(+8b&Jfwz3k{8(cCQS&IK(UFe@G(} zF%yy>U2tT-rAHR%iQm#ApjMWW7XOv>h{J#X2skYVtFIYhAI^b$F)YRB?xhiT*+B0y za1ft!btErzXT}{~i=Q4*xNOUoy9S3kI)(=C+Op-crLooHE3dD2WwTxN>sOAirdU@! zo2_?ItgExqg!0m8RywKY%H;_39B$*IkorzZEL@mUP-GtKF~z7;F_`lf;D z+rooJgc|FvbT%XSG&?KZ)NsVOZoI2|e7w7B+_fVjyq^P)zezZPH6k4EFvK97lAx!& zOI6j9Ng}d1myC=iM|fJ&a%hG+iYCE7b2-Hbl+P6f(sy8&0;mqnTk^4%ixq(p*{cg{ zN~>3_*jMk$B-eId(wa%<1_xfZY4fFH2M0F2j>%$ml&#nOhd0K%%=O`kR_mI2Efc9H z53yt0pn>iUWUzSn>c!v#mF>UMB7muMCC4 zwa{>N_t5%@2~_m^pm5f-Pz{W>CsUZg`WfJ=AX6aTlkg~s;|P(Orf0H8H)ev!3x0=o zFi5T2B|&w~lkzNBB4LFkQ1bRHAy)?4JQiEmKhWHIcU}t{MoEj!j;!Br&owu1Zn9I& z&4bl5wM?cK)H!t)c$iz7HK?wAmi^&Kvwz@{cx+|^Dyku4aK-+0jm=H_?C6#)qpZ=h zCiE<^-;tC)K{Y1yG@qYyhMf6j&ND+s!t4^=9LmC6IqlGaeQ%%QuQ0=x1L!hAhiG*>foRJ|AleCTeVt2^Lw!>d-3zN#mJ0ds|WQ+02ls15%0$#%o zh@cY$>f)ci)hGccnM3jZCc!p`yWorN?M-0_tqFV?pqhPp;kv$phhZ;1IKsv0q5pA<^UvCVzG zTP&?;m|^wbT4)zTi1~b*CJji)%SLyp)E^24{M}{|P#r(}7B?3bq`X2(f<&Q0JEvh}Jbi|}L@o;<^0GUH;yT{HGfG@aQzI=X&vV(G%g zyP^OhU)dz*1Jy{ufy%E>Sm(KMC$-7|!JW(b2Vh89<9zBM^DeXP63%I#aaTGwTv zuhz?vh+j9&SbX-PwR^+RWGe;pzb$QRCYnk??cngrv^Jx{G%V$Ws&mQlBYTeZSUjlS zdeG5q7febX^-Nj=N1?HxNRXaN7Yf@32FC|hnuZ5Nra3X#x~dkC!r@Aw_t=K%(b3C_ zr7VVQn6mvh9&mioeg{YY$AUy#hjxYVPm0~(mR%QLyuVb6U@7`)9^lmaCa%jyCi~GO z8Xj%N+as1&zp%Yee3qm zOyN>MX#M{E>-#n*jY58NcXy4>oe_S`(Vdq!-ZJeT!q*%*@)~C`alRa$`MrRl6~e2q zQec5e*~qU7*d~a$@1aNHz=Rx5|K!<}2)d`AA(wKdnC4a@9vT&Rah^@)DJaa9ie6Kc z+Zvk^+0QbS-oC4Pdn*+)DjG)7H`m$QdsSa=MGLBa6#(Uj&cFAy{p#I)ee{z7$OM>Q z`mS3{(UpKqaED{JP^?cY0wjW>Un*64d-t}tE(KGSC_a^Pqj5!Vqf@)P5;e_eMGO1T z7p!y9U_%lrOu?7{kaAd7<%ZPd7VFZAfMb*@cAC+s+3B=h z@!gHJb?#-78`AmQ0?ZGsMy=lBc*vnUfx_cjKZ&FfA_!ZcJzct#&hiqJ*QORw+EL+Y zS$aA)UYgv!dvbC&d(IlnQZPGcJ;x|z_he~2_B5==rd6FM25+Opy$)Ls$i@Xo7LBIL-FJ3s5lk2Men`dO-Z3>88^8|(pW$~kOx92`P4BWVsvGD3F-xn#J6@dQ{5 z5`ZTavg59V8QE9WTh5h?%_Fm7@ys+~1Y4l*=}2$pJDJ{yeN&$(^l1~d@6;x=%YyoM zNHUKv2`7Ahj*oh-GHj(%*3A5zI9DASs>Z1Zo`w66U@8MGNH@mC#WjvHb~OgcHL@5a zq*El!fl(Spr(lRBHplT3o2?ADC!9^^Tl|a-W+g0_4nxWfYr1gcL4Loj0=Xx3@TTxiqo}0RmWrw<8ufFfTyH02k)H`ygdW2t^4i`EOZROeh~w~_BuLiiQuj#Y!EgJR|q!p+J zd(BM7jAk;?N8E&{dzZZ*YnKzIux3krqn7GN9li!@0@e94u?UbbH&{Epz`cRxbXc+G zKtDJ+@n4^Z&sz4X$*FZ*jhW4IXQ_!Jz0VUlBF38o1DC|`xny9V>2R!0b$jFUy+^p) z8mjO*>!v2J%4Tcj=gFvz_TPay!krpmj?Qc$A@Ln76g(0vnxa_>&VP>Z_s?-4G^U-aRR1JE`^=$5XA{ zYt0F-^#uYx_P=aPd|e0)NHChE z`~5^PTVHH2yo6#?C*ha~5|iW3XJW{c4Q8C@V{aoVZDzVt<*PxlpFpz<((m z{Spqg<2Qq&xj917Tp7L?I{!*@c$!`!TN+I^eL#eHmf=qb&7}UUDai!jZjKzoiSGw_LsVNLzUN6)A46 zOQ#7Kdjh9)0CFdRTLyB6E63=O`&xl{10kbnq~|35EUvbB;&N1{eR24zY0S+KN|5-k!CepPoOlN!!W~cU2p zt7gSH;;`oV_qoI3_o)OP+qFWgGB4n+72)c3I7ljvpkl|K91_P6iw<-_b2c1t)9f4GQSDB{=7 zlPn#Qi=lt~J$yceT7UYdXe3;~>mB4Lv_klag`~WXlF+Dko}^8fYaVOt z=xT;Iqd~OFAcS2c-KY`Gp8QOyr)Nthn>J_7bSAsG(Ni>2nfX7;CJpg__KdammCK%& zd%3)?HP#a!7>E<>Irm2ceE=i4R5^qkoG4ep-azQ+(c?cgx)bcyM7Lp>0lyyiz4)Rp zuKNR~A>|EtIKv@q{@s2{ftSjokHQB{WPSpHCJAO?xv7Ki1X4Dq>uANO-`SSg}CI`X_cD9)!{_&?Q}sF9H>;O|FUaF z6b7&E?cH94CkeNRQgqperBygPat1M|8X#2>;TWh!d{ALJ9iM%9a6*KBS}#9=>l@z8n4 z^7LnD$e+RBvx^~|JANkkT^ST^r!%qW`BJHp{2#Ix?6f0c;8rRwr$nH}frr#18j+#o zeT4Hw-lq5gXb@z@IBz`#TOYFb0i3unOXfb{2ccv^C)A`UY`O8qE%dN^u?OODa%mKg zh?*kn${S*RDT|xVDc@4yt)wt3-H5*d`VuHQ4oi^b%f}ZgNr!Pkz9HU7FRPL2i@ia& zHP$=k8D{6iSD7i9U2Ce_DppN*sx#{r8evD1Cg&z5aA$gmw$r*leG; z3l&gp#;xO1rO`-cSq)=UQhjcDh;uyrLwt0ad`9>iUYtw9p^F{o1XuXr`4~XROVl)$ zw8G{9Rxb-gB`|@rB+ot@3W0rR0y07&ih-tQLMVh%hVNl22f-XNDGgcAK8r7^?}e!( z!qljD|38B9t%A1m5SLqH&xm*-k#&+(`;K83%(g@z2_k2vM3@m0h|m|x(uRU0NII{B z0LIa*GH4%Gkofik0tzDSJ+{5xgolFyI>|wE(%n#rg(WFsni(xBYEWaCkz6293d#3( zl#Z?NwTAO@$NfPT3H29iUERBS`}!=s_nwP7x`X!D4#12~O{L@yJ=eS;uiF0|n<(n} zSgad%ckmQuJFG07H^1te|3u)xhgP2)g*aT=i!P%*-Pa8b7JZh#uhF=y-c>CQghP^F zdLUowZD}iBRZ%(~2vvjr4#R{wocyqu%BEENlQaUeJ02_e z;3SF9Wr52{C_a{~ds z*fqR^ggn3N&2czqSL*N=g$DvZg>>wk>jF{uD5&L%w#)@}BuBRh{Ug(JL2W5$k6(R+ z)R*|6J|!^&KB)U}BH>HiJyO4Ru(m!|h$jlU_4UE)>m%K+PiK-)wk#O6b$ErOfD3P*NjGTK~X9c3)eK^e;Uk1Mz1Lr3Nk|B z<~2x`rK+KbfFkZ8t>Aqh1KF`V2P!q6Cb3_{a=F+q7!F&lbKuUg>;T^Wfu5*n+!=6n zAlj2i^h5`$=pV;F&Kr~D&5Q*yp~1^@9XXi=(&53~9UVDoFq8?v%{AB2v3oF_4lo(n zm*c#;^uq-9t(PP&f{9_%CXH4H{zpc13kw`^@p(spQDlvBRMkFKiE=87=yX+^Z z5W6{635O!lP%xTGBv%&fw|RvyW4dJTLIr7pDyH@Isd!?%Fd2$QLzB^RI22w_UFmnq zK~)XPciLM~W4-vEQ4ix?@=DjKLz7#FI4u8Id{~Vl$i&`ghjZ5$=xs zbGF7lZ;e@&Wv~BswpPp958?86hY;aIsAa{ywd}W1%tAqXJw%i>y6PpSVhDk| zNk_Mg&hs)N%FL$Cd0s#Stv&z!#drBQbR_X6DM-6%PuvCY439dv;E;9zN{mtyyTp0B zPGlPNK)55Eg(A-q!ge?+pgl;-;>trycohv%=8NlhdTh&~TW`hGp@ zqO|$h?vyE>GE*sYe%4G$H*FcSXU4Ydbi@c&W+$ql@;xxwH|!ZI#!eF)D+|6E6-Z-8 zAnV?NwIl5SsRkN-@p5$Yus>Fm!Gvy(X^_R3n zL@`sMEhG%ZOuK0!OdiEkXGz&i59wd<*xxi#V%kLMbX1D>msDFoc|@ryB_c_rq#5W( zPCHfC@1OM)+OsG|Z`i^QyUU`ZM;1>2@&|5a`S}ZoU|h%jz~iX;nl!2 zae9t$9UZS)#d3&25*u*2I*~d2-g2!6iINb76+=TC;RqkoB2o?S{*c6YBns>txh(?3 z9gW06{RgE^DWb(tYU9w*ijPVuwG;0j_>`yu`=%rqE*j0w&hGBcPBM>-NJkUATx~-s zkk{Ynk7}|{xhoPU)B9K~4A1m<v}Tuxzv^G@?&@tU@UsIkxUwTDk^?3n$jtJbri|*vHZF#Qv*N$`PKMm{q{-wTVni8 zvR{p@s4g}mrTZ#@INq|OC*Vh*`}EGPZHZWHv?DWQ#lok;mi@6vJRV_}TZqK0p-jhU zESA{THGhaT?Z0xKiw@G~fIl9n^q~d3GX)L#e=Ap7CS$sgTxk)`Jb%1V$l(qE&KBUP z%@0pmmPmeh7Vx^q#VMR70g$0woT!ZYkjGaHdD@W?&np^)VtuK9U7J(gf1I5qFJSTp zw$D!XInKcL!*>MBAk*)-17GFf9j^_PgDenu?Q0>=50-+z#Dra(cG`Q@cDNPu7Uy4d z8(P||6BAtei{!>-=!*mk+E+)-v>53@2ieYK0^g z#*3IjV5rStw4lZs2{i*(xTF~~lOmJKFz~CSK%$1iK@Cho&~K_nA(9M*l97U;n*N~W zk7&Vg2-GgDin`)uyeo!R1`V51Q;oQqw}K{^Z@l?Qk4SK>Q>9oUoC*e0XI#B9*Cn@y z*(ej^zEpo)>%gGguBk5EX{^loI=AZWonz#63nTZswt{${j#1zphf|iMMuXs7F?MI_ zR$h(wr8L}N?$n9CaPHWz0v>wEzJr^VF82$;KR1bz!UAc^pB1kH-8@bOT{?txkSjaj%l z9Yyg_=y6<)$b`S4FQU;)q7>;1;V_$vM2@qkh`+LXk4GZmuE90dKAY5iq5{`L{n|j$vNu>I|Fwu{is*wcn9jCCFLEi~?!mU}a=@O037h>XO!kNt z3$h0SarG#%8?V}w(-cdCe^}tn5I{uUjDTOW&}=SX_d$54ux|%)y4`{(;jds!`>-Ae z=nqSN@ba!6g6QomybX6_ULN(t_j2jmc{Rs<0z?m;`=xH>RW6JLPUH2+9RTxoBt#IT z^fPg8a;&v8nMx&hw#Fvg!;ax`oBb$+JBVaLvx0YfM8` zisFx7*^blZ?4nVw=`_SGn@wX~B%9mZ+cz}W*S9GL<8oN66x8^MOV%Bas|DDxcxypA znGD_pd@(?nX82W54&3{VAfE?Az#@U2A`U|K5iwV2|;9;Nj4LYa*-uT?o*o3&KCF z$nISHefbNJqW(GJ^!8}ygF5_O)I2$_sZ2 zUu74wGvd|KCOIL$sJ;WQxcRj9xUb)LpYM$C@Aa5|ss45Sr~Y;R*ZV){f71V>KroO9 zoD4h@+!DMYcu(-X!N-DM4?Y{ZG8_%RE&ThDZIQn)ZZuVMm-)fymC^55H^h9g+hRY8 ze=aebcrJMYm*QjT!SsFUcch=m?)N*29k1_rJijXcuKbhvmkQSw zK3Di@@y6o&i+^1zmanWBm1{d=oiA4JtbVB`)Gn^wQ+sRecWd9T@2X#2|KDA2?Ru`e z-2G^`-Q#N*jfWb)=)I@+pD{~<;G0>B-XwyL2kAWGeuafUa^alOTTb1u2oCDCZdgM4 zlpB^2e#i|g@Z-q4VHN3n-LN0HVifndVF~FQ-LQ=CBW_rMezw~U zt4KfOhW)S|{^~9J4j$+`eEsobw+Oeu1Mnc|>^^vrTrV8QyQ6QJJ#h0ahmRjC4)qTT zv&gy`g%0zqB9!C(!r+CgUpV*D1BYIHuJO%g(BKIfDjFKAL0ju{YbkGnjLyG9?fej9xB_9 No#Ddh_N`kQ{=a(icys^& literal 0 HcmV?d00001 diff --git a/resources/icons/safe-icons/selection.json b/resources/icons/safe-icons/selection.json new file mode 100644 index 0000000000..9bfbfc1448 --- /dev/null +++ b/resources/icons/safe-icons/selection.json @@ -0,0 +1 @@ +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M512 853.333c-78.763 0-151.125-27.093-208.939-72.021l478.251-478.251c44.971 57.771 72.021 130.176 72.021 208.939 0 188.203-153.131 341.333-341.333 341.333zM170.667 512c0-188.203 153.131-341.333 341.333-341.333 78.763 0 151.125 27.093 208.939 72.021l-478.251 478.251c-44.971-57.771-72.021-130.176-72.021-208.939zM512 85.333c-235.264 0-426.667 191.403-426.667 426.667s191.403 426.667 426.667 426.667c235.264 0 426.667-191.403 426.667-426.667s-191.403-426.667-426.667-426.667z"],"attrs":[{"fill":"rgb(255, 95, 114)"}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["block"],"colorPermutations":{"11611631671181918125521401255951141":[{"f":4}]}},"attrs":[{"fill":"rgb(255, 95, 114)"}],"properties":{"order":121,"id":103,"name":"block","prevSize":32,"code":59648},"setIdx":0,"setId":2,"iconIdx":0},{"icon":{"paths":["M511.949 341.432c23.552 0 42.667 19.072 42.667 42.667v170.666c0 23.552-19.115 42.667-42.667 42.667-23.595 0-42.667-19.115-42.667-42.667v-170.666c0-23.595 19.072-42.667 42.667-42.667z","M511.949 672.098c29.44 0 53.333 23.893 53.333 53.333s-23.893 53.333-53.333 53.333c-29.44 0-53.333-23.893-53.333-53.333s23.893-53.333 53.333-53.333z","M511.991 85.349c-21.419 0-42.837 10.667-54.741 32.085l-406.612 728.62c-23.168 41.6 7.040 92.629 54.784 92.629h813.183c47.744 0 77.909-51.029 54.741-92.629l-406.571-728.62c-11.947-21.419-33.365-32.085-54.784-32.085zM511.991 194.32l367.957 659.372h-735.871l367.914-659.372z"],"attrs":[{"fill":"rgb(255, 95, 114)"},{"fill":"rgb(255, 95, 114)"},{"fill":"rgb(255, 95, 114)"}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["alert-triangle"],"colorPermutations":{"11611631671181918125521401255951141":[{"f":4},{"f":4},{"f":4}]}},"attrs":[{"fill":"rgb(255, 95, 114)"},{"fill":"rgb(255, 95, 114)"},{"fill":"rgb(255, 95, 114)"}],"properties":{"order":120,"id":102,"name":"alert-triangle","prevSize":32,"code":59649},"setIdx":0,"setId":2,"iconIdx":1},{"icon":{"paths":["M512 256c23.564 0 42.667 19.103 42.667 42.667v256c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v-256c0-23.564 19.103-42.667 42.667-42.667z","M512 672c29.457 0 53.333 23.876 53.333 53.333s-23.876 53.333-53.333 53.333c-29.457 0-53.333-23.876-53.333-53.333s23.876-53.333 53.333-53.333z","M938.667 512c0 235.639-191.027 426.667-426.667 426.667-235.642 0-426.667-191.027-426.667-426.667 0-235.642 191.025-426.667 426.667-426.667 235.639 0 426.667 191.025 426.667 426.667zM170.667 512c0 188.514 152.82 341.333 341.333 341.333s341.333-152.819 341.333-341.333c0-188.513-152.819-341.333-341.333-341.333s-341.333 152.82-341.333 341.333z"],"attrs":[{"fill":"rgb(255, 95, 114)"},{"fill":"rgb(255, 95, 114)"},{"fill":"rgb(255, 95, 114)"}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["alert"],"colorPermutations":{"11611631671181918125521401255951141":[{"f":4},{"f":4},{"f":4}]}},"attrs":[{"fill":"rgb(255, 95, 114)"},{"fill":"rgb(255, 95, 114)"},{"fill":"rgb(255, 95, 114)"}],"properties":{"order":119,"id":101,"name":"alert","prevSize":32,"code":59650},"setIdx":0,"setId":2,"iconIdx":2},{"icon":{"paths":["M512 426.667c23.564 0 42.667 19.103 42.667 42.667v256c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v-256c0-23.564 19.103-42.667 42.667-42.667z","M512 245.333c29.457 0 53.333 23.878 53.333 53.333s-23.876 53.333-53.333 53.333c-29.457 0-53.333-23.878-53.333-53.333s23.876-53.333 53.333-53.333z","M938.667 512c0 235.639-191.027 426.667-426.667 426.667-235.642 0-426.667-191.027-426.667-426.667 0-235.642 191.025-426.667 426.667-426.667 235.639 0 426.667 191.025 426.667 426.667zM170.667 512c0 188.514 152.82 341.333 341.333 341.333s341.333-152.819 341.333-341.333c0-188.513-152.819-341.333-341.333-341.333s-341.333 152.82-341.333 341.333z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["info"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":118,"id":100,"name":"info","prevSize":32,"code":59651},"setIdx":0,"setId":2,"iconIdx":3},{"icon":{"paths":["M938.667 512c0 235.639-191.027 426.667-426.667 426.667-235.642 0-426.667-191.027-426.667-426.667 0-235.642 191.025-426.667 426.667-426.667 235.639 0 426.667 191.025 426.667 426.667zM170.667 512c0 188.514 152.82 341.333 341.333 341.333s341.333-152.819 341.333-341.333c0-188.513-152.819-341.333-341.333-341.333s-341.333 152.82-341.333 341.333z","M445.525 389.725c0-32.858 27.814-59.947 62.72-59.947 34.829 0 62.635 27.096 62.635 59.947 0.371 23.981-5.726 32.305-35.209 53.824l-2.014 1.468c-49.997 36.484-70.972 65.579-68.023 123.435l-0.055 8.41c0 23.565 19.102 42.667 42.667 42.667s42.667-19.102 42.667-42.667v-10.581c-1.165-23.983 3.981-31.121 33.045-52.331l2.022-1.476c49.643-36.233 71.13-65.574 70.229-123.413 0.004-79.814-66.492-144.615-147.964-144.615-81.54 0-148.052 64.783-148.052 145.28 0 23.564 19.102 42.667 42.667 42.667s42.666-19.103 42.666-42.667z","M512 672c29.457 0 53.333 23.876 53.333 53.333s-23.876 53.333-53.333 53.333c-29.457 0-53.333-23.876-53.333-53.333s23.876-53.333 53.333-53.333z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["question"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":117,"id":99,"name":"question","prevSize":32,"code":59652},"setIdx":0,"setId":2,"iconIdx":4},{"icon":{"paths":["M616.64 555.337l32.883-16.546c20.791-10.462 43.58-19.307 67.26-26.79-23.68-7.484-46.468-16.329-67.26-26.79l-32.883-16.546 11.55-34.953c7.305-22.107 17.165-44.481 28.621-66.52-22.042 11.453-44.416 21.316-66.522 28.62l-34.953 11.548-16.546-32.881c-10.466-20.793-19.307-43.582-26.79-67.258-7.484 23.677-16.329 46.466-26.79 67.258l-16.546 32.881-34.953-11.548c-22.107-7.304-44.48-17.167-66.52-28.62 11.453 22.039 21.316 44.413 28.62 66.519l11.548 34.953-32.881 16.546c-20.793 10.462-43.582 19.307-67.259 26.79 23.677 7.484 46.466 16.329 67.259 26.79l32.881 16.546-11.548 34.953c-7.304 22.106-17.167 44.48-28.62 66.522 22.039-11.456 44.413-21.316 66.52-28.621l34.953-11.55 16.546 32.883c10.462 20.791 19.307 43.58 26.79 67.26 7.484-23.68 16.324-46.468 26.79-67.26l16.546-32.883 34.953 11.55c22.106 7.305 44.48 17.165 66.522 28.621-11.456-22.042-21.316-44.416-28.621-66.522l-11.55-34.953zM734.609 703.876c62.31 93.005 139.422 170.155 139.422 170.155s-77.15-77.111-170.155-139.422c-40.994-27.469-85.069-52.062-126.972-65.907-19.84 39.42-33.613 87.974-43.174 136.384-21.7 109.828-21.73 218.914-21.73 218.914s-0.030-109.086-21.73-218.914c-9.562-48.41-23.339-96.964-43.174-136.384-41.902 13.845-85.977 38.438-126.973 65.903-93.002 62.315-170.156 139.426-170.156 139.426s77.113-77.15 139.426-170.155c27.468-40.994 52.061-85.069 65.905-126.972-39.419-19.84-87.973-33.613-136.382-43.174-109.828-21.7-218.916-21.73-218.916-21.73s109.088-0.030 218.916-21.73c48.41-9.562 96.963-23.334 136.382-43.174-13.844-41.902-38.437-85.977-65.905-126.973-62.314-93.002-139.427-170.156-139.427-170.156s77.154 77.113 170.156 139.427c40.995 27.468 85.071 52.061 126.973 65.905 19.836-39.419 33.613-87.972 43.174-136.382 21.7-109.828 21.73-218.916 21.73-218.916s0.030 109.088 21.73 218.916c9.562 48.41 23.334 96.963 43.174 136.382 41.903-13.844 85.978-38.437 126.972-65.905 93.005-62.313 170.155-139.426 170.155-139.426s-77.111 77.154-139.422 170.156c-27.469 40.996-52.062 85.071-65.907 126.973 39.42 19.84 87.974 33.613 136.384 43.174 109.828 21.7 218.914 21.73 218.914 21.73s-109.086 0.030-218.914 21.73c-48.41 9.562-96.964 23.334-136.384 43.174 13.845 41.903 38.438 85.978 65.907 126.972z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["points"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":116,"id":98,"name":"points","prevSize":32,"code":59653},"setIdx":0,"setId":2,"iconIdx":5},{"icon":{"paths":["M307.199 163.142c0-6.317 5.093-11.438 11.377-11.438h79.646c6.284 0 11.378 5.121 11.378 11.438v80.066c0 6.317-5.093 11.438-11.378 11.438h-91.023v-91.504z","M204.801 266.083c0-6.317 5.094-11.438 11.378-11.438h91.022v91.504c0 6.317-5.094 11.438-11.378 11.438h-91.022v-91.504z","M102.4 369.025c0-6.317 5.094-11.438 11.378-11.438h91.022v91.504c0 6.317-5.094 11.438-11.378 11.438h-91.022v-91.504z","M0 471.967c0-6.317 5.094-11.438 11.378-11.438h91.022v102.94h-91.022c-6.284 0-11.378-5.12-11.378-11.435v-80.068z","M102.4 563.469h91.022c6.284 0 11.378 5.124 11.378 11.438v91.504h-91.022c-6.284 0-11.378-5.12-11.378-11.438v-91.504z","M204.801 666.412h91.022c6.284 0 11.378 5.124 11.378 11.438v91.504h-91.022c-6.284 0-11.378-5.12-11.378-11.438v-91.504z","M307.199 769.354h91.023c6.284 0 11.378 5.12 11.378 11.438v80.065c0 6.318-5.093 11.438-11.378 11.438h-79.646c-6.284 0-11.377-5.12-11.377-11.438v-91.504z","M716.8 163.142c0-6.317-5.093-11.438-11.378-11.438h-79.644c-6.284 0-11.378 5.121-11.378 11.438v80.066c0 6.317 5.093 11.438 11.378 11.438h91.022v-91.504z","M819.2 266.083c0-6.317-5.093-11.438-11.378-11.438h-91.022v91.504c0 6.317 5.093 11.438 11.378 11.438h91.022v-91.504z","M921.6 369.025c0-6.317-5.093-11.438-11.378-11.438h-91.022v91.504c0 6.317 5.093 11.438 11.378 11.438h91.022v-91.504z","M1024 471.967c0-6.317-5.093-11.438-11.378-11.438h-91.022v102.94h91.022c6.284 0 11.378-5.12 11.378-11.435v-80.068z","M921.6 563.469h-91.022c-6.284 0-11.378 5.124-11.378 11.438v91.504h91.022c6.284 0 11.378-5.12 11.378-11.438v-91.504z","M819.2 666.412h-91.022c-6.284 0-11.378 5.124-11.378 11.438v91.504h91.022c6.284 0 11.378-5.12 11.378-11.438v-91.504z","M716.8 769.354h-91.022c-6.284 0-11.378 5.12-11.378 11.438v80.065c0 6.318 5.093 11.438 11.378 11.438h79.644c6.284 0 11.378-5.12 11.378-11.438v-91.504z"],"attrs":[{},{},{},{},{},{},{},{},{},{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["code-blocks"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{},{},{},{},{},{},{},{},{},{},{}]}},"attrs":[{},{},{},{},{},{},{},{},{},{},{},{},{},{}],"properties":{"order":115,"id":97,"name":"code-blocks","prevSize":32,"code":59654},"setIdx":0,"setId":2,"iconIdx":6},{"icon":{"paths":["M313.544 7.455l-0.002 0.002 2.236 2.012-0.002 0.002 92.821 88.767-95.054-90.783zM313.544 7.455l-0.114-0.096M313.544 7.455l-0.114-0.096M313.43 7.358c-9.616-8.124-21.647-12.158-33.609-12.158M313.43 7.358l-33.609-12.158M443.789 580.65l-191.421-183.062c-36.396-34.806-43.486-87.131-21.158-128.769l-0.106-0.097-0.079-0.073 0.001-0.001-92.82-88.777c-19.335-18.479-19.99-48.173-1.927-67.423l0.089-0.095 0.001 0.001 1.834-1.851 0.001 0.001 105.658-101.033 199.927 571.178zM443.789 580.65l-188.309 180.16c-61.842 62.166-60.854 160.595 2.94 221.603l0.001 0.003c32.357 30.931 74.734 46.384 117.054 46.384s84.707-15.453 117.053-46.387l362.618-346.848c61.84-62.166 60.854-160.589-2.941-221.597l-0.045-0.042-2.832-2.643-0.096-0.083-2.723-2.41c-2.022-2.138-4.115-4.24-6.269-6.301v0l-299.792-286.601c-22.122-19.726-50.352-29.554-78.528-29.554-18.176 0-36.368 4.088-52.922 12.287l34.79 482.028zM279.821-4.8c-12.97 0-25.998 4.735-35.956 14.27l35.956-14.27zM813.021 452.032v0c20.765 19.859 32.147 46.186 32.147 74.176 0 27.987-11.382 54.33-32.147 74.186l-362.298 346.403c-0.010 0.010-0.019 0.019-0.032 0.029-20.448 18.304-46.992 28.365-75.219 28.365-29.466 0-57.112-10.966-77.883-30.829-20.764-19.869-32.146-46.198-32.146-74.198 0-27.987 11.382-54.317 32.146-74.173l362.299-346.397c0.010-0.010 0.019-0.019 0.029-0.029 20.442-18.31 46.995-28.371 75.219-28.371 29.469 0 57.114 10.963 77.885 30.838zM504.246 156.711l0.003 0.002 220.826 211.163c-38.912 2.253-77.2 17.6-106.995 46.093 0 0 0 0 0 0l-134.816 128.915-193.652-185.283c-21.24-22.288-20.61-56.896 1.922-78.454l7.348-7.003c1.403-1.084 2.76-2.249 4.063-3.495h0l107.535-102.936 0.176-0.2 1.533-1.728 7.341-7.033 2.246-2.046c11.005-9.527 25.12-14.76 40.141-14.76 16.038 0 31.050 5.969 42.33 16.766zM181.005 145.102l98.797-94.513 85.788 82.206-98.808 94.493-85.777-82.186zM730.474 460.125c-39.981 0-72.758 31.046-72.758 69.792s32.778 69.792 72.758 69.792c39.981 0 72.771-31.043 72.771-69.792s-32.79-69.792-72.771-69.792zM730.474 513.731c9.68 0 17.152 7.45 17.152 16.182s-7.472 16.182-17.152 16.182c-9.67 0-17.139-7.443-17.139-16.182s7.469-16.182 17.139-16.182z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["hardware"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":122,"id":96,"name":"hardware","prevSize":32,"code":59655},"setIdx":0,"setId":2,"iconIdx":7},{"icon":{"paths":["M436.297 645.107c-62.274 10.381-103.791 108.117-116.765 155.686-18.836 51.895 207.581 155.686 259.476 142.716 41.519-10.381 60.548-73.519 64.87-103.795 25.95 38.925-129.737-207.582-207.582-194.607z","M463.159 663.104c10.3 4.791 21.722 12.48 33.822 22.43 24.188 19.895 49.515 47.535 72.013 74.854 22.426 27.23 41.673 53.692 53.705 70.938 3.029 4.343 5.589 8.085 7.616 11.085-2.453 13.982-7.778 33.455-16.516 50.833-9.954 19.81-22.771 33.886-37.935 37.675-3.942 0.99-11.093 1.105-21.717-0.516-10.291-1.57-22.665-4.582-36.395-8.819-27.435-8.474-59.332-21.559-89.135-36.676-29.907-15.172-57.022-32.051-75.281-47.893-9.178-7.966-15.484-15.13-18.953-21.141-3.481-6.029-3.189-9.178-2.654-10.65l0.182-0.503 0.14-0.512c6.235-22.861 19.412-57.958 38.382-88.329 19.374-31.023 42.677-53.751 67.999-57.975 6.148-1.024 14.315 0.358 24.73 5.201zM635.755 804.851c-12.066-16.841-28.339-38.622-46.729-60.958-22.912-27.819-49.476-56.939-75.563-78.4-13.039-10.722-26.351-19.861-39.36-25.916-12.902-6.003-26.624-9.485-39.94-7.266-36.951 6.157-65.543 37.483-85.74 69.82-20.475 32.781-34.496 70.080-41.283 94.797-3.871 11.311-0.641 22.541 4.769 31.915 5.511 9.549 14.209 18.906 24.419 27.767 20.518 17.805 49.72 35.797 80.549 51.435 30.935 15.697 64.198 29.367 93.22 38.332 14.502 4.476 28.186 7.851 40.132 9.677 11.618 1.775 22.899 2.3 31.927 0.038 26.355-6.588 43.81-29.274 54.827-51.196 8.708-17.318 14.374-36.066 17.566-51.166 0.597-0.294 1.165-0.623 1.69-0.981 2.321-3.465 3.494-9.173 3.345-10.859-0.149-0.789-0.474-1.997-0.623-2.428-0.26-0.717-0.529-1.259-0.597-1.399-0.115-0.23-0.218-0.418-0.282-0.533-0.124-0.23-0.247-0.435-0.329-0.572-0.307-0.525-0.755-1.225-1.242-1.988-2.031-3.149-6.353-9.634-12.454-18.377l-8.218-12.326-0.085 0.585z","M812.535 593.212c5.696 0 10.257 2.697 13.026 4.71 3.042 2.214 5.841 5.026 8.294 7.829 4.932 5.636 9.822 12.809 14.007 19.507 4.245 6.788 8.034 13.525 10.743 18.534 1.361 2.513 2.466 4.612 3.23 6.093l0.892 1.732 0.239 0.474 0.064 0.132 0.021 0.038 2.91 5.82-2.901 5.803c-11.085 22.165-30.345 55.407-52.335 83.315-10.982 13.935-22.98 26.97-35.311 36.638-12.066 9.463-26.044 16.956-40.725 16.956-9.199 0-18.897-3.081-28.194-7.428-9.476-4.425-19.511-10.628-29.649-17.916-20.288-14.583-41.967-34.214-61.794-54.865-19.836-20.663-38.148-42.697-51.601-62.242-6.716-9.762-12.382-19.136-16.422-27.58-3.861-8.068-6.946-16.717-6.946-24.576v-12.975h272.452zM851.46 658.078l11.593-5.815c0 0 0.009 0.017-11.593 5.815z","M488.192 100.203l-298.4 493.009c-25.129 41.515 32.776 155.686 64.87 207.582l337.321-557.877c0-134.929-69.193-151.362-103.791-142.713z","M496.329 111.817l-295.437 488.11c-3.936 6.507-5.496 17.719-3.226 34.163 2.208 15.987 7.727 34.748 15.225 54.396 11.748 30.788 27.869 62.515 41.877 87.057l324.223-536.216c-0.602-63.161-17.118-95.872-34.714-112.061-15.842-14.575-34.33-17.4-47.949-15.449zM561.847 108.17c25.318 23.294 43.11 65.333 43.11 134.746v3.617l-350.171 579.13-11.159-18.048c-16.34-26.419-39.261-68.685-54.98-109.879-7.849-20.57-14.1-41.382-16.685-60.1-2.522-18.261-1.897-36.89 6.731-51.145l301.166-497.579 5.188-1.296c20.774-5.195 51.43-2.787 76.8 20.553z","M617.933 307.786l-103.795 168.66c-10.377 16.866-4.322 41.626 0 51.895h207.586l25.946-51.895c0-103.791-86.494-155.686-129.737-168.66z","M612.109 292.494l9.549 2.865c45.683 13.705 138.987 68.914 138.987 181.087v3.063l-30.903 61.807h-224.218l-3.341-7.94c-2.645-6.285-5.615-16.393-6.49-27.486-0.866-10.961 0.183-24.525 7.398-36.245l109.018-177.151zM623.548 323.414l-98.359 159.833c-3.166 5.146-4.279 12.395-3.631 20.599 0.329 4.139 1.071 8.102 1.946 11.52h190.199l20.966-41.929c-1.532-86.647-69.111-133.952-111.121-150.024z"],"attrs":[{},{},{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["keystone"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{},{},{},{}]}},"attrs":[{},{},{},{},{},{},{}],"properties":{"order":123,"id":95,"name":"keystone","prevSize":32,"code":59656},"setIdx":0,"setId":2,"iconIdx":8},{"icon":{"paths":["M0 383.312h233.335v225.015h-233.335v-225.015z","M404.647 772.372h233.336v225.014h-233.336v-225.014z","M0 155.611c0-85.942 69.669-155.611 155.611-155.611h77.724v216.677h-233.335v-61.066z","M0 841.836c0 85.944 69.669 155.612 155.611 155.612h77.724v-216.678h-233.335v61.066z","M1023.949 841.836c0 85.944-69.668 155.612-155.612 155.612h-77.722v-216.678h233.334v61.066z","M390.647 0h508.866c68.751 0 124.488 55.735 124.488 124.489v483.87h-633.353v-608.358z"],"attrs":[{},{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["ledger"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{},{},{}]}},"attrs":[{},{},{},{},{},{}],"properties":{"order":124,"id":94,"name":"ledger","prevSize":32,"code":59657},"setIdx":0,"setId":2,"iconIdx":9},{"icon":{"paths":["M992.614 100.156c4.012-23.876 4.003-23.877 3.994-23.878l17.813 2.798 2.895 17.217c0-0.009 0-0.017-24.702 3.863z","M6.683 96.311l-0.014 0.085-0.032 0.194-0.106 0.661-0.364 2.385c-0.303 2.051-0.719 5.011-1.192 8.786-0.946 7.549-2.125 18.376-3.098 31.74-1.942 26.684-3.079 63.708 0.178 105.067 6.437 81.744 30.398 185.086 104.557 256.765 55.461 53.606 129.141 79.951 197.454 92.463 55.22 10.114 108.439 11.469 148.772 10.175v288c0 30.32 25.431 54.9 56.803 54.9s56.804-24.581 56.804-54.9v-288.126c39.913 1.517 93.496 0.545 149.397-9.281 69.483-12.214 144.984-38.54 201.537-93.203 74.166-71.687 98.127-175.040 104.569-256.793 3.254-41.364 2.118-78.392 0.177-105.079-0.973-13.366-2.155-24.194-3.1-31.743-0.475-3.776-0.889-6.736-1.192-8.787l-0.363-2.385-0.107-0.661-0.033-0.194-0.014-0.085-24.702 3.863 3.994-23.878-0.968-0.147-2.472-0.352c-2.122-0.293-5.185-0.695-9.090-1.152-7.81-0.915-19.014-2.054-32.842-2.995-27.611-1.878-65.918-2.977-108.712 0.172-84.582 6.222-191.511 29.385-265.677 101.072-28.416 27.462-49.413 59.537-64.875 93.124-15.458-33.584-36.454-65.657-64.865-93.117-74.159-71.679-181.076-94.839-265.647-101.060-42.79-3.148-81.095-2.049-108.702-0.172-13.826 0.94-25.028 2.080-32.838 2.994-3.906 0.457-6.968 0.859-9.090 1.152l-2.468 0.352-0.684 0.102-0.2 0.031-0.088 0.014 3.995 23.878c-4.011-23.855-4.004-23.877-3.995-23.878l-17.813 2.798-2.895 17.217c0.001-0.009 0.022-0.013 24.703 3.863l-24.703-3.863zM851.144 181.295c21.267-1.564 41.365-1.884 59.127-1.55 0.344 17.168 0.014 36.593-1.606 57.149-5.739 72.92-26.382 143.758-71.619 187.481s-118.523 63.677-193.969 69.227c-21.267 1.564-41.365 1.884-59.127 1.55-0.344-17.169-0.014-36.593 1.606-57.149 5.739-72.92 26.387-143.758 71.619-187.481 45.238-43.724 118.528-63.677 193.969-69.227zM115.333 236.894c-1.618-20.549-1.948-39.968-1.603-57.132 17.758-0.334 37.848-0.014 59.109 1.55 75.433 5.549 148.709 25.499 193.938 69.215s65.869 114.542 71.61 187.453c1.618 20.549 1.948 39.968 1.604 57.132-17.758 0.334-37.848 0.014-59.109-1.55-75.433-5.549-148.709-25.499-193.938-69.215s-65.869-114.542-71.61-187.453z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["seed"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":114,"id":93,"name":"seed","prevSize":32,"code":59658},"setIdx":0,"setId":2,"iconIdx":10},{"icon":{"paths":["M677.197 309.028l142.349-142.351M900.89 85.333v0zM510.033 476.19c21.001 20.719 37.696 45.389 49.122 72.589s17.361 56.393 17.459 85.892c0.098 29.504-5.636 58.735-16.883 86.007-11.243 27.277-27.772 52.058-48.631 72.917-20.864 20.864-45.645 37.393-72.922 48.636-27.273 11.243-56.503 16.981-86.005 16.883s-58.693-6.033-85.893-17.459c-27.199-11.426-51.869-28.122-72.591-49.122-40.748-42.189-63.295-98.692-62.785-157.346s24.035-114.756 65.51-156.233c41.475-41.476 97.58-65.001 156.232-65.51s115.159 22.037 157.348 62.784l0.038-0.038zM510.033 476.19v0zM677.197 309.028l122.014 122.016 142.353-142.352-122.018-122.016-142.349 142.351z"],"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["key"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0}]}},"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"properties":{"order":141,"id":92,"name":"key","prevSize":32,"code":59659},"setIdx":0,"setId":2,"iconIdx":11},{"icon":{"paths":["M814.289 306.612c-166.95-163.458-437.63-163.458-604.58 0l-22.054 21.592c-8.347 8.173-8.347 21.424 0 29.597l68.733 67.296c4.174 4.087 10.941 4.087 15.114 0l29.611-28.992c116.468-114.033 305.303-114.033 421.77 0l27.652 27.072c4.173 4.087 10.94 4.087 15.113 0l68.732-67.296c8.35-8.173 8.35-21.424 0-29.597l-20.092-19.673zM1017.591 505.681l-61.171-59.895c-8.346-8.171-21.879-8.171-30.229 0l-195.767 191.676c-2.086 2.039-5.47 2.039-7.556 0l-195.772-191.68c-8.35-8.171-21.884-8.171-30.229 0l-195.763 191.68c-2.087 2.044-5.47 2.044-7.557 0l-195.772-191.68c-8.348-8.171-21.882-8.171-30.229 0l-61.173 59.895c-8.348 8.171-8.348 21.423 0 29.598l275.84 270.067c8.348 8.175 21.882 8.175 30.229 0l195.765-191.671c2.086-2.044 5.47-2.044 7.556 0l195.767 191.671c8.35 8.175 21.884 8.175 30.229 0l275.831-270.067c8.35-8.171 8.35-21.423 0-29.594z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["dapp-logo"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":112,"id":91,"name":"dapp-logo","prevSize":32,"code":59660},"setIdx":0,"setId":2,"iconIdx":12},{"icon":{"paths":["M285.865 780.378c16.64 16.64 43.52 16.64 60.16 0l165.975-165.12 165.547 165.547c16.64 16.64 43.52 16.64 60.16 0s16.64-43.52 0-60.16l-195.84-195.84c-3.947-3.959-8.636-7.095-13.798-9.237s-10.697-3.243-16.282-3.243c-5.589 0-11.123 1.101-16.286 3.243-5.158 2.142-9.847 5.278-13.794 9.237l-195.841 195.413c-16.64 16.64-16.64 43.52 0 60.16z","M285.865 499.2c16.64 16.64 43.52 16.64 60.16 0l165.975-165.121 165.547 165.548c16.64 16.64 43.52 16.64 60.16 0s16.64-43.52 0-60.16l-195.84-195.841c-3.947-3.956-8.636-7.095-13.798-9.236s-10.697-3.244-16.282-3.244c-5.589 0-11.123 1.102-16.286 3.244-5.158 2.141-9.847 5.28-13.794 9.236l-195.841 195.415c-16.64 16.64-16.64 43.52 0 60.16z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["double-arrow"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":111,"id":90,"name":"double-arrow","prevSize":32,"code":59661},"setIdx":0,"setId":2,"iconIdx":13},{"icon":{"paths":["M637.966 589.86l166.614-169.279c49.174-49.174 131.092-49.174 180.266 0s49.174 131.092 0 180.266l-379.615 384.968c-24.534 24.532-57.388 38.185-90.134 38.185s-65.491-13.654-90.132-38.185l-387.726-384.968c-54.613-54.612-49.174-147.411 16.426-193.92 51.839-38.185 125.653-27.306 169.278 19.094l144.746 141.971 16.428 2.774v-125.654l-0.108-319.459c0-71.041 57.388-125.654 125.654-125.654 73.814 0 128.428 57.387 128.428 125.654l-0.125 464.206z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["arrow-sort"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":110,"id":89,"name":"arrow-sort","prevSize":32,"code":59662},"setIdx":0,"setId":2,"iconIdx":14},{"icon":{"paths":["M438.907 768.411c40.424 37.378 105.859 37.378 146.186 0l408.412-377.63c65.145-60.235 19-163.226-73.093-163.226l-816.824 0.090c-92.093 0-138.238 102.991-73.093 163.136l408.412 377.63z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["dropdown-arrow-small"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":109,"id":88,"name":"dropdown-arrow-small","prevSize":32,"code":59663},"setIdx":0,"setId":2,"iconIdx":15},{"icon":{"paths":["M512 245.68c-49.939 0-90.422-40.483-90.422-90.422s40.483-90.422 90.422-90.422c49.939 0 90.422 40.483 90.422 90.422s-40.484 90.422-90.422 90.422z","M512 603.258c-49.939 0-90.422-40.483-90.422-90.422s40.483-90.422 90.422-90.422c49.939 0 90.422 40.483 90.422 90.422s-40.484 90.422-90.422 90.422z","M512 960.838c-49.939 0-90.422-40.486-90.422-90.426s40.483-90.419 90.422-90.419c49.939 0 90.422 40.48 90.422 90.419s-40.483 90.426-90.422 90.426z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["options-vertical"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":108,"id":87,"name":"options-vertical","prevSize":32,"code":59664},"setIdx":0,"setId":2,"iconIdx":16},{"icon":{"paths":["M879.596 448c44.408 0 80.408 36 80.408 80.408v1.103c0 44.408-36 80.408-80.408 80.408s-80.408-36-80.408-80.408v-1.103c0-44.408 36-80.408 80.408-80.408z","M512.002 448c44.408 0 80.408 36 80.408 80.408v1.103c0 44.408-36 80.408-80.408 80.408s-80.408-36-80.408-80.408v-1.103c0-44.408 36-80.408 80.408-80.408z","M144.408 448c44.408 0 80.408 36 80.408 80.408v1.103c0 44.408-36 80.408-80.408 80.408s-80.408-36-80.408-80.408v-1.103c0-44.408 36-80.408 80.408-80.408z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["options-horizontal"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":107,"id":86,"name":"options-horizontal","prevSize":32,"code":59665},"setIdx":0,"setId":2,"iconIdx":17},{"icon":{"paths":["M938.667 512c0 235.639-191.027 426.667-426.667 426.667-235.642 0-426.667-191.027-426.667-426.667 0-235.642 191.025-426.667 426.667-426.667 235.639 0 426.667 191.025 426.667 426.667zM170.667 512c0 188.514 152.82 341.333 341.333 341.333s341.333-152.819 341.333-341.333c0-188.513-152.819-341.333-341.333-341.333s-341.333 152.82-341.333 341.333z","M450.999 682.667c-8.107 0-15.876-3.584-21.572-9.997l-121.852-136.627c-11.884-13.342-11.884-34.94 0.030-48.282 11.914-13.274 31.202-13.308 43.116 0.034l100.278 112.465 222.315-248.921c11.913-13.341 31.168-13.341 43.085 0 11.913 13.342 11.913 34.907 0 48.249l-243.857 273.081c-5.696 6.413-13.436 9.997-21.542 9.997z","M450.999 682.667v0c-8.107 0-15.876-3.584-21.572-9.997l-121.852-136.627c-11.884-13.342-11.884-34.94 0.030-48.282 11.914-13.274 31.202-13.308 43.116 0.034l100.278 112.465 222.315-248.921c11.913-13.341 31.168-13.341 43.085 0 11.913 13.342 11.913 34.907 0 48.249l-243.857 273.081c-5.696 6.413-13.436 9.997-21.542 9.997"],"attrs":[{},{},{"fill":"none","stroke":"rgb(0, 0, 0)","strokeLinejoin":"miter","strokeLinecap":"butt","strokeMiterlimit":"4","strokeWidth":21.333333333333332}],"isMulticolor":false,"isMulticolor2":true,"grid":0,"tags":["check-oulined"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{"s":0}]}},"attrs":[{},{},{"fill":"none","stroke":"rgb(0, 0, 0)","strokeLinejoin":"miter","strokeLinecap":"butt","strokeMiterlimit":"4","strokeWidth":21.333333333333332}],"properties":{"order":131,"id":85,"name":"check-oulined","prevSize":32,"code":59666},"setIdx":0,"setId":2,"iconIdx":18},{"icon":{"paths":["M422.393 725.333c-7.945 0-15.532-3.2-21.117-8.93l-179.184-182.946c-11.679-11.913-11.679-31.206 0-43.089 11.679-11.917 30.556-11.917 42.234 0l158.066 161.395 337.278-344.16c11.682-11.916 30.558-11.916 42.236 0s11.678 31.177 0 43.092l-358.396 365.707c-5.585 5.73-13.171 8.93-21.118 8.93z","M422.393 725.333v0c-7.945 0-15.532-3.2-21.117-8.93l-179.184-182.946c-11.679-11.913-11.679-31.206 0-43.089 11.679-11.917 30.556-11.917 42.234 0l158.066 161.395 337.278-344.16c11.682-11.916 30.558-11.916 42.236 0s11.678 31.177 0 43.092l-358.396 365.707c-5.585 5.73-13.171 8.93-21.118 8.93"],"attrs":[{},{"fill":"none","stroke":"rgb(0, 0, 0)","strokeLinejoin":"miter","strokeLinecap":"butt","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"isMulticolor":false,"isMulticolor2":true,"grid":0,"tags":["check"],"colorPermutations":{"11611631671181918125521401255951141":[{},{"s":0}]}},"attrs":[{},{"fill":"none","stroke":"rgb(0, 0, 0)","strokeLinejoin":"miter","strokeLinecap":"butt","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"properties":{"order":132,"id":84,"name":"check","prevSize":32,"code":59667},"setIdx":0,"setId":2,"iconIdx":19},{"icon":{"paths":["M938.667 512c0-235.642-191.027-426.667-426.667-426.667-235.642 0-426.667 191.025-426.667 426.667 0 235.639 191.025 426.667 426.667 426.667 235.639 0 426.667-191.027 426.667-426.667zM395.726 456.499l96.366 90.159 139.785-143.341c24.678-25.306 65.199-25.815 90.505-1.137s25.813 65.195 1.135 90.5l-183.552 188.224c-24.316 24.939-64.111 25.852-89.545 2.052l-142.144-132.992c-25.81-24.149-27.158-64.649-3.009-90.458s64.649-27.157 90.46-3.008z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["check-filled"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":104,"id":83,"name":"check-filled","prevSize":32,"code":59668},"setIdx":0,"setId":2,"iconIdx":20},{"icon":{"paths":["M474.509 764.894v-598.494c0-21.208 16.785-38.4 37.491-38.4s37.491 17.192 37.491 38.4v598.494l154.509-158.259c14.639-14.997 38.379-14.997 53.018 0 14.643 14.997 14.643 39.309 0 54.306l-212.075 217.225c-1.092 1.118-2.231 2.15-3.418 3.102-6.861 8.969-17.536 14.733-29.525 14.733s-22.665-5.764-29.525-14.733c-1.186-0.951-2.325-1.984-3.418-3.102l-212.076-217.225c-14.641-14.997-14.641-39.309 0-54.306s38.378-14.997 53.019 0l154.509 158.259z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["arrow-down-1"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":103,"id":82,"name":"arrow-down-1","prevSize":32,"code":59669},"setIdx":0,"setId":2,"iconIdx":21},{"icon":{"paths":["M760.567 390.761c9.911 9.014 9.911 23.629 0 32.643l-230.63 209.834c-9.907 9.015-25.967 9.015-35.874 0l-230.633-209.834c-9.907-9.014-9.907-23.629 0-32.643s25.97-9.014 35.878 0l212.692 193.513 212.693-193.513c9.907-9.014 25.967-9.014 35.874 0z"],"attrs":[{"strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["arrow-down"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0}]}},"attrs":[{"strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"properties":{"order":135,"id":81,"name":"arrow-down","prevSize":32,"code":59670},"setIdx":0,"setId":2,"iconIdx":22},{"icon":{"paths":["M263.43 633.237c-9.907-9.011-9.907-23.625 0-32.64l230.633-209.837c9.907-9.014 25.967-9.014 35.874 0l230.63 209.837c9.911 9.011 9.911 23.629 0 32.64-9.907 9.015-25.967 9.015-35.874 0l-212.693-193.51-212.692 193.51c-9.908 9.015-25.97 9.015-35.878 0z"],"attrs":[{"strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["arrow-up"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0}]}},"attrs":[{"strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"properties":{"order":136,"id":80,"name":"arrow-up","prevSize":32,"code":59671},"setIdx":0,"setId":2,"iconIdx":23},{"icon":{"paths":["M633.237 760.567c-9.011 9.911-23.625 9.911-32.64 0l-209.837-230.63c-9.014-9.907-9.014-25.967 0-35.874l209.837-230.633c9.015-9.907 23.629-9.907 32.644 0 9.011 9.908 9.011 25.97 0 35.878l-193.515 212.692 193.51 212.693c9.015 9.907 9.015 25.967 0 35.874z"],"attrs":[{"strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["arrow-left"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0}]}},"attrs":[{"strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"properties":{"order":138,"id":79,"name":"arrow-left","prevSize":32,"code":59672},"setIdx":0,"setId":2,"iconIdx":24},{"icon":{"paths":["M390.761 263.43c9.014-9.907 23.629-9.907 32.643 0l209.834 230.633c9.015 9.907 9.015 25.967 0 35.874l-209.834 230.63c-9.014 9.911-23.629 9.911-32.643 0-9.014-9.907-9.014-25.967 0-35.874l193.513-212.693-193.513-212.692c-9.014-9.908-9.014-25.97 0-35.878z"],"attrs":[{"strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["arrow-right"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0}]}},"attrs":[{"strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"properties":{"order":137,"id":78,"name":"arrow-right","prevSize":32,"code":59673},"setIdx":0,"setId":2,"iconIdx":25},{"icon":{"paths":["M873.997 602.462l-271.27 271.339c-7.027 7.040-15.373 12.621-24.555 16.431-9.186 3.81-19.034 5.769-28.979 5.769-9.941 0-19.789-1.958-28.975-5.769s-17.532-9.391-24.559-16.431l-324.992-324.698v-378.436h378.338l324.992 325.077c14.093 14.182 22.003 33.365 22.003 53.359 0 19.998-7.91 39.181-22.003 53.359z","M341.333 341.333h0.427"],"attrs":[{"fill":"none","stroke":"rgb(161, 163, 167)","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","stroke":"rgb(161, 163, 167)","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["tag"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":3},{"s":3}]}},"attrs":[{"fill":"none","stroke":"rgb(161, 163, 167)","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","stroke":"rgb(161, 163, 167)","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"properties":{"order":139,"id":77,"name":"tag","prevSize":32,"code":59674},"setIdx":0,"setId":2,"iconIdx":26},{"icon":{"paths":["M358.4 170.667l-102.4 102.4h-68.267c-56.554 0-102.4 45.846-102.4 102.4v375.612c0 56.555 45.846 102.4 102.4 102.4h648.533c56.555 0 102.4-45.845 102.4-102.4v-375.612c0-56.554-45.845-102.4-102.4-102.4h-68.267l-102.4-102.4h-307.2zM291.346 358.4l102.4-102.4h236.509l102.4 102.4h103.612c9.425 0 17.067 7.641 17.067 17.067v375.612c0 9.425-7.642 17.067-17.067 17.067h-648.533c-9.425 0-17.067-7.642-17.067-17.067v-375.612c0-9.425 7.641-17.067 17.067-17.067h103.613z","M512 725.333c-106.039 0-192-85.961-192-192s85.961-192 192-192c106.039 0 192 85.961 192 192s-85.961 192-192 192zM618.667 533.333c0-58.91-47.757-106.667-106.667-106.667s-106.667 47.757-106.667 106.667c0 58.91 47.757 106.667 106.667 106.667s106.667-47.757 106.667-106.667z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["camera"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":100,"id":76,"name":"camera","prevSize":32,"code":59675},"setIdx":0,"setId":2,"iconIdx":27},{"icon":{"paths":["M298.667 512.004c0-47.125 38.205-85.333 85.333-85.333 47.13 0 85.333 38.208 85.333 85.333 0 47.13-38.204 85.333-85.333 85.333-47.128 0-85.333-38.204-85.333-85.333z","M554.667 512.004c0-47.125 38.204-85.333 85.333-85.333s85.333 38.208 85.333 85.333c0 47.13-38.204 85.333-85.333 85.333s-85.333-38.204-85.333-85.333z","M298.667 213.333c0-47.128 38.205-85.333 85.333-85.333 47.13 0 85.333 38.205 85.333 85.333s-38.204 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333z","M554.667 213.333c0-47.128 38.204-85.333 85.333-85.333s85.333 38.205 85.333 85.333c0 47.128-38.204 85.333-85.333 85.333s-85.333-38.205-85.333-85.333z","M298.667 810.662c0-47.13 38.205-85.333 85.333-85.333 47.13 0 85.333 38.204 85.333 85.333 0 47.125-38.204 85.333-85.333 85.333-47.128 0-85.333-38.208-85.333-85.333z","M554.667 810.662c0-47.13 38.204-85.333 85.333-85.333s85.333 38.204 85.333 85.333c0 47.125-38.204 85.333-85.333 85.333s-85.333-38.208-85.333-85.333z"],"attrs":[{},{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["element-drag"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{},{},{}]}},"attrs":[{},{},{},{},{},{}],"properties":{"order":99,"id":75,"name":"element-drag","prevSize":32,"code":59676},"setIdx":0,"setId":2,"iconIdx":28},{"icon":{"paths":["M832.499 512.32c0-176.555-143.543-320.181-320-320.32v-128c239.906 0.135 436.343 189.779 447.501 427.012v-1.557c0.38 7.573 0.576 15.198 0.576 22.865s-0.196 15.287-0.576 22.865v-1.557c-10.807 229.734-195.362 414.784-424.892 426.372h0.013c-0.905 0.047-1.805 0.090-2.709 0.128-6.682 0.299-13.402 0.448-20.156 0.448zM512.499 960v-127.424c176.457-0.141 320-143.765 320-320.256zM512.243 960.576c-7.612 0-15.181-0.192-22.703-0.567-0.055-0.004-0.111-0.004-0.166-0.009h0.013c-229.529-11.588-414.085-196.638-424.889-426.372v1.557c-0.383-7.578-0.576-15.198-0.576-22.865s0.193-15.292 0.576-22.865v1.557c11.156-237.233 207.59-426.877 447.502-427.012v896h0.499z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-partial-fill"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":98,"id":74,"name":"transaction-partial-fill","prevSize":32,"code":59677},"setIdx":0,"setId":2,"iconIdx":29},{"icon":{"paths":["M341.333 490.667c0-35.345 28.654-64 64-64h426.667c35.345 0 64 28.655 64 64s-28.655 64-64 64h-426.667c-35.346 0-64-28.655-64-64z","M341.333 746.667c0-35.345 28.654-64 64-64h426.667c35.345 0 64 28.655 64 64s-28.655 64-64 64h-426.667c-35.346 0-64-28.655-64-64z","M341.333 234.667c0-35.346 28.654-64 64-64h426.667c35.345 0 64 28.654 64 64s-28.655 64-64 64h-426.667c-35.346 0-64-28.654-64-64z","M256 234.667c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.346 28.654-64 64-64s64 28.654 64 64z","M256 490.667c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.346 28.654-64 64-64s64 28.654 64 64z","M256 746.667c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.346 28.654-64 64-64s64 28.654 64 64z"],"attrs":[{"fill":"rgb(0, 0, 0)"},{"fill":"rgb(0, 0, 0)"},{"fill":"rgb(0, 0, 0)"},{"fill":"rgb(18, 19, 18)"},{"fill":"rgb(18, 19, 18)"},{"fill":"rgb(18, 19, 18)"}],"isMulticolor":true,"isMulticolor2":false,"grid":0,"tags":["rows-2"],"colorPermutations":{"11611631671181918125521401255951141":[{"f":0},{"f":0},{"f":0},{"f":1},{"f":1},{"f":1}]}},"attrs":[{"fill":"rgb(0, 0, 0)"},{"fill":"rgb(0, 0, 0)"},{"fill":"rgb(0, 0, 0)"},{"fill":"rgb(18, 19, 18)"},{"fill":"rgb(18, 19, 18)"},{"fill":"rgb(18, 19, 18)"}],"properties":{"order":97,"id":73,"name":"rows-2","prevSize":32,"code":59678,"codes":[59678,59679,59680,59681,59682,59683]},"setIdx":0,"setId":2,"iconIdx":30},{"icon":{"paths":["M938.667 512c0 235.639-191.027 426.667-426.667 426.667-235.642 0-426.667-191.027-426.667-426.667 0-235.642 191.025-426.667 426.667-426.667 235.639 0 426.667 191.025 426.667 426.667zM170.667 512c0 188.514 152.82 341.333 341.333 341.333s341.333-152.819 341.333-341.333c0-188.513-152.819-341.333-341.333-341.333s-341.333 152.82-341.333 341.333z","M327.74 438.434c-17.204-16.102-44.204-15.21-60.307 1.993s-15.21 44.207 1.993 60.309l176.683 165.376c16.956 15.868 43.49 15.262 59.703-1.365l228.139-233.984c16.452-16.872 16.111-43.885-0.764-60.335-16.87-16.451-43.883-16.109-60.335 0.763l-198.955 204.050-146.159-136.806z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["check-notifications"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":96,"id":72,"name":"check-notifications","prevSize":32,"code":59684},"setIdx":0,"setId":2,"iconIdx":31},{"icon":{"paths":["M384 85.333h-213.333c-47.128 0-85.333 38.205-85.333 85.333v213.333c0 47.13 38.205 85.333 85.333 85.333h213.333c47.13 0 85.333-38.204 85.333-85.333v-213.333c0-47.128-38.204-85.333-85.333-85.333zM170.667 384v-213.333h213.333v213.333h-213.333z","M384 554.667h-213.333c-47.128 0-85.333 38.204-85.333 85.333v213.333c0 47.13 38.205 85.333 85.333 85.333h213.333c47.13 0 85.333-38.204 85.333-85.333v-213.333c0-47.13-38.204-85.333-85.333-85.333zM170.667 853.333v-213.333h213.333v213.333h-213.333z","M853.333 85.333h-213.333c-47.13 0-85.333 38.205-85.333 85.333v213.333c0 47.13 38.204 85.333 85.333 85.333h213.333c47.13 0 85.333-38.204 85.333-85.333v-213.333c0-47.128-38.204-85.333-85.333-85.333zM640 384v-213.333h213.333v213.333h-213.333z","M661.333 554.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z","M917.333 554.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z","M789.333 682.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z","M917.333 810.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z","M661.333 810.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z"],"attrs":[{},{},{},{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["qr-code-1"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{},{},{},{},{}]}},"attrs":[{},{},{},{},{},{},{},{}],"properties":{"order":95,"id":71,"name":"qr-code-1","prevSize":32,"code":59685},"setIdx":0,"setId":2,"iconIdx":32},{"icon":{"paths":["M938.667 170.667v170.667c0 23.564-19.102 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v-170.667h-170.667c-23.565 0-42.667-19.103-42.667-42.667s19.102-42.667 42.667-42.667h170.667c47.13 0 85.333 38.205 85.333 85.333z","M170.667 170.667v170.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v-170.667c0-47.128 38.205-85.333 85.333-85.333h170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667h-170.667z","M853.333 853.333v-170.667c0-23.565 19.102-42.667 42.667-42.667s42.667 19.102 42.667 42.667v170.667c0 47.13-38.204 85.333-85.333 85.333h-170.667c-23.565 0-42.667-19.102-42.667-42.667s19.102-42.667 42.667-42.667h170.667z","M170.667 853.333h170.667c23.564 0 42.667 19.102 42.667 42.667s-19.103 42.667-42.667 42.667h-170.667c-47.128 0-85.333-38.204-85.333-85.333v-170.667c0-23.565 19.103-42.667 42.667-42.667s42.667 19.102 42.667 42.667v170.667z","M128 469.333h768c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667h-768c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667z"],"attrs":[{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["scan-1"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{},{}]}},"attrs":[{},{},{},{},{}],"properties":{"order":94,"id":70,"name":"scan-1","prevSize":32,"code":59686},"setIdx":0,"setId":2,"iconIdx":33},{"icon":{"paths":["M840.107 597.333c8.576-27.639 13.035-56.393 13.227-85.333v-298.667l-341.333-128-134.828 50.347","M201.813 201.812l-31.147 11.52v298.668c0 256 341.333 426.667 341.333 426.667 90.325-47.663 171.507-110.929 239.787-186.88","M42.667 42.667l938.667 938.667"],"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["shield-crossed"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0},{"s":0},{"s":0}]}},"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"properties":{"order":133,"id":69,"name":"shield-crossed","prevSize":32,"code":59687},"setIdx":0,"setId":2,"iconIdx":34},{"icon":{"paths":["M498.129 935.945c9.698 3.639 20.386 3.631 30.076-0.030 168.346-63.599 275.204-151.066 328.93-250.807 10.091-18.052 17.984-38.097 24.009-59.78 6.959-25.050 11.2-51.371 13.321-78.067 1.434-18.014 1.745-33.506 1.455-47.334-0.068-2.987-0.068-2.987-0.073-2.688v-272c0-24.709-20.919-44.251-45.572-42.567-21.329 1.457-32.043 1.991-43.9 1.991-111.714 0-203.981-39.909-267.994-90.209-16.474-12.945-39.906-12.014-55.3 2.196-0.922 0.847-2.022 1.75-3.686 3.001-1.28 0.966-2.85 2.105-7.014 5.123-17.788 11.879-28.122 18.392-43.648 26.725-3.437 1.846-6.883 3.627-10.339 5.341-60.663 29.792-126.433 47.823-200.646 47.823-11.919 0-22.554-0.53-43.941-1.991-24.651-1.684-45.574 17.859-45.574 42.567v269.952c-3.589 50.202 9.391 138.615 44.909 199.134 6.782 12.574 15.632 25.626 26.72 39.684 62.988 83.503 163.576 151.36 298.268 201.937zM782.524 643.695l-0.38 0.687c-41.929 78.042-127.91 149.965-269.060 205.888-112.85-44.476-195.069-101.325-245.661-168.384-8.823-11.2-15.002-20.314-19.968-29.483-14.854-25.357-24.553-57.66-29.862-93.828-3.653-24.883-4.827-50.389-4.13-60.429l0.086-228.169c1.385 0.012 2.78 0.017 4.198 0.017 88.57 0 166.714-21.424 238.411-56.636 4.442-2.202 8.7-4.403 12.932-6.676 15.774-8.467 26.914-15.258 42.914-25.824 75.383 51.486 175.313 89.135 294.37 89.135 1.399 0 2.773-0.006 4.139-0.017v227.26c0.038 2.308 0.038 2.308 0.094 4.467 0.23 11.183-0.026 23.915-1.207 38.793-1.719 21.615-5.111 42.675-10.475 61.986-4.331 15.59-9.809 29.461-16.401 41.212z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["shield"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":92,"id":68,"name":"shield","prevSize":32,"code":59688},"setIdx":0,"setId":2,"iconIdx":35},{"icon":{"paths":["M383.875 640.166c-13.781 0-27.307-6.656-35.541-18.987-13.099-19.584-7.808-46.080 11.819-59.179l109.186-72.832v-189.908c0-23.595 19.072-42.667 42.667-42.667s42.667 19.072 42.667 42.667v212.735c0 14.251-7.125 27.605-18.987 35.499l-128.172 85.504c-7.253 4.821-15.531 7.168-23.637 7.168z","M512 170.667c-188.203 0-341.333 153.131-341.333 341.333s153.131 341.333 341.333 341.333c188.203 0 341.333-153.131 341.333-341.333s-153.131-341.333-341.333-341.333zM512 938.667c-235.264 0-426.667-191.403-426.667-426.667s191.403-426.667 426.667-426.667c235.264 0 426.667 191.403 426.667 426.667s-191.403 426.667-426.667 426.667z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["clock"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":91,"id":67,"name":"clock","prevSize":32,"code":59689},"setIdx":0,"setId":2,"iconIdx":36},{"icon":{"paths":["M908.809 229.248c-22.528-7.253-46.464 4.992-53.803 27.392l-16.896 52.053c-68.864-110.805-190.507-180.693-325.973-180.693-178.987 0-332.672 121.515-373.76 295.467-5.419 22.912 8.789 45.909 31.787 51.328 3.285 0.725 6.571 1.109 9.813 1.109 19.328 0 36.821-13.184 41.515-32.853 31.915-135.253 151.424-229.717 290.646-229.717 106.283 0 200.96 55.808 254.251 143.317l-66.133-20.309c-22.571-6.997-46.421 5.803-53.333 28.245-6.912 22.528 5.76 46.421 28.245 53.333l157.312 48.341c4.181 1.28 8.405 1.877 12.544 1.877 18.005 0 34.688-11.477 40.576-29.483l50.603-155.605c7.253-22.443-5.035-46.507-27.392-53.803z","M855.309 536.375c-23.424-4.565-45.611 10.539-50.133 33.621-27.392 139.477-150.656 240.683-293.035 240.683-105.941 0-200.704-55.765-254.037-143.104l65.237 20.096c22.613 7.040 46.421-5.76 53.333-28.245 6.912-22.571-5.717-46.421-28.245-53.333l-157.269-48.384c-22.315-6.869-45.909 5.461-53.163 27.605l-50.56 155.691c-7.296 22.357 4.992 46.464 27.435 53.76 4.352 1.408 8.789 2.048 13.141 2.048 18.005 0 34.731-11.435 40.576-29.483l17.152-52.736c68.779 111.189 190.891 181.419 326.4 181.419 183.040 0 341.504-130.176 376.789-309.504 4.565-23.125-10.539-45.611-33.621-50.133z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["update"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":90,"id":66,"name":"update","prevSize":32,"code":59690},"setIdx":0,"setId":2,"iconIdx":37},{"icon":{"paths":["M880.35 303.767c14.694 26.481 26.65 54.71 35.588 84.342 68.083 225.455-58.581 463.706-282.889 532.083-224.292 68.373-461.277-58.931-529.306-284.335-68.087-225.471 58.556-463.71 282.895-532.082 40.347-12.292 81.811-18.442 123.202-18.442 26.048 0 47.168 21.225 47.168 47.408s-21.12 47.408-47.168 47.408c-32.141 0-64.384 4.783-95.834 14.364-174.462 53.171-272.951 238.447-219.995 413.815 52.906 175.296 237.219 274.304 411.662 221.129 174.434-53.18 272.947-238.468 219.998-413.818-7.317-24.248-17.203-47.249-29.414-68.718l-11.695 67.883c-4.446 25.798-28.855 43.091-54.524 38.624-25.664-4.467-42.871-29.004-38.426-54.803l29.056-168.631c4.39-25.487 28.297-42.732 53.726-38.755l167.019 26.122c25.737 4.026 43.358 28.262 39.351 54.134s-28.117 43.581-53.858 39.555l-46.558-7.282z","M362.099 548.407c-20.513 14.315-26.913 44.774-14.295 68.041s39.477 30.524 59.991 16.213l126.115-87.987c12.898-8.998 20.757-24.947 20.757-42.125v-197.091c0-27.315-19.524-49.458-43.605-49.458-24.085 0-43.61 22.143-43.61 49.458v169.447l-105.353 73.502z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["repeat"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":89,"id":65,"name":"repeat","prevSize":32,"code":59691},"setIdx":0,"setId":2,"iconIdx":38},{"icon":{"paths":["M554.688 664.913v-536.873c0-23.595-19.115-42.667-42.667-42.667-23.595 0-42.667 19.072-42.667 42.667v536.873l-175.872-175.829c-16.683-16.683-43.691-16.683-60.331 0-16.683 16.683-16.683 43.648 0 60.331l241.366 241.365c1.237 1.237 2.56 2.389 3.883 3.413 7.851 10.027 19.968 16.384 33.621 16.384 13.611 0 25.771-6.357 33.579-16.384 1.323-1.024 2.688-2.176 3.883-3.413l241.365-241.365c16.683-16.683 16.683-43.648 0-60.331-16.64-16.683-43.648-16.683-60.331 0l-175.829 175.829z","M128.021 853.333h768c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667h-768c-23.509 0-42.667-19.2-42.667-42.667s19.157-42.667 42.667-42.667z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["download"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":88,"id":64,"name":"download","prevSize":32,"code":59692},"setIdx":0,"setId":2,"iconIdx":39},{"icon":{"paths":["M469.308 359.086v536.876c0 23.595 19.115 42.667 42.667 42.667 23.595 0 42.667-19.072 42.667-42.667v-536.876l175.872 175.83c16.683 16.683 43.691 16.683 60.331 0 16.683-16.683 16.683-43.648 0-60.331l-241.365-241.366c-1.237-1.237-2.56-2.389-3.883-3.413-7.851-10.027-19.968-16.384-33.621-16.384-13.611 0-25.771 6.357-33.579 16.384-1.323 1.024-2.688 2.176-3.883 3.413l-241.366 241.366c-16.683 16.683-16.683 43.648 0 60.331 16.64 16.683 43.648 16.683 60.331 0l175.83-175.83z","M895.979 170.667h-768c-23.467 0-42.667-19.2-42.667-42.667s19.2-42.667 42.667-42.667h768c23.509 0 42.667 19.2 42.667 42.667s-19.157 42.667-42.667 42.667z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["upload"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":87,"id":63,"name":"upload","prevSize":32,"code":59693},"setIdx":0,"setId":2,"iconIdx":40},{"icon":{"paths":["M384 85.333h-213.333c-47.128 0-85.333 38.205-85.333 85.333v213.333c0 47.13 38.205 85.333 85.333 85.333h213.333c47.13 0 85.333-38.204 85.333-85.333v-213.333c0-47.128-38.204-85.333-85.333-85.333zM170.667 384v-213.333h213.333v213.333h-213.333z","M384 554.667h-213.333c-47.128 0-85.333 38.204-85.333 85.333v213.333c0 47.13 38.205 85.333 85.333 85.333h213.333c47.13 0 85.333-38.204 85.333-85.333v-213.333c0-47.13-38.204-85.333-85.333-85.333zM170.667 853.333v-213.333h213.333v213.333h-213.333z","M853.333 85.333h-213.333c-47.13 0-85.333 38.205-85.333 85.333v213.333c0 47.13 38.204 85.333 85.333 85.333h213.333c47.13 0 85.333-38.204 85.333-85.333v-213.333c0-47.128-38.204-85.333-85.333-85.333zM640 384v-213.333h213.333v213.333h-213.333z","M661.333 554.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z","M917.333 554.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z","M789.333 682.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z","M917.333 810.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z","M661.333 810.667h-85.333c-11.782 0-21.333 9.551-21.333 21.333v85.333c0 11.782 9.551 21.333 21.333 21.333h85.333c11.782 0 21.333-9.551 21.333-21.333v-85.333c0-11.782-9.551-21.333-21.333-21.333z"],"attrs":[{},{},{},{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["qr-code"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{},{},{},{},{}]}},"attrs":[{},{},{},{},{},{},{},{}],"properties":{"order":86,"id":62,"name":"qr-code","prevSize":32,"code":59694},"setIdx":0,"setId":2,"iconIdx":41},{"icon":{"paths":["M938.667 170.667v170.667c0 23.564-19.102 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v-170.667h-170.667c-23.565 0-42.667-19.103-42.667-42.667s19.102-42.667 42.667-42.667h170.667c47.13 0 85.333 38.205 85.333 85.333z","M170.667 170.667v170.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v-170.667c0-47.128 38.205-85.333 85.333-85.333h170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667h-170.667z","M853.333 853.333v-170.667c0-23.565 19.102-42.667 42.667-42.667s42.667 19.102 42.667 42.667v170.667c0 47.13-38.204 85.333-85.333 85.333h-170.667c-23.565 0-42.667-19.102-42.667-42.667s19.102-42.667 42.667-42.667h170.667z","M170.667 853.333h170.667c23.564 0 42.667 19.102 42.667 42.667s-19.103 42.667-42.667 42.667h-170.667c-47.128 0-85.333-38.204-85.333-85.333v-170.667c0-23.565 19.103-42.667 42.667-42.667s42.667 19.102 42.667 42.667v170.667z","M128 469.333h768c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667h-768c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667z"],"attrs":[{},{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["scan"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{},{}]}},"attrs":[{},{},{},{},{}],"properties":{"order":85,"id":61,"name":"scan","prevSize":32,"code":59695},"setIdx":0,"setId":2,"iconIdx":42},{"icon":{"paths":["M512.009 170.674c-221.668 0-410.96 141.506-487.613 341.33 76.653 199.825 265.944 341.329 487.613 341.329 221.619 0 410.914-141.504 487.616-341.329-76.702-199.824-265.997-341.33-487.616-341.33zM512.009 268.197c163.499 0 309.491 94.499 381.461 243.807-71.97 149.308-217.963 243.806-381.461 243.806-163.543 0-309.535-94.498-381.458-243.806 71.923-149.308 217.914-243.807 381.458-243.807z","M512.055 316.198c-107.762 0-195.045 87.331-195.045 195.047 0 107.763 87.283 195.042 195.045 195.042 107.716 0 195.046-87.279 195.046-195.042 0-107.715-87.33-195.047-195.046-195.047zM512.060 413.721c53.781 0 97.519 43.738 97.519 97.524 0 53.833-43.738 97.523-97.519 97.523-53.786 0-97.524-43.691-97.524-97.523 0-53.786 43.739-97.524 97.524-97.524z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["eye-n"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":84,"id":60,"name":"eye-n","prevSize":32,"code":59696},"setIdx":0,"setId":2,"iconIdx":43},{"icon":{"paths":["M372.8 284.969c41.137-13.363 84.574-21.184 129.638-21.184 160.619 0 304 90.231 374.686 232.795-30.793 62.11-75.998 113.417-129.779 152.576l68.433 66.53c73.271-56.384 131.123-131.806 165.555-219.106-75.281-190.799-261.188-325.914-478.895-325.914-72.457 0-141.228 15.271-203.772 42.276l74.133 72.027z","M497.502 426.497c2.449-0.175 4.762-0.743 7.296-0.743 49.045 0 88.934 39.235 88.934 87.389 0 2.492-0.58 4.762-0.802 7.121l70.882 69.649c11.695-23.245 18.854-49.067 18.854-76.77 0-96.521-79.642-174.778-177.869-174.778-28.194 0-54.473 7.078-78.131 18.483l70.835 69.649z","M511.983 733.47c-157.38 0-297.908-89.378-367.139-230.601 20.042-40.909 46.655-76.835 77.398-108.105l102.603 100.817c-0.094 2.214-0.516 4.335-0.516 6.549 0 101.926 84.063 184.482 187.748 184.482 2.3 0 4.459-0.371 6.711-0.461l44.399 43.584c-16.849 2.214-33.839 3.733-51.204 3.733zM785.011 817.271l-612.711-602.006c-18.352-18.033-48.063-18.033-66.368 0-18.352 17.987-18.352 47.181 0 65.214l50.41 49.533c-48.579 48.98-88.053 107.231-113.727 172.861 73.831 189.001 256.039 322.842 469.364 322.842 45.295 0 88.947-6.643 130.624-17.941l76.041 74.714c9.199 9.041 21.167 13.513 33.182 13.513s24.030-4.471 33.186-13.513c18.351-17.988 18.351-47.181 0-65.216z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["eye-off"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":83,"id":59,"name":"eye-off","prevSize":32,"code":59697},"setIdx":0,"setId":2,"iconIdx":44},{"icon":{"paths":["M768 810.522c0 23.552-19.115 42.667-42.667 42.667h-426.667c-23.552 0-42.667-19.115-42.667-42.667v-298.667c0-23.552 19.115-42.667 42.667-42.667h426.667c23.552 0 42.667 19.115 42.667 42.667v298.667zM768.171 391.791v-50.432c0-141.184-114.859-256.043-256-256.043-103.125 0-195.669 61.397-235.819 156.373-9.173 21.717 0.939 46.763 22.656 55.936 21.675 9.131 46.763-1.024 55.893-22.699 26.795-63.317 88.533-104.277 157.269-104.277 94.123 0 170.667 76.587 170.667 170.709v42.496h-384.171c-70.571 0-128 57.429-128 128v298.667c0 70.571 57.429 128 128 128h426.667c70.571 0 128-57.429 128-128v-298.667c0-55.509-35.712-102.357-85.163-120.064z","M576 618.398c0-35.371-28.672-64-64-64s-64 28.629-64 64c0 18.901 8.363 35.755 21.419 47.445v59.051c0 23.637 19.157 42.795 42.837 42.795 23.637 0 42.795-19.157 42.795-42.795v-59.392c12.8-11.733 20.949-28.416 20.949-47.104z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["unlock"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":82,"id":58,"name":"unlock","prevSize":32,"code":59698},"setIdx":0,"setId":2,"iconIdx":45},{"icon":{"paths":["M768 810.522c0 23.552-19.115 42.667-42.667 42.667h-426.667c-23.552 0-42.667-19.115-42.667-42.667v-298.667c0-23.552 19.115-42.667 42.667-42.667h426.667c23.552 0 42.667 19.115 42.667 42.667v298.667zM512.171 170.65c94.123 0 170.667 76.587 170.667 170.709v42.496h-341.333v-42.496c0-94.123 76.544-170.709 170.667-170.709zM768.171 391.791v-50.432c0-141.184-114.859-256.043-256-256.043-141.184 0-256 114.859-256 256.043v50.304c-49.664 17.621-85.504 64.555-85.504 120.192v298.667c0 70.571 57.429 128 128 128h426.667c70.571 0 128-57.429 128-128v-298.667c0-55.509-35.712-102.357-85.163-120.064z","M576 618.398c0-35.371-28.672-64-64-64s-64 28.629-64 64c0 18.901 8.32 35.712 21.419 47.403v59.093c0 23.637 19.157 42.795 42.795 42.795 23.68 0 42.837-19.157 42.837-42.795v-59.392c12.8-11.733 20.949-28.416 20.949-47.104z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["lock"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":81,"id":57,"name":"lock","prevSize":32,"code":59699},"setIdx":0,"setId":2,"iconIdx":46},{"icon":{"paths":["M698.091 716.335l-140.16-55.339c-21.888-8.704-46.763 2.091-55.339 24.021-8.661 21.888 2.091 46.677 23.979 55.296l49.749 19.669c-28.8 10.027-59.136 15.787-90.027 15.787h-0.64c-96.812-0.213-187.308-52.395-236.247-136.149-11.819-20.309-37.973-27.221-58.325-15.317-20.352 11.861-27.221 37.973-15.317 58.325 64.085 109.781 182.741 178.176 309.761 178.475h0.768c40.789 0 80.939-7.637 119.040-21.035l-15.36 41.003c-8.277 22.059 2.901 46.635 25.003 54.912 4.907 1.835 9.941 2.731 14.933 2.731 17.28 0 33.536-10.539 39.979-27.733l52.48-140.032c8.192-21.76-2.603-46.080-24.277-54.613z","M673.843 242.419c28.971 0 52.48 23.552 52.48 52.48s-23.509 52.48-52.48 52.48c-28.928 0-52.437-23.552-52.437-52.48s23.509-52.48 52.437-52.48zM350.090 170.653c28.928 0 52.48 23.552 52.48 52.48 0 28.971-23.552 52.48-52.48 52.48-28.971 0-52.48-23.509-52.48-52.48 0-28.928 23.509-52.48 52.48-52.48zM893.235 554.953c-26.709-71.168-77.269-123.989-137.728-149.675 33.877-25.088 56.149-65.067 56.149-110.378 0-75.99-61.824-137.814-137.813-137.814-75.947 0-137.771 61.824-137.771 137.814 0 45.312 22.272 85.291 56.149 110.378-16.939 7.168-33.195 15.957-48.213 27.264-28.203-45.654-67.328-79.958-112.299-98.987 33.877-25.131 56.192-65.109 56.192-110.421 0-75.947-61.865-137.813-137.812-137.813-75.989 0-137.813 61.867-137.813 137.813 0 45.312 22.272 85.291 56.149 110.421-60.459 25.6-111.019 78.507-137.685 149.675-8.277 22.059 2.901 46.635 24.917 54.955 22.059 8.107 46.677-2.901 54.997-24.96 25.429-67.883 80.171-111.744 139.435-111.744 54.955 0 105.769 38.016 133.161 97.664-11.179 17.152-21.12 35.584-28.757 55.851-8.235 22.059 2.944 46.635 25.003 54.912 4.949 1.835 9.984 2.731 14.976 2.731 17.237 0 33.536-10.539 39.936-27.733 25.472-67.84 80.171-111.701 139.435-111.701s114.005 43.861 139.477 111.744c8.277 22.101 32.853 33.152 54.955 24.96 22.016-8.277 33.195-32.853 24.96-54.955z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["replace-owner"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":80,"id":56,"name":"replace-owner","prevSize":32,"code":59700},"setIdx":0,"setId":2,"iconIdx":47},{"icon":{"paths":["M512.132 170.667c70.571 0 128 57.387 128 128 0 70.571-57.429 128-128 128s-127.998-57.429-127.998-128c0-70.613 57.428-128 127.998-128zM696.068 514.944c-24.747-13.781-51.285-24.107-79.147-31.616 64.469-36.736 108.544-105.301 108.544-184.661 0-117.632-95.701-213.333-213.333-213.333-117.63 0-213.332 95.701-213.332 213.333 0 79.061 43.733 147.413 107.819 184.277-191.275 50.005-271.36 235.904-319.573 401.323-6.571 22.613 6.4 46.336 29.013 52.907 4.011 1.195 8.021 1.707 11.947 1.707 18.517 0 35.541-12.075 40.96-30.677 72.192-247.637 174.805-353.323 343.038-353.323 54.272 0 100.821 11.307 142.379 34.56 20.523 11.435 46.549 4.096 58.069-16.427 11.52-20.565 4.139-46.592-16.384-58.069z","M571.674 869.773l0.341 57.259c0 6.443 5.248 11.648 11.691 11.648h56.875c3.115 0 6.101-1.237 8.32-3.456l171.861-171.861c6.741-6.741 6.741-17.664 0-24.405l-50.432-50.475c-6.144-6.144-16.128-6.144-22.272 0l-172.928 172.971c-2.219 2.176-3.456 5.205-3.456 8.32z","M872.171 711.94l63.104-63.104c4.736-4.693 4.736-12.416 0-17.152l-56.661-56.576c-4.693-4.736-12.416-4.736-17.152 0l-63.061 63.061c-4.779 4.736-4.779 12.459 0 17.195l56.576 56.576c4.736 4.736 12.459 4.736 17.195 0z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["edit-owner"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":79,"id":55,"name":"edit-owner","prevSize":32,"code":59701},"setIdx":0,"setId":2,"iconIdx":48},{"icon":{"paths":["M555.115 170.667c70.571 0 128 57.429 128 128s-57.429 128-128 128c-70.571 0-128-57.429-128-128s57.429-128 128-128zM979.947 884.309c-48.256-165.376-128.299-351.232-319.403-401.323 64.128-36.821 107.904-105.216 107.904-184.32 0-117.632-95.701-213.333-213.333-213.333s-213.333 95.701-213.333 213.333c0 79.317 44.032 147.883 108.459 184.619-27.989 7.552-54.613 17.877-79.317 31.701-20.608 11.52-27.947 37.504-16.384 58.069 11.435 20.48 37.504 27.947 58.027 16.341 41.515-23.168 88.107-34.475 142.421-34.475 168.192 0 270.805 105.643 343.040 353.28 5.419 18.645 22.443 30.72 40.96 30.72 3.925 0 7.979-0.555 11.947-1.707 22.656-6.571 35.584-30.293 29.013-52.907z","M298.624 725.461h85.333c23.552 0 42.667 19.115 42.667 42.667 0 23.595-19.115 42.667-42.667 42.667h-85.333v85.333c0 23.552-19.072 42.667-42.667 42.667-23.552 0-42.667-19.115-42.667-42.667v-85.333h-85.291c-23.552 0-42.667-19.072-42.667-42.667 0-23.552 19.115-42.667 42.667-42.667h85.291v-85.291c0-23.595 19.115-42.667 42.667-42.667 23.595 0 42.667 19.072 42.667 42.667v85.291z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["add-owner"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":78,"id":54,"name":"add-owner","prevSize":32,"code":59702},"setIdx":0,"setId":2,"iconIdx":49},{"icon":{"paths":["M979.541 884.314c-65.873-225.809-162.812-360.751-316.979-401.515 63.13-37.052 105.519-105.64 105.519-184.123 0-117.815-95.518-213.333-213.333-213.333-117.845 0-213.334 95.505-213.334 213.333 0 78.872 42.786 147.741 106.424 184.661-72.535 19.913-133.866 61.282-184.672 122.799-15.005 18.172-12.44 45.065 5.728 60.070 18.169 15.002 45.062 12.437 60.067-5.73 58.092-70.34 130.554-105.549 225.62-105.549 172.625 0 272.363 111.010 343.040 353.284 6.601 22.618 30.289 35.61 52.907 29.009 22.622-6.601 35.61-30.285 29.013-52.907zM682.748 298.676c0 70.687-57.314 128-128 128-70.711 0-128-57.297-128-128s57.289-128 128-128c70.686 0 128 57.314 128 128z","M494.182 853.551h-366.161c-23.564 0-42.667-19.102-42.667-42.667s19.102-42.667 42.667-42.667h366.23l-12.079-12.079c-16.661-16.661-16.661-43.678 0-60.339s43.678-16.661 60.339 0l84.864 84.864c16.661 16.657 16.661 43.669 0.009 60.331l-84.864 84.907c-16.661 16.666-43.674 16.674-60.339 0.017-16.67-16.657-16.674-43.674-0.017-60.339l12.019-12.028z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["send-to"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":77,"id":53,"name":"send-to","prevSize":32,"code":59703},"setIdx":0,"setId":2,"iconIdx":50},{"icon":{"paths":["M682.671 383.957c47.061 0 85.333 38.272 85.333 85.333s-38.272 85.333-85.333 85.333c-47.061 0-85.333-38.272-85.333-85.333s38.272-85.333 85.333-85.333zM341.252 170.667c47.061 0 85.333 38.272 85.333 85.333s-38.272 85.333-85.333 85.333c-47.019 0-85.333-38.272-85.333-85.333s38.315-85.333 85.333-85.333zM979.503 884.011c-29.355-100.779-81.621-228.523-204.416-271.616 46.976-30.421 78.251-83.072 78.251-143.104 0-94.123-76.544-170.667-170.667-170.667-86.315 0-157.141 64.64-168.363 147.925-22.528-19.541-49.408-35.968-81.195-47.189 47.275-30.379 78.805-83.115 78.805-143.36 0-94.123-76.544-170.667-170.667-170.667s-170.667 76.544-170.667 170.667c0 60.032 31.317 112.725 78.336 143.104-122.88 43.093-175.147 170.88-204.544 271.701-6.571 22.613 6.357 46.336 29.013 52.907 3.968 1.152 7.979 1.707 11.947 1.707 18.517 0 35.541-12.075 40.96-30.72 46.080-157.909 110.379-225.28 215.040-225.28 92.288 0 151.552 51.371 195.968 168.917-85.973 56.405-126.934 160.683-151.723 245.675-6.571 22.613 6.443 46.336 29.013 52.907 4.011 1.152 8.021 1.707 11.947 1.707 18.518 0 35.542-12.075 40.96-30.72 46.037-157.909 110.336-225.28 215.040-225.28 104.661 0 168.96 67.371 215.040 225.28 6.571 22.571 29.952 35.584 52.907 29.013 22.656-6.571 35.584-30.293 29.013-52.907z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["owners"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":76,"id":52,"name":"owners","prevSize":32,"code":59704},"setIdx":0,"setId":2,"iconIdx":51},{"icon":{"paths":["M503.241 180.42l25.553-24.751c93.803-93.751 245.824-93.751 339.584 0.008 91.268 91.269 93.734 237.657 7.407 331.9l-7.403 7.731-128.781 128.823c-93.76 93.709-245.815 93.709-339.584-0.009-9.055-9.054-17.322-18.752-24.714-28.979-13.807-19.093-9.521-45.764 9.574-59.575 19.095-13.807 45.77-9.519 59.577 9.579 4.732 6.545 10.052 12.787 15.893 18.628 58.283 58.249 151.539 60.326 212.305 6.251l6.613-6.238 128.772-128.815c60.48-60.479 60.48-158.478 0-218.956-58.278-58.279-151.488-60.361-212.723-5.82l-6.669 6.293-26.027 25.216c-16.926 16.397-43.938 15.97-60.335-0.954-15.134-15.622-15.936-39.84-2.658-56.369l3.614-3.963z","M284.474 400.029c93.76-93.76 245.826-93.76 339.637 0 6.622 6.624 12.804 13.569 18.56 20.845 14.622 18.477 11.499 45.31-6.98 59.936-18.479 14.622-45.312 11.494-59.934-6.98-3.716-4.698-7.701-9.173-11.981-13.453-58.317-58.287-151.569-60.369-212.351-6.246l-6.617 6.242-128.797 128.755c-60.448 60.48-60.448 158.494-0.009 218.965 58.319 58.317 151.525 60.403 212.157 6.426l6.601-6.225 32.128-32.555c16.55-16.772 43.567-16.951 60.339-0.401 15.479 15.279 16.823 39.475 3.921 56.299l-3.524 4.041-32.324 32.755c-93.805 93.803-245.834 93.803-339.646-0.009-91.216-91.268-93.681-237.641-7.383-331.9l7.397-7.731 128.806-128.764z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["link"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":75,"id":51,"name":"link","prevSize":32,"code":59705},"setIdx":0,"setId":2,"iconIdx":52},{"icon":{"paths":["M426.656 512.149c0-15.859-2.47-31.138-7.048-45.474l216.957-131.441c27.311 29.952 66.65 48.745 110.387 48.745 82.483 0 149.333-66.847 149.333-149.333 0-82.456-66.859-149.333-149.333-149.333s-149.333 66.877-149.333 149.333c0 7.932 0.614 15.72 1.809 23.317l-228.064 138.169c-25.672-20.833-58.396-33.316-94.041-33.316-82.487 0-149.333 66.846-149.333 149.333 0 82.458 66.858 149.333 149.333 149.333 35.651 0 68.385-12.497 94.061-33.348l228.052 138.163c-1.199 7.62-1.818 15.433-1.818 23.39 0 82.487 66.846 149.333 149.333 149.333 82.483 0 149.333-66.846 149.333-149.333s-66.85-149.333-149.333-149.333c-43.712 0-83.034 18.773-110.34 48.695l-216.996-131.465c4.572-14.327 7.040-29.594 7.040-45.436zM746.953 170.645c35.341 0 64 28.666 64 64 0 35.358-28.642 64-64 64-35.362 0-64-28.642-64-64 0-35.334 28.655-64 64-64zM341.323 512.149c0 35.332-28.659 64-64 64s-64-28.668-64-64c0-35.358 28.641-64 64-64s64 28.642 64 64zM746.953 725.687c35.358 0 64 28.642 64 64s-28.642 64-64 64c-35.362 0-64-28.642-64-64s28.638-64 64-64z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["share"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":74,"id":50,"name":"share","prevSize":32,"code":59706},"setIdx":0,"setId":2,"iconIdx":53},{"icon":{"paths":["M853.333 853.333v-341.333c0-23.565 19.102-42.667 42.667-42.667s42.667 19.102 42.667 42.667v341.333c0 47.13-38.204 85.333-85.333 85.333h-682.667c-47.128 0-85.333-38.204-85.333-85.333v-682.667c0-47.128 38.205-85.333 85.333-85.333h341.333c23.565 0 42.667 19.103 42.667 42.667s-19.102 42.667-42.667 42.667h-341.333v682.667h682.667z","M790.848 170.667h-110.327c-23.561 0-42.667-19.103-42.667-42.667s19.106-42.667 42.667-42.667h213.333c11.785 0 22.451 4.776 30.174 12.497 7.718 7.721 12.493 18.388 12.493 30.17v213.333c0 23.564-19.102 42.667-42.667 42.667-23.561 0-42.667-19.103-42.667-42.667v-110.327l-394.351 394.355c-16.661 16.661-43.677 16.661-60.34 0-16.662-16.666-16.662-43.678 0-60.343l394.351-394.351z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["external-link"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":73,"id":49,"name":"external-link","prevSize":32,"code":59707},"setIdx":0,"setId":2,"iconIdx":54},{"icon":{"paths":["M170.667 512v341.333c0 22.63 8.99 44.335 24.994 60.339s37.708 24.994 60.34 24.994h512c22.63 0 44.335-8.99 60.339-24.994s24.994-37.709 24.994-60.339v-341.333","M682.667 256l-170.667-170.667-170.667 170.667","M512 85.333v554.667"],"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["export"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0},{"s":0},{"s":0}]}},"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"properties":{"order":140,"id":48,"name":"export","prevSize":32,"code":59708},"setIdx":0,"setId":2,"iconIdx":55},{"icon":{"paths":["M704.009 128h63.991c47.13 0 85.333 38.205 85.333 85.333v640c0 47.13-38.204 85.333-85.333 85.333h-512c-47.128 0-85.333-38.204-85.333-85.333v-640c0-47.128 38.205-85.333 85.333-85.333h63.992c19.46-25.908 50.444-42.667 85.341-42.667h213.333c34.897 0 65.882 16.759 85.342 42.667zM300.8 213.333h-44.8v640h512v-640h-44.8c-9.882 48.688-52.928 85.333-104.533 85.333h-213.333c-51.604 0-94.65-36.646-104.533-85.333zM384 192c0 11.782 9.551 21.333 21.333 21.333h213.333c11.78 0 21.333-9.551 21.333-21.333s-9.553-21.333-21.333-21.333h-213.333c-11.782 0-21.333 9.551-21.333 21.333z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["paste"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":71,"id":47,"name":"paste","prevSize":32,"code":59709},"setIdx":0,"setId":2,"iconIdx":56},{"icon":{"paths":["M384 298.667h-170.667c-47.128 0-85.333 38.205-85.333 85.333v469.333c0 47.13 38.205 85.333 85.333 85.333h341.333c47.13 0 85.333-38.204 85.333-85.333v-128h170.667c47.13 0 85.333-38.204 85.333-85.333v-469.333c0-47.128-38.204-85.333-85.333-85.333h-341.333c-47.128 0-85.333 38.205-85.333 85.333v128zM640 640v-256c0-47.128-38.204-85.333-85.333-85.333h-85.333v-128h341.333v469.333h-170.667zM213.333 853.333v-469.333h341.333v469.333h-341.333z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["copy"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":70,"id":46,"name":"copy","prevSize":32,"code":59710},"setIdx":0,"setId":2,"iconIdx":57},{"icon":{"paths":["M528.73 869.734l0.299 57.259c0.043 6.443 5.248 11.648 11.691 11.648h56.875c3.115 0 6.101-1.237 8.32-3.413l171.861-171.904c6.741-6.741 6.741-17.707 0-24.448l-50.432-50.432c-6.144-6.144-16.128-6.144-22.272 0l-172.928 172.971c-2.219 2.176-3.456 5.205-3.413 8.32z","M829.188 711.898l63.104-63.061c4.736-4.736 4.736-12.459 0-17.195l-56.619-56.619c-4.736-4.736-12.459-4.736-17.195 0l-63.061 63.104c-4.779 4.736-4.779 12.459 0 17.195l56.619 56.576c4.736 4.736 12.416 4.736 17.152 0z","M554.603 342.191v-136.107l135.552 135.424-135.552 0.683zM810.688 469.295v-112.085c0-10.24-4.096-20.011-11.349-27.221l-231.765-231.552c-8.405-8.405-19.755-13.099-31.616-13.099h-322.603c-47.189 0-85.333 38.187-85.333 85.333v682.666c0 47.104 38.144 85.333 85.333 85.333h170.197c0.171 0 0.299 0.085 0.469 0.085 23.595 0 42.667-19.115 42.667-42.667s-19.072-42.667-42.667-42.667v-0.085h-170.667v-682.666h255.915v171.52c0 46.464 37.888 84.267 84.437 84.267h171.648v43.050h0.085c0.256 23.381 19.157 42.283 42.581 42.283 23.467 0 42.368-18.901 42.581-42.283h0.085v-0.213z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["sign"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":69,"id":45,"name":"sign","prevSize":32,"code":59711},"setIdx":0,"setId":2,"iconIdx":58},{"icon":{"paths":["M256.021 853.35v-682.667h255.915v171.52c0 46.421 37.888 84.224 84.437 84.224h171.648v426.923h-512zM732.821 341.478l-135.552 0.725v-136.107l135.552 135.381zM842.005 329.958l-231.765-231.509c-8.405-8.405-19.755-13.099-31.573-13.099h-322.646c-47.147 0-85.333 38.229-85.333 85.333v682.667c0 47.104 38.187 85.333 85.333 85.333h512c47.104 0 85.333-38.229 85.333-85.333v-496.171c0-10.197-4.096-20.011-11.349-27.221z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["document"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":68,"id":44,"name":"document","prevSize":32,"code":59712},"setIdx":0,"setId":2,"iconIdx":59},{"icon":{"paths":["M204.905 120.436c21.922-22.477 51.655-35.103 82.657-35.103h299.25c11.162 0 21.862 4.546 29.756 12.637l224.439 230.113c7.893 8.091 12.326 19.066 12.326 30.509v460.224c0 31.782-12.314 62.268-34.236 84.745-0.004 0-0.004 0-0.004 0.004-0.004 0-0.004 0.004-0.009 0.004-21.926 22.485-51.661 35.098-82.65 35.098h-448.873c-30.997 0-60.733-12.617-82.661-35.106-21.923-22.477-34.234-52.962-34.234-84.745v-613.632c0-31.786 12.316-62.27 34.237-84.747 0 0 0 0 0-0zM287.562 171.626c-8.682 0-17.007 3.536-23.144 9.828l-0 0.001c-6.138 6.294-9.587 14.83-9.587 23.729v613.632c0 8.905 3.45 17.438 9.584 23.727l0.006 0.009c6.132 6.289 14.453 9.822 23.141 9.822h448.873c8.687 0 17.011-3.537 23.138-9.822l0.013-0.013c6.135-6.285 9.583-14.822 9.583-23.723v-417.077h-182.396c-11.162 0-21.867-4.547-29.756-12.64-7.893-8.093-12.326-19.069-12.326-30.513l0.030-186.96h-257.159zM628.877 232.626l-0.013 82.82h80.794l-80.781-82.82zM320.31 396.963c0-23.829 18.841-43.146 42.082-43.146h74.813c23.241 0 42.082 19.317 42.082 43.146s-18.842 43.148-42.082 43.148h-74.813c-23.241 0-42.082-19.319-42.082-43.148zM320.255 550.391c0-23.829 18.841-43.149 42.082-43.149h299.248c23.241 0 42.082 19.319 42.082 43.149s-18.842 43.145-42.082 43.145h-299.248c-23.241 0-42.082-19.315-42.082-43.145zM320.255 703.761c0-23.829 18.841-43.145 42.082-43.145h299.248c23.241 0 42.082 19.315 42.082 43.145s-18.842 43.149-42.082 43.149h-299.248c-23.241 0-42.082-19.319-42.082-43.149z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["file"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":67,"id":43,"name":"file","prevSize":32,"code":59713},"setIdx":0,"setId":2,"iconIdx":60},{"icon":{"paths":["M170.682 426.662c0-141.184 114.816-256 256.001-256 141.141 0 256 114.816 256 256s-114.859 256-256 256c-141.185 0-256.001-114.816-256.001-256zM926.097 865.83l-230.059-230.059c44.928-57.771 71.979-130.219 71.979-209.109 0-188.501-152.832-341.333-341.333-341.333-188.545 0-341.335 152.832-341.335 341.333s152.789 341.333 341.335 341.333c78.848 0 151.253-27.008 208.981-71.893l230.101 230.059c16.597 16.597 43.733 16.597 60.331 0s16.597-43.733 0-60.331z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["search"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":66,"id":42,"name":"search","prevSize":32,"code":59714},"setIdx":0,"setId":2,"iconIdx":61},{"icon":{"paths":["M750.626 385.792l-110.123-111.061 105.344-103.253 106.539 107.477c0.256 0.256-0.213 4.352 0.085 4.608l-101.845 102.229zM281.163 853.333h-110.507v-111.829l408.962-406.955 110.72 111.659-409.175 407.125zM938.658 279.765c-0.299-23.723-9.728-45.653-25.685-60.885l-105.771-106.667c-15.744-16.811-38.187-26.581-61.653-26.88h-1.152c-23.509 0-46.293 9.472-62.635 25.899l-583.852 582.272c-8.021 7.979-12.587 18.901-12.587 30.251v172.245c0 23.595 19.072 42.667 42.667 42.667h170.795c11.307 0 22.101-4.437 30.080-12.416l584.108-582.485c16.64-16.811 26.027-40.149 25.685-64z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["edit"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":65,"id":41,"name":"edit","prevSize":32,"code":59715},"setIdx":0,"setId":2,"iconIdx":62},{"icon":{"paths":["M426.667 768.414c23.595 0 42.667-19.072 42.667-42.667v-256c0-23.595-19.072-42.667-42.667-42.667s-42.667 19.072-42.667 42.667v256c0 23.595 19.072 42.667 42.667 42.667z","M597.376 768.414c23.595 0 42.667-19.072 42.667-42.667v-256c0-23.595-19.072-42.667-42.667-42.667s-42.667 19.072-42.667 42.667v256c0 23.595 19.072 42.667 42.667 42.667z","M704.546 834.167c-0.555 10.837-11.008 19.328-21.205 19.243h-343.34c-9.813-1.109-19.669-8.363-20.224-19.541l-27.648-492.544h438.914l-26.496 492.843zM426.528 196.941c0-14.251 12.076-26.283 26.327-26.283h118.101c14.507 0 26.325 11.819 26.325 26.283v59.051h-170.754v-59.051zM853.325 255.991h-74.155c-0.256 0-0.512-0.213-0.811-0.213-0.512-0.043-0.939 0.213-1.493 0.213h-94.251v-59.051c0-61.525-50.048-111.616-111.659-111.616h-118.101c-61.57 0-111.66 50.091-111.66 111.616v59.051h-170.539c-23.552 0-42.667 19.072-42.667 42.667s19.115 42.667 42.667 42.667h36.053l27.861 496.939c2.688 55.893 49.536 100.523 104.107 100.523 0.768 0 1.536-0.043 2.304-0.043h343.767c55.467 0 102.357-44.544 105.045-100.181l26.709-497.237h36.821c23.595 0 42.667-19.072 42.667-42.667s-19.072-42.667-42.667-42.667z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["delete"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":64,"id":40,"name":"delete","prevSize":32,"code":59716},"setIdx":0,"setId":2,"iconIdx":63},{"icon":{"paths":["M938.667 512c0 235.639-191.027 426.667-426.667 426.667-235.642 0-426.667-191.027-426.667-426.667 0-235.642 191.025-426.667 426.667-426.667 235.639 0 426.667 191.025 426.667 426.667zM170.667 512c0 188.514 152.82 341.333 341.333 341.333s341.333-152.819 341.333-341.333c0-188.513-152.819-341.333-341.333-341.333s-341.333 152.82-341.333 341.333z","M572.343 512l90.509 90.509c16.661 16.661 16.661 43.678 0 60.339-16.661 16.666-43.678 16.666-60.339 0l-90.509-90.509-90.511 90.509c-16.663 16.666-43.677 16.666-60.34 0-16.662-16.661-16.662-43.678 0-60.339l90.508-90.509-90.508-90.51c-16.662-16.663-16.662-43.677 0-60.34s43.677-16.662 60.34 0l90.511 90.511 90.509-90.511c16.661-16.662 43.678-16.662 60.339 0s16.661 43.677 0 60.34l-90.509 90.51z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["close-outlined"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":63,"id":39,"name":"close-outlined","prevSize":32,"code":59717},"setIdx":0,"setId":2,"iconIdx":64},{"icon":{"paths":["M938.675 511.987c0 235.648-191.061 426.667-426.667 426.667-235.646 0-426.665-191.019-426.665-426.667 0-235.605 191.019-426.667 426.665-426.667 235.605 0 426.667 191.061 426.667 426.667zM572.352 512.004l146.782-146.765c16.597-16.64 16.597-43.733 0-60.373-16.64-16.597-43.733-16.597-60.373 0l-146.761 146.782-146.784-146.782c-16.597-16.597-43.733-16.597-60.331 0-16.597 16.64-16.597 43.733 0 60.373l146.763 146.765-146.763 146.782c-16.597 16.597-16.597 43.733 0 60.331s43.733 16.597 60.331 0l146.784-146.765 146.761 146.765c16.64 16.597 43.733 16.597 60.373 0 16.597-16.597 16.597-43.733 0-60.331l-146.782-146.782z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["close-filled"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":62,"id":38,"name":"close-filled","prevSize":32,"code":59718},"setIdx":0,"setId":2,"iconIdx":65},{"icon":{"paths":["M566.336 512l318.455 318.46c14.942 14.976 14.942 39.364 0 54.306-14.98 14.98-39.369 14.98-54.345 0l-318.447-318.434-318.446 318.434c-14.979 14.98-39.367 14.98-54.345 0-14.94-14.942-14.94-39.33 0-54.306l318.455-318.46-318.459-318.449c-14.94-14.979-14.94-39.367 0-54.346 14.979-14.94 39.367-14.94 54.345 0l318.449 318.455 318.451-318.455c14.976-14.94 39.364-14.94 54.345 0 14.938 14.979 14.938 39.368 0 54.346l-318.46 318.449z"],"attrs":[{"strokeLinejoin":"miter","strokeLinecap":"butt","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["close"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0}]}},"attrs":[{"strokeLinejoin":"miter","strokeLinecap":"butt","strokeMiterlimit":"4","strokeWidth":42.666666666666664}],"properties":{"order":134,"id":37,"name":"close","prevSize":32,"code":59719},"setIdx":0,"setId":2,"iconIdx":66},{"icon":{"paths":["M938.667 512c0 235.639-191.027 426.667-426.667 426.667-235.642 0-426.667-191.027-426.667-426.667 0-235.642 191.025-426.667 426.667-426.667 235.639 0 426.667 191.025 426.667 426.667zM170.667 512c0 188.514 152.82 341.333 341.333 341.333s341.333-152.819 341.333-341.333c0-188.513-152.819-341.333-341.333-341.333s-341.333 152.82-341.333 341.333z","M554.667 469.333h128c23.565 0 42.667 19.102 42.667 42.667s-19.102 42.667-42.667 42.667h-128v128c0 23.565-19.102 42.667-42.667 42.667s-42.667-19.102-42.667-42.667v-128h-128c-23.564 0-42.667-19.102-42.667-42.667s19.103-42.667 42.667-42.667h128v-128c0-23.564 19.102-42.667 42.667-42.667s42.667 19.103 42.667 42.667v128z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["plus-outlined"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":60,"id":36,"name":"plus-outlined","prevSize":32,"code":59720},"setIdx":0,"setId":2,"iconIdx":67},{"icon":{"paths":["M938.667 512c0 235.639-191.027 426.667-426.667 426.667-235.642 0-426.667-191.027-426.667-426.667 0-235.642 191.025-426.667 426.667-426.667 235.639 0 426.667 191.025 426.667 426.667zM682.667 469.333h-128v-128c0-23.564-19.102-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v128h-128c-23.564 0-42.667 19.102-42.667 42.667s19.103 42.667 42.667 42.667h128v128c0 23.565 19.102 42.667 42.667 42.667s42.667-19.102 42.667-42.667v-128h128c23.565 0 42.667-19.102 42.667-42.667s-19.102-42.667-42.667-42.667z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["plus-filled"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":59,"id":35,"name":"plus-filled","prevSize":32,"code":59721},"setIdx":0,"setId":2,"iconIdx":68},{"icon":{"paths":["M503.019 170.667c24.802 0 44.911 20.108 44.911 44.912v592.844c0 24.802-20.109 44.911-44.911 44.911-24.806 0-44.915-20.109-44.915-44.911v-592.844c0-24.804 20.109-44.912 44.915-44.912z","M853.333 503.019c0 24.802-20.109 44.911-44.911 44.911h-592.844c-24.804 0-44.912-20.109-44.912-44.911 0-24.806 20.108-44.915 44.912-44.915h592.844c24.802 0 44.911 20.109 44.911 44.915z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["plus"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":58,"id":34,"name":"plus","prevSize":32,"code":59722},"setIdx":0,"setId":2,"iconIdx":69},{"icon":{"paths":["M512 1024c282.768 0 512-229.232 512-512 0-282.77-229.232-512-512-512-282.77 0-512 229.23-512 512 0 282.768 229.23 512 512 512z","M501.592 258.457c6.554-3.276 14.262-3.276 20.815 0l232.723 116.364c7.885 3.942 12.865 12 12.865 20.816s-4.98 16.874-12.865 20.816l-232.723 116.363c-6.554 3.277-14.262 3.277-20.815 0l-232.723-116.363c-7.884-3.942-12.865-12-12.865-20.816s4.98-16.874 12.865-20.816l232.723-116.364zM331.316 395.636l180.684 90.345 180.685-90.345-180.685-90.344-180.684 90.344zM258.462 501.592c5.748-11.497 19.727-16.156 31.223-10.408l222.315 111.16 222.315-111.16c11.497-5.748 25.474-1.089 31.223 10.408s1.089 25.474-10.408 31.223l-232.723 116.364c-6.554 3.277-14.262 3.277-20.815 0l-232.723-116.364c-11.496-5.748-16.156-19.726-10.408-31.223zM258.462 617.956c5.748-11.497 19.727-16.156 31.223-10.408l222.315 111.16 222.315-111.16c11.497-5.748 25.474-1.089 31.223 10.408s1.089 25.474-10.408 31.223l-232.723 116.364c-6.554 3.277-14.262 3.277-20.815 0l-232.723-116.364c-11.496-5.748-16.156-19.726-10.408-31.223z"],"attrs":[{"fill":"rgb(255, 214, 0)"},{"fill":"rgb(0, 0, 0)"}],"isMulticolor":true,"isMulticolor2":false,"grid":0,"tags":["transaction-batch"],"colorPermutations":{"11611631671181918125521401255951141":[{"f":2},{"f":0}]}},"attrs":[{"fill":"rgb(255, 214, 0)"},{"fill":"rgb(0, 0, 0)"}],"properties":{"order":146,"id":33,"name":"transaction-batch","prevSize":32,"code":59723,"codes":[59723,59724]},"setIdx":0,"setId":2,"iconIdx":70},{"icon":{"paths":["M234.667 192h170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667z","M234.667 576h170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667z","M618.667 192h170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667z","M618.667 576h170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["blocks-1"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{}]}},"attrs":[{},{},{},{}],"properties":{"order":56,"id":32,"name":"blocks-1","prevSize":32,"code":59725},"setIdx":0,"setId":2,"iconIdx":71},{"icon":{"paths":["M128 224c0-35.346 28.654-64 64-64h640c35.345 0 64 28.654 64 64s-28.655 64-64 64h-640c-35.346 0-64-28.654-64-64z","M128 736c0-35.345 28.654-64 64-64h640c35.345 0 64 28.655 64 64s-28.655 64-64 64h-640c-35.346 0-64-28.655-64-64z","M128 480c0-35.345 28.654-64 64-64h640c35.345 0 64 28.655 64 64s-28.655 64-64 64h-640c-35.346 0-64-28.655-64-64z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["rows-1"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":55,"id":31,"name":"rows-1","prevSize":32,"code":59726},"setIdx":0,"setId":2,"iconIdx":72},{"icon":{"paths":["M494.656 89.428c10.918-5.46 23.77-5.46 34.688 0l387.874 193.939c13.141 6.57 21.44 20.001 21.44 34.693s-8.299 28.122-21.44 34.693l-387.874 193.939c-10.918 5.461-23.77 5.461-34.688 0l-387.873-193.939c-13.14-6.57-21.441-20.001-21.441-34.693s8.3-28.123 21.441-34.693l387.873-193.939zM210.86 318.061l301.14 150.573 301.141-150.573-301.141-150.573-301.14 150.573zM89.437 494.652c9.58-19.157 32.879-26.927 52.038-17.344l370.525 185.267 370.526-185.267c19.157-9.583 42.458-1.813 52.036 17.344 9.583 19.162 1.813 42.462-17.344 52.041l-387.874 193.941c-10.918 5.457-23.77 5.457-34.688 0l-387.873-193.941c-19.16-9.579-26.926-32.879-17.346-52.041zM89.437 688.593c9.58-19.162 32.879-26.927 52.038-17.348l370.525 185.267 370.526-185.267c19.157-9.579 42.458-1.813 52.036 17.348 9.583 19.162 1.813 42.458-17.344 52.041l-387.874 193.937c-10.918 5.461-23.77 5.461-34.688 0l-387.873-193.937c-19.16-9.583-26.926-32.879-17.346-52.041z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["batch"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":54,"id":30,"name":"batch","prevSize":32,"code":59727},"setIdx":0,"setId":2,"iconIdx":73},{"icon":{"paths":["M181.33 239.36c86.187 110.507 245.333 315.307 245.333 315.307v256c0 23.467 19.199 42.667 42.665 42.667h85.333c23.467 0 42.667-19.2 42.667-42.667v-256c0 0 158.72-204.8 244.907-315.307 21.76-28.16 1.707-68.693-33.707-68.693h-593.492c-35.413 0-55.467 40.533-33.707 68.693z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["filter"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":53,"id":29,"name":"filter","prevSize":32,"code":59728},"setIdx":0,"setId":2,"iconIdx":74},{"icon":{"paths":["M246.137 161.741c21.004-21.604 49.492-33.741 79.196-33.741h373.333c29.705 0 58.193 12.137 79.198 33.741 21.001 21.604 32.802 50.906 32.802 81.459v614.4c0 14.383-7.817 27.563-20.25 34.142-12.437 6.583-27.405 5.466-38.784-2.893l-239.633-176.060-239.634 176.060c-11.38 8.358-26.348 9.476-38.782 2.893-12.435-6.579-20.25-19.759-20.25-34.142v-614.4c0-30.553 11.8-59.855 32.804-81.459z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["bookmark-filled"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":52,"id":28,"name":"bookmark-filled","prevSize":32,"code":59729},"setIdx":0,"setId":2,"iconIdx":75},{"icon":{"paths":["M325.333 204.8c-9.901 0-19.397 4.046-26.399 11.247s-10.935 16.969-10.935 27.153v539.78l202.3-148.629c12.983-9.536 30.417-9.536 43.401 0l202.3 148.629v-539.78c0-10.184-3.934-19.951-10.935-27.153s-16.495-11.247-26.398-11.247h-373.333zM246.137 161.741c21.004-21.604 49.492-33.741 79.196-33.741h373.333c29.705 0 58.193 12.137 79.198 33.741 21.001 21.604 32.802 50.906 32.802 81.459v614.4c0 14.383-7.817 27.563-20.25 34.142-12.437 6.583-27.405 5.466-38.784-2.893l-239.633-176.060-239.634 176.060c-11.38 8.358-26.348 9.476-38.782 2.893-12.435-6.579-20.25-19.759-20.25-34.142v-614.4c0-30.553 11.8-59.855 32.804-81.459z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["bookmark"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":51,"id":27,"name":"bookmark","prevSize":32,"code":59730},"setIdx":0,"setId":2,"iconIdx":76},{"icon":{"paths":["M512.009 42.671c-63.962-0.254-127.283 12.687-186.014 38.014s-111.606 62.497-155.32 109.186v-83.2c0.070-6.185-1.206-12.311-3.738-17.954s-6.262-10.668-10.929-14.726c-4.667-4.059-10.161-7.054-16.101-8.778s-12.183-2.137-18.298-1.209c-10.351 2.006-19.661 7.599-26.295 15.793s-10.164 18.466-9.972 29.007v189.867c0 11.316 4.495 22.168 12.497 30.17s18.854 12.497 30.17 12.497h192c6.185 0.070 12.311-1.206 17.954-3.738s10.668-6.262 14.726-10.929c4.059-4.667 7.054-10.161 8.779-16.101s2.137-12.183 1.208-18.298c-2.006-10.351-7.599-19.661-15.793-26.295s-18.466-10.164-29.007-9.972h-91.733c49.696-55.344 114.396-95.063 186.238-114.332 71.84-19.269 147.736-17.258 218.456 5.789s133.227 66.136 179.921 124.034c46.694 57.898 75.571 128.111 83.119 202.109 1.058 10.56 6.020 20.348 13.909 27.447s18.142 11.004 28.757 10.953c5.982 0.030 11.9-1.199 17.374-3.605 5.478-2.406 10.385-5.935 14.409-10.359 4.023-4.429 7.074-9.647 8.947-15.33 1.873-5.679 2.534-11.686 1.937-17.638-11.639-115.805-65.89-223.153-152.226-301.208-86.332-78.054-198.588-121.247-314.974-121.193z","M896.081 682.667h-192c-6.187-0.068-12.309 1.207-17.954 3.738-5.645 2.534-10.667 6.263-14.724 10.931-4.062 4.668-7.057 10.159-8.781 16.098-1.724 5.943-2.138 12.186-1.207 18.3 2.005 10.351 7.599 19.661 15.791 26.295 8.196 6.635 18.466 10.163 29.009 9.971h91.733c-49.698 55.343-114.398 95.061-186.24 114.334-71.842 19.268-147.733 17.254-218.455-5.79-70.721-23.049-133.227-66.138-179.922-124.036-46.695-57.894-75.571-128.111-83.117-202.108-1.061-10.56-6.021-20.348-13.91-27.447s-18.142-11.004-28.756-10.953c-5.981-0.030-11.901 1.199-17.377 3.605s-10.385 5.935-14.408 10.359c-4.023 4.429-7.071 9.647-8.946 15.33-1.875 5.679-2.534 11.686-1.936 17.638 8.961 89.579 43.494 174.686 99.483 245.18s131.070 123.401 216.292 152.405c85.223 29.009 176.986 32.892 264.355 11.191 87.373-21.696 166.656-68.066 228.403-133.577v83.2c-0.073 6.187 1.203 12.309 3.738 17.954s6.263 10.667 10.927 14.724c4.668 4.062 10.163 7.057 16.102 8.781s12.186 2.138 18.3 1.207c10.351-2.005 19.661-7.599 26.295-15.791 6.63-8.196 10.163-18.466 9.971-29.009v-189.867c0-11.315-4.497-22.17-12.497-30.17s-18.854-12.497-30.17-12.497z","M738.842 465.613h-180.275v-180.275c0-25.617-20.766-46.409-46.409-46.409-25.617 0-46.409 20.791-46.409 46.409v180.275h-180.227c-25.641 0-46.408 20.791-46.408 46.409s20.768 46.409 46.408 46.409h180.227v180.25c0 25.617 20.791 46.409 46.409 46.409 25.643 0 46.409-20.791 46.409-46.409v-180.25h180.275c25.617 0 46.404-20.791 46.404-46.409s-20.787-46.409-46.404-46.409z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-recovery"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":50,"id":26,"name":"transaction-recovery","prevSize":32,"code":59731},"setIdx":0,"setId":2,"iconIdx":77},{"icon":{"paths":["M512.081 691.2c-101.632 0-184.235-80.213-184.235-179.2s82.517-179.2 184.32-179.2c101.717 0 184.149 80.213 184.149 179.2s-82.432 179.2-184.235 179.2zM903.164 561.664c2.133-16.384 3.755-32.768 3.755-49.664s-1.621-33.792-3.755-51.2l111.104-83.456c4.843-3.771 8.149-9.172 9.31-15.198 1.165-6.026 0.098-12.269-2.995-17.57l-105.301-177.152c-3.136-5.387-8.085-9.481-13.965-11.545-5.884-2.065-12.305-1.965-18.121 0.281l-131.072 51.2c-27.277-20.606-57.178-37.48-88.917-50.176l-19.541-135.68c-1.161-6.099-4.429-11.595-9.237-15.526-4.804-3.931-10.837-6.047-17.045-5.978h-210.517c-6.223-0.090-12.277 2.017-17.1 5.95s-8.105 9.44-9.268 15.554l-19.456 135.68c-33.195 12.8-61.611 30.208-88.917 50.176l-131.072-51.2c-5.824-2.269-12.268-2.381-18.168-0.315s-10.866 6.173-14.003 11.579l-105.216 177.152c-3.225 5.265-4.365 11.546-3.197 17.609s4.561 11.47 9.512 15.159l111.019 83.456c-2.251 16.977-3.476 34.074-3.669 51.2 0 16.896 1.621 33.28 3.669 49.664l-111.019 84.992c-4.951 3.691-8.343 9.097-9.512 15.159s-0.028 12.343 3.197 17.609l105.216 177.152c6.315 11.264 20.565 15.36 32.171 11.264l131.072-51.712c27.307 20.48 55.723 37.888 88.917 50.688l19.456 135.68c1.164 6.114 4.445 11.622 9.268 15.552 4.823 3.934 10.877 6.042 17.1 5.952h210.517c6.208 0.068 12.241-2.048 17.045-5.978 4.809-3.93 8.077-9.429 9.237-15.526l19.541-135.68c31.757-12.873 61.662-29.918 88.917-50.688l131.072 51.712c11.605 4.096 25.771 0 32.085-11.264l105.301-177.152c3.093-5.299 4.16-11.541 2.995-17.57-1.161-6.025-4.467-11.426-9.31-15.198l-111.104-84.992z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-change-settings"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":49,"id":25,"name":"transaction-change-settings","prevSize":32,"code":59732},"setIdx":0,"setId":2,"iconIdx":78},{"icon":{"paths":["M384.023 810.637c-10.913 0-21.825-4.186-30.138-12.463l-256.063-255.953c-7.971-8.026-12.49-18.863-12.49-30.212 0-11.307 4.518-22.187 12.49-30.161l255.849-256.002c16.667-16.683 43.651-16.683 60.275 0 16.666 16.683 16.666 43.648 0 60.331l-225.669 225.833 225.882 225.754c16.666 16.683 16.666 43.644 0.043 60.373-8.312 8.316-19.267 12.501-30.18 12.501z","M640.009 810.637c-10.923 0-21.845-4.186-30.165-12.501-16.683-16.683-16.683-43.652 0-60.335l225.792-225.792-225.792-225.833c-16.683-16.683-16.683-43.648 0-60.331s43.648-16.683 60.331 0l255.962 256.002c16.678 16.678 16.678 43.648 0 60.331l-255.962 255.957c-8.32 8.316-19.238 12.501-30.165 12.501z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-contract"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":48,"id":24,"name":"transaction-contract","prevSize":32,"code":59733},"setIdx":0,"setId":2,"iconIdx":79},{"icon":{"paths":["M897.032 99.153c2.961 2.253 5.607 4.901 7.86 7.872 37.29 49.112 14.074 242.14-55.288 328.405l-6.431 7.545-18.506 18.678 1.896 10.543c19.878 119.267 0.057 230.666-45.294 329.597-19.915 43.442-40.096 74.924-54.338 92.721-14.201 17.744-39.637 20.316-56.975 6.685l-3.846-3.432-136.684-138.031-29.475 29.848c-44.397 44.745-124.609 7.549-199.403-65.319l-7.22-7.16c-74.377-75.092-114.932-157.11-75.762-204.194l4.041-4.448 29.413-29.729-136.609-137.993c-17.2-17.371-15.702-45.96 3.219-61.4 17.623-14.381 48.802-34.757 91.823-54.863 100.859-47.136 214.813-66.956 336.893-43.851l18.629-18.704 8.995-7.909c58.298-48.033 152.216-71.286 241.275-71.286 37.99 0 65.409 3.976 81.785 16.428zM587.346 701.26l101.065 102.048c4.329-7.569 8.462-15.393 12.513-23.618l6.005-12.636c32.424-70.738 49.562-148.595 44.503-231.436l-164.086 165.642zM815.247 165.433c-71.029 0-146.907 18.706-187.163 50.672l-6.373 5.449-336.347 339.499 1.029 3.826 2.098 6.078 1.384 3.404 2.501 5.517c11.216 23.376 32.218 51.823 58.882 78.742 26.676 26.931 54.846 48.144 77.987 59.474 3.793 1.86 7.299 3.371 10.437 4.542l4.42 1.503 3.793 1.008 335.704-338.928c26.477-29.211 44.896-81.041 52.543-141.297 2.63-20.728 3.785-41.26 3.523-59.102l-0.324-10.362-0.647-9.090-9.339-0.623-6.836-0.232-7.27-0.079zM219.438 311.785l-11.529 6.395 101.072 102.037 164.131-165.614c-82.064-5.115-159.182 12.186-229.244 44.929-8.541 3.992-16.69 8.092-24.431 12.252z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-execute"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":47,"id":23,"name":"transaction-execute","prevSize":32,"code":59734},"setIdx":0,"setId":2,"iconIdx":80},{"icon":{"paths":["M980.258 154.546c3.703-20.891 3.699-20.892 3.691-20.893l16.439 2.448 2.675 15.065c-0.004-0.008-0.004-0.015-22.805 3.38z","M70.168 151.181l-0.013 0.074-0.029 0.169-0.098 0.578-0.336 2.087c-0.28 1.795-0.663 4.384-1.1 7.688-0.873 6.605-1.961 16.079-2.86 27.772-1.793 23.348-2.842 55.745 0.164 91.934 5.942 71.526 28.060 161.951 96.514 224.671 51.195 46.903 119.207 69.956 182.265 80.905 50.973 8.849 100.099 10.035 137.33 8.9v252.002c0 26.53 23.475 48.038 52.433 48.038s52.433-21.508 52.433-48.038v-252.109c36.843 1.323 86.306 0.474 137.907-8.124 64.137-10.688 133.828-33.724 186.031-81.553 68.463-62.724 90.581-153.159 96.525-224.693 3.008-36.193 1.958-68.593 0.162-91.944-0.896-11.695-1.984-21.17-2.859-27.776-0.435-3.304-0.819-5.894-1.101-7.689l-0.337-2.087-0.094-0.578-0.030-0.169-0.013-0.074-22.805 3.38 3.691-20.893-0.9-0.129-2.278-0.308c-1.958-0.256-4.783-0.608-8.388-1.008-7.211-0.8-17.553-1.798-30.319-2.621-25.485-1.643-60.847-2.604-100.352 0.15-78.071 5.445-176.777 25.712-245.239 88.438-26.227 24.029-45.611 52.096-59.883 81.484-14.268-29.386-33.651-57.45-59.874-81.478-68.455-62.719-167.148-82.984-245.214-88.428-39.498-2.755-74.857-1.793-100.34-0.15-12.763 0.823-23.103 1.82-30.312 2.62-3.606 0.4-6.432 0.751-8.391 1.008l-2.278 0.308-0.631 0.090-0.185 0.027-0.081 0.012 3.688 20.893c-3.702-20.873-3.696-20.892-3.688-20.893l-16.442 2.448-2.672 15.065c0.002-0.008 0.020-0.012 22.802 3.38l-22.802-3.38zM849.673 225.542c19.631-1.369 38.182-1.648 54.579-1.356 0.316 15.023 0.013 32.019-1.481 50.006-5.303 63.805-24.358 125.788-66.112 164.047-41.758 38.259-109.41 55.718-179.051 60.574-19.631 1.37-38.182 1.647-54.575 1.357-0.32-15.023-0.017-32.021 1.481-50.005 5.299-63.806 24.354-125.789 66.112-164.048 41.754-38.258 109.406-55.717 179.046-60.573zM170.461 274.192c-1.494-17.981-1.799-34.972-1.481-49.99 16.392-0.292 34.937-0.012 54.562 1.356 69.631 4.855 137.271 22.312 179.020 60.564 41.747 38.252 60.802 100.224 66.101 164.020 1.493 17.98 1.801 34.974 1.481 49.993-16.393 0.29-34.935 0.013-54.562-1.357-69.63-4.855-137.27-22.315-179.020-60.565s-60.802-100.224-66.102-164.020z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-stake"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":46,"id":22,"name":"transaction-stake","prevSize":32,"code":59735},"setIdx":0,"setId":2,"iconIdx":81},{"icon":{"paths":["M690.655 133.067c-12.157-11.836-31.605-11.576-43.438 0.58-11.837 12.156-11.579 31.605 0.578 43.441l73.273 71.343h-370.421c-41.68 0-81.813 16.114-111.528 45.047-29.744 28.96-46.609 68.416-46.609 109.735v62.032c0 16.966 13.754 30.72 30.72 30.72s30.72-13.754 30.72-30.72v-62.032c0-24.487 9.983-48.143 28.031-65.715 18.075-17.599 42.761-27.628 68.667-27.628h370.396l-73.249 71.321c-12.157 11.835-12.415 31.284-0.578 43.441 11.833 12.153 31.281 12.415 43.438 0.578l127.418-124.060c5.939-5.783 9.29-13.721 9.29-22.010s-3.351-16.227-9.29-22.010l-127.418-124.062zM372.658 567.865c11.836 12.157 11.576 31.605-0.58 43.442l-73.254 71.324h370.368c25.907 0 50.594-10.027 68.669-27.628 18.047-17.572 28.029-41.226 28.029-65.716v-62.030c0-16.966 13.754-30.72 30.72-30.72s30.72 13.754 30.72 30.72v62.030c0 41.32-16.867 80.777-46.608 109.736-29.716 28.934-69.849 45.048-111.53 45.048h-370.384l73.27 71.34c12.156 11.833 12.415 31.285 0.58 43.438-11.836 12.157-31.284 12.415-43.441 0.582l-127.418-124.064c-1.823-1.774-3.403-3.752-4.716-5.882-2.755-4.452-4.403-9.667-4.561-15.249-0.009-0.295-0.013-0.59-0.013-0.885 0-8.847 3.739-16.818 9.723-22.426l126.985-123.638c12.156-11.837 31.605-11.575 43.441 0.578z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-swap"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":45,"id":21,"name":"transaction-swap","prevSize":32,"code":59736},"setIdx":0,"setId":2,"iconIdx":82},{"icon":{"paths":["M777.183 648.356c-34.431 0.045-62.538-28.336-62.493-63.095v-204.367l-423.727 427.783c-24.309 24.543-64.087 24.543-88.396 0-24.353-24.584-24.309-64.7 0-89.24l423.727-427.787-202.472-0.044c-34.386 0-62.496-28.38-62.496-63.095s28.11-63.095 62.496-63.095l353.361 0.045c5.218-0.089 9.9 1.785 14.717 2.99 2.961 0.759 6.058 0.669 8.974 1.83 2.609 1.026 4.641 3.079 6.984 4.551 11.887 6.917 21.746 16.956 27.050 29.807 1.102 2.811 1.016 5.845 1.72 8.79 1.282 4.953 3.052 9.683 3.052 15.127v356.704c0 34.714-28.111 63.095-62.497 63.095z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-outgoing"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":44,"id":20,"name":"transaction-outgoing","prevSize":32,"code":59737},"setIdx":0,"setId":2,"iconIdx":83},{"icon":{"paths":["M235.766 355.070c35.865-0.046 65.146 29.234 65.1 65.097v210.852l441.38-441.361c25.323-25.321 66.756-25.321 92.079 0 25.365 25.367 25.323 66.754 0 92.075l-441.38 441.361 210.908 0.047c35.819 0 65.097 29.278 65.097 65.097s-29.278 65.097-65.097 65.097l-368.086-0.047c-5.433 0.094-10.313-1.839-15.331-3.085-3.084-0.781-6.307-0.691-9.346-1.886-2.717-1.058-4.834-3.179-7.274-4.698-12.385-7.134-22.652-17.493-28.176-30.75-1.151-2.901-1.059-6.033-1.796-9.071-1.335-5.111-3.177-9.988-3.177-15.607v-368.023c0-35.817 29.281-65.097 65.1-65.097z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transaction-incoming"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":43,"id":19,"name":"transaction-incoming","prevSize":32,"code":59738},"setIdx":0,"setId":2,"iconIdx":84},{"icon":{"paths":["M682.667 85.329h-341.333c-70.357 0-128 57.6-128 128v597.333c0 70.4 57.643 128 128 128h341.333c70.4 0 128-57.6 128-128v-597.333c0-70.4-57.6-128-128-128zM682.667 170.663c23.125 0 42.667 19.541 42.667 42.667v597.333c0 23.125-19.541 42.667-42.667 42.667h-341.333c-23.125 0-42.667-19.541-42.667-42.667v-597.333c0-23.125 19.541-42.667 42.667-42.667h341.333z","M512 714.953c-29.44 0-53.333 23.893-53.333 53.333s23.893 53.333 53.333 53.333c29.44 0 53.333-23.893 53.333-53.333s-23.893-53.333-53.333-53.333z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["mobile"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":42,"id":18,"name":"mobile","prevSize":32,"code":59739},"setIdx":0,"setId":2,"iconIdx":85},{"icon":{"paths":["M896 640v85.333c0 47.13-38.204 85.333-85.333 85.333h-640c-47.128 0-85.333-38.204-85.333-85.333v-426.667c0-47.128 38.205-85.333 85.333-85.333h640c47.13 0 85.333 38.205 85.333 85.333v85.333c23.565 0 42.667 19.103 42.667 42.667v170.667c0 23.565-19.102 42.667-42.667 42.667zM810.667 384v-85.333h-640v426.667h640v-85.333h-128c-23.565 0-42.667-19.102-42.667-42.667v-170.667c0-23.564 19.102-42.667 42.667-42.667h128zM725.333 554.667h128v-85.333h-128v85.333z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["wallet"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":41,"id":17,"name":"wallet","prevSize":32,"code":59740},"setIdx":0,"setId":2,"iconIdx":86},{"icon":{"paths":["M895.996 545.707c-6.711 72.627-33.967 141.841-78.583 199.543-44.612 57.702-104.734 101.504-173.333 126.281-68.599 24.781-142.835 29.508-214.025 13.636s-136.384-51.695-187.958-103.266c-51.574-51.575-87.394-116.77-103.267-187.959s-11.144-145.425 13.634-214.025c24.779-68.599 68.581-128.722 126.283-173.335s126.916-71.869 199.543-78.581c-42.522 57.526-62.982 128.403-57.663 199.74s36.069 138.397 86.65 188.979c50.581 50.581 117.641 81.331 188.979 86.652s142.212-15.142 199.74-57.664v0z"],"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["appearance"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0}]}},"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"properties":{"order":142,"id":16,"name":"appearance","prevSize":32,"code":59741},"setIdx":0,"setId":2,"iconIdx":87},{"icon":{"paths":["M704 401.066l-384-221.44","M896 682.667v-341.334c-0.017-14.964-3.964-29.661-11.456-42.617-7.488-12.956-18.253-23.714-31.211-31.197l-298.667-170.667c-12.971-7.489-27.686-11.433-42.667-11.433s-29.696 3.943-42.667 11.433l-298.667 170.667c-12.96 7.482-23.724 18.241-31.212 31.197s-11.439 27.653-11.454 42.617v341.334c0.015 14.963 3.965 29.662 11.454 42.615 7.489 12.958 18.253 23.714 31.212 31.198l298.667 170.667c12.971 7.488 27.686 11.43 42.667 11.43s29.696-3.942 42.667-11.43l298.667-170.667c12.958-7.484 23.723-18.24 31.211-31.198 7.492-12.954 11.439-27.652 11.456-42.615z","M139.521 296.96l372.479 215.467 372.48-215.467","M512 942.080v-430.080"],"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["experimental"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0},{"s":0},{"s":0},{"s":0}]}},"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"properties":{"order":143,"id":15,"name":"experimental","prevSize":32,"code":59742},"setIdx":0,"setId":2,"iconIdx":88},{"icon":{"paths":["M170.675 83.198c-71.871 0-130.134 58.263-130.134 130.133v426.669c0 71.868 58.263 130.129 130.134 130.129h296.533v81.071h-125.867c-24.742 0-44.8 20.058-44.8 44.8 0 24.738 20.058 44.796 44.8 44.796h341.333c24.742 0 44.8-20.058 44.8-44.796 0-24.742-20.058-44.8-44.8-44.8h-125.867v-81.071h296.533c71.872 0 130.133-58.261 130.133-130.129v-426.669c0-71.871-58.261-130.133-130.133-130.133h-682.667zM130.142 213.331c0-22.386 18.147-40.533 40.533-40.533h682.667c22.387 0 40.533 18.147 40.533 40.533v426.669c0 22.383-18.146 40.533-40.533 40.533h-682.667c-22.386 0-40.533-18.15-40.533-40.533v-426.669z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["desktop"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":38,"id":14,"name":"desktop","prevSize":32,"code":59743},"setIdx":0,"setId":2,"iconIdx":89},{"icon":{"paths":["M853.342 170.658c44.966 0 81.843 34.833 85.103 78.968l0.23 6.365v512c0 44.962-34.833 81.839-78.967 85.099l-6.494 0.192c0.004 22.118-16.439 40.128-37.679 42.59l-4.983 0.286c-21.867 0-39.91-16.444-42.377-37.683l-0.294-5.193h-511.956c0.004 22.118-16.477 40.128-37.689 42.59l-4.974 0.286c-23.595 0-42.667-19.072-42.667-42.667-44.93-0.205-81.763-35.029-85.018-79.138l-0.234-6.362v-512c0-44.963 34.833-81.839 78.968-85.099l6.365-0.234h682.665zM853.342 255.991h-682.665v512h682.665v-512z","M639.885 341.367c-94.251 0-170.667 76.416-170.667 170.667s76.416 170.667 170.667 170.667c94.251 0 170.667-76.416 170.667-170.667s-76.416-170.667-170.667-170.667zM639.885 426.701c47.061 0 85.333 38.229 85.333 85.333 0 47.061-38.272 85.333-85.333 85.333s-85.333-38.272-85.333-85.333c0-47.104 38.272-85.333 85.333-85.333z","M298.594 341.325c21.881 0 39.915 16.471 42.38 37.691l0.287 4.976v256c0 23.565-19.102 42.667-42.667 42.667-21.881 0-39.915-16.469-42.38-37.692l-0.287-4.975v-256c0-23.564 19.103-42.667 42.667-42.667z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["safe"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":24,"id":13,"name":"safe","prevSize":32,"code":59744},"setIdx":0,"setId":2,"iconIdx":90},{"icon":{"paths":["M725.333 369.778c0-56.579-22.477-110.842-62.485-150.849-40.004-40.008-94.268-62.484-150.848-62.484s-110.842 22.476-150.849 62.484c-40.008 40.008-62.484 94.27-62.484 150.849 0 248.889-106.667 320.001-106.667 320.001h640c0 0-106.667-71.113-106.667-320.001z","M573.513 832c-6.251 10.778-15.223 19.721-26.018 25.937-10.795 6.221-23.036 9.493-35.494 9.493s-24.695-3.273-35.49-9.493c-10.799-6.217-19.767-15.159-26.022-25.937"],"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["bell"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0},{"s":0}]}},"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333},{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"properties":{"order":144,"id":12,"name":"bell","prevSize":32,"code":59745},"setIdx":0,"setId":2,"iconIdx":91},{"icon":{"paths":["M512.034 85.333c-148.545 0-269.399 120.837-269.399 269.383 0 50.643 14.25 100.063 41.186 142.888 9.838 15.676 21.71 38.157 25.35 50.769l37.98 131.631c3.839 13.239 11.514 25.114 21.421 34.714-2.881 5.188-4.683 11.068-4.683 17.425v127.108c0 19.887 16.141 36.032 36.032 36.032h18.268c-1.172 3.243-1.944 6.635-1.944 10.202 0 18.321 16.163 33.182 36.033 33.182h119.467c19.908 0 36.032-14.861 36.032-33.182 0-3.584-0.777-6.976-1.894-10.202h18.197c19.908 0 36.032-16.145 36.032-36.032v-127.108c0-5.709-1.459-11.063-3.819-15.851 10.829-10.018 19.187-22.613 23.113-36.898l35.959-131.324c3.494-12.736 15.117-34.987 24.777-50.355 26.97-42.825 41.22-92.259 41.22-142.976 0-148.552-120.819-269.406-269.329-269.406zM679.138 459.319c-4.198 6.686-25.532 41.438-33.28 69.67l-35.959 131.319c-0.666 2.432-5.619 6.217-8.141 6.234h-176.688c-2.683 0-7.947-3.998-8.685-6.537l-37.98-131.631c-7.963-27.58-29.332-62.37-33.549-69.111-19.729-31.347-30.159-67.505-30.159-104.547 0-108.804 88.514-197.318 197.332-197.318 108.77 0 197.265 88.514 197.265 197.318 0 37.096-10.415 73.273-30.157 104.603z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["lightbulb"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":26,"id":11,"name":"lightbulb","prevSize":32,"code":59746},"setIdx":0,"setId":2,"iconIdx":92},{"icon":{"paths":["M327.638 166.603c50.311 0 86.695 34.066 113.199 80.535 8.055 14.121 14.566 28.392 19.712 41.37h-132.911c-16.764 0-32.842-6.421-44.696-17.852s-18.513-26.935-18.513-43.1c0-16.166 6.659-31.669 18.513-43.1s27.932-17.853 44.696-17.853zM512 203.349c-32.030-54.196-89.885-118.016-184.362-118.016-39.117 0-76.631 14.984-104.291 41.656s-43.199 62.847-43.199 100.566c0 35.073 13.435 68.811 37.557 94.815h-93.584c-21.422 0-38.788 15.16-38.788 33.862v169.314c0 18.701 17.366 33.86 38.788 33.86h8.62v343.706c0 19.635 18.867 35.554 42.14 35.554h674.237c23.275 0 42.142-15.919 42.142-35.554v-343.706h8.619c21.423 0 38.788-15.159 38.788-33.86v-169.314c0-18.702-17.365-33.862-38.788-33.862h-93.585c24.124-26.004 37.559-59.742 37.559-94.815 0-37.719-15.539-73.894-43.2-100.566s-65.173-41.656-104.29-41.656c-94.477 0-152.333 63.82-184.363 118.016zM559.407 867.554v-308.147h247.573v308.147h-247.573zM464.593 559.407v308.147h-247.572v-308.147h247.572zM559.407 491.682v-101.587h301.683v101.587h-301.683zM464.593 390.095v101.587h-301.684v-101.587h301.684zM696.363 288.508h-132.911c5.146-12.978 11.657-27.249 19.712-41.37 26.505-46.469 62.886-80.535 113.199-80.535 16.764 0 32.841 6.422 44.698 17.853 11.853 11.431 18.513 26.934 18.513 43.1s-6.66 31.669-18.513 43.1c-11.857 11.431-27.934 17.852-44.698 17.852z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["what-is-new"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":27,"id":10,"name":"what-is-new","prevSize":32,"code":59747},"setIdx":0,"setId":2,"iconIdx":93},{"icon":{"paths":["M234.667 192h170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667z","M234.667 576h170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667z","M618.667 192h170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667z","M618.667 576h170.667c23.564 0 42.667 19.103 42.667 42.667v170.667c0 23.564-19.103 42.667-42.667 42.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v-170.667c0-23.564 19.103-42.667 42.667-42.667z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["blocks"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{}]}},"attrs":[{},{},{},{}],"properties":{"order":28,"id":9,"name":"blocks","prevSize":32,"code":59748},"setIdx":0,"setId":2,"iconIdx":94},{"icon":{"paths":["M128 224c0-35.346 28.654-64 64-64h640c35.345 0 64 28.654 64 64s-28.655 64-64 64h-640c-35.346 0-64-28.654-64-64z","M128 736c0-35.345 28.654-64 64-64h640c35.345 0 64 28.655 64 64s-28.655 64-64 64h-640c-35.346 0-64-28.655-64-64z","M128 480c0-35.345 28.654-64 64-64h640c35.345 0 64 28.655 64 64s-28.655 64-64 64h-640c-35.346 0-64-28.655-64-64z"],"attrs":[{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["rows"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{}]}},"attrs":[{},{},{}],"properties":{"order":29,"id":8,"name":"rows","prevSize":32,"code":59749},"setIdx":0,"setId":2,"iconIdx":95},{"icon":{"paths":["M384 85.333h-213.333c-47.128 0-85.333 38.205-85.333 85.333v213.333c0 47.13 38.205 85.333 85.333 85.333h213.333c47.13 0 85.333-38.204 85.333-85.333v-213.333c0-47.128-38.204-85.333-85.333-85.333zM170.667 384v-213.333h213.333v213.333h-213.333z","M853.333 554.667h-213.333c-47.13 0-85.333 38.204-85.333 85.333v213.333c0 47.13 38.204 85.333 85.333 85.333h213.333c47.13 0 85.333-38.204 85.333-85.333v-213.333c0-47.13-38.204-85.333-85.333-85.333zM640 853.333v-213.333h213.333v213.333h-213.333z","M938.667 277.333c0 106.039-85.961 192-192 192s-192-85.961-192-192c0-106.039 85.961-192 192-192s192 85.961 192 192zM640 277.333c0 58.91 47.757 106.667 106.667 106.667s106.667-47.756 106.667-106.667c0-58.91-47.757-106.667-106.667-106.667s-106.667 47.756-106.667 106.667z","M277.393 804.651l-122.236 122.236c-15.872 15.872-41.813 15.872-57.728 0l-0.171-0.213c-15.872-15.872-15.872-41.856 0-57.771l122.197-122.197-122.18-122.197c-15.872-15.872-15.872-41.856 0-57.728l0.171-0.213c15.915-15.872 41.856-15.872 57.728 0l122.219 122.202 122.202-122.202c15.872-15.872 41.856-15.872 57.728 0l0.213 0.213c15.872 15.872 15.872 41.856 0 57.728l-122.198 122.197 122.215 122.197c15.872 15.915 15.872 41.899 0 57.771l-0.213 0.213c-15.872 15.872-41.856 15.872-57.728 0l-122.219-122.236z"],"attrs":[{},{},{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["apps"],"colorPermutations":{"11611631671181918125521401255951141":[{},{},{},{}]}},"attrs":[{},{},{},{}],"properties":{"order":30,"id":7,"name":"apps","prevSize":32,"code":59750},"setIdx":0,"setId":2,"iconIdx":96},{"icon":{"paths":["M170.667 384v256h-42.667c-23.564 0-42.667 19.102-42.667 42.667s19.103 42.667 42.667 42.667h42.667v128c0 47.13 38.205 85.333 85.333 85.333h512c47.13 0 85.333-38.204 85.333-85.333v-682.667c0-47.128-38.204-85.333-85.333-85.333h-512c-47.128 0-85.333 38.205-85.333 85.333v128h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667h42.667zM298.667 640h-42.667v-256h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667h-42.667v-128h512v682.667h-512v-128h42.667c23.564 0 42.667-19.102 42.667-42.667s-19.103-42.667-42.667-42.667z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["address-book"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":31,"id":6,"name":"address-book","prevSize":32,"code":59751},"setIdx":0,"setId":2,"iconIdx":97},{"icon":{"paths":["M896 490.667c0.145 56.316-13.009 111.868-38.4 162.133-30.106 60.233-76.382 110.899-133.658 146.317-57.271 35.418-123.273 54.191-190.609 54.217-56.316 0.145-111.867-13.009-162.133-38.4l-243.2 81.067 81.067-243.2c-25.39-50.266-38.547-105.818-38.4-162.133 0.026-67.338 18.799-133.34 54.217-190.611s86.081-103.551 146.316-133.655c50.266-25.39 105.818-38.547 162.133-38.4h21.333c88.93 4.906 172.928 42.443 235.908 105.423s100.518 146.978 105.425 235.91v21.333z"],"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["chat"],"colorPermutations":{"11611631671181918125521401255951141":[{"s":0}]}},"attrs":[{"fill":"none","strokeLinejoin":"round","strokeLinecap":"round","strokeMiterlimit":"4","strokeWidth":85.33333333333333}],"properties":{"order":145,"id":5,"name":"chat","prevSize":32,"code":59752},"setIdx":0,"setId":2,"iconIdx":98},{"icon":{"paths":["M512.427 767.987c-141.184 0-256-114.816-256-256s114.816-256 256-256c141.184 0 256 114.816 256 256s-114.816 256-256 256zM902.443 460.318l-14.763-1.28c-29.568-3.157-40.704-20.949-44.629-30.592-8.192-32.555-21.035-63.147-37.803-91.264-4.053-9.387-9.259-30.123 9.771-53.632l9.472-11.349c20.736-23.637 12.459-38.443-4.096-55.083l-13.739-13.696c-16.597-16.597-31.445-24.832-55.083-4.139l-11.349 9.515c-24.96 20.139-46.763 13.141-55.211 9.045-26.411-15.531-55.083-27.52-85.419-35.541-7.040-1.963-31.104-11.221-34.816-46.165l-1.323-14.763c-2.091-31.36-18.347-36.053-41.856-36.053h-19.413c-23.467 0-39.808 4.693-41.856 36.053l-1.323 14.763c-4.352 40.917-36.821 46.72-36.821 46.72 0 0.085 0.043 0.171 0.043 0.256-28.075 7.68-54.656 18.987-79.317 33.152-0.085-0.128-0.128-0.341-0.256-0.469 0 0-27.051 18.859-59.051-6.955l-11.392-9.557c-23.637-20.693-38.485-12.459-55.083 4.139l-13.696 13.696c-16.597 16.64-24.832 31.445-4.181 55.083l9.557 11.349c25.856 32.043 6.955 59.093 6.955 59.093 0.213 0.171 0.469 0.256 0.683 0.384-14.165 24.704-25.387 51.243-33.024 79.317-0.213-0.043-0.427-0.128-0.597-0.171 0 0-5.76 32.469-46.677 36.864l-14.805 1.28c-31.317 2.091-36.011 18.432-36.011 41.899v19.413c0 23.424 4.693 39.765 36.011 41.813l14.805 1.323c40.917 4.352 46.677 36.864 46.677 36.864 0.171 0 0.341-0.085 0.512-0.128 7.68 28.075 18.688 54.741 32.768 79.445-0.085 0.085-0.256 0.085-0.341 0.171 0 0 18.901 27.093-6.955 59.093l-9.557 11.349c-20.651 23.637-12.459 38.528 4.181 55.083l13.696 13.739c16.597 16.597 31.445 24.832 55.083 4.096l11.392-9.472c32-25.899 59.051-6.997 59.051-6.997 0.043-0.043 0.043-0.085 0.085-0.128 24.747 14.208 51.371 25.259 79.445 32.981v0.128c0 0 32.469 5.803 36.821 46.72l1.323 14.72c2.048 31.36 18.389 36.011 41.856 36.011h19.413c23.509 0 39.765-4.651 41.856-36.011l1.323-14.72c3.413-31.915 23.723-42.411 32.597-45.483 31.019-7.936 60.203-20.267 87.125-36.011 8.021-4.011 30.165-11.861 55.723 8.789l11.349 9.515c23.637 20.693 38.485 12.459 55.083-4.139l13.739-13.739c16.555-16.555 24.832-31.445 4.096-55.083l-9.472-11.307c-20.437-25.344-13.013-47.317-8.917-55.509 16.299-27.691 29.013-57.685 37.077-89.643 4.011-9.685 15.104-27.179 44.501-30.336l14.763-1.323c31.317-2.048 35.968-18.389 35.968-41.813v-19.413c0-23.467-4.651-39.808-35.968-41.899z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["settings"],"colorPermutations":{"11611631671181918125521401255951141":[{}]}},"attrs":[{}],"properties":{"order":33,"id":4,"name":"settings","prevSize":32,"code":59753},"setIdx":0,"setId":2,"iconIdx":99},{"icon":{"paths":["M967.629 575.548c-18.27-19.029-48.141-19.029-66.411 0l-107.558 111.753v-467.835c0-26.839-21.137-48.799-46.972-48.799-25.877 0-46.967 21.959-46.967 48.799v467.835l-107.605-111.753c-18.27-18.982-48.141-18.982-66.411 0-18.274 18.987-18.274 50.022 0 69.005l187.78 195.046c2.722 2.927 6.199 4.489 9.391 6.49 1.975 1.22 3.571 2.978 5.73 3.955 1.929 0.879 4.087 0.879 6.106 1.365 9.958 2.782 20.48 2.731 30.063-1.365 2.065-0.93 3.614-2.637 5.542-3.857 3.285-2.001 6.716-3.61 9.579-6.588l187.733-195.046c18.274-18.982 18.274-50.018 0-69.005z","M498.295 448.452c-18.27 19.029-48.141 19.029-66.411 0l-107.559-111.751v467.834c0 26.837-21.136 48.798-46.969 48.798-25.879 0-46.969-21.961-46.969-48.798v-467.834l-107.605 111.751c-18.271 18.982-48.143 18.982-66.413 0-18.271-18.987-18.271-50.021 0-69.004l187.78-195.048c2.724-2.928 6.2-4.49 9.393-6.49 1.973-1.22 3.569-2.977 5.73-3.953 1.926-0.879 4.086-0.879 6.106-1.366 9.957-2.782 20.478-2.733 30.060 1.366 2.066 0.927 3.616 2.635 5.542 3.855 3.287 2.001 6.716 3.611 9.581 6.588l187.732 195.048c18.274 18.983 18.274 50.017 0 69.004z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["transactions"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":34,"id":3,"name":"transactions","prevSize":32,"code":59754},"setIdx":0,"setId":2,"iconIdx":100},{"icon":{"paths":["M879.501 335.075h-737.449v73.955h737.449v-73.955z","M902.886 381.44l-9.216-7.055c-9.899-7.567-11.891-21.675-4.437-31.631l6.997-9.385c11.375-14.963 6.37-33.338-6.711-48.755l-95.347-133.518c-14.336-20.082-37.491-32.029-62.182-32.029h-440.261c-24.689 0-47.843 11.947-62.179 32.029l-95.119 133.518c-13.085 15.418-18.034 33.736-6.713 48.755l6.997 9.385c7.396 10.013 5.461 24.064-4.437 31.631l-9.216 7.055c-14.962 11.377-17.92 32.71-6.543 47.671l335.076 466.547c5.005 6.541 12.745 10.411 20.992 10.411h82.658c8.247 0 15.987-3.87 20.992-10.411l335.249-466.547c11.375-14.961 8.418-36.35-6.545-47.671h-0.055zM519.454 838.37c-3.81 5.009-11.319 5.009-15.13 0l-335.191-459.604c-3.813-5.006-2.56-12.288 1.138-17.236l105.984-148.538c8.931-12.573 23.381-19.968 38.798-19.968h393.615c15.415 0 29.867 7.453 38.797 19.968l106.155 148.538c3.755 4.948 4.949 12.288 1.139 17.236l-335.305 459.604z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["nft"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":35,"id":2,"name":"nft","prevSize":32,"code":59755},"setIdx":0,"setId":2,"iconIdx":101},{"icon":{"paths":["M639.915 213.312c-164.907 0-298.665 133.76-298.665 298.667 0 164.949 133.758 298.667 298.665 298.667 164.949 0 298.667-133.717 298.667-298.667 0-164.907-133.717-298.667-298.667-298.667zM639.915 298.645c117.675 0 213.333 95.701 213.333 213.333 0 117.675-95.659 213.333-213.333 213.333-117.632 0-213.331-95.659-213.331-213.333 0-117.632 95.699-213.333 213.331-213.333z","M290.319 228.618c-121.393 39.957-204.986 153.478-204.986 283.216s83.593 243.26 204.986 283.217c22.383 7.364 46.5-4.809 53.868-27.187 7.367-22.383-4.805-46.502-27.188-53.871-86.66-28.523-146.332-109.559-146.332-202.159s59.671-173.636 146.332-202.16c22.383-7.367 34.555-31.485 27.188-53.868s-31.485-34.555-53.868-27.188z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["token"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":36,"id":1,"name":"token","prevSize":32,"code":59756},"setIdx":0,"setId":2,"iconIdx":102},{"icon":{"paths":["M488.427 93.504c13.867-10.894 33.28-10.894 47.147 0l345.6 271.515c9.357 7.349 14.827 18.648 14.827 30.618v426.665c0 30.861-12.139 60.459-33.741 82.283-21.606 21.824-50.906 34.082-81.459 34.082h-537.6c-30.553 0-59.855-12.258-81.459-34.082s-33.741-51.422-33.741-82.283v-426.665c0-11.97 5.471-23.269 14.825-30.618l345.602-271.515zM204.8 414.607v407.695c0 10.287 4.046 20.156 11.247 27.43 7.202 7.27 16.969 11.358 27.153 11.358h537.6c10.185 0 19.951-4.087 27.153-11.358 7.202-7.275 11.247-17.143 11.247-27.43v-407.695l-307.2-241.347-307.2 241.347z","M341.333 508.446c0-21.602 19.103-39.113 42.667-39.113h256c23.565 0 42.667 17.51 42.667 39.113v391.108c0 21.602-19.102 39.113-42.667 39.113s-42.667-17.51-42.667-39.113v-352h-170.667v352c0 21.602-19.103 39.113-42.667 39.113s-42.667-17.51-42.667-39.113v-391.108z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":0,"tags":["home"],"colorPermutations":{"11611631671181918125521401255951141":[{},{}]}},"attrs":[{},{}],"properties":{"order":37,"id":0,"name":"home","prevSize":32,"code":59757},"setIdx":0,"setId":2,"iconIdx":103}],"height":1024,"metadata":{"name":"safe-icons"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icon-","metadata":{"fontFamily":"safe-icons","majorVersion":1,"minorVersion":0},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false,"noie8":true,"ie7":false,"showSelector":false,"showMetrics":false,"showMetadata":false,"showVersion":true},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":true,"gridSize":16}} \ No newline at end of file diff --git a/resources/icons/safe-icons/style.css b/resources/icons/safe-icons/style.css new file mode 100644 index 0000000000..1719198c8d --- /dev/null +++ b/resources/icons/safe-icons/style.css @@ -0,0 +1,373 @@ +@font-face { + font-family: 'safe-icons'; + src: + url('fonts/safe-icons.ttf?oqz473') format('truetype'), + url('fonts/safe-icons.woff?oqz473') format('woff'), + url('fonts/safe-icons.svg?oqz473#safe-icons') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; +} + +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'safe-icons' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-block:before { + content: "\e900"; + color: #ff5f72; +} +.icon-alert-triangle:before { + content: "\e901"; + color: #ff5f72; +} +.icon-alert:before { + content: "\e902"; + color: #ff5f72; +} +.icon-info:before { + content: "\e903"; +} +.icon-question:before { + content: "\e904"; +} +.icon-points:before { + content: "\e905"; +} +.icon-code-blocks:before { + content: "\e906"; +} +.icon-hardware:before { + content: "\e907"; +} +.icon-keystone:before { + content: "\e908"; +} +.icon-ledger:before { + content: "\e909"; +} +.icon-seed:before { + content: "\e90a"; +} +.icon-key:before { + content: "\e90b"; +} +.icon-dapp-logo:before { + content: "\e90c"; +} +.icon-double-arrow:before { + content: "\e90d"; +} +.icon-arrow-sort:before { + content: "\e90e"; +} +.icon-dropdown-arrow-small:before { + content: "\e90f"; +} +.icon-options-vertical:before { + content: "\e910"; +} +.icon-options-horizontal:before { + content: "\e911"; +} +.icon-check-oulined:before { + content: "\e912"; +} +.icon-check:before { + content: "\e913"; +} +.icon-check-filled:before { + content: "\e914"; +} +.icon-arrow-down-1:before { + content: "\e915"; +} +.icon-arrow-down:before { + content: "\e916"; +} +.icon-arrow-up:before { + content: "\e917"; +} +.icon-arrow-left:before { + content: "\e918"; +} +.icon-arrow-right:before { + content: "\e919"; +} +.icon-tag:before { + content: "\e91a"; +} +.icon-camera:before { + content: "\e91b"; +} +.icon-element-drag:before { + content: "\e91c"; +} +.icon-transaction-partial-fill:before { + content: "\e91d"; +} +.icon-rows-2 .path1:before { + content: "\e91e"; + color: rgb(0, 0, 0); +} +.icon-rows-2 .path2:before { + content: "\e91f"; + margin-left: -1em; + color: rgb(0, 0, 0); +} +.icon-rows-2 .path3:before { + content: "\e920"; + margin-left: -1em; + color: rgb(0, 0, 0); +} +.icon-rows-2 .path4:before { + content: "\e921"; + margin-left: -1em; + color: rgb(18, 19, 18); +} +.icon-rows-2 .path5:before { + content: "\e922"; + margin-left: -1em; + color: rgb(18, 19, 18); +} +.icon-rows-2 .path6:before { + content: "\e923"; + margin-left: -1em; + color: rgb(18, 19, 18); +} +.icon-check-notifications:before { + content: "\e924"; +} +.icon-qr-code-1:before { + content: "\e925"; +} +.icon-scan-1:before { + content: "\e926"; +} +.icon-shield-crossed:before { + content: "\e927"; +} +.icon-shield:before { + content: "\e928"; +} +.icon-clock:before { + content: "\e929"; +} +.icon-update:before { + content: "\e92a"; +} +.icon-repeat:before { + content: "\e92b"; +} +.icon-download:before { + content: "\e92c"; +} +.icon-upload:before { + content: "\e92d"; +} +.icon-qr-code:before { + content: "\e92e"; +} +.icon-scan:before { + content: "\e92f"; +} +.icon-eye-n:before { + content: "\e930"; +} +.icon-eye-off:before { + content: "\e931"; +} +.icon-unlock:before { + content: "\e932"; +} +.icon-lock:before { + content: "\e933"; +} +.icon-replace-owner:before { + content: "\e934"; +} +.icon-edit-owner:before { + content: "\e935"; +} +.icon-add-owner:before { + content: "\e936"; +} +.icon-send-to:before { + content: "\e937"; +} +.icon-owners:before { + content: "\e938"; +} +.icon-link:before { + content: "\e939"; +} +.icon-share:before { + content: "\e93a"; +} +.icon-external-link:before { + content: "\e93b"; +} +.icon-export:before { + content: "\e93c"; +} +.icon-paste:before { + content: "\e93d"; +} +.icon-copy:before { + content: "\e93e"; +} +.icon-sign:before { + content: "\e93f"; +} +.icon-document:before { + content: "\e940"; +} +.icon-file:before { + content: "\e941"; +} +.icon-search:before { + content: "\e942"; +} +.icon-edit:before { + content: "\e943"; +} +.icon-delete:before { + content: "\e944"; +} +.icon-close-outlined:before { + content: "\e945"; +} +.icon-close-filled:before { + content: "\e946"; +} +.icon-close:before { + content: "\e947"; +} +.icon-plus-outlined:before { + content: "\e948"; +} +.icon-plus-filled:before { + content: "\e949"; +} +.icon-plus:before { + content: "\e94a"; +} +.icon-transaction-batch .path1:before { + content: "\e94b"; + color: rgb(255, 214, 0); +} +.icon-transaction-batch .path2:before { + content: "\e94c"; + margin-left: -1em; + color: rgb(0, 0, 0); +} +.icon-blocks-1:before { + content: "\e94d"; +} +.icon-rows-1:before { + content: "\e94e"; +} +.icon-batch:before { + content: "\e94f"; +} +.icon-filter:before { + content: "\e950"; +} +.icon-bookmark-filled:before { + content: "\e951"; +} +.icon-bookmark:before { + content: "\e952"; +} +.icon-transaction-recovery:before { + content: "\e953"; +} +.icon-transaction-change-settings:before { + content: "\e954"; +} +.icon-transaction-contract:before { + content: "\e955"; +} +.icon-transaction-execute:before { + content: "\e956"; +} +.icon-transaction-stake:before { + content: "\e957"; +} +.icon-transaction-swap:before { + content: "\e958"; +} +.icon-transaction-outgoing:before { + content: "\e959"; +} +.icon-transaction-incoming:before { + content: "\e95a"; +} +.icon-mobile:before { + content: "\e95b"; +} +.icon-wallet:before { + content: "\e95c"; +} +.icon-appearance:before { + content: "\e95d"; +} +.icon-experimental:before { + content: "\e95e"; +} +.icon-desktop:before { + content: "\e95f"; +} +.icon-safe:before { + content: "\e960"; +} +.icon-bell:before { + content: "\e961"; +} +.icon-lightbulb:before { + content: "\e962"; +} +.icon-what-is-new:before { + content: "\e963"; +} +.icon-blocks:before { + content: "\e964"; +} +.icon-rows:before { + content: "\e965"; +} +.icon-apps:before { + content: "\e966"; +} +.icon-address-book:before { + content: "\e967"; +} +.icon-chat:before { + content: "\e968"; +} +.icon-settings:before { + content: "\e969"; +} +.icon-transactions:before { + content: "\e96a"; +} +.icon-nft:before { + content: "\e96b"; +} +.icon-token:before { + content: "\e96c"; +} +.icon-home:before { + content: "\e96d"; +} diff --git a/resources/icons/source-svgs/add-owner.svg b/resources/icons/source-svgs/add-owner.svg new file mode 100644 index 0000000000..e2de36b504 --- /dev/null +++ b/resources/icons/source-svgs/add-owner.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/address-book.svg b/resources/icons/source-svgs/address-book.svg new file mode 100644 index 0000000000..5b39535f06 --- /dev/null +++ b/resources/icons/source-svgs/address-book.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/alert-triangle.svg b/resources/icons/source-svgs/alert-triangle.svg new file mode 100644 index 0000000000..dbd021d612 --- /dev/null +++ b/resources/icons/source-svgs/alert-triangle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/alert.svg b/resources/icons/source-svgs/alert.svg new file mode 100644 index 0000000000..c69118d18d --- /dev/null +++ b/resources/icons/source-svgs/alert.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/appearance.svg b/resources/icons/source-svgs/appearance.svg new file mode 100644 index 0000000000..1971adba94 --- /dev/null +++ b/resources/icons/source-svgs/appearance.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/apps.svg b/resources/icons/source-svgs/apps.svg new file mode 100644 index 0000000000..6a03223dc3 --- /dev/null +++ b/resources/icons/source-svgs/apps.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/icons/source-svgs/arrow-down-1.svg b/resources/icons/source-svgs/arrow-down-1.svg new file mode 100644 index 0000000000..fe10e9838d --- /dev/null +++ b/resources/icons/source-svgs/arrow-down-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/arrow-down.svg b/resources/icons/source-svgs/arrow-down.svg new file mode 100644 index 0000000000..1ec931b144 --- /dev/null +++ b/resources/icons/source-svgs/arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/arrow-left.svg b/resources/icons/source-svgs/arrow-left.svg new file mode 100644 index 0000000000..3260c611ff --- /dev/null +++ b/resources/icons/source-svgs/arrow-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/arrow-right.svg b/resources/icons/source-svgs/arrow-right.svg new file mode 100644 index 0000000000..e813007d12 --- /dev/null +++ b/resources/icons/source-svgs/arrow-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/arrow-sort.svg b/resources/icons/source-svgs/arrow-sort.svg new file mode 100644 index 0000000000..3c5bb96c71 --- /dev/null +++ b/resources/icons/source-svgs/arrow-sort.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/arrow-up.svg b/resources/icons/source-svgs/arrow-up.svg new file mode 100644 index 0000000000..0f06e3a2b3 --- /dev/null +++ b/resources/icons/source-svgs/arrow-up.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/batch.svg b/resources/icons/source-svgs/batch.svg new file mode 100644 index 0000000000..ec19949368 --- /dev/null +++ b/resources/icons/source-svgs/batch.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/bell.svg b/resources/icons/source-svgs/bell.svg new file mode 100644 index 0000000000..4386eff7c3 --- /dev/null +++ b/resources/icons/source-svgs/bell.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/block.svg b/resources/icons/source-svgs/block.svg new file mode 100644 index 0000000000..f2bd56de5f --- /dev/null +++ b/resources/icons/source-svgs/block.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/blocks-1.svg b/resources/icons/source-svgs/blocks-1.svg new file mode 100644 index 0000000000..b6a5f2b3fb --- /dev/null +++ b/resources/icons/source-svgs/blocks-1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/icons/source-svgs/blocks.svg b/resources/icons/source-svgs/blocks.svg new file mode 100644 index 0000000000..b6a5f2b3fb --- /dev/null +++ b/resources/icons/source-svgs/blocks.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/icons/source-svgs/bookmark-filled.svg b/resources/icons/source-svgs/bookmark-filled.svg new file mode 100644 index 0000000000..be2282353a --- /dev/null +++ b/resources/icons/source-svgs/bookmark-filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/bookmark.svg b/resources/icons/source-svgs/bookmark.svg new file mode 100644 index 0000000000..235fbb225d --- /dev/null +++ b/resources/icons/source-svgs/bookmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/camera.svg b/resources/icons/source-svgs/camera.svg new file mode 100644 index 0000000000..790aaa911d --- /dev/null +++ b/resources/icons/source-svgs/camera.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/chat.svg b/resources/icons/source-svgs/chat.svg new file mode 100644 index 0000000000..342d6eb8b8 --- /dev/null +++ b/resources/icons/source-svgs/chat.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/check-filled.svg b/resources/icons/source-svgs/check-filled.svg new file mode 100644 index 0000000000..caf30f2cf1 --- /dev/null +++ b/resources/icons/source-svgs/check-filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/check-notifications.svg b/resources/icons/source-svgs/check-notifications.svg new file mode 100644 index 0000000000..60d44b0a30 --- /dev/null +++ b/resources/icons/source-svgs/check-notifications.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/check-oulined.svg b/resources/icons/source-svgs/check-oulined.svg new file mode 100644 index 0000000000..0e9037cefb --- /dev/null +++ b/resources/icons/source-svgs/check-oulined.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/check.svg b/resources/icons/source-svgs/check.svg new file mode 100644 index 0000000000..cf4c2ba173 --- /dev/null +++ b/resources/icons/source-svgs/check.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/clock.svg b/resources/icons/source-svgs/clock.svg new file mode 100644 index 0000000000..15ec73691f --- /dev/null +++ b/resources/icons/source-svgs/clock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/close-filled.svg b/resources/icons/source-svgs/close-filled.svg new file mode 100644 index 0000000000..9fa57c4b59 --- /dev/null +++ b/resources/icons/source-svgs/close-filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/close-outlined.svg b/resources/icons/source-svgs/close-outlined.svg new file mode 100644 index 0000000000..e722ae9732 --- /dev/null +++ b/resources/icons/source-svgs/close-outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/close.svg b/resources/icons/source-svgs/close.svg new file mode 100644 index 0000000000..b6caeb3b95 --- /dev/null +++ b/resources/icons/source-svgs/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/code-blocks.svg b/resources/icons/source-svgs/code-blocks.svg new file mode 100644 index 0000000000..d6d3558a3d --- /dev/null +++ b/resources/icons/source-svgs/code-blocks.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/source-svgs/copy.svg b/resources/icons/source-svgs/copy.svg new file mode 100644 index 0000000000..2faacebe44 --- /dev/null +++ b/resources/icons/source-svgs/copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/dapp-logo.svg b/resources/icons/source-svgs/dapp-logo.svg new file mode 100644 index 0000000000..741d5eceea --- /dev/null +++ b/resources/icons/source-svgs/dapp-logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/delete.svg b/resources/icons/source-svgs/delete.svg new file mode 100644 index 0000000000..75a3d50cc8 --- /dev/null +++ b/resources/icons/source-svgs/delete.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/desktop.svg b/resources/icons/source-svgs/desktop.svg new file mode 100644 index 0000000000..6c0f6907a8 --- /dev/null +++ b/resources/icons/source-svgs/desktop.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/document.svg b/resources/icons/source-svgs/document.svg new file mode 100644 index 0000000000..ad3e1cfa9c --- /dev/null +++ b/resources/icons/source-svgs/document.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/double-arrow.svg b/resources/icons/source-svgs/double-arrow.svg new file mode 100644 index 0000000000..0b82f202a6 --- /dev/null +++ b/resources/icons/source-svgs/double-arrow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/download.svg b/resources/icons/source-svgs/download.svg new file mode 100644 index 0000000000..08cb308afa --- /dev/null +++ b/resources/icons/source-svgs/download.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/dropdown-arrow-small.svg b/resources/icons/source-svgs/dropdown-arrow-small.svg new file mode 100644 index 0000000000..f42ace4a98 --- /dev/null +++ b/resources/icons/source-svgs/dropdown-arrow-small.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/edit-owner.svg b/resources/icons/source-svgs/edit-owner.svg new file mode 100644 index 0000000000..2047f6fb8d --- /dev/null +++ b/resources/icons/source-svgs/edit-owner.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/edit.svg b/resources/icons/source-svgs/edit.svg new file mode 100644 index 0000000000..80e9170397 --- /dev/null +++ b/resources/icons/source-svgs/edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/element-drag.svg b/resources/icons/source-svgs/element-drag.svg new file mode 100644 index 0000000000..a496771eea --- /dev/null +++ b/resources/icons/source-svgs/element-drag.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/source-svgs/experimental.svg b/resources/icons/source-svgs/experimental.svg new file mode 100644 index 0000000000..bae035cd43 --- /dev/null +++ b/resources/icons/source-svgs/experimental.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/icons/source-svgs/export.svg b/resources/icons/source-svgs/export.svg new file mode 100644 index 0000000000..33c2b3de8b --- /dev/null +++ b/resources/icons/source-svgs/export.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/external-link.svg b/resources/icons/source-svgs/external-link.svg new file mode 100644 index 0000000000..9fdb171a2c --- /dev/null +++ b/resources/icons/source-svgs/external-link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/eye-n.svg b/resources/icons/source-svgs/eye-n.svg new file mode 100644 index 0000000000..dafa314db1 --- /dev/null +++ b/resources/icons/source-svgs/eye-n.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/eye-off.svg b/resources/icons/source-svgs/eye-off.svg new file mode 100644 index 0000000000..90ab431f6e --- /dev/null +++ b/resources/icons/source-svgs/eye-off.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/file.svg b/resources/icons/source-svgs/file.svg new file mode 100644 index 0000000000..082704540c --- /dev/null +++ b/resources/icons/source-svgs/file.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/filter.svg b/resources/icons/source-svgs/filter.svg new file mode 100644 index 0000000000..23e1396ccb --- /dev/null +++ b/resources/icons/source-svgs/filter.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/hardware.svg b/resources/icons/source-svgs/hardware.svg new file mode 100644 index 0000000000..0c5729ab30 --- /dev/null +++ b/resources/icons/source-svgs/hardware.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/icons/source-svgs/home.svg b/resources/icons/source-svgs/home.svg new file mode 100644 index 0000000000..be5e4118c0 --- /dev/null +++ b/resources/icons/source-svgs/home.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/info.svg b/resources/icons/source-svgs/info.svg new file mode 100644 index 0000000000..45d0027615 --- /dev/null +++ b/resources/icons/source-svgs/info.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/key.svg b/resources/icons/source-svgs/key.svg new file mode 100644 index 0000000000..a937862c3f --- /dev/null +++ b/resources/icons/source-svgs/key.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/keystone.svg b/resources/icons/source-svgs/keystone.svg new file mode 100644 index 0000000000..efd796e737 --- /dev/null +++ b/resources/icons/source-svgs/keystone.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resources/icons/source-svgs/ledger.svg b/resources/icons/source-svgs/ledger.svg new file mode 100644 index 0000000000..4567f0a2e2 --- /dev/null +++ b/resources/icons/source-svgs/ledger.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/icons/source-svgs/lightbulb.svg b/resources/icons/source-svgs/lightbulb.svg new file mode 100644 index 0000000000..4d07899dc5 --- /dev/null +++ b/resources/icons/source-svgs/lightbulb.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/link.svg b/resources/icons/source-svgs/link.svg new file mode 100644 index 0000000000..6afdc9044a --- /dev/null +++ b/resources/icons/source-svgs/link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/lock.svg b/resources/icons/source-svgs/lock.svg new file mode 100644 index 0000000000..4050305220 --- /dev/null +++ b/resources/icons/source-svgs/lock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/mobile.svg b/resources/icons/source-svgs/mobile.svg new file mode 100644 index 0000000000..ef826b94c6 --- /dev/null +++ b/resources/icons/source-svgs/mobile.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/nft.svg b/resources/icons/source-svgs/nft.svg new file mode 100644 index 0000000000..52c27e82aa --- /dev/null +++ b/resources/icons/source-svgs/nft.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/options-horizontal.svg b/resources/icons/source-svgs/options-horizontal.svg new file mode 100644 index 0000000000..82596eccee --- /dev/null +++ b/resources/icons/source-svgs/options-horizontal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/options-vertical.svg b/resources/icons/source-svgs/options-vertical.svg new file mode 100644 index 0000000000..59b05f6f2c --- /dev/null +++ b/resources/icons/source-svgs/options-vertical.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/owners.svg b/resources/icons/source-svgs/owners.svg new file mode 100644 index 0000000000..84230b06ae --- /dev/null +++ b/resources/icons/source-svgs/owners.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/paste.svg b/resources/icons/source-svgs/paste.svg new file mode 100644 index 0000000000..4a56163fa2 --- /dev/null +++ b/resources/icons/source-svgs/paste.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/plus-filled.svg b/resources/icons/source-svgs/plus-filled.svg new file mode 100644 index 0000000000..6fa6e614a5 --- /dev/null +++ b/resources/icons/source-svgs/plus-filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/plus-outlined.svg b/resources/icons/source-svgs/plus-outlined.svg new file mode 100644 index 0000000000..bd36825b91 --- /dev/null +++ b/resources/icons/source-svgs/plus-outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/plus.svg b/resources/icons/source-svgs/plus.svg new file mode 100644 index 0000000000..f60361c29d --- /dev/null +++ b/resources/icons/source-svgs/plus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/points.svg b/resources/icons/source-svgs/points.svg new file mode 100644 index 0000000000..f91e82a4da --- /dev/null +++ b/resources/icons/source-svgs/points.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/icons/source-svgs/qr-code-1.svg b/resources/icons/source-svgs/qr-code-1.svg new file mode 100644 index 0000000000..66ff2c9f42 --- /dev/null +++ b/resources/icons/source-svgs/qr-code-1.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/icons/source-svgs/qr-code.svg b/resources/icons/source-svgs/qr-code.svg new file mode 100644 index 0000000000..66ff2c9f42 --- /dev/null +++ b/resources/icons/source-svgs/qr-code.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/icons/source-svgs/question.svg b/resources/icons/source-svgs/question.svg new file mode 100644 index 0000000000..eafb900b4a --- /dev/null +++ b/resources/icons/source-svgs/question.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/repeat.svg b/resources/icons/source-svgs/repeat.svg new file mode 100644 index 0000000000..f77b797397 --- /dev/null +++ b/resources/icons/source-svgs/repeat.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/replace-owner.svg b/resources/icons/source-svgs/replace-owner.svg new file mode 100644 index 0000000000..7644982f0d --- /dev/null +++ b/resources/icons/source-svgs/replace-owner.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/rows-1.svg b/resources/icons/source-svgs/rows-1.svg new file mode 100644 index 0000000000..73bfee78fb --- /dev/null +++ b/resources/icons/source-svgs/rows-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/rows-2.svg b/resources/icons/source-svgs/rows-2.svg new file mode 100644 index 0000000000..e2fcbeb2e9 --- /dev/null +++ b/resources/icons/source-svgs/rows-2.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/resources/icons/source-svgs/rows.svg b/resources/icons/source-svgs/rows.svg new file mode 100644 index 0000000000..73bfee78fb --- /dev/null +++ b/resources/icons/source-svgs/rows.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/safe.svg b/resources/icons/source-svgs/safe.svg new file mode 100644 index 0000000000..4ee47b4e48 --- /dev/null +++ b/resources/icons/source-svgs/safe.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/scan-1.svg b/resources/icons/source-svgs/scan-1.svg new file mode 100644 index 0000000000..d0be3efd00 --- /dev/null +++ b/resources/icons/source-svgs/scan-1.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/icons/source-svgs/scan.svg b/resources/icons/source-svgs/scan.svg new file mode 100644 index 0000000000..d0be3efd00 --- /dev/null +++ b/resources/icons/source-svgs/scan.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/icons/source-svgs/search.svg b/resources/icons/source-svgs/search.svg new file mode 100644 index 0000000000..9265f48beb --- /dev/null +++ b/resources/icons/source-svgs/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/seed.svg b/resources/icons/source-svgs/seed.svg new file mode 100644 index 0000000000..9c26ef276a --- /dev/null +++ b/resources/icons/source-svgs/seed.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/send-to.svg b/resources/icons/source-svgs/send-to.svg new file mode 100644 index 0000000000..1c21308cd0 --- /dev/null +++ b/resources/icons/source-svgs/send-to.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/settings.svg b/resources/icons/source-svgs/settings.svg new file mode 100644 index 0000000000..f5ef77e433 --- /dev/null +++ b/resources/icons/source-svgs/settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/share.svg b/resources/icons/source-svgs/share.svg new file mode 100644 index 0000000000..ef2a82cbac --- /dev/null +++ b/resources/icons/source-svgs/share.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/shield-crossed.svg b/resources/icons/source-svgs/shield-crossed.svg new file mode 100644 index 0000000000..cc308d84b7 --- /dev/null +++ b/resources/icons/source-svgs/shield-crossed.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/icons/source-svgs/shield.svg b/resources/icons/source-svgs/shield.svg new file mode 100644 index 0000000000..e2efccad33 --- /dev/null +++ b/resources/icons/source-svgs/shield.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/sign.svg b/resources/icons/source-svgs/sign.svg new file mode 100644 index 0000000000..2f73fcdb39 --- /dev/null +++ b/resources/icons/source-svgs/sign.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/source-svgs/tag.svg b/resources/icons/source-svgs/tag.svg new file mode 100644 index 0000000000..8fe0a6d4e6 --- /dev/null +++ b/resources/icons/source-svgs/tag.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/token.svg b/resources/icons/source-svgs/token.svg new file mode 100644 index 0000000000..fde8bb5466 --- /dev/null +++ b/resources/icons/source-svgs/token.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/transaction-batch.svg b/resources/icons/source-svgs/transaction-batch.svg new file mode 100644 index 0000000000..5662be33a5 --- /dev/null +++ b/resources/icons/source-svgs/transaction-batch.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/resources/icons/source-svgs/transaction-change-settings.svg b/resources/icons/source-svgs/transaction-change-settings.svg new file mode 100644 index 0000000000..fb7e59525c --- /dev/null +++ b/resources/icons/source-svgs/transaction-change-settings.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/icons/source-svgs/transaction-contract.svg b/resources/icons/source-svgs/transaction-contract.svg new file mode 100644 index 0000000000..837de855b6 --- /dev/null +++ b/resources/icons/source-svgs/transaction-contract.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/transaction-execute.svg b/resources/icons/source-svgs/transaction-execute.svg new file mode 100644 index 0000000000..b5af65351e --- /dev/null +++ b/resources/icons/source-svgs/transaction-execute.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/transaction-incoming.svg b/resources/icons/source-svgs/transaction-incoming.svg new file mode 100644 index 0000000000..b4beb22471 --- /dev/null +++ b/resources/icons/source-svgs/transaction-incoming.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/transaction-outgoing.svg b/resources/icons/source-svgs/transaction-outgoing.svg new file mode 100644 index 0000000000..783cbf0870 --- /dev/null +++ b/resources/icons/source-svgs/transaction-outgoing.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/transaction-partial-fill.svg b/resources/icons/source-svgs/transaction-partial-fill.svg new file mode 100644 index 0000000000..7d8ac41a81 --- /dev/null +++ b/resources/icons/source-svgs/transaction-partial-fill.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/icons/source-svgs/transaction-recovery.svg b/resources/icons/source-svgs/transaction-recovery.svg new file mode 100644 index 0000000000..40a7ec9e88 --- /dev/null +++ b/resources/icons/source-svgs/transaction-recovery.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/icons/source-svgs/transaction-stake.svg b/resources/icons/source-svgs/transaction-stake.svg new file mode 100644 index 0000000000..eaa40d3293 --- /dev/null +++ b/resources/icons/source-svgs/transaction-stake.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/transaction-swap.svg b/resources/icons/source-svgs/transaction-swap.svg new file mode 100644 index 0000000000..d5cc049dbb --- /dev/null +++ b/resources/icons/source-svgs/transaction-swap.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/transactions.svg b/resources/icons/source-svgs/transactions.svg new file mode 100644 index 0000000000..11e0b508f7 --- /dev/null +++ b/resources/icons/source-svgs/transactions.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/unlock.svg b/resources/icons/source-svgs/unlock.svg new file mode 100644 index 0000000000..08cb957285 --- /dev/null +++ b/resources/icons/source-svgs/unlock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/update.svg b/resources/icons/source-svgs/update.svg new file mode 100644 index 0000000000..3dac3e76ff --- /dev/null +++ b/resources/icons/source-svgs/update.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/upload.svg b/resources/icons/source-svgs/upload.svg new file mode 100644 index 0000000000..5a63431ff1 --- /dev/null +++ b/resources/icons/source-svgs/upload.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/icons/source-svgs/wallet.svg b/resources/icons/source-svgs/wallet.svg new file mode 100644 index 0000000000..786d4ce5f4 --- /dev/null +++ b/resources/icons/source-svgs/wallet.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/icons/source-svgs/what-is-new.svg b/resources/icons/source-svgs/what-is-new.svg new file mode 100644 index 0000000000..0de615a6ed --- /dev/null +++ b/resources/icons/source-svgs/what-is-new.svg @@ -0,0 +1,3 @@ + + + diff --git a/scripts/generateIconTypes.js b/scripts/generateIconTypes.js new file mode 100644 index 0000000000..d36bbaccc9 --- /dev/null +++ b/scripts/generateIconTypes.js @@ -0,0 +1,26 @@ +/* eslint-disable */ +/** + * This script generates the possible names for the SafeFontIcon component + */ + +const fs = require('fs') +const path = require('path') + +const selectionFilePath = path.join(__dirname, '../assets/fonts/safe-icons/selection.json') + +// Read the selection.json file +const selection = JSON.parse(fs.readFileSync(selectionFilePath, 'utf8')) + +// Get the icon names +const iconNames = selection.icons.map((icon) => icon.icon.tags[0]).filter(Boolean) + +// Create TypeScript union type +const typeDef = `export type IconName =\n ${iconNames.map((name) => `| '${name}'`).join('\n ')}\n` + +// Create an array of icon names +const arrayDef = `export const iconNames: IconName[] = [\n ${iconNames.map((name) => `'${name}'`).join(',\n ')},\n]` + +// Write the type definition to a file +fs.writeFileSync(path.join(__dirname, '../src/types/iconTypes.ts'), `${typeDef}\n${arrayDef}\n`) + +console.log('Icon type and Icon names generated') diff --git a/scripts/reset-project.js b/scripts/reset-project.js new file mode 100755 index 0000000000..7089039d44 --- /dev/null +++ b/scripts/reset-project.js @@ -0,0 +1,73 @@ +#!/usr/bin/env node + +/** + * This script is used to reset the project to a blank state. + * It moves the /app directory to /app-example and creates a new /app directory with an SafeFontIcon.tsx and _layout.tsx file. + * You can remove the `reset-project` script from package.json and safely delete this file after running it. + */ + +const fs = require('fs'); +const path = require('path'); + +const root = process.cwd(); +const oldDirPath = path.join(root, 'app'); +const newDirPath = path.join(root, 'app-example'); +const newAppDirPath = path.join(root, 'app'); + +const indexContent = `import { Text, View } from "react-native"; + +export default function Index() { + return ( + + Edit app/index.tsx to edit this screen. + + ); +} +`; + +const layoutContent = `import { Stack } from "expo-router"; + +export default function RootLayout() { + return ( + + + + ); +} +`; + +fs.rename(oldDirPath, newDirPath, (error) => { + if (error) { + return console.error(`Error renaming directory: ${error}`); + } + console.log('/app moved to /app-example.'); + + fs.mkdir(newAppDirPath, { recursive: true }, (error) => { + if (error) { + return console.error(`Error creating new app directory: ${error}`); + } + console.log('New /app directory created.'); + + const indexPath = path.join(newAppDirPath, 'SafeFontIcon.tsx'); + fs.writeFile(indexPath, indexContent, (error) => { + if (error) { + return console.error(`Error creating index.tsx: ${error}`); + } + console.log('app/SafeFontIcon.tsx created.'); + + const layoutPath = path.join(newAppDirPath, '_layout.tsx'); + fs.writeFile(layoutPath, layoutContent, (error) => { + if (error) { + return console.error(`Error creating _layout.tsx: ${error}`); + } + console.log('app/_layout.tsx created.'); + }); + }); + }); +}); diff --git a/src/components/Alert/index.stories.tsx b/src/components/Alert/index.stories.tsx new file mode 100644 index 0000000000..1a7a5ad51b --- /dev/null +++ b/src/components/Alert/index.stories.tsx @@ -0,0 +1,41 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { Alert } from '@/src/components/Alert' + +const meta: Meta = { + title: 'Alert', + component: Alert, + argTypes: { + type: { control: 'select', options: ['error', 'warning', 'info'] }, + message: { type: 'string' }, + iconName: { type: 'string' }, + displayIcon: { type: 'boolean' }, + }, +} + +export default meta + +type Story = StoryObj + +export const Warning: Story = { + args: { + type: 'warning', + message: 'Proceed with caution', + displayIcon: true, + }, +} + +export const Error: Story = { + args: { + type: 'error', + message: 'The transaction will most likely fail', + displayIcon: true, + }, +} + +export const Info: Story = { + args: { + type: 'info', + message: 'This is info block', + displayIcon: true, + }, +} diff --git a/src/components/Alert/index.tsx b/src/components/Alert/index.tsx new file mode 100644 index 0000000000..5e6c4c6187 --- /dev/null +++ b/src/components/Alert/index.tsx @@ -0,0 +1,48 @@ +import { View, Text, Theme } from 'tamagui' +import React, { type ReactElement } from 'react' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { IconName } from '@/src/types/iconTypes' + +type AlertType = 'error' | 'warning' | 'info' + +interface AlertProps { + type: AlertType + message: string + iconName?: IconName + displayIcon?: boolean +} + +const icons = { + error: , + warning: , + info: , +} + +const getAlertIcon = (type: AlertType, iconName?: IconName, displayIcon?: boolean): ReactElement | null => { + if (!displayIcon) return null + + return iconName ? : icons[type] +} + +export const Alert = ({ type, message, iconName, displayIcon = true }: AlertProps) => { + const Icon = getAlertIcon(type, iconName, displayIcon) + + return ( + + + + {Icon} + + {message} + + + + + ) +} diff --git a/src/components/Button/Button.stories.tsx b/src/components/Button/Button.stories.tsx new file mode 100644 index 0000000000..a39719763a --- /dev/null +++ b/src/components/Button/Button.stories.tsx @@ -0,0 +1,34 @@ +import React from 'react' +import { View } from 'react-native' +import type { Meta, StoryObj } from '@storybook/react' +import { SafeButton } from './Button' + +const meta = { + title: 'SafeButton', + component: SafeButton, + argTypes: { + onPress: { action: 'pressed the button' }, + }, + args: { + text: 'Hello world', + }, + decorators: [ + (Story) => ( + + + + ), + ], +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Basic: Story = {} + +export const AnotherExample: Story = { + args: { + text: 'Another example', + }, +} diff --git a/src/components/Button/Button.test.tsx b/src/components/Button/Button.test.tsx new file mode 100644 index 0000000000..6652469efc --- /dev/null +++ b/src/components/Button/Button.test.tsx @@ -0,0 +1,26 @@ +import { vi } from 'vitest' +import { render, userEvent } from '@/src/tests/test-utils' +import { SafeButton } from './Button' + +describe('Button', () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + it('should render the default markup', () => { + const container = render() + + expect(container).toMatchSnapshot() + }) + + it('should be able to click', async () => { + const user = userEvent.setup() + + const mockedFn = vi.fn() + const container = render() + + await user.press(container.getByText('sign')) + + expect(mockedFn).toHaveBeenCalled() + }) +}) diff --git a/src/components/Button/Button.tsx b/src/components/Button/Button.tsx new file mode 100644 index 0000000000..8715f994aa --- /dev/null +++ b/src/components/Button/Button.tsx @@ -0,0 +1,24 @@ +import { TouchableOpacity, Text, StyleSheet } from 'react-native' + +export interface SafeButtonProps { + onPress?: () => void + text: string +} + +export const SafeButton = ({ onPress, text }: SafeButtonProps) => { + return ( + + {text} + + ) +} + +const styles = StyleSheet.create({ + container: { + paddingHorizontal: 16, + paddingVertical: 8, + backgroundColor: 'purple', + borderRadius: 8, + }, + text: { color: 'white' }, +}) diff --git a/src/components/Button/__snapshots__/Button.test.tsx.snap b/src/components/Button/__snapshots__/Button.test.tsx.snap new file mode 100644 index 0000000000..f2edad2a67 --- /dev/null +++ b/src/components/Button/__snapshots__/Button.test.tsx.snap @@ -0,0 +1,74 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Button > should render the default markup 1`] = ` + + + + + sign + + + + +`; diff --git a/src/components/Container/index.stories.tsx b/src/components/Container/index.stories.tsx new file mode 100644 index 0000000000..b3d6176912 --- /dev/null +++ b/src/components/Container/index.stories.tsx @@ -0,0 +1,23 @@ +import type { StoryObj, Meta } from '@storybook/react' +import { Container } from '@/src/components/Container' +import { Text } from 'tamagui' + +const meta: Meta = { + title: 'Container', + component: Container, + args: { + children: 'Some text', + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + render: (args) => ( + + Some text + + ), +} diff --git a/src/components/Container/index.tsx b/src/components/Container/index.tsx new file mode 100644 index 0000000000..29c6ed4ed8 --- /dev/null +++ b/src/components/Container/index.tsx @@ -0,0 +1,18 @@ +import { Theme, YStack, YStackProps } from 'tamagui' + +export const Container = (props: YStackProps) => { + const { children, ...rest } = props + return ( + + + {children} + + + ) +} diff --git a/src/components/DataRow/index.stories.tsx b/src/components/DataRow/index.stories.tsx new file mode 100644 index 0000000000..8689c51e2d --- /dev/null +++ b/src/components/DataRow/index.stories.tsx @@ -0,0 +1,56 @@ +import React from 'react' +import { Container } from '@/src/components/Container' +import { DataRow } from '@/src/components/DataRow' +import { XStack, Text } from 'tamagui' + +export default { + title: 'DataRow', + component: DataRow, + decorators: [ + (Story: React.ComponentType) => ( + + + + ), + ], +} + +// Basic usage of DataRow with Label and Value +export const Default = () => ( + + Send + + 0.05452 ETH + + +) + +// DataRow with a Header and values below it +export const WithHeader = () => ( + <> + Transaction Details + + Recipient + 0x13d91...4589 + + + Network + Ethereum + + +) + +// DataRow showcasing more complex ReactNode as Value +export const ComplexValue = () => ( + + Recipient + + + 0x13d91...4589 + + (Verified) + + + + +) diff --git a/src/components/DataRow/index.tsx b/src/components/DataRow/index.tsx new file mode 100644 index 0000000000..cde11e8556 --- /dev/null +++ b/src/components/DataRow/index.tsx @@ -0,0 +1,36 @@ +import React, { ReactNode } from 'react' +import { XStack, Text, Theme } from 'tamagui' + +interface Props { + children: ReactNode +} + +export const DataRow: React.FC & { + Label: React.FC + Value: React.FC + Header: React.FC +} = ({ children }: Props) => { + return ( + + {children} + + ) +} + +const Label = ({ children }: Props) => ( + + {children} + +) + +const Value = ({ children }: Props) => {children} + +const Header = ({ children }: Props) => ( + + {children} + +) + +DataRow.Label = Label +DataRow.Value = Value +DataRow.Header = Header diff --git a/src/components/ExternalLink/index.tsx b/src/components/ExternalLink/index.tsx new file mode 100644 index 0000000000..028bf4681a --- /dev/null +++ b/src/components/ExternalLink/index.tsx @@ -0,0 +1,24 @@ +import { Link } from 'expo-router' +import { openBrowserAsync } from 'expo-web-browser' +import { type ComponentProps } from 'react' +import { Platform } from 'react-native' + +type Props = Omit, 'href'> & { href: string } + +export function ExternalLink({ href, ...rest }: Props) { + return ( + { + if (Platform.OS !== 'web') { + // Prevent the default behavior of linking to the default browser on native. + event.preventDefault() + // Open the link in an in-app browser. + await openBrowserAsync(href) + } + }} + /> + ) +} diff --git a/src/components/ParallaxScrollView/index.tsx b/src/components/ParallaxScrollView/index.tsx new file mode 100644 index 0000000000..abc90a01bd --- /dev/null +++ b/src/components/ParallaxScrollView/index.tsx @@ -0,0 +1,63 @@ +import type { PropsWithChildren, ReactElement } from 'react' +import { StyleSheet, useColorScheme, View } from 'react-native' +import Animated, { interpolate, useAnimatedRef, useAnimatedStyle, useScrollViewOffset } from 'react-native-reanimated' + +const HEADER_HEIGHT = 250 + +type Props = PropsWithChildren<{ + headerImage: ReactElement + headerBackgroundColor: { dark: string; light: string } +}> + +export default function ParallaxScrollView({ children, headerImage, headerBackgroundColor }: Props) { + const colorScheme = useColorScheme() ?? 'light' + const scrollRef = useAnimatedRef() + const scrollOffset = useScrollViewOffset(scrollRef) + + const headerAnimatedStyle = useAnimatedStyle(() => { + return { + transform: [ + { + translateY: interpolate( + scrollOffset.value, + [-HEADER_HEIGHT, 0, HEADER_HEIGHT], + [-HEADER_HEIGHT / 2, 0, HEADER_HEIGHT * 0.75], + ), + }, + { + scale: interpolate(scrollOffset.value, [-HEADER_HEIGHT, 0, HEADER_HEIGHT], [2, 1, 1]), + }, + ], + } + }) + + return ( + + + + {headerImage} + + {children} + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + header: { + height: 250, + overflow: 'hidden', + }, + content: { + flex: 1, + backgroundColor: '#fff', + padding: 32, + gap: 16, + overflow: 'hidden', + }, +}) diff --git a/src/components/SafeFontIcon/SafeFontIcon.stories.tsx b/src/components/SafeFontIcon/SafeFontIcon.stories.tsx new file mode 100644 index 0000000000..67c82d53a2 --- /dev/null +++ b/src/components/SafeFontIcon/SafeFontIcon.stories.tsx @@ -0,0 +1,35 @@ +import { View, Text, ScrollView } from 'tamagui' +import type { Meta, StoryObj } from '@storybook/react' +import { SafeFontIcon } from './SafeFontIcon' +import { iconNames } from '@/src/types/iconTypes' + +const meta: Meta = { + component: SafeFontIcon, + argTypes: { + color: { control: 'color' }, + }, +} + +export default meta + +type Story = StoryObj + +export const AllIcons: Story = { + render: (args) => { + return ( + + + {iconNames.map((iconName) => ( + + + {iconName} + + ))} + + + ) + }, + args: { + size: 50, + }, +} diff --git a/src/components/SafeFontIcon/SafeFontIcon.tsx b/src/components/SafeFontIcon/SafeFontIcon.tsx new file mode 100644 index 0000000000..7f7c38b688 --- /dev/null +++ b/src/components/SafeFontIcon/SafeFontIcon.tsx @@ -0,0 +1,31 @@ +import React from 'react' +import createIconSetFromIcoMoon from '@expo/vector-icons/createIconSetFromIcoMoon' +import { useFonts } from 'expo-font' +import { IconName } from '@/src/types/iconTypes' +import { getVariable, useTheme } from 'tamagui' + +export const SafeIcon = createIconSetFromIcoMoon( + require('@/assets/fonts/safe-icons/selection.json'), + 'SafeIcons', + 'safe-icons.ttf', +) + +export interface IconProps { + name: IconName + size?: number + color?: string +} + +export const SafeFontIcon = ({ name, size = 24, color, ...rest }: IconProps) => { + const theme = useTheme() + const iconColor = color ? theme[color]?.get() || getVariable(color, 'color') : theme.color?.get() + const [fontsLoaded] = useFonts({ + SafeIcons: require('@/assets/fonts/safe-icons/safe-icons.ttf'), + }) + + if (!fontsLoaded) { + return null + } + + return +} diff --git a/src/components/StatusBanners/PendingTransactions.stories.tsx b/src/components/StatusBanners/PendingTransactions.stories.tsx new file mode 100644 index 0000000000..cb76fa679c --- /dev/null +++ b/src/components/StatusBanners/PendingTransactions.stories.tsx @@ -0,0 +1,19 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { PendingTransactions } from '@/src/components/StatusBanners/PendingTransactions' + +const meta: Meta = { + title: 'StatusBanners/PendingTransactions', + component: PendingTransactions, + argTypes: { + number: { control: 'number' }, + }, + args: { + number: 5, + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/StatusBanners/PendingTransactions.tsx b/src/components/StatusBanners/PendingTransactions.tsx new file mode 100644 index 0000000000..77b6184fda --- /dev/null +++ b/src/components/StatusBanners/PendingTransactions.tsx @@ -0,0 +1,42 @@ +import { View, Theme, Text, Circle } from 'tamagui' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' + +import { ListItemTitle, ListItem } from 'tamagui' +import React from 'react' + +interface Props { + number: number +} + +export const PendingTransactions = ({ number }: Props) => { + const ArrowRight = + + return ( + + + + + {number} + + } + iconAfter={ArrowRight} + size="$2" + padding={'$2'} + unstyled={false} + > + + Pending Transactions + + + + + + ) +} diff --git a/src/components/TxName/index.tsx b/src/components/TxName/index.tsx new file mode 100644 index 0000000000..4f6971660c --- /dev/null +++ b/src/components/TxName/index.tsx @@ -0,0 +1,26 @@ +import React from 'react' +import { Text } from 'tamagui' +import { TransactionSummary } from '@safe-global/safe-gateway-typescript-sdk' + +import { useTransactionType } from '@/src/hooks/useTransactionType' +import { formatDateTime } from '@/src/utils/date' +import { Container } from '@/src/components/Container' + +interface TxNameProps { + tx: TransactionSummary +} + +function TxName({ tx }: TxNameProps) { + const txType = useTransactionType(tx) + + return ( + + {txType.text} + + {formatDateTime(tx.timestamp)} - {tx.txStatus} + + + ) +} + +export default TxName diff --git a/src/components/navigation/TabBarIcon.tsx b/src/components/navigation/TabBarIcon.tsx new file mode 100644 index 0000000000..882bea7a05 --- /dev/null +++ b/src/components/navigation/TabBarIcon.tsx @@ -0,0 +1,5 @@ +import { SafeFontIcon, IconProps } from '@/src/components/SafeFontIcon/SafeFontIcon' + +export function TabBarIcon({ name, ...rest }: IconProps) { + return +} diff --git a/src/config/constants.ts b/src/config/constants.ts new file mode 100644 index 0000000000..456ced739e --- /dev/null +++ b/src/config/constants.ts @@ -0,0 +1,7 @@ +import Constants from 'expo-constants' +import { Platform } from 'react-native' + +export const isProduction = process.env.NODE_ENV !== 'production' +export const isAndroid = Platform.OS === 'android' +export const isTestingEnv = process.env.NODE_ENV === 'test' || process.env.VITEST +export const isStorybookEnv = Constants?.expoConfig?.extra?.storybookEnabled === 'true' diff --git a/src/features/TxHistory/TxHistoryList.tsx b/src/features/TxHistory/TxHistoryList.tsx new file mode 100644 index 0000000000..0d5cde66b1 --- /dev/null +++ b/src/features/TxHistory/TxHistoryList.tsx @@ -0,0 +1,25 @@ +import TxName from '@/src/components/TxName' +import { TransactionListItem } from '@safe-global/safe-gateway-typescript-sdk' +import React from 'react' +import { FlatList } from 'react-native' +import { Spinner } from 'tamagui' + +interface TxHistoryList { + transactions?: TransactionListItem[] + onEndReached: (info: { distanceFromEnd: number }) => void + isLoading?: boolean +} + +function TxHistoryList({ transactions, onEndReached, isLoading }: TxHistoryList) { + return ( + 'transaction' in item)} + renderItem={({ item }) => } + onEndReached={onEndReached} + ListFooterComponent={isLoading ? : undefined} + /> + ) +} + +export default TxHistoryList diff --git a/src/features/TxHistory/index.tsx b/src/features/TxHistory/index.tsx new file mode 100644 index 0000000000..3a5bf31816 --- /dev/null +++ b/src/features/TxHistory/index.tsx @@ -0,0 +1,31 @@ +import { useGetTransactionsHistoryQuery } from '@/src/store/gateway' +import React, { useEffect, useState } from 'react' +import TxHistoryList from './TxHistoryList' +import { TransactionListItem } from '@safe-global/safe-gateway-typescript-sdk' + +function TxHistory() { + const [pageUrl, setPageUrl] = useState() + const [list, setList] = useState([]) + const { data, refetch, isFetching, isUninitialized } = useGetTransactionsHistoryQuery({ + chainId: '1', + safeAddress: '0xA77DE01e157f9f57C7c4A326eeE9C4874D0598b6', + pageUrl, + }) + + useEffect(() => { + if (!data?.results) return + + setList((prev) => [...prev, ...data.results]) + }, [data]) + + const onEndReached = () => { + if (!data?.next) return + + setPageUrl(data.next) + refetch() + } + + return +} + +export default TxHistory diff --git a/src/hooks/useTransactionType/index.tsx b/src/hooks/useTransactionType/index.tsx new file mode 100644 index 0000000000..af98ae18d2 --- /dev/null +++ b/src/hooks/useTransactionType/index.tsx @@ -0,0 +1,130 @@ +import { useMemo } from 'react' +import { + type AddressEx, + SettingsInfoType, + SwapOrder, + TransactionInfoType, + type TransactionSummary, +} from '@safe-global/safe-gateway-typescript-sdk' +import type { AnyAppDataDocVersion, latest } from '@cowprotocol/app-data' + +import { + isCancellationTxInfo, + isModuleExecutionInfo, + isMultiSendTxInfo, + isOutgoingTransfer, + isTxQueued, +} from '@/src/utils/transaction-guards' + +const getTxTo = ({ txInfo }: Pick): AddressEx | undefined => { + switch (txInfo.type) { + case TransactionInfoType.CREATION: { + return txInfo.factory + } + case TransactionInfoType.TRANSFER: { + return txInfo.recipient + } + case TransactionInfoType.SETTINGS_CHANGE: { + return undefined + } + case TransactionInfoType.CUSTOM: { + return txInfo.to + } + } +} + +interface TxType { + text: string +} + +export const getOrderClass = (order: Pick): latest.OrderClass1 => { + const fullAppData = order.fullAppData as AnyAppDataDocVersion + const orderClass = (fullAppData?.metadata?.orderClass as latest.OrderClass)?.orderClass + + return orderClass || 'market' +} + +export const getTransactionType = (tx: TransactionSummary): TxType => { + const toAddress = getTxTo(tx) + + switch (tx.txInfo.type) { + case TransactionInfoType.CREATION: { + return { + text: 'Safe Account created', + } + } + case TransactionInfoType.SWAP_TRANSFER: + case TransactionInfoType.TRANSFER: { + const isSendTx = isOutgoingTransfer(tx.txInfo) + + return { + text: isSendTx ? (isTxQueued(tx.txStatus) ? 'Send' : 'Sent') : 'Received', + } + } + case TransactionInfoType.SETTINGS_CHANGE: { + // deleteGuard doesn't exist in Solidity + // It is decoded as 'setGuard' with a settingsInfo.type of 'DELETE_GUARD' + const isDeleteGuard = tx.txInfo.settingsInfo?.type === SettingsInfoType.DELETE_GUARD + + return { + text: isDeleteGuard ? 'deleteGuard' : tx.txInfo.dataDecoded.method, + } + } + case TransactionInfoType.SWAP_ORDER: { + const orderClass = getOrderClass(tx.txInfo) + const altText = orderClass === 'limit' ? 'Limit order' : 'Swap order' + + return { + text: altText, + } + } + case TransactionInfoType.TWAP_ORDER: { + return { + text: 'TWAP order', + } + } + case TransactionInfoType.CUSTOM: { + if (isMultiSendTxInfo(tx.txInfo) && !tx.safeAppInfo) { + return { + text: 'Batch', + } + } + + if (isModuleExecutionInfo(tx.executionInfo)) { + return { + text: toAddress?.name || 'Contract interaction', + } + } + + if (isCancellationTxInfo(tx.txInfo)) { + return { + text: 'On-chain rejection', + } + } + + return { + text: toAddress?.name || 'Contract interaction', + } + } + default: { + if (tx.safeAppInfo) { + return { + text: tx.safeAppInfo.name, + } + } + + return { + text: 'Contract interaction', + } + } + } +} + +// We're going to need the address book in the future +export const useTransactionType = (tx: TransactionSummary): TxType => { + // addressBook = useAddressBook + + return useMemo(() => { + return getTransactionType(tx) + }, [tx]) +} diff --git a/src/hooks/useTransactionType/useTransactionType.test.ts b/src/hooks/useTransactionType/useTransactionType.test.ts new file mode 100644 index 0000000000..ffec19ed26 --- /dev/null +++ b/src/hooks/useTransactionType/useTransactionType.test.ts @@ -0,0 +1,161 @@ +import { renderHook } from '@/src/tests/test-utils' +import { useTransactionType } from '.' +import { mockTransactionSummary, mockTransferWithInfo } from '@/src/tests/mocks' +import { TransactionInfoType, TransactionStatus, TransferDirection } from '@safe-global/safe-gateway-typescript-sdk' + +describe('useTransactionType', () => { + it('should be a Received transaction', () => { + const { result } = renderHook(() => useTransactionType(mockTransactionSummary)) + + expect(result.current).toStrictEqual({ text: 'Received' }) + }) + + it('should be a Creation transaction', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.CREATION, + }), + }), + ) + + expect(result.current).toStrictEqual({ text: 'Safe Account created' }) + }) + + it('should be a outgoing transfer transaction', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.TRANSFER, + direction: TransferDirection.OUTGOING, + }), + }), + ) + + expect(result.current).toStrictEqual({ text: 'Sent' }) + }) + + it('should be a outgoing transfer transaction awaiting for execution', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txStatus: TransactionStatus.AWAITING_EXECUTION, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.TRANSFER, + direction: TransferDirection.OUTGOING, + }), + }), + ) + + expect(result.current).toStrictEqual({ text: 'Send' }) + }) + + it('should return the type for a SETTINGS_CHANGE transaction', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.SETTINGS_CHANGE, + }), + }), + ) + + expect(result.current).toStrictEqual({ text: 'mockMethod' }) + }) + + it('should return the type for a SWAP_ORDER transaction', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.SWAP_ORDER, + }), + }), + ) + + expect(result.current).toStrictEqual({ text: 'Swap order' }) + }) + + it('should return the type for a TWAP_ORDER transaction', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.TWAP_ORDER, + }), + }), + ) + + expect(result.current).toStrictEqual({ text: 'TWAP order' }) + }) + + it('should return the type for a CUSTOM transaction', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.CUSTOM, + }), + }), + ) + + expect(result.current).toStrictEqual({ text: 'Contract interaction' }) + }) + + it('should return a `Batch` text for a CUSTOM batch transaction', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.CUSTOM, + methodName: 'multiSend', + actionCount: 2, + }), + safeAppInfo: undefined, + }), + ) + + expect(result.current).toStrictEqual({ text: 'Batch' }) + }) + + it('should return the default transaction information', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockTransferWithInfo({ + type: 'something else' as TransactionInfoType, + }), + safeAppInfo: undefined, + }), + ) + + expect(result.current).toStrictEqual({ text: 'Contract interaction' }) + }) + + it('should return the default transaction information with safe information', () => { + const { result } = renderHook(() => + useTransactionType({ + ...mockTransactionSummary, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockTransferWithInfo({ + type: 'something else' as TransactionInfoType, + }), + safeAppInfo: { + name: 'somename', + url: 'http://google.com', + logoUri: 'myurl.com', + }, + }), + ) + + expect(result.current).toStrictEqual({ text: 'somename' }) + }) +}) diff --git a/src/providers/SafeThemeProvider/index.tsx b/src/providers/SafeThemeProvider/index.tsx new file mode 100644 index 0000000000..43e547c58f --- /dev/null +++ b/src/providers/SafeThemeProvider/index.tsx @@ -0,0 +1,39 @@ +import React from 'react' +import { useColorScheme } from 'react-native' +import { ThemeProvider } from '@react-navigation/native' +import { TamaguiProvider } from '@tamagui/core' + +import { config } from '@/src/theme/tamagui.config' +import { NavDarkTheme, NavLightTheme } from '@/src/theme/navigation' +import { FontProvider } from '@/src/theme/provider/font' +import { isStorybookEnv } from '@/src/config/constants' +import { View } from 'tamagui' + +interface SafeThemeProviderProps { + children: React.ReactNode +} + +function SafeThemeProvider({ children }: SafeThemeProviderProps) { + const colorScheme = useColorScheme() + + const themeProvider = isStorybookEnv ? ( + + {children} + + ) : ( + {children} + ) + + return ( + + + {themeProvider} + + + ) +} + +export default SafeThemeProvider diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts new file mode 100644 index 0000000000..be0fb4f82f --- /dev/null +++ b/src/react-app-env.d.ts @@ -0,0 +1,5 @@ +declare module '*.png' +declare module '*.svg' +declare module '*.jpeg' +declare module '*.jpg' +declare module '*.ttf' diff --git a/src/services/exceptions/utils.test.ts b/src/services/exceptions/utils.test.ts new file mode 100644 index 0000000000..0c6b91f763 --- /dev/null +++ b/src/services/exceptions/utils.test.ts @@ -0,0 +1,33 @@ +import { asError } from './utils' + +describe('Exceptions Utils', () => { + it('should throw an error from an Error instance', () => { + const message = 'This is an error message' + const errorFn = () => { + throw asError(new Error(message)) + } + + expect(errorFn).toThrow(Error) + expect(errorFn).toThrow(message) + }) + + it('should throw an Error from a json string', () => { + const message = { myError: 'something', nested: { id: 1 } } + const errorFn = () => { + throw asError(message) + } + + expect(errorFn).toThrow(Error) + expect(errorFn).toThrow(JSON.stringify(message)) + }) + + it('should throw an Error from a string', () => { + const message = 'some error' + const errorFn = () => { + throw asError(message) + } + + expect(errorFn).toThrow(Error) + expect(errorFn).toThrow(message) + }) +}) diff --git a/src/services/exceptions/utils.ts b/src/services/exceptions/utils.ts new file mode 100644 index 0000000000..710ac44641 --- /dev/null +++ b/src/services/exceptions/utils.ts @@ -0,0 +1,19 @@ +export const asError = (thrown: unknown): Error => { + if (thrown instanceof Error) { + return thrown + } + + let message: string + + if (typeof thrown === 'string') { + message = thrown + } else { + try { + message = JSON.stringify(thrown) + } catch { + message = String(thrown) + } + } + + return new Error(message) +} diff --git a/src/store/gateway.ts b/src/store/gateway.ts new file mode 100644 index 0000000000..7c95557303 --- /dev/null +++ b/src/store/gateway.ts @@ -0,0 +1,28 @@ +import { createApi, fakeBaseQuery } from '@reduxjs/toolkit/query/react' + +import { asError } from '@/src/services/exceptions/utils' +import { getTransactionHistory, TransactionListPage } from '@safe-global/safe-gateway-typescript-sdk' + +async function buildQueryFn(fn: () => Promise) { + try { + return { data: await fn() } + } catch (error) { + return { error: asError(error) } + } +} +export const gatewayApi = createApi({ + reducerPath: 'gatewayApi', + baseQuery: fakeBaseQuery(), + endpoints: (builder) => ({ + getTransactionsHistory: builder.query< + TransactionListPage, + { chainId: string; safeAddress: string; pageUrl?: string } + >({ + queryFn({ chainId, safeAddress, pageUrl }) { + return buildQueryFn(() => getTransactionHistory(chainId, safeAddress, {}, pageUrl)) + }, + }), + }), +}) + +export const { useGetTransactionsHistoryQuery } = gatewayApi diff --git a/src/store/hooks/index.ts b/src/store/hooks/index.ts new file mode 100644 index 0000000000..66442f10fa --- /dev/null +++ b/src/store/hooks/index.ts @@ -0,0 +1,7 @@ +import { useDispatch, useSelector } from 'react-redux' +import { AppDispatch, RootState } from '../index' + +// It's recommended to extend the default redux hooks +// https://redux-toolkit.js.org/tutorials/typescript#define-typed-hooks +export const useAppDispatch = useDispatch.withTypes() +export const useAppSelector = useSelector.withTypes() diff --git a/src/store/hooks/storeHooks.test.ts b/src/store/hooks/storeHooks.test.ts new file mode 100644 index 0000000000..c8e8b601ea --- /dev/null +++ b/src/store/hooks/storeHooks.test.ts @@ -0,0 +1,30 @@ +import { renderHook, act } from '@/src/tests/test-utils' +import { useAppSelector, useAppDispatch } from '.' +import { addTx, txHistorySelector } from '../txHistorySlice' +import { mockListItemByType } from '@/src/tests/mocks' +import { TransactionListItemType } from '@safe-global/safe-gateway-typescript-sdk' + +const mockHook = () => { + const dispatch = useAppDispatch() + const historyList = useAppSelector(txHistorySelector) + + return { dispatch, historyList } +} + +describe('React Redux Hooks', () => { + it(`shuold dispatch an action to a slice`, () => { + const { result } = renderHook(() => mockHook()) + + expect(result.current.historyList.results).toHaveLength(0) + + act(() => { + result.current.dispatch( + addTx({ + item: mockListItemByType(TransactionListItemType.TRANSACTION), + }), + ) + }) + + expect(result.current.historyList.results).toHaveLength(1) + }) +}) diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000000..032ace9eaf --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,46 @@ +import { combineReducers, configureStore } from '@reduxjs/toolkit' +import { persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist' +import { reduxStorage } from './storage' +import txHistory from './txHistorySlice' +import { gatewayApi } from './gateway' +import devToolsEnhancer from 'redux-devtools-expo-dev-plugin' +import { isTestingEnv } from '../config/constants' + +const persistConfig = { + key: 'root', + version: 1, + storage: reduxStorage, + blacklist: [gatewayApi.reducerPath], +} +export const rootReducer = combineReducers({ + txHistory, + [gatewayApi.reducerPath]: gatewayApi.reducer, +}) + +const persistedReducer = persistReducer(persistConfig, rootReducer) + +export const makeStore = () => + configureStore({ + reducer: persistedReducer, + devTools: false, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + serializableCheck: { + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], + }, + }).concat(gatewayApi.middleware), + enhancers: (getDefaultEnhancers) => { + if (isTestingEnv) { + return getDefaultEnhancers() + } + + return getDefaultEnhancers().concat(devToolsEnhancer()) + }, + }) + +export const store = makeStore() + +export const persistor = persistStore(store) + +export type RootState = ReturnType +export type AppDispatch = typeof store.dispatch diff --git a/src/store/storage.ts b/src/store/storage.ts new file mode 100644 index 0000000000..1d8f617e75 --- /dev/null +++ b/src/store/storage.ts @@ -0,0 +1,19 @@ +import { Storage } from 'redux-persist' +import { MMKV } from 'react-native-mmkv' + +const storage = new MMKV() + +export const reduxStorage: Storage = { + setItem: (key, value) => { + storage.set(key, value) + return Promise.resolve(true) + }, + getItem: (key) => { + const value = storage.getString(key) + return Promise.resolve(value) + }, + removeItem: (key) => { + storage.delete(key) + return Promise.resolve() + }, +} diff --git a/src/store/txHistorySlice.ts b/src/store/txHistorySlice.ts new file mode 100644 index 0000000000..8b40f7dc17 --- /dev/null +++ b/src/store/txHistorySlice.ts @@ -0,0 +1,24 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import { RootState } from '.' +import { TransactionListItem, TransactionListPage } from '@safe-global/safe-gateway-typescript-sdk' + +const initialState: TransactionListPage = { results: [] } + +const txHistorySlice = createSlice({ + name: 'txHistory', + initialState, + reducers: { + // TODO: this will be removed in the next task + // it is here just to test the action + addTx: (state, action: PayloadAction<{ item: TransactionListItem }>) => { + // @ts-expect-error + state.results.push(action.payload.item) + }, + }, +}) + +export const { addTx } = txHistorySlice.actions + +export const txHistorySelector = (state: RootState) => state.txHistory + +export default txHistorySlice.reducer diff --git a/src/tests/mocks.ts b/src/tests/mocks.ts new file mode 100644 index 0000000000..c2efcc94f5 --- /dev/null +++ b/src/tests/mocks.ts @@ -0,0 +1,148 @@ +import { + TransactionInfoType, + TransferDirection, + TransactionTokenType, + TransactionInfo, + ConflictType, + TransactionListItemType, + TransactionStatus, + DetailedExecutionInfoType, + TransactionListItem, + TransactionSummary, +} from '@safe-global/safe-gateway-typescript-sdk' +import { RichFragmentType } from '@safe-global/safe-gateway-typescript-sdk/dist/types/human-description' + +export const fakeToken = { + address: '0x1111111111', + decimals: 18, + name: 'NevinhaToken', + symbol: 'NEV', + trusted: false, +} +export const mockERC20Transfer: TransactionInfo = { + type: TransactionInfoType.TRANSFER, + sender: { + value: '0x000000', + name: 'something', + }, + recipient: { + value: '0x0ab', + name: 'something', + }, + transferInfo: { + type: TransactionTokenType.ERC20, + tokenAddress: '0x000000', + value: '100000', + trusted: false, + imitation: true, + }, + direction: TransferDirection.INCOMING, + humanDescription: 'a simple incoming transaction', +} +export const mockSwapTransfer: TransactionInfo = { + type: TransactionInfoType.SWAP_TRANSFER, + sender: { + value: '0x000000', + name: 'something', + }, + direction: TransferDirection.INCOMING, + recipient: { + value: '0x0ab', + name: 'something', + }, + transferInfo: { + type: TransactionTokenType.ERC20, + tokenAddress: '0x000000', + value: '100000', + trusted: false, + imitation: true, + }, + uid: '231', + humanDescription: 'here a human description', + richDecodedInfo: { + fragments: [ + { + type: RichFragmentType.Address, + value: '0x0000', + }, + ], + }, + status: 'fulfilled', + kind: 'buy', + orderClass: 'limit', + validUntil: 11902381293, + sellAmount: '100', + buyAmount: '1000000', + executedSellAmount: '100', + executedBuyAmount: '1000000', + sellToken: fakeToken, + buyToken: fakeToken, + explorerUrl: 'http://google.com', + executedSurplusFee: '', + receiver: '0xbob', + owner: '0xalice', +} + +interface mockTransferWithInfoArgs { + type?: TransactionInfoType + direction?: TransferDirection + methodName?: string + actionCount?: number + isCancellation?: boolean +} + +export const mockTransferWithInfo = ({ + type = TransactionInfoType.TRANSFER, + direction = TransferDirection.INCOMING, + methodName, + actionCount, + isCancellation, +}: mockTransferWithInfoArgs): TransactionInfo => + ({ + type, + sender: { + value: '0x000000', + name: 'something', + }, + methodName, + actionCount, + recipient: { + value: '0x0ab', + name: 'something', + }, + transferInfo: { + type: TransactionTokenType.ERC20, + tokenAddress: '0x000000', + value: '100000', + trusted: false, + imitation: true, + }, + dataDecoded: { + method: 'mockMethod', + }, + isCancellation, + direction, + humanDescription: 'a simple incoming transaction', + }) as TransactionInfo + +export const mockTransactionSummary: TransactionSummary = { + id: 'id', + timestamp: 123123, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockTransferWithInfo({ type: TransactionInfoType.TRANSFER }), + txHash: '0x0000000', + executionInfo: { + type: DetailedExecutionInfoType.MODULE, + address: { + value: '0x000000', + name: 'something', + }, + }, +} + +export const mockListItemByType = (type: TransactionListItemType): TransactionListItem => + ({ + transaction: mockTransactionSummary, + conflictType: ConflictType.END, + type, + }) as TransactionListItem diff --git a/src/tests/test-utils.tsx b/src/tests/test-utils.tsx new file mode 100644 index 0000000000..ac276526b5 --- /dev/null +++ b/src/tests/test-utils.tsx @@ -0,0 +1,34 @@ +import { render, renderHook } from '@testing-library/react-native' +import SafeThemeProvider from '../providers/SafeThemeProvider' +import { Provider } from 'react-redux' +import { makeStore } from '../store' + +const getProviders: () => React.FC<{ children: React.ReactElement }> = () => + function ProviderComponent({ children }: { children: React.ReactNode }) { + const store = makeStore() + + return ( + + {children} + + ) + } + +const customRender = (ui: React.ReactElement) => { + const wrapper = getProviders() + + return render(ui, { wrapper }) +} + +function customRenderHook(render: (initialProps: Props) => Result) { + const wrapper = getProviders() + + return renderHook(render, { wrapper }) +} + +// re-export everything +export * from '@testing-library/react-native' + +// override render method +export { customRender as render } +export { customRenderHook as renderHook } diff --git a/src/tests/vitest.setup.mjs b/src/tests/vitest.setup.mjs new file mode 100644 index 0000000000..fd127b0274 --- /dev/null +++ b/src/tests/vitest.setup.mjs @@ -0,0 +1,15 @@ +import { vi } from 'vitest' + +globalThis.expo = {} + +vi.mock('react-native-mmkv', () => ({ + MMKV: function () { + this.getString = vi.fn() + this.delete = vi.fn() + this.set = vi.fn() + }, +})) + +vi.mock('redux-devtools-expo-dev-plugin', () => ({ + default: () => vi.fn(), +})) diff --git a/src/theme/emotion.d.ts b/src/theme/emotion.d.ts new file mode 100644 index 0000000000..bc71dfecd0 --- /dev/null +++ b/src/theme/emotion.d.ts @@ -0,0 +1,6 @@ +import '@emotion/react' +import { MD3Theme } from 'react-native-paper' + +declare module '@emotion/react' { + export interface Theme extends MD3Theme {} +} diff --git a/src/theme/helpers/utils.ts b/src/theme/helpers/utils.ts new file mode 100644 index 0000000000..e7e6404e8d --- /dev/null +++ b/src/theme/helpers/utils.ts @@ -0,0 +1,61 @@ +interface Palette { + [key: string]: string | Palette +} + +type Flatten< + T extends Palette, + Prefix extends string = '', + Suffix extends string = '', + Depth extends number = 5, // Limit recursion depth +> = [Depth] extends [never] + ? object + : T extends object + ? { + [K in keyof T as T[K] extends object + ? never + : Prefix extends '' + ? `${K & string}${Suffix}` + : `${Prefix}${Capitalize}${Suffix}`]: T[K] + } & UnionToIntersection< + { + [K in keyof T]: T[K] extends object + ? Flatten}`, Suffix, Prev[Depth]> + : object + }[keyof T] + > + : object + +type Prev = [never, 0, 1, 2, 3, 4, 5] + +type UnionToIntersection = (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I : never + +export function flattenPalette( + palette: T, + options?: { suffix?: Suffix }, +): Flatten { + const result = {} as Flatten + const suffix = (options?.suffix ?? '') as Suffix + + function flatten(current: Palette, parentKey = ''): void { + for (const key in current) { + if (Object.prototype.hasOwnProperty.call(current, key)) { + const value = current[key] + + const newKey = parentKey ? parentKey + key.charAt(0).toUpperCase() + key.slice(1) : key + + if (typeof value === 'object' && value !== null) { + flatten(value as Palette, newKey) + } else { + ;(result as Flatten)[(newKey + suffix) as keyof Flatten] = value as Flatten< + T, + '', + Suffix + >[keyof Flatten] + } + } + } + } + + flatten(palette) + return result +} diff --git a/src/theme/navigation.ts b/src/theme/navigation.ts new file mode 100644 index 0000000000..7672a0fc4b --- /dev/null +++ b/src/theme/navigation.ts @@ -0,0 +1,26 @@ +import { getTokenValue } from 'tamagui' +import type { Theme } from '@react-navigation/native/src/types' + +export const NavDarkTheme: Theme = { + dark: true, + colors: { + primary: getTokenValue('$color.primaryMainDark'), + background: getTokenValue('$color.backgroundMainDark'), + card: getTokenValue('$color.backgroundMainDark'), + text: getTokenValue('$color.textPrimaryDark'), + border: getTokenValue('$color.backgroundMainDark'), + notification: getTokenValue('$color.warningBackgroundDark'), + }, +} + +export const NavLightTheme: Theme = { + dark: false, + colors: { + primary: getTokenValue('$color.primaryMainLight'), + background: getTokenValue('$color.backgroundMainLight'), + card: getTokenValue('$color.backgroundMainLight'), + text: getTokenValue('$color.textPrimaryLight'), + border: getTokenValue('$color.backgroundMainLight'), + notification: getTokenValue('$color.warningBackgroundLight'), + }, +} diff --git a/src/theme/palettes/darkPalette.ts b/src/theme/palettes/darkPalette.ts new file mode 100644 index 0000000000..195061891e --- /dev/null +++ b/src/theme/palettes/darkPalette.ts @@ -0,0 +1,73 @@ +const darkPalette = { + text: { + primary: '#FFFFFF', + secondary: '#636669', + disabled: '#636669', + }, + primary: { + dark: '#0cb259', + main: '#12FF80', + light: '#A1A3A7', + }, + secondary: { + dark: '#636669', + main: '#FFFFFF', + light: '#B0FFC9', + background: '#1B2A22', + }, + border: { + main: '#636669', + light: '#303033', + background: '#121312', + }, + error: { + dark: '#AC2C3B', + main: '#FF5F72', + light: '#FFB4BD', + background: '#2F2527', + }, + error1: { + main: '#49191F', + contrastText: '#FF5F72', + }, + success: { + dark: '#028D4C', + main: '#00B460', + light: '#81C784', + background: '#1F2920', + }, + info: { + dark: '#52BFDC', + main: '#5FDDFF', + light: '#B7F0FF', + background: '#19252C', + }, + warning: { + dark: '#C04C32', + main: '#FF8061', + light: '#FFBC9F', + background: '#2F2318', + }, + warning1: { + main: '#322211', + contrastText: '#FF8C00', + }, + background: { + default: '#121312', + main: '#121312', + paper: '#1C1C1C', + light: '#1B2A22', + }, + backdrop: { + main: '#636669', + }, + logo: { + main: '#FFFFFF', + background: '#303033', + }, + static: { + main: '#121312', + }, +} + +export default darkPalette diff --git a/src/theme/palettes/lightPalette.ts b/src/theme/palettes/lightPalette.ts new file mode 100644 index 0000000000..0ceb466939 --- /dev/null +++ b/src/theme/palettes/lightPalette.ts @@ -0,0 +1,73 @@ +const lightPalette = { + text: { + primary: '#121312', + secondary: '#A1A3A7', + disabled: '#DDDEE0', + }, + primary: { + dark: '#3c3c3c', + main: '#121312', + light: '#636669', + }, + secondary: { + dark: '#0FDA6D', + main: '#12FF80', + light: '#B0FFC9', + background: '#EFFFF4', + }, + border: { + main: '#A1A3A7', + light: '#DCDEE0', + background: '#F4F4F4', + }, + error: { + dark: '#AC2C3B', + main: '#FF5F72', + light: '#FFB4BD', + background: '#FFE6EA', + }, + error1: { + main: '#49191F', + contrastText: '#FF5F72', + }, + success: { + dark: '#028D4C', + main: '#00B460', + light: '#72F5B8', + background: '#EFFAF1', + }, + info: { + dark: '#52BFDC', + main: '#5FDDFF', + light: '#B7F0FF', + background: '#EFFCFF', + }, + warning: { + dark: '#C04C32', + main: '#FF8061', + light: '#FFBC9F', + background: '#FFF1E0', + }, + warning1: { + main: '#322211', + contrastText: '#FF8C00', + }, + background: { + default: '#F4F4F4', + main: '#F4F4F4', + paper: '#FFFFFF', + light: '#EFFFF4', + }, + backdrop: { + main: '#636669', + }, + logo: { + main: '#121312', + background: '#EEEFF0', + }, + static: { + main: '#121312', + }, +} + +export default lightPalette diff --git a/src/theme/provider/font.tsx b/src/theme/provider/font.tsx new file mode 100644 index 0000000000..bf9d9c896d --- /dev/null +++ b/src/theme/provider/font.tsx @@ -0,0 +1,33 @@ +import React, { useEffect } from 'react' +import { useFonts } from 'expo-font' +import DmSansSemiBold from '@tamagui/font-dm-sans/fonts/static/DMSans-SemiBold.ttf' +import DmSansRegular from '@tamagui/font-dm-sans/fonts/static/DMSans-Regular.ttf' +import DmSansMedium from '@tamagui/font-dm-sans/fonts/static/DMSans-Medium.ttf' +import { SplashScreen } from 'expo-router' + +interface SafeThemeProviderProps { + children: React.ReactNode +} + +// Prevent the splash screen from auto-hiding before asset loading is complete. +SplashScreen.preventAutoHideAsync() + +export const FontProvider = ({ children }: SafeThemeProviderProps) => { + const [loaded] = useFonts({ + 'DmSans-SemiBold': DmSansSemiBold, + 'DmSans-Regular': DmSansRegular, + 'DmSans-Medium': DmSansMedium, + }) + + useEffect(() => { + if (loaded) { + SplashScreen.hideAsync() + } + }, [loaded]) + + if (!loaded) { + return null + } + + return children +} diff --git a/src/theme/tamagui.config.ts b/src/theme/tamagui.config.ts new file mode 100644 index 0000000000..009e7657f6 --- /dev/null +++ b/src/theme/tamagui.config.ts @@ -0,0 +1,135 @@ +import { radius, zIndex } from '@tamagui/themes' +import { createTamagui, createTokens } from 'tamagui' +import { createDmSansFont } from '@tamagui/font-dm-sans' +import { flattenPalette } from '@/src/theme/helpers/utils' +import lightPalette from '@/src/theme/palettes/lightPalette' +import darkPalette from '@/src/theme/palettes/darkPalette' + +const colors = { + ...flattenPalette(lightPalette, { suffix: 'Light' }), + ...flattenPalette(darkPalette, { suffix: 'Dark' }), +} +export const tokens = createTokens({ + color: colors, + space: { + $1: 4, + $2: 8, + true: 8, + $3: 12, + $4: 16, + $5: 20, + $6: 24, + $7: 28, + $8: 32, + $9: 36, + $10: 40, + }, + // space, + size: { + $1: 4, + $2: 8, + true: 8, + $3: 12, + $4: 16, + $5: 20, + $6: 24, + $7: 28, + $8: 32, + $9: 36, + $10: 40, + }, + zIndex, + radius, +}) + +const DmSansFont = createDmSansFont({ + face: { + 500: { normal: 'DMSans-Medium', italic: 'DMSans-MediumItalic' }, + 600: { normal: 'DMSans-SemiBold', italic: 'DMSans-SemiBoldItalic' }, + 700: { normal: 'DMSans-Bold', italic: 'DMSans-BoldItalic' }, + }, +}) +export const config = createTamagui({ + fonts: { + body: DmSansFont, + heading: DmSansFont, + }, + themes: { + light: { + background: tokens.color.backgroundMainLight, + backgroundHover: tokens.color.backgroundLightLight, + backgroundPress: tokens.color.primaryLightLight, + backgroundFocus: tokens.color.backgroundMainLight, + backgroundStrong: tokens.color.primaryDarkLight, + backgroundTransparent: 'transparent', + color: tokens.color.textPrimaryLight, + colorHover: tokens.color.textSecondaryLight, + }, + light_pendingTx: { + background: tokens.color.warning1MainLight, + color: tokens.color.warning1ContrastTextLight, + badgeTextColor: tokens.color.textPrimaryLight, + }, + dark_pendingTx: { + background: tokens.color.warning1MainDark, + color: tokens.color.warning1ContrastTextDark, + badgeTextColor: tokens.color.textPrimaryLight, + }, + light_label: { + color: tokens.color.textSecondaryLight, + }, + dark_label: { + color: tokens.color.textSecondaryDark, + }, + light_info: { + background: tokens.color.infoBackgroundLight, + color: tokens.color.infoMainLight, + }, + dark_info: { + background: tokens.color.infoBackgroundDark, + color: tokens.color.infoMainDark, + }, + light_warning: { + background: tokens.color.warning1MainLight, + color: tokens.color.warning1ContrastTextLight, + }, + dark_warning: { + background: tokens.color.warning1MainDark, + color: tokens.color.warning1ContrastTextDark, + }, + light_error: { + background: tokens.color.error1MainLight, + color: tokens.color.error1ContrastTextLight, + }, + dark_error: { + background: tokens.color.error1MainDark, + color: tokens.color.error1ContrastTextDark, + }, + light_container: { + background: tokens.color.backgroundPaperLight, + }, + dark_container: { + background: tokens.color.backgroundPaperDark, + }, + dark: { + background: tokens.color.backgroundPaperDark, + backgroundHover: tokens.color.backgroundLightDark, + backgroundPress: tokens.color.primaryLightDark, + backgroundFocus: tokens.color.backgroundMainDark, + backgroundStrong: tokens.color.primaryDarkDark, + backgroundTransparent: 'transparent', + color: tokens.color.textPrimaryDark, + }, + }, + tokens, +}) + +export type Conf = typeof config + +declare module 'tamagui' { + interface TamaguiCustomConfig extends Conf { + tokens: typeof tokens + } +} + +export default config diff --git a/src/types/iconTypes.ts b/src/types/iconTypes.ts new file mode 100644 index 0000000000..300a733c8f --- /dev/null +++ b/src/types/iconTypes.ts @@ -0,0 +1,212 @@ +export type IconName = + | 'block' + | 'alert-triangle' + | 'alert' + | 'info' + | 'question' + | 'points' + | 'code-blocks' + | 'hardware' + | 'keystone' + | 'ledger' + | 'seed' + | 'key' + | 'dapp-logo' + | 'double-arrow' + | 'arrow-sort' + | 'dropdown-arrow-small' + | 'options-vertical' + | 'options-horizontal' + | 'check-oulined' + | 'check' + | 'check-filled' + | 'arrow-down-1' + | 'arrow-down' + | 'arrow-up' + | 'arrow-left' + | 'arrow-right' + | 'tag' + | 'camera' + | 'element-drag' + | 'transaction-partial-fill' + | 'rows-2' + | 'check-notifications' + | 'qr-code-1' + | 'scan-1' + | 'shield-crossed' + | 'shield' + | 'clock' + | 'update' + | 'repeat' + | 'download' + | 'upload' + | 'qr-code' + | 'scan' + | 'eye-n' + | 'eye-off' + | 'unlock' + | 'lock' + | 'replace-owner' + | 'edit-owner' + | 'add-owner' + | 'send-to' + | 'owners' + | 'link' + | 'share' + | 'external-link' + | 'export' + | 'paste' + | 'copy' + | 'sign' + | 'document' + | 'file' + | 'search' + | 'edit' + | 'delete' + | 'close-outlined' + | 'close-filled' + | 'close' + | 'plus-outlined' + | 'plus-filled' + | 'plus' + | 'transaction-Batch' + | 'blocks-1' + | 'rows-1' + | 'batch' + | 'filter' + | 'bookmark-filled' + | 'bookmark' + | 'transaction-recovery' + | 'transaction-change-settings' + | 'transaction-contract' + | 'transaction-execute' + | 'transaction-stake' + | 'transaction-swap' + | 'transaction-outgoing' + | 'transaction-incoming' + | 'mobile' + | 'wallet' + | 'appearance' + | 'experimental' + | 'desktop' + | 'safe' + | 'bell' + | 'lightbulb' + | 'what-is-new' + | 'blocks' + | 'rows' + | 'apps' + | 'address-book' + | 'chat' + | 'settings' + | 'transactions' + | 'nft' + | 'token' + | 'home' + +export const iconNames: IconName[] = [ + 'block', + 'alert-triangle', + 'alert', + 'info', + 'question', + 'points', + 'code-blocks', + 'hardware', + 'keystone', + 'ledger', + 'seed', + 'key', + 'dapp-logo', + 'double-arrow', + 'arrow-sort', + 'dropdown-arrow-small', + 'options-vertical', + 'options-horizontal', + 'check-oulined', + 'check', + 'check-filled', + 'arrow-down-1', + 'arrow-down', + 'arrow-up', + 'arrow-left', + 'arrow-right', + 'tag', + 'camera', + 'element-drag', + 'transaction-partial-fill', + 'rows-2', + 'check-notifications', + 'qr-code-1', + 'scan-1', + 'shield-crossed', + 'shield', + 'clock', + 'update', + 'repeat', + 'download', + 'upload', + 'qr-code', + 'scan', + 'eye-n', + 'eye-off', + 'unlock', + 'lock', + 'replace-owner', + 'edit-owner', + 'add-owner', + 'send-to', + 'owners', + 'link', + 'share', + 'external-link', + 'export', + 'paste', + 'copy', + 'sign', + 'document', + 'file', + 'search', + 'edit', + 'delete', + 'close-outlined', + 'close-filled', + 'close', + 'plus-outlined', + 'plus-filled', + 'plus', + 'transaction-Batch', + 'blocks-1', + 'rows-1', + 'batch', + 'filter', + 'bookmark-filled', + 'bookmark', + 'transaction-recovery', + 'transaction-change-settings', + 'transaction-contract', + 'transaction-execute', + 'transaction-stake', + 'transaction-swap', + 'transaction-outgoing', + 'transaction-incoming', + 'mobile', + 'wallet', + 'appearance', + 'experimental', + 'desktop', + 'safe', + 'bell', + 'lightbulb', + 'what-is-new', + 'blocks', + 'rows', + 'apps', + 'address-book', + 'chat', + 'settings', + 'transactions', + 'nft', + 'token', + 'home', +] diff --git a/src/utils/date.test.ts b/src/utils/date.test.ts new file mode 100644 index 0000000000..b689615c18 --- /dev/null +++ b/src/utils/date.test.ts @@ -0,0 +1,42 @@ +import { vi } from 'vitest' +import { currentMinutes, formatDateTime, formatTime, getCountdown, getPeriod } from './date' + +const MOCKED_TIMESTAMP = 1729506116962 + +describe('Date utils', () => { + beforeAll(() => { + vi.spyOn(Date, 'now').mockImplementation(() => MOCKED_TIMESTAMP) + }) + + it('should show the date in minutes', () => { + expect(currentMinutes()).toBe(28825101) + }) + + it('should format the date time based in a timestamp', () => { + expect(formatTime(MOCKED_TIMESTAMP)).toBe('12:21 PM') + }) + + it('should format the date based in a timestamp', () => { + expect(formatDateTime(MOCKED_TIMESTAMP)).toBe('Oct 21, 2024 - 12:21:56 PM') + }) + + it('shuold return a countdown object', () => { + expect(getCountdown(20000)).toStrictEqual({ + days: 0, + hours: 5, + minutes: 33, + }) + }) + + it('shuold get the time period in hours from seconds', () => { + expect(getPeriod(20000)).toBe('5 hours') + }) + + it('shuold get the time period in minutes from seconds', () => { + expect(getPeriod(2000)).toBe('33 minutes') + }) + + it('shuold get the time period in days from seconds', () => { + expect(getPeriod(2000000)).toBe('23 days') + }) +}) diff --git a/src/utils/date.ts b/src/utils/date.ts new file mode 100644 index 0000000000..6b24c8f6dd --- /dev/null +++ b/src/utils/date.ts @@ -0,0 +1,41 @@ +import { format, formatDistanceToNow } from 'date-fns' + +export const currentMinutes = (): number => Math.floor(Date.now() / (1000 * 60)) + +export const formatWithSchema = (timestamp: number, schema: string): string => format(timestamp, schema) + +export const formatTime = (timestamp: number): string => formatWithSchema(timestamp, 'h:mm a') + +export const formatDateTime = (timestamp: number): string => formatWithSchema(timestamp, 'MMM d, yyyy - h:mm:ss a') + +export const formatTimeInWords = (timestamp: number): string => formatDistanceToNow(timestamp, { addSuffix: true }) + +export function getCountdown(seconds: number): { days: number; hours: number; minutes: number } { + const MINUTE_IN_SECONDS = 60 + const HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS + const DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS + + const days = Math.floor(seconds / DAY_IN_SECONDS) + + const remainingSeconds = seconds % DAY_IN_SECONDS + const hours = Math.floor(remainingSeconds / HOUR_IN_SECONDS) + const minutes = Math.floor((remainingSeconds % HOUR_IN_SECONDS) / MINUTE_IN_SECONDS) + + return { days, hours, minutes } +} + +export function getPeriod(seconds: number): string | undefined { + const { days, hours, minutes } = getCountdown(seconds) + + if (days > 0) { + return `${days} day${days === 1 ? '' : 's'}` + } + + if (hours > 0) { + return `${hours} hour${hours === 1 ? '' : 's'}` + } + + if (minutes > 0) { + return `${minutes} minute${minutes === 1 ? '' : 's'}` + } +} diff --git a/src/utils/transaction-guards.test.ts b/src/utils/transaction-guards.test.ts new file mode 100644 index 0000000000..26ff564ff5 --- /dev/null +++ b/src/utils/transaction-guards.test.ts @@ -0,0 +1,153 @@ +import { + DetailedExecutionInfoType, + ExecutionInfo, + TransactionInfoType, + TransactionListItemType, + TransactionStatus, + TransferDirection, +} from '@safe-global/safe-gateway-typescript-sdk' +import { + isCancellationTxInfo, + isCreationTxInfo, + isCustomTxInfo, + isDateLabel, + isLabelListItem, + isModuleExecutionInfo, + isMultiSendTxInfo, + isMultisigExecutionInfo, + isOutgoingTransfer, + isSwapOrderTxInfo, + isTransactionListItem, + isTransferTxInfo, + isTxQueued, +} from './transaction-guards' +import { mockERC20Transfer, mockListItemByType, mockSwapTransfer, mockTransferWithInfo } from '../tests/mocks' + +const multisigTx: ExecutionInfo = { + type: DetailedExecutionInfoType.MULTISIG, + nonce: 1, + confirmationsRequired: 2, + confirmationsSubmitted: 1, + missingSigners: [ + { + value: '0x000000', + name: 'alice', + }, + { + value: '0x00asd0', + name: 'bob', + }, + ], +} + +const moduleTx: ExecutionInfo = { + type: DetailedExecutionInfoType.MODULE, + address: { + value: '0x000000', + name: 'alice', + }, +} + +describe('Transaction Guards', () => { + it('should check if isTxQueued', () => { + expect(isTxQueued(TransactionStatus.AWAITING_CONFIRMATIONS)).toBe(true) + expect(isTxQueued(TransactionStatus.AWAITING_EXECUTION)).toBe(true) + expect(isTxQueued(TransactionStatus.CANCELLED)).toBe(false) + }) + + it('should check a txInfo transfer', () => { + expect(isTransferTxInfo(mockERC20Transfer)).toBe(true) + expect(isTransferTxInfo(mockSwapTransfer)).toBe(true) + }) + + it('should check an outGoing transfer', () => { + const incomingTx = mockTransferWithInfo({ + direction: TransferDirection.INCOMING, + }) + const outGoingTx = mockTransferWithInfo({ + direction: TransferDirection.OUTGOING, + }) + + expect(isOutgoingTransfer(outGoingTx)).toBe(true) + expect(isOutgoingTransfer(incomingTx)).toBe(false) + }) + + it('should check if a transaction is a custom transaction', () => { + const customTx = mockTransferWithInfo({ + type: TransactionInfoType.CUSTOM, + }) + const swapTx = mockTransferWithInfo({ + type: TransactionInfoType.SWAP_ORDER, + }) + + expect(isCustomTxInfo(customTx)).toBe(true) + expect(isCustomTxInfo(swapTx)).toBe(false) + }) + + it('should check if a transaction is a multi send transaction', () => { + const multiSend = mockTransferWithInfo({ + type: TransactionInfoType.CUSTOM, + methodName: 'multiSend', + actionCount: 2, + }) + const swapTx = mockTransferWithInfo({ + type: TransactionInfoType.SWAP_ORDER, + }) + + expect(isMultiSendTxInfo(multiSend)).toBe(true) + expect(isMultiSendTxInfo(swapTx)).toBe(false) + }) + + it('should check if it is possible to cancel a transaction', () => { + const multiSend = mockTransferWithInfo({ + type: TransactionInfoType.CUSTOM, + methodName: 'multiSend', + actionCount: 2, + isCancellation: true, + }) + const customTx = mockTransferWithInfo({ + type: TransactionInfoType.CUSTOM, + }) + + expect(isCancellationTxInfo(multiSend)).toBe(true) + expect(isCancellationTxInfo(customTx)).toBeFalsy() + }) + + it('should check if it is a transaction list item', () => { + expect(isTransactionListItem(mockListItemByType(TransactionListItemType.TRANSACTION))).toBe(true) + expect(isTransactionListItem(mockListItemByType(TransactionListItemType.DATE_LABEL))).toBe(false) + expect(isTransactionListItem(mockListItemByType(TransactionListItemType.LABEL))).toBe(false) + }) + + it('should check if it is a DateLabel transaction', () => { + expect(isDateLabel(mockListItemByType(TransactionListItemType.TRANSACTION))).toBe(false) + expect(isDateLabel(mockListItemByType(TransactionListItemType.DATE_LABEL))).toBe(true) + expect(isDateLabel(mockListItemByType(TransactionListItemType.LABEL))).toBe(false) + }) + + it('should check if it is a Label list item', () => { + expect(isLabelListItem(mockListItemByType(TransactionListItemType.TRANSACTION))).toBe(false) + expect(isLabelListItem(mockListItemByType(TransactionListItemType.DATE_LABEL))).toBe(false) + expect(isLabelListItem(mockListItemByType(TransactionListItemType.LABEL))).toBe(true) + }) + + it('should check if it is a creation transaction type', () => { + expect(isCreationTxInfo(mockTransferWithInfo({ type: TransactionInfoType.CREATION }))).toBe(true) + expect(isCreationTxInfo(mockTransferWithInfo({ type: TransactionInfoType.CUSTOM }))).toBe(false) + }) + + it('should check if it is a multisig execution', () => { + expect(isMultisigExecutionInfo(multisigTx)).toBe(true) + expect(isMultisigExecutionInfo(moduleTx)).toBe(false) + }) + + it('should check if it is a multisig execution', () => { + expect(isModuleExecutionInfo(moduleTx)).toBe(true) + expect(isModuleExecutionInfo(multisigTx)).toBe(false) + }) + + it('should check if it is a swap order', () => { + expect(isSwapOrderTxInfo(mockTransferWithInfo({ type: TransactionInfoType.SWAP_ORDER }))).toBe(true) + expect(isSwapOrderTxInfo(mockTransferWithInfo({ type: TransactionInfoType.CUSTOM }))).toBe(false) + }) +}) diff --git a/src/utils/transaction-guards.ts b/src/utils/transaction-guards.ts new file mode 100644 index 0000000000..8376e0a5fe --- /dev/null +++ b/src/utils/transaction-guards.ts @@ -0,0 +1,87 @@ +import { + Cancellation, + Creation, + Custom, + DateLabel, + DetailedExecutionInfo, + ExecutionInfo, + Label, + ModuleExecutionInfo, + MultiSend, + MultisigExecutionInfo, + SwapOrder, + Transaction, + TransactionInfo, + TransactionInfoType, + TransactionListItem, + TransactionListItemType, + TransactionStatus, + Transfer, + TransferDirection, +} from '@safe-global/safe-gateway-typescript-sdk' + +export const isTxQueued = (value: TransactionStatus): boolean => { + return [TransactionStatus.AWAITING_CONFIRMATIONS, TransactionStatus.AWAITING_EXECUTION].includes(value) +} + +export const isTransferTxInfo = (value: TransactionInfo): value is Transfer => { + return value.type === TransactionInfoType.TRANSFER || isSwapTransferOrderTxInfo(value) +} + +/** + * A fulfillment transaction for swap, limit or twap order is always a SwapOrder + * It cannot be a TWAP order + * + * @param value + */ +export const isSwapTransferOrderTxInfo = (value: TransactionInfo): value is SwapOrder => { + return value.type === TransactionInfoType.SWAP_TRANSFER +} + +export const isOutgoingTransfer = (txInfo: TransactionInfo): boolean => { + return isTransferTxInfo(txInfo) && txInfo.direction.toUpperCase() === TransferDirection.OUTGOING +} + +export const isCustomTxInfo = (value: TransactionInfo): value is Custom => { + return value.type === TransactionInfoType.CUSTOM +} + +export const isMultiSendTxInfo = (value: TransactionInfo): value is MultiSend => { + return ( + value.type === TransactionInfoType.CUSTOM && + value.methodName === 'multiSend' && + typeof value.actionCount === 'number' + ) +} +export const isCancellationTxInfo = (value: TransactionInfo): value is Cancellation => { + return isCustomTxInfo(value) && value.isCancellation +} + +export const isTransactionListItem = (value: TransactionListItem): value is Transaction => { + return value.type === TransactionListItemType.TRANSACTION +} + +export const isDateLabel = (value: TransactionListItem): value is DateLabel => { + return value.type === TransactionListItemType.DATE_LABEL +} + +export const isLabelListItem = (value: TransactionListItem): value is Label => { + return value.type === TransactionListItemType.LABEL +} + +export const isCreationTxInfo = (value: TransactionInfo): value is Creation => { + return value.type === TransactionInfoType.CREATION +} + +export const isMultisigExecutionInfo = ( + value?: ExecutionInfo | DetailedExecutionInfo, +): value is MultisigExecutionInfo => { + return value?.type === 'MULTISIG' +} + +export const isModuleExecutionInfo = (value?: ExecutionInfo | DetailedExecutionInfo): value is ModuleExecutionInfo => + value?.type === 'MODULE' + +export const isSwapOrderTxInfo = (value: TransactionInfo): value is SwapOrder => { + return value.type === TransactionInfoType.SWAP_ORDER +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..909e901086 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "paths": { + "@/*": [ + "./*" + ] + } + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ".expo/types/**/*.ts", + "expo-env.d.ts" + ] +} diff --git a/vitest.config.mjs b/vitest.config.mjs new file mode 100644 index 0000000000..6029771a95 --- /dev/null +++ b/vitest.config.mjs @@ -0,0 +1,33 @@ +// vitest.config.mjs +import reactNative from 'vitest-react-native' +// this is needed for react jsx support +import react from '@vitejs/plugin-react' +import { defineConfig } from 'vitest/config' +import path from 'node:path' + +export default defineConfig({ + plugins: [reactNative(), react()], + test: { + reporters: ['default', 'html'], + globals: true, + server: { + deps: { + inline: ['redux', '@reduxjs/toolkit', 'redux-devtools-expo-dev-plugin'], + }, + }, + coverage: { + include: ['src'], + exclude: ['src/**/*.stories.tsx', 'src/tests/*', 'src/types'], + enabled: true, + reporter: ['json', 'html'], + }, + setupFiles: ['src/tests/vitest.setup.mjs'], + exclude: ['node_modules', './e2e'], + }, + resolve: { + alias: { + // eslint-disable-next-line no-undef + '@/src': path.resolve(__dirname, 'src'), + }, + }, +}) From 4a9ab2dce49574507db4004fd77d2e2ff2d113bd Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Fri, 1 Nov 2024 12:09:44 +0100 Subject: [PATCH 05/49] Fix tests (#13) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: use jest for tests I couldn’t find a way to fix our tests and make them work with tamagui. Vitest is ignoring the native.ts files that tamagui has and tests were failing, because of that I reconfigured the project to use jest. * fix: button test * feat: add container tests * feat: add DataRow tests --- .gitignore | 4 +- README.md | 7 +- __mocks__/fileMock.js | 1 + babel.config.js | 11 +- jest.config.js | 21 + package-lock.json | 6188 +++++++++++------ package.json | 27 +- src/components/Button/Button.test.tsx | 7 +- .../Button/__snapshots__/Button.test.tsx.snap | 106 +- src/components/Container/index.test.tsx | 35 + src/components/DataRow/index.test.tsx | 69 + src/components/DataRow/index.tsx | 13 +- src/config/constants.ts | 2 +- src/tests/jest.setup.ts | 33 + src/tests/test-utils.tsx | 4 +- src/tests/vitest.setup.mjs | 15 - src/utils/date.test.ts | 11 +- tsconfig.json | 3 +- vitest.config.mjs | 33 - 19 files changed, 4381 insertions(+), 2209 deletions(-) create mode 100644 __mocks__/fileMock.js create mode 100644 jest.config.js create mode 100644 src/components/Container/index.test.tsx create mode 100644 src/components/DataRow/index.test.tsx create mode 100644 src/tests/jest.setup.ts delete mode 100644 src/tests/vitest.setup.mjs delete mode 100644 vitest.config.mjs diff --git a/.gitignore b/.gitignore index d842300a01..23f1d1c60a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ web-build/ # Auto generated storybook file .storybook/storybook.requires.ts -# From vitest:ui +# From jest html coverage @@ -26,3 +26,5 @@ coverage expo-env.d.ts # @end expo-cli /.idea +# Tamagui UI generates a lot of cache files +.tamagui diff --git a/README.md b/README.md index c06ad337d0..37c7ad99e4 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ detox test --configuration android.emu.debug ## Unit tests -We use (Vitest)[https://vitest.dev/] for running our unit/component/hook tests and [React Native Testing Library](https://callstack.github.io/react-native-testing-library/) to manipulate them. +We use Jest for running our unit/component/hook tests and [React Native Testing Library](https://callstack.github.io/react-native-testing-library/) to manipulate them. To run the tests you can just type in your terminal: @@ -112,11 +112,12 @@ npm run test npm run test:watch ``` -#### checking the coverage and ui +#### checking the coverage ```bash -npm run test:ui +npm run test ``` +navigate inside the coverage folder and open the index.html file in your browser ## Running Eslint & Prettier diff --git a/__mocks__/fileMock.js b/__mocks__/fileMock.js new file mode 100644 index 0000000000..86059f3629 --- /dev/null +++ b/__mocks__/fileMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub'; diff --git a/babel.config.js b/babel.config.js index df4f5daec7..e1e3637afd 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,11 +1,6 @@ module.exports = function (api) { - api.cache(true); + api.cache(true) return { presets: ['babel-preset-expo'], - env: { - production: { - plugins: ['react-native-paper/babel'], - }, - }, - }; -}; + } +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000000..ce9ead16fc --- /dev/null +++ b/jest.config.js @@ -0,0 +1,21 @@ +module.exports = { + preset: 'jest-expo', + collectCoverage: true, + collectCoverageFrom: [ + './src/**', + '!./src/**/*.stories.{js,jsx,ts,tsx}', + '!./src/tests/**', + '!./src/types/**', + '!./src/**/*.snap', + ], + coverageReporters: ['json', 'html', 'text-summary'], + setupFilesAfterEnv: ['./src/tests/jest.setup.ts', './src/tests/test-utils.tsx'], + moduleNameMapper: { + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/__mocks__/fileMock.js', + }, + transformIgnorePatterns: [ + 'node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg|react-redux)', + ], + testPathIgnorePatterns: ['/node_modules/', '/e2e/'], +} diff --git a/package-lock.json b/package-lock.json index 990521cc21..08b5b1b004 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,10 @@ "@react-navigation/native": "^6.0.2", "@reduxjs/toolkit": "^2.2.8", "@safe-global/safe-gateway-typescript-sdk": "^3.22.2", + "@tamagui/babel-plugin": "^1.116.9", "@tamagui/config": "^1.116.2", "@tamagui/font-dm-sans": "^1.116.2", + "@tamagui/vite-plugin": "^1.116.9", "date-fns": "^4.1.0", "deepmerge": "^4.3.1", "expo": "~51.0.38", @@ -56,10 +58,6 @@ "@types/eslint__js": "^8.42.3", "@types/jest": "^29.5.12", "@types/react": "~18.2.45", - "@types/react-test-renderer": "^18.0.7", - "@vitejs/plugin-react": "^4.3.2", - "@vitest/coverage-v8": "^2.1.2", - "@vitest/ui": "^2.1.2", "babel-loader": "^8.4.1", "detox": "^20.27.2", "eslint": "^9.12.0", @@ -73,11 +71,8 @@ "lint-staged": "^15.2.10", "prettier": "3.3.3", "react-native-svg": "15.2.0", - "react-test-renderer": "18.2.0", "typescript": "~5.3.3", - "typescript-eslint": "^8.8.1", - "vitest": "^2.1.2", - "vitest-react-native": "^0.1.5" + "typescript-eslint": "^8.8.1" } }, "node_modules/@ampproject/remapping": { @@ -2202,16 +2197,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@bunchtogether/vite-plugin-flow": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bunchtogether/vite-plugin-flow/-/vite-plugin-flow-1.0.2.tgz", - "integrity": "sha512-s6ixVp0GVTIYE5IWzSNi1GJ8Y0HZa0C0qYTneufkG5ppVD9slW/z0VUj7NGQ0EFHNTWKfKIUFr5xbwoH3WUXZg==", - "dev": true, - "dependencies": { - "flow-remove-types": "^2.158.0", - "rollup-pluginutils": "^2.8.2" - } - }, "node_modules/@cowprotocol/app-data": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@cowprotocol/app-data/-/app-data-2.3.0.tgz", @@ -2259,436 +2244,613 @@ "license": "MIT", "optional": true }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "node_modules/@esbuild-plugins/tsconfig-paths": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/tsconfig-paths/-/tsconfig-paths-0.1.2.tgz", + "integrity": "sha512-TusFR26Y+Ze+Zm+NdfqZTSG4XyrXKxIaAfYCL3jASEI/gHjSdoCujATjzNWaaXs6Sk6Bv2D7NLr4Jdz1gysy/Q==", + "license": "ISC", + "dependencies": { + "debug": "^4.3.1", + "find-up": "^5.0.0", + "strip-json-comments": "^3.1.1" + }, + "peerDependencies": { + "esbuild": "*", + "typescript": "*" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ - "arm64" + "ppc64" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ - "darwin" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dev": true, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@eslint/js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", - "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", - "dev": true, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "levn": "^0.4.1" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" ], "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" ], "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" ], "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" ], "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" ], "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" ], "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" ], "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" ], "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/logger": "^5.7.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@ethersproject/bignumber": "^5.7.0" + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@ethersproject/contracts": { + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@ethersproject/abi": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "funding": [ { "type": "individual", @@ -2702,22 +2864,21 @@ "license": "MIT", "peer": true, "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethersproject/hash": { + "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "funding": [ { "type": "individual", @@ -2731,21 +2892,227 @@ "license": "MIT", "peer": true, "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, - "node_modules/@ethersproject/hdnode": { + "node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "funding": [ { "type": "individual", @@ -4446,7 +4813,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@flatten-js/interval-tree/-/interval-tree-1.1.3.tgz", "integrity": "sha512-xhFWUBoHJFF77cJO1D6REjdgJEMRf2Y2Z+eKEPav8evGKcLSnj1ud5pLXQSbGuxF3VSvT1rWhMfVpXEKJLTL+A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@floating-ui/core": { "version": "1.6.8", @@ -4777,6 +5145,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -4794,6 +5163,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4809,6 +5179,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4825,6 +5196,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4836,13 +5208,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4852,6 +5226,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4864,6 +5239,7 @@ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -4911,6 +5287,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4926,6 +5303,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4942,6 +5320,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4953,13 +5332,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4969,6 +5350,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5006,6 +5388,7 @@ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, + "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -5047,6 +5430,7 @@ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -5062,6 +5446,7 @@ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -5105,6 +5490,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -5120,6 +5506,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5136,6 +5523,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5147,30 +5535,58 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@jest/reporters/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "has-flag": "^4.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@jest/schemas": { + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", @@ -5186,6 +5602,7 @@ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -5200,6 +5617,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -5215,6 +5633,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -5612,13 +6031,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true, - "license": "MIT" - }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -7766,13 +8178,6 @@ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz", "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==" }, - "node_modules/@react-native/polyfills": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-2.0.0.tgz", - "integrity": "sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@react-native/virtualized-lists": { "version": "0.74.87", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.87.tgz", @@ -8137,11 +8542,11 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@safe-global/safe-gateway-typescript-sdk": { "version": "3.22.2", @@ -8703,6 +9108,228 @@ "storybook": "^8.3.5" } }, + "node_modules/@swc/core": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.40.tgz", + "integrity": "sha512-0HIzM5vigVT5IvNum+pPuST9p8xFhN6mhdIKju7qYYeNuZG78lwms/2d8WgjTJJlzp6JlPguXGrMMNzjQw0qNg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.13" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.7.40", + "@swc/core-darwin-x64": "1.7.40", + "@swc/core-linux-arm-gnueabihf": "1.7.40", + "@swc/core-linux-arm64-gnu": "1.7.40", + "@swc/core-linux-arm64-musl": "1.7.40", + "@swc/core-linux-x64-gnu": "1.7.40", + "@swc/core-linux-x64-musl": "1.7.40", + "@swc/core-win32-arm64-msvc": "1.7.40", + "@swc/core-win32-ia32-msvc": "1.7.40", + "@swc/core-win32-x64-msvc": "1.7.40" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.40.tgz", + "integrity": "sha512-LRRrCiRJLb1kpQtxMNNsr5W82Inr0dy5Imho+4HQzVx/Ismi0qX4hQBgzJAnyOBNLK1+OBVb/912UVhKXppdfQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.40.tgz", + "integrity": "sha512-Lpl0XK/4fLzS5jsK48opUuGXrqJXwqJckYYPwyGbCfCXm4MsBe+7dX2hq/Kc4YMY25+NeTmzAXhla8TT4WYD/g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.40.tgz", + "integrity": "sha512-4bEvvjptpoc5BRPr/R419h6fXTEuub+frpxxlxBOEKxgXjAF/S3xdxyPijUAakmW/xXBF0u7OC4KYI+38yQp6g==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.40.tgz", + "integrity": "sha512-v2fBlHJ/6Ovz0L2xFAI9TRiKyl9DTdx139PuAHD9gyzp16Utl/W0MPd4t2cYdkI6hPXE9PsJCSzMOrduh+YoDg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.40.tgz", + "integrity": "sha512-uMkduQuU4LFVkW6txv8AVArT8GjJVJ5IHoWloXaUBMT447iE8NALmpePdZWhMyj6KV7j0y23CM5rzV/I2eNGLg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.40.tgz", + "integrity": "sha512-4LZdY1MBSnXyTpW5fpBU/+JGAhkuHT+VnFTDNegRboN5nSPh7y0Yvn4LmIioESV+sWzjKkEXujJPGjrp+oSp5w==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.40.tgz", + "integrity": "sha512-FPjOwT3SgI6PAwH1O8bhOGBPzuvzOlzKeCtxLaCjruHJu9V8KKBrMTWOZT/FJyYC9mX5Ip1+l9j30UqUZdQxtA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.40.tgz", + "integrity": "sha512-//ovXdD9GsTmhPmXJlXnIbRQkeuL6PSrYSr7uCMNcclrUdJG0YkO0GMM2afUKYbdJcunylDDWsSS8PFWn0QxmA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.40.tgz", + "integrity": "sha512-iD/1auVhHGlhWAPrWmfRWL3w4AvXIWGVXZiSA109/xnRIPiHKb/HqqTp/qB94E/ZHMPRgLKkLTNwamlkueUs8g==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.40.tgz", + "integrity": "sha512-ZlFAV1WFPhhWQ/8esiygmetkb905XIcMMtHRRG0FBGCllO+HVL5nikUaLDgTClz1onmEY9sMXUFQeoPtvliV+w==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.13.tgz", + "integrity": "sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@tamagui/accordion": { "version": "1.116.2", "resolved": "https://registry.npmjs.org/@tamagui/accordion/-/accordion-1.116.2.tgz", @@ -8851,90 +9478,327 @@ "react": "*" } }, - "node_modules/@tamagui/button": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/button/-/button-1.116.2.tgz", - "integrity": "sha512-V3icmgxoPqESwkqr4qYDeeYI1Bx7UdqTwz2bntGtOx6FlqfQsIQWF3DerFViYlLherZrK1YfBZgT+sziVbVhFQ==", + "node_modules/@tamagui/babel-plugin": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/babel-plugin/-/babel-plugin-1.116.9.tgz", + "integrity": "sha512-mQYrZnz6YX9iEZIb1FBBfq/F1dEQZb/c9P0NZo+PQMmkfS96TeZ74dYgxdItdXRz4TI7/S75AMA9kyIHFXnUWA==", + "license": "MIT", "dependencies": { - "@tamagui/font-size": "1.116.2", - "@tamagui/get-button-sized": "1.116.2", - "@tamagui/helpers": "1.116.2", - "@tamagui/helpers-tamagui": "1.116.2", - "@tamagui/stacks": "1.116.2", - "@tamagui/text": "1.116.2", - "@tamagui/web": "1.116.2" - }, - "peerDependencies": { - "react": "*" + "@babel/generator": "^7.25.5", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.4", + "@tamagui/static": "1.116.9" } }, - "node_modules/@tamagui/card": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/card/-/card-1.116.2.tgz", - "integrity": "sha512-h4uJV3rvwF1KnWpOXC3jDu/h8xIL4C2vHtIyvKCgRRiU2PS6/bPvAtOJfKlUSZ1BefWBpSyEzT7EFL6TF/nk8w==", + "node_modules/@tamagui/babel-plugin-fully-specified": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/babel-plugin-fully-specified/-/babel-plugin-fully-specified-1.116.9.tgz", + "integrity": "sha512-c4a4hXO2rFZWfK9W0vv/5U0tGGMjhbLsT0fvvXwhEAgQ6Si5e1rliCS2Dz1lZjlYOa4fPuWO5S0om4aAVhMoGg==", + "license": "MIT", "dependencies": { - "@tamagui/create-context": "1.116.2", - "@tamagui/helpers": "1.116.2", - "@tamagui/stacks": "1.116.2", - "@tamagui/web": "1.116.2" - }, - "peerDependencies": { - "react": "*" + "@babel/core": "^7.25.2" } }, - "node_modules/@tamagui/checkbox": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/checkbox/-/checkbox-1.116.2.tgz", - "integrity": "sha512-5TZSJucTYJPP3lYGJ6pYX8X6OTZGyYlfh49G53QpkVA0i0KG328OZJpOn6zGU0IDV4JmLyY3vsoZVG8uqxrGxg==", + "node_modules/@tamagui/build": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/build/-/build-1.116.9.tgz", + "integrity": "sha512-Uz+Qte3ZKXrS7nuYKClNUVbfNTFwzL9jfNBmvAF9daDCNyOE4F30geJ/5x3aPOcTxDclzU3pnYg4xQRzApCKoQ==", "dependencies": { - "@tamagui/checkbox-headless": "1.116.2", - "@tamagui/compose-refs": "1.116.2", - "@tamagui/constants": "1.116.2", - "@tamagui/core": "1.116.2", - "@tamagui/create-context": "1.116.2", - "@tamagui/focusable": "1.116.2", - "@tamagui/font-size": "1.116.2", - "@tamagui/get-token": "1.116.2", - "@tamagui/helpers": "1.116.2", - "@tamagui/helpers-tamagui": "1.116.2", - "@tamagui/label": "1.116.2", - "@tamagui/stacks": "1.116.2", - "@tamagui/use-controllable-state": "1.116.2", - "@tamagui/use-previous": "1.116.2" + "@babel/core": "^7.25.2", + "@swc/core": "^1.7.21", + "@tamagui/babel-plugin-fully-specified": "1.116.9", + "@types/fs-extra": "^9.0.13", + "chokidar": "^3.5.2", + "esbuild": "^0.24.0", + "esbuild-plugin-es5": "^2.1.1", + "esbuild-register": "^3.6.0", + "execa": "^5.0.0", + "fast-glob": "^3.2.11", + "fs-extra": "^11.2.0", + "lodash.debounce": "^4.0.8", + "typescript": "^5.5.2" }, - "peerDependencies": { - "react": "*" + "bin": { + "tamagui-build": "tamagui-build.js", + "teesx": "teesx.sh" } }, - "node_modules/@tamagui/checkbox-headless": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/checkbox-headless/-/checkbox-headless-1.116.2.tgz", - "integrity": "sha512-lEk2/4UtSZH3k7H1KXNdIf/pTRRSy4BoWr4AfDFT4bHdNFV3I7JLqp194xq3fgPi+mmEZSKfJg1BLeXcESANoQ==", - "dependencies": { - "@tamagui/compose-refs": "1.116.2", - "@tamagui/constants": "1.116.2", - "@tamagui/create-context": "1.116.2", - "@tamagui/focusable": "1.116.2", - "@tamagui/helpers": "1.116.2", - "@tamagui/label": "1.116.2", - "@tamagui/use-controllable-state": "1.116.2", - "@tamagui/use-previous": "1.116.2" - }, - "peerDependencies": { - "react": "*" + "node_modules/@tamagui/build/node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@tamagui/collapsible": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/collapsible/-/collapsible-1.116.2.tgz", - "integrity": "sha512-LPcTnXCSXbhTL2FXhqBwqwQWjdLfHAdt0g4QTa/OtVPvjx9S7g+UBe2MTBWBWSnMukjBdV2TBbnNBMbQV9REoA==", - "dependencies": { - "@tamagui/animate-presence": "1.116.2", - "@tamagui/compose-refs": "1.116.2", - "@tamagui/core": "1.116.2", - "@tamagui/create-context": "1.116.2", - "@tamagui/helpers": "1.116.2", - "@tamagui/polyfill-dev": "1.116.2", + "node_modules/@tamagui/build/node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/@tamagui/build/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@tamagui/build/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@tamagui/build/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tamagui/build/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tamagui/build/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@tamagui/build/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@tamagui/build/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@tamagui/build/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tamagui/build/node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@tamagui/build/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@tamagui/button": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/button/-/button-1.116.2.tgz", + "integrity": "sha512-V3icmgxoPqESwkqr4qYDeeYI1Bx7UdqTwz2bntGtOx6FlqfQsIQWF3DerFViYlLherZrK1YfBZgT+sziVbVhFQ==", + "dependencies": { + "@tamagui/font-size": "1.116.2", + "@tamagui/get-button-sized": "1.116.2", + "@tamagui/helpers": "1.116.2", + "@tamagui/helpers-tamagui": "1.116.2", + "@tamagui/stacks": "1.116.2", + "@tamagui/text": "1.116.2", + "@tamagui/web": "1.116.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/card": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/card/-/card-1.116.2.tgz", + "integrity": "sha512-h4uJV3rvwF1KnWpOXC3jDu/h8xIL4C2vHtIyvKCgRRiU2PS6/bPvAtOJfKlUSZ1BefWBpSyEzT7EFL6TF/nk8w==", + "dependencies": { + "@tamagui/create-context": "1.116.2", + "@tamagui/helpers": "1.116.2", + "@tamagui/stacks": "1.116.2", + "@tamagui/web": "1.116.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/checkbox": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/checkbox/-/checkbox-1.116.2.tgz", + "integrity": "sha512-5TZSJucTYJPP3lYGJ6pYX8X6OTZGyYlfh49G53QpkVA0i0KG328OZJpOn6zGU0IDV4JmLyY3vsoZVG8uqxrGxg==", + "dependencies": { + "@tamagui/checkbox-headless": "1.116.2", + "@tamagui/compose-refs": "1.116.2", + "@tamagui/constants": "1.116.2", + "@tamagui/core": "1.116.2", + "@tamagui/create-context": "1.116.2", + "@tamagui/focusable": "1.116.2", + "@tamagui/font-size": "1.116.2", + "@tamagui/get-token": "1.116.2", + "@tamagui/helpers": "1.116.2", + "@tamagui/helpers-tamagui": "1.116.2", + "@tamagui/label": "1.116.2", + "@tamagui/stacks": "1.116.2", + "@tamagui/use-controllable-state": "1.116.2", + "@tamagui/use-previous": "1.116.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/checkbox-headless": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/checkbox-headless/-/checkbox-headless-1.116.2.tgz", + "integrity": "sha512-lEk2/4UtSZH3k7H1KXNdIf/pTRRSy4BoWr4AfDFT4bHdNFV3I7JLqp194xq3fgPi+mmEZSKfJg1BLeXcESANoQ==", + "dependencies": { + "@tamagui/compose-refs": "1.116.2", + "@tamagui/constants": "1.116.2", + "@tamagui/create-context": "1.116.2", + "@tamagui/focusable": "1.116.2", + "@tamagui/helpers": "1.116.2", + "@tamagui/label": "1.116.2", + "@tamagui/use-controllable-state": "1.116.2", + "@tamagui/use-previous": "1.116.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/cli-color": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/cli-color/-/cli-color-1.116.9.tgz", + "integrity": "sha512-9WcUs4HwWTfOHIdQ2w26qweQakZeALOifYqRrJ3C7+bZ33aAQTNh/T7KNH+CNogEq4f8xJ/8JgW4uiOkmhsu+Q==" + }, + "node_modules/@tamagui/collapsible": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/collapsible/-/collapsible-1.116.2.tgz", + "integrity": "sha512-LPcTnXCSXbhTL2FXhqBwqwQWjdLfHAdt0g4QTa/OtVPvjx9S7g+UBe2MTBWBWSnMukjBdV2TBbnNBMbQV9REoA==", + "dependencies": { + "@tamagui/animate-presence": "1.116.2", + "@tamagui/compose-refs": "1.116.2", + "@tamagui/core": "1.116.2", + "@tamagui/create-context": "1.116.2", + "@tamagui/helpers": "1.116.2", + "@tamagui/polyfill-dev": "1.116.2", "@tamagui/stacks": "1.116.2", "@tamagui/use-controllable-state": "1.116.2" }, @@ -8989,55 +9853,223 @@ "@tamagui/web": "1.116.2" } }, - "node_modules/@tamagui/constants": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/constants/-/constants-1.116.2.tgz", - "integrity": "sha512-N+FdMbGYjqcxZBCkQOG5R42uv1GEIUWCWpbuivLOp8SF3Nr9zBj4HorP3XpvDxGIgQCb3itKKGNvVLMuy59lOA==", - "peerDependencies": { - "react": "*" + "node_modules/@tamagui/config-default": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/config-default/-/config-default-1.116.9.tgz", + "integrity": "sha512-MD4IMIxM11Fqtw/2Bl+BqexFtOwZDGdyK6qNrrxSfUDDvAS0TxuF2GrhznNzpTWpy4QvJZAruH9HfJG/B6itIw==", + "dependencies": { + "@tamagui/animations-css": "1.116.9", + "@tamagui/core": "1.116.9", + "@tamagui/shorthands": "1.116.9" } }, - "node_modules/@tamagui/core": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/core/-/core-1.116.2.tgz", - "integrity": "sha512-PXFYD+usYp20Vax0+04TyvPaTK0uWqrEQudNjhCtPttToagVV2eZeNWVuxwLjc6G8i9N4Es5xmsEkd6lGkU8zQ==", + "node_modules/@tamagui/config-default/node_modules/@tamagui/animations-css": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/animations-css/-/animations-css-1.116.9.tgz", + "integrity": "sha512-nGIZ4AnmUZ+WSITXM5hZ9SOWDkPEaAsQf3XWBaVR59UyMRjRApF6C3qnCGk8gBCd7ERjTMf3tJurenuvZC+REg==", "license": "MIT", "dependencies": { - "@tamagui/react-native-use-pressable": "1.116.2", - "@tamagui/react-native-use-responder-events": "1.116.2", - "@tamagui/use-event": "1.116.2", - "@tamagui/web": "1.116.2" + "@tamagui/constants": "1.116.9", + "@tamagui/cubic-bezier-animator": "1.116.9", + "@tamagui/use-presence": "1.116.9", + "@tamagui/web": "1.116.9" + }, + "peerDependencies": { + "react": "*" } }, - "node_modules/@tamagui/create-context": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/create-context/-/create-context-1.116.2.tgz", - "integrity": "sha512-eOqtsyIAX3k60dChnzyfjSPp0cE50Mur9B+4wd/+n3AWfwtyi7r8KeO2Axz0DMVP/gfV3o1pTYXzY57ftJbn7w==", + "node_modules/@tamagui/config-default/node_modules/@tamagui/compose-refs": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/compose-refs/-/compose-refs-1.116.9.tgz", + "integrity": "sha512-PGjLXCcTuXFiULDVMMUgXwx2Vgx4wBYUoLUHL3vQA2OdyEhfZc+pBaEGfXDrqO+U7l4A6GtdAaxHIryCCzu0qA==", "peerDependencies": { "react": "*" } }, - "node_modules/@tamagui/create-theme": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/create-theme/-/create-theme-1.116.2.tgz", - "integrity": "sha512-DpWWw1kztQL6Q7JGeLISCljQfqXfb5gX0jTkZlWMghbU2p7u3qpJ5vpvsswey8Cp4rvrBtxzYYSCuv/r8Hu0Yw==", + "node_modules/@tamagui/config-default/node_modules/@tamagui/constants": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/constants/-/constants-1.116.9.tgz", + "integrity": "sha512-gnYawS+8Kewm6mAMZrSzYINUKTGRKkq3YN7XKxPZTs4r5J200UdxcvabzQQa+uKkajnf5f+kRtPGXxioD7nPiw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/core": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/core/-/core-1.116.9.tgz", + "integrity": "sha512-9KKx6sDmW/uTuuIvKKrFhF5U4eL0DUPELGenqx+fwGe8hVlcXxKS3fQL2MfNHvrvGdqyEDCFkoUOfyKC9lcTOg==", + "license": "MIT", "dependencies": { - "@tamagui/web": "1.116.2" + "@tamagui/react-native-use-pressable": "1.116.9", + "@tamagui/react-native-use-responder-events": "1.116.9", + "@tamagui/use-event": "1.116.9", + "@tamagui/web": "1.116.9" } }, - "node_modules/@tamagui/cubic-bezier-animator": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/cubic-bezier-animator/-/cubic-bezier-animator-1.116.2.tgz", - "integrity": "sha512-fW8IGaJbSAeJmtAnEJw5dmeoU1uzBiuJsdvFV7b2saIHBUsZ97/pSbU/pydpoB4OSLKYU7WnTBxsjiUWhDkdzQ==" + "node_modules/@tamagui/config-default/node_modules/@tamagui/cubic-bezier-animator": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/cubic-bezier-animator/-/cubic-bezier-animator-1.116.9.tgz", + "integrity": "sha512-Ef5e5AQHhZT1vU0K8amEt07K9oZXkutjDr8ukOqak0M+79Gc3vUCCyj338c9Y8AcaGWWNN0Lrj2cMtx2t3/haA==" }, - "node_modules/@tamagui/dialog": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/dialog/-/dialog-1.116.2.tgz", - "integrity": "sha512-R1WYEhp4soRk4Vi+N5HBtven7+P9NYoAcqmeyF6KfSYzOOygBzBy6MA7lIGj6XyieeLfr4ytOZU2NkPkdnkPkw==", + "node_modules/@tamagui/config-default/node_modules/@tamagui/helpers": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/helpers/-/helpers-1.116.9.tgz", + "integrity": "sha512-+MHjkgZDJq8ASNPydOHIXiDPWpQhFmp6hBu3WXu2MasG+6x3bOMzJGsjIEujo4BjZOMP8j5yr3ZrbhDshYwxkg==", "dependencies": { - "@tamagui/adapt": "1.116.2", - "@tamagui/animate-presence": "1.116.2", - "@tamagui/aria-hidden": "1.116.2", + "@tamagui/constants": "1.116.9", + "@tamagui/simple-hash": "1.116.9" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/normalize-css-color": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/normalize-css-color/-/normalize-css-color-1.116.9.tgz", + "integrity": "sha512-PSuo/1Pwf8lC9bRptnN4muI6/fD26m8WWkDUpCGPTuu2z5wJSqFXVlk1qPXH+5vewPMIDMwxVgmjj8ik8hBfCA==", + "dependencies": { + "@react-native/normalize-color": "^2.1.0" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/react-native-use-pressable": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-pressable/-/react-native-use-pressable-1.116.9.tgz", + "integrity": "sha512-yfJ4DsRDD8305cWxVfM6ruEpGMFJzkW4z/rzhommNChurSSetnZEy03xKOY950JHSo/TEA5hKjuIq4XULd/rCw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/react-native-use-responder-events": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-responder-events/-/react-native-use-responder-events-1.116.9.tgz", + "integrity": "sha512-qtm7xH/5xmBQxQHmExLqy4abKbyt5stLPOFnigvDQdwWxqEqiGUzJ4dEZhfKVrpD/xFYu7DJ+Z7LYC4kmzjV3w==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/shorthands": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/shorthands/-/shorthands-1.116.9.tgz", + "integrity": "sha512-3w5SkaUs6MPjXloBv7tlWt2fN6zrEA7viXNBl+nholnnWtB1Kse0YpJLuSiOWi9d01ozNdZgy/bVYrXzDOkSWA==" + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/simple-hash": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/simple-hash/-/simple-hash-1.116.9.tgz", + "integrity": "sha512-DNZ7yxmNgODZC5k65468WeZMv33IYjdxe6y85rqrY2BksAthUhZktrEMdzTp6Nu2mG8dCL58JmVqXWiW2a7dmg==" + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/timer": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/timer/-/timer-1.116.9.tgz", + "integrity": "sha512-1KAcZetgWl7V0177067YFS4jlekDLHo9rqwu/SDqAoEeLqwJVnBsZ+5GP5LQ5ACh/wScGB3hM5aMOjrdTqIstw==" + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/types": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/types/-/types-1.116.9.tgz", + "integrity": "sha512-sfNzhfZLmmISpfLAq5FPoI2V9qe96VmXI0vVCfU/L3nCWiWbMeR9L8GEakbO6f77OVQlwUkm/YJzj6EO2kWOwA==" + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/use-did-finish-ssr": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-did-finish-ssr/-/use-did-finish-ssr-1.116.9.tgz", + "integrity": "sha512-y+cecFsjcXyOC2X7ERCnGP9Y83/nxKorP4JqPHaIdzCNch1IKi4aBssueV6IP1/8KEbuPpRCf0+94XPgxPARNw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/use-event": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-event/-/use-event-1.116.9.tgz", + "integrity": "sha512-m4YOjCjOnHdS/0Y4sJaVsbvx6WmpIKa6BotJzVAK55SWQ1GaTZVvInA63mfd7Yxd6csTPOmNBQ9m6zKsxJTE0g==", + "dependencies": { + "@tamagui/constants": "1.116.9" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/use-force-update": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-force-update/-/use-force-update-1.116.9.tgz", + "integrity": "sha512-y49rpRIvLlsjOBbnBtrli36TGsEbzrDjJPy1aSbixSv3G3gMDptzEANhuP6Z7fNuMElC+t7JKcE+qwEdVhQBWA==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/use-presence": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-presence/-/use-presence-1.116.9.tgz", + "integrity": "sha512-Tn9brfUozjxOYXRyiwf4QZ289rg8vpS48nTMJ7QM1HTuMt6vQARqXmpPlVZpEKL2yE3blTF9/zyv7gF22qdqqQ==", + "dependencies": { + "@tamagui/web": "1.116.9" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/config-default/node_modules/@tamagui/web": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/web/-/web-1.116.9.tgz", + "integrity": "sha512-IPygGtQQX3qW6P8ZwdfGVuvQN3WyVzckw0pbAD2vsbJM3Fj5RqbmBthZfMpPsirKoe4C5+zIvD940oeBPN5g/g==", + "license": "MIT", + "dependencies": { + "@tamagui/compose-refs": "1.116.9", + "@tamagui/constants": "1.116.9", + "@tamagui/helpers": "1.116.9", + "@tamagui/normalize-css-color": "1.116.9", + "@tamagui/timer": "1.116.9", + "@tamagui/types": "1.116.9", + "@tamagui/use-did-finish-ssr": "1.116.9", + "@tamagui/use-event": "1.116.9", + "@tamagui/use-force-update": "1.116.9", + "react": "^18.2.0 || ^19.0.0", + "react-dom": "^18.2.0 || ^19.0.0" + } + }, + "node_modules/@tamagui/constants": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/constants/-/constants-1.116.2.tgz", + "integrity": "sha512-N+FdMbGYjqcxZBCkQOG5R42uv1GEIUWCWpbuivLOp8SF3Nr9zBj4HorP3XpvDxGIgQCb3itKKGNvVLMuy59lOA==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/core": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/core/-/core-1.116.2.tgz", + "integrity": "sha512-PXFYD+usYp20Vax0+04TyvPaTK0uWqrEQudNjhCtPttToagVV2eZeNWVuxwLjc6G8i9N4Es5xmsEkd6lGkU8zQ==", + "license": "MIT", + "dependencies": { + "@tamagui/react-native-use-pressable": "1.116.2", + "@tamagui/react-native-use-responder-events": "1.116.2", + "@tamagui/use-event": "1.116.2", + "@tamagui/web": "1.116.2" + } + }, + "node_modules/@tamagui/create-context": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/create-context/-/create-context-1.116.2.tgz", + "integrity": "sha512-eOqtsyIAX3k60dChnzyfjSPp0cE50Mur9B+4wd/+n3AWfwtyi7r8KeO2Axz0DMVP/gfV3o1pTYXzY57ftJbn7w==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/create-theme": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/create-theme/-/create-theme-1.116.2.tgz", + "integrity": "sha512-DpWWw1kztQL6Q7JGeLISCljQfqXfb5gX0jTkZlWMghbU2p7u3qpJ5vpvsswey8Cp4rvrBtxzYYSCuv/r8Hu0Yw==", + "dependencies": { + "@tamagui/web": "1.116.2" + } + }, + "node_modules/@tamagui/cubic-bezier-animator": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/cubic-bezier-animator/-/cubic-bezier-animator-1.116.2.tgz", + "integrity": "sha512-fW8IGaJbSAeJmtAnEJw5dmeoU1uzBiuJsdvFV7b2saIHBUsZ97/pSbU/pydpoB4OSLKYU7WnTBxsjiUWhDkdzQ==" + }, + "node_modules/@tamagui/dialog": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/dialog/-/dialog-1.116.2.tgz", + "integrity": "sha512-R1WYEhp4soRk4Vi+N5HBtven7+P9NYoAcqmeyF6KfSYzOOygBzBy6MA7lIGj6XyieeLfr4ytOZU2NkPkdnkPkw==", + "dependencies": { + "@tamagui/adapt": "1.116.2", + "@tamagui/animate-presence": "1.116.2", + "@tamagui/aria-hidden": "1.116.2", "@tamagui/compose-refs": "1.116.2", "@tamagui/constants": "1.116.2", "@tamagui/core": "1.116.2", @@ -9190,6 +10222,164 @@ "react": "*" } }, + "node_modules/@tamagui/generate-themes": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/generate-themes/-/generate-themes-1.116.9.tgz", + "integrity": "sha512-Anv/ktKF36knrnwYNNdL2zU1eNeNpePJAF2An894kJMheaoITcK7b595e9uWxrXMuIyBAdVNc9yG5/3KkCkMmg==", + "dependencies": { + "@tamagui/create-theme": "1.116.9", + "@tamagui/theme-builder": "1.116.9", + "@tamagui/types": "1.116.9", + "esbuild-register": "^3.6.0", + "fs-extra": "^11.2.0" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/compose-refs": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/compose-refs/-/compose-refs-1.116.9.tgz", + "integrity": "sha512-PGjLXCcTuXFiULDVMMUgXwx2Vgx4wBYUoLUHL3vQA2OdyEhfZc+pBaEGfXDrqO+U7l4A6GtdAaxHIryCCzu0qA==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/constants": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/constants/-/constants-1.116.9.tgz", + "integrity": "sha512-gnYawS+8Kewm6mAMZrSzYINUKTGRKkq3YN7XKxPZTs4r5J200UdxcvabzQQa+uKkajnf5f+kRtPGXxioD7nPiw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/create-theme": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/create-theme/-/create-theme-1.116.9.tgz", + "integrity": "sha512-8QnKhXWD6M7BaioVzblhdeavEH+i73bjgyF/ApP7OriMP4dD2tKnMpwYgjEG9/0H/fROux+aLXKYSvk9/Zsf3w==", + "dependencies": { + "@tamagui/web": "1.116.9" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/helpers": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/helpers/-/helpers-1.116.9.tgz", + "integrity": "sha512-+MHjkgZDJq8ASNPydOHIXiDPWpQhFmp6hBu3WXu2MasG+6x3bOMzJGsjIEujo4BjZOMP8j5yr3ZrbhDshYwxkg==", + "dependencies": { + "@tamagui/constants": "1.116.9", + "@tamagui/simple-hash": "1.116.9" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/normalize-css-color": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/normalize-css-color/-/normalize-css-color-1.116.9.tgz", + "integrity": "sha512-PSuo/1Pwf8lC9bRptnN4muI6/fD26m8WWkDUpCGPTuu2z5wJSqFXVlk1qPXH+5vewPMIDMwxVgmjj8ik8hBfCA==", + "dependencies": { + "@react-native/normalize-color": "^2.1.0" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/simple-hash": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/simple-hash/-/simple-hash-1.116.9.tgz", + "integrity": "sha512-DNZ7yxmNgODZC5k65468WeZMv33IYjdxe6y85rqrY2BksAthUhZktrEMdzTp6Nu2mG8dCL58JmVqXWiW2a7dmg==" + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/theme-builder": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/theme-builder/-/theme-builder-1.116.9.tgz", + "integrity": "sha512-dRD+Y8gJb/HfxEfqyx/t5o6NeWCLKsp5S5eIpKEeW6HJiryIrXGbXViEaN7tW2ZdhplAJBQwUGvjZOFRKQ5bcw==", + "dependencies": { + "@tamagui/create-theme": "1.116.9", + "color2k": "^2.0.2" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/timer": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/timer/-/timer-1.116.9.tgz", + "integrity": "sha512-1KAcZetgWl7V0177067YFS4jlekDLHo9rqwu/SDqAoEeLqwJVnBsZ+5GP5LQ5ACh/wScGB3hM5aMOjrdTqIstw==" + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/types": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/types/-/types-1.116.9.tgz", + "integrity": "sha512-sfNzhfZLmmISpfLAq5FPoI2V9qe96VmXI0vVCfU/L3nCWiWbMeR9L8GEakbO6f77OVQlwUkm/YJzj6EO2kWOwA==" + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/use-did-finish-ssr": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-did-finish-ssr/-/use-did-finish-ssr-1.116.9.tgz", + "integrity": "sha512-y+cecFsjcXyOC2X7ERCnGP9Y83/nxKorP4JqPHaIdzCNch1IKi4aBssueV6IP1/8KEbuPpRCf0+94XPgxPARNw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/use-event": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-event/-/use-event-1.116.9.tgz", + "integrity": "sha512-m4YOjCjOnHdS/0Y4sJaVsbvx6WmpIKa6BotJzVAK55SWQ1GaTZVvInA63mfd7Yxd6csTPOmNBQ9m6zKsxJTE0g==", + "dependencies": { + "@tamagui/constants": "1.116.9" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/use-force-update": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-force-update/-/use-force-update-1.116.9.tgz", + "integrity": "sha512-y49rpRIvLlsjOBbnBtrli36TGsEbzrDjJPy1aSbixSv3G3gMDptzEANhuP6Z7fNuMElC+t7JKcE+qwEdVhQBWA==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/@tamagui/web": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/web/-/web-1.116.9.tgz", + "integrity": "sha512-IPygGtQQX3qW6P8ZwdfGVuvQN3WyVzckw0pbAD2vsbJM3Fj5RqbmBthZfMpPsirKoe4C5+zIvD940oeBPN5g/g==", + "license": "MIT", + "dependencies": { + "@tamagui/compose-refs": "1.116.9", + "@tamagui/constants": "1.116.9", + "@tamagui/helpers": "1.116.9", + "@tamagui/normalize-css-color": "1.116.9", + "@tamagui/timer": "1.116.9", + "@tamagui/types": "1.116.9", + "@tamagui/use-did-finish-ssr": "1.116.9", + "@tamagui/use-event": "1.116.9", + "@tamagui/use-force-update": "1.116.9", + "react": "^18.2.0 || ^19.0.0", + "react-dom": "^18.2.0 || ^19.0.0" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@tamagui/generate-themes/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@tamagui/get-button-sized": { "version": "1.116.2", "resolved": "https://registry.npmjs.org/@tamagui/get-button-sized/-/get-button-sized-1.116.2.tgz", @@ -9249,6 +10439,19 @@ "@tamagui/simple-hash": "1.116.2" } }, + "node_modules/@tamagui/helpers-node": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/helpers-node/-/helpers-node-1.116.9.tgz", + "integrity": "sha512-GncHw3m3AeczB292R0G/eY6f9k/8lXBC5JyNlISoTgHxsJ8eqK6uurZ/boVyFIiLjmhP9nvyhJuF1zzHR0rTYQ==", + "dependencies": { + "@tamagui/types": "1.116.9" + } + }, + "node_modules/@tamagui/helpers-node/node_modules/@tamagui/types": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/types/-/types-1.116.9.tgz", + "integrity": "sha512-sfNzhfZLmmISpfLAq5FPoI2V9qe96VmXI0vVCfU/L3nCWiWbMeR9L8GEakbO6f77OVQlwUkm/YJzj6EO2kWOwA==" + }, "node_modules/@tamagui/helpers-tamagui": { "version": "1.116.2", "resolved": "https://registry.npmjs.org/@tamagui/helpers-tamagui/-/helpers-tamagui-1.116.2.tgz", @@ -9442,6 +10645,11 @@ "react": "*" } }, + "node_modules/@tamagui/proxy-worm": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/proxy-worm/-/proxy-worm-1.116.9.tgz", + "integrity": "sha512-S35y/zVIf2zolRVtpdVBtEo7A7aAcxCTjMPjawUWyiwwAUeGzZiK520kG88ImpbZKLopy+4qF5VpYHzdLobZkg==" + }, "node_modules/@tamagui/radio-group": { "version": "1.116.2", "resolved": "https://registry.npmjs.org/@tamagui/radio-group/-/radio-group-1.116.2.tgz", @@ -9495,6 +10703,11 @@ "react-native": "*" } }, + "node_modules/@tamagui/react-native-svg": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-svg/-/react-native-svg-1.116.9.tgz", + "integrity": "sha512-TpI/fq36DgkTNK36HriRNTe32PLMsfz5Tppt7VWllnNNWWtVAusjCTkW2lsXizPfLffNGJVA/YE3GwbmhQuXYg==" + }, "node_modules/@tamagui/react-native-use-pressable": { "version": "1.116.2", "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-pressable/-/react-native-use-pressable-1.116.2.tgz", @@ -9511,6 +10724,170 @@ "react": "*" } }, + "node_modules/@tamagui/react-native-web-internals": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-web-internals/-/react-native-web-internals-1.116.9.tgz", + "integrity": "sha512-QkGtWpFJx2I95lByMuJ4QAE3yYxuXqztM36O6gF91T7ryrCX/0tJBqXxneFPDp1QffS7TNWjVAX/Yu+wbtW2hg==", + "license": "MIT", + "dependencies": { + "@tamagui/normalize-css-color": "1.116.9", + "@tamagui/react-native-use-pressable": "1.116.9", + "@tamagui/react-native-use-responder-events": "1.116.9", + "@tamagui/simple-hash": "1.116.9", + "@tamagui/web": "1.116.9", + "react": "^18.2.0 || ^19.0.0" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/compose-refs": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/compose-refs/-/compose-refs-1.116.9.tgz", + "integrity": "sha512-PGjLXCcTuXFiULDVMMUgXwx2Vgx4wBYUoLUHL3vQA2OdyEhfZc+pBaEGfXDrqO+U7l4A6GtdAaxHIryCCzu0qA==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/constants": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/constants/-/constants-1.116.9.tgz", + "integrity": "sha512-gnYawS+8Kewm6mAMZrSzYINUKTGRKkq3YN7XKxPZTs4r5J200UdxcvabzQQa+uKkajnf5f+kRtPGXxioD7nPiw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/helpers": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/helpers/-/helpers-1.116.9.tgz", + "integrity": "sha512-+MHjkgZDJq8ASNPydOHIXiDPWpQhFmp6hBu3WXu2MasG+6x3bOMzJGsjIEujo4BjZOMP8j5yr3ZrbhDshYwxkg==", + "dependencies": { + "@tamagui/constants": "1.116.9", + "@tamagui/simple-hash": "1.116.9" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/normalize-css-color": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/normalize-css-color/-/normalize-css-color-1.116.9.tgz", + "integrity": "sha512-PSuo/1Pwf8lC9bRptnN4muI6/fD26m8WWkDUpCGPTuu2z5wJSqFXVlk1qPXH+5vewPMIDMwxVgmjj8ik8hBfCA==", + "dependencies": { + "@react-native/normalize-color": "^2.1.0" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/react-native-use-pressable": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-pressable/-/react-native-use-pressable-1.116.9.tgz", + "integrity": "sha512-yfJ4DsRDD8305cWxVfM6ruEpGMFJzkW4z/rzhommNChurSSetnZEy03xKOY950JHSo/TEA5hKjuIq4XULd/rCw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/react-native-use-responder-events": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-responder-events/-/react-native-use-responder-events-1.116.9.tgz", + "integrity": "sha512-qtm7xH/5xmBQxQHmExLqy4abKbyt5stLPOFnigvDQdwWxqEqiGUzJ4dEZhfKVrpD/xFYu7DJ+Z7LYC4kmzjV3w==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/simple-hash": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/simple-hash/-/simple-hash-1.116.9.tgz", + "integrity": "sha512-DNZ7yxmNgODZC5k65468WeZMv33IYjdxe6y85rqrY2BksAthUhZktrEMdzTp6Nu2mG8dCL58JmVqXWiW2a7dmg==" + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/timer": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/timer/-/timer-1.116.9.tgz", + "integrity": "sha512-1KAcZetgWl7V0177067YFS4jlekDLHo9rqwu/SDqAoEeLqwJVnBsZ+5GP5LQ5ACh/wScGB3hM5aMOjrdTqIstw==" + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/types": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/types/-/types-1.116.9.tgz", + "integrity": "sha512-sfNzhfZLmmISpfLAq5FPoI2V9qe96VmXI0vVCfU/L3nCWiWbMeR9L8GEakbO6f77OVQlwUkm/YJzj6EO2kWOwA==" + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/use-did-finish-ssr": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-did-finish-ssr/-/use-did-finish-ssr-1.116.9.tgz", + "integrity": "sha512-y+cecFsjcXyOC2X7ERCnGP9Y83/nxKorP4JqPHaIdzCNch1IKi4aBssueV6IP1/8KEbuPpRCf0+94XPgxPARNw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/use-event": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-event/-/use-event-1.116.9.tgz", + "integrity": "sha512-m4YOjCjOnHdS/0Y4sJaVsbvx6WmpIKa6BotJzVAK55SWQ1GaTZVvInA63mfd7Yxd6csTPOmNBQ9m6zKsxJTE0g==", + "dependencies": { + "@tamagui/constants": "1.116.9" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/use-force-update": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-force-update/-/use-force-update-1.116.9.tgz", + "integrity": "sha512-y49rpRIvLlsjOBbnBtrli36TGsEbzrDjJPy1aSbixSv3G3gMDptzEANhuP6Z7fNuMElC+t7JKcE+qwEdVhQBWA==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-internals/node_modules/@tamagui/web": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/web/-/web-1.116.9.tgz", + "integrity": "sha512-IPygGtQQX3qW6P8ZwdfGVuvQN3WyVzckw0pbAD2vsbJM3Fj5RqbmBthZfMpPsirKoe4C5+zIvD940oeBPN5g/g==", + "license": "MIT", + "dependencies": { + "@tamagui/compose-refs": "1.116.9", + "@tamagui/constants": "1.116.9", + "@tamagui/helpers": "1.116.9", + "@tamagui/normalize-css-color": "1.116.9", + "@tamagui/timer": "1.116.9", + "@tamagui/types": "1.116.9", + "@tamagui/use-did-finish-ssr": "1.116.9", + "@tamagui/use-event": "1.116.9", + "@tamagui/use-force-update": "1.116.9", + "react": "^18.2.0 || ^19.0.0", + "react-dom": "^18.2.0 || ^19.0.0" + } + }, + "node_modules/@tamagui/react-native-web-lite": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-web-lite/-/react-native-web-lite-1.116.9.tgz", + "integrity": "sha512-3LnOhh5dw6aTwlX5CaZnT+UPRX5rZ2TT3cWvfvfWU/jsyY4yhQuybHs+p9yNL5jvq0hcxnCDkT4NZeubBMT6Hw==", + "license": "MIT", + "dependencies": { + "@tamagui/normalize-css-color": "1.116.9", + "@tamagui/react-native-use-pressable": "1.116.9", + "@tamagui/react-native-use-responder-events": "1.116.9", + "@tamagui/react-native-web-internals": "1.116.9", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-lite/node_modules/@tamagui/normalize-css-color": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/normalize-css-color/-/normalize-css-color-1.116.9.tgz", + "integrity": "sha512-PSuo/1Pwf8lC9bRptnN4muI6/fD26m8WWkDUpCGPTuu2z5wJSqFXVlk1qPXH+5vewPMIDMwxVgmjj8ik8hBfCA==", + "dependencies": { + "@react-native/normalize-color": "^2.1.0" + } + }, + "node_modules/@tamagui/react-native-web-lite/node_modules/@tamagui/react-native-use-pressable": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-pressable/-/react-native-use-pressable-1.116.9.tgz", + "integrity": "sha512-yfJ4DsRDD8305cWxVfM6ruEpGMFJzkW4z/rzhommNChurSSetnZEy03xKOY950JHSo/TEA5hKjuIq4XULd/rCw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/react-native-web-lite/node_modules/@tamagui/react-native-use-responder-events": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-responder-events/-/react-native-use-responder-events-1.116.9.tgz", + "integrity": "sha512-qtm7xH/5xmBQxQHmExLqy4abKbyt5stLPOFnigvDQdwWxqEqiGUzJ4dEZhfKVrpD/xFYu7DJ+Z7LYC4kmzjV3w==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/@tamagui/remove-scroll": { "version": "1.116.2", "resolved": "https://registry.npmjs.org/@tamagui/remove-scroll/-/remove-scroll-1.116.2.tgz", @@ -9714,12 +11091,312 @@ "react": "^18.2.0 || ^19.0.0" } }, - "node_modules/@tamagui/switch": { - "version": "1.116.2", - "resolved": "https://registry.npmjs.org/@tamagui/switch/-/switch-1.116.2.tgz", - "integrity": "sha512-kDRQ4pGK/dN8LPnL3yC/PjhwvytZt3vECLGi6tyKfbRfMgUtl959IsAT6WZwld7LFYGa5aFxzo5MV6QYs55hrQ==", + "node_modules/@tamagui/static": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/static/-/static-1.116.9.tgz", + "integrity": "sha512-XtbRdf7ByjatSo+pWvXZZTkMHPKPJguY4RuZ16gaDlwAOp/aH0wPR7p8P8mCic1iFEKs3CvyARbByJAqh3nd/g==", + "license": "MIT", "dependencies": { - "@tamagui/compose-refs": "1.116.2", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.5", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/parser": "^7.25.4", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/runtime": "^7.25.4", + "@babel/traverse": "^7.25.4", + "@babel/types": "^7.25.4", + "@esbuild-plugins/tsconfig-paths": "^0.1.2", + "@tamagui/build": "1.116.9", + "@tamagui/cli-color": "1.116.9", + "@tamagui/config-default": "1.116.9", + "@tamagui/core": "1.116.9", + "@tamagui/fake-react-native": "1.116.9", + "@tamagui/generate-themes": "1.116.9", + "@tamagui/helpers": "1.116.9", + "@tamagui/helpers-node": "1.116.9", + "@tamagui/proxy-worm": "1.116.9", + "@tamagui/react-native-web-internals": "1.116.9", + "@tamagui/react-native-web-lite": "1.116.9", + "@tamagui/shorthands": "1.116.9", + "@tamagui/types": "1.116.9", + "babel-literal-to-ast": "^2.1.0", + "browserslist": "^4.22.2", + "check-dependency-version-consistency": "^4.1.0", + "esbuild": "^0.24.0", + "esbuild-register": "^3.6.0", + "fast-glob": "^3.2.11", + "find-cache-dir": "^3.3.2", + "find-root": "^1.1.0", + "fs-extra": "^11.2.0", + "invariant": "^2.2.4", + "lodash": "^4.17.21", + "react-dom": "^18.2.0 || ^19.0.0", + "react-native-web": "^0.19.12" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/static/node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/compose-refs": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/compose-refs/-/compose-refs-1.116.9.tgz", + "integrity": "sha512-PGjLXCcTuXFiULDVMMUgXwx2Vgx4wBYUoLUHL3vQA2OdyEhfZc+pBaEGfXDrqO+U7l4A6GtdAaxHIryCCzu0qA==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/constants": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/constants/-/constants-1.116.9.tgz", + "integrity": "sha512-gnYawS+8Kewm6mAMZrSzYINUKTGRKkq3YN7XKxPZTs4r5J200UdxcvabzQQa+uKkajnf5f+kRtPGXxioD7nPiw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/core": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/core/-/core-1.116.9.tgz", + "integrity": "sha512-9KKx6sDmW/uTuuIvKKrFhF5U4eL0DUPELGenqx+fwGe8hVlcXxKS3fQL2MfNHvrvGdqyEDCFkoUOfyKC9lcTOg==", + "license": "MIT", + "dependencies": { + "@tamagui/react-native-use-pressable": "1.116.9", + "@tamagui/react-native-use-responder-events": "1.116.9", + "@tamagui/use-event": "1.116.9", + "@tamagui/web": "1.116.9" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/fake-react-native": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/fake-react-native/-/fake-react-native-1.116.9.tgz", + "integrity": "sha512-+CDj1jiy5Jx4Zi9rDOpPv6c7nsVVz8tF3gROH38C/2ygOP/Dz1xmGpiWuHGpZdoGSREIHDbx4pMiTfJzYrL8/A==" + }, + "node_modules/@tamagui/static/node_modules/@tamagui/helpers": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/helpers/-/helpers-1.116.9.tgz", + "integrity": "sha512-+MHjkgZDJq8ASNPydOHIXiDPWpQhFmp6hBu3WXu2MasG+6x3bOMzJGsjIEujo4BjZOMP8j5yr3ZrbhDshYwxkg==", + "dependencies": { + "@tamagui/constants": "1.116.9", + "@tamagui/simple-hash": "1.116.9" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/normalize-css-color": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/normalize-css-color/-/normalize-css-color-1.116.9.tgz", + "integrity": "sha512-PSuo/1Pwf8lC9bRptnN4muI6/fD26m8WWkDUpCGPTuu2z5wJSqFXVlk1qPXH+5vewPMIDMwxVgmjj8ik8hBfCA==", + "dependencies": { + "@react-native/normalize-color": "^2.1.0" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/react-native-use-pressable": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-pressable/-/react-native-use-pressable-1.116.9.tgz", + "integrity": "sha512-yfJ4DsRDD8305cWxVfM6ruEpGMFJzkW4z/rzhommNChurSSetnZEy03xKOY950JHSo/TEA5hKjuIq4XULd/rCw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/react-native-use-responder-events": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/react-native-use-responder-events/-/react-native-use-responder-events-1.116.9.tgz", + "integrity": "sha512-qtm7xH/5xmBQxQHmExLqy4abKbyt5stLPOFnigvDQdwWxqEqiGUzJ4dEZhfKVrpD/xFYu7DJ+Z7LYC4kmzjV3w==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/shorthands": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/shorthands/-/shorthands-1.116.9.tgz", + "integrity": "sha512-3w5SkaUs6MPjXloBv7tlWt2fN6zrEA7viXNBl+nholnnWtB1Kse0YpJLuSiOWi9d01ozNdZgy/bVYrXzDOkSWA==" + }, + "node_modules/@tamagui/static/node_modules/@tamagui/simple-hash": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/simple-hash/-/simple-hash-1.116.9.tgz", + "integrity": "sha512-DNZ7yxmNgODZC5k65468WeZMv33IYjdxe6y85rqrY2BksAthUhZktrEMdzTp6Nu2mG8dCL58JmVqXWiW2a7dmg==" + }, + "node_modules/@tamagui/static/node_modules/@tamagui/timer": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/timer/-/timer-1.116.9.tgz", + "integrity": "sha512-1KAcZetgWl7V0177067YFS4jlekDLHo9rqwu/SDqAoEeLqwJVnBsZ+5GP5LQ5ACh/wScGB3hM5aMOjrdTqIstw==" + }, + "node_modules/@tamagui/static/node_modules/@tamagui/types": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/types/-/types-1.116.9.tgz", + "integrity": "sha512-sfNzhfZLmmISpfLAq5FPoI2V9qe96VmXI0vVCfU/L3nCWiWbMeR9L8GEakbO6f77OVQlwUkm/YJzj6EO2kWOwA==" + }, + "node_modules/@tamagui/static/node_modules/@tamagui/use-did-finish-ssr": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-did-finish-ssr/-/use-did-finish-ssr-1.116.9.tgz", + "integrity": "sha512-y+cecFsjcXyOC2X7ERCnGP9Y83/nxKorP4JqPHaIdzCNch1IKi4aBssueV6IP1/8KEbuPpRCf0+94XPgxPARNw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/use-event": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-event/-/use-event-1.116.9.tgz", + "integrity": "sha512-m4YOjCjOnHdS/0Y4sJaVsbvx6WmpIKa6BotJzVAK55SWQ1GaTZVvInA63mfd7Yxd6csTPOmNBQ9m6zKsxJTE0g==", + "dependencies": { + "@tamagui/constants": "1.116.9" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/use-force-update": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/use-force-update/-/use-force-update-1.116.9.tgz", + "integrity": "sha512-y49rpRIvLlsjOBbnBtrli36TGsEbzrDjJPy1aSbixSv3G3gMDptzEANhuP6Z7fNuMElC+t7JKcE+qwEdVhQBWA==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@tamagui/static/node_modules/@tamagui/web": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/web/-/web-1.116.9.tgz", + "integrity": "sha512-IPygGtQQX3qW6P8ZwdfGVuvQN3WyVzckw0pbAD2vsbJM3Fj5RqbmBthZfMpPsirKoe4C5+zIvD940oeBPN5g/g==", + "license": "MIT", + "dependencies": { + "@tamagui/compose-refs": "1.116.9", + "@tamagui/constants": "1.116.9", + "@tamagui/helpers": "1.116.9", + "@tamagui/normalize-css-color": "1.116.9", + "@tamagui/timer": "1.116.9", + "@tamagui/types": "1.116.9", + "@tamagui/use-did-finish-ssr": "1.116.9", + "@tamagui/use-event": "1.116.9", + "@tamagui/use-force-update": "1.116.9", + "react": "^18.2.0 || ^19.0.0", + "react-dom": "^18.2.0 || ^19.0.0" + } + }, + "node_modules/@tamagui/static/node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/@tamagui/static/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@tamagui/static/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@tamagui/static/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@tamagui/static/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tamagui/static/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@tamagui/switch": { + "version": "1.116.2", + "resolved": "https://registry.npmjs.org/@tamagui/switch/-/switch-1.116.2.tgz", + "integrity": "sha512-kDRQ4pGK/dN8LPnL3yC/PjhwvytZt3vECLGi6tyKfbRfMgUtl959IsAT6WZwld7LFYGa5aFxzo5MV6QYs55hrQ==", + "dependencies": { + "@tamagui/compose-refs": "1.116.2", "@tamagui/constants": "1.116.2", "@tamagui/core": "1.116.2", "@tamagui/focusable": "1.116.2", @@ -10022,6 +11699,66 @@ "react": "*" } }, + "node_modules/@tamagui/vite-plugin": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/vite-plugin/-/vite-plugin-1.116.9.tgz", + "integrity": "sha512-KWXOhOsDTwiQ3SOoNMAVknf0qtCbkR7lxXHPoFMN4g145gNvzJ5hee8YsdxXUnOSTtrhim0Y/uWJzc0+q2uAjg==", + "license": "MIT", + "dependencies": { + "@tamagui/fake-react-native": "1.116.9", + "@tamagui/proxy-worm": "1.116.9", + "@tamagui/react-native-svg": "1.116.9", + "@tamagui/react-native-web-lite": "1.116.9", + "@tamagui/static": "1.116.9", + "esm-resolve": "^1.0.8", + "fs-extra": "^11.2.0", + "outdent": "^0.8.0", + "react-native-web": "^0.19.12" + }, + "peerDependencies": { + "vite": "*" + } + }, + "node_modules/@tamagui/vite-plugin/node_modules/@tamagui/fake-react-native": { + "version": "1.116.9", + "resolved": "https://registry.npmjs.org/@tamagui/fake-react-native/-/fake-react-native-1.116.9.tgz", + "integrity": "sha512-+CDj1jiy5Jx4Zi9rDOpPv6c7nsVVz8tF3gROH38C/2ygOP/Dz1xmGpiWuHGpZdoGSREIHDbx4pMiTfJzYrL8/A==" + }, + "node_modules/@tamagui/vite-plugin/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@tamagui/vite-plugin/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@tamagui/vite-plugin/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@tamagui/web": { "version": "1.116.2", "resolved": "https://registry.npmjs.org/@tamagui/web/-/web-1.116.2.tgz", @@ -10168,8 +11905,7 @@ "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/express": { "version": "4.17.21", @@ -10195,6 +11931,15 @@ "@types/send": "*" } }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/get-params": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/get-params/-/get-params-0.1.2.tgz", @@ -10252,6 +11997,12 @@ "pretty-format": "^29.0.0" } }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, "node_modules/@types/jsdom": { "version": "20.0.1", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", @@ -10345,15 +12096,6 @@ "csstype": "^3.0.2" } }, - "node_modules/@types/react-test-renderer": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.3.0.tgz", - "integrity": "sha512-HW4MuEYxfDbOHQsVlY/XtOvNHftCVEPhJF2pQXXwcUiUF+Oyb0usgp48HSgpK5rt8m9KZb22yqOeZm+rrVG8gw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -10677,301 +12419,35 @@ "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" } }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", - "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", + "node_modules/@web3-storage/multipart-parser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz", + "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, - "node_modules/@vitest/coverage-v8": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.3.tgz", - "integrity": "sha512-2OJ3c7UPoFSmBZwqD2VEkUw6A/tzPF0LmW0ZZhhB8PFxuc+9IBG/FaSM+RLEenc7ljzFvGN+G0nGQoZnh7sy2A==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.6", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.11", - "magicast": "^0.3.4", - "std-env": "^3.7.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "2.1.3", - "vitest": "2.1.3" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } - } + "peer": true }, - "node_modules/@vitest/coverage-v8/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitest/expect": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", - "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", - "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.3", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.11" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/spy": "2.1.3", - "msw": "^2.3.5", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", - "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", - "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.1.3", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", - "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.3", - "magic-string": "^0.30.11", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", - "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.3.tgz", - "integrity": "sha512-2XwTrHVJw3t9NYES26LQUYy51ZB8W4bRPgqUH2Eyda3kIuOlYw1ZdPNU22qcVlUVx4WKgECFQOSXuopsczuVjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.1.3", - "fflate": "^0.8.2", - "flatted": "^3.3.1", - "pathe": "^1.1.2", - "sirv": "^2.0.4", - "tinyglobby": "^0.2.6", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.1.3" - } - }, - "node_modules/@vitest/utils": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", - "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@web3-storage/multipart-parser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz", - "integrity": "sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "peer": true + "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", @@ -11582,16 +13058,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/ast-types": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", @@ -11742,6 +13208,20 @@ "node": ">=8" } }, + "node_modules/babel-literal-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/babel-literal-to-ast/-/babel-literal-to-ast-2.1.0.tgz", + "integrity": "sha512-CxfpQ0ysQ0bZOhlaPgcWjl79Em16Rhqc6++UAFn0A3duiXmuyhhj8yyl9PYbj0I0CyjrHovdDbp2QEKT7uIMxw==", + "license": "CC0-1.0", + "dependencies": { + "@babel/parser": "^7.1.6", + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.1.6" + }, + "peerDependencies": { + "@babel/core": "^7.1.2" + } + }, "node_modules/babel-loader": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", @@ -12301,7 +13781,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -12578,33 +14057,6 @@ "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==" }, - "node_modules/bunyamin": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.6.3.tgz", - "integrity": "sha512-m1hAijFhu8pFiidsVc0XEDic46uxPK+mKNLqkb5mluNx0nTolNzx/DjwMqHChQWCgfOLMjKYJJ2uPTQLE6t4Ng==", - "dev": true, - "dependencies": { - "@flatten-js/interval-tree": "^1.1.2", - "multi-sort-stream": "^1.0.4", - "stream-json": "^1.7.5", - "trace-event-lib": "^1.3.1" - }, - "engines": { - "node": ">=14.18.2" - }, - "peerDependencies": { - "@types/bunyan": "^1.8.8", - "bunyan": "^1.8.15 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@types/bunyan": { - "optional": true - }, - "bunyan": { - "optional": true - } - } - }, "node_modules/bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -12716,16 +14168,6 @@ "node": ">= 0.8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cacache": { "version": "18.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", @@ -12901,23 +14343,6 @@ } ] }, - "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -12956,38 +14381,145 @@ "node": "*" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, + "node_modules/check-dependency-version-consistency": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/check-dependency-version-consistency/-/check-dependency-version-consistency-4.1.0.tgz", + "integrity": "sha512-xghkzKgMxpAfeP9OJfVrErtv8BU4h5kHYQyheHC0j0RYRVNWti0qI3+HkFgWBKejq2UE2wOnoWZlvDKFj6jFoA==", "license": "MIT", + "dependencies": { + "@types/js-yaml": "^4.0.5", + "chalk": "^5.2.0", + "commander": "^10.0.1", + "edit-json-file": "^1.7.0", + "globby": "^13.1.4", + "js-yaml": "^4.1.0", + "semver": "^7.5.1", + "table": "^6.8.1", + "type-fest": "^3.11.0" + }, + "bin": { + "check-dependency-version-consistency": "dist/bin/check-dependency-version-consistency.js" + }, "engines": { - "node": ">= 16" + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" } }, - "node_modules/child-process-promise": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", - "integrity": "sha512-Fi4aNdqBsr0mv+jgWxcZ/7rAIC2mgihrptyVI4foh/rrjY/3BNjfP9+oaiFx/fzim+1ZyCNBae0DlyfQhSugog==", - "dev": true, - "dependencies": { - "cross-spawn": "^4.0.2", - "node-version": "^1.0.0", - "promise-polyfill": "^6.0.1" + "node_modules/check-dependency-version-consistency/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/check-dependency-version-consistency/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/child-process-promise/node_modules/cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "node_modules/check-dependency-version-consistency/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" } }, - "node_modules/child-process-promise/node_modules/lru-cache": { + "node_modules/check-dependency-version-consistency/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/check-dependency-version-consistency/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/check-dependency-version-consistency/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/check-dependency-version-consistency/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/check-dependency-version-consistency/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/child-process-promise": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", + "integrity": "sha512-Fi4aNdqBsr0mv+jgWxcZ/7rAIC2mgihrptyVI4foh/rrjY/3BNjfP9+oaiFx/fzim+1ZyCNBae0DlyfQhSugog==", + "dev": true, + "dependencies": { + "cross-spawn": "^4.0.2", + "node-version": "^1.0.0", + "promise-polyfill": "^6.0.1" + } + }, + "node_modules/child-process-promise/node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/child-process-promise/node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", @@ -13019,7 +14551,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -13118,7 +14649,8 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/clean-stack": { "version": "2.2.0", @@ -13303,6 +14835,7 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -13595,6 +15128,7 @@ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -13616,6 +15150,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13631,6 +15166,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13647,6 +15183,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -13658,13 +15195,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/create-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -13674,6 +15213,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13973,16 +15513,6 @@ } } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-equal": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", @@ -14174,6 +15704,7 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -14397,6 +15928,100 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/detox/node_modules/jest-environment-emit": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.8.tgz", + "integrity": "sha512-WNqvxBLH0yNojHJQ99Y21963aT7UTavxV3PgiBQFi8zwrlnKU6HvkB6LOvQrbk5I8mI8JEKvcoOrQOvBVMLIXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bunyamin": "^1.5.2", + "bunyan": "^2.0.5", + "bunyan-debug-stream": "^3.1.0", + "funpermaproxy": "^1.1.0", + "lodash.merge": "^4.6.2", + "node-ipc": "9.2.1", + "strip-ansi": "^6.0.0", + "tslib": "^2.5.3" + }, + "engines": { + "node": ">=16.14.0" + }, + "peerDependencies": { + "@jest/environment": ">=27.2.5", + "@jest/types": ">=27.2.5", + "jest": ">=27.2.5", + "jest-environment-jsdom": ">=27.2.5", + "jest-environment-node": ">=27.2.5" + }, + "peerDependenciesMeta": { + "@jest/environment": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "jest-environment-node": { + "optional": true + } + } + }, + "node_modules/detox/node_modules/jest-environment-emit/node_modules/bunyamin": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/bunyamin/-/bunyamin-1.6.3.tgz", + "integrity": "sha512-m1hAijFhu8pFiidsVc0XEDic46uxPK+mKNLqkb5mluNx0nTolNzx/DjwMqHChQWCgfOLMjKYJJ2uPTQLE6t4Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@flatten-js/interval-tree": "^1.1.2", + "multi-sort-stream": "^1.0.4", + "stream-json": "^1.7.5", + "trace-event-lib": "^1.3.1" + }, + "engines": { + "node": ">=14.18.2" + }, + "peerDependencies": { + "@types/bunyan": "^1.8.8", + "bunyan": "^1.8.15 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@types/bunyan": { + "optional": true + }, + "bunyan": { + "optional": true + } + } + }, + "node_modules/detox/node_modules/jest-environment-emit/node_modules/bunyan": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-2.0.5.tgz", + "integrity": "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==", + "dev": true, + "engines": [ + "node >=0.10.0" + ], + "license": "MIT", + "dependencies": { + "exeunt": "1.1.0" + }, + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { + "dtrace-provider": "~0.8", + "moment": "^2.19.3", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, "node_modules/detox/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -14713,6 +16338,19 @@ "node": ">=6.0.0" } }, + "node_modules/edit-json-file": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/edit-json-file/-/edit-json-file-1.8.0.tgz", + "integrity": "sha512-IBOpbe2aQufNl5oZ4jsr2AmNVUy5bO7jS5hk0cCyWhOLdH59Xv41B3XQObE/JB89Ae5qDY9hVsq13/hgGhFBZg==", + "license": "MIT", + "dependencies": { + "find-value": "^1.0.12", + "iterate-object": "^1.3.4", + "r-json": "^1.2.10", + "set-value": "^4.1.0", + "w-json": "^1.3.10" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -15050,7 +16688,6 @@ "version": "0.23.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -15085,11 +16722,27 @@ "@esbuild/win32-x64": "0.23.1" } }, + "node_modules/esbuild-plugin-es5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/esbuild-plugin-es5/-/esbuild-plugin-es5-2.1.1.tgz", + "integrity": "sha512-GRcHLUwjmrjxz9bN24ooTedrBrAVx7+F8M1aD7FFB+7RTHkt7FY8tHAQ9znyzsV16+95ojbTyJLY+HPO0OI7zA==", + "license": "MIT", + "dependencies": { + "@swc/core": "^1.5.25", + "@swc/helpers": "^0.5.11", + "deepmerge": "^4.3.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "esbuild": "*" + } + }, "node_modules/esbuild-register": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, "dependencies": { "debug": "^4.3.4" }, @@ -15097,40 +16750,408 @@ "esbuild": ">=0.12 <1" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, + "node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" @@ -15475,6 +17496,12 @@ "node": ">=8" } }, + "node_modules/esm-resolve": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/esm-resolve/-/esm-resolve-1.0.11.tgz", + "integrity": "sha512-LxF0wfUQm3ldUDHkkV2MIbvvY0TgzIpJ420jHSV1Dm+IlplBEWiJTKWM61GtxUfvjV6iD4OtTYFGAGM2uuIUWg==", + "license": "Apache-2.0" + }, "node_modules/espree": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", @@ -15539,16 +17566,6 @@ "node": ">=4.0" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -15736,6 +17753,7 @@ "resolved": "https://registry.npmjs.org/exeunt/-/exeunt-1.1.0.tgz", "integrity": "sha512-dd++Yn/0Fp+gtJ04YHov7MeAii+LFivJc6KqnJNfplzLVUkUDrfKoQDTLlCgzcW15vY5hKlHasWeIsQJ8agHsw==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=0.10" } @@ -16498,33 +18516,11 @@ "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, - "node_modules/fdir": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", - "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/fetch-retry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==" }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true, - "license": "MIT" - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -16687,6 +18683,12 @@ "semver": "bin/semver" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -16702,6 +18704,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-value": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/find-value/-/find-value-1.0.12.tgz", + "integrity": "sha512-OCpo8LTk8eZ2sdDCwbU2Lc3ivYsdM6yod6jP2jHcNEFcjPhkgH0+POzTIol7xx1LZgtbI5rkO5jqxsG5MWtPjQ==", + "license": "MIT" + }, "node_modules/find-yarn-workspace-root": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", @@ -16753,62 +18761,6 @@ "node": ">=0.4.0" } }, - "node_modules/flow-remove-types": { - "version": "2.248.0", - "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.248.0.tgz", - "integrity": "sha512-2X2NFQhTJgoGNFIMR6TGui5uV0i/rEp1nkZXI7LFZjMYAO2CxsCbyz+fxE8Dw1W77bXdd5IWmPUa/NjfQLBBkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-parser": "0.24.0", - "pirates": "^3.0.2", - "vlq": "^0.2.1" - }, - "bin": { - "flow-node": "flow-node", - "flow-remove-types": "flow-remove-types" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flow-remove-types/node_modules/hermes-estree": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", - "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/flow-remove-types/node_modules/hermes-parser": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", - "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.24.0" - } - }, - "node_modules/flow-remove-types/node_modules/pirates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-3.0.2.tgz", - "integrity": "sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/flow-remove-types/node_modules/vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true, - "license": "MIT" - }, "node_modules/fontfaceobserver": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", @@ -17649,6 +19601,7 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -17957,7 +19910,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -18094,6 +20046,7 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -18248,6 +20201,15 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, + "node_modules/is-primitive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", + "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -18446,6 +20408,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -18462,6 +20425,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -18485,46 +20449,23 @@ }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/istanbul-reports": { @@ -18567,6 +20508,12 @@ "it-batch": "^1.0.9" } }, + "node_modules/iterate-object": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", + "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==", + "license": "MIT" + }, "node_modules/iterator.prototype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", @@ -18603,6 +20550,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -18629,6 +20577,7 @@ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -18643,6 +20592,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -18666,6 +20616,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -18678,6 +20629,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -18690,6 +20642,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -18699,6 +20652,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -18711,6 +20665,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -18726,6 +20681,7 @@ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -18757,6 +20713,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -18772,6 +20729,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18788,6 +20746,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -18799,13 +20758,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18815,6 +20776,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -18827,6 +20789,7 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -18860,6 +20823,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -18875,6 +20839,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18891,6 +20856,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -18902,13 +20868,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18918,6 +20886,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -18930,6 +20899,7 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -18975,6 +20945,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -18990,6 +20961,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19006,6 +20978,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -19017,13 +20990,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -19033,6 +21008,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19130,6 +21106,7 @@ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -19142,6 +21119,7 @@ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -19158,6 +21136,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -19173,6 +21152,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19189,6 +21169,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -19200,13 +21181,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -19216,6 +21199,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19223,134 +21207,250 @@ "node": ">=8" } }, - "node_modules/jest-environment-emit": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/jest-environment-emit/-/jest-environment-emit-1.0.8.tgz", - "integrity": "sha512-WNqvxBLH0yNojHJQ99Y21963aT7UTavxV3PgiBQFi8zwrlnKU6HvkB6LOvQrbk5I8mI8JEKvcoOrQOvBVMLIXQ==", + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "dependencies": { - "bunyamin": "^1.5.2", - "bunyan": "^2.0.5", - "bunyan-debug-stream": "^3.1.0", - "funpermaproxy": "^1.1.0", - "lodash.merge": "^4.6.2", - "node-ipc": "9.2.1", - "strip-ansi": "^6.0.0", - "tslib": "^2.5.3" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" }, "engines": { - "node": ">=16.14.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@jest/environment": ">=27.2.5", - "@jest/types": ">=27.2.5", - "jest": ">=27.2.5", - "jest-environment-jsdom": ">=27.2.5", - "jest-environment-node": ">=27.2.5" + "canvas": "^2.5.0" }, "peerDependenciesMeta": { - "@jest/environment": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, - "jest-environment-node": { + "canvas": { "optional": true } } }, - "node_modules/jest-environment-emit/node_modules/bunyan": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-2.0.5.tgz", - "integrity": "sha512-Jvl74TdxCN6rSP9W1I6+UOUtwslTDqsSFkDqZlFb/ilaSvQ+bZAnXT/GT97IZ5L+Vph0joPZPhxUyn6FLNmFAA==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-expo": { + "version": "51.0.4", + "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-51.0.4.tgz", + "integrity": "sha512-WmlR4rUur1TNF/F14brKCmPdX3TWf7Bno/6A1PuxnflN79LEIXpXuPKMlMWwCCChTohGB5FRniknRibblWu1ug==", + "dev": true, + "dependencies": { + "@expo/config": "~9.0.0-beta.0", + "@expo/json-file": "^8.3.0", + "@jest/create-cache-key-function": "^29.2.1", + "babel-jest": "^29.2.1", + "find-up": "^5.0.0", + "jest-environment-jsdom": "^29.2.1", + "jest-watch-select-projects": "^2.0.0", + "jest-watch-typeahead": "2.2.1", + "json5": "^2.2.3", + "lodash": "^4.17.19", + "react-test-renderer": "18.2.0", + "stacktrace-js": "^2.0.2" + }, + "bin": { + "jest": "bin/jest.js" + } + }, + "node_modules/jest-expo/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-expo/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-expo/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-expo/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-expo/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-expo/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-expo/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-expo/node_modules/jest-watch-typeahead": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz", + "integrity": "sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^6.0.0", + "chalk": "^4.0.0", + "jest-regex-util": "^29.0.0", + "jest-watcher": "^29.0.0", + "slash": "^5.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" + } + }, + "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, - "engines": [ - "node >=0.10.0" - ], - "dependencies": { - "exeunt": "1.1.0" - }, - "bin": { - "bunyan": "bin/bunyan" + "license": "MIT", + "engines": { + "node": ">=14.16" }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" + "node": ">=12.20" }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "node_modules/jest-expo/node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/jest-expo": { - "version": "51.0.4", - "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-51.0.4.tgz", - "integrity": "sha512-WmlR4rUur1TNF/F14brKCmPdX3TWf7Bno/6A1PuxnflN79LEIXpXuPKMlMWwCCChTohGB5FRniknRibblWu1ug==", + "node_modules/jest-expo/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "@expo/config": "~9.0.0-beta.0", - "@expo/json-file": "^8.3.0", - "@jest/create-cache-key-function": "^29.2.1", - "babel-jest": "^29.2.1", - "find-up": "^5.0.0", - "jest-environment-jsdom": "^29.2.1", - "jest-watch-select-projects": "^2.0.0", - "jest-watch-typeahead": "2.2.1", - "json5": "^2.2.3", - "lodash": "^4.17.19", - "react-test-renderer": "18.2.0", - "stacktrace-js": "^2.0.2" + "has-flag": "^4.0.0" }, - "bin": { - "jest": "bin/jest.js" + "engines": { + "node": ">=8" } }, "node_modules/jest-get-type": { @@ -19391,6 +21491,7 @@ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, + "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -19585,6 +21686,7 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -19611,6 +21713,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -19631,6 +21734,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, + "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -19644,6 +21748,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -19659,6 +21764,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19675,6 +21781,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -19686,13 +21793,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -19702,6 +21811,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19714,6 +21824,7 @@ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -19746,6 +21857,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -19761,6 +21873,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19777,6 +21890,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -19788,13 +21902,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -19804,6 +21920,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -19813,6 +21930,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -19823,6 +21941,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19835,6 +21954,7 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -19868,6 +21988,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -19883,6 +22004,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19899,6 +22021,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -19910,13 +22033,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -19926,6 +22051,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19938,6 +22064,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -19969,6 +22096,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -19984,6 +22112,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20000,6 +22129,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -20011,13 +22141,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -20027,6 +22159,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -20039,6 +22172,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -20230,128 +22364,16 @@ }, "node_modules/jest-watch-select-projects": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz", - "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "chalk": "^3.0.0", - "prompts": "^2.2.1" - } - }, - "node_modules/jest-watch-select-projects/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-select-projects/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-select-projects/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watch-select-projects/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-watch-select-projects/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-select-projects/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz", - "integrity": "sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^6.0.0", - "chalk": "^4.0.0", - "jest-regex-util": "^29.0.0", - "jest-watcher": "^29.0.0", - "slash": "^5.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz", + "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "dependencies": { + "ansi-escapes": "^4.3.0", + "chalk": "^3.0.0", + "prompts": "^2.2.1" } }, - "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "node_modules/jest-watch-select-projects/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -20366,32 +22388,20 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-watch-select-projects/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "dev": true, - "engines": { - "node": ">=12.20" + "node": ">=8" } }, - "node_modules/jest-watch-typeahead/node_modules/color-convert": { + "node_modules/jest-watch-select-projects/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -20403,13 +22413,13 @@ "node": ">=7.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/color-name": { + "node_modules/jest-watch-select-projects/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/jest-watch-typeahead/node_modules/has-flag": { + "node_modules/jest-watch-select-projects/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -20418,50 +22428,7 @@ "node": ">=8" } }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dev": true, - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/supports-color": { + "node_modules/jest-watch-select-projects/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -20478,6 +22445,7 @@ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, + "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -20497,6 +22465,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -20512,6 +22481,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20528,6 +22498,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -20539,13 +22510,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -20555,6 +22528,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -21039,7 +23013,6 @@ "version": "1.27.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", - "dev": true, "license": "MPL-2.0", "optional": true, "peer": true, @@ -21073,7 +23046,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -21470,6 +23442,12 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "license": "MIT" + }, "node_modules/log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -21866,13 +23844,6 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", - "dev": true, - "license": "MIT" - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -21881,27 +23852,6 @@ "yallist": "^3.0.2" } }, - "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -23155,16 +25105,6 @@ "node": ">=8.0.0" } }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha512-JMaRS9L4wSRIR+6PTVEikTrq/lMGEZR43a48ETeilY0Q0iMwVnccMFrUM1k+tNzmYuIU0Vh710bCUqHX+/+ctQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -23588,6 +25528,12 @@ "os-tmpdir": "^1.0.0" } }, + "node_modules/outdent": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", + "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==", + "license": "MIT" + }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -23784,22 +25730,6 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", @@ -23849,7 +25779,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -23861,7 +25790,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -23874,7 +25802,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -23886,7 +25813,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -23901,7 +25827,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -24240,7 +26165,8 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/qrcode-terminal": { "version": "0.11.0", @@ -24333,6 +26259,15 @@ "node": ">=8" } }, + "node_modules/r-json": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.3.0.tgz", + "integrity": "sha512-xesd+RHCpymPCYd9DvDvUr1w1IieSChkqYF1EpuAYrvCfLXji9NP36DvyYZJZZB5soVDvZ0WUtBoZaU1g5Yt9A==", + "license": "MIT", + "dependencies": { + "w-json": "1.3.10" + } + }, "node_modules/rabin-wasm": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", @@ -25218,7 +27153,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -25230,7 +27164,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -25498,6 +27431,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -25577,7 +27511,7 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", - "dev": true, + "peer": true, "dependencies": { "@types/estree": "1.0.6" }, @@ -25608,23 +27542,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true, - "license": "MIT" - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -26010,6 +27927,24 @@ "node": ">= 0.4" } }, + "node_modules/set-value": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz", + "integrity": "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==", + "funding": [ + "https://github.com/sponsors/jonschlinkert", + "https://paypal.me/jonathanschlinkert", + "https://jonschlinkert.dev/sponsor" + ], + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "is-primitive": "^3.0.1" + }, + "engines": { + "node": ">=11.0" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -26080,12 +28015,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -26133,31 +28062,6 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sirv/node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -26333,12 +28237,6 @@ "node": ">=8" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", @@ -26401,12 +28299,6 @@ "node": ">= 0.6" } }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, "node_modules/store2": { "version": "2.14.3", "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", @@ -26654,6 +28546,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -26690,7 +28583,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -26859,6 +28751,90 @@ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", "license": "MIT" }, + "node_modules/table": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/tamagui": { "version": "1.116.2", "resolved": "https://registry.npmjs.org/tamagui/-/tamagui-1.116.2.tgz", @@ -27338,79 +29314,12 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "dev": true }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", "dev": true }, - "node_modules/tinyexec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", - "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", - "dev": true - }, - "node_modules/tinyglobby": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.9.tgz", - "integrity": "sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.0", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -27454,16 +29363,6 @@ "node": ">=0.6" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -27728,7 +29627,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -27783,428 +29681,781 @@ "ua-parser-js": "script/cli.js" }, "engines": { - "node": "*" + "node": "*" + } + }, + "node_modules/uint8arrays": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", + "integrity": "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==", + "license": "MIT", + "dependencies": { + "multiformats": "^9.4.2" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.20.0.tgz", + "integrity": "sha512-AITZfPuxubm31Sx0vr8bteSalEbs9wQb/BOBi9FPlD9Qpd6HxZ4Q0+hI742jBhkPb4RT2v5MQzaW5VhRVyj+9A==", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest-callback": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.1.tgz", + "integrity": "sha512-QWlq8Is8BGWBf883QOEQP5HWYX/kMI+JTbJ5rdtvJLmXTIh9XoHIO3PQcmQl8BU44VKxow1kbQUHa6mQSMALDQ==", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/uint8arrays": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz", - "integrity": "sha512-Q9/hhJa2836nQfEJSZTmr+pg9+cDJS9XEAp7N2Vg5MzL3bK/mkMVfjscRGYruP9jNda6MAdf4QD/y78gSzkp6A==", + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "license": "MIT", - "dependencies": { - "multiformats": "^9.4.2" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/undici": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.20.0.tgz", - "integrity": "sha512-AITZfPuxubm31Sx0vr8bteSalEbs9wQb/BOBi9FPlD9Qpd6HxZ4Q0+hI742jBhkPb4RT2v5MQzaW5VhRVyj+9A==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { - "node": ">=18.17" + "node": ">= 0.4.0" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "engines": { - "node": ">=4" + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10.12.0" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "engines": { - "node": ">=4" - } + "node_modules/valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/unique-filename": { + "node_modules/validate-npm-package-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dependencies": { - "unique-slug": "^4.0.0" - }, + "builtins": "^1.0.3" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.8" } }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "node_modules/vite": { + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "license": "MIT", + "peer": true, "dependencies": { - "imurmurhash": "^0.1.4" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "peer": true, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">= 4.0.0" + "node": ">=12" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=12" } }, - "node_modules/use-latest-callback": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.1.tgz", - "integrity": "sha512-QWlq8Is8BGWBf883QOEQP5HWYX/kMI+JTbJ5rdtvJLmXTIh9XoHIO3PQcmQl8BU44VKxow1kbQUHa6mQSMALDQ==", - "peerDependencies": { - "react": ">=16.8" + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=12" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=10.12.0" + "node": ">=12" } }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dependencies": { - "builtins": "^1.0.3" + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "license": "MIT" + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", - "dev": true, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite-node": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", - "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", - "dev": true, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.6", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ - "arm64" + "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -28213,9 +30464,9 @@ "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -28248,158 +30499,17 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/vitest": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", - "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "2.1.3", - "@vitest/mocker": "2.1.3", - "@vitest/pretty-format": "^2.1.3", - "@vitest/runner": "2.1.3", - "@vitest/snapshot": "2.1.3", - "@vitest/spy": "2.1.3", - "@vitest/utils": "2.1.3", - "chai": "^5.1.1", - "debug": "^4.3.6", - "magic-string": "^0.30.11", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.3", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.3", - "@vitest/ui": "2.1.3", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest-react-native": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/vitest-react-native/-/vitest-react-native-0.1.5.tgz", - "integrity": "sha512-sgwLyoxhC8lddZV6nQQjJYpAVoa6Hxicw14rGZv7KJ4KuavA7QB4CaNOxTVZnD/1OMh+n5q6tnwWvjFORXyA4g==", - "dev": true, - "license": "ISC", - "dependencies": { - "@bunchtogether/vite-plugin-flow": "^1.0.2", - "@react-native/polyfills": "^2.0.0", - "esbuild": "^0.17.10", - "flow-remove-types": "^2.200.0", - "pirates": "^4.0.5", - "regenerator-runtime": "^0.13.11" - }, - "peerDependencies": { - "react": "*", - "react-native": "*", - "vite": "*" - } - }, - "node_modules/vitest-react-native/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest-react-native/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/vitest-react-native/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "license": "MIT" - }, "node_modules/vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" }, + "node_modules/w-json": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/w-json/-/w-json-1.3.10.tgz", + "integrity": "sha512-XadVyw0xE+oZ5FGApXsdswv96rOhStzKqL53uSe5UaTadABGkWIg1+DTx8kiZ/VqTZTBneoL0l65RcPe4W3ecw==", + "license": "MIT" + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -28750,22 +30860,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wonka": { "version": "4.0.15", "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", diff --git a/package.json b/package.json index db0cb0d981..b257ff5e31 100644 --- a/package.json +++ b/package.json @@ -16,29 +16,27 @@ "android": "expo run:android", "ios": "expo run:ios", "web": "expo start --web", - "test": "vitest --run", - "test:watch": "vitest", - "test:ui": "vitest --ui --coverage.enabled=true", - "test:coverage": "vitest --coverage", - "test:snapshots": "vitest -u", + "test": "jest", + "test:watch": "jest --watch", + "test:coverage": "jest --coverage --collectCoverageFrom=\"./src/**\"", + "test:snapshots": "jest -u", "lint": "eslint src/* app/*", "lint:fix": "npm run lint -- --fix", "storybook-generate": "sb-rn-get-stories", "generate:icons": "node ./scripts/generateIconTypes.js", "prepare": "husky" }, - "jest": { - "preset": "jest-expo" - }, "dependencies": { "@cowprotocol/app-data": "^2.3.0", - "@safe-global/safe-gateway-typescript-sdk": "^3.22.2", - "date-fns": "^4.1.0", "@expo/vector-icons": "^14.0.2", "@react-navigation/native": "^6.0.2", "@reduxjs/toolkit": "^2.2.8", + "@safe-global/safe-gateway-typescript-sdk": "^3.22.2", + "@tamagui/babel-plugin": "^1.116.9", "@tamagui/config": "^1.116.2", "@tamagui/font-dm-sans": "^1.116.2", + "@tamagui/vite-plugin": "^1.116.9", + "date-fns": "^4.1.0", "deepmerge": "^4.3.1", "expo": "~51.0.38", "expo-constants": "~16.0.2", @@ -79,10 +77,6 @@ "@types/eslint__js": "^8.42.3", "@types/jest": "^29.5.12", "@types/react": "~18.2.45", - "@types/react-test-renderer": "^18.0.7", - "@vitejs/plugin-react": "^4.3.2", - "@vitest/coverage-v8": "^2.1.2", - "@vitest/ui": "^2.1.2", "babel-loader": "^8.4.1", "detox": "^20.27.2", "eslint": "^9.12.0", @@ -96,11 +90,8 @@ "lint-staged": "^15.2.10", "prettier": "3.3.3", "react-native-svg": "15.2.0", - "react-test-renderer": "18.2.0", "typescript": "~5.3.3", - "typescript-eslint": "^8.8.1", - "vitest": "^2.1.2", - "vitest-react-native": "^0.1.5" + "typescript-eslint": "^8.8.1" }, "private": true } diff --git a/src/components/Button/Button.test.tsx b/src/components/Button/Button.test.tsx index 6652469efc..b22a61353b 100644 --- a/src/components/Button/Button.test.tsx +++ b/src/components/Button/Button.test.tsx @@ -1,14 +1,13 @@ -import { vi } from 'vitest' import { render, userEvent } from '@/src/tests/test-utils' import { SafeButton } from './Button' describe('Button', () => { beforeEach(() => { - vi.clearAllMocks() + jest.clearAllMocks() }) it('should render the default markup', () => { - const container = render() + const container = render() expect(container).toMatchSnapshot() }) @@ -16,7 +15,7 @@ describe('Button', () => { it('should be able to click', async () => { const user = userEvent.setup() - const mockedFn = vi.fn() + const mockedFn = jest.fn() const container = render() await user.press(container.getByText('sign')) diff --git a/src/components/Button/__snapshots__/Button.test.tsx.snap b/src/components/Button/__snapshots__/Button.test.tsx.snap index f2edad2a67..18ff53a8b9 100644 --- a/src/components/Button/__snapshots__/Button.test.tsx.snap +++ b/src/components/Button/__snapshots__/Button.test.tsx.snap @@ -1,74 +1,52 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +// Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Button > should render the default markup 1`] = ` - - - - - sign - - - - + sign + + `; diff --git a/src/components/Container/index.test.tsx b/src/components/Container/index.test.tsx new file mode 100644 index 0000000000..ee754622b2 --- /dev/null +++ b/src/components/Container/index.test.tsx @@ -0,0 +1,35 @@ +import React from 'react' +import { render } from '@testing-library/react-native' +import { Container } from './index' +import { Text } from 'react-native' + +describe('Container', () => { + it('renders correctly with children', () => { + const { getByText } = render( + + Test Child + , + ) + expect(getByText('Test Child')).toBeTruthy() + }) + + it('applies the correct styles', () => { + const { getByTestId } = render( + + Test Child + , + ) + const container = getByTestId('container') + expect(container.props.style).toMatchObject({ + borderBottomLeftRadius: 5, + borderBottomRightRadius: 5, + borderTopLeftRadius: 5, + borderTopRightRadius: 5, + flexDirection: 'column', + paddingBottom: 4, + paddingLeft: 16, + paddingRight: 16, + paddingTop: 4, + }) + }) +}) diff --git a/src/components/DataRow/index.test.tsx b/src/components/DataRow/index.test.tsx new file mode 100644 index 0000000000..77ceb7d3e4 --- /dev/null +++ b/src/components/DataRow/index.test.tsx @@ -0,0 +1,69 @@ +import React from 'react' +import { render } from '@testing-library/react-native' +import { DataRow } from './index' +import { Text } from 'react-native' + +describe('DataRow', () => { + it('renders correctly with children', () => { + const { getByText } = render( + + Test Child + , + ) + expect(getByText('Test Child')).toBeTruthy() + }) + + it('applies the correct styles', () => { + const { getByTestId } = render( + + Test Child + , + ) + const dataRow = getByTestId('data-row') + expect(dataRow.props.style).toMatchObject({ + justifyContent: 'space-between', + alignItems: 'center', + paddingTop: 8, + paddingRight: 8, + paddingBottom: 8, + paddingLeft: 8, + }) + }) +}) + +describe('DataRow.Label', () => { + it('renders correctly with children', () => { + const { getByText } = render(Label) + expect(getByText('Label')).toBeTruthy() + }) + + it('applies the correct styles', () => { + const { getByText } = render(Label) + const label = getByText('Label') + expect(label.props.style).toMatchObject({ + fontWeight: 'bold', + }) + }) +}) + +describe('DataRow.Value', () => { + it('renders correctly with children', () => { + const { getByText } = render(Value) + expect(getByText('Value')).toBeTruthy() + }) +}) + +describe('DataRow.Header', () => { + it('renders correctly with children', () => { + const { getByText } = render(Header Child) + expect(getByText('Header Child')).toBeTruthy() + }) + + it('applies the correct styles', () => { + const { getByText } = render(Header Child) + const header = getByText('Header Child') + expect(header.props.style).toMatchObject({ + fontWeight: '600', + }) + }) +}) diff --git a/src/components/DataRow/index.tsx b/src/components/DataRow/index.tsx index cde11e8556..724cb00aec 100644 --- a/src/components/DataRow/index.tsx +++ b/src/components/DataRow/index.tsx @@ -1,17 +1,18 @@ -import React, { ReactNode } from 'react' -import { XStack, Text, Theme } from 'tamagui' +import React from 'react' +import { XStack, Text, Theme, XStackProps } from 'tamagui' interface Props { - children: ReactNode + children: string } -export const DataRow: React.FC & { +export const DataRow: React.FC & { Label: React.FC Value: React.FC Header: React.FC -} = ({ children }: Props) => { +} = (props: XStackProps) => { + const { children, ...rest } = props return ( - + {children} ) diff --git a/src/config/constants.ts b/src/config/constants.ts index 456ced739e..a51698f5b9 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -3,5 +3,5 @@ import { Platform } from 'react-native' export const isProduction = process.env.NODE_ENV !== 'production' export const isAndroid = Platform.OS === 'android' -export const isTestingEnv = process.env.NODE_ENV === 'test' || process.env.VITEST +export const isTestingEnv = process.env.NODE_ENV === 'test' export const isStorybookEnv = Constants?.expoConfig?.extra?.storybookEnabled === 'true' diff --git a/src/tests/jest.setup.ts b/src/tests/jest.setup.ts new file mode 100644 index 0000000000..9ddffaf167 --- /dev/null +++ b/src/tests/jest.setup.ts @@ -0,0 +1,33 @@ +import '@testing-library/react-native/extend-expect' + +jest.useFakeTimers() + +/** + * This mock is necessary because useFonts is async and we get an error + * Warning: An update to FontProvider inside a test was not wrapped in act(...) + */ +jest.mock('expo-font', () => ({ + useFonts: () => [true], +})) + +jest.mock('react-native-mmkv', () => ({ + MMKV: function () { + // @ts-ignore + this.getString = jest.fn() + // @ts-ignore + this.delete = jest.fn() + // @ts-ignore + this.set = jest.fn() + }, +})) + +jest.mock('redux-persist', () => { + const real = jest.requireActual('redux-persist') + return { + ...real, + persistReducer: jest.fn().mockImplementation((config, reducers) => reducers), + } +}) +jest.mock('redux-devtools-expo-dev-plugin', () => ({ + default: () => jest.fn(), +})) diff --git a/src/tests/test-utils.tsx b/src/tests/test-utils.tsx index ac276526b5..7825439956 100644 --- a/src/tests/test-utils.tsx +++ b/src/tests/test-utils.tsx @@ -1,4 +1,4 @@ -import { render, renderHook } from '@testing-library/react-native' +import { render as nativeRender, renderHook } from '@testing-library/react-native' import SafeThemeProvider from '../providers/SafeThemeProvider' import { Provider } from 'react-redux' import { makeStore } from '../store' @@ -17,7 +17,7 @@ const getProviders: () => React.FC<{ children: React.ReactElement }> = () => const customRender = (ui: React.ReactElement) => { const wrapper = getProviders() - return render(ui, { wrapper }) + return nativeRender(ui, { wrapper }) } function customRenderHook(render: (initialProps: Props) => Result) { diff --git a/src/tests/vitest.setup.mjs b/src/tests/vitest.setup.mjs deleted file mode 100644 index fd127b0274..0000000000 --- a/src/tests/vitest.setup.mjs +++ /dev/null @@ -1,15 +0,0 @@ -import { vi } from 'vitest' - -globalThis.expo = {} - -vi.mock('react-native-mmkv', () => ({ - MMKV: function () { - this.getString = vi.fn() - this.delete = vi.fn() - this.set = vi.fn() - }, -})) - -vi.mock('redux-devtools-expo-dev-plugin', () => ({ - default: () => vi.fn(), -})) diff --git a/src/utils/date.test.ts b/src/utils/date.test.ts index b689615c18..67c6c7b728 100644 --- a/src/utils/date.test.ts +++ b/src/utils/date.test.ts @@ -1,11 +1,10 @@ -import { vi } from 'vitest' import { currentMinutes, formatDateTime, formatTime, getCountdown, getPeriod } from './date' const MOCKED_TIMESTAMP = 1729506116962 describe('Date utils', () => { beforeAll(() => { - vi.spyOn(Date, 'now').mockImplementation(() => MOCKED_TIMESTAMP) + jest.spyOn(Date, 'now').mockImplementation(() => MOCKED_TIMESTAMP) }) it('should show the date in minutes', () => { @@ -20,7 +19,7 @@ describe('Date utils', () => { expect(formatDateTime(MOCKED_TIMESTAMP)).toBe('Oct 21, 2024 - 12:21:56 PM') }) - it('shuold return a countdown object', () => { + it('should return a countdown object', () => { expect(getCountdown(20000)).toStrictEqual({ days: 0, hours: 5, @@ -28,15 +27,15 @@ describe('Date utils', () => { }) }) - it('shuold get the time period in hours from seconds', () => { + it('should get the time period in hours from seconds', () => { expect(getPeriod(20000)).toBe('5 hours') }) - it('shuold get the time period in minutes from seconds', () => { + it('should get the time period in minutes from seconds', () => { expect(getPeriod(2000)).toBe('33 minutes') }) - it('shuold get the time period in days from seconds', () => { + it('should get the time period in days from seconds', () => { expect(getPeriod(2000000)).toBe('23 days') }) }) diff --git a/tsconfig.json b/tsconfig.json index 909e901086..b859236b85 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,8 @@ "@/*": [ "./*" ] - } + }, + "types": ["jest"] }, "include": [ "**/*.ts", diff --git a/vitest.config.mjs b/vitest.config.mjs deleted file mode 100644 index 6029771a95..0000000000 --- a/vitest.config.mjs +++ /dev/null @@ -1,33 +0,0 @@ -// vitest.config.mjs -import reactNative from 'vitest-react-native' -// this is needed for react jsx support -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vitest/config' -import path from 'node:path' - -export default defineConfig({ - plugins: [reactNative(), react()], - test: { - reporters: ['default', 'html'], - globals: true, - server: { - deps: { - inline: ['redux', '@reduxjs/toolkit', 'redux-devtools-expo-dev-plugin'], - }, - }, - coverage: { - include: ['src'], - exclude: ['src/**/*.stories.tsx', 'src/tests/*', 'src/types'], - enabled: true, - reporter: ['json', 'html'], - }, - setupFiles: ['src/tests/vitest.setup.mjs'], - exclude: ['node_modules', './e2e'], - }, - resolve: { - alias: { - // eslint-disable-next-line no-undef - '@/src': path.resolve(__dirname, 'src'), - }, - }, -}) From 9c9072c0c4aaa22f3b25e14adfec5812dc68e0e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=B3vis=20Neto?= Date: Tue, 5 Nov 2024 16:16:55 +0100 Subject: [PATCH 06/49] feat: Create Tx history page (#14) * feat: create tx-history list components * feat: use the new cards components in the TxHistory list * fix: remove todo * feat: add missing variants to tx history page * feat: add missing multiSendCall information in the txList * feat: create static transactions messages layout * fix: android crash * feat: add detox test for transactions * fix: add the right name in the bulk transactions section * fix: scroll margin in the txHistory component * fix: story book of the TxCards components * fix: unit tests * fix: detox tests * fix: remove unnecessary comment * fix: remove swap order comment * fix: tx history in light mode * fix: use snapshot tests instead of inline object comparison * fix: remove TODO comments * chore: rename tx cards --------- Co-authored-by: Daniel Dimitrov --- app/(tabs)/_layout.tsx | 2 + app/(tabs)/index.tsx | 36 +++--- app/(tabs)/transactions.tsx | 31 ----- app/(tabs)/transactions/_layout.tsx | 56 +++++++++ app/(tabs)/transactions/index.tsx | 5 + app/(tabs)/transactions/messages.tsx | 28 +++++ app/+not-found.tsx | 1 - e2e/starter.test.js | 22 ++-- e2e/transactions.test.js | 16 +++ .../__snapshots__/index.test.tsx.snap | 15 +++ src/components/Container/index.test.tsx | 12 +- src/components/Container/index.tsx | 30 +++-- src/components/InlineTab/index.tsx | 34 ++++++ src/components/InlineTab/styles.ts | 35 ++++++ src/components/SafeListItem/index.tsx | 67 +++++++++++ src/components/Title/index.tsx | 8 ++ src/components/TxInfo/index.tsx | 69 +++++++++++ src/components/TxName/index.tsx | 26 ----- .../Card/TxBatchCard/TxBatchCard.stories.tsx | 35 ++++++ .../Card/TxBatchCard/index.tsx | 37 ++++++ .../TxContractInteractionCard.stories.tsx | 34 ++++++ .../Card/TxContractInteractionCard/index.tsx | 39 +++++++ .../TxCreationCard/TxCreationCard.stories.tsx | 34 ++++++ .../Card/TxCreationCard/index.tsx | 30 +++++ .../TxGroupedCard/TxGroupedCard.stories.tsx | 40 +++++++ .../Card/TxGroupedCard/index.tsx | 56 +++++++++ .../TxRejectionCard.stories.tsx | 27 +++++ .../Card/TxRejectionCard/index.tsx | 27 +++++ .../TxSafeAppCard/TxSafeAppCard.stories.tsx | 32 ++++++ .../Card/TxSafeAppCard/index.tsx | 35 ++++++ .../TxSettingsCard/TxSettingCard.stories.tsx | 21 ++++ .../Card/TxSettingsCard/index.tsx | 32 ++++++ .../Card/TxSwapCard/TxSwapCard.stories.tsx | 18 +++ .../Card/TxSwapCard/index.tsx | 60 ++++++++++ .../Card/TxTokenCard/TxTokenCard.stories.tsx | 36 ++++++ .../Card/TxTokenCard/index.tsx | 107 ++++++++++++++++++ src/config/constants.ts | 3 + src/features/TxHistory/TxHistoryList.tsx | 35 ++++-- src/features/TxHistory/utils.tsx | 86 ++++++++++++++ src/hooks/useTransactionType/index.tsx | 34 +++++- ...pe.test.ts => useTransactionType.test.tsx} | 22 ++-- src/store/gateway.ts | 11 +- src/tests/mocks.ts | 58 ++++++++-- src/theme/emotion.d.ts | 6 - src/theme/palettes/darkPalette.ts | 2 +- src/theme/palettes/lightPalette.ts | 2 +- src/theme/tamagui.config.ts | 19 ++++ src/utils/formatters.ts | 15 +++ src/utils/transaction-guards.ts | 41 +++++++ 49 files changed, 1380 insertions(+), 147 deletions(-) delete mode 100644 app/(tabs)/transactions.tsx create mode 100644 app/(tabs)/transactions/_layout.tsx create mode 100644 app/(tabs)/transactions/index.tsx create mode 100644 app/(tabs)/transactions/messages.tsx create mode 100644 e2e/transactions.test.js create mode 100644 src/components/Container/__snapshots__/index.test.tsx.snap create mode 100644 src/components/InlineTab/index.tsx create mode 100644 src/components/InlineTab/styles.ts create mode 100644 src/components/SafeListItem/index.tsx create mode 100644 src/components/Title/index.tsx create mode 100644 src/components/TxInfo/index.tsx delete mode 100644 src/components/TxName/index.tsx create mode 100644 src/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxBatchCard/index.tsx create mode 100644 src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxContractInteractionCard/index.tsx create mode 100644 src/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxCreationCard/index.tsx create mode 100644 src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxGroupedCard/index.tsx create mode 100644 src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxRejectionCard/index.tsx create mode 100644 src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxSafeAppCard/index.tsx create mode 100644 src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxSettingsCard/index.tsx create mode 100644 src/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxSwapCard/index.tsx create mode 100644 src/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx create mode 100644 src/components/transactions-list/Card/TxTokenCard/index.tsx create mode 100644 src/features/TxHistory/utils.tsx rename src/hooks/useTransactionType/{useTransactionType.test.ts => useTransactionType.test.tsx} (85%) delete mode 100644 src/theme/emotion.d.ts create mode 100644 src/utils/formatters.ts diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index ff867c9cd4..afb96ad14e 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -18,10 +18,12 @@ export default function TabLayout() { tabBarIcon: ({ color }) => , }} /> + , }} /> diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index 29d67057c1..cd01b4727a 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -1,27 +1,31 @@ -import { StyleSheet } from 'react-native' - -import TxHistory from '@/src/features/TxHistory' +import Ionicons from '@expo/vector-icons/Ionicons' +import { StyleSheet, View } from 'react-native' +import ParallaxScrollView from '@/src/components/ParallaxScrollView' import { Text } from 'tamagui' -import { SafeAreaView } from 'react-native-safe-area-context' export default function HomeScreen() { return ( - - - Transactions History - - - - + } + > + + HomeScreen + + ) } const styles = StyleSheet.create({ - content: { - flex: 1, - flexDirection: 'column', - width: '100%', - rowGap: 20, + headerImage: { + color: '#808080', + bottom: -90, + left: -35, + position: 'absolute', + }, + titleContainer: { + flexDirection: 'row', + gap: 8, }, }) diff --git a/app/(tabs)/transactions.tsx b/app/(tabs)/transactions.tsx deleted file mode 100644 index 348c50a27d..0000000000 --- a/app/(tabs)/transactions.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import Ionicons from '@expo/vector-icons/Ionicons' -import { StyleSheet, View } from 'react-native' - -import ParallaxScrollView from '@/src/components/ParallaxScrollView' -import { Text } from 'tamagui' - -export default function TransactionsScreen() { - return ( - } - > - - Transactions - - - ) -} - -const styles = StyleSheet.create({ - headerImage: { - color: '#808080', - bottom: -90, - left: -35, - position: 'absolute', - }, - titleContainer: { - flexDirection: 'row', - gap: 8, - }, -}) diff --git a/app/(tabs)/transactions/_layout.tsx b/app/(tabs)/transactions/_layout.tsx new file mode 100644 index 0000000000..d67db282df --- /dev/null +++ b/app/(tabs)/transactions/_layout.tsx @@ -0,0 +1,56 @@ +import { Tabs } from 'expo-router' +import React from 'react' +import { StyleSheet } from 'react-native' +import { SafeAreaView } from 'react-native-safe-area-context' +import Title from '@/src/components/Title' +import InlineTab from '@/src/components/InlineTab' +import { View } from 'tamagui' + +const TransactiosHeader = () => ( + + + Transactions + + + + +) + +export default function TransactionsLayout() { + return ( + + + + + + + + + ) +} + +export const styles = StyleSheet.create({ + content: { + flex: 1, + flexDirection: 'column', + width: '100%', + rowGap: 10, + }, +}) diff --git a/app/(tabs)/transactions/index.tsx b/app/(tabs)/transactions/index.tsx new file mode 100644 index 0000000000..56d5d350bc --- /dev/null +++ b/app/(tabs)/transactions/index.tsx @@ -0,0 +1,5 @@ +import TxHistory from '@/src/features/TxHistory' + +export default function TransactionsScreen() { + return +} diff --git a/app/(tabs)/transactions/messages.tsx b/app/(tabs)/transactions/messages.tsx new file mode 100644 index 0000000000..e8f53ce9d9 --- /dev/null +++ b/app/(tabs)/transactions/messages.tsx @@ -0,0 +1,28 @@ +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import SafeListItem from '@/src/components/SafeListItem' +import { formatWithSchema } from '@/src/utils/date' +import React from 'react' +import { Text, View } from 'tamagui' + +function Messages() { + return ( + + + + + + } + rightNode={ + + Success + + } + /> + + ) +} + +export default Messages diff --git a/app/+not-found.tsx b/app/+not-found.tsx index 505b8f499a..12fcba850b 100644 --- a/app/+not-found.tsx +++ b/app/+not-found.tsx @@ -22,7 +22,6 @@ const styles = StyleSheet.create({ flex: 1, alignItems: 'center', justifyContent: 'center', - padding: 20, }, link: { marginTop: 15, diff --git a/e2e/starter.test.js b/e2e/starter.test.js index b88e20c50b..2ebda5266e 100644 --- a/e2e/starter.test.js +++ b/e2e/starter.test.js @@ -1,18 +1,18 @@ -describe('Example', () => { +describe('Welcome', () => { beforeAll(async () => { - await device.launchApp(); - }); + await device.launchApp() + }) beforeEach(async () => { - await device.reloadReactNative(); - }); + await device.reloadReactNative() + }) it('should have welcome screen', async () => { - await expect(element(by.id('welcome-title'))).toBeVisible(); - }); + await expect(element(by.id('welcome-title'))).toBeVisible() + }) it('should show hello screen after tap', async () => { - await element(by.text('Explore')).tap(); - await expect(element(by.id('explore-title'))).toBeVisible(); - }); -}); + await element(by.text('Explore')).tap() + await expect(element(by.id('explore-title'))).toBeVisible() + }) +}) diff --git a/e2e/transactions.test.js b/e2e/transactions.test.js new file mode 100644 index 0000000000..96d3c86672 --- /dev/null +++ b/e2e/transactions.test.js @@ -0,0 +1,16 @@ +describe('Transactions', () => { + beforeAll(async () => { + await device.launchApp() + }) + + beforeEach(async () => { + await device.reloadReactNative() + }) + + it('should navigate to transactions and be able to scroll', async () => { + await element(by.id('transactions')).tap() + await expect(element(by.text('History'))).toBeVisible() + await element(by.id('tx-history-list')).scroll(500, 'down') + await element(by.id('tx-history-list')).scroll(500, 'up') + }) +}) diff --git a/src/components/Container/__snapshots__/index.test.tsx.snap b/src/components/Container/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000000..d7ea5a52a2 --- /dev/null +++ b/src/components/Container/__snapshots__/index.test.tsx.snap @@ -0,0 +1,15 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Container applies the correct styles 1`] = ` +{ + "borderBottomLeftRadius": 7, + "borderBottomRightRadius": 7, + "borderTopLeftRadius": 7, + "borderTopRightRadius": 7, + "flexDirection": "column", + "paddingBottom": 16, + "paddingLeft": 16, + "paddingRight": 16, + "paddingTop": 16, +} +`; diff --git a/src/components/Container/index.test.tsx b/src/components/Container/index.test.tsx index ee754622b2..79d043b813 100644 --- a/src/components/Container/index.test.tsx +++ b/src/components/Container/index.test.tsx @@ -20,16 +20,6 @@ describe('Container', () => { , ) const container = getByTestId('container') - expect(container.props.style).toMatchObject({ - borderBottomLeftRadius: 5, - borderBottomRightRadius: 5, - borderTopLeftRadius: 5, - borderTopRightRadius: 5, - flexDirection: 'column', - paddingBottom: 4, - paddingLeft: 16, - paddingRight: 16, - paddingTop: 4, - }) + expect(container.props.style).toMatchSnapshot() }) }) diff --git a/src/components/Container/index.tsx b/src/components/Container/index.tsx index 29c6ed4ed8..cc92fec43e 100644 --- a/src/components/Container/index.tsx +++ b/src/components/Container/index.tsx @@ -1,18 +1,26 @@ -import { Theme, YStack, YStackProps } from 'tamagui' +import { styled, Theme, YStack, YStackProps } from 'tamagui' -export const Container = (props: YStackProps) => { - const { children, ...rest } = props +const StyledYStack = styled(YStack, { + variants: { + bordered: { + true: { + borderColor: '#303033', + borderWidth: 1, + }, + false: { + backgroundColor: '$background', + }, + }, + } as const, +}) + +export const Container = (props: YStackProps & { bordered?: boolean }) => { + const { children, bordered, ...rest } = props return ( - + {children} - + ) } diff --git a/src/components/InlineTab/index.tsx b/src/components/InlineTab/index.tsx new file mode 100644 index 0000000000..ab1eedd4be --- /dev/null +++ b/src/components/InlineTab/index.tsx @@ -0,0 +1,34 @@ +import { Href, router, usePathname } from 'expo-router' +import React from 'react' +import { StyledTransactionsTabs, StyledTransactionTabItem, StyledTransactionTabText } from './styles' + +interface InlineTabProps { + items: { + path: Href + label: string + }[] +} + +function InlineTab({ items }: InlineTabProps) { + const path = usePathname() + + const onTabItemClick = (screenPath: Href) => () => { + router.replace(screenPath) + } + + return ( + + {items.map((item) => ( + + {item.label} + + ))} + + ) +} + +export default InlineTab diff --git a/src/components/InlineTab/styles.ts b/src/components/InlineTab/styles.ts new file mode 100644 index 0000000000..055e766e6f --- /dev/null +++ b/src/components/InlineTab/styles.ts @@ -0,0 +1,35 @@ +import { styled, Text, View } from 'tamagui' + +export const StyledTransactionsTabs = styled(View, { + flexDirection: 'row', + gap: 24, +}) + +export const StyledTransactionTabItem = styled(View, { + paddingBottom: 10, + variants: { + selected: { + true: { + borderBottomColor: '$primary', + borderBottomWidth: 3, + }, + }, + }, +}) + +export const StyledTransactionTabText = styled(Text, { + variants: { + selected: { + true: { + color: '$primary', + fontWeight: 600, + fontSize: '$5', + }, + false: { + color: '$primaryLight', + fontWeight: 600, + fontSize: '$5', + }, + }, + } as const, +}) diff --git a/src/components/SafeListItem/index.tsx b/src/components/SafeListItem/index.tsx new file mode 100644 index 0000000000..d5985d435f --- /dev/null +++ b/src/components/SafeListItem/index.tsx @@ -0,0 +1,67 @@ +import React from 'react' +import { Container } from '../Container' +import { Text, Theme, View } from 'tamagui' +import { IconProps, SafeFontIcon } from '../SafeFontIcon/SafeFontIcon' +import { ellipsis } from '@/src/utils/formatters' + +interface SafeListItemProps { + type?: string + label: string + icon?: IconProps['name'] + children?: React.ReactNode + rightNode?: React.ReactNode + leftNode?: React.ReactNode + bordered?: boolean +} + +function SafeListItem({ type, leftNode, icon, bordered, label, rightNode, children }: SafeListItemProps) { + return ( + + + {leftNode} + + + {type && ( + + {icon && ( + + + + )} + {type} + + )} + + + {ellipsis(label, rightNode ? 23 : 30)} + + + + + {rightNode} + + {children} + + ) +} + +SafeListItem.Header = function Header({ title }: { title: string }) { + return ( + + + + {title} + + + + ) +} + +export default SafeListItem diff --git a/src/components/Title/index.tsx b/src/components/Title/index.tsx new file mode 100644 index 0000000000..7b16344b87 --- /dev/null +++ b/src/components/Title/index.tsx @@ -0,0 +1,8 @@ +import { SizableText, styled } from 'tamagui' + +const Title = styled(SizableText, { + fontSize: '$9', + fontWeight: 600, +}) + +export default Title diff --git a/src/components/TxInfo/index.tsx b/src/components/TxInfo/index.tsx new file mode 100644 index 0000000000..22c79939d7 --- /dev/null +++ b/src/components/TxInfo/index.tsx @@ -0,0 +1,69 @@ +import React from 'react' +import { TransactionInfoType, TransactionSummary } from '@safe-global/safe-gateway-typescript-sdk' + +import { useTransactionType } from '@/src/hooks/useTransactionType' +import TxTokenCard from '@/src/components/transactions-list/Card/TxTokenCard' +import TxSettingsCard from '@/src/components/transactions-list/Card/TxSettingsCard' +import { + isCancellationTxInfo, + isCreationTxInfo, + isMultiSendTxInfo, + isOrderTxInfo, + isSettingsChangeTxInfo, + isSwapOrderTxInfo, + isTransferTxInfo, +} from '@/src/utils/transaction-guards' +import TxBatchCard from '@/src/components/transactions-list/Card/TxBatchCard' +import TxSafeAppCard from '@/src/components/transactions-list/Card/TxSafeAppCard' +import TxCreationCard from '@/src/components/transactions-list/Card/TxCreationCard' +import TxRejectionCard from '@/src/components/transactions-list/Card/TxRejectionCard' +import TxContractInteractionCard from '@/src/components/transactions-list/Card/TxContractInteractionCard' +import TxSwapCard from '@/src/components/transactions-list/Card/TxSwapCard' + +interface TxInfoProps { + tx: TransactionSummary + bordered?: boolean +} + +function TxInfo({ tx, bordered }: TxInfoProps) { + const txType = useTransactionType(tx) + + const txInfo = tx.txInfo + if (isTransferTxInfo(txInfo)) { + return + } + + if (isSettingsChangeTxInfo(txInfo)) { + return + } + + if (isMultiSendTxInfo(txInfo) && tx.txInfo.type === TransactionInfoType.CUSTOM) { + return + } + + if (isMultiSendTxInfo(txInfo) && tx.safeAppInfo) { + return + } + + if (isCreationTxInfo(txInfo)) { + return + } + + if (isCancellationTxInfo(txInfo)) { + return + } + + if (!isOrderTxInfo(txInfo)) { + return + } + + if (isSwapOrderTxInfo(txInfo)) { + return + } + + return <> +} + +export default React.memo(TxInfo, (prevProps, nextProps) => { + return prevProps.tx.txHash === nextProps.tx.txHash +}) diff --git a/src/components/TxName/index.tsx b/src/components/TxName/index.tsx deleted file mode 100644 index 4f6971660c..0000000000 --- a/src/components/TxName/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react' -import { Text } from 'tamagui' -import { TransactionSummary } from '@safe-global/safe-gateway-typescript-sdk' - -import { useTransactionType } from '@/src/hooks/useTransactionType' -import { formatDateTime } from '@/src/utils/date' -import { Container } from '@/src/components/Container' - -interface TxNameProps { - tx: TransactionSummary -} - -function TxName({ tx }: TxNameProps) { - const txType = useTransactionType(tx) - - return ( - - {txType.text} - - {formatDateTime(tx.timestamp)} - {tx.txStatus} - - - ) -} - -export default TxName diff --git a/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx b/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx new file mode 100644 index 0000000000..7c04b1eb94 --- /dev/null +++ b/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx @@ -0,0 +1,35 @@ +import type { Meta, StoryObj } from '@storybook/react' +import TxBatchCard from '@/src/components/transactions-list/Card/TxBatchCard' +import { mockTransferWithInfo } from '@/src/tests/mocks' +import { MultiSend, TransactionInfoType } from '@safe-global/safe-gateway-typescript-sdk' + +const meta: Meta = { + title: 'TransactionsList/TxBatchCard', + component: TxBatchCard, + argTypes: { + bordered: { + description: 'Define if you want a border on the transaction', + control: { + type: 'boolean', + }, + }, + }, + args: { + bordered: false, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.CUSTOM, + actionCount: 2, + to: { + value: '', + logoUri: 'https://safe-transaction-assets.safe.global/safe_apps/408a90a2-170c-485a-93bb-daa843298f11/icon.png', + name: 'Gnosis Bridge', + }, + }) as MultiSend, + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/transactions-list/Card/TxBatchCard/index.tsx b/src/components/transactions-list/Card/TxBatchCard/index.tsx new file mode 100644 index 0000000000..7deb1cf5eb --- /dev/null +++ b/src/components/transactions-list/Card/TxBatchCard/index.tsx @@ -0,0 +1,37 @@ +import React from 'react' +import { Avatar, View } from 'tamagui' +import TxListItem from '@/src/components/SafeListItem' +import { MultiSend } from '@safe-global/safe-gateway-typescript-sdk' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' + +interface TxBatchCardProps { + txInfo: MultiSend + bordered?: boolean + label?: string +} + +function TxBatchCard({ txInfo, bordered, label }: TxBatchCardProps) { + const logoUri = txInfo.to.logoUri + + return ( + + {logoUri && } + + + + + + + + } + /> + ) +} + +export default TxBatchCard diff --git a/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx b/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx new file mode 100644 index 0000000000..c608194d0e --- /dev/null +++ b/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx @@ -0,0 +1,34 @@ +import type { Meta, StoryObj } from '@storybook/react' +import TxContractInteractionCard from '@/src/components/transactions-list/Card/TxContractInteractionCard' +import { mockTransferWithInfo } from '@/src/tests/mocks' +import { Custom, TransactionInfoType } from '@safe-global/safe-gateway-typescript-sdk' + +const meta: Meta = { + title: 'TransactionsList/TxContractInteractionCard', + component: TxContractInteractionCard, + argTypes: { + bordered: { + description: 'Define if you want a border on the transaction', + control: { + type: 'boolean', + }, + }, + }, + args: { + bordered: false, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.CUSTOM, + to: { + value: '0x0000', + name: 'CryptoNevinhosos', + logoUri: '', + }, + }) as Custom, + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/transactions-list/Card/TxContractInteractionCard/index.tsx b/src/components/transactions-list/Card/TxContractInteractionCard/index.tsx new file mode 100644 index 0000000000..c821dfd776 --- /dev/null +++ b/src/components/transactions-list/Card/TxContractInteractionCard/index.tsx @@ -0,0 +1,39 @@ +import React from 'react' +import { Avatar, Text, Theme, View } from 'tamagui' +import SafeListItem from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { Custom, MultiSend } from '@safe-global/safe-gateway-typescript-sdk' + +interface TxContractInteractionCardProps { + bordered?: boolean + txInfo: Custom | MultiSend +} + +function TxContractInteractionCard({ bordered, txInfo }: TxContractInteractionCardProps) { + const logoUri = txInfo.to.logoUri + const label = txInfo.to.name || 'Contract interaction' + return ( + + + {logoUri && } + + + + + + + + + } + rightNode={{txInfo.methodName}} + /> + ) +} + +export default TxContractInteractionCard diff --git a/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx b/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx new file mode 100644 index 0000000000..9000afa177 --- /dev/null +++ b/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx @@ -0,0 +1,34 @@ +import type { Meta, StoryObj } from '@storybook/react' +import TxCreationCard from '@/src/components/transactions-list/Card/TxCreationCard' +import { mockTransferWithInfo } from '@/src/tests/mocks' +import { Creation, TransactionInfoType } from '@safe-global/safe-gateway-typescript-sdk' + +const meta: Meta = { + title: 'TransactionsList/TxCreationCard', + component: TxCreationCard, + argTypes: { + bordered: { + description: 'Define if you want a border on the transaction', + control: { + type: 'boolean', + }, + }, + }, + args: { + bordered: false, + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.CREATION, + creator: { + name: 'Nevinha', + logoUri: '', + value: '0xas123da123sdasdsd001230sdf1sdf12sd12f', + }, + }) as Creation, + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/transactions-list/Card/TxCreationCard/index.tsx b/src/components/transactions-list/Card/TxCreationCard/index.tsx new file mode 100644 index 0000000000..2dfde0f024 --- /dev/null +++ b/src/components/transactions-list/Card/TxCreationCard/index.tsx @@ -0,0 +1,30 @@ +import React from 'react' +import { Theme, View } from 'tamagui' +import TxListItem from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { Creation } from '@safe-global/safe-gateway-typescript-sdk' +import { shortenAddress } from '@/src/utils/formatters' + +interface TxCreationCardProps { + txInfo: Creation + bordered?: boolean +} + +function TxCreationCard({ txInfo, bordered }: TxCreationCardProps) { + return ( + + + + + + } + /> + ) +} + +export default TxCreationCard diff --git a/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx b/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx new file mode 100644 index 0000000000..2d35276090 --- /dev/null +++ b/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx @@ -0,0 +1,40 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { mockERC20Transfer, mockListItemByType, mockNFTTransfer } from '@/src/tests/mocks' +import { Transaction, TransactionListItemType, TransactionStatus } from '@safe-global/safe-gateway-typescript-sdk' +import TxGroupedCard from '.' + +const meta: Meta = { + title: 'TransactionsList/TxGroupedCard', + component: TxGroupedCard, + argTypes: {}, + args: { + transactions: [ + { + ...mockListItemByType(TransactionListItemType.TRANSACTION), + transaction: { + id: 'id', + timestamp: 123123, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockERC20Transfer, + txHash: '0x0000000', + }, + } as Transaction, + { + ...mockListItemByType(TransactionListItemType.TRANSACTION), + transaction: { + id: 'id', + timestamp: 123123, + txStatus: TransactionStatus.SUCCESS, + txInfo: mockNFTTransfer, + txHash: '0x0000000', + }, + } as Transaction, + ], + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/transactions-list/Card/TxGroupedCard/index.tsx b/src/components/transactions-list/Card/TxGroupedCard/index.tsx new file mode 100644 index 0000000000..274f7df3b3 --- /dev/null +++ b/src/components/transactions-list/Card/TxGroupedCard/index.tsx @@ -0,0 +1,56 @@ +import React from 'react' +import { Theme, View } from 'tamagui' +import TxListItem from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import TxInfo from '@/src/components/TxInfo' +import { Order, Transaction } from '@safe-global/safe-gateway-typescript-sdk' +import { getOrderClass } from '@/src/hooks/useTransactionType' +import { isSwapTransferOrderTxInfo } from '@/src/utils/transaction-guards' + +interface TxGroupedCard { + transactions: Transaction[] +} + +const orderClassTitles: Record = { + limit: 'Limit order settlement', + twap: 'TWAP order settlement', + liquidity: 'Liquidity order settlement', + market: 'Swap order settlement', +} + +const getSettlementOrderTitle = (order: Order): string => { + const orderClass = getOrderClass(order) + return orderClassTitles[orderClass] || orderClassTitles['market'] +} + +function TxGroupedCard({ transactions }: TxGroupedCard) { + const firstTxInfo = transactions[0].transaction.txInfo + const isSwapTransfer = isSwapTransferOrderTxInfo(firstTxInfo) + const label = isSwapTransfer ? getSettlementOrderTitle(firstTxInfo) : 'Bulk transactions' + + return ( + + + + + + } + rightNode={} + > + + {transactions.map((item, index) => ( + + + + ))} + + + ) +} + +export default React.memo(TxGroupedCard, (prevProps, nextProps) => { + return prevProps.transactions.length === nextProps.transactions.length +}) diff --git a/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx b/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx new file mode 100644 index 0000000000..904be85a09 --- /dev/null +++ b/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx @@ -0,0 +1,27 @@ +import type { Meta, StoryObj } from '@storybook/react' +import TxRejectionCard from '@/src/components/transactions-list/Card/TxRejectionCard' +import { mockTransferWithInfo } from '@/src/tests/mocks' +import { Cancellation } from '@safe-global/safe-gateway-typescript-sdk' + +const meta: Meta = { + title: 'TransactionsList/TxRejectionCard', + component: TxRejectionCard, + argTypes: { + bordered: { + description: 'Define if you want a border on the transaction', + control: { + type: 'boolean', + }, + }, + }, + args: { + bordered: false, + txInfo: mockTransferWithInfo({}) as Cancellation, + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/transactions-list/Card/TxRejectionCard/index.tsx b/src/components/transactions-list/Card/TxRejectionCard/index.tsx new file mode 100644 index 0000000000..dffbdc4f9c --- /dev/null +++ b/src/components/transactions-list/Card/TxRejectionCard/index.tsx @@ -0,0 +1,27 @@ +import React from 'react' +import { View } from 'tamagui' +import SafeListItem from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { Cancellation } from '@safe-global/safe-gateway-typescript-sdk' + +interface TxRejectionCardProps { + bordered?: boolean + txInfo: Cancellation +} + +function TxRejectionCard({ bordered, txInfo }: TxRejectionCardProps) { + return ( + + + + } + /> + ) +} + +export default TxRejectionCard diff --git a/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx b/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx new file mode 100644 index 0000000000..ef0ed7f4e8 --- /dev/null +++ b/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx @@ -0,0 +1,32 @@ +import type { Meta, StoryObj } from '@storybook/react' +import TxSafeAppCard from '@/src/components/transactions-list/Card/TxSafeAppCard' +import { mockTransferWithInfo } from '@/src/tests/mocks' +import { MultiSend } from '@safe-global/safe-gateway-typescript-sdk' + +const meta: Meta = { + title: 'TransactionsList/TxSafeAppCard', + component: TxSafeAppCard, + argTypes: { + bordered: { + description: 'Define if you want a border on the transaction', + control: { + type: 'boolean', + }, + }, + }, + args: { + bordered: false, + safeAppInfo: { + name: 'Transaction Builder', + url: 'http://something.com', + logoUri: 'https://safe-transaction-assets.safe.global/safe_apps/29/icon.png', + }, + txInfo: mockTransferWithInfo({}) as MultiSend, + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/transactions-list/Card/TxSafeAppCard/index.tsx b/src/components/transactions-list/Card/TxSafeAppCard/index.tsx new file mode 100644 index 0000000000..4672bdd257 --- /dev/null +++ b/src/components/transactions-list/Card/TxSafeAppCard/index.tsx @@ -0,0 +1,35 @@ +import React from 'react' +import { Avatar, Text, View } from 'tamagui' +import TxListItem from '@/src/components/SafeListItem' +import { MultiSend, SafeAppInfo } from '@safe-global/safe-gateway-typescript-sdk' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' + +interface TxSafeAppCardProps { + safeAppInfo: SafeAppInfo + txInfo: MultiSend + bordered?: boolean +} + +function TxSafeAppCard({ safeAppInfo, txInfo, bordered }: TxSafeAppCardProps) { + return ( + + + + + + + + + } + rightNode={{txInfo.methodName}} + /> + ) +} + +export default TxSafeAppCard diff --git a/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx b/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx new file mode 100644 index 0000000000..720d65ba17 --- /dev/null +++ b/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx @@ -0,0 +1,21 @@ +import type { Meta, StoryObj } from '@storybook/react' +import TxSettingsCard from '@/src/components/transactions-list/Card/TxSettingsCard' +import { mockTransferWithInfo } from '@/src/tests/mocks' +import { SettingsChange, TransactionInfoType } from '@safe-global/safe-gateway-typescript-sdk' + +const meta: Meta = { + title: 'TransactionsList/TxSettingsCard', + component: TxSettingsCard, + argTypes: {}, + args: { + txInfo: mockTransferWithInfo({ + type: TransactionInfoType.SETTINGS_CHANGE, + }) as SettingsChange, + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/transactions-list/Card/TxSettingsCard/index.tsx b/src/components/transactions-list/Card/TxSettingsCard/index.tsx new file mode 100644 index 0000000000..c7563ac1a6 --- /dev/null +++ b/src/components/transactions-list/Card/TxSettingsCard/index.tsx @@ -0,0 +1,32 @@ +import React from 'react' +import { Theme, View } from 'tamagui' +import TxListItem from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { SettingsChange, SettingsInfoType } from '@safe-global/safe-gateway-typescript-sdk' + +interface TxSettingsCardProps { + txInfo: SettingsChange + bordered?: boolean +} + +function TxSettingsCard({ txInfo, bordered }: TxSettingsCardProps) { + const isDeleteGuard = txInfo.settingsInfo?.type === SettingsInfoType.DELETE_GUARD + const label = isDeleteGuard ? 'deleteGuard' : txInfo.dataDecoded.method + + return ( + + + + + + } + /> + ) +} + +export default TxSettingsCard diff --git a/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx b/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx new file mode 100644 index 0000000000..d24bfc2410 --- /dev/null +++ b/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/react' +import TxSwapCard from '@/src/components/transactions-list/Card/TxSwapCard' +import { mockSwapTransfer } from '@/src/tests/mocks' +import { Order } from '@safe-global/safe-gateway-typescript-sdk' + +const meta: Meta = { + title: 'TransactionsList/TxSwapCard', + component: TxSwapCard, + args: { + txInfo: mockSwapTransfer as Order, + }, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} diff --git a/src/components/transactions-list/Card/TxSwapCard/index.tsx b/src/components/transactions-list/Card/TxSwapCard/index.tsx new file mode 100644 index 0000000000..4caecfa693 --- /dev/null +++ b/src/components/transactions-list/Card/TxSwapCard/index.tsx @@ -0,0 +1,60 @@ +import React from 'react' +import { Avatar, Text, Theme, View } from 'tamagui' +import TxListItem from '@/src/components/SafeListItem' +import { Order } from '@safe-global/safe-gateway-typescript-sdk' +import { formatValue } from '@/src/utils/formatters' + +interface TxSwapCardProps { + txInfo: Order + bordered?: boolean +} + +function TxSwapCard({ txInfo, bordered }: TxSwapCardProps) { + return ( + ${txInfo.buyToken.symbol}`} + icon="transaction-swap" + type="Swap order" + bordered={bordered} + leftNode={ + + + + {txInfo.sellToken.logoUri && ( + + )} + + + + + {txInfo.buyToken.logoUri && ( + + )} + + + + + } + rightNode={ + + + +{formatValue(txInfo.buyAmount, txInfo.buyToken.decimals)} {txInfo.buyToken.symbol} + + + −{formatValue(txInfo.sellAmount, txInfo.sellToken.decimals)} {txInfo.sellToken.symbol} + + + } + /> + ) +} + +export default TxSwapCard diff --git a/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx b/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx new file mode 100644 index 0000000000..200be321e8 --- /dev/null +++ b/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx @@ -0,0 +1,36 @@ +import type { Meta, StoryObj } from '@storybook/react' +import TxTokenCard from '@/src/components/transactions-list/Card/TxTokenCard' +import { mockERC20Transfer, mockNFTTransfer } from '@/src/tests/mocks' +import { TransactionStatus, Transfer } from '@safe-global/safe-gateway-typescript-sdk' + +const meta: Meta = { + title: 'TransactionsList/TxTokenCard', + component: TxTokenCard, + argTypes: { + bordered: { + description: 'Define if you want a border on the transaction', + control: { + type: 'boolean', + }, + }, + }, + args: { + bordered: false, + }, +} + +export default meta +type Story = StoryObj + +export const Default: Story = { + args: { + txStatus: TransactionStatus.SUCCESS, + txInfo: mockERC20Transfer as Transfer, + }, +} +export const NFT: Story = { + args: { + txStatus: TransactionStatus.SUCCESS, + txInfo: mockNFTTransfer as Transfer, + }, +} diff --git a/src/components/transactions-list/Card/TxTokenCard/index.tsx b/src/components/transactions-list/Card/TxTokenCard/index.tsx new file mode 100644 index 0000000000..abd21c108b --- /dev/null +++ b/src/components/transactions-list/Card/TxTokenCard/index.tsx @@ -0,0 +1,107 @@ +import React from 'react' +import { Avatar, Text, Theme, View } from 'tamagui' +import SafeListItem from '@/src/components/SafeListItem' +import { TransactionStatus, TransferDirection, Transfer } from '@safe-global/safe-gateway-typescript-sdk' +import { + isERC20Transfer, + isERC721Transfer, + isNativeTokenTransfer, + isOutgoingTransfer, + isTxQueued, +} from '@/src/utils/transaction-guards' +import { ellipsis, formatValue } from '@/src/utils/formatters' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' + +interface TxTokenCardProps { + bordered?: boolean + txStatus: TransactionStatus + txInfo: Transfer +} + +interface tokenDetails { + value: string + decimals?: number + tokenSymbol?: string + name: string + logoUri?: string +} + +const getTokenDetails = (txInfo: Transfer): tokenDetails => { + const transfer = txInfo.transferInfo + const unnamedToken = 'Unnamed token' + + if (isNativeTokenTransfer(transfer)) + return { + value: formatValue(transfer.value, 18), + // take it from the native currency slice + decimals: 18, + tokenSymbol: 'ETH', + name: 'Ether', + logoUri: 'https://safe-transaction-assets.safe.global/chains/1/currency_logo.png', + } + + if (isERC20Transfer(transfer)) { + return { + value: formatValue(transfer.value, transfer.decimals || 18), + decimals: transfer.decimals, + logoUri: transfer.logoUri, + tokenSymbol: ellipsis((transfer.tokenSymbol || 'Unknown Token').trim(), 6), + name: transfer.tokenName || unnamedToken, + } + } + + if (isERC721Transfer(transfer)) { + return { + name: transfer.tokenName || unnamedToken, + tokenSymbol: ellipsis(`${transfer.tokenSymbol || 'Unknown NFT'} #${transfer.tokenId}`, 8), + value: '1', + decimals: 0, + logoUri: transfer?.logoUri, + } + } + + return { + name: unnamedToken, + value: '', + } +} + +function TxTokenCard({ bordered, txStatus, txInfo }: TxTokenCardProps) { + const isSendTx = isOutgoingTransfer(txInfo) + const icon = isSendTx ? 'transaction-outgoing' : 'transaction-incoming' + const type = isSendTx ? (isTxQueued(txStatus) ? 'Send' : 'Sent') : 'Received' + const { logoUri, name, value, tokenSymbol } = getTokenDetails(txInfo) + const isERC721 = isERC721Transfer(txInfo.transferInfo) + const isOutgoing = txInfo.direction === TransferDirection.OUTGOING + + return ( + + + {logoUri && } + + + + + + + + + } + rightNode={ + + + {isOutgoing ? '-' : '+'} {ellipsis(value, 8)} {!isERC721 && tokenSymbol} + + + } + /> + ) +} + +export default TxTokenCard diff --git a/src/config/constants.ts b/src/config/constants.ts index a51698f5b9..43d54525d4 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -5,3 +5,6 @@ export const isProduction = process.env.NODE_ENV !== 'production' export const isAndroid = Platform.OS === 'android' export const isTestingEnv = process.env.NODE_ENV === 'test' export const isStorybookEnv = Constants?.expoConfig?.extra?.storybookEnabled === 'true' + +// TODO: remove it when the chain slice is cretated +export const MOCKED_CHAIN_ID = 1 diff --git a/src/features/TxHistory/TxHistoryList.tsx b/src/features/TxHistory/TxHistoryList.tsx index 0d5cde66b1..918f58ae2d 100644 --- a/src/features/TxHistory/TxHistoryList.tsx +++ b/src/features/TxHistory/TxHistoryList.tsx @@ -1,8 +1,11 @@ -import TxName from '@/src/components/TxName' -import { TransactionListItem } from '@safe-global/safe-gateway-typescript-sdk' -import React from 'react' -import { FlatList } from 'react-native' -import { Spinner } from 'tamagui' +import TxInfo from '@/src/components/TxInfo' +import { Transaction, TransactionListItem } from '@safe-global/safe-gateway-typescript-sdk' +import React, { useCallback, useMemo } from 'react' +import { SectionList, SectionListRenderItem } from 'react-native' +import { Spinner, View } from 'tamagui' +import { GroupedTxsWithTitle, groupTxs } from './utils' +import TxGroupedCard from '@/src/components/transactions-list/Card/TxGroupedCard' +import SafeListItem from '@/src/components/SafeListItem' interface TxHistoryList { transactions?: TransactionListItem[] @@ -10,14 +13,28 @@ interface TxHistoryList { isLoading?: boolean } +const getTxHash = (item: Transaction): string => item.transaction.txHash as unknown as string + function TxHistoryList({ transactions, onEndReached, isLoading }: TxHistoryList) { + const groupedList = useMemo(() => groupTxs(transactions || []), [transactions]) + const renderItem = useCallback>( + ({ item, index }) => ( + + {Array.isArray(item) ? : } + + ), + [], + ) + return ( - 'transaction' in item)} - renderItem={({ item }) => } + (Array.isArray(item) ? getTxHash(item[0]) + index : getTxHash(item) + index)} + renderItem={renderItem} onEndReached={onEndReached} ListFooterComponent={isLoading ? : undefined} + renderSectionHeader={({ section: { title } }) => } /> ) } diff --git a/src/features/TxHistory/utils.tsx b/src/features/TxHistory/utils.tsx new file mode 100644 index 0000000000..cf26d0eb3f --- /dev/null +++ b/src/features/TxHistory/utils.tsx @@ -0,0 +1,86 @@ +import { formatWithSchema } from '@/src/utils/date' +import { isConflictHeaderListItem, isNoneConflictType, isTransactionListItem } from '@/src/utils/transaction-guards' +import { Transaction, TransactionListItem, TransactionListItemType } from '@safe-global/safe-gateway-typescript-sdk' + +type GroupedTxsItem = TransactionListItem | Transaction[] +type GroupedTxs = GroupedTxsItem[] + +export interface GroupedTxsWithTitle { + title: string + data: (Transaction[] | Transaction)[] +} + +export const groupTxs = (list: TransactionListItem[]) => { + const groupedByConflicts = groupConflictingTxs(list) + const bulkTxs = groupBulkTxs(groupedByConflicts) + + return groupByDateLabel(bulkTxs) +} + +/** + * Group txs by conflict header + */ +export const groupConflictingTxs = (list: TransactionListItem[]): GroupedTxs => { + return list + .reduce((resultItems, item) => { + if (isConflictHeaderListItem(item)) { + return resultItems.concat([[]]) + } + + const prevItem = resultItems[resultItems.length - 1] + if (Array.isArray(prevItem) && isTransactionListItem(item) && !isNoneConflictType(item)) { + prevItem.push(item) + return resultItems + } + + return resultItems.concat(item) + }, []) + .map((item) => { + if (Array.isArray(item)) { + return item.sort((a, b) => b.transaction.timestamp - a.transaction.timestamp) + } + return item + }) +} + +/** + * Group txs by tx hash + */ +const groupBulkTxs = (list: GroupedTxs): GroupedTxs => { + return list + .reduce((resultItems, item) => { + if (Array.isArray(item) || !isTransactionListItem(item)) { + return resultItems.concat([item]) + } + const currentTxHash = item.transaction.txHash + + const prevItem = resultItems[resultItems.length - 1] + if (!Array.isArray(prevItem)) return resultItems.concat([[item]]) + const prevTxHash = prevItem[0].transaction.txHash + + if (currentTxHash && currentTxHash === prevTxHash) { + prevItem.push(item) + return resultItems + } + + return resultItems.concat([[item]]) + }, []) + .map((item) => (Array.isArray(item) && item.length === 1 ? item[0] : item)) +} + +const groupByDateLabel = (list: GroupedTxs): GroupedTxsWithTitle[] => { + const groupedTx = list.reduce((resultItems, item) => { + if (Array.isArray(item) || item.type === TransactionListItemType.TRANSACTION) { + resultItems[resultItems.length - 1].data.push(item) + } else if (item.type === TransactionListItemType.DATE_LABEL) { + resultItems.push({ + data: [], + title: formatWithSchema(item.timestamp, 'MMM d, yyyy'), + }) + } + + return resultItems + }, []) + + return groupedTx +} diff --git a/src/hooks/useTransactionType/index.tsx b/src/hooks/useTransactionType/index.tsx index af98ae18d2..671b567bac 100644 --- a/src/hooks/useTransactionType/index.tsx +++ b/src/hooks/useTransactionType/index.tsx @@ -15,6 +15,7 @@ import { isOutgoingTransfer, isTxQueued, } from '@/src/utils/transaction-guards' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' const getTxTo = ({ txInfo }: Pick): AddressEx | undefined => { switch (txInfo.type) { @@ -32,9 +33,10 @@ const getTxTo = ({ txInfo }: Pick): AddressEx | un } } } - interface TxType { text: string + icon?: string | React.ReactElement + image: string | React.ReactElement } export const getOrderClass = (order: Pick): latest.OrderClass1 => { @@ -50,14 +52,22 @@ export const getTransactionType = (tx: TransactionSummary): TxType => { switch (tx.txInfo.type) { case TransactionInfoType.CREATION: { return { + image: toAddress?.logoUri || , + icon: toAddress?.logoUri || , text: 'Safe Account created', } } case TransactionInfoType.SWAP_TRANSFER: case TransactionInfoType.TRANSFER: { const isSendTx = isOutgoingTransfer(tx.txInfo) - + const icon = isSendTx ? ( + + ) : ( + + ) return { + icon, + image: 'https://safe-transaction-assets.safe.global/chains/1/currency_logo.png', text: isSendTx ? (isTxQueued(tx.txStatus) ? 'Send' : 'Sent') : 'Received', } } @@ -67,53 +77,72 @@ export const getTransactionType = (tx: TransactionSummary): TxType => { const isDeleteGuard = tx.txInfo.settingsInfo?.type === SettingsInfoType.DELETE_GUARD return { + image: , + icon: , text: isDeleteGuard ? 'deleteGuard' : tx.txInfo.dataDecoded.method, } } + case TransactionInfoType.SWAP_ORDER: { const orderClass = getOrderClass(tx.txInfo) const altText = orderClass === 'limit' ? 'Limit order' : 'Swap order' return { + image: , + icon: , text: altText, } } case TransactionInfoType.TWAP_ORDER: { return { + image: , + icon: , text: 'TWAP order', } } case TransactionInfoType.CUSTOM: { if (isMultiSendTxInfo(tx.txInfo) && !tx.safeAppInfo) { return { + image: , + icon: , text: 'Batch', } } if (isModuleExecutionInfo(tx.executionInfo)) { return { + image: toAddress?.logoUri || , + icon: , text: toAddress?.name || 'Contract interaction', } } if (isCancellationTxInfo(tx.txInfo)) { return { + image: , + icon: , text: 'On-chain rejection', } } return { + image: toAddress?.logoUri || , + icon: , text: toAddress?.name || 'Contract interaction', } } default: { if (tx.safeAppInfo) { return { + image: tx.safeAppInfo.logoUri, + icon: , text: tx.safeAppInfo.name, } } return { + icon: , + image: , text: 'Contract interaction', } } @@ -121,6 +150,7 @@ export const getTransactionType = (tx: TransactionSummary): TxType => { } // We're going to need the address book in the future +// rename it to useTransactionNormalizer export const useTransactionType = (tx: TransactionSummary): TxType => { // addressBook = useAddressBook diff --git a/src/hooks/useTransactionType/useTransactionType.test.ts b/src/hooks/useTransactionType/useTransactionType.test.tsx similarity index 85% rename from src/hooks/useTransactionType/useTransactionType.test.ts rename to src/hooks/useTransactionType/useTransactionType.test.tsx index ffec19ed26..12e002b576 100644 --- a/src/hooks/useTransactionType/useTransactionType.test.ts +++ b/src/hooks/useTransactionType/useTransactionType.test.tsx @@ -7,7 +7,7 @@ describe('useTransactionType', () => { it('should be a Received transaction', () => { const { result } = renderHook(() => useTransactionType(mockTransactionSummary)) - expect(result.current).toStrictEqual({ text: 'Received' }) + expect(result.current.text).toBe('Received') }) it('should be a Creation transaction', () => { @@ -20,7 +20,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'Safe Account created' }) + expect(result.current.text).toBe('Safe Account created') }) it('should be a outgoing transfer transaction', () => { @@ -34,7 +34,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'Sent' }) + expect(result.current.text).toBe('Sent') }) it('should be a outgoing transfer transaction awaiting for execution', () => { @@ -49,7 +49,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'Send' }) + expect(result.current.text).toBe('Send') }) it('should return the type for a SETTINGS_CHANGE transaction', () => { @@ -63,7 +63,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'mockMethod' }) + expect(result.current.text).toBe('mockMethod') }) it('should return the type for a SWAP_ORDER transaction', () => { @@ -77,7 +77,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'Swap order' }) + expect(result.current.text).toBe('Swap order') }) it('should return the type for a TWAP_ORDER transaction', () => { @@ -91,7 +91,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'TWAP order' }) + expect(result.current.text).toBe('TWAP order') }) it('should return the type for a CUSTOM transaction', () => { @@ -105,7 +105,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'Contract interaction' }) + expect(result.current.text).toBe('Contract interaction') }) it('should return a `Batch` text for a CUSTOM batch transaction', () => { @@ -122,7 +122,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'Batch' }) + expect(result.current.text).toBe('Batch') }) it('should return the default transaction information', () => { @@ -137,7 +137,7 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'Contract interaction' }) + expect(result.current.text).toBe('Contract interaction') }) it('should return the default transaction information with safe information', () => { @@ -156,6 +156,6 @@ describe('useTransactionType', () => { }), ) - expect(result.current).toStrictEqual({ text: 'somename' }) + expect(result.current.text).toBe('somename') }) }) diff --git a/src/store/gateway.ts b/src/store/gateway.ts index 7c95557303..ca295a8e9b 100644 --- a/src/store/gateway.ts +++ b/src/store/gateway.ts @@ -19,7 +19,16 @@ export const gatewayApi = createApi({ { chainId: string; safeAddress: string; pageUrl?: string } >({ queryFn({ chainId, safeAddress, pageUrl }) { - return buildQueryFn(() => getTransactionHistory(chainId, safeAddress, {}, pageUrl)) + return buildQueryFn(() => + getTransactionHistory( + chainId, + safeAddress, + { + trusted: false, + }, + pageUrl, + ), + ) }, }), }), diff --git a/src/tests/mocks.ts b/src/tests/mocks.ts index c2efcc94f5..fba5b50537 100644 --- a/src/tests/mocks.ts +++ b/src/tests/mocks.ts @@ -9,14 +9,24 @@ import { DetailedExecutionInfoType, TransactionListItem, TransactionSummary, + AddressEx, } from '@safe-global/safe-gateway-typescript-sdk' import { RichFragmentType } from '@safe-global/safe-gateway-typescript-sdk/dist/types/human-description' export const fakeToken = { address: '0x1111111111', decimals: 18, - name: 'NevinhaToken', - symbol: 'NEV', + name: 'Ether', + logoUri: 'https://safe-transaction-assets.safe.global/chains/1/chain_logo.png', + symbol: 'ETH', + trusted: false, +} +export const fakeToken2 = { + address: '0x1111111111', + decimals: 18, + name: 'SafeToken', + logoUri: 'https://safe-transaction-assets.safe.global/tokens/logos/0x5aFE3855358E112B5647B952709E6165e1c1eEEe.png', + symbol: 'SAFE', trusted: false, } export const mockERC20Transfer: TransactionInfo = { @@ -32,13 +42,37 @@ export const mockERC20Transfer: TransactionInfo = { transferInfo: { type: TransactionTokenType.ERC20, tokenAddress: '0x000000', - value: '100000', + value: '50000000000000000', + tokenName: 'Nevinha', + logoUri: 'https://safe-transaction-assets.safe.global/chains/1/chain_logo.png', + tokenSymbol: 'NEV', trusted: false, + decimals: 18, imitation: true, }, direction: TransferDirection.INCOMING, humanDescription: 'a simple incoming transaction', } +export const mockNFTTransfer: TransactionInfo = { + type: TransactionInfoType.TRANSFER, + sender: { + value: '0x000000', + name: 'something', + }, + recipient: { + value: '0x0ab', + name: 'something', + }, + transferInfo: { + tokenId: '1', + type: TransactionTokenType.ERC721, + tokenAddress: '0x000000', + tokenName: 'My NFT', + tokenSymbol: 'NEV', + }, + direction: TransferDirection.OUTGOING, + humanDescription: 'a simple incoming transaction', +} export const mockSwapTransfer: TransactionInfo = { type: TransactionInfoType.SWAP_TRANSFER, sender: { @@ -53,7 +87,7 @@ export const mockSwapTransfer: TransactionInfo = { transferInfo: { type: TransactionTokenType.ERC20, tokenAddress: '0x000000', - value: '100000', + value: '50000000000000000', trusted: false, imitation: true, }, @@ -71,11 +105,11 @@ export const mockSwapTransfer: TransactionInfo = { kind: 'buy', orderClass: 'limit', validUntil: 11902381293, - sellAmount: '100', - buyAmount: '1000000', - executedSellAmount: '100', - executedBuyAmount: '1000000', - sellToken: fakeToken, + sellAmount: '50000000000000000', + buyAmount: '50000000000000000', + executedSellAmount: '50000000000000000', + executedBuyAmount: '50000000000000000', + sellToken: fakeToken2, buyToken: fakeToken, explorerUrl: 'http://google.com', executedSurplusFee: '', @@ -89,6 +123,8 @@ interface mockTransferWithInfoArgs { methodName?: string actionCount?: number isCancellation?: boolean + to?: AddressEx + creator?: AddressEx } export const mockTransferWithInfo = ({ @@ -97,6 +133,8 @@ export const mockTransferWithInfo = ({ methodName, actionCount, isCancellation, + to, + creator, }: mockTransferWithInfoArgs): TransactionInfo => ({ type, @@ -104,6 +142,8 @@ export const mockTransferWithInfo = ({ value: '0x000000', name: 'something', }, + to, + creator, methodName, actionCount, recipient: { diff --git a/src/theme/emotion.d.ts b/src/theme/emotion.d.ts deleted file mode 100644 index bc71dfecd0..0000000000 --- a/src/theme/emotion.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import '@emotion/react' -import { MD3Theme } from 'react-native-paper' - -declare module '@emotion/react' { - export interface Theme extends MD3Theme {} -} diff --git a/src/theme/palettes/darkPalette.ts b/src/theme/palettes/darkPalette.ts index 195061891e..b5177f4d89 100644 --- a/src/theme/palettes/darkPalette.ts +++ b/src/theme/palettes/darkPalette.ts @@ -21,7 +21,7 @@ const darkPalette = { background: '#121312', }, error: { - dark: '#AC2C3B', + dark: '#411C20', main: '#FF5F72', light: '#FFB4BD', background: '#2F2527', diff --git a/src/theme/palettes/lightPalette.ts b/src/theme/palettes/lightPalette.ts index 0ceb466939..fdc79e2c2c 100644 --- a/src/theme/palettes/lightPalette.ts +++ b/src/theme/palettes/lightPalette.ts @@ -21,7 +21,7 @@ const lightPalette = { background: '#F4F4F4', }, error: { - dark: '#AC2C3B', + dark: '#411C20', main: '#FF5F72', light: '#FFB4BD', background: '#FFE6EA', diff --git a/src/theme/tamagui.config.ts b/src/theme/tamagui.config.ts index 009e7657f6..710ae5f0f6 100644 --- a/src/theme/tamagui.config.ts +++ b/src/theme/tamagui.config.ts @@ -63,7 +63,12 @@ export const config = createTamagui({ backgroundStrong: tokens.color.primaryDarkLight, backgroundTransparent: 'transparent', color: tokens.color.textPrimaryLight, + primary: tokens.color.primaryMainLight, + primaryLight: tokens.color.primaryLightLight, colorHover: tokens.color.textSecondaryLight, + borderLight: tokens.color.borderLightLight, + error: tokens.color.errorMainLight, + errorDark: tokens.color.errorDarkDark, }, light_pendingTx: { background: tokens.color.warning1MainLight, @@ -105,12 +110,21 @@ export const config = createTamagui({ background: tokens.color.error1MainDark, color: tokens.color.error1ContrastTextDark, }, + logo: { + background: '#FFF', + }, light_container: { background: tokens.color.backgroundPaperLight, }, dark_container: { background: tokens.color.backgroundPaperDark, }, + light_safe_list: { + background: tokens.color.backgroundDefaultLight, + }, + dark_safe_list: { + background: tokens.color.backgroundDefaultDark, + }, dark: { background: tokens.color.backgroundPaperDark, backgroundHover: tokens.color.backgroundLightDark, @@ -119,6 +133,11 @@ export const config = createTamagui({ backgroundStrong: tokens.color.primaryDarkDark, backgroundTransparent: 'transparent', color: tokens.color.textPrimaryDark, + primary: tokens.color.primaryMainDark, + primaryLight: tokens.color.primaryLightDark, + borderLight: tokens.color.borderLightDark, + error: tokens.color.errorMainDark, + errorDark: tokens.color.errorDarkDark, }, }, tokens, diff --git a/src/utils/formatters.ts b/src/utils/formatters.ts new file mode 100644 index 0000000000..4ef155a16a --- /dev/null +++ b/src/utils/formatters.ts @@ -0,0 +1,15 @@ +export const ellipsis = (str: string, length: number): string => { + return str.length > length ? `${str.slice(0, length)}...` : str +} + +export const shortenAddress = (address: string, length = 4): string => { + if (!address) { + return '' + } + + return `${address.slice(0, length + 2)}...${address.slice(-length)}` +} + +export const formatValue = (value: string, decimals: number): string => { + return (parseInt(value) / 10 ** decimals).toString().substring(0, 8) +} diff --git a/src/utils/transaction-guards.ts b/src/utils/transaction-guards.ts index 8376e0a5fe..2bdf42f04d 100644 --- a/src/utils/transaction-guards.ts +++ b/src/utils/transaction-guards.ts @@ -1,14 +1,21 @@ import { Cancellation, + ConflictHeader, + ConflictType, Creation, Custom, DateLabel, DetailedExecutionInfo, + Erc20Transfer, + Erc721Transfer, ExecutionInfo, Label, ModuleExecutionInfo, MultiSend, MultisigExecutionInfo, + NativeCoinTransfer, + Order, + SettingsChange, SwapOrder, Transaction, TransactionInfo, @@ -16,8 +23,11 @@ import { TransactionListItem, TransactionListItemType, TransactionStatus, + TransactionTokenType, Transfer, TransferDirection, + TransferInfo, + TwapOrder, } from '@safe-global/safe-gateway-typescript-sdk' export const isTxQueued = (value: TransactionStatus): boolean => { @@ -28,6 +38,9 @@ export const isTransferTxInfo = (value: TransactionInfo): value is Transfer => { return value.type === TransactionInfoType.TRANSFER || isSwapTransferOrderTxInfo(value) } +export const isSettingsChangeTxInfo = (value: TransactionInfo): value is SettingsChange => { + return value.type === TransactionInfoType.SETTINGS_CHANGE +} /** * A fulfillment transaction for swap, limit or twap order is always a SwapOrder * It cannot be a TWAP order @@ -53,6 +66,14 @@ export const isMultiSendTxInfo = (value: TransactionInfo): value is MultiSend => typeof value.actionCount === 'number' ) } + +export const isOrderTxInfo = (value: TransactionInfo): value is Order => { + return isSwapOrderTxInfo(value) || isTwapOrderTxInfo(value) +} + +export const isTwapOrderTxInfo = (value: TransactionInfo): value is TwapOrder => { + return value.type === TransactionInfoType.TWAP_ORDER +} export const isCancellationTxInfo = (value: TransactionInfo): value is Cancellation => { return isCustomTxInfo(value) && value.isCancellation } @@ -61,6 +82,14 @@ export const isTransactionListItem = (value: TransactionListItem): value is Tran return value.type === TransactionListItemType.TRANSACTION } +export const isConflictHeaderListItem = (value: TransactionListItem): value is ConflictHeader => { + return value.type === TransactionListItemType.CONFLICT_HEADER +} + +export const isNoneConflictType = (transaction: Transaction) => { + return transaction.conflictType === ConflictType.NONE +} + export const isDateLabel = (value: TransactionListItem): value is DateLabel => { return value.type === TransactionListItemType.DATE_LABEL } @@ -85,3 +114,15 @@ export const isModuleExecutionInfo = (value?: ExecutionInfo | DetailedExecutionI export const isSwapOrderTxInfo = (value: TransactionInfo): value is SwapOrder => { return value.type === TransactionInfoType.SWAP_ORDER } + +export const isNativeTokenTransfer = (value: TransferInfo): value is NativeCoinTransfer => { + return value.type === TransactionTokenType.NATIVE_COIN +} + +export const isERC20Transfer = (value: TransferInfo): value is Erc20Transfer => { + return value.type === TransactionTokenType.ERC20 +} + +export const isERC721Transfer = (value: TransferInfo): value is Erc721Transfer => { + return value.type === TransactionTokenType.ERC721 +} From 947272fbc49355b2915e125daac7d01caa994e3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=B3vis=20Neto?= Date: Thu, 7 Nov 2024 11:48:54 +0100 Subject: [PATCH 07/49] chore: Use Alert component in the status banners components (#17) * chore: use Alert component for the status banners * chore: use GestureHandler on the application entry point * fix: remove 'isStorybookEnv' log * fix: rename tests cases --- app/(tabs)/index.tsx | 31 +- app/_layout.tsx | 23 +- src/components/Alert/Alert.test.tsx | 41 ++ .../Alert/__snapshots__/Alert.test.tsx.snap | 530 ++++++++++++++++++ src/components/Alert/index.tsx | 50 +- .../StatusBanners/PendingTransactions.tsx | 42 -- .../PendingTransactions.stories.tsx | 6 +- .../PendingTransactions.test.tsx | 16 + .../PendingTransactions.test.tsx.snap | 247 ++++++++ .../PendingTransactions/index.tsx | 33 ++ src/tests/jest.setup.ts | 1 + src/theme/tamagui.config.ts | 12 +- 12 files changed, 929 insertions(+), 103 deletions(-) create mode 100644 src/components/Alert/Alert.test.tsx create mode 100644 src/components/Alert/__snapshots__/Alert.test.tsx.snap delete mode 100644 src/components/StatusBanners/PendingTransactions.tsx rename src/components/StatusBanners/{ => PendingTransactions}/PendingTransactions.stories.tsx (60%) create mode 100644 src/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx create mode 100644 src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap create mode 100644 src/components/StatusBanners/PendingTransactions/index.tsx diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index cd01b4727a..23d77ce9b7 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -1,31 +1,10 @@ -import Ionicons from '@expo/vector-icons/Ionicons' -import { StyleSheet, View } from 'react-native' - -import ParallaxScrollView from '@/src/components/ParallaxScrollView' -import { Text } from 'tamagui' +import { Alert } from '@/src/components/Alert' +import { SafeAreaView } from 'react-native-safe-area-context' export default function HomeScreen() { return ( - } - > - - HomeScreen - - + + + ) } - -const styles = StyleSheet.create({ - headerImage: { - color: '#808080', - bottom: -90, - left: -35, - position: 'absolute', - }, - titleContainer: { - flexDirection: 'row', - gap: 8, - }, -}) diff --git a/app/_layout.tsx b/app/_layout.tsx index 54f92d0347..baaab19a6c 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -5,19 +5,22 @@ import { Provider } from 'react-redux' import { persistor, store } from '@/src/store' import { PersistGate } from 'redux-persist/integration/react' import { isStorybookEnv } from '@/src/config/constants' +import { GestureHandlerRootView } from 'react-native-gesture-handler' function RootLayout() { return ( - - - - - - - - - - + + + + + + + + + + + + ) } diff --git a/src/components/Alert/Alert.test.tsx b/src/components/Alert/Alert.test.tsx new file mode 100644 index 0000000000..e2a8ac4b29 --- /dev/null +++ b/src/components/Alert/Alert.test.tsx @@ -0,0 +1,41 @@ +import { render } from '@/src/tests/test-utils' +import { Alert } from '.' +import { SafeFontIcon } from '../SafeFontIcon/SafeFontIcon' + +describe('Alert', () => { + it('should render a info alert', () => { + const container = render() + + expect(container).toMatchSnapshot() + }) + + it('should render a warning alert', () => { + const container = render() + + expect(container).toMatchSnapshot() + }) + + it('should render an error alert', () => { + const container = render() + + expect(container).toMatchSnapshot() + }) + + it('should render an alert with start icon', () => { + const container = render(} message="Error alert" />) + + expect(container).toMatchSnapshot() + }) + + it('should render an alert with an end icon', () => { + const container = render(} message="Error alert" />) + + expect(container).toMatchSnapshot() + }) + + it('should render an alert with a name icon', () => { + const container = render() + + expect(container).toMatchSnapshot() + }) +}) diff --git a/src/components/Alert/__snapshots__/Alert.test.tsx.snap b/src/components/Alert/__snapshots__/Alert.test.tsx.snap new file mode 100644 index 0000000000..452aac426c --- /dev/null +++ b/src/components/Alert/__snapshots__/Alert.test.tsx.snap @@ -0,0 +1,530 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Alert should render a info alert 1`] = ` + + + + + +  + + + Info alert + + + + + +`; + +exports[`Alert should render a warning alert 1`] = ` + + + + + +  + + + Warning alert + + + + + +`; + +exports[`Alert should render an alert with a name icon 1`] = ` + + + + + +  + + + Error alert + + + + + +`; + +exports[`Alert should render an alert with an end icon 1`] = ` + + + + + +  + + + Error alert + + + +  + + + + + + +`; + +exports[`Alert should render an alert with start icon 1`] = ` + + + + + + +  + + + + Error alert + + + + + +`; + +exports[`Alert should render an error alert 1`] = ` + + + + + +  + + + Error alert + + + + + +`; diff --git a/src/components/Alert/index.tsx b/src/components/Alert/index.tsx index 5e6c4c6187..814b6ce733 100644 --- a/src/components/Alert/index.tsx +++ b/src/components/Alert/index.tsx @@ -2,6 +2,7 @@ import { View, Text, Theme } from 'tamagui' import React, { type ReactElement } from 'react' import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' import { IconName } from '@/src/types/iconTypes' +import { TouchableOpacity } from 'react-native-gesture-handler' type AlertType = 'error' | 'warning' | 'info' @@ -10,6 +11,10 @@ interface AlertProps { message: string iconName?: IconName displayIcon?: boolean + fullWidth?: boolean + endIcon?: React.ReactNode + startIcon?: React.ReactNode + onPress?: () => void } const icons = { @@ -24,25 +29,42 @@ const getAlertIcon = (type: AlertType, iconName?: IconName, displayIcon?: boolea return iconName ? : icons[type] } -export const Alert = ({ type, message, iconName, displayIcon = true }: AlertProps) => { +export const Alert = ({ + type, + fullWidth = true, + message, + iconName, + startIcon, + endIcon, + displayIcon = true, + onPress, +}: AlertProps) => { const Icon = getAlertIcon(type, iconName, displayIcon) return ( - - - {Icon} - - {message} - + + + + {startIcon ? {startIcon} : Icon} + + + {message} + + + {endIcon && {endIcon}} + - + ) } diff --git a/src/components/StatusBanners/PendingTransactions.tsx b/src/components/StatusBanners/PendingTransactions.tsx deleted file mode 100644 index 77b6184fda..0000000000 --- a/src/components/StatusBanners/PendingTransactions.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { View, Theme, Text, Circle } from 'tamagui' -import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' - -import { ListItemTitle, ListItem } from 'tamagui' -import React from 'react' - -interface Props { - number: number -} - -export const PendingTransactions = ({ number }: Props) => { - const ArrowRight = - - return ( - - - - - {number} - - } - iconAfter={ArrowRight} - size="$2" - padding={'$2'} - unstyled={false} - > - - Pending Transactions - - - - - - ) -} diff --git a/src/components/StatusBanners/PendingTransactions.stories.tsx b/src/components/StatusBanners/PendingTransactions/PendingTransactions.stories.tsx similarity index 60% rename from src/components/StatusBanners/PendingTransactions.stories.tsx rename to src/components/StatusBanners/PendingTransactions/PendingTransactions.stories.tsx index cb76fa679c..7cabe7d70b 100644 --- a/src/components/StatusBanners/PendingTransactions.stories.tsx +++ b/src/components/StatusBanners/PendingTransactions/PendingTransactions.stories.tsx @@ -1,5 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react' -import { PendingTransactions } from '@/src/components/StatusBanners/PendingTransactions' +import PendingTransactions from '@/src/components/StatusBanners/PendingTransactions' +import { action } from '@storybook/addon-actions' const meta: Meta = { title: 'StatusBanners/PendingTransactions', @@ -7,8 +8,11 @@ const meta: Meta = { argTypes: { number: { control: 'number' }, }, + parameters: { actions: { argTypesRegex: '^on.*' } }, args: { + fullWidth: false, number: 5, + onPress: action('on-press'), }, } diff --git a/src/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx b/src/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx new file mode 100644 index 0000000000..8bb995a7da --- /dev/null +++ b/src/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx @@ -0,0 +1,16 @@ +import { render } from '@/src/tests/test-utils' +import PendingTransactions from '.' + +describe('PendingTransactions', () => { + it('should render the default markup', () => { + const container = render() + + expect(container).toMatchSnapshot() + }) + + it('should render the pending transactions in fullWidth layout', () => { + const container = render() + + expect(container).toMatchSnapshot() + }) +}) diff --git a/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap b/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap new file mode 100644 index 0000000000..b94defe604 --- /dev/null +++ b/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap @@ -0,0 +1,247 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ConflictTransactions should render the default markup 1`] = ` + + + + + + + + 2 + + + + + Pending Transactions + + + +  + + + + + + +`; + +exports[`ConflictTransactions should render the pending transactions in fullWidth layout 1`] = ` + + + + + + + + 2 + + + + + Pending Transactions + + + +  + + + + + + +`; diff --git a/src/components/StatusBanners/PendingTransactions/index.tsx b/src/components/StatusBanners/PendingTransactions/index.tsx new file mode 100644 index 0000000000..212402bac6 --- /dev/null +++ b/src/components/StatusBanners/PendingTransactions/index.tsx @@ -0,0 +1,33 @@ +import { Text, Circle } from 'tamagui' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' + +import React from 'react' +import { Alert } from '../../Alert' + +interface Props { + number: number + fullWidth?: boolean + onPress: () => void +} + +const PendingTransactions = ({ number, fullWidth, onPress }: Props) => { + const startIcon = ( + + {number} + + ) + const endIcon = + + return ( + + ) +} + +export default PendingTransactions diff --git a/src/tests/jest.setup.ts b/src/tests/jest.setup.ts index 9ddffaf167..607da14b0a 100644 --- a/src/tests/jest.setup.ts +++ b/src/tests/jest.setup.ts @@ -8,6 +8,7 @@ jest.useFakeTimers() */ jest.mock('expo-font', () => ({ useFonts: () => [true], + isLoaded: () => true, })) jest.mock('react-native-mmkv', () => ({ diff --git a/src/theme/tamagui.config.ts b/src/theme/tamagui.config.ts index 710ae5f0f6..fcaef01664 100644 --- a/src/theme/tamagui.config.ts +++ b/src/theme/tamagui.config.ts @@ -70,16 +70,6 @@ export const config = createTamagui({ error: tokens.color.errorMainLight, errorDark: tokens.color.errorDarkDark, }, - light_pendingTx: { - background: tokens.color.warning1MainLight, - color: tokens.color.warning1ContrastTextLight, - badgeTextColor: tokens.color.textPrimaryLight, - }, - dark_pendingTx: { - background: tokens.color.warning1MainDark, - color: tokens.color.warning1ContrastTextDark, - badgeTextColor: tokens.color.textPrimaryLight, - }, light_label: { color: tokens.color.textSecondaryLight, }, @@ -97,10 +87,12 @@ export const config = createTamagui({ light_warning: { background: tokens.color.warning1MainLight, color: tokens.color.warning1ContrastTextLight, + badgeTextColor: tokens.color.textPrimaryLight, }, dark_warning: { background: tokens.color.warning1MainDark, color: tokens.color.warning1ContrastTextDark, + badgeTextColor: tokens.color.backgroundDefaultDark, }, light_error: { background: tokens.color.error1MainLight, From a7d10c1c76c043a01406fc94782b18ef5ec3453b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=B3vis=20Neto?= Date: Thu, 7 Nov 2024 11:59:02 +0100 Subject: [PATCH 08/49] feat: Add chains and active chain slice (#16) * chore: adjust api gateway folder structure * feat: create chains slice * feat: create activeChain slice * chore: remove TODO comment * chore: remove unused code * feat: use activeChain information instead of hard coded data * fix: remove performance optmization in pro of readability --- app/_layout.tsx | 3 ++ eslint.config.mjs | 1 + .../Card/TxTokenCard/index.tsx | 13 +++-- src/config/constants.ts | 6 ++- src/features/TxHistory/index.tsx | 5 +- src/store/activeChainSlice.ts | 22 ++++++++ src/store/gateway/chains/index.ts | 50 +++++++++++++++++++ src/store/gateway/index.ts | 17 +++++++ .../gateway/transactions-history/index.ts | 16 ++++++ .../gateway/transactions-history/types.ts | 5 ++ src/store/gateway/utils.ts | 9 ++++ src/store/index.ts | 2 + 12 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 src/store/activeChainSlice.ts create mode 100644 src/store/gateway/chains/index.ts create mode 100644 src/store/gateway/index.ts create mode 100644 src/store/gateway/transactions-history/index.ts create mode 100644 src/store/gateway/transactions-history/types.ts create mode 100644 src/store/gateway/utils.ts diff --git a/app/_layout.tsx b/app/_layout.tsx index baaab19a6c..a0ba3eaf5a 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -5,9 +5,12 @@ import { Provider } from 'react-redux' import { persistor, store } from '@/src/store' import { PersistGate } from 'redux-persist/integration/react' import { isStorybookEnv } from '@/src/config/constants' +import { apiSliceWithChainsConfig } from '@/src/store/gateway/chains' import { GestureHandlerRootView } from 'react-native-gesture-handler' function RootLayout() { + store.dispatch(apiSliceWithChainsConfig.endpoints.getChainsConfig.initiate({})) + return ( diff --git a/eslint.config.mjs b/eslint.config.mjs index b3a2260b8d..cde25f715b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -24,6 +24,7 @@ export default [ '@typescript-eslint/no-require-imports': 'off', '@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-invalid-void-type': 'off', }, }, ] diff --git a/src/components/transactions-list/Card/TxTokenCard/index.tsx b/src/components/transactions-list/Card/TxTokenCard/index.tsx index abd21c108b..c8f7b4fe47 100644 --- a/src/components/transactions-list/Card/TxTokenCard/index.tsx +++ b/src/components/transactions-list/Card/TxTokenCard/index.tsx @@ -11,6 +11,8 @@ import { } from '@/src/utils/transaction-guards' import { ellipsis, formatValue } from '@/src/utils/formatters' import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { useSelector } from 'react-redux' +import { selectNativeCurrency } from '@/src/store/activeChainSlice' interface TxTokenCardProps { bordered?: boolean @@ -29,15 +31,16 @@ interface tokenDetails { const getTokenDetails = (txInfo: Transfer): tokenDetails => { const transfer = txInfo.transferInfo const unnamedToken = 'Unnamed token' + const nativeCurrencty = useSelector(selectNativeCurrency) if (isNativeTokenTransfer(transfer)) return { - value: formatValue(transfer.value, 18), + value: formatValue(transfer.value, nativeCurrencty.decimals), // take it from the native currency slice - decimals: 18, - tokenSymbol: 'ETH', - name: 'Ether', - logoUri: 'https://safe-transaction-assets.safe.global/chains/1/currency_logo.png', + decimals: nativeCurrencty.decimals, + tokenSymbol: nativeCurrencty.symbol, + name: nativeCurrencty.name, + logoUri: nativeCurrencty.logoUri, } if (isERC20Transfer(transfer)) { diff --git a/src/config/constants.ts b/src/config/constants.ts index 43d54525d4..5b9b39ea7c 100644 --- a/src/config/constants.ts +++ b/src/config/constants.ts @@ -6,5 +6,7 @@ export const isAndroid = Platform.OS === 'android' export const isTestingEnv = process.env.NODE_ENV === 'test' export const isStorybookEnv = Constants?.expoConfig?.extra?.storybookEnabled === 'true' -// TODO: remove it when the chain slice is cretated -export const MOCKED_CHAIN_ID = 1 +export const GATEWAY_URL_PRODUCTION = + process.env.NEXT_PUBLIC_GATEWAY_URL_PRODUCTION || 'https://safe-client.safe.global' +export const GATEWAY_URL_STAGING = process.env.NEXT_PUBLIC_GATEWAY_URL_STAGING || 'https://safe-client.staging.5afe.dev' +export const GATEWAY_URL = process.env.NODE_ENV !== 'production' ? GATEWAY_URL_STAGING : GATEWAY_URL_PRODUCTION diff --git a/src/features/TxHistory/index.tsx b/src/features/TxHistory/index.tsx index 3a5bf31816..e2b73188d7 100644 --- a/src/features/TxHistory/index.tsx +++ b/src/features/TxHistory/index.tsx @@ -2,12 +2,15 @@ import { useGetTransactionsHistoryQuery } from '@/src/store/gateway' import React, { useEffect, useState } from 'react' import TxHistoryList from './TxHistoryList' import { TransactionListItem } from '@safe-global/safe-gateway-typescript-sdk' +import { useSelector } from 'react-redux' +import { selectActiveChain } from '@/src/store/activeChainSlice' function TxHistory() { const [pageUrl, setPageUrl] = useState() const [list, setList] = useState([]) + const activeChain = useSelector(selectActiveChain) const { data, refetch, isFetching, isUninitialized } = useGetTransactionsHistoryQuery({ - chainId: '1', + chainId: activeChain.chainId, safeAddress: '0xA77DE01e157f9f57C7c4A326eeE9C4874D0598b6', pageUrl, }) diff --git a/src/store/activeChainSlice.ts b/src/store/activeChainSlice.ts new file mode 100644 index 0000000000..61a40ddb15 --- /dev/null +++ b/src/store/activeChainSlice.ts @@ -0,0 +1,22 @@ +import { createSelector, createSlice, PayloadAction } from '@reduxjs/toolkit' +import { RootState } from '.' +import { selectChainById } from './gateway/chains' + +const initialState = { id: '1' } + +const activeChainSlice = createSlice({ + name: 'txHistory', + initialState, + reducers: { + switchActiveChain: (state, action: PayloadAction<{ id: string }>) => { + return action.payload + }, + }, +}) + +export const { switchActiveChain } = activeChainSlice.actions + +export const selectActiveChain = (state: RootState) => selectChainById(state, state.activeChain.id) +export const selectNativeCurrency = createSelector([selectActiveChain], ({ nativeCurrency }) => nativeCurrency) + +export default activeChainSlice.reducer diff --git a/src/store/gateway/chains/index.ts b/src/store/gateway/chains/index.ts new file mode 100644 index 0000000000..e0527fe86b --- /dev/null +++ b/src/store/gateway/chains/index.ts @@ -0,0 +1,50 @@ +import { ChainInfo } from '@safe-global/safe-gateway-typescript-sdk' +import { buildQueryFn } from '../utils' +import { GATEWAY_URL } from '@/src/config/constants' +import { createEntityAdapter, createSelector, EntityState } from '@reduxjs/toolkit' +import { gatewayApi } from '..' +import { RootState } from '../..' + +const chainsAdapter = createEntityAdapter({ selectId: (chain: ChainInfo) => chain.chainId }) +const initialState = chainsAdapter.getInitialState() + +const getChainsConfigs = async ( + url = `${GATEWAY_URL}/v1/chains`, + results: ChainInfo[] = [], +): Promise> => { + const response = await fetch(url) + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + const data = await response.json() + + const nextResults = [...results, ...data.results] + + if (data.next) return getChainsConfigs(url, nextResults) + + return chainsAdapter.setAll(initialState, nextResults) +} + +const getChains = () => { + return buildQueryFn(getChainsConfigs) +} + +export const apiSliceWithChainsConfig = gatewayApi.injectEndpoints({ + endpoints: (builder) => ({ + getChainsConfig: builder.query({ + queryFn: getChains, + }), + }), +}) + +const selectChainsResult = apiSliceWithChainsConfig.endpoints.getChainsConfig.select({}) + +const selectChainsData = createSelector(selectChainsResult, (result) => { + return result.data ?? initialState +}) + +const { selectAll, selectById } = chainsAdapter.getSelectors(selectChainsData) + +export const selectChainById = (state: RootState, chainId: string) => selectById(state, chainId) +export const { useGetChainsConfigQuery } = apiSliceWithChainsConfig +export { selectAll } diff --git a/src/store/gateway/index.ts b/src/store/gateway/index.ts new file mode 100644 index 0000000000..c635c9c6ba --- /dev/null +++ b/src/store/gateway/index.ts @@ -0,0 +1,17 @@ +import { createApi, fakeBaseQuery } from '@reduxjs/toolkit/query/react' + +import { TransactionListPage } from '@safe-global/safe-gateway-typescript-sdk' +import { TxHistoryListParams } from './transactions-history/types' +import { getTxHistoryList } from './transactions-history' + +export const gatewayApi = createApi({ + reducerPath: 'gatewayApi', + baseQuery: fakeBaseQuery(), + endpoints: (builder) => ({ + getTransactionsHistory: builder.query({ + queryFn: getTxHistoryList, + }), + }), +}) + +export const { useGetTransactionsHistoryQuery } = gatewayApi diff --git a/src/store/gateway/transactions-history/index.ts b/src/store/gateway/transactions-history/index.ts new file mode 100644 index 0000000000..4c35e815ea --- /dev/null +++ b/src/store/gateway/transactions-history/index.ts @@ -0,0 +1,16 @@ +import { getTransactionHistory } from '@safe-global/safe-gateway-typescript-sdk' +import { buildQueryFn } from '../utils' +import { TxHistoryListParams } from './types' + +export const getTxHistoryList = ({ chainId, safeAddress, pageUrl }: TxHistoryListParams) => { + return buildQueryFn(() => + getTransactionHistory( + chainId, + safeAddress, + { + trusted: false, + }, + pageUrl, + ), + ) +} diff --git a/src/store/gateway/transactions-history/types.ts b/src/store/gateway/transactions-history/types.ts new file mode 100644 index 0000000000..9476b5e450 --- /dev/null +++ b/src/store/gateway/transactions-history/types.ts @@ -0,0 +1,5 @@ +export interface TxHistoryListParams { + chainId: string + safeAddress: string + pageUrl?: string +} diff --git a/src/store/gateway/utils.ts b/src/store/gateway/utils.ts new file mode 100644 index 0000000000..7fb509aa95 --- /dev/null +++ b/src/store/gateway/utils.ts @@ -0,0 +1,9 @@ +import { asError } from '@/src/services/exceptions/utils' + +export async function buildQueryFn(fn: () => Promise) { + try { + return { data: await fn() } + } catch (error) { + return { error: asError(error) } + } +} diff --git a/src/store/index.ts b/src/store/index.ts index 032ace9eaf..a800909aff 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -2,6 +2,7 @@ import { combineReducers, configureStore } from '@reduxjs/toolkit' import { persistStore, persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist' import { reduxStorage } from './storage' import txHistory from './txHistorySlice' +import activeChain from './activeChainSlice' import { gatewayApi } from './gateway' import devToolsEnhancer from 'redux-devtools-expo-dev-plugin' import { isTestingEnv } from '../config/constants' @@ -14,6 +15,7 @@ const persistConfig = { } export const rootReducer = combineReducers({ txHistory, + activeChain, [gatewayApi.reducerPath]: gatewayApi.reducer, }) From db8f9b8b70a143c2d6ecfba719aaed926becdf4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=B3vis=20Neto?= Date: Mon, 11 Nov 2024 10:36:05 +0100 Subject: [PATCH 09/49] featr: Create static pending transactions screen (#18) * feat: create pending tx screen * feat: add pending transactions static layout in the home screen * feat: add pending transactions slice in the api gateway * feat: add new variant in the Alert component * feat: create CircularBadge component to use it as the circular icon with text * feat: put groupTx to respect SOLID definition * feat: add lodash as project dependency * feat: add missing parameters in the TxCards components * feat: adjust reusable components layout * feat: create pending transactions screen * feat: generated snapshots --- app/(tabs)/index.tsx | 50 ++++++++++- app/(tabs)/transactions/_layout.tsx | 2 +- app/_layout.tsx | 1 + app/pending-transactions.tsx | 50 +++++++++++ ios/safemobileapp.xcodeproj/project.pbxproj | 54 ++++++------ ios/safemobileapp/Info.plist | 11 +-- package-lock.json | 12 ++- package.json | 2 + .../Alert/__snapshots__/Alert.test.tsx.snap | 86 +++++++++++++++---- src/components/Alert/index.tsx | 6 +- src/components/CircularBadge/index.tsx | 24 ++++++ src/components/Container/index.tsx | 8 +- src/components/SafeListItem/index.tsx | 51 ++++++++++- .../PendingTransactions.stories.tsx | 2 +- .../PendingTransactions.test.tsx.snap | 66 ++++++++------ .../PendingTransactions/index.tsx | 16 ++-- src/components/Title/index.tsx | 1 + src/components/TxInfo/index.tsx | 50 +++++++++-- .../Card/TxBatchCard/index.tsx | 8 +- .../Card/TxConflictingCard/index.tsx | 32 +++++++ .../Card/TxContractInteractionCard/index.tsx | 8 +- .../Card/TxCreationCard/index.tsx | 8 +- .../Card/TxGroupedCard/index.tsx | 5 +- .../Card/TxRejectionCard/index.tsx | 8 +- .../Card/TxSafeAppCard/index.tsx | 8 +- .../Card/TxSettingsCard/index.tsx | 8 +- .../Card/TxSwapCard/index.tsx | 8 +- .../Card/TxTokenCard/index.tsx | 8 +- src/features/PendingTx/PendingTxList.tsx | 53 ++++++++++++ src/features/PendingTx/index.tsx | 11 +++ src/features/TxHistory/TxHistoryList.tsx | 4 +- src/features/TxHistory/index.tsx | 4 +- src/features/TxHistory/utils.tsx | 51 ++++++++++- src/hooks/usePendingTxs/index.ts | 50 +++++++++++ src/store/gateway.ts | 37 -------- src/store/gateway/index.ts | 9 +- .../gateway/pending-transactions/index.ts | 16 ++++ .../gateway/pending-transactions/types.ts | 5 ++ src/theme/palettes/darkPalette.ts | 4 +- src/theme/palettes/lightPalette.ts | 6 +- src/theme/tamagui.config.ts | 14 ++- src/utils/transaction-guards.ts | 8 ++ 42 files changed, 687 insertions(+), 178 deletions(-) create mode 100644 app/pending-transactions.tsx create mode 100644 src/components/CircularBadge/index.tsx create mode 100644 src/components/transactions-list/Card/TxConflictingCard/index.tsx create mode 100644 src/features/PendingTx/PendingTxList.tsx create mode 100644 src/features/PendingTx/index.tsx create mode 100644 src/hooks/usePendingTxs/index.ts delete mode 100644 src/store/gateway.ts create mode 100644 src/store/gateway/pending-transactions/index.ts create mode 100644 src/store/gateway/pending-transactions/types.ts diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index 23d77ce9b7..1f685c4654 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -1,10 +1,54 @@ -import { Alert } from '@/src/components/Alert' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import PendingTransactions from '@/src/components/StatusBanners/PendingTransactions' +import usePendingTxs from '@/src/hooks/usePendingTxs' +import { router } from 'expo-router' +import { StyleSheet, TouchableOpacity } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' +import { Avatar, Text, View } from 'tamagui' export default function HomeScreen() { + const { amount, hasMore, isLoading } = usePendingTxs() + + const onPendingTransactionsPress = () => { + router.push('/pending-transactions') + } + return ( - - + + + + + + + + + + + My DAO + + + + + + + + + + + ) } + +export const styles = StyleSheet.create({ + content: { + paddingHorizontal: 10, + }, +}) diff --git a/app/(tabs)/transactions/_layout.tsx b/app/(tabs)/transactions/_layout.tsx index d67db282df..bb1d7f860f 100644 --- a/app/(tabs)/transactions/_layout.tsx +++ b/app/(tabs)/transactions/_layout.tsx @@ -8,7 +8,7 @@ import { View } from 'tamagui' const TransactiosHeader = () => ( - + <Title marginBottom="$8" testID="welcome-title"> Transactions diff --git a/app/_layout.tsx b/app/_layout.tsx index a0ba3eaf5a..22d5bf94de 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -18,6 +18,7 @@ function RootLayout() { + diff --git a/app/pending-transactions.tsx b/app/pending-transactions.tsx new file mode 100644 index 0000000000..2b6b2f7c78 --- /dev/null +++ b/app/pending-transactions.tsx @@ -0,0 +1,50 @@ +import CircularBadge from '@/src/components/CircularBadge' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import Title from '@/src/components/Title' +import PendingTx from '@/src/features/PendingTx' +import usePendingTxs from '@/src/hooks/usePendingTxs' +import { router } from 'expo-router' +import React from 'react' +import { StyleSheet } from 'react-native' +import { SafeAreaView } from 'react-native-safe-area-context' +import { Button, Spinner, View } from 'tamagui' + +function PendingScreen() { + const { amount, isLoading, hasMore } = usePendingTxs() + + return ( + + + + ) +} diff --git a/src/components/EthAddress/index.stories.tsx b/src/components/EthAddress/index.stories.tsx new file mode 100644 index 0000000000..006cd3675b --- /dev/null +++ b/src/components/EthAddress/index.stories.tsx @@ -0,0 +1,25 @@ +import type { StoryObj, Meta } from '@storybook/react' +import { EthAddress } from '@/src/components/EthAddress' + +const meta: Meta = { + title: 'EthAddress', + component: EthAddress, + args: {}, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + address: '0xA77DE01e157f9f57C7c4A326eeE9C4874D0598b6', + }, +} + +export const WithCopy: Story = { + args: { + address: '0xA77DE01e157f9f57C7c4A326eeE9C4874D0598b6', + copy: true, + }, +} diff --git a/src/components/EthAddress/index.tsx b/src/components/EthAddress/index.tsx new file mode 100644 index 0000000000..08cecb995e --- /dev/null +++ b/src/components/EthAddress/index.tsx @@ -0,0 +1,20 @@ +import { Address } from '@/src/types/address' +import { shortenAddress } from '@/src/utils/formatters' +import { Text, type TextProps, View } from 'tamagui' +import { CopyButton } from '@/src/components/CopyButton' + +type Props = { + address: Address + copy?: boolean + textProps?: Partial +} +export const EthAddress = ({ address, copy, textProps }: Props) => { + return ( + + + {shortenAddress(address)} + + {copy && } + + ) +} diff --git a/src/components/Identicon/Identicon.stories.tsx b/src/components/Identicon/Identicon.stories.tsx new file mode 100644 index 0000000000..4c308a3f9f --- /dev/null +++ b/src/components/Identicon/Identicon.stories.tsx @@ -0,0 +1,26 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { Identicon } from '@/src/components/Identicon' +import { type Address } from '@/src/types/address' + +const defaultProps = { + address: '0xA77DE01e157f9f57C7c4A326eeE9C4874D0598b6' as Address, + size: 56, +} +const meta: Meta = { + title: 'Identicon', + component: Identicon, + args: defaultProps, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = {} + +export const Rounded: Story = { + args: { + ...defaultProps, + rounded: true, + }, +} diff --git a/src/components/Identicon/Identicon.test.tsx b/src/components/Identicon/Identicon.test.tsx new file mode 100644 index 0000000000..31114eebe9 --- /dev/null +++ b/src/components/Identicon/Identicon.test.tsx @@ -0,0 +1,36 @@ +import React from 'react' +import { render } from '@testing-library/react-native' +import { Identicon } from './index' + +describe('Identicon', () => { + it('renders correctly with address', () => { + const { getByTestId } = render() + const image = getByTestId('identicon-image') + expect(image).toBeTruthy() + }) + + it('applies rounded style when rounded prop is true', () => { + const { getByTestId } = render() + const image = getByTestId('identicon-image') + expect(image.props.style.borderRadius).toBe('50%') + }) + + it('applies default size when size prop is not provided', () => { + const { getByTestId } = render() + const image = getByTestId('identicon-image') + expect(image.props.style.width).toBe(56) + expect(image.props.style.height).toBe(56) + }) + + it('applies custom size when size prop is provided', () => { + const { getByTestId } = render() + const image = getByTestId('identicon-image') + expect(image.props.style.width).toBe(100) + expect(image.props.style.height).toBe(100) + }) + + it('returns null when address is not provided', () => { + const { queryByTestId } = render() + expect(queryByTestId('identicon-image')).toBeNull() + }) +}) diff --git a/src/components/Identicon/index.tsx b/src/components/Identicon/index.tsx new file mode 100644 index 0000000000..a8aaccdf51 --- /dev/null +++ b/src/components/Identicon/index.tsx @@ -0,0 +1,22 @@ +import { blo } from 'blo' +import { Image } from 'expo-image' +import { type Address } from '@/src/types/address' + +type Props = { + address: Address + rounded?: boolean + size?: number +} + +const DEFAULT_SIZE = 56 +export const Identicon = ({ address, rounded, size }: Props) => { + const style = { + borderRadius: rounded ? '50%' : 0, + width: size ? size : DEFAULT_SIZE, + height: size ? size : DEFAULT_SIZE, + } + + const blockie = blo(address) + + return +} diff --git a/src/components/SafeListItem/index.tsx b/src/components/SafeListItem/index.tsx index 6147bd16cb..e2abbb31a0 100644 --- a/src/components/SafeListItem/index.tsx +++ b/src/components/SafeListItem/index.tsx @@ -5,6 +5,7 @@ import { IconProps, SafeFontIcon } from '../SafeFontIcon/SafeFontIcon' import { ellipsis } from '@/src/utils/formatters' import { isMultisigExecutionInfo } from '@/src/utils/transaction-guards' import { Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' +import Badge from '../Badge' interface SafeListItemProps { type?: string @@ -69,27 +70,23 @@ function SafeListItem({ {inQueue && executionInfo && isMultisigExecutionInfo(executionInfo) ? ( - - - + + - - {executionInfo?.confirmationsSubmitted}/{executionInfo?.confirmationsRequired} - - - + + {executionInfo?.confirmationsSubmitted}/{executionInfo?.confirmationsRequired} + + + } + themeName={ + executionInfo?.confirmationsRequired === executionInfo?.confirmationsSubmitted + ? 'badge_success_variant1' + : 'badge_warning_variant1' + } + /> diff --git a/src/components/StatusBanners/PendingTransactions/index.tsx b/src/components/StatusBanners/PendingTransactions/index.tsx index b6d2856d47..ff1995cd04 100644 --- a/src/components/StatusBanners/PendingTransactions/index.tsx +++ b/src/components/StatusBanners/PendingTransactions/index.tsx @@ -2,7 +2,7 @@ import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' import React from 'react' import { Alert } from '../../Alert' -import CircularBadge from '../../CircularBadge' +import Badge from '../../Badge' import { Spinner } from 'tamagui' interface Props { @@ -13,11 +13,7 @@ interface Props { } const PendingTransactions = ({ number, isLoading, fullWidth, onPress }: Props) => { - const startIcon = isLoading ? ( - - ) : ( - - ) + const startIcon = isLoading ? : const endIcon = return ( diff --git a/src/features/Notifications/index.tsx b/src/features/Notifications/index.tsx new file mode 100644 index 0000000000..d5f4f2db80 --- /dev/null +++ b/src/features/Notifications/index.tsx @@ -0,0 +1,10 @@ +import { View, Text } from 'tamagui' +import React from 'react' + +export const Notifications = () => { + return ( + + Notifications + + ) +} diff --git a/src/features/PendingTx/PendingTxList.tsx b/src/features/PendingTx/PendingTxList.tsx index cdef37f3b8..6c2b913422 100644 --- a/src/features/PendingTx/PendingTxList.tsx +++ b/src/features/PendingTx/PendingTxList.tsx @@ -2,7 +2,7 @@ import SafeListItem from '@/src/components/SafeListItem' import React from 'react' import { SectionList } from 'react-native' import { Spinner, View } from 'tamagui' -import CircularBadge from '@/src/components/CircularBadge' +import Badge from '../../components/Badge' import { NavBarTitle } from '@/src/components/Title/NavBarTitle' import { LargeHeaderTitle } from '@/src/components/Title/LargeHeaderTitle' import { useScrollableHeader } from '@/src/navigation/useScrollableHeader' @@ -28,7 +28,7 @@ function PendingTxList({ transactions, onEndReached, isLoading, hasMore, amount children: ( <> Pending Transactions - + ), }) @@ -40,7 +40,7 @@ function PendingTxList({ transactions, onEndReached, isLoading, hasMore, amount {isLoading ? ( ) : ( - + )} ) diff --git a/src/features/Settings/AppSettings.tsx b/src/features/Settings/AppSettings.tsx new file mode 100644 index 0000000000..996b1445eb --- /dev/null +++ b/src/features/Settings/AppSettings.tsx @@ -0,0 +1,40 @@ +import { View, Text, Input } from 'tamagui' +import { TouchableOpacity } from 'react-native' +import React, { useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { selectActiveChain } from '@/src/store/activeChainSlice' +import { setActiveSafe } from '@/src/store/activeSafeSlice' +import { Address } from '@/src/types/address' + +export const AppSettings = () => { + const dispatch = useDispatch() + const activeChain = useSelector(selectActiveChain) + const [safeAddress, setSafeAddress] = useState('') + + const handleSubmit = () => { + dispatch( + setActiveSafe({ + chainId: activeChain.chainId, + address: safeAddress as Address, + }), + ) + } + return ( + + + + + Set Safe Address + + + + ) +} diff --git a/src/features/Settings/components/IdenticonWithBadge.tsx b/src/features/Settings/components/IdenticonWithBadge.tsx new file mode 100644 index 0000000000..a51c3b6832 --- /dev/null +++ b/src/features/Settings/components/IdenticonWithBadge.tsx @@ -0,0 +1,46 @@ +import { View } from 'tamagui' +import { Identicon } from '@/src/components/Identicon' +import { Skeleton } from 'moti/skeleton' +import Badge from '@/src/components/Badge' +import React from 'react' +import { StyleSheet } from 'react-native' +import { Address } from '@/src/types/address' + +type Props = { + address: Address + badgeContent?: string +} + +export const IdenticonWithBadge = ({ address, badgeContent }: Props) => { + return ( + + + + + {badgeContent && ( + + )} + + + + ) +} + +const styles = StyleSheet.create({ + container: { + position: 'relative', + }, + badge: { + position: 'absolute', + top: -5, + right: -10, + }, +}) diff --git a/src/features/Settings/components/Navbar/Navbar.tsx b/src/features/Settings/components/Navbar/Navbar.tsx new file mode 100644 index 0000000000..37cb25391c --- /dev/null +++ b/src/features/Settings/components/Navbar/Navbar.tsx @@ -0,0 +1,13 @@ +import React from 'react' +import { View } from 'tamagui' +import { SettingsMenu } from '@/src/features/Settings/components/Navbar/SettingsMenu' +import { SettingsButton } from '@/src/features/Settings/components/Navbar/SettingsButton' + +export const Navbar = (props: { safeAddress: string }) => { + return ( + + + + + ) +} diff --git a/src/features/Settings/components/Navbar/SettingsButton.tsx b/src/features/Settings/components/Navbar/SettingsButton.tsx new file mode 100644 index 0000000000..927a388d7f --- /dev/null +++ b/src/features/Settings/components/Navbar/SettingsButton.tsx @@ -0,0 +1,21 @@ +import { Button } from 'tamagui' +import { router } from 'expo-router' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import React from 'react' + +export const SettingsButton = () => { + return ( + + ) +} diff --git a/src/features/Settings/components/Navbar/SettingsMenu.tsx b/src/features/Settings/components/Navbar/SettingsMenu.tsx new file mode 100644 index 0000000000..72eac7a71b --- /dev/null +++ b/src/features/Settings/components/Navbar/SettingsMenu.tsx @@ -0,0 +1,146 @@ +import { Button, useTheme } from 'tamagui' +import { MenuView, NativeActionEvent } from '@react-native-menu/menu' +import { Linking, Platform } from 'react-native' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import React from 'react' +import { selectActiveChain } from '@/src/store/activeChainSlice' +import { useSelector } from 'react-redux' +import { getExplorerLink } from '@/src/utils/gateway' +import { useCopyAndDispatchToast } from '@/src/hooks/useCopyAndDispatchToast' +import { useToastController } from '@tamagui/toast' + +type Props = { + safeAddress: string | undefined +} +export const SettingsMenu = ({ safeAddress }: Props) => { + const toast = useToastController() + const activeChain = useSelector(selectActiveChain) + const copyAndDispatchToast = useCopyAndDispatchToast() + const theme = useTheme() + const color = theme.color?.get() + const colorError = 'red' + + const toBeImplemented = () => { + toast.show('This feature is not implemented yet.', { + native: true, + duration: 2000, + burntOptions: { + preset: 'error', + }, + }) + } + if (!safeAddress) { + return null + } + + return ( + { + console.warn(JSON.stringify(nativeEvent)) + + if (nativeEvent.event === 'rename') { + console.log('rename') + toBeImplemented() + } + + if (nativeEvent.event === 'explorer') { + const link = getExplorerLink(safeAddress, activeChain.blockExplorerUriTemplate) + Linking.openURL(link.href) + } + + if (nativeEvent.event === 'copy') { + console.log('copy') + copyAndDispatchToast(safeAddress) + } + + if (nativeEvent.event === 'remove') { + console.log('remove') + toBeImplemented() + } + + if (nativeEvent.event === 'share') { + console.log('share') + toBeImplemented() + } + }} + color={color} + destructiveColor={colorError} + /> + ) +} + +type MenuProps = { + onPressAction: (event: NativeActionEvent) => void + color: string + destructiveColor: string +} +const Menu = ({ onPressAction, color, destructiveColor }: MenuProps) => { + return ( + + + + ) +} diff --git a/src/features/Settings/index.tsx b/src/features/Settings/index.tsx index ce328c4425..b93138f710 100644 --- a/src/features/Settings/index.tsx +++ b/src/features/Settings/index.tsx @@ -1,38 +1,148 @@ -import { useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { setActiveSafe } from '../../store/activeSafeSlice' // You'll need to create this action -import { selectActiveChain } from '@/src/store/activeChainSlice' -import { View, Text, Input } from 'tamagui' -import { TouchableOpacity } from 'react-native' - -export const SafeAddressInput = () => { - const dispatch = useDispatch() - const activeChain = useSelector(selectActiveChain) - const [safeAddress, setSafeAddress] = useState('') - - const handleSubmit = () => { - dispatch( - setActiveSafe({ - chainId: activeChain.chainId, - address: safeAddress, - }), - ) - } +import React, { useEffect } from 'react' +import { H2, ScrollView, Text, View, XStack, YStack } from 'tamagui' +import { SafeFontIcon as Icon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import SafeListItem from '@/src/components/SafeListItem' +import { useGetSafeQuery } from '@/src/store/gateway' +import { Skeleton } from 'moti/skeleton' +import { Pressable } from 'react-native' +import { EthAddress } from '@/src/components/EthAddress' +import { SafeState } from '@/src/store/gateway/AUTO_GENERATED/safes' +import { Address } from '@/src/types/address' +import { router, useNavigation } from 'expo-router' +import { IdenticonWithBadge } from '@/src/features/Settings/components/IdenticonWithBadge' +import { useSelector } from 'react-redux' +import { selectActiveSafe } from '@/src/store/activeSafeSlice' + +export const Settings = () => { + const navigation = useNavigation() + const { chainId, address } = useSelector(selectActiveSafe) + const { data = {} as SafeState } = useGetSafeQuery({ + chainId: chainId, + safeAddress: address, + }) + + useEffect(() => { + navigation.setParams({ + safeAddress: address, + }) + }, [address]) + + const { owners = [], threshold, implementation } = data return ( - - - - Set Safe Address - - + + + + + +

+ My DAO +

+ + + + + + + saaafe.xyz + + +
+ + + + + + + {owners.length} + + + + + Signers + + + + + + + + {threshold}/{owners.length} + + + + + Threshold + + + + + + + Members + [{ opacity: pressed ? 0.5 : 1.0 }]} + onPress={() => { + router.push('/signers') + }} + > + } + rightNode={ + + + + {owners.length} + + + + + + + } + /> + + + + + General + + [{ opacity: pressed ? 0.5 : 1.0 }]} + onPress={() => { + router.push('/notifications') + }} + > + } + rightNode={} + /> + + + + +
+ + {/* Footer */} + + {implementation?.name} + +
+
) } diff --git a/src/features/Signers/index.tsx b/src/features/Signers/index.tsx new file mode 100644 index 0000000000..286e2985af --- /dev/null +++ b/src/features/Signers/index.tsx @@ -0,0 +1,9 @@ +import { View, Text } from 'tamagui' + +export const Signers = () => { + return ( + + Signers + + ) +} diff --git a/src/hooks/useCopyAndDispatchToast/index.ts b/src/hooks/useCopyAndDispatchToast/index.ts new file mode 100644 index 0000000000..1d3f365a76 --- /dev/null +++ b/src/hooks/useCopyAndDispatchToast/index.ts @@ -0,0 +1,13 @@ +import { useToastController } from '@tamagui/toast' +import Clipboard from '@react-native-clipboard/clipboard' + +export const useCopyAndDispatchToast = () => { + const toast = useToastController() + return (value: string) => { + Clipboard.setString(value) + toast.show('Address copied.', { + native: false, + duration: 2000, + }) + } +} diff --git a/src/hooks/useCopyAndDispatchToast/useCopyAndDisptachToast.test.tsx b/src/hooks/useCopyAndDispatchToast/useCopyAndDisptachToast.test.tsx new file mode 100644 index 0000000000..20126ff75a --- /dev/null +++ b/src/hooks/useCopyAndDispatchToast/useCopyAndDisptachToast.test.tsx @@ -0,0 +1,50 @@ +import { renderHook, act } from '@/src/tests/test-utils' +import Clipboard from '@react-native-clipboard/clipboard' +import { useToastController } from '@tamagui/toast' +import { useCopyAndDispatchToast } from './index' + +jest.mock('@react-native-clipboard/clipboard', () => ({ + setString: jest.fn(), +})) + +jest.mock('@tamagui/toast', () => ({ + useToastController: jest.fn(), +})) + +describe('useCopyAndDispatchToast', () => { + const mockShow = jest.fn() + + beforeEach(() => { + ;(useToastController as jest.Mock).mockReturnValue({ + show: mockShow, + }) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('copies the provided value to the clipboard', () => { + const { result } = renderHook(() => useCopyAndDispatchToast()) + const testValue = 'Test Clipboard Value' + + act(() => { + result.current(testValue) + }) + + expect(Clipboard.setString).toHaveBeenCalledWith(testValue) + }) + + it('displays a toast message after copying', () => { + const { result } = renderHook(() => useCopyAndDispatchToast()) + + act(() => { + result.current('Any Value') + }) + + expect(mockShow).toHaveBeenCalledWith('Address copied.', { + native: false, + duration: 2000, + }) + }) +}) diff --git a/src/store/activeSafeSlice.ts b/src/store/activeSafeSlice.ts index cfc598b8ec..f600545480 100644 --- a/src/store/activeSafeSlice.ts +++ b/src/store/activeSafeSlice.ts @@ -1,8 +1,9 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit' +import { Address } from '@/src/types/address' import { RootState } from '.' interface SafeInfo { - address: string + address: Address chainId: string } diff --git a/src/theme/palettes/darkPalette.ts b/src/theme/palettes/darkPalette.ts index 9ccf59c95d..565d44ec91 100644 --- a/src/theme/palettes/darkPalette.ts +++ b/src/theme/palettes/darkPalette.ts @@ -57,6 +57,7 @@ const darkPalette = { main: '#121312', paper: '#1C1C1C', light: '#1B2A22', + skeleton: 'rgba(255, 255, 255, 0.04)', }, backdrop: { main: '#636669', diff --git a/src/theme/palettes/lightPalette.ts b/src/theme/palettes/lightPalette.ts index 0fbdb8fb1e..a8f1140c6c 100644 --- a/src/theme/palettes/lightPalette.ts +++ b/src/theme/palettes/lightPalette.ts @@ -57,6 +57,7 @@ const lightPalette = { main: '#FFFFFF', paper: '#F4F4F4', light: '#EFFFF4', + skeleton: 'rgba(255, 255, 255, 0.04)', }, backdrop: { main: '#636669', diff --git a/src/theme/provider/toastProvider.tsx b/src/theme/provider/toastProvider.tsx new file mode 100644 index 0000000000..7072d20631 --- /dev/null +++ b/src/theme/provider/toastProvider.tsx @@ -0,0 +1,48 @@ +import React from 'react' +import { Toast, ToastProvider, ToastViewport, useToastState } from '@tamagui/toast' +import { useSafeAreaInsets } from 'react-native-safe-area-context' +import { YStack } from 'tamagui' + +interface SafeThemeProviderProps { + children: React.ReactNode +} + +export const SafeToastProvider = ({ children }: SafeThemeProviderProps) => { + const { top } = useSafeAreaInsets() + + return ( + + {children} + + + + ) +} + +const CurrentToast = () => { + const currentToast = useToastState() + + if (!currentToast || currentToast.isHandledNatively) { + return null + } + + return ( + + + {currentToast.title} + {!!currentToast.message && {currentToast.message}} + + + ) +} diff --git a/src/theme/tamagui.config.ts b/src/theme/tamagui.config.ts index c29670c896..72d1390768 100644 --- a/src/theme/tamagui.config.ts +++ b/src/theme/tamagui.config.ts @@ -1,46 +1,8 @@ -import { radius, zIndex } from '@tamagui/themes' -import { createTamagui, createTokens } from 'tamagui' +import { createTamagui } from 'tamagui' import { createDmSansFont } from '@tamagui/font-dm-sans' -import { flattenPalette } from '@/src/theme/helpers/utils' -import lightPalette from '@/src/theme/palettes/lightPalette' -import darkPalette from '@/src/theme/palettes/darkPalette' - -const colors = { - ...flattenPalette(lightPalette, { suffix: 'Light' }), - ...flattenPalette(darkPalette, { suffix: 'Dark' }), -} -export const tokens = createTokens({ - color: colors, - space: { - $1: 4, - $2: 8, - true: 8, - $3: 12, - $4: 16, - $5: 20, - $6: 24, - $7: 28, - $8: 32, - $9: 36, - $10: 40, - }, - // space, - size: { - $1: 4, - $2: 8, - true: 8, - $3: 12, - $4: 16, - $5: 20, - $6: 24, - $7: 28, - $8: 32, - $9: 36, - $10: 40, - }, - zIndex, - radius, -}) +import { badgeTheme } from '@/src/components/Badge/theme' +import { tokens } from '@/src/theme/tokens' +import { createAnimations } from '@tamagui/animations-moti' const DmSansFont = createDmSansFont({ face: { @@ -63,10 +25,11 @@ export const config = createTamagui({ backgroundFocus: tokens.color.backgroundMainLight, backgroundStrong: tokens.color.primaryDarkLight, backgroundTransparent: 'transparent', + backgroundSkeleton: tokens.color.backgroundSkeletonLight, color: tokens.color.textPrimaryLight, primary: tokens.color.primaryMainLight, - colorSecondary: tokens.color.primaryLightLight, colorHover: tokens.color.textSecondaryLight, + colorSecondary: tokens.color.textSecondaryLight, borderLight: tokens.color.borderLightLight, error: tokens.color.errorMainLight, errorDark: tokens.color.errorDarkDark, @@ -85,27 +48,26 @@ export const config = createTamagui({ background: tokens.color.infoBackgroundDark, color: tokens.color.infoMainDark, }, + ...badgeTheme, light_success: { background: tokens.color.successBackgroundLight, color: tokens.color.successMainLight, badgeBackground: tokens.color.successDarkLight, + badgeTextColor: tokens.color.backgroundMainDark, }, dark_success: { background: tokens.color.successBackgroundDark, color: tokens.color.successMainDark, badgeBackground: tokens.color.successDarkDark, }, + dark_success_light: {}, light_warning: { background: tokens.color.warning1MainLight, color: tokens.color.warning1ContrastTextLight, - badgeTextColor: tokens.color.warning1MainLight, - badgeBackground: tokens.color.warningBackgroundLight, }, dark_warning: { background: tokens.color.warning1MainDark, color: tokens.color.warning1ContrastTextDark, - badgeBackground: tokens.color.warningDarkDark, - badgeTextColor: tokens.color.backgroundDefaultDark, }, light_error: { background: tokens.color.error1MainLight, @@ -138,15 +100,66 @@ export const config = createTamagui({ backgroundFocus: tokens.color.backgroundMainDark, backgroundStrong: tokens.color.primaryDarkDark, backgroundTransparent: 'transparent', + backgroundSkeleton: tokens.color.backgroundSkeletonLight, color: tokens.color.textPrimaryDark, primary: tokens.color.primaryMainDark, - colorSecondary: tokens.color.primaryLightDark, borderLight: tokens.color.borderLightDark, + colorHover: tokens.color.textSecondaryDark, + colorSecondary: tokens.color.textSecondaryDark, error: tokens.color.errorMainDark, errorDark: tokens.color.errorDarkDark, }, }, tokens, + animations: createAnimations({ + fast: { + type: 'spring', + damping: 20, + mass: 1.2, + stiffness: 250, + }, + medium: { + type: 'spring', + damping: 10, + mass: 0.9, + stiffness: 100, + }, + slow: { + type: 'spring', + damping: 20, + stiffness: 60, + }, + '100ms': { + type: 'timing', + duration: 100, + }, + '200ms': { + type: 'timing', + duration: 200, + }, + bouncy: { + type: 'spring', + damping: 10, + mass: 0.9, + stiffness: 100, + }, + lazy: { + type: 'spring', + damping: 20, + stiffness: 60, + }, + quick: { + type: 'spring', + damping: 20, + mass: 1.2, + stiffness: 250, + }, + tooltip: { + damping: 10, + mass: 0.9, + stiffness: 100, + }, + }), }) export type Conf = typeof config diff --git a/src/theme/tokens.ts b/src/theme/tokens.ts new file mode 100644 index 0000000000..5486830953 --- /dev/null +++ b/src/theme/tokens.ts @@ -0,0 +1,41 @@ +import { createTokens } from 'tamagui' +import { radius, zIndex } from '@tamagui/themes' +import { flattenPalette } from '@/src/theme/helpers/utils' +import lightPalette from '@/src/theme/palettes/lightPalette' +import darkPalette from '@/src/theme/palettes/darkPalette' +const colors = { + ...flattenPalette(lightPalette, { suffix: 'Light' }), + ...flattenPalette(darkPalette, { suffix: 'Dark' }), +} +export const tokens = createTokens({ + color: colors, + space: { + $1: 4, + $2: 8, + true: 8, + $3: 12, + $4: 16, + $5: 20, + $6: 24, + $7: 28, + $8: 32, + $9: 36, + $10: 40, + }, + // space, + size: { + $1: 4, + $2: 8, + true: 8, + $3: 12, + $4: 16, + $5: 20, + $6: 24, + $7: 28, + $8: 32, + $9: 36, + $10: 40, + }, + zIndex, + radius, +}) diff --git a/src/types/address.ts b/src/types/address.ts new file mode 100644 index 0000000000..816b1b8638 --- /dev/null +++ b/src/types/address.ts @@ -0,0 +1 @@ +export type Address = `0x${string}` diff --git a/src/types/navigation.d.ts b/src/types/navigation.d.ts new file mode 100644 index 0000000000..a35d3214c2 --- /dev/null +++ b/src/types/navigation.d.ts @@ -0,0 +1,11 @@ +// navigation.d.ts + +export interface Screens {} + +export declare global { + namespace ReactNavigation { + interface RootParamList extends Screens { + settings: { safeAddress?: string } + } + } +} diff --git a/src/utils/gateway.test.ts b/src/utils/gateway.test.ts new file mode 100644 index 0000000000..80d2c7e3ab --- /dev/null +++ b/src/utils/gateway.test.ts @@ -0,0 +1,62 @@ +import { getExplorerLink, getHashedExplorerUrl, _replaceTemplate } from './gateway' + +describe('gateway', () => { + describe('replaceTemplate', () => { + it('should replace template syntax with data', () => { + const uri = 'Hello {{this}}' + const data = { this: 'world' } + + const result = _replaceTemplate(uri, data) + expect(result).toEqual('Hello world') + }) + it("shouldn't replace non-template text", () => { + const uri = 'Hello this' + const data = { this: 'world' } + + const result = _replaceTemplate(uri, data) + expect(result).toEqual('Hello this') + }) + }) + + describe('getHashedExplorerUrl', () => { + it('should return a url with a transaction hash', () => { + const txHash = '0x4d32cc132307cde65b44162156f961ed421a84f83bb8cf3730c91f53374cc5de' + + const result = getHashedExplorerUrl(txHash, { + address: 'https://etherscan.io/address/{{address}}', + txHash: 'https://etherscan.io/tx/{{txHash}}', + api: 'https://api.etherscan.io/api?module={{module}}&action={{action}}&address={{address}}&apiKey={{apiKey}}', + }) + + expect(result).toEqual( + 'https://etherscan.io/tx/0x4d32cc132307cde65b44162156f961ed421a84f83bb8cf3730c91f53374cc5de', + ) + }) + it('should return a url with an address', () => { + const address = '0xabcdbc2ecb47642ee8cf52fd7b88fa42fbb69f98' + + const result = getHashedExplorerUrl(address, { + address: 'https://etherscan.io/address/{{address}}', + txHash: 'https://etherscan.io/tx/{{txHash}}', + api: 'https://api.etherscan.io/api?module={{module}}&action={{action}}&address={{address}}&apiKey={{apiKey}}', + }) + + expect(result).toEqual('https://etherscan.io/address/0xabcdbc2ecb47642ee8cf52fd7b88fa42fbb69f98') + }) + }) + + describe('getExplorerLink', () => { + it('should return an object with a href and title', () => { + const address = '0xabcdbc2ecb47642ee8cf52fd7b88fa42fbb69f98' + + const { href, title } = getExplorerLink(address, { + address: 'https://etherscan.io/address/{{address}}', + txHash: 'https://etherscan.io/tx/{{txHash}}', + api: 'https://api.etherscan.io/api?module={{module}}&action={{action}}&address={{address}}&apiKey={{apiKey}}', + }) + + expect(href).toEqual('https://etherscan.io/address/0xabcdbc2ecb47642ee8cf52fd7b88fa42fbb69f98') + expect(title).toEqual('View on etherscan.io') + }) + }) +}) diff --git a/src/utils/gateway.ts b/src/utils/gateway.ts new file mode 100644 index 0000000000..1f2bbc7650 --- /dev/null +++ b/src/utils/gateway.ts @@ -0,0 +1,28 @@ +import { type Chain } from '@/src/store/gateway/AUTO_GENERATED/chains' + +export const _replaceTemplate = (uri: string, data: Record): string => { + // Template syntax returned from gateway is {{this}} + const TEMPLATE_REGEX = /\{\{([^}]+)\}\}/g + + return uri.replace(TEMPLATE_REGEX, (_, key: string) => data[key]) +} + +export const getHashedExplorerUrl = ( + hash: string, + blockExplorerUriTemplate: Chain['blockExplorerUriTemplate'], +): string => { + const isTx = hash.length > 42 + const param = isTx ? 'txHash' : 'address' + + return _replaceTemplate(blockExplorerUriTemplate[param], { [param]: hash }) +} + +export const getExplorerLink = ( + hash: string, + blockExplorerUriTemplate: Chain['blockExplorerUriTemplate'], +): { href: string; title: string } => { + const href = getHashedExplorerUrl(hash, blockExplorerUriTemplate) + const title = `View on ${new URL(href).hostname}` + + return { href, title } +} From 8790c51cacdba85c0f1a98fa469893066c974347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=B3vis=20Neto?= Date: Wed, 27 Nov 2024 17:48:40 +0100 Subject: [PATCH 31/49] chore: adjust components folder structure (#40) * chore: add contributing.md file in the project * chore: generated snapshots * chore: change folder structures * chore: adjust contributing.md --- CONTRIBUTING.md | 62 ++++++++++ app/(tabs)/index.tsx | 2 +- app/(tabs)/transactions/(tabs)/messages.tsx | 2 +- .../{index.stories.tsx => Alert.stories.tsx} | 0 src/components/Alert/{index.tsx => Alert.tsx} | 0 src/components/Alert/index.ts | 3 + src/components/Badge/{index.tsx => Badge.tsx} | 4 +- src/components/Badge/badge.stories.tsx | 2 +- src/components/Badge/index.ts | 3 + ...ndex.stories.tsx => Container.stories.tsx} | 0 .../{index.test.tsx => Container.test.tsx} | 0 .../Container/{index.tsx => Container.tsx} | 0 ....test.tsx.snap => Container.test.tsx.snap} | 0 src/components/Container/index.ts | 3 + ...dex.stories.tsx => CopyButton.stories.tsx} | 0 .../CopyButton/{index.tsx => CopyButton.tsx} | 0 src/components/CopyButton/index.ts | 3 + ...{index.stories.tsx => DataRow.stories.tsx} | 0 .../{index.test.tsx => DataRow.test.tsx} | 0 .../DataRow/{index.tsx => DataRow.tsx} | 0 src/components/DataRow/index.ts | 2 + src/components/Dropdown/Dropdown.test.tsx | 2 +- .../Dropdown/{index.tsx => Dropdown.tsx} | 4 +- src/components/Dropdown/index.ts | 2 + ...dex.stories.tsx => ETHAddress.stories.tsx} | 0 .../EthAddress/{index.tsx => ETHAddress.tsx} | 0 src/components/EthAddress/index.ts | 2 + src/components/Fiat/Fiat.test.tsx | 2 +- src/components/Fiat/{index.tsx => Fiat.tsx} | 8 +- src/components/Fiat/index.ts | 2 + .../Identicon/{index.tsx => Identicon.tsx} | 0 src/components/Identicon/index.ts | 2 + .../InnerShadow/InnerShadow.test.tsx | 2 +- .../{index.tsx => InnerShadow.tsx} | 4 +- src/components/InnerShadow/index.ts | 2 + src/components/Logo/Logo.test.tsx | 2 +- src/components/Logo/{index.tsx => Logo.tsx} | 4 +- src/components/Logo/index.ts | 2 + src/components/SafeFontIcon/index.ts | 2 + .../SafeListItem/SafeListItem.test.tsx | 2 +- src/components/SafeListItem/SafeListItem.tsx | 112 +++++++++++++++++ .../__snapshots__/SafeListItem.test.tsx.snap | 4 +- src/components/SafeListItem/index.tsx | 116 +----------------- src/components/SafeTab/SafeTab.tsx | 37 ++++++ src/components/SafeTab/SafeTabBar.tsx | 9 +- src/components/SafeTab/index.tsx | 41 +------ .../PendingTransactions.stories.tsx | 2 +- .../PendingTransactions.test.tsx | 2 +- .../PendingTransactions.tsx | 30 +++++ .../PendingTransactions.test.tsx.snap | 2 +- .../PendingTransactions/index.tsx | 33 +---- src/components/Title/index.ts | 4 + src/components/TxInfo/TxInfo.tsx | 101 +++++++++++++++ src/components/TxInfo/index.tsx | 102 +-------------- src/components/navigation/index.ts | 2 + .../Card/AssetsCard/AssetsCard.test.tsx | 2 +- .../Card/AssetsCard/AssetsCard.tsx | 49 ++++++++ .../Card/AssetsCard/index.tsx | 46 +------ .../Card/TxBatchCard/TxBatchCard.stories.tsx | 2 +- .../Card/TxBatchCard/TxBatchCard.test.tsx | 2 +- .../Card/TxBatchCard/TxBatchCard.tsx | 40 ++++++ .../__snapshots__/TxBatchCard.test.tsx.snap | 4 +- .../Card/TxBatchCard/index.tsx | 44 +------ .../TxConflictingCard/TxConflictingCard.tsx | 32 +++++ .../Card/TxConflictingCard/index.tsx | 34 +---- .../TxContractInteractionCard.stories.tsx | 2 +- .../TxContractInteractionCard.test.tsx | 2 +- .../TxContractInteractionCard.tsx | 47 +++++++ .../Card/TxContractInteractionCard/index.tsx | 46 +------ .../TxCreationCard/TxCreationCard.stories.tsx | 2 +- .../TxCreationCard/TxCreationCard.test.tsx | 2 +- .../{index.tsx => TxCreationCard.tsx} | 8 +- .../Card/TxCreationCard/index.ts | 2 + .../TxGroupedCard/TxGroupedCard.stories.tsx | 2 +- .../Card/TxGroupedCard/TxGroupedCard.test.tsx | 2 +- .../Card/TxGroupedCard/TxGroupedCard.tsx | 58 +++++++++ .../Card/TxGroupedCard/index.tsx | 60 +-------- .../TxRejectionCard.stories.tsx | 2 +- .../TxRejectionCard/TxRejectionCard.test.tsx | 2 +- .../Card/TxRejectionCard/TxRejectionCard.tsx | 30 +++++ .../Card/TxRejectionCard/index.tsx | 34 +---- .../TxSafeAppCard/TxSafeAppCard.stories.tsx | 2 +- .../Card/TxSafeAppCard/TxSafeAppCard.test.tsx | 2 +- .../Card/TxSafeAppCard/TxSafeAppCard.tsx | 41 +++++++ .../Card/TxSafeAppCard/index.tsx | 45 +------ .../TxSettingsCard/TxSettingCard.stories.tsx | 2 +- .../TxSettingsCard/TxSettingCard.test.tsx | 4 +- .../Card/TxSettingsCard/TxSettingsCard.tsx | 35 ++++++ .../__snapshots__/TxSettingCard.test.tsx.snap | 2 +- .../Card/TxSettingsCard/index.tsx | 39 +----- .../Card/TxSwapCard/TxSwapCard.stories.tsx | 2 +- .../Card/TxSwapCard/TxSwapCard.test.tsx | 2 +- .../Card/TxSwapCard/TxSwapCard.tsx | 63 ++++++++++ .../__snapshots__/TxSwapCard.test.tsx.snap | 4 +- .../Card/TxSwapCard/index.tsx | 67 +--------- .../Card/TxTokenCard/TxTokenCard.stories.tsx | 2 +- .../Card/TxTokenCard/TxTokenCard.tsx | 102 +++++++++++++++ .../Card/TxTokenCard/index.tsx | 106 +--------------- .../Assets/components/AssetsHeader/index.tsx | 2 +- .../Assets/components/Balance/ChainItems.tsx | 2 +- .../Assets/components/Balance/index.tsx | 4 +- .../Assets/components/Fallback/index.tsx | 2 +- .../Assets/components/NFTs/NFTItem.tsx | 2 +- src/features/Assets/components/NFTs/index.tsx | 2 +- .../Assets/components/Tokens/index.tsx | 4 +- src/features/Assets/index.tsx | 2 +- src/features/PendingTx/PendingTxList.tsx | 4 +- src/features/PendingTx/utils.tsx | 8 +- .../components/IdenticonWithBadge.tsx | 2 +- src/features/Settings/index.tsx | 2 +- src/features/TxHistory/TxHistoryList.tsx | 2 +- src/features/TxHistory/utils.tsx | 4 +- 112 files changed, 979 insertions(+), 866 deletions(-) create mode 100644 CONTRIBUTING.md rename src/components/Alert/{index.stories.tsx => Alert.stories.tsx} (100%) rename src/components/Alert/{index.tsx => Alert.tsx} (100%) create mode 100644 src/components/Alert/index.ts rename src/components/Badge/{index.tsx => Badge.tsx} (97%) create mode 100644 src/components/Badge/index.ts rename src/components/Container/{index.stories.tsx => Container.stories.tsx} (100%) rename src/components/Container/{index.test.tsx => Container.test.tsx} (100%) rename src/components/Container/{index.tsx => Container.tsx} (100%) rename src/components/Container/__snapshots__/{index.test.tsx.snap => Container.test.tsx.snap} (100%) create mode 100644 src/components/Container/index.ts rename src/components/CopyButton/{index.stories.tsx => CopyButton.stories.tsx} (100%) rename src/components/CopyButton/{index.tsx => CopyButton.tsx} (100%) create mode 100644 src/components/CopyButton/index.ts rename src/components/DataRow/{index.stories.tsx => DataRow.stories.tsx} (100%) rename src/components/DataRow/{index.test.tsx => DataRow.test.tsx} (100%) rename src/components/DataRow/{index.tsx => DataRow.tsx} (100%) create mode 100644 src/components/DataRow/index.ts rename src/components/Dropdown/{index.tsx => Dropdown.tsx} (98%) create mode 100644 src/components/Dropdown/index.ts rename src/components/EthAddress/{index.stories.tsx => ETHAddress.stories.tsx} (100%) rename src/components/EthAddress/{index.tsx => ETHAddress.tsx} (100%) create mode 100644 src/components/EthAddress/index.ts rename src/components/Fiat/{index.tsx => Fiat.tsx} (80%) create mode 100644 src/components/Fiat/index.ts rename src/components/Identicon/{index.tsx => Identicon.tsx} (100%) create mode 100644 src/components/Identicon/index.ts rename src/components/InnerShadow/{index.tsx => InnerShadow.tsx} (80%) create mode 100644 src/components/InnerShadow/index.ts rename src/components/Logo/{index.tsx => Logo.tsx} (87%) create mode 100644 src/components/Logo/index.ts create mode 100644 src/components/SafeFontIcon/index.ts create mode 100644 src/components/SafeListItem/SafeListItem.tsx create mode 100644 src/components/SafeTab/SafeTab.tsx create mode 100644 src/components/StatusBanners/PendingTransactions/PendingTransactions.tsx create mode 100644 src/components/Title/index.ts create mode 100644 src/components/TxInfo/TxInfo.tsx create mode 100644 src/components/navigation/index.ts create mode 100644 src/components/transactions-list/Card/AssetsCard/AssetsCard.tsx create mode 100644 src/components/transactions-list/Card/TxBatchCard/TxBatchCard.tsx create mode 100644 src/components/transactions-list/Card/TxConflictingCard/TxConflictingCard.tsx create mode 100644 src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.tsx rename src/components/transactions-list/Card/TxCreationCard/{index.tsx => TxCreationCard.tsx} (81%) create mode 100644 src/components/transactions-list/Card/TxCreationCard/index.ts create mode 100644 src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.tsx create mode 100644 src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.tsx create mode 100644 src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.tsx create mode 100644 src/components/transactions-list/Card/TxSettingsCard/TxSettingsCard.tsx create mode 100644 src/components/transactions-list/Card/TxSwapCard/TxSwapCard.tsx create mode 100644 src/components/transactions-list/Card/TxTokenCard/TxTokenCard.tsx diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..ae2a2f2e9d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,62 @@ + +# React Native Code Guidelines + +## Code Structure + +### General Components +- Components that are used across multiple features should reside in the `src/components/` folder. +- Each component should have its own folder, structured as follows: + ``` + Alert/ + - Alert.tsx + - Alert.test.tsx + - Alert.stories.tsx + - index.tsx + ``` +- The main component implementation should be in a named file (e.g., `Alert.tsx`), and `index.tsx` should only be used for exporting the component. +- **Reason**: Using `index.tsx` allows for cleaner imports, e.g., + ``` + import { Alert } from 'src/components/Alert'; + ``` + instead of: + ``` + import { Alert } from 'src/components/Alert/Alert'; + ``` + +### Exporting Components +- **Always prefer named exports over default exports.** + - Named exports make it easier to refactor and identify exports in a codebase. + +### Features and Screens +- Feature-specific components and screens should be implemented inside the `src/features/` folder. + +#### Example: Feature File Structure +For a feature called **Assets**, the file structure might look like this: +``` +// src/features/Assets +- Assets.tsx +- index.tsx +``` +- `index.tsx` should only export the **Assets** component/container. + +#### Subcomponents for Features +- If a feature depends on multiple subcomponents unique to that feature, place them in a `components` subfolder. For example: +``` +// src/features/Assets/components/AssetHeader +- AssetHeaderPresentation.tsx +- AssetHeaderContainer.tsx +- index.tsx +``` + +### Presentation vs. Container Components +- **Presentation Components**: + - Responsible only for rendering the UI. + - Receive data and callbacks via props. + - Avoid direct manipulation of business logic. + - Simple business logic can be included but should generally be extracted into hooks. + +- **Container Components**: + - Handle business logic (e.g., state management, API calls, etc.). + - Pass necessary data and callbacks to the corresponding Presentation component. + + diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index 9393f5ab3a..a6c40199fa 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -7,7 +7,7 @@ import Assets from '@/src/features/Assets' import { useSelector } from 'react-redux' import { selectActiveSafe } from '@/src/store/activeSafeSlice' import { shortenAddress } from '@/src/utils/formatters' -import InnerShadow from '@/src/components/InnerShadow' +import { InnerShadow } from '@/src/components/InnerShadow' // TODO: take it from safe wallet slice info const fakeAccountUri = 'https://images.unsplash.com/photo-1531384441138-2736e62e0919?&w=100&h=100&dpr=2&q=80' diff --git a/app/(tabs)/transactions/(tabs)/messages.tsx b/app/(tabs)/transactions/(tabs)/messages.tsx index 876aa660c4..1748ff3e15 100644 --- a/app/(tabs)/transactions/(tabs)/messages.tsx +++ b/app/(tabs)/transactions/(tabs)/messages.tsx @@ -1,5 +1,5 @@ import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' -import SafeListItem from '@/src/components/SafeListItem' +import { SafeListItem } from '@/src/components/SafeListItem' import { formatWithSchema } from '@/src/utils/date' import React from 'react' import { ScrollView, Text, View } from 'tamagui' diff --git a/src/components/Alert/index.stories.tsx b/src/components/Alert/Alert.stories.tsx similarity index 100% rename from src/components/Alert/index.stories.tsx rename to src/components/Alert/Alert.stories.tsx diff --git a/src/components/Alert/index.tsx b/src/components/Alert/Alert.tsx similarity index 100% rename from src/components/Alert/index.tsx rename to src/components/Alert/Alert.tsx diff --git a/src/components/Alert/index.ts b/src/components/Alert/index.ts new file mode 100644 index 0000000000..67c990447c --- /dev/null +++ b/src/components/Alert/index.ts @@ -0,0 +1,3 @@ +import { Alert } from './Alert' + +export { Alert } diff --git a/src/components/Badge/index.tsx b/src/components/Badge/Badge.tsx similarity index 97% rename from src/components/Badge/index.tsx rename to src/components/Badge/Badge.tsx index 8d8d945d15..4db8b7b31e 100644 --- a/src/components/Badge/index.tsx +++ b/src/components/Badge/Badge.tsx @@ -17,7 +17,7 @@ interface BadgeProps { circular?: boolean } -const Badge = ({ +export const Badge = ({ content, circleSize = '$7', fontSize = 14, @@ -60,5 +60,3 @@ const Badge = ({ ) } - -export default Badge diff --git a/src/components/Badge/badge.stories.tsx b/src/components/Badge/badge.stories.tsx index af1bdd617b..b44e7a1bac 100644 --- a/src/components/Badge/badge.stories.tsx +++ b/src/components/Badge/badge.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import Badge from '@/src/components/Badge' +import { Badge } from '@/src/components/Badge' import { View, Text } from 'tamagui' import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' import React from 'react' diff --git a/src/components/Badge/index.ts b/src/components/Badge/index.ts new file mode 100644 index 0000000000..7a972c4456 --- /dev/null +++ b/src/components/Badge/index.ts @@ -0,0 +1,3 @@ +import { Badge } from './Badge' + +export { Badge } diff --git a/src/components/Container/index.stories.tsx b/src/components/Container/Container.stories.tsx similarity index 100% rename from src/components/Container/index.stories.tsx rename to src/components/Container/Container.stories.tsx diff --git a/src/components/Container/index.test.tsx b/src/components/Container/Container.test.tsx similarity index 100% rename from src/components/Container/index.test.tsx rename to src/components/Container/Container.test.tsx diff --git a/src/components/Container/index.tsx b/src/components/Container/Container.tsx similarity index 100% rename from src/components/Container/index.tsx rename to src/components/Container/Container.tsx diff --git a/src/components/Container/__snapshots__/index.test.tsx.snap b/src/components/Container/__snapshots__/Container.test.tsx.snap similarity index 100% rename from src/components/Container/__snapshots__/index.test.tsx.snap rename to src/components/Container/__snapshots__/Container.test.tsx.snap diff --git a/src/components/Container/index.ts b/src/components/Container/index.ts new file mode 100644 index 0000000000..0b2730f6f3 --- /dev/null +++ b/src/components/Container/index.ts @@ -0,0 +1,3 @@ +import { Container } from './Container' + +export { Container } diff --git a/src/components/CopyButton/index.stories.tsx b/src/components/CopyButton/CopyButton.stories.tsx similarity index 100% rename from src/components/CopyButton/index.stories.tsx rename to src/components/CopyButton/CopyButton.stories.tsx diff --git a/src/components/CopyButton/index.tsx b/src/components/CopyButton/CopyButton.tsx similarity index 100% rename from src/components/CopyButton/index.tsx rename to src/components/CopyButton/CopyButton.tsx diff --git a/src/components/CopyButton/index.ts b/src/components/CopyButton/index.ts new file mode 100644 index 0000000000..7c281caef9 --- /dev/null +++ b/src/components/CopyButton/index.ts @@ -0,0 +1,3 @@ +import { CopyButton } from './CopyButton' + +export { CopyButton } diff --git a/src/components/DataRow/index.stories.tsx b/src/components/DataRow/DataRow.stories.tsx similarity index 100% rename from src/components/DataRow/index.stories.tsx rename to src/components/DataRow/DataRow.stories.tsx diff --git a/src/components/DataRow/index.test.tsx b/src/components/DataRow/DataRow.test.tsx similarity index 100% rename from src/components/DataRow/index.test.tsx rename to src/components/DataRow/DataRow.test.tsx diff --git a/src/components/DataRow/index.tsx b/src/components/DataRow/DataRow.tsx similarity index 100% rename from src/components/DataRow/index.tsx rename to src/components/DataRow/DataRow.tsx diff --git a/src/components/DataRow/index.ts b/src/components/DataRow/index.ts new file mode 100644 index 0000000000..52f82bceef --- /dev/null +++ b/src/components/DataRow/index.ts @@ -0,0 +1,2 @@ +import { DataRow } from './DataRow' +export { DataRow } diff --git a/src/components/Dropdown/Dropdown.test.tsx b/src/components/Dropdown/Dropdown.test.tsx index bb2af7d09f..c8b8d0b71c 100644 --- a/src/components/Dropdown/Dropdown.test.tsx +++ b/src/components/Dropdown/Dropdown.test.tsx @@ -1,5 +1,5 @@ import { render, userEvent } from '@/src/tests/test-utils' -import Dropdown from '.' +import { Dropdown } from '.' import { Text, View } from 'tamagui' import * as hooks from '@gorhom/bottom-sheet' diff --git a/src/components/Dropdown/index.tsx b/src/components/Dropdown/Dropdown.tsx similarity index 98% rename from src/components/Dropdown/index.tsx rename to src/components/Dropdown/Dropdown.tsx index 2252cffd9c..45952f63f2 100644 --- a/src/components/Dropdown/index.tsx +++ b/src/components/Dropdown/Dropdown.tsx @@ -15,7 +15,7 @@ interface DropdownProps { keyExtractor?: ({ item, index }: { item: T; index: number }) => string } -function Dropdown({ +export function Dropdown({ label, leftNode, children, @@ -98,5 +98,3 @@ const styles = StyleSheet.create({ flex: 1, }, }) - -export default Dropdown diff --git a/src/components/Dropdown/index.ts b/src/components/Dropdown/index.ts new file mode 100644 index 0000000000..80f50ef94c --- /dev/null +++ b/src/components/Dropdown/index.ts @@ -0,0 +1,2 @@ +import { Dropdown } from './Dropdown' +export { Dropdown } diff --git a/src/components/EthAddress/index.stories.tsx b/src/components/EthAddress/ETHAddress.stories.tsx similarity index 100% rename from src/components/EthAddress/index.stories.tsx rename to src/components/EthAddress/ETHAddress.stories.tsx diff --git a/src/components/EthAddress/index.tsx b/src/components/EthAddress/ETHAddress.tsx similarity index 100% rename from src/components/EthAddress/index.tsx rename to src/components/EthAddress/ETHAddress.tsx diff --git a/src/components/EthAddress/index.ts b/src/components/EthAddress/index.ts new file mode 100644 index 0000000000..1e81222b12 --- /dev/null +++ b/src/components/EthAddress/index.ts @@ -0,0 +1,2 @@ +import { EthAddress } from './ETHAddress' +export { EthAddress } diff --git a/src/components/Fiat/Fiat.test.tsx b/src/components/Fiat/Fiat.test.tsx index 18b781b73a..f6c105a93d 100644 --- a/src/components/Fiat/Fiat.test.tsx +++ b/src/components/Fiat/Fiat.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import Fiat from '.' +import { Fiat } from '.' describe('Fiat', () => { it('should render the default markup', () => { diff --git a/src/components/Fiat/index.tsx b/src/components/Fiat/Fiat.tsx similarity index 80% rename from src/components/Fiat/index.tsx rename to src/components/Fiat/Fiat.tsx index 48c590e6ba..ff233da340 100644 --- a/src/components/Fiat/index.tsx +++ b/src/components/Fiat/Fiat.tsx @@ -1,7 +1,11 @@ import React from 'react' import { H1, H3, View } from 'tamagui' -const Fiat = ({ baseAmount }: { baseAmount: string }) => { +interface FiatProps { + baseAmount: string +} + +export const Fiat = ({ baseAmount }: FiatProps) => { const amount = baseAmount.split('.') return ( @@ -17,5 +21,3 @@ const Fiat = ({ baseAmount }: { baseAmount: string }) => { ) } - -export default Fiat diff --git a/src/components/Fiat/index.ts b/src/components/Fiat/index.ts new file mode 100644 index 0000000000..f6acb30369 --- /dev/null +++ b/src/components/Fiat/index.ts @@ -0,0 +1,2 @@ +import { Fiat } from './Fiat' +export { Fiat } diff --git a/src/components/Identicon/index.tsx b/src/components/Identicon/Identicon.tsx similarity index 100% rename from src/components/Identicon/index.tsx rename to src/components/Identicon/Identicon.tsx diff --git a/src/components/Identicon/index.ts b/src/components/Identicon/index.ts new file mode 100644 index 0000000000..b086ee4050 --- /dev/null +++ b/src/components/Identicon/index.ts @@ -0,0 +1,2 @@ +import { Identicon } from './Identicon' +export { Identicon } diff --git a/src/components/InnerShadow/InnerShadow.test.tsx b/src/components/InnerShadow/InnerShadow.test.tsx index b4e6f24258..44a79f3fdd 100644 --- a/src/components/InnerShadow/InnerShadow.test.tsx +++ b/src/components/InnerShadow/InnerShadow.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import InnerShadow from '.' +import { InnerShadow } from '.' describe('InnerShadow', () => { it('should render the default markup', () => { diff --git a/src/components/InnerShadow/index.tsx b/src/components/InnerShadow/InnerShadow.tsx similarity index 80% rename from src/components/InnerShadow/index.tsx rename to src/components/InnerShadow/InnerShadow.tsx index 8ea87f56c0..4079d26630 100644 --- a/src/components/InnerShadow/index.tsx +++ b/src/components/InnerShadow/InnerShadow.tsx @@ -1,6 +1,6 @@ import { styled, View } from 'tamagui' -const InnerShadow = styled(View, { +export const InnerShadow = styled(View, { position: 'absolute', bottom: 0, height: 10, @@ -12,5 +12,3 @@ const InnerShadow = styled(View, { shadowRadius: 4, shadowOpacity: 1, }) - -export default InnerShadow diff --git a/src/components/InnerShadow/index.ts b/src/components/InnerShadow/index.ts new file mode 100644 index 0000000000..975b859a6f --- /dev/null +++ b/src/components/InnerShadow/index.ts @@ -0,0 +1,2 @@ +import { InnerShadow } from './InnerShadow' +export { InnerShadow } diff --git a/src/components/Logo/Logo.test.tsx b/src/components/Logo/Logo.test.tsx index f608846cd5..685288f03a 100644 --- a/src/components/Logo/Logo.test.tsx +++ b/src/components/Logo/Logo.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import Logo from '.' +import { Logo } from '.' describe('Logo', () => { it('should render the default markup', () => { diff --git a/src/components/Logo/index.tsx b/src/components/Logo/Logo.tsx similarity index 87% rename from src/components/Logo/index.tsx rename to src/components/Logo/Logo.tsx index d9f7c44cf5..9409ac759d 100644 --- a/src/components/Logo/index.tsx +++ b/src/components/Logo/Logo.tsx @@ -9,7 +9,7 @@ interface LogoProps { imageBackground?: string } -function Logo({ logoUri, accessibilityLabel, imageBackground = '$color', fallbackIcon = 'nft' }: LogoProps) { +export function Logo({ logoUri, accessibilityLabel, imageBackground = '$color', fallbackIcon = 'nft' }: LogoProps) { return ( @@ -31,5 +31,3 @@ function Logo({ logoUri, accessibilityLabel, imageBackground = '$color', fallbac ) } - -export default Logo diff --git a/src/components/Logo/index.ts b/src/components/Logo/index.ts new file mode 100644 index 0000000000..5e50891375 --- /dev/null +++ b/src/components/Logo/index.ts @@ -0,0 +1,2 @@ +import { Logo } from './Logo' +export { Logo } diff --git a/src/components/SafeFontIcon/index.ts b/src/components/SafeFontIcon/index.ts new file mode 100644 index 0000000000..b3472d49e2 --- /dev/null +++ b/src/components/SafeFontIcon/index.ts @@ -0,0 +1,2 @@ +import { SafeFontIcon } from './SafeFontIcon' +export { SafeFontIcon } diff --git a/src/components/SafeListItem/SafeListItem.test.tsx b/src/components/SafeListItem/SafeListItem.test.tsx index d65d1cc400..53599f7c9d 100644 --- a/src/components/SafeListItem/SafeListItem.test.tsx +++ b/src/components/SafeListItem/SafeListItem.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import SafeListItem from '.' +import { SafeListItem } from '.' import { Text, View } from 'tamagui' import { ellipsis } from '@/src/utils/formatters' diff --git a/src/components/SafeListItem/SafeListItem.tsx b/src/components/SafeListItem/SafeListItem.tsx new file mode 100644 index 0000000000..c3af8977c0 --- /dev/null +++ b/src/components/SafeListItem/SafeListItem.tsx @@ -0,0 +1,112 @@ +import React from 'react' +import { Container } from '../Container' +import { Text, Theme, ThemeName, View } from 'tamagui' +import { IconProps, SafeFontIcon } from '../SafeFontIcon/SafeFontIcon' +import { ellipsis } from '@/src/utils/formatters' +import { isMultisigExecutionInfo } from '@/src/utils/transaction-guards' +import { Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' +import { Badge } from '../Badge' + +interface SafeListItemProps { + type?: string + label: string | React.ReactNode + icon?: IconProps['name'] + children?: React.ReactNode + rightNode?: React.ReactNode + leftNode?: React.ReactNode + bordered?: boolean + transparent?: boolean + inQueue?: boolean + executionInfo?: Transaction['executionInfo'] + themeName?: ThemeName +} + +export function SafeListItem({ + type, + leftNode, + icon, + bordered, + label, + transparent, + rightNode, + children, + inQueue, + executionInfo, + themeName, +}: SafeListItemProps) { + return ( + + + {leftNode} + + + {type && ( + + {icon && } + + {type} + + + )} + + {typeof label === 'string' ? ( + + {ellipsis(label, rightNode ? 23 : 30)} + + ) : ( + label + )} + + + + {inQueue && executionInfo && isMultisigExecutionInfo(executionInfo) ? ( + + + + + + {executionInfo?.confirmationsSubmitted}/{executionInfo?.confirmationsRequired} + + + } + themeName={ + executionInfo?.confirmationsRequired === executionInfo?.confirmationsSubmitted + ? 'badge_success_variant1' + : 'badge_warning_variant1' + } + /> + + + + ) : ( + rightNode + )} + + {children} + + ) +} + +SafeListItem.Header = function Header({ title }: { title: string }) { + return ( + + + + {title} + + + + ) +} diff --git a/src/components/SafeListItem/__snapshots__/SafeListItem.test.tsx.snap b/src/components/SafeListItem/__snapshots__/SafeListItem.test.tsx.snap index b80c598509..f3b36019c3 100644 --- a/src/components/SafeListItem/__snapshots__/SafeListItem.test.tsx.snap +++ b/src/components/SafeListItem/__snapshots__/SafeListItem.test.tsx.snap @@ -58,7 +58,7 @@ exports[`SafeListItem should render a list item with a custom label template 1`] style={ [ { - "color": "#636669", + "color": "#A1A3A7", "fontSize": 10, }, undefined, @@ -77,7 +77,7 @@ exports[`SafeListItem should render a list item with a custom label template 1`] - - {leftNode} - - - {type && ( - - {icon && } - - {type} - - - )} - - {typeof label === 'string' ? ( - - {ellipsis(label, rightNode ? 23 : 30)} - - ) : ( - label - )} - - - - {inQueue && executionInfo && isMultisigExecutionInfo(executionInfo) ? ( - - - - - - {executionInfo?.confirmationsSubmitted}/{executionInfo?.confirmationsRequired} - - - } - themeName={ - executionInfo?.confirmationsRequired === executionInfo?.confirmationsSubmitted - ? 'badge_success_variant1' - : 'badge_warning_variant1' - } - /> - - - - ) : ( - rightNode - )} - - {children} - - ) -} - -SafeListItem.Header = function Header({ title }: { title: string }) { - return ( - - - - {title} - - - - ) -} - -export default SafeListItem +import { SafeListItem } from './SafeListItem' +export { SafeListItem } diff --git a/src/components/SafeTab/SafeTab.tsx b/src/components/SafeTab/SafeTab.tsx new file mode 100644 index 0000000000..60024a8136 --- /dev/null +++ b/src/components/SafeTab/SafeTab.tsx @@ -0,0 +1,37 @@ +import React, { ReactElement, useState } from 'react' +import { TabBarProps, Tabs } from 'react-native-collapsible-tab-view' +import { safeTabItem } from './types' +import { SafeTabBar } from './SafeTabBar' + +interface SafeTabProps { + renderHeader?: (props: TabBarProps) => ReactElement + headerHeight?: number + items: safeTabItem[] +} + +export function SafeTab({ renderHeader, headerHeight, items }: SafeTabProps) { + const [activeTab, setActiveTab] = useState(items[0].label) + + return ( + } + onTabChange={(event) => setActiveTab(event.tabName)} + initialTabName={items[0].label} + > + {items.map(({ label, Component }, index) => ( + + + + ))} + + ) +} + +const headerContainerStyle = { backgroundColor: '$background' } + +SafeTab.FlashList = Tabs.FlashList +SafeTab.FlatList = Tabs.FlatList +SafeTab.ScrollView = Tabs.ScrollView diff --git a/src/components/SafeTab/SafeTabBar.tsx b/src/components/SafeTab/SafeTabBar.tsx index eb296c4261..7e1cea7887 100644 --- a/src/components/SafeTab/SafeTabBar.tsx +++ b/src/components/SafeTab/SafeTabBar.tsx @@ -9,7 +9,12 @@ interface SafeTabBarProps { activeTab: string } -const SafeTabBar = ({ tabNames, onTabPress, activeTab, setActiveTab }: TabBarProps & SafeTabBarProps) => { +export const SafeTabBar = ({ + tabNames, + onTabPress, + activeTab, + setActiveTab, +}: TabBarProps & SafeTabBarProps) => { const theme = useTheme() const activeButtonStyle = { @@ -39,5 +44,3 @@ const SafeTabBar = ({ tabNames, onTabPress, activeTab, setActiveTab }: TabBarPro ) } - -export default SafeTabBar diff --git a/src/components/SafeTab/index.tsx b/src/components/SafeTab/index.tsx index b51a2a6615..a4a4066904 100644 --- a/src/components/SafeTab/index.tsx +++ b/src/components/SafeTab/index.tsx @@ -1,39 +1,2 @@ -import React, { ReactElement, useState } from 'react' -import { TabBarProps, Tabs } from 'react-native-collapsible-tab-view' -import { safeTabItem } from './types' -import SafeTabBar from './SafeTabBar' - -interface SafeTabProps { - renderHeader?: (props: TabBarProps) => ReactElement - headerHeight?: number - items: safeTabItem[] -} - -function SafeTab({ renderHeader, headerHeight, items }: SafeTabProps) { - const [activeTab, setActiveTab] = useState(items[0].label) - - return ( - } - onTabChange={(event) => setActiveTab(event.tabName)} - initialTabName={items[0].label} - > - {items.map(({ label, Component }, index) => ( - - - - ))} - - ) -} - -const headerContainerStyle = { backgroundColor: '$background' } - -SafeTab.FlashList = Tabs.FlashList -SafeTab.FlatList = Tabs.FlatList -SafeTab.ScrollView = Tabs.ScrollView - -export default SafeTab +import { SafeTab } from './SafeTab' +export { SafeTab } diff --git a/src/components/StatusBanners/PendingTransactions/PendingTransactions.stories.tsx b/src/components/StatusBanners/PendingTransactions/PendingTransactions.stories.tsx index dbeff91de7..6a7b6ba0b3 100644 --- a/src/components/StatusBanners/PendingTransactions/PendingTransactions.stories.tsx +++ b/src/components/StatusBanners/PendingTransactions/PendingTransactions.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import PendingTransactions from '@/src/components/StatusBanners/PendingTransactions' +import { PendingTransactions } from '@/src/components/StatusBanners/PendingTransactions' import { action } from '@storybook/addon-actions' const meta: Meta = { diff --git a/src/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx b/src/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx index a7f2d8193d..ba945664d5 100644 --- a/src/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx +++ b/src/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx @@ -1,5 +1,5 @@ import { render, userEvent } from '@/src/tests/test-utils' -import PendingTransactions from '.' +import { PendingTransactions } from '.' describe('PendingTransactions', () => { beforeEach(() => { diff --git a/src/components/StatusBanners/PendingTransactions/PendingTransactions.tsx b/src/components/StatusBanners/PendingTransactions/PendingTransactions.tsx new file mode 100644 index 0000000000..e1d099ecb6 --- /dev/null +++ b/src/components/StatusBanners/PendingTransactions/PendingTransactions.tsx @@ -0,0 +1,30 @@ +import React from 'react' +import { Spinner } from 'tamagui' + +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { Badge } from '@/src/components/Badge' + +import { Alert } from '../../Alert' + +interface Props { + number: string + fullWidth?: boolean + onPress: () => void + isLoading?: boolean +} + +export const PendingTransactions = ({ number, isLoading, fullWidth, onPress }: Props) => { + const startIcon = isLoading ? : + const endIcon = + + return ( + + ) +} diff --git a/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap b/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap index 1f813b6606..28f2e431c4 100644 --- a/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap +++ b/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap @@ -72,7 +72,7 @@ exports[`PendingTransactions should render the pending transactions in fullWidth style={ { "alignItems": "center", - "backgroundColor": "#FF8C00", + "backgroundColor": "#FFF1E0", "borderBottomLeftRadius": 100000, "borderBottomRightRadius": 100000, "borderTopLeftRadius": 100000, diff --git a/src/components/StatusBanners/PendingTransactions/index.tsx b/src/components/StatusBanners/PendingTransactions/index.tsx index ff1995cd04..2ec0f893f0 100644 --- a/src/components/StatusBanners/PendingTransactions/index.tsx +++ b/src/components/StatusBanners/PendingTransactions/index.tsx @@ -1,31 +1,2 @@ -import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' - -import React from 'react' -import { Alert } from '../../Alert' -import Badge from '../../Badge' -import { Spinner } from 'tamagui' - -interface Props { - number: string - fullWidth?: boolean - onPress: () => void - isLoading?: boolean -} - -const PendingTransactions = ({ number, isLoading, fullWidth, onPress }: Props) => { - const startIcon = isLoading ? : - const endIcon = - - return ( - - ) -} - -export default PendingTransactions +import { PendingTransactions } from './PendingTransactions' +export { PendingTransactions } diff --git a/src/components/Title/index.ts b/src/components/Title/index.ts new file mode 100644 index 0000000000..266a44a765 --- /dev/null +++ b/src/components/Title/index.ts @@ -0,0 +1,4 @@ +import { LargeHeaderTitle } from './LargeHeaderTitle' +import { NavBarTitle } from './NavBarTitle' + +export { LargeHeaderTitle, NavBarTitle } diff --git a/src/components/TxInfo/TxInfo.tsx b/src/components/TxInfo/TxInfo.tsx new file mode 100644 index 0000000000..c734391023 --- /dev/null +++ b/src/components/TxInfo/TxInfo.tsx @@ -0,0 +1,101 @@ +import React from 'react' +import { TransactionInfoType } from '@/src/store/gateway/types' +import { type Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' +import { useTransactionType } from '@/src/hooks/useTransactionType' +import { TxTokenCard } from '@/src/components/transactions-list/Card/TxTokenCard' +import { TxSettingsCard } from '@/src/components/transactions-list/Card/TxSettingsCard' +import { + isCancellationTxInfo, + isCreationTxInfo, + isCustomTxInfo, + isMultiSendTxInfo, + isSettingsChangeTxInfo, + isSwapOrderTxInfo, + isTransferTxInfo, +} from '@/src/utils/transaction-guards' +import { TxBatchCard } from '@/src/components/transactions-list/Card/TxBatchCard' +import { TxSafeAppCard } from '@/src/components/transactions-list/Card/TxSafeAppCard' +import { TxRejectionCard } from '@/src/components/transactions-list/Card/TxRejectionCard' +import { TxContractInteractionCard } from '@/src/components/transactions-list/Card/TxContractInteractionCard' +import { TxSwapCard } from '@/src/components/transactions-list/Card/TxSwapCard' +import { TxCreationCard } from '@/src/components/transactions-list/Card/TxCreationCard' + +interface TxInfoProps { + tx: Transaction + bordered?: boolean + inQueue?: boolean +} + +function TxInfoComponent({ tx, bordered, inQueue }: TxInfoProps) { + const txType = useTransactionType(tx) + + const txInfo = tx.txInfo + if (isTransferTxInfo(txInfo)) { + return ( + + ) + } + + if (isSettingsChangeTxInfo(txInfo)) { + return + } + + if (isMultiSendTxInfo(txInfo) && tx.txInfo.type === TransactionInfoType.CUSTOM) { + return ( + + ) + } + + if (isMultiSendTxInfo(txInfo) && tx.safeAppInfo) { + return ( + + ) + } + + if (isCreationTxInfo(txInfo)) { + return + } + + if (isCancellationTxInfo(txInfo)) { + return + } + + if (isMultiSendTxInfo(txInfo) || isCustomTxInfo(txInfo)) { + return ( + + ) + } + + if (isSwapOrderTxInfo(txInfo)) { + return + } + + return <> +} + +export const TxInfo = React.memo(TxInfoComponent, (prevProps, nextProps) => { + return prevProps.tx.txHash === nextProps.tx.txHash +}) diff --git a/src/components/TxInfo/index.tsx b/src/components/TxInfo/index.tsx index df0c7904de..d683ece413 100644 --- a/src/components/TxInfo/index.tsx +++ b/src/components/TxInfo/index.tsx @@ -1,101 +1,3 @@ -import React from 'react' -import { TransactionInfoType } from '@/src/store/gateway/types' -import { type Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' -import { useTransactionType } from '@/src/hooks/useTransactionType' -import TxTokenCard from '@/src/components/transactions-list/Card/TxTokenCard' -import TxSettingsCard from '@/src/components/transactions-list/Card/TxSettingsCard' -import { - isCancellationTxInfo, - isCreationTxInfo, - isCustomTxInfo, - isMultiSendTxInfo, - isSettingsChangeTxInfo, - isSwapOrderTxInfo, - isTransferTxInfo, -} from '@/src/utils/transaction-guards' -import TxBatchCard from '@/src/components/transactions-list/Card/TxBatchCard' -import TxSafeAppCard from '@/src/components/transactions-list/Card/TxSafeAppCard' -import TxCreationCard from '@/src/components/transactions-list/Card/TxCreationCard' -import TxRejectionCard from '@/src/components/transactions-list/Card/TxRejectionCard' -import TxContractInteractionCard from '@/src/components/transactions-list/Card/TxContractInteractionCard' -import TxSwapCard from '@/src/components/transactions-list/Card/TxSwapCard' +import { TxInfo } from './TxInfo' -interface TxInfoProps { - tx: Transaction - bordered?: boolean - inQueue?: boolean -} - -function TxInfo({ tx, bordered, inQueue }: TxInfoProps) { - const txType = useTransactionType(tx) - - const txInfo = tx.txInfo - if (isTransferTxInfo(txInfo)) { - return ( - - ) - } - - if (isSettingsChangeTxInfo(txInfo)) { - return - } - - if (isMultiSendTxInfo(txInfo) && tx.txInfo.type === TransactionInfoType.CUSTOM) { - return ( - - ) - } - - if (isMultiSendTxInfo(txInfo) && tx.safeAppInfo) { - return ( - - ) - } - - if (isCreationTxInfo(txInfo)) { - return - } - - if (isCancellationTxInfo(txInfo)) { - return - } - - if (isMultiSendTxInfo(txInfo) || isCustomTxInfo(txInfo)) { - return ( - - ) - } - - if (isSwapOrderTxInfo(txInfo)) { - return - } - - return <> -} - -export default React.memo(TxInfo, (prevProps, nextProps) => { - return prevProps.tx.txHash === nextProps.tx.txHash -}) +export { TxInfo } diff --git a/src/components/navigation/index.ts b/src/components/navigation/index.ts new file mode 100644 index 0000000000..98a0c1e782 --- /dev/null +++ b/src/components/navigation/index.ts @@ -0,0 +1,2 @@ +import { TabBarIcon } from './TabBarIcon' +export { TabBarIcon } diff --git a/src/components/transactions-list/Card/AssetsCard/AssetsCard.test.tsx b/src/components/transactions-list/Card/AssetsCard/AssetsCard.test.tsx index 3d2883f60b..d6e5b5ef37 100644 --- a/src/components/transactions-list/Card/AssetsCard/AssetsCard.test.tsx +++ b/src/components/transactions-list/Card/AssetsCard/AssetsCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import AssetsCard from '.' +import { AssetsCard } from '.' describe('AssetsCard', () => { it('should render the default markup', () => { diff --git a/src/components/transactions-list/Card/AssetsCard/AssetsCard.tsx b/src/components/transactions-list/Card/AssetsCard/AssetsCard.tsx new file mode 100644 index 0000000000..399ad2e94f --- /dev/null +++ b/src/components/transactions-list/Card/AssetsCard/AssetsCard.tsx @@ -0,0 +1,49 @@ +import React from 'react' +import { Text, View } from 'tamagui' +import { SafeListItem } from '@/src/components/SafeListItem' +import { Logo } from '@/src/components/Logo' +import { ellipsis } from '@/src/utils/formatters' + +interface AssetsCardProps { + name: string + description: string + logoUri?: string | null + rightNode?: string | React.ReactNode + accessibilityLabel?: string + imageBackground?: string +} + +export function AssetsCard({ + name, + description, + imageBackground, + logoUri, + accessibilityLabel, + rightNode, +}: AssetsCardProps) { + return ( + + + {name} + + + {description} + + + } + transparent + leftNode={} + rightNode={ + typeof rightNode === 'string' ? ( + + {ellipsis(rightNode, 10)} + + ) : ( + rightNode + ) + } + /> + ) +} diff --git a/src/components/transactions-list/Card/AssetsCard/index.tsx b/src/components/transactions-list/Card/AssetsCard/index.tsx index 9c337bc460..737269b43b 100644 --- a/src/components/transactions-list/Card/AssetsCard/index.tsx +++ b/src/components/transactions-list/Card/AssetsCard/index.tsx @@ -1,44 +1,2 @@ -import React from 'react' -import { Text, View } from 'tamagui' -import SafeListItem from '@/src/components/SafeListItem' -import Logo from '@/src/components/Logo' -import { ellipsis } from '@/src/utils/formatters' - -interface AssetsCardProps { - name: string - description: string - logoUri?: string | null - rightNode?: string | React.ReactNode - accessibilityLabel?: string - imageBackground?: string -} - -function AssetsCard({ name, description, imageBackground, logoUri, accessibilityLabel, rightNode }: AssetsCardProps) { - return ( - - - {name} - - - {description} - - - } - transparent - leftNode={} - rightNode={ - typeof rightNode === 'string' ? ( - - {ellipsis(rightNode, 10)} - - ) : ( - rightNode - ) - } - /> - ) -} - -export default AssetsCard +import { AssetsCard } from './AssetsCard' +export { AssetsCard } diff --git a/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx b/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx index 9649a26bf2..cec5db036e 100644 --- a/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx +++ b/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import TxBatchCard from '@/src/components/transactions-list/Card/TxBatchCard' +import { TxBatchCard } from '@/src/components/transactions-list/Card/TxBatchCard' import { mockTransferWithInfo } from '@/src/tests/mocks' import { MultiSend, TransactionInfoType } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.test.tsx b/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.test.tsx index 9f87959fd5..77f9197961 100644 --- a/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.test.tsx +++ b/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import TxBatchCard from '.' +import { TxBatchCard } from '.' import { mockTransferWithInfo } from '@/src/tests/mocks' import { MultiSend, TransactionInfoType } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.tsx b/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.tsx new file mode 100644 index 0000000000..c2bd7ef50c --- /dev/null +++ b/src/components/transactions-list/Card/TxBatchCard/TxBatchCard.tsx @@ -0,0 +1,40 @@ +import React from 'react' +import { Avatar, View } from 'tamagui' +import { SafeListItem } from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import type { MultiSend } from '@/src/store/gateway/types' +import type { Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' + +interface TxBatchCardProps { + txInfo: MultiSend + bordered?: boolean + label?: string + inQueue?: boolean + executionInfo?: Transaction['executionInfo'] +} + +export function TxBatchCard({ txInfo, bordered, executionInfo, inQueue, label }: TxBatchCardProps) { + const logoUri = txInfo.to.logoUri + + return ( + + {logoUri && } + + + + + + + + } + /> + ) +} diff --git a/src/components/transactions-list/Card/TxBatchCard/__snapshots__/TxBatchCard.test.tsx.snap b/src/components/transactions-list/Card/TxBatchCard/__snapshots__/TxBatchCard.test.tsx.snap index dbfc3167e1..9d5d6ee8b3 100644 --- a/src/components/transactions-list/Card/TxBatchCard/__snapshots__/TxBatchCard.test.tsx.snap +++ b/src/components/transactions-list/Card/TxBatchCard/__snapshots__/TxBatchCard.test.tsx.snap @@ -157,7 +157,7 @@ exports[`TxBatchCard should render the default markup 1`] = ` style={ [ { - "color": "#636669", + "color": "#A1A3A7", "fontSize": 10, }, undefined, @@ -176,7 +176,7 @@ exports[`TxBatchCard should render the default markup 1`] = ` - {logoUri && } - - - - - - - - } - /> - ) -} - -export default TxBatchCard +import { TxBatchCard } from './TxBatchCard' +export { TxBatchCard } diff --git a/src/components/transactions-list/Card/TxConflictingCard/TxConflictingCard.tsx b/src/components/transactions-list/Card/TxConflictingCard/TxConflictingCard.tsx new file mode 100644 index 0000000000..ab85e8ea7c --- /dev/null +++ b/src/components/transactions-list/Card/TxConflictingCard/TxConflictingCard.tsx @@ -0,0 +1,32 @@ +import React from 'react' +import { Theme, View } from 'tamagui' +import { TxInfo } from '@/src/components/TxInfo' +import { Alert } from '@/src/components/Alert' +import { TransactionQueuedItem } from '@/src/store/gateway/AUTO_GENERATED/transactions' + +interface TxConflictingCard { + transactions: TransactionQueuedItem[] + inQueue?: boolean +} + +function TxConflictingComponent({ transactions, inQueue }: TxConflictingCard) { + return ( + <> + + + + + + {transactions.map((item, index) => ( + + + + ))} + + + ) +} + +export const TxConflictingCard = React.memo(TxConflictingComponent, (prevProps, nextProps) => { + return prevProps.transactions.length === nextProps.transactions.length +}) diff --git a/src/components/transactions-list/Card/TxConflictingCard/index.tsx b/src/components/transactions-list/Card/TxConflictingCard/index.tsx index bd9a9eb9cc..5e744b182b 100644 --- a/src/components/transactions-list/Card/TxConflictingCard/index.tsx +++ b/src/components/transactions-list/Card/TxConflictingCard/index.tsx @@ -1,32 +1,2 @@ -import React from 'react' -import { Theme, View } from 'tamagui' -import TxInfo from '@/src/components/TxInfo' -import { Alert } from '@/src/components/Alert' -import { TransactionQueuedItem } from '@/src/store/gateway/AUTO_GENERATED/transactions' - -interface TxConflictingCard { - transactions: TransactionQueuedItem[] - inQueue?: boolean -} - -function TxConflictingCard({ transactions, inQueue }: TxConflictingCard) { - return ( - <> - - - - - - {transactions.map((item, index) => ( - - - - ))} - - - ) -} - -export default React.memo(TxConflictingCard, (prevProps, nextProps) => { - return prevProps.transactions.length === nextProps.transactions.length -}) +import { TxConflictingCard } from './TxConflictingCard' +export { TxConflictingCard } diff --git a/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx b/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx index a646f35600..c0e3be6663 100644 --- a/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx +++ b/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import TxContractInteractionCard from '@/src/components/transactions-list/Card/TxContractInteractionCard' +import { TxContractInteractionCard } from '@/src/components/transactions-list/Card/TxContractInteractionCard' import { mockTransferWithInfo } from '@/src/tests/mocks' import { CustomTransactionInfo } from '@/src/store/gateway/AUTO_GENERATED/transactions' import { TransactionInfoType } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.test.tsx b/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.test.tsx index cc97d8dfb7..5fd08a0e07 100644 --- a/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.test.tsx +++ b/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import TxContractInteractionCard from '.' +import { TxContractInteractionCard } from '.' import { mockTransferWithInfo } from '@/src/tests/mocks' import { TransactionInfoType } from '@/src/store/gateway/types' import { CustomTransactionInfo } from '@/src/store/gateway/AUTO_GENERATED/transactions' diff --git a/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.tsx b/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.tsx new file mode 100644 index 0000000000..ae7b8391cb --- /dev/null +++ b/src/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.tsx @@ -0,0 +1,47 @@ +import React from 'react' +import { Avatar, Text, Theme, View } from 'tamagui' +import { SafeListItem } from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { MultiSend } from '@/src/store/gateway/types' +import { Transaction, CustomTransactionInfo } from '@/src/store/gateway/AUTO_GENERATED/transactions' + +interface TxContractInteractionCardProps { + bordered?: boolean + txInfo: CustomTransactionInfo | MultiSend + inQueue?: boolean + executionInfo?: Transaction['executionInfo'] +} + +export function TxContractInteractionCard({ + bordered, + executionInfo, + txInfo, + inQueue, +}: TxContractInteractionCardProps) { + const logoUri = txInfo.to.logoUri + const label = txInfo.to.name || 'Contract interaction' + return ( + + + {logoUri && } + + + + + + + + + } + rightNode={{txInfo.methodName}} + /> + ) +} diff --git a/src/components/transactions-list/Card/TxContractInteractionCard/index.tsx b/src/components/transactions-list/Card/TxContractInteractionCard/index.tsx index 40c8cb10ac..792582ea8e 100644 --- a/src/components/transactions-list/Card/TxContractInteractionCard/index.tsx +++ b/src/components/transactions-list/Card/TxContractInteractionCard/index.tsx @@ -1,44 +1,2 @@ -import React from 'react' -import { Avatar, Text, Theme, View } from 'tamagui' -import SafeListItem from '@/src/components/SafeListItem' -import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' -import { MultiSend } from '@/src/store/gateway/types' -import { Transaction, CustomTransactionInfo } from '@/src/store/gateway/AUTO_GENERATED/transactions' - -interface TxContractInteractionCardProps { - bordered?: boolean - txInfo: CustomTransactionInfo | MultiSend - inQueue?: boolean - executionInfo?: Transaction['executionInfo'] -} - -function TxContractInteractionCard({ bordered, executionInfo, txInfo, inQueue }: TxContractInteractionCardProps) { - const logoUri = txInfo.to.logoUri - const label = txInfo.to.name || 'Contract interaction' - return ( - - - {logoUri && } - - - - - - - - - } - rightNode={{txInfo.methodName}} - /> - ) -} - -export default TxContractInteractionCard +import { TxContractInteractionCard } from './TxContractInteractionCard' +export { TxContractInteractionCard } diff --git a/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx b/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx index 975fb2be3e..232091cd09 100644 --- a/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx +++ b/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import TxCreationCard from '@/src/components/transactions-list/Card/TxCreationCard' +import { TxCreationCard } from '@/src/components/transactions-list/Card/TxCreationCard' import { mockTransferWithInfo } from '@/src/tests/mocks' import { type CreationTransactionInfo } from '@/src/store/gateway/AUTO_GENERATED/transactions' import { TransactionInfoType } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.test.tsx b/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.test.tsx index 540def6254..86429d425a 100644 --- a/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.test.tsx +++ b/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import TxCreationCard from '.' +import { TxCreationCard } from '.' import { mockTransferWithInfo } from '@/src/tests/mocks' import { TransactionInfoType } from '@/src/store/gateway/types' import { CreationTransactionInfo } from '@/src/store/gateway/AUTO_GENERATED/transactions' diff --git a/src/components/transactions-list/Card/TxCreationCard/index.tsx b/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.tsx similarity index 81% rename from src/components/transactions-list/Card/TxCreationCard/index.tsx rename to src/components/transactions-list/Card/TxCreationCard/TxCreationCard.tsx index 083efed0ad..061e29007b 100644 --- a/src/components/transactions-list/Card/TxCreationCard/index.tsx +++ b/src/components/transactions-list/Card/TxCreationCard/TxCreationCard.tsx @@ -1,6 +1,6 @@ import React from 'react' import { Theme, View } from 'tamagui' -import TxListItem from '@/src/components/SafeListItem' +import { SafeListItem } from '@/src/components/SafeListItem' import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' import { shortenAddress } from '@/src/utils/formatters' import type { Transaction, CreationTransactionInfo } from '@/src/store/gateway/AUTO_GENERATED/transactions' @@ -12,9 +12,9 @@ interface TxCreationCardProps { executionInfo?: Transaction['executionInfo'] } -function TxCreationCard({ txInfo, executionInfo, bordered, inQueue }: TxCreationCardProps) { +export function TxCreationCard({ txInfo, executionInfo, bordered, inQueue }: TxCreationCardProps) { return ( - ) } - -export default TxCreationCard diff --git a/src/components/transactions-list/Card/TxCreationCard/index.ts b/src/components/transactions-list/Card/TxCreationCard/index.ts new file mode 100644 index 0000000000..5203e4a311 --- /dev/null +++ b/src/components/transactions-list/Card/TxCreationCard/index.ts @@ -0,0 +1,2 @@ +import { TxCreationCard } from './TxCreationCard' +export { TxCreationCard } diff --git a/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx b/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx index 19c01656e4..985e1551a8 100644 --- a/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx +++ b/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react' import { mockERC20Transfer, mockListItemByType, mockNFTTransfer } from '@/src/tests/mocks' import { TransactionItem } from '@/src/store/gateway/AUTO_GENERATED/transactions' import { TransactionListItemType, TransactionStatus } from '@/src/store/gateway/types' -import TxGroupedCard from '.' +import { TxGroupedCard } from '.' const meta: Meta = { title: 'TransactionsList/TxGroupedCard', diff --git a/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.test.tsx b/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.test.tsx index 0d4437c9b9..fe4ad0bc66 100644 --- a/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.test.tsx +++ b/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import TxGroupedCard from '.' +import { TxGroupedCard } from '.' import { mockERC20Transfer, mockListItemByType, mockNFTTransfer, mockSwapTransfer } from '@/src/tests/mocks' import { TransactionListItemType, TransactionStatus } from '@/src/store/gateway/types' import { TransactionItem } from '@/src/store/gateway/AUTO_GENERATED/transactions' diff --git a/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.tsx b/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.tsx new file mode 100644 index 0000000000..3fa970f767 --- /dev/null +++ b/src/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.tsx @@ -0,0 +1,58 @@ +import React from 'react' +import { Theme, View } from 'tamagui' +import { SafeListItem } from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { TxInfo } from '@/src/components/TxInfo' +import { getOrderClass } from '@/src/hooks/useTransactionType' +import { isSwapTransferOrderTxInfo } from '@/src/utils/transaction-guards' +import { OrderTransactionInfo } from '@/src/store/gateway/types' +import { TransactionQueuedItem, TransactionItem } from '@/src/store/gateway/AUTO_GENERATED/transactions' + +interface TxGroupedCard { + transactions: (TransactionItem | TransactionQueuedItem)[] + inQueue?: boolean +} + +const orderClassTitles: Record = { + limit: 'Limit order settlement', + twap: 'TWAP order settlement', + liquidity: 'Liquidity order settlement', + market: 'Swap order settlement', +} + +const getSettlementOrderTitle = (order: OrderTransactionInfo): string => { + const orderClass = getOrderClass(order) + return orderClassTitles[orderClass] || orderClassTitles['market'] +} + +function TxGroupedCardComponent({ transactions, inQueue }: TxGroupedCard) { + const firstTxInfo = transactions[0].transaction.txInfo + const isSwapTransfer = isSwapTransferOrderTxInfo(firstTxInfo) + const label = isSwapTransfer ? getSettlementOrderTitle(firstTxInfo) : 'Bulk transactions' + + return ( + + + + + + } + rightNode={} + > + + {transactions.map((item, index) => ( + + + + ))} + + + ) +} + +export const TxGroupedCard = React.memo(TxGroupedCardComponent, (prevProps, nextProps) => { + return prevProps.transactions.length === nextProps.transactions.length +}) diff --git a/src/components/transactions-list/Card/TxGroupedCard/index.tsx b/src/components/transactions-list/Card/TxGroupedCard/index.tsx index 3530a37e58..94f626f089 100644 --- a/src/components/transactions-list/Card/TxGroupedCard/index.tsx +++ b/src/components/transactions-list/Card/TxGroupedCard/index.tsx @@ -1,58 +1,2 @@ -import React from 'react' -import { Theme, View } from 'tamagui' -import TxListItem from '@/src/components/SafeListItem' -import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' -import TxInfo from '@/src/components/TxInfo' -import { getOrderClass } from '@/src/hooks/useTransactionType' -import { isSwapTransferOrderTxInfo } from '@/src/utils/transaction-guards' -import { OrderTransactionInfo } from '@/src/store/gateway/types' -import { TransactionQueuedItem, TransactionItem } from '@/src/store/gateway/AUTO_GENERATED/transactions' - -interface TxGroupedCard { - transactions: (TransactionItem | TransactionQueuedItem)[] - inQueue?: boolean -} - -const orderClassTitles: Record = { - limit: 'Limit order settlement', - twap: 'TWAP order settlement', - liquidity: 'Liquidity order settlement', - market: 'Swap order settlement', -} - -const getSettlementOrderTitle = (order: OrderTransactionInfo): string => { - const orderClass = getOrderClass(order) - return orderClassTitles[orderClass] || orderClassTitles['market'] -} - -function TxGroupedCard({ transactions, inQueue }: TxGroupedCard) { - const firstTxInfo = transactions[0].transaction.txInfo - const isSwapTransfer = isSwapTransferOrderTxInfo(firstTxInfo) - const label = isSwapTransfer ? getSettlementOrderTitle(firstTxInfo) : 'Bulk transactions' - - return ( - - - - - - } - rightNode={} - > - - {transactions.map((item, index) => ( - - - - ))} - - - ) -} - -export default React.memo(TxGroupedCard, (prevProps, nextProps) => { - return prevProps.transactions.length === nextProps.transactions.length -}) +import { TxGroupedCard } from './TxGroupedCard' +export { TxGroupedCard } diff --git a/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx b/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx index 042506d71d..efcbcbd527 100644 --- a/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx +++ b/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import TxRejectionCard from '@/src/components/transactions-list/Card/TxRejectionCard' +import { TxRejectionCard } from '@/src/components/transactions-list/Card/TxRejectionCard' import { mockTransferWithInfo } from '@/src/tests/mocks' import { Cancellation } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.test.tsx b/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.test.tsx index a8bc4084d0..d72228a755 100644 --- a/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.test.tsx +++ b/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import TxRejectionCard from '.' +import { TxRejectionCard } from '.' import { mockTransferWithInfo } from '@/src/tests/mocks' import { Cancellation } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.tsx b/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.tsx new file mode 100644 index 0000000000..5119c936c1 --- /dev/null +++ b/src/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.tsx @@ -0,0 +1,30 @@ +import React from 'react' +import { View } from 'tamagui' +import { SafeListItem } from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import type { Cancellation } from '@/src/store/gateway/types' +import type { Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' + +interface TxRejectionCardProps { + bordered?: boolean + txInfo: Cancellation + inQueue?: boolean + executionInfo?: Transaction['executionInfo'] +} + +export function TxRejectionCard({ bordered, executionInfo, txInfo, inQueue }: TxRejectionCardProps) { + return ( + + + + } + /> + ) +} diff --git a/src/components/transactions-list/Card/TxRejectionCard/index.tsx b/src/components/transactions-list/Card/TxRejectionCard/index.tsx index 0f86797a3e..d72615fec4 100644 --- a/src/components/transactions-list/Card/TxRejectionCard/index.tsx +++ b/src/components/transactions-list/Card/TxRejectionCard/index.tsx @@ -1,32 +1,2 @@ -import React from 'react' -import { View } from 'tamagui' -import SafeListItem from '@/src/components/SafeListItem' -import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' -import type { Cancellation } from '@/src/store/gateway/types' -import type { Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' - -interface TxRejectionCardProps { - bordered?: boolean - txInfo: Cancellation - inQueue?: boolean - executionInfo?: Transaction['executionInfo'] -} - -function TxRejectionCard({ bordered, executionInfo, txInfo, inQueue }: TxRejectionCardProps) { - return ( - - - - } - /> - ) -} - -export default TxRejectionCard +import { TxRejectionCard } from './TxRejectionCard' +export { TxRejectionCard } diff --git a/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx b/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx index 2cd4a6e449..27926b3451 100644 --- a/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx +++ b/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import TxSafeAppCard from '@/src/components/transactions-list/Card/TxSafeAppCard' +import { TxSafeAppCard } from '@/src/components/transactions-list/Card/TxSafeAppCard' import { mockTransferWithInfo } from '@/src/tests/mocks' import { MultiSend } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.test.tsx b/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.test.tsx index 2d7e2f32a3..8d95327393 100644 --- a/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.test.tsx +++ b/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import TxSafeAppCard from '.' +import { TxSafeAppCard } from '.' import { mockTransferWithInfo } from '@/src/tests/mocks' import { MultiSend } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.tsx b/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.tsx new file mode 100644 index 0000000000..bde547f31a --- /dev/null +++ b/src/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.tsx @@ -0,0 +1,41 @@ +import React from 'react' +import { Avatar, Text, View } from 'tamagui' +import { SafeListItem } from '@/src/components/SafeListItem' +import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import type { MultiSend } from '@/src/store/gateway/types' +import type { SafeAppInfo, Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' + +interface TxSafeAppCardProps { + safeAppInfo: SafeAppInfo + txInfo: MultiSend + bordered?: boolean + inQueue?: boolean + executionInfo?: Transaction['executionInfo'] +} + +export function TxSafeAppCard({ safeAppInfo, executionInfo, txInfo, inQueue, bordered }: TxSafeAppCardProps) { + return ( + + {safeAppInfo.logoUri && ( + + )} + + + + + + + + } + rightNode={{txInfo.methodName}} + /> + ) +} diff --git a/src/components/transactions-list/Card/TxSafeAppCard/index.tsx b/src/components/transactions-list/Card/TxSafeAppCard/index.tsx index d7ed7b2396..918ccd9f5d 100644 --- a/src/components/transactions-list/Card/TxSafeAppCard/index.tsx +++ b/src/components/transactions-list/Card/TxSafeAppCard/index.tsx @@ -1,43 +1,2 @@ -import React from 'react' -import { Avatar, Text, View } from 'tamagui' -import TxListItem from '@/src/components/SafeListItem' -import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' -import type { MultiSend } from '@/src/store/gateway/types' -import type { SafeAppInfo, Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' - -interface TxSafeAppCardProps { - safeAppInfo: SafeAppInfo - txInfo: MultiSend - bordered?: boolean - inQueue?: boolean - executionInfo?: Transaction['executionInfo'] -} - -function TxSafeAppCard({ safeAppInfo, executionInfo, txInfo, inQueue, bordered }: TxSafeAppCardProps) { - return ( - - {safeAppInfo.logoUri && ( - - )} - - - - - - - - } - rightNode={{txInfo.methodName}} - /> - ) -} - -export default TxSafeAppCard +import { TxSafeAppCard } from './TxSafeAppCard' +export { TxSafeAppCard } diff --git a/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx b/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx index db7185520c..a9c40d6392 100644 --- a/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx +++ b/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import TxSettingsCard from '@/src/components/transactions-list/Card/TxSettingsCard' +import { TxSettingsCard } from '@/src/components/transactions-list/Card/TxSettingsCard' import { mockTransferWithInfo } from '@/src/tests/mocks' import { SettingsChangeTransaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' import { TransactionInfoType } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.test.tsx b/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.test.tsx index ac095006ca..93b46bbf87 100644 --- a/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.test.tsx +++ b/src/components/transactions-list/Card/TxSettingsCard/TxSettingCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import TxSettingCard from '.' +import { TxSettingsCard } from '.' import { mockTransferWithInfo } from '@/src/tests/mocks' import { TransactionInfoType } from '@/src/store/gateway/types' import { SettingsChangeTransaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' @@ -7,7 +7,7 @@ import { SettingsChangeTransaction } from '@/src/store/gateway/AUTO_GENERATED/tr describe('TxSettingCard', () => { it('should render the default markup', () => { const container = render( - + + + + + } + /> + ) +} diff --git a/src/components/transactions-list/Card/TxSettingsCard/__snapshots__/TxSettingCard.test.tsx.snap b/src/components/transactions-list/Card/TxSettingsCard/__snapshots__/TxSettingCard.test.tsx.snap index 27350b0341..f5052f6c5f 100644 --- a/src/components/transactions-list/Card/TxSettingsCard/__snapshots__/TxSettingCard.test.tsx.snap +++ b/src/components/transactions-list/Card/TxSettingsCard/__snapshots__/TxSettingCard.test.tsx.snap @@ -82,7 +82,7 @@ exports[`TxSettingCard should render the default markup 1`] = ` - - - - - } - /> - ) -} - -export default TxSettingsCard +import { TxSettingsCard } from './TxSettingsCard' +export { TxSettingsCard } diff --git a/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx b/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx index 5537f4fb53..b8704be60d 100644 --- a/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx +++ b/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import TxSwapCard from '@/src/components/transactions-list/Card/TxSwapCard' +import { TxSwapCard } from '@/src/components/transactions-list/Card/TxSwapCard' import { mockSwapTransfer } from '@/src/tests/mocks' import { OrderTransactionInfo } from '@/src/store/gateway/types' diff --git a/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.test.tsx b/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.test.tsx index de141de424..dbb6b1bd12 100644 --- a/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.test.tsx +++ b/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.test.tsx @@ -1,5 +1,5 @@ import { render } from '@/src/tests/test-utils' -import TxSwapCard from '.' +import { TxSwapCard } from '.' import { OrderTransactionInfo } from '@/src/store/gateway/types' import { mockSwapTransfer } from '@/src/tests/mocks' diff --git a/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.tsx b/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.tsx new file mode 100644 index 0000000000..b64e96c0af --- /dev/null +++ b/src/components/transactions-list/Card/TxSwapCard/TxSwapCard.tsx @@ -0,0 +1,63 @@ +import React from 'react' +import { Avatar, Text, Theme, View } from 'tamagui' +import { SafeListItem } from '@/src/components/SafeListItem' +import { formatValue } from '@/src/utils/formatters' +import { OrderTransactionInfo } from '@/src/store/gateway/types' +import { Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' + +interface TxSwapCardProps { + txInfo: OrderTransactionInfo + bordered?: boolean + inQueue?: boolean + executionInfo?: Transaction['executionInfo'] +} + +export function TxSwapCard({ txInfo, bordered, executionInfo, inQueue }: TxSwapCardProps) { + return ( + ${txInfo.buyToken.symbol}`} + icon="transaction-swap" + type="Swap order" + executionInfo={executionInfo} + bordered={bordered} + inQueue={inQueue} + leftNode={ + + + + {txInfo.sellToken.logoUri && ( + + )} + + + + + {txInfo.buyToken.logoUri && ( + + )} + + + + + } + rightNode={ + + + +{formatValue(txInfo.buyAmount, txInfo.buyToken.decimals)} {txInfo.buyToken.symbol} + + + −{formatValue(txInfo.sellAmount, txInfo.sellToken.decimals)} {txInfo.sellToken.symbol} + + + } + /> + ) +} diff --git a/src/components/transactions-list/Card/TxSwapCard/__snapshots__/TxSwapCard.test.tsx.snap b/src/components/transactions-list/Card/TxSwapCard/__snapshots__/TxSwapCard.test.tsx.snap index 1cf73124cd..03c227f393 100644 --- a/src/components/transactions-list/Card/TxSwapCard/__snapshots__/TxSwapCard.test.tsx.snap +++ b/src/components/transactions-list/Card/TxSwapCard/__snapshots__/TxSwapCard.test.tsx.snap @@ -206,7 +206,7 @@ exports[`TxSwapCard should render the default markup 1`] = ` style={ [ { - "color": "#636669", + "color": "#A1A3A7", "fontSize": 10, }, undefined, @@ -225,7 +225,7 @@ exports[`TxSwapCard should render the default markup 1`] = ` ${txInfo.buyToken.symbol}`} - icon="transaction-swap" - type="Swap order" - executionInfo={executionInfo} - bordered={bordered} - inQueue={inQueue} - leftNode={ - - - - {txInfo.sellToken.logoUri && ( - - )} - - - - - {txInfo.buyToken.logoUri && ( - - )} - - - - - } - rightNode={ - - - +{formatValue(txInfo.buyAmount, txInfo.buyToken.decimals)} {txInfo.buyToken.symbol} - - - −{formatValue(txInfo.sellAmount, txInfo.sellToken.decimals)} {txInfo.sellToken.symbol} - - - } - /> - ) -} - -export default TxSwapCard +import { TxSwapCard } from './TxSwapCard' +export { TxSwapCard } diff --git a/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx b/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx index ec4f93f59b..44ee9d207c 100644 --- a/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx +++ b/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react' -import TxTokenCard from '@/src/components/transactions-list/Card/TxTokenCard' +import { TxTokenCard } from '@/src/components/transactions-list/Card/TxTokenCard' import { mockERC20Transfer, mockNFTTransfer } from '@/src/tests/mocks' import { TransactionStatus } from '@/src/store/gateway/types' import { type TransferTransactionInfo } from '@/src/store/gateway/AUTO_GENERATED/transactions' diff --git a/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.tsx b/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.tsx new file mode 100644 index 0000000000..ac3b986f7a --- /dev/null +++ b/src/components/transactions-list/Card/TxTokenCard/TxTokenCard.tsx @@ -0,0 +1,102 @@ +import React from 'react' +import { Text, View } from 'tamagui' +import { SafeListItem } from '@/src/components/SafeListItem' +import { + isERC20Transfer, + isERC721Transfer, + isNativeTokenTransfer, + isOutgoingTransfer, + isTxQueued, +} from '@/src/utils/transaction-guards' +import { ellipsis, formatValue } from '@/src/utils/formatters' +import { useSelector } from 'react-redux' +import { selectNativeCurrency } from '@/src/store/activeChainSlice' +import { TransferDirection } from '@/src/store/gateway/types' +import { TransferTransactionInfo, Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' +import { Logo } from '@/src/components/Logo' + +interface TxTokenCardProps { + bordered?: boolean + txStatus: Transaction['txStatus'] + inQueue?: boolean + txInfo: TransferTransactionInfo + executionInfo?: Transaction['executionInfo'] +} + +interface tokenDetails { + value: string + decimals?: number + tokenSymbol?: string + name: string + logoUri?: string +} + +const getTokenDetails = (txInfo: TransferTransactionInfo): tokenDetails => { + const transfer = txInfo.transferInfo + const unnamedToken = 'Unnamed token' + const nativeCurrency = useSelector(selectNativeCurrency) + + if (isNativeTokenTransfer(transfer)) { + return { + value: formatValue(transfer.value || '0', nativeCurrency.decimals), + // take it from the native currency slice + decimals: nativeCurrency.decimals, + tokenSymbol: nativeCurrency.symbol, + name: nativeCurrency.name, + logoUri: nativeCurrency.logoUri, + } + } + + if (isERC20Transfer(transfer)) { + return { + value: formatValue(transfer.value, transfer.decimals || 18), + decimals: transfer.decimals || undefined, + logoUri: transfer.logoUri || undefined, + tokenSymbol: ellipsis((transfer.tokenSymbol || 'Unknown Token').trim(), 6), + name: transfer.tokenName || unnamedToken, + } + } + + if (isERC721Transfer(transfer)) { + return { + name: transfer.tokenName || unnamedToken, + tokenSymbol: ellipsis(`${transfer.tokenSymbol || 'Unknown NFT'} #${transfer.tokenId}`, 8), + value: '1', + decimals: 0, + logoUri: transfer?.logoUri || undefined, + } + } + + return { + name: unnamedToken, + value: '', + } +} + +export function TxTokenCard({ bordered, inQueue, txStatus, executionInfo, txInfo }: TxTokenCardProps) { + const isSendTx = isOutgoingTransfer(txInfo) + const icon = isSendTx ? 'transaction-outgoing' : 'transaction-incoming' + const type = isSendTx ? (isTxQueued(txStatus) ? 'Send' : 'Sent') : 'Received' + const { logoUri, name, value, tokenSymbol } = getTokenDetails(txInfo) + const isERC721 = isERC721Transfer(txInfo.transferInfo) + const isOutgoing = txInfo.direction === TransferDirection.OUTGOING + + return ( + } + rightNode={ + + + {isOutgoing ? '-' : '+'} {ellipsis(value, 8)} {!isERC721 && tokenSymbol} + + + } + /> + ) +} diff --git a/src/components/transactions-list/Card/TxTokenCard/index.tsx b/src/components/transactions-list/Card/TxTokenCard/index.tsx index 77206e869b..122cb0ab2b 100644 --- a/src/components/transactions-list/Card/TxTokenCard/index.tsx +++ b/src/components/transactions-list/Card/TxTokenCard/index.tsx @@ -1,104 +1,2 @@ -import React from 'react' -import { Text, View } from 'tamagui' -import SafeListItem from '@/src/components/SafeListItem' -import { - isERC20Transfer, - isERC721Transfer, - isNativeTokenTransfer, - isOutgoingTransfer, - isTxQueued, -} from '@/src/utils/transaction-guards' -import { ellipsis, formatValue } from '@/src/utils/formatters' -import { useSelector } from 'react-redux' -import { selectNativeCurrency } from '@/src/store/activeChainSlice' -import { TransferDirection } from '@/src/store/gateway/types' -import { TransferTransactionInfo, Transaction } from '@/src/store/gateway/AUTO_GENERATED/transactions' -import Logo from '@/src/components/Logo' - -interface TxTokenCardProps { - bordered?: boolean - txStatus: Transaction['txStatus'] - inQueue?: boolean - txInfo: TransferTransactionInfo - executionInfo?: Transaction['executionInfo'] -} - -interface tokenDetails { - value: string - decimals?: number - tokenSymbol?: string - name: string - logoUri?: string -} - -const getTokenDetails = (txInfo: TransferTransactionInfo): tokenDetails => { - const transfer = txInfo.transferInfo - const unnamedToken = 'Unnamed token' - const nativeCurrency = useSelector(selectNativeCurrency) - - if (isNativeTokenTransfer(transfer)) { - return { - value: formatValue(transfer.value || '0', nativeCurrency.decimals), - // take it from the native currency slice - decimals: nativeCurrency.decimals, - tokenSymbol: nativeCurrency.symbol, - name: nativeCurrency.name, - logoUri: nativeCurrency.logoUri, - } - } - - if (isERC20Transfer(transfer)) { - return { - value: formatValue(transfer.value, transfer.decimals || 18), - decimals: transfer.decimals || undefined, - logoUri: transfer.logoUri || undefined, - tokenSymbol: ellipsis((transfer.tokenSymbol || 'Unknown Token').trim(), 6), - name: transfer.tokenName || unnamedToken, - } - } - - if (isERC721Transfer(transfer)) { - return { - name: transfer.tokenName || unnamedToken, - tokenSymbol: ellipsis(`${transfer.tokenSymbol || 'Unknown NFT'} #${transfer.tokenId}`, 8), - value: '1', - decimals: 0, - logoUri: transfer?.logoUri || undefined, - } - } - - return { - name: unnamedToken, - value: '', - } -} - -function TxTokenCard({ bordered, inQueue, txStatus, executionInfo, txInfo }: TxTokenCardProps) { - const isSendTx = isOutgoingTransfer(txInfo) - const icon = isSendTx ? 'transaction-outgoing' : 'transaction-incoming' - const type = isSendTx ? (isTxQueued(txStatus) ? 'Send' : 'Sent') : 'Received' - const { logoUri, name, value, tokenSymbol } = getTokenDetails(txInfo) - const isERC721 = isERC721Transfer(txInfo.transferInfo) - const isOutgoing = txInfo.direction === TransferDirection.OUTGOING - - return ( - } - rightNode={ - - - {isOutgoing ? '-' : '+'} {ellipsis(value, 8)} {!isERC721 && tokenSymbol} - - - } - /> - ) -} - -export default TxTokenCard +import { TxTokenCard } from './TxTokenCard' +export { TxTokenCard } diff --git a/src/features/Assets/components/AssetsHeader/index.tsx b/src/features/Assets/components/AssetsHeader/index.tsx index c485f1e19b..f8f1b4c56a 100644 --- a/src/features/Assets/components/AssetsHeader/index.tsx +++ b/src/features/Assets/components/AssetsHeader/index.tsx @@ -1,4 +1,4 @@ -import PendingTransactions from '@/src/components/StatusBanners/PendingTransactions' +import { PendingTransactions } from '@/src/components/StatusBanners/PendingTransactions' import usePendingTxs from '@/src/hooks/usePendingTxs' import { router } from 'expo-router' import { View } from 'tamagui' diff --git a/src/features/Assets/components/Balance/ChainItems.tsx b/src/features/Assets/components/Balance/ChainItems.tsx index 7fa6fe1207..74d6bb0b93 100644 --- a/src/features/Assets/components/Balance/ChainItems.tsx +++ b/src/features/Assets/components/Balance/ChainItems.tsx @@ -1,7 +1,7 @@ import React from 'react' import { View } from 'tamagui' import { Chain } from '@/src/store/gateway/AUTO_GENERATED/chains' -import AssetsCard from '@/src/components/transactions-list/Card/AssetsCard' +import { AssetsCard } from '@/src/components/transactions-list/Card/AssetsCard' import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' import { TouchableOpacity } from 'react-native' diff --git a/src/features/Assets/components/Balance/index.tsx b/src/features/Assets/components/Balance/index.tsx index b5496224d5..50848355c6 100644 --- a/src/features/Assets/components/Balance/index.tsx +++ b/src/features/Assets/components/Balance/index.tsx @@ -1,4 +1,4 @@ -import Dropdown from '@/src/components/Dropdown' +import { Dropdown } from '@/src/components/Dropdown' import { selectActiveChain, switchActiveChain } from '@/src/store/activeChainSlice' import React from 'react' import { useDispatch, useSelector } from 'react-redux' @@ -6,7 +6,7 @@ import { Image, Spinner, View } from 'tamagui' import { SafeOverview, useSafesGetSafeOverviewV1Query } from '@/src/store/gateway/AUTO_GENERATED/safes' import { selectActiveSafe } from '@/src/store/activeSafeSlice' import { SafeOverviewResult } from '@/src/store/gateway/types' -import Fiat from '@/src/components/Fiat' +import { Fiat } from '@/src/components/Fiat' import { Alert } from '@/src/components/Alert' import { POLLING_INTERVAL } from '@/src/config/constants' import { selectAllChains } from '@/src/store/gateway/chains' diff --git a/src/features/Assets/components/Fallback/index.tsx b/src/features/Assets/components/Fallback/index.tsx index 7c0faf5ef2..5dcd6a3ef8 100644 --- a/src/features/Assets/components/Fallback/index.tsx +++ b/src/features/Assets/components/Fallback/index.tsx @@ -2,7 +2,7 @@ import React from 'react' import { Spinner } from 'tamagui' import { Alert } from '@/src/components/Alert' -import SafeTab from '@/src/components/SafeTab' +import { SafeTab } from '@/src/components/SafeTab' import NoFunds from '../NoFunds' const Fallback = ({ loading, hasError }: { loading: boolean; hasError: boolean }) => ( diff --git a/src/features/Assets/components/NFTs/NFTItem.tsx b/src/features/Assets/components/NFTs/NFTItem.tsx index c676476655..4b9b94e147 100644 --- a/src/features/Assets/components/NFTs/NFTItem.tsx +++ b/src/features/Assets/components/NFTs/NFTItem.tsx @@ -1,4 +1,4 @@ -import AssetsCard from '@/src/components/transactions-list/Card/AssetsCard' +import { AssetsCard } from '@/src/components/transactions-list/Card/AssetsCard' import { Collectible } from '@/src/store/gateway/AUTO_GENERATED/collectibles' import React from 'react' diff --git a/src/features/Assets/components/NFTs/index.tsx b/src/features/Assets/components/NFTs/index.tsx index 9cea37e3d9..51275136c5 100644 --- a/src/features/Assets/components/NFTs/index.tsx +++ b/src/features/Assets/components/NFTs/index.tsx @@ -2,7 +2,7 @@ import { safelyDecodeURIComponent } from 'expo-router/build/fork/getStateFromPat import React, { useEffect, useState } from 'react' import { useSelector } from 'react-redux' -import SafeTab from '@/src/components/SafeTab' +import { SafeTab } from '@/src/components/SafeTab' import { POLLING_INTERVAL } from '@/src/config/constants' import { selectActiveSafe } from '@/src/store/activeSafeSlice' import { diff --git a/src/features/Assets/components/Tokens/index.tsx b/src/features/Assets/components/Tokens/index.tsx index 0313f826b2..4cf2729913 100644 --- a/src/features/Assets/components/Tokens/index.tsx +++ b/src/features/Assets/components/Tokens/index.tsx @@ -1,5 +1,5 @@ -import SafeTab from '@/src/components/SafeTab' -import AssetsCard from '@/src/components/transactions-list/Card/AssetsCard' +import { SafeTab } from '@/src/components/SafeTab' +import { AssetsCard } from '@/src/components/transactions-list/Card/AssetsCard' import { POLLING_INTERVAL } from '@/src/config/constants' import { selectActiveSafe } from '@/src/store/activeSafeSlice' import { Balance, useBalancesGetBalancesV1Query } from '@/src/store/gateway/AUTO_GENERATED/balances' diff --git a/src/features/Assets/index.tsx b/src/features/Assets/index.tsx index 730f59383b..09142eda02 100644 --- a/src/features/Assets/index.tsx +++ b/src/features/Assets/index.tsx @@ -1,5 +1,5 @@ import React from 'react' -import SafeTab from '@/src/components/SafeTab' +import { SafeTab } from '@/src/components/SafeTab' import Tokens from './components/Tokens' import AssetsHeader from './components/AssetsHeader' import NFTs from './components/NFTs' diff --git a/src/features/PendingTx/PendingTxList.tsx b/src/features/PendingTx/PendingTxList.tsx index 6c2b913422..b4f8a177b8 100644 --- a/src/features/PendingTx/PendingTxList.tsx +++ b/src/features/PendingTx/PendingTxList.tsx @@ -1,8 +1,8 @@ -import SafeListItem from '@/src/components/SafeListItem' +import { SafeListItem } from '@/src/components/SafeListItem' import React from 'react' import { SectionList } from 'react-native' import { Spinner, View } from 'tamagui' -import Badge from '../../components/Badge' +import { Badge } from '../../components/Badge' import { NavBarTitle } from '@/src/components/Title/NavBarTitle' import { LargeHeaderTitle } from '@/src/components/Title/LargeHeaderTitle' import { useScrollableHeader } from '@/src/navigation/useScrollableHeader' diff --git a/src/features/PendingTx/utils.tsx b/src/features/PendingTx/utils.tsx index 25bf6cc08d..61c38b7cff 100644 --- a/src/features/PendingTx/utils.tsx +++ b/src/features/PendingTx/utils.tsx @@ -10,10 +10,10 @@ import { groupBulkTxs } from '@/src/utils/transactions' import { GroupedPendingTxsWithTitle } from '@/src/features/PendingTx/PendingTxList' import { type PendingTransactionItems, TransactionListItemType } from '@/src/store/gateway/types' import { View } from 'tamagui' -import TxGroupedCard from '@/src/components/transactions-list/Card/TxGroupedCard' -import TxConflictingCard from '@/src/components/transactions-list/Card/TxConflictingCard' -import SafeListItem from '@/src/components/SafeListItem' -import TxInfo from '@/src/components/TxInfo' +import { TxGroupedCard } from '@/src/components/transactions-list/Card/TxGroupedCard' +import { TxConflictingCard } from '@/src/components/transactions-list/Card/TxConflictingCard' +import { SafeListItem } from '@/src/components/SafeListItem' +import { TxInfo } from '@/src/components/TxInfo' import React from 'react' type GroupedTxs = (PendingTransactionItems | TransactionQueuedItem[])[] diff --git a/src/features/Settings/components/IdenticonWithBadge.tsx b/src/features/Settings/components/IdenticonWithBadge.tsx index a51c3b6832..43052e96d8 100644 --- a/src/features/Settings/components/IdenticonWithBadge.tsx +++ b/src/features/Settings/components/IdenticonWithBadge.tsx @@ -1,7 +1,7 @@ import { View } from 'tamagui' import { Identicon } from '@/src/components/Identicon' import { Skeleton } from 'moti/skeleton' -import Badge from '@/src/components/Badge' +import { Badge } from '@/src/components/Badge' import React from 'react' import { StyleSheet } from 'react-native' import { Address } from '@/src/types/address' diff --git a/src/features/Settings/index.tsx b/src/features/Settings/index.tsx index b93138f710..40b2a55543 100644 --- a/src/features/Settings/index.tsx +++ b/src/features/Settings/index.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react' import { H2, ScrollView, Text, View, XStack, YStack } from 'tamagui' import { SafeFontIcon as Icon } from '@/src/components/SafeFontIcon/SafeFontIcon' -import SafeListItem from '@/src/components/SafeListItem' +import { SafeListItem } from '@/src/components/SafeListItem' import { useGetSafeQuery } from '@/src/store/gateway' import { Skeleton } from 'moti/skeleton' import { Pressable } from 'react-native' diff --git a/src/features/TxHistory/TxHistoryList.tsx b/src/features/TxHistory/TxHistoryList.tsx index 8bba44b048..4e901c9341 100644 --- a/src/features/TxHistory/TxHistoryList.tsx +++ b/src/features/TxHistory/TxHistoryList.tsx @@ -2,7 +2,7 @@ import { Spinner } from 'tamagui' import React, { useMemo } from 'react' import { SectionList } from 'react-native' -import SafeListItem from '@/src/components/SafeListItem' +import { SafeListItem } from '@/src/components/SafeListItem' import { TransactionItem } from '@/src/store/gateway/AUTO_GENERATED/transactions' import { getTxHash, GroupedTxsWithTitle, groupTxsByDate } from '@/src/features/TxHistory/utils' import { HistoryTransactionItems } from '@/src/store/gateway/types' diff --git a/src/features/TxHistory/utils.tsx b/src/features/TxHistory/utils.tsx index 503dbfb972..23d1b94e2c 100644 --- a/src/features/TxHistory/utils.tsx +++ b/src/features/TxHistory/utils.tsx @@ -4,8 +4,8 @@ import { formatWithSchema } from '@/src/utils/date' import { isDateLabel } from '@/src/utils/transaction-guards' import { HistoryTransactionItems } from '@/src/store/gateway/types' import { View } from 'tamagui' -import TxGroupedCard from '@/src/components/transactions-list/Card/TxGroupedCard' -import TxInfo from '@/src/components/TxInfo' +import { TxGroupedCard } from '@/src/components/transactions-list/Card/TxGroupedCard' +import { TxInfo } from '@/src/components/TxInfo' import React from 'react' export type GroupedTxs = (T | T[])[] From 4ab9f18f745c841e2d4fddba12d4b3cce9c5bb5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=B3vis=20Neto?= Date: Wed, 27 Nov 2024 21:52:12 +0100 Subject: [PATCH 32/49] fix: unit tests of Identicon component (#41) * fix: unit tests * fix: remove early null return --- src/components/Identicon/Identicon.test.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/components/Identicon/Identicon.test.tsx b/src/components/Identicon/Identicon.test.tsx index 31114eebe9..73aa12e910 100644 --- a/src/components/Identicon/Identicon.test.tsx +++ b/src/components/Identicon/Identicon.test.tsx @@ -28,9 +28,4 @@ describe('Identicon', () => { expect(image.props.style.width).toBe(100) expect(image.props.style.height).toBe(100) }) - - it('returns null when address is not provided', () => { - const { queryByTestId } = render() - expect(queryByTestId('identicon-image')).toBeNull() - }) }) From b5ff1a8a7eabcaadb0bcc48abcf6cd6bf651afc2 Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Wed, 27 Nov 2024 21:57:37 +0100 Subject: [PATCH 33/49] fix: wrong color for settings (#39) --- src/features/Settings/index.tsx | 10 ++++++++-- src/theme/provider/toastProvider.tsx | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/features/Settings/index.tsx b/src/features/Settings/index.tsx index 40b2a55543..79ba880a68 100644 --- a/src/features/Settings/index.tsx +++ b/src/features/Settings/index.tsx @@ -58,7 +58,7 @@ export const Settings = () => { { - + diff --git a/src/theme/provider/toastProvider.tsx b/src/theme/provider/toastProvider.tsx index 7072d20631..41901ce0d3 100644 --- a/src/theme/provider/toastProvider.tsx +++ b/src/theme/provider/toastProvider.tsx @@ -36,7 +36,7 @@ const CurrentToast = () => { opacity={1} scale={1} animation="100ms" - backgroundColor={'$background'} + backgroundColor={'$backgroundPaper'} viewportName={currentToast.viewportName} > From 1fdbeb9d83470c595b59a9e7d094024b4ddd6489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=B3vis=20Neto?= Date: Thu, 28 Nov 2024 16:12:24 +0100 Subject: [PATCH 34/49] Chore: Refactor features folder to follow code guidelines (#43) * chore: adjust features folder structure * chore: change features folder definition * fix: broken ts import --- CONTRIBUTING.md | 19 ++- app/(tabs)/_layout.tsx | 2 +- app/(tabs)/index.tsx | 4 +- app/(tabs)/settings.tsx | 4 +- app/(tabs)/transactions/(tabs)/index.tsx | 4 +- app/app-settings.tsx | 4 +- app/notifications.tsx | 4 +- app/pending-transactions.tsx | 5 +- app/signers.tsx | 4 +- src/features/Assets/Assets.container.tsx | 22 +++ .../AssetsHeader/AssetsHeader.container.tsx | 21 +++ .../components/AssetsHeader/AssetsHeader.tsx | 30 ++++ .../Assets/components/AssetsHeader/index.tsx | 35 +--- .../components/Balance/Balance.container.tsx | 42 +++++ .../Assets/components/Balance/Balance.tsx | 63 +++++++ .../Assets/components/Balance/ChainItems.tsx | 4 +- .../Assets/components/Balance/index.tsx | 84 +--------- .../Fallback/{index.tsx => Fallback.tsx} | 6 +- .../Assets/components/Fallback/index.ts | 2 + .../Assets/components/NFTs/NFTItem.tsx | 6 +- .../Assets/components/NFTs/NFTs.container.tsx | 62 +++++++ src/features/Assets/components/NFTs/index.tsx | 66 +------- .../NoFunds/{index.tsx => NoFunds.tsx} | 4 +- .../Assets/components/NoFunds/index.ts | 2 + .../components/Tokens/Tokens.container.tsx | 59 +++++++ .../Assets/components/Tokens/index.tsx | 61 +------ src/features/Assets/index.tsx | 24 +-- .../Notifications/Notifications.container.tsx | 10 ++ src/features/Notifications/index.tsx | 12 +- .../PendingTx/PendingTx.container.tsx | 17 ++ .../PendingTxList.container.tsx} | 14 +- .../components/PendingTxList/index.ts | 2 + src/features/PendingTx/index.tsx | 20 +-- src/features/PendingTx/utils.tsx | 2 +- src/features/Settings/AppSettings.tsx | 40 ----- src/features/Settings/Settings.container.tsx | 24 +++ src/features/Settings/Settings.tsx | 145 ++++++++++++++++ .../AppSettings/AppSettings.container.tsx | 22 +++ .../components/AppSettings/AppSettings.tsx | 29 ++++ .../Settings/components/AppSettings/index.ts | 2 + .../IdenticonWithBadge.tsx | 0 .../components/IdenticonWithBadge/index.ts | 2 + .../Settings/components/Navbar/index.ts | 2 + src/features/Settings/index.tsx | 156 +----------------- src/features/Signers/Signers.container.tsx | 9 + src/features/Signers/index.tsx | 11 +- .../TxHistory/TxHistory.container.tsx | 38 +++++ .../TxHistoryList}/TxHistoryList.tsx | 4 +- .../components/TxHistoryList/index.ts | 2 + src/features/TxHistory/index.tsx | 41 +---- src/hooks/usePendingTxs/index.ts | 2 +- 51 files changed, 674 insertions(+), 575 deletions(-) create mode 100644 src/features/Assets/Assets.container.tsx create mode 100644 src/features/Assets/components/AssetsHeader/AssetsHeader.container.tsx create mode 100644 src/features/Assets/components/AssetsHeader/AssetsHeader.tsx create mode 100644 src/features/Assets/components/Balance/Balance.container.tsx create mode 100644 src/features/Assets/components/Balance/Balance.tsx rename src/features/Assets/components/Fallback/{index.tsx => Fallback.tsx} (72%) create mode 100644 src/features/Assets/components/Fallback/index.ts create mode 100644 src/features/Assets/components/NFTs/NFTs.container.tsx rename src/features/Assets/components/NoFunds/{index.tsx => NoFunds.tsx} (90%) create mode 100644 src/features/Assets/components/NoFunds/index.ts create mode 100644 src/features/Assets/components/Tokens/Tokens.container.tsx create mode 100644 src/features/Notifications/Notifications.container.tsx create mode 100644 src/features/PendingTx/PendingTx.container.tsx rename src/features/PendingTx/{PendingTxList.tsx => components/PendingTxList/PendingTxList.container.tsx} (90%) create mode 100644 src/features/PendingTx/components/PendingTxList/index.ts delete mode 100644 src/features/Settings/AppSettings.tsx create mode 100644 src/features/Settings/Settings.container.tsx create mode 100644 src/features/Settings/Settings.tsx create mode 100644 src/features/Settings/components/AppSettings/AppSettings.container.tsx create mode 100644 src/features/Settings/components/AppSettings/AppSettings.tsx create mode 100644 src/features/Settings/components/AppSettings/index.ts rename src/features/Settings/components/{ => IdenticonWithBadge}/IdenticonWithBadge.tsx (100%) create mode 100644 src/features/Settings/components/IdenticonWithBadge/index.ts create mode 100644 src/features/Settings/components/Navbar/index.ts create mode 100644 src/features/Signers/Signers.container.tsx create mode 100644 src/features/TxHistory/TxHistory.container.tsx rename src/features/TxHistory/{ => components/TxHistoryList}/TxHistoryList.tsx (92%) create mode 100644 src/features/TxHistory/components/TxHistoryList/index.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ae2a2f2e9d..691c29345b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,9 +1,9 @@ - # React Native Code Guidelines ## Code Structure ### General Components + - Components that are used across multiple features should reside in the `src/components/` folder. - Each component should have its own folder, structured as follows: ``` @@ -24,32 +24,41 @@ ``` ### Exporting Components + - **Always prefer named exports over default exports.** - Named exports make it easier to refactor and identify exports in a codebase. ### Features and Screens + - Feature-specific components and screens should be implemented inside the `src/features/` folder. #### Example: Feature File Structure + For a feature called **Assets**, the file structure might look like this: + ``` // src/features/Assets -- Assets.tsx +- Assets.container.tsx - index.tsx ``` + - `index.tsx` should only export the **Assets** component/container. #### Subcomponents for Features + - If a feature depends on multiple subcomponents unique to that feature, place them in a `components` subfolder. For example: + ``` // src/features/Assets/components/AssetHeader -- AssetHeaderPresentation.tsx -- AssetHeaderContainer.tsx +- AssetHeader.tsx +- AssetHeader.container.tsx - index.tsx ``` ### Presentation vs. Container Components + - **Presentation Components**: + - Responsible only for rendering the UI. - Receive data and callbacks via props. - Avoid direct manipulation of business logic. @@ -58,5 +67,3 @@ For a feature called **Assets**, the file structure might look like this: - **Container Components**: - Handle business logic (e.g., state management, API calls, etc.). - Pass necessary data and callbacks to the corresponding Presentation component. - - diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 59bc41bf53..b8287062aa 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -2,7 +2,7 @@ import { Tabs } from 'expo-router' import React from 'react' import { TabBarIcon } from '@/src/components/navigation/TabBarIcon' import { LayoutHeader } from '.' -import { Navbar } from '@/src/features/Settings/components/Navbar/Navbar' +import { Navbar } from '@/src/features/Settings/components/Navbar/' export default function TabLayout() { return ( diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index a6c40199fa..bfbd99fd09 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -3,11 +3,11 @@ import { StyleSheet, TouchableOpacity } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' import { Avatar, Image, Text, View } from 'tamagui' import React from 'react' -import Assets from '@/src/features/Assets' import { useSelector } from 'react-redux' import { selectActiveSafe } from '@/src/store/activeSafeSlice' import { shortenAddress } from '@/src/utils/formatters' import { InnerShadow } from '@/src/components/InnerShadow' +import { AssetsContainer } from '@/src/features/Assets' // TODO: take it from safe wallet slice info const fakeAccountUri = 'https://images.unsplash.com/photo-1531384441138-2736e62e0919?&w=100&h=100&dpr=2&q=80' @@ -45,7 +45,7 @@ export const LayoutHeader = () => { } const HomeScreen = () => { - return + return } export default HomeScreen diff --git a/app/(tabs)/settings.tsx b/app/(tabs)/settings.tsx index 98db8125a5..413651cba9 100644 --- a/app/(tabs)/settings.tsx +++ b/app/(tabs)/settings.tsx @@ -1,5 +1,5 @@ -import { Settings } from '@/src/features/Settings' +import { SettingsContainer } from '@/src/features/Settings' export default function SettingsScreen() { - return + return } diff --git a/app/(tabs)/transactions/(tabs)/index.tsx b/app/(tabs)/transactions/(tabs)/index.tsx index cb03e85c19..a7053dae7c 100644 --- a/app/(tabs)/transactions/(tabs)/index.tsx +++ b/app/(tabs)/transactions/(tabs)/index.tsx @@ -1,10 +1,10 @@ -import TxHistory from '@/src/features/TxHistory' +import { TxHistoryContainer } from '@/src/features/TxHistory' import { View } from 'react-native' export default function TransactionsScreen() { return ( - + ) } diff --git a/app/app-settings.tsx b/app/app-settings.tsx index 5630e339a3..9a34c18c14 100644 --- a/app/app-settings.tsx +++ b/app/app-settings.tsx @@ -1,8 +1,8 @@ +import { AppSettingsContainer } from '@/src/features/Settings/components/AppSettings' import React from 'react' -import { AppSettings } from '@/src/features/Settings/AppSettings' function SignersScreen() { - return + return } export default SignersScreen diff --git a/app/notifications.tsx b/app/notifications.tsx index f275f4807b..40f5da171e 100644 --- a/app/notifications.tsx +++ b/app/notifications.tsx @@ -1,8 +1,8 @@ import React from 'react' -import { Notifications } from '@/src/features/Notifications' +import { NotificationsContainer } from '@/src/features/Notifications' function NotificationsScreen() { - return + return } export default NotificationsScreen diff --git a/app/pending-transactions.tsx b/app/pending-transactions.tsx index eb24ed0689..3c15b4c08e 100644 --- a/app/pending-transactions.tsx +++ b/app/pending-transactions.tsx @@ -1,11 +1,12 @@ -import PendingTx from '@/src/features/PendingTx' import React from 'react' import { View } from 'tamagui' +import { PendingTxContainer } from '@/src/features/PendingTx' + function PendingScreen() { return ( - + ) } diff --git a/app/signers.tsx b/app/signers.tsx index 0e6a6f50e0..ab5a583ed9 100644 --- a/app/signers.tsx +++ b/app/signers.tsx @@ -1,8 +1,8 @@ import React from 'react' -import { Signers } from '@/src/features/Signers' +import { SignersContainer } from '@/src/features/Signers' function SignersScreen() { - return + return } export default SignersScreen diff --git a/src/features/Assets/Assets.container.tsx b/src/features/Assets/Assets.container.tsx new file mode 100644 index 0000000000..11b4f3db78 --- /dev/null +++ b/src/features/Assets/Assets.container.tsx @@ -0,0 +1,22 @@ +import React from 'react' + +import { SafeTab } from '@/src/components/SafeTab' + +import { TokensContainer } from '@/src/features/Assets/components/Tokens' +import { NFTsContainer } from '@/src/features/Assets/components/NFTs' +import { AssetsHeaderContainer } from '@/src/features/Assets/components/AssetsHeader' + +const tabItems = [ + { + label: 'Tokens', + Component: TokensContainer, + }, + { + label: `NFT's`, + Component: NFTsContainer, + }, +] + +export function AssetsContainer() { + return +} diff --git a/src/features/Assets/components/AssetsHeader/AssetsHeader.container.tsx b/src/features/Assets/components/AssetsHeader/AssetsHeader.container.tsx new file mode 100644 index 0000000000..5314a90f21 --- /dev/null +++ b/src/features/Assets/components/AssetsHeader/AssetsHeader.container.tsx @@ -0,0 +1,21 @@ +import usePendingTxs from '@/src/hooks/usePendingTxs' +import { router } from 'expo-router' +import { useCallback } from 'react' +import { AssetsHeader } from './AssetsHeader' + +export const AssetsHeaderContainer = () => { + const { amount, hasMore, isLoading } = usePendingTxs() + + const onPendingTransactionsPress = useCallback(() => { + router.push('/pending-transactions') + }, [router]) + + return ( + + ) +} diff --git a/src/features/Assets/components/AssetsHeader/AssetsHeader.tsx b/src/features/Assets/components/AssetsHeader/AssetsHeader.tsx new file mode 100644 index 0000000000..73bc9b6abb --- /dev/null +++ b/src/features/Assets/components/AssetsHeader/AssetsHeader.tsx @@ -0,0 +1,30 @@ +import React from 'react' +import { StyledAssetsHeader } from './styles' +import { View } from 'tamagui' +import { BalanceContainer } from '../Balance' +import { PendingTransactions } from '@/src/components/StatusBanners/PendingTransactions' + +interface AssetsHeaderProps { + amount: number + isLoading: boolean + onPendingTransactionsPress: () => void + hasMore: boolean +} + +export function AssetsHeader({ amount, isLoading, onPendingTransactionsPress, hasMore }: AssetsHeaderProps) { + return ( + + + {amount > 0 && ( + + )} + + + + + ) +} diff --git a/src/features/Assets/components/AssetsHeader/index.tsx b/src/features/Assets/components/AssetsHeader/index.tsx index f8f1b4c56a..44bb8fad04 100644 --- a/src/features/Assets/components/AssetsHeader/index.tsx +++ b/src/features/Assets/components/AssetsHeader/index.tsx @@ -1,33 +1,2 @@ -import { PendingTransactions } from '@/src/components/StatusBanners/PendingTransactions' -import usePendingTxs from '@/src/hooks/usePendingTxs' -import { router } from 'expo-router' -import { View } from 'tamagui' -import Balance from '../Balance' -import { StyledAssetsHeader } from './styles' -import { useCallback } from 'react' - -const AssetsHeader = () => { - const { amount, hasMore, isLoading } = usePendingTxs() - - const onPendingTransactionsPress = useCallback(() => { - router.push('/pending-transactions') - }, [router]) - - return ( - - - {amount > 0 && ( - - )} - - - - - ) -} - -export default AssetsHeader +import { AssetsHeaderContainer } from './AssetsHeader.container' +export { AssetsHeaderContainer } diff --git a/src/features/Assets/components/Balance/Balance.container.tsx b/src/features/Assets/components/Balance/Balance.container.tsx new file mode 100644 index 0000000000..739a089ec0 --- /dev/null +++ b/src/features/Assets/components/Balance/Balance.container.tsx @@ -0,0 +1,42 @@ +import { selectActiveChain, switchActiveChain } from '@/src/store/activeChainSlice' +import { useDispatch, useSelector } from 'react-redux' +import { useSafesGetSafeOverviewV1Query } from '@/src/store/gateway/AUTO_GENERATED/safes' +import { selectActiveSafe } from '@/src/store/activeSafeSlice' +import { SafeOverviewResult } from '@/src/store/gateway/types' +import { POLLING_INTERVAL } from '@/src/config/constants' +import { selectAllChains } from '@/src/store/gateway/chains' +import { Balance } from './Balance' + +const makeSafeId = (chainId: string, address: string) => `${chainId}:${address}` as `${number}:0x${string}` + +export function BalanceContainer() { + const activeChain = useSelector(selectActiveChain) + const chains = useSelector(selectAllChains) + const activeSafe = useSelector(selectActiveSafe) + const dispatch = useDispatch() + const { data, isLoading } = useSafesGetSafeOverviewV1Query( + { + safes: chains.map((chain) => makeSafeId(chain.chainId, activeSafe.address)).join(','), + currency: 'usd', + trusted: true, + excludeSpam: true, + }, + { + pollingInterval: POLLING_INTERVAL, + }, + ) + + const handleChainChange = (id: string) => { + dispatch(switchActiveChain({ id })) + } + + return ( + + ) +} diff --git a/src/features/Assets/components/Balance/Balance.tsx b/src/features/Assets/components/Balance/Balance.tsx new file mode 100644 index 0000000000..2836fc11f1 --- /dev/null +++ b/src/features/Assets/components/Balance/Balance.tsx @@ -0,0 +1,63 @@ +import React from 'react' +import { Image, Spinner, View } from 'tamagui' + +import { Alert } from '@/src/components/Alert' +import { Dropdown } from '@/src/components/Dropdown' +import { Fiat } from '@/src/components/Fiat' +import { SafeOverview } from '@/src/store/gateway/AUTO_GENERATED/safes' +import { Chain } from '@/src/store/gateway/AUTO_GENERATED/chains' + +import { ChainItems } from './ChainItems' + +interface BalanceProps { + activeChain: Chain + data: SafeOverview[] + isLoading: boolean + chains: Chain[] + onChainChange: (chainId: string) => void +} + +export function Balance({ activeChain, data, chains, isLoading, onChainChange }: BalanceProps) { + const balance = data?.find((chain) => chain.chainId === activeChain.chainId) + + return ( + + + {activeChain && ( + + label={activeChain?.chainName} + dropdownTitle="Select network:" + leftNode={ + activeChain?.chainLogoUri && ( + + ) + } + items={data} + keyExtractor={({ item }) => item.chainId} + renderItem={({ item, onClose }) => ( + { + onChainChange(chainId) + onClose() + }} + activeChain={activeChain} + fiatTotal={item.fiatTotal} + chains={chains} + chainId={item.chainId} + key={item.chainId} + /> + )} + /> + )} + + {isLoading ? ( + + ) : balance ? ( + + ) : ( + + )} + + + ) +} diff --git a/src/features/Assets/components/Balance/ChainItems.tsx b/src/features/Assets/components/Balance/ChainItems.tsx index 74d6bb0b93..b3bfde3708 100644 --- a/src/features/Assets/components/Balance/ChainItems.tsx +++ b/src/features/Assets/components/Balance/ChainItems.tsx @@ -13,7 +13,7 @@ interface ChainItemsProps { onSelect: (chainId: string) => void } -function ChainItems({ chainId, chains, activeChain, fiatTotal, onSelect }: ChainItemsProps) { +export function ChainItems({ chainId, chains, activeChain, fiatTotal, onSelect }: ChainItemsProps) { const chain = chains.find((item) => item.chainId === chainId) const isActive = chainId === activeChain.chainId @@ -38,5 +38,3 @@ function ChainItems({ chainId, chains, activeChain, fiatTotal, onSelect }: Chain ) } - -export default ChainItems diff --git a/src/features/Assets/components/Balance/index.tsx b/src/features/Assets/components/Balance/index.tsx index 50848355c6..fd6e5f9ffc 100644 --- a/src/features/Assets/components/Balance/index.tsx +++ b/src/features/Assets/components/Balance/index.tsx @@ -1,82 +1,2 @@ -import { Dropdown } from '@/src/components/Dropdown' -import { selectActiveChain, switchActiveChain } from '@/src/store/activeChainSlice' -import React from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { Image, Spinner, View } from 'tamagui' -import { SafeOverview, useSafesGetSafeOverviewV1Query } from '@/src/store/gateway/AUTO_GENERATED/safes' -import { selectActiveSafe } from '@/src/store/activeSafeSlice' -import { SafeOverviewResult } from '@/src/store/gateway/types' -import { Fiat } from '@/src/components/Fiat' -import { Alert } from '@/src/components/Alert' -import { POLLING_INTERVAL } from '@/src/config/constants' -import { selectAllChains } from '@/src/store/gateway/chains' -import ChainItems from './ChainItems' - -const makeSafeId = (chainId: string, address: string) => `${chainId}:${address}` as `${number}:0x${string}` - -function Balance() { - const activeChain = useSelector(selectActiveChain) - const chains = useSelector(selectAllChains) - const activeSafe = useSelector(selectActiveSafe) - const dispatch = useDispatch() - const { data, isLoading } = useSafesGetSafeOverviewV1Query( - { - safes: chains.map((chain) => makeSafeId(chain.chainId, activeSafe.address)).join(','), - currency: 'usd', - trusted: true, - excludeSpam: true, - }, - { - pollingInterval: POLLING_INTERVAL, - }, - ) - - const balance = data?.find((chain) => chain.chainId === activeChain.chainId) - - const handleChainChange = (id: string) => { - dispatch(switchActiveChain({ id })) - } - - return ( - - - {activeChain && ( - - label={activeChain?.chainName} - dropdownTitle="Select network:" - leftNode={ - activeChain?.chainLogoUri && ( - - ) - } - items={data} - keyExtractor={({ item }) => item.chainId} - renderItem={({ item, onClose }) => ( - { - handleChainChange(chainId) - onClose() - }} - activeChain={activeChain} - fiatTotal={item.fiatTotal} - chains={chains} - chainId={item.chainId} - key={item.chainId} - /> - )} - /> - )} - - {isLoading ? ( - - ) : balance ? ( - - ) : ( - - )} - - - ) -} - -export default Balance +import { BalanceContainer } from './Balance.container' +export { BalanceContainer } diff --git a/src/features/Assets/components/Fallback/index.tsx b/src/features/Assets/components/Fallback/Fallback.tsx similarity index 72% rename from src/features/Assets/components/Fallback/index.tsx rename to src/features/Assets/components/Fallback/Fallback.tsx index 5dcd6a3ef8..e290f86076 100644 --- a/src/features/Assets/components/Fallback/index.tsx +++ b/src/features/Assets/components/Fallback/Fallback.tsx @@ -3,9 +3,9 @@ import { Spinner } from 'tamagui' import { Alert } from '@/src/components/Alert' import { SafeTab } from '@/src/components/SafeTab' -import NoFunds from '../NoFunds' +import { NoFunds } from '../NoFunds' -const Fallback = ({ loading, hasError }: { loading: boolean; hasError: boolean }) => ( +export const Fallback = ({ loading, hasError }: { loading: boolean; hasError: boolean }) => ( {loading ? ( @@ -16,5 +16,3 @@ const Fallback = ({ loading, hasError }: { loading: boolean; hasError: boolean } )} ) - -export default Fallback diff --git a/src/features/Assets/components/Fallback/index.ts b/src/features/Assets/components/Fallback/index.ts new file mode 100644 index 0000000000..eb18c0665e --- /dev/null +++ b/src/features/Assets/components/Fallback/index.ts @@ -0,0 +1,2 @@ +import { Fallback } from './Fallback' +export { Fallback } diff --git a/src/features/Assets/components/NFTs/NFTItem.tsx b/src/features/Assets/components/NFTs/NFTItem.tsx index 4b9b94e147..e1687c5d00 100644 --- a/src/features/Assets/components/NFTs/NFTItem.tsx +++ b/src/features/Assets/components/NFTs/NFTItem.tsx @@ -1,8 +1,8 @@ +import React from 'react' import { AssetsCard } from '@/src/components/transactions-list/Card/AssetsCard' import { Collectible } from '@/src/store/gateway/AUTO_GENERATED/collectibles' -import React from 'react' -function NFTItem({ item }: { item: Collectible }) { +export function NFTItem({ item }: { item: Collectible }) { return ( ) } - -export default NFTItem diff --git a/src/features/Assets/components/NFTs/NFTs.container.tsx b/src/features/Assets/components/NFTs/NFTs.container.tsx new file mode 100644 index 0000000000..d713475066 --- /dev/null +++ b/src/features/Assets/components/NFTs/NFTs.container.tsx @@ -0,0 +1,62 @@ +import { safelyDecodeURIComponent } from 'expo-router/build/fork/getStateFromPath-forks' +import React, { useEffect, useState } from 'react' +import { useSelector } from 'react-redux' + +import { SafeTab } from '@/src/components/SafeTab' +import { POLLING_INTERVAL } from '@/src/config/constants' +import { selectActiveSafe } from '@/src/store/activeSafeSlice' +import { + Collectible, + CollectiblePage, + useCollectiblesGetCollectiblesV2Query, +} from '@/src/store/gateway/AUTO_GENERATED/collectibles' + +import { Fallback } from '../Fallback' +import { NFTItem } from './NFTItem' + +export function NFTsContainer() { + const activeSafe = useSelector(selectActiveSafe) + const [pageUrl, setPageUrl] = useState() + const [list, setList] = useState() + + const { data, isLoading, error, refetch } = useCollectiblesGetCollectiblesV2Query( + { + chainId: activeSafe.chainId, + safeAddress: activeSafe.address, + cursor: pageUrl && safelyDecodeURIComponent(pageUrl?.split('cursor=')[1]), + }, + { + pollingInterval: POLLING_INTERVAL, + }, + ) + + useEffect(() => { + if (!data?.results) { + return + } + + setList((prev) => (prev ? [...prev, ...data.results] : data.results)) + }, [data]) + + const onEndReached = () => { + if (!data?.next) { + return + } + + setPageUrl(data.next) + refetch() + } + + if (isLoading || !list?.length || error) { + return + } + + return ( + + onEndReached={onEndReached} + data={list} + renderItem={NFTItem} + keyExtractor={(item) => item.id} + /> + ) +} diff --git a/src/features/Assets/components/NFTs/index.tsx b/src/features/Assets/components/NFTs/index.tsx index 51275136c5..cbcb115f84 100644 --- a/src/features/Assets/components/NFTs/index.tsx +++ b/src/features/Assets/components/NFTs/index.tsx @@ -1,64 +1,2 @@ -import { safelyDecodeURIComponent } from 'expo-router/build/fork/getStateFromPath-forks' -import React, { useEffect, useState } from 'react' -import { useSelector } from 'react-redux' - -import { SafeTab } from '@/src/components/SafeTab' -import { POLLING_INTERVAL } from '@/src/config/constants' -import { selectActiveSafe } from '@/src/store/activeSafeSlice' -import { - Collectible, - CollectiblePage, - useCollectiblesGetCollectiblesV2Query, -} from '@/src/store/gateway/AUTO_GENERATED/collectibles' - -import Fallback from '../Fallback' -import NFTItem from './NFTItem' - -function NFTs() { - const activeSafe = useSelector(selectActiveSafe) - const [pageUrl, setPageUrl] = useState() - const [list, setList] = useState() - - const { data, isLoading, error, refetch } = useCollectiblesGetCollectiblesV2Query( - { - chainId: activeSafe.chainId, - safeAddress: activeSafe.address, - cursor: pageUrl && safelyDecodeURIComponent(pageUrl?.split('cursor=')[1]), - }, - { - pollingInterval: POLLING_INTERVAL, - }, - ) - - useEffect(() => { - if (!data?.results) { - return - } - - setList((prev) => (prev ? [...prev, ...data.results] : data.results)) - }, [data]) - - const onEndReached = () => { - if (!data?.next) { - return - } - - setPageUrl(data.next) - refetch() - } - - if (isLoading || !list?.length || error) { - return - } - - return ( - - onEndReached={onEndReached} - data={list} - renderItem={NFTItem} - keyExtractor={(item) => item.id} - /> - ) -} - -export default NFTs +import { NFTsContainer } from './NFTs.container' +export { NFTsContainer } diff --git a/src/features/Assets/components/NoFunds/index.tsx b/src/features/Assets/components/NoFunds/NoFunds.tsx similarity index 90% rename from src/features/Assets/components/NoFunds/index.tsx rename to src/features/Assets/components/NoFunds/NoFunds.tsx index d68b6e6252..b0cf7f0e9d 100644 --- a/src/features/Assets/components/NoFunds/index.tsx +++ b/src/features/Assets/components/NoFunds/NoFunds.tsx @@ -2,7 +2,7 @@ import React from 'react' import { H3, Text, View } from 'tamagui' import EmptyToken from './EmptyToken' -function NoFunds() { +export function NoFunds() { return ( @@ -13,5 +13,3 @@ function NoFunds() { ) } - -export default NoFunds diff --git a/src/features/Assets/components/NoFunds/index.ts b/src/features/Assets/components/NoFunds/index.ts new file mode 100644 index 0000000000..cc15cc4e9b --- /dev/null +++ b/src/features/Assets/components/NoFunds/index.ts @@ -0,0 +1,2 @@ +import { NoFunds } from './NoFunds' +export { NoFunds } diff --git a/src/features/Assets/components/Tokens/Tokens.container.tsx b/src/features/Assets/components/Tokens/Tokens.container.tsx new file mode 100644 index 0000000000..f319433094 --- /dev/null +++ b/src/features/Assets/components/Tokens/Tokens.container.tsx @@ -0,0 +1,59 @@ +import React from 'react' +import { ListRenderItem } from 'react-native' +import { useSelector } from 'react-redux' +import { Text } from 'tamagui' + +import { SafeTab } from '@/src/components/SafeTab' +import { AssetsCard } from '@/src/components/transactions-list/Card/AssetsCard' +import { POLLING_INTERVAL } from '@/src/config/constants' +import { selectActiveSafe } from '@/src/store/activeSafeSlice' +import { Balance, useBalancesGetBalancesV1Query } from '@/src/store/gateway/AUTO_GENERATED/balances' +import { formatValue } from '@/src/utils/formatters' +import { selectActiveChain } from '@/src/store/activeChainSlice' + +import { Fallback } from '../Fallback' + +export function TokensContainer() { + const activeSafe = useSelector(selectActiveSafe) + const activeChain = useSelector(selectActiveChain) + + const { data, isLoading, error } = useBalancesGetBalancesV1Query( + { + chainId: activeChain?.chainId, + fiatCode: 'USD', + safeAddress: activeSafe.address, + excludeSpam: false, + trusted: true, + }, + { + pollingInterval: POLLING_INTERVAL, + }, + ) + + const renderItem: ListRenderItem = React.useCallback(({ item }) => { + return ( + + ${item.fiatBalance} + + } + /> + ) + }, []) + + if (isLoading || !data?.items.length || error) { + return + } + + return ( + + data={data?.items} + renderItem={renderItem} + keyExtractor={(item, index): string => item.tokenInfo.name + index} + /> + ) +} diff --git a/src/features/Assets/components/Tokens/index.tsx b/src/features/Assets/components/Tokens/index.tsx index 4cf2729913..c2dd3ac69f 100644 --- a/src/features/Assets/components/Tokens/index.tsx +++ b/src/features/Assets/components/Tokens/index.tsx @@ -1,59 +1,2 @@ -import { SafeTab } from '@/src/components/SafeTab' -import { AssetsCard } from '@/src/components/transactions-list/Card/AssetsCard' -import { POLLING_INTERVAL } from '@/src/config/constants' -import { selectActiveSafe } from '@/src/store/activeSafeSlice' -import { Balance, useBalancesGetBalancesV1Query } from '@/src/store/gateway/AUTO_GENERATED/balances' -import { formatValue } from '@/src/utils/formatters' -import React from 'react' -import { ListRenderItem } from 'react-native' -import { useSelector } from 'react-redux' -import { Text } from 'tamagui' -import { selectActiveChain } from '@/src/store/activeChainSlice' -import Fallback from '../Fallback' - -function Tokens() { - const activeSafe = useSelector(selectActiveSafe) - const activeChain = useSelector(selectActiveChain) - - const { data, isLoading, error } = useBalancesGetBalancesV1Query( - { - chainId: activeChain?.chainId, - fiatCode: 'USD', - safeAddress: activeSafe.address, - excludeSpam: false, - trusted: true, - }, - { - pollingInterval: POLLING_INTERVAL, - }, - ) - - const renderItem: ListRenderItem = React.useCallback(({ item }) => { - return ( - - ${item.fiatBalance} - - } - /> - ) - }, []) - - if (isLoading || !data?.items.length || error) { - return - } - - return ( - - data={data?.items} - renderItem={renderItem} - keyExtractor={(item, index): string => item.tokenInfo.name + index} - /> - ) -} - -export default Tokens +import { TokensContainer } from './Tokens.container' +export { TokensContainer } diff --git a/src/features/Assets/index.tsx b/src/features/Assets/index.tsx index 09142eda02..d08f5e70ca 100644 --- a/src/features/Assets/index.tsx +++ b/src/features/Assets/index.tsx @@ -1,22 +1,2 @@ -import React from 'react' -import { SafeTab } from '@/src/components/SafeTab' -import Tokens from './components/Tokens' -import AssetsHeader from './components/AssetsHeader' -import NFTs from './components/NFTs' - -const tabItems = [ - { - label: 'Tokens', - Component: Tokens, - }, - { - label: `NFT's`, - Component: NFTs, - }, -] - -function Assets() { - return -} - -export default Assets +import { AssetsContainer } from './Assets.container' +export { AssetsContainer } diff --git a/src/features/Notifications/Notifications.container.tsx b/src/features/Notifications/Notifications.container.tsx new file mode 100644 index 0000000000..7b4bda088b --- /dev/null +++ b/src/features/Notifications/Notifications.container.tsx @@ -0,0 +1,10 @@ +import { View, Text } from 'tamagui' +import React from 'react' + +export const NotificationsContainer = () => { + return ( + + Notifications + + ) +} diff --git a/src/features/Notifications/index.tsx b/src/features/Notifications/index.tsx index d5f4f2db80..b5f074338c 100644 --- a/src/features/Notifications/index.tsx +++ b/src/features/Notifications/index.tsx @@ -1,10 +1,2 @@ -import { View, Text } from 'tamagui' -import React from 'react' - -export const Notifications = () => { - return ( - - Notifications - - ) -} +import { NotificationsContainer } from './Notifications.container' +export { NotificationsContainer } diff --git a/src/features/PendingTx/PendingTx.container.tsx b/src/features/PendingTx/PendingTx.container.tsx new file mode 100644 index 0000000000..da1118db1c --- /dev/null +++ b/src/features/PendingTx/PendingTx.container.tsx @@ -0,0 +1,17 @@ +import React from 'react' +import { PendingTxListContainer } from '@/src/features/PendingTx/components/PendingTxList' +import usePendingTxs from '@/src/hooks/usePendingTxs' + +export function PendingTxContainer() { + const { data, isLoading, fetchMoreTx, hasMore, amount } = usePendingTxs() + + return ( + + ) +} diff --git a/src/features/PendingTx/PendingTxList.tsx b/src/features/PendingTx/components/PendingTxList/PendingTxList.container.tsx similarity index 90% rename from src/features/PendingTx/PendingTxList.tsx rename to src/features/PendingTx/components/PendingTxList/PendingTxList.container.tsx index b4f8a177b8..51d713ea24 100644 --- a/src/features/PendingTx/PendingTxList.tsx +++ b/src/features/PendingTx/components/PendingTxList/PendingTxList.container.tsx @@ -2,7 +2,7 @@ import { SafeListItem } from '@/src/components/SafeListItem' import React from 'react' import { SectionList } from 'react-native' import { Spinner, View } from 'tamagui' -import { Badge } from '../../components/Badge' +import { Badge } from '@/src/components/Badge' import { NavBarTitle } from '@/src/components/Title/NavBarTitle' import { LargeHeaderTitle } from '@/src/components/Title/LargeHeaderTitle' import { useScrollableHeader } from '@/src/navigation/useScrollableHeader' @@ -15,7 +15,7 @@ export interface GroupedPendingTxsWithTitle { data: (PendingTransactionItems | TransactionQueuedItem[])[] } -interface PendingTxListProps { +interface PendingTxListContainerProps { transactions: GroupedPendingTxsWithTitle[] onEndReached: (info: { distanceFromEnd: number }) => void isLoading?: boolean @@ -23,7 +23,13 @@ interface PendingTxListProps { hasMore: boolean } -function PendingTxList({ transactions, onEndReached, isLoading, hasMore, amount }: PendingTxListProps) { +export function PendingTxListContainer({ + transactions, + onEndReached, + isLoading, + hasMore, + amount, +}: PendingTxListContainerProps) { const { handleScroll } = useScrollableHeader({ children: ( <> @@ -61,5 +67,3 @@ function PendingTxList({ transactions, onEndReached, isLoading, hasMore, amount /> ) } - -export default PendingTxList diff --git a/src/features/PendingTx/components/PendingTxList/index.ts b/src/features/PendingTx/components/PendingTxList/index.ts new file mode 100644 index 0000000000..b3867e5adb --- /dev/null +++ b/src/features/PendingTx/components/PendingTxList/index.ts @@ -0,0 +1,2 @@ +import { PendingTxListContainer } from './PendingTxList.container' +export { PendingTxListContainer } diff --git a/src/features/PendingTx/index.tsx b/src/features/PendingTx/index.tsx index ea65d3c4cd..74ebac85f8 100644 --- a/src/features/PendingTx/index.tsx +++ b/src/features/PendingTx/index.tsx @@ -1,18 +1,2 @@ -import React from 'react' -import PendingTxList from './PendingTxList' -import usePendingTxs from '@/src/hooks/usePendingTxs' - -function PendingTx() { - const { data, isLoading, fetchMoreTx, hasMore, amount } = usePendingTxs() - return ( - - ) -} - -export default PendingTx +import { PendingTxContainer } from './PendingTx.container' +export { PendingTxContainer } diff --git a/src/features/PendingTx/utils.tsx b/src/features/PendingTx/utils.tsx index 61c38b7cff..ff59407a70 100644 --- a/src/features/PendingTx/utils.tsx +++ b/src/features/PendingTx/utils.tsx @@ -7,7 +7,6 @@ import { isTransactionListItem, } from '@/src/utils/transaction-guards' import { groupBulkTxs } from '@/src/utils/transactions' -import { GroupedPendingTxsWithTitle } from '@/src/features/PendingTx/PendingTxList' import { type PendingTransactionItems, TransactionListItemType } from '@/src/store/gateway/types' import { View } from 'tamagui' import { TxGroupedCard } from '@/src/components/transactions-list/Card/TxGroupedCard' @@ -15,6 +14,7 @@ import { TxConflictingCard } from '@/src/components/transactions-list/Card/TxCon import { SafeListItem } from '@/src/components/SafeListItem' import { TxInfo } from '@/src/components/TxInfo' import React from 'react' +import { GroupedPendingTxsWithTitle } from './components/PendingTxList/PendingTxList.container' type GroupedTxs = (PendingTransactionItems | TransactionQueuedItem[])[] diff --git a/src/features/Settings/AppSettings.tsx b/src/features/Settings/AppSettings.tsx deleted file mode 100644 index 996b1445eb..0000000000 --- a/src/features/Settings/AppSettings.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { View, Text, Input } from 'tamagui' -import { TouchableOpacity } from 'react-native' -import React, { useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { selectActiveChain } from '@/src/store/activeChainSlice' -import { setActiveSafe } from '@/src/store/activeSafeSlice' -import { Address } from '@/src/types/address' - -export const AppSettings = () => { - const dispatch = useDispatch() - const activeChain = useSelector(selectActiveChain) - const [safeAddress, setSafeAddress] = useState('') - - const handleSubmit = () => { - dispatch( - setActiveSafe({ - chainId: activeChain.chainId, - address: safeAddress as Address, - }), - ) - } - return ( - - - - - Set Safe Address - - - - ) -} diff --git a/src/features/Settings/Settings.container.tsx b/src/features/Settings/Settings.container.tsx new file mode 100644 index 0000000000..54446c1c96 --- /dev/null +++ b/src/features/Settings/Settings.container.tsx @@ -0,0 +1,24 @@ +import { useEffect } from 'react' +import { useGetSafeQuery } from '@/src/store/gateway' +import { SafeState } from '@/src/store/gateway/AUTO_GENERATED/safes' +import { useNavigation } from 'expo-router' +import { useSelector } from 'react-redux' +import { selectActiveSafe } from '@/src/store/activeSafeSlice' +import SettingsPresentation from './Settings' + +export const SettingsContainer = () => { + const navigation = useNavigation() + const { chainId, address } = useSelector(selectActiveSafe) + const { data = {} as SafeState } = useGetSafeQuery({ + chainId: chainId, + safeAddress: address, + }) + + useEffect(() => { + navigation.setParams({ + safeAddress: address, + }) + }, [address]) + + return +} diff --git a/src/features/Settings/Settings.tsx b/src/features/Settings/Settings.tsx new file mode 100644 index 0000000000..29b083a500 --- /dev/null +++ b/src/features/Settings/Settings.tsx @@ -0,0 +1,145 @@ +import React from 'react' +import { H2, ScrollView, Text, View, XStack, YStack } from 'tamagui' +import { SafeFontIcon as Icon } from '@/src/components/SafeFontIcon/SafeFontIcon' +import { SafeListItem } from '@/src/components/SafeListItem' +import { Skeleton } from 'moti/skeleton' +import { Pressable } from 'react-native' +import { EthAddress } from '@/src/components/EthAddress' +import { Address } from '@/src/types/address' +import { router } from 'expo-router' +import { IdenticonWithBadge } from '@/src/features/Settings/components/IdenticonWithBadge' +import { SafeState } from '@/src/store/gateway/AUTO_GENERATED/safes' + +interface SettingsProps { + data: SafeState + address: `0x${string}` +} + +function Settings({ address, data }: SettingsProps) { + const { owners = [], threshold, implementation } = data + + return ( + + + + + +

+ My DAO +

+ + + + + + + saaafe.xyz + + +
+ + + + + + + {owners.length} + + + + + Signers + + + + + + + + {threshold}/{owners.length} + + + + + Threshold + + + + + + + Members + [{ opacity: pressed ? 0.5 : 1.0 }]} + onPress={() => { + router.push('/signers') + }} + > + } + rightNode={ + + + + {owners.length} + + + + + + + } + /> + + + + + General + + [{ opacity: pressed ? 0.5 : 1.0 }]} + onPress={() => { + router.push('/notifications') + }} + > + } + rightNode={} + /> + + + + +
+ + {/* Footer */} + + {implementation?.name} + +
+
+ ) +} + +export default Settings diff --git a/src/features/Settings/components/AppSettings/AppSettings.container.tsx b/src/features/Settings/components/AppSettings/AppSettings.container.tsx new file mode 100644 index 0000000000..977811381a --- /dev/null +++ b/src/features/Settings/components/AppSettings/AppSettings.container.tsx @@ -0,0 +1,22 @@ +import React, { useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { selectActiveChain } from '@/src/store/activeChainSlice' +import { setActiveSafe } from '@/src/store/activeSafeSlice' +import { Address } from '@/src/types/address' +import { AppSettings } from './AppSettings' + +export const AppSettingsContainer = () => { + const dispatch = useDispatch() + const activeChain = useSelector(selectActiveChain) + const [safeAddress, setSafeAddress] = useState('') + + const handleSubmit = () => { + dispatch( + setActiveSafe({ + chainId: activeChain.chainId, + address: safeAddress as Address, + }), + ) + } + return +} diff --git a/src/features/Settings/components/AppSettings/AppSettings.tsx b/src/features/Settings/components/AppSettings/AppSettings.tsx new file mode 100644 index 0000000000..bfc6dc0c79 --- /dev/null +++ b/src/features/Settings/components/AppSettings/AppSettings.tsx @@ -0,0 +1,29 @@ +import { View, Text, Input } from 'tamagui' +import { TouchableOpacity } from 'react-native' + +interface AppSettingsProps { + address: string + onSubmit: () => void + onAddressChange: (address: string) => void +} + +export const AppSettings = ({ address, onAddressChange, onSubmit }: AppSettingsProps) => { + return ( + + + + + Set Safe Address + + + + ) +} diff --git a/src/features/Settings/components/AppSettings/index.ts b/src/features/Settings/components/AppSettings/index.ts new file mode 100644 index 0000000000..5e68ca4159 --- /dev/null +++ b/src/features/Settings/components/AppSettings/index.ts @@ -0,0 +1,2 @@ +import { AppSettingsContainer } from './AppSettings.container' +export { AppSettingsContainer } diff --git a/src/features/Settings/components/IdenticonWithBadge.tsx b/src/features/Settings/components/IdenticonWithBadge/IdenticonWithBadge.tsx similarity index 100% rename from src/features/Settings/components/IdenticonWithBadge.tsx rename to src/features/Settings/components/IdenticonWithBadge/IdenticonWithBadge.tsx diff --git a/src/features/Settings/components/IdenticonWithBadge/index.ts b/src/features/Settings/components/IdenticonWithBadge/index.ts new file mode 100644 index 0000000000..709c911ee3 --- /dev/null +++ b/src/features/Settings/components/IdenticonWithBadge/index.ts @@ -0,0 +1,2 @@ +import { IdenticonWithBadge } from './IdenticonWithBadge' +export { IdenticonWithBadge } diff --git a/src/features/Settings/components/Navbar/index.ts b/src/features/Settings/components/Navbar/index.ts new file mode 100644 index 0000000000..a87e583366 --- /dev/null +++ b/src/features/Settings/components/Navbar/index.ts @@ -0,0 +1,2 @@ +import { Navbar } from './Navbar' +export { Navbar } diff --git a/src/features/Settings/index.tsx b/src/features/Settings/index.tsx index 79ba880a68..1d77d701b1 100644 --- a/src/features/Settings/index.tsx +++ b/src/features/Settings/index.tsx @@ -1,154 +1,2 @@ -import React, { useEffect } from 'react' -import { H2, ScrollView, Text, View, XStack, YStack } from 'tamagui' -import { SafeFontIcon as Icon } from '@/src/components/SafeFontIcon/SafeFontIcon' -import { SafeListItem } from '@/src/components/SafeListItem' -import { useGetSafeQuery } from '@/src/store/gateway' -import { Skeleton } from 'moti/skeleton' -import { Pressable } from 'react-native' -import { EthAddress } from '@/src/components/EthAddress' -import { SafeState } from '@/src/store/gateway/AUTO_GENERATED/safes' -import { Address } from '@/src/types/address' -import { router, useNavigation } from 'expo-router' -import { IdenticonWithBadge } from '@/src/features/Settings/components/IdenticonWithBadge' -import { useSelector } from 'react-redux' -import { selectActiveSafe } from '@/src/store/activeSafeSlice' - -export const Settings = () => { - const navigation = useNavigation() - const { chainId, address } = useSelector(selectActiveSafe) - const { data = {} as SafeState } = useGetSafeQuery({ - chainId: chainId, - safeAddress: address, - }) - - useEffect(() => { - navigation.setParams({ - safeAddress: address, - }) - }, [address]) - - const { owners = [], threshold, implementation } = data - - return ( - - - - - -

- My DAO -

- - - - - - - saaafe.xyz - - -
- - - - - - - {owners.length} - - - - - Signers - - - - - - - - {threshold}/{owners.length} - - - - - Threshold - - - - - - - Members - [{ opacity: pressed ? 0.5 : 1.0 }]} - onPress={() => { - router.push('/signers') - }} - > - } - rightNode={ - - - - {owners.length} - - - - - - - } - /> - - - - - General - - [{ opacity: pressed ? 0.5 : 1.0 }]} - onPress={() => { - router.push('/notifications') - }} - > - } - rightNode={} - /> - - - - -
- - {/* Footer */} - - {implementation?.name} - -
-
- ) -} +import { SettingsContainer } from './Settings.container' +export { SettingsContainer } diff --git a/src/features/Signers/Signers.container.tsx b/src/features/Signers/Signers.container.tsx new file mode 100644 index 0000000000..dbbb083418 --- /dev/null +++ b/src/features/Signers/Signers.container.tsx @@ -0,0 +1,9 @@ +import { View, Text } from 'tamagui' + +export const SignersContainer = () => { + return ( + + Signers + + ) +} diff --git a/src/features/Signers/index.tsx b/src/features/Signers/index.tsx index 286e2985af..7a56ad945f 100644 --- a/src/features/Signers/index.tsx +++ b/src/features/Signers/index.tsx @@ -1,9 +1,2 @@ -import { View, Text } from 'tamagui' - -export const Signers = () => { - return ( - - Signers - - ) -} +import { SignersContainer } from './Signers.container' +export { SignersContainer } diff --git a/src/features/TxHistory/TxHistory.container.tsx b/src/features/TxHistory/TxHistory.container.tsx new file mode 100644 index 0000000000..101a4928d5 --- /dev/null +++ b/src/features/TxHistory/TxHistory.container.tsx @@ -0,0 +1,38 @@ +import React, { useEffect, useState } from 'react' +import { useSelector } from 'react-redux' +import { safelyDecodeURIComponent } from 'expo-router/build/fork/getStateFromPath-forks' + +import { useGetTxsHistoryQuery } from '@/src/store/gateway' +import type { TransactionItemPage } from '@/src/store/gateway/AUTO_GENERATED/transactions' +import { selectActiveSafe } from '@/src/store/activeSafeSlice' +import { TxHistoryList } from '@/src/features/TxHistory/components/TxHistoryList' + +export function TxHistoryContainer() { + const [pageUrl, setPageUrl] = useState() + const [list, setList] = useState([]) + const activeSafe = useSelector(selectActiveSafe) + const { data, refetch, isFetching, isUninitialized } = useGetTxsHistoryQuery({ + chainId: activeSafe.chainId, + safeAddress: activeSafe.address, + cursor: pageUrl && safelyDecodeURIComponent(pageUrl?.split('cursor=')[1]), + }) + + useEffect(() => { + if (!data?.results) { + return + } + + setList((prev) => [...prev, ...data.results]) + }, [data]) + + const onEndReached = () => { + if (!data?.next) { + return + } + + setPageUrl(data.next) + refetch() + } + + return +} diff --git a/src/features/TxHistory/TxHistoryList.tsx b/src/features/TxHistory/components/TxHistoryList/TxHistoryList.tsx similarity index 92% rename from src/features/TxHistory/TxHistoryList.tsx rename to src/features/TxHistory/components/TxHistoryList/TxHistoryList.tsx index 4e901c9341..9975d88edc 100644 --- a/src/features/TxHistory/TxHistoryList.tsx +++ b/src/features/TxHistory/components/TxHistoryList/TxHistoryList.tsx @@ -14,7 +14,7 @@ interface TxHistoryList { isLoading?: boolean } -function TxHistoryList({ transactions, onEndReached, isLoading }: TxHistoryList) { +export function TxHistoryList({ transactions, onEndReached, isLoading }: TxHistoryList) { const groupedList: GroupedTxsWithTitle[] = useMemo(() => { return groupTxsByDate(transactions || []) }, [transactions]) @@ -33,5 +33,3 @@ function TxHistoryList({ transactions, onEndReached, isLoading }: TxHistoryList) /> ) } - -export default TxHistoryList diff --git a/src/features/TxHistory/components/TxHistoryList/index.ts b/src/features/TxHistory/components/TxHistoryList/index.ts new file mode 100644 index 0000000000..86e3dcfe65 --- /dev/null +++ b/src/features/TxHistory/components/TxHistoryList/index.ts @@ -0,0 +1,2 @@ +import { TxHistoryList } from './TxHistoryList' +export { TxHistoryList } diff --git a/src/features/TxHistory/index.tsx b/src/features/TxHistory/index.tsx index 6093638feb..be8a9b5471 100644 --- a/src/features/TxHistory/index.tsx +++ b/src/features/TxHistory/index.tsx @@ -1,39 +1,2 @@ -import React, { useEffect, useState } from 'react' -import TxHistoryList from './TxHistoryList' -import { useSelector } from 'react-redux' -import { selectActiveSafe } from '@/src/store/activeSafeSlice' -import { useGetTxsHistoryQuery } from '../../store/gateway' -import type { TransactionItemPage } from '../../store/gateway/AUTO_GENERATED/transactions' -import { safelyDecodeURIComponent } from 'expo-router/build/fork/getStateFromPath-forks' - -function TxHistory() { - const [pageUrl, setPageUrl] = useState() - const [list, setList] = useState([]) - const activeSafe = useSelector(selectActiveSafe) - const { data, refetch, isFetching, isUninitialized } = useGetTxsHistoryQuery({ - chainId: activeSafe.chainId, - safeAddress: activeSafe.address, - cursor: pageUrl && safelyDecodeURIComponent(pageUrl?.split('cursor=')[1]), - }) - - useEffect(() => { - if (!data?.results) { - return - } - - setList((prev) => [...prev, ...data.results]) - }, [data]) - - const onEndReached = () => { - if (!data?.next) { - return - } - - setPageUrl(data.next) - refetch() - } - - return -} - -export default TxHistory +import { TxHistoryContainer } from './TxHistory.container' +export { TxHistoryContainer } diff --git a/src/hooks/usePendingTxs/index.ts b/src/hooks/usePendingTxs/index.ts index 30e5a3d9a8..278193abec 100644 --- a/src/hooks/usePendingTxs/index.ts +++ b/src/hooks/usePendingTxs/index.ts @@ -42,7 +42,7 @@ const usePendingTxs = () => { const pendingTxs = useMemo(() => groupPendingTxs(list || []), [list]) return { - hasMore: data?.next, + hasMore: Boolean(data?.next), amount: pendingTxs.amount, data: pendingTxs.sections, fetchMoreTx, From dc22e6558363029393a827afb7779109e1409b28 Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Thu, 28 Nov 2024 18:02:17 +0100 Subject: [PATCH 35/49] feat: blurred identicon header (#42) --- app/(tabs)/_layout.tsx | 15 +- app/(tabs)/index.tsx | 65 ------ ios/Podfile.lock | 6 + package-lock.json | 12 + package.json | 3 +- .../BlurredIdenticonBackground.stories.tsx | 32 +++ .../BlurredIdenticonBackground.tsx | 69 ++++++ .../BlurredIdenticonBackground/index.tsx | 1 + .../components/AssetsHeader/AssetsHeader.tsx | 6 +- .../Assets/components/Navbar/Navbar.tsx | 48 ++++ .../Assets/components/Navbar/index.tsx | 1 + src/features/Settings/Settings.container.tsx | 13 +- src/features/Settings/Settings.tsx | 216 +++++++++--------- .../Settings/components/Navbar/Navbar.tsx | 30 ++- 14 files changed, 318 insertions(+), 199 deletions(-) create mode 100644 src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.stories.tsx create mode 100644 src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx create mode 100644 src/components/BlurredIdenticonBackground/index.tsx create mode 100644 src/features/Assets/components/Navbar/Navbar.tsx create mode 100644 src/features/Assets/components/Navbar/index.tsx diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index b8287062aa..67f31e55b0 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -1,8 +1,7 @@ import { Tabs } from 'expo-router' import React from 'react' import { TabBarIcon } from '@/src/components/navigation/TabBarIcon' -import { LayoutHeader } from '.' -import { Navbar } from '@/src/features/Settings/components/Navbar/' +import { Navbar as AssetsNavbar } from '@/src/features/Assets/components/Navbar/Navbar' export default function TabLayout() { return ( @@ -10,7 +9,7 @@ export default function TabLayout() { , }} @@ -28,17 +27,11 @@ export default function TabLayout() { { - // @ts-ignore - const safeAddress = route.params?.safeAddress + options={() => { return { title: 'Settings', - headerShown: true, - headerShadowVisible: false, + headerShown: false, tabBarIcon: ({ color }) => , - headerRight: () => { - return - }, } }} /> diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index bfbd99fd09..d160099bc8 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -1,73 +1,8 @@ -import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' -import { StyleSheet, TouchableOpacity } from 'react-native' -import { SafeAreaView } from 'react-native-safe-area-context' -import { Avatar, Image, Text, View } from 'tamagui' import React from 'react' -import { useSelector } from 'react-redux' -import { selectActiveSafe } from '@/src/store/activeSafeSlice' -import { shortenAddress } from '@/src/utils/formatters' -import { InnerShadow } from '@/src/components/InnerShadow' import { AssetsContainer } from '@/src/features/Assets' -// TODO: take it from safe wallet slice info -const fakeAccountUri = 'https://images.unsplash.com/photo-1531384441138-2736e62e0919?&w=100&h=100&dpr=2&q=80' - -export const LayoutHeader = () => { - const activeSafe = useSelector(selectActiveSafe) - - return ( - - - - - - - - - - - - - - - {shortenAddress(activeSafe.address)} - - - - - - - - - - - ) -} - const HomeScreen = () => { return } export default HomeScreen - -export const styles = StyleSheet.create({ - headerContainer: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - paddingHorizontal: 10, - paddingVertical: 16, - }, - absolute: { - position: 'absolute', - top: 0, - left: 0, - bottom: 0, - right: 0, - }, - image: { - width: '100%', - height: '100%', - resizeMode: 'cover', - }, -}) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8660db1e39..0bdea054ea 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -11,6 +11,8 @@ PODS: - ExpoModulesCore - ExpoAsset (11.0.1): - ExpoModulesCore + - ExpoBlur (14.0.1): + - ExpoModulesCore - ExpoFileSystem (18.0.3): - ExpoModulesCore - ExpoFont (13.0.1): @@ -2065,6 +2067,7 @@ DEPENDENCIES: - EXConstants (from `../node_modules/expo-constants/ios`) - Expo (from `../node_modules/expo`) - ExpoAsset (from `../node_modules/expo-asset/ios`) + - ExpoBlur (from `../node_modules/expo-blur/ios`) - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - ExpoFont (from `../node_modules/expo-font/ios`) - ExpoHead (from `../node_modules/expo-router/ios`) @@ -2177,6 +2180,8 @@ EXTERNAL SOURCES: :path: "../node_modules/expo" ExpoAsset: :path: "../node_modules/expo-asset/ios" + ExpoBlur: + :path: "../node_modules/expo-blur/ios" ExpoFileSystem: :path: "../node_modules/expo-file-system/ios" ExpoFont: @@ -2356,6 +2361,7 @@ SPEC CHECKSUMS: EXConstants: dd2fe64c6cdb1383b694c309a63028a8e9f2be6d Expo: 46cbe74ce0d0f4a4d7b726e90693eb8dfcec6de0 ExpoAsset: 8138f2a9ec55ae1ad7c3871448379f7d97692d15 + ExpoBlur: 562b3da84d3cd79016c411671eaf71a404266415 ExpoFileSystem: cc31b7a48031ab565f9eb5c2b61aa08d774a271a ExpoFont: 7522d869d84ee2ee8093ee997fef5b86f85d856b ExpoHead: e18c3b28f8e22de7e1f26c085c346a91ea7f459b diff --git a/package-lock.json b/package-lock.json index abcdd07999..d0405e7c04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "date-fns": "^4.1.0", "deepmerge": "^4.3.1", "expo": "~52.0.7", + "expo-blur": "~14.0.1", "expo-constants": "~17.0.2", "expo-font": "~13.0.1", "expo-image": "~2.0.1", @@ -14737,6 +14738,17 @@ "react-native": "*" } }, + "node_modules/expo-blur": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-14.0.1.tgz", + "integrity": "sha512-3Q6jFBLbY8n2vwk28ycUC+eIlVhnlqwkXUKk/Lfaj+SGV3AZMQyrixe7OYwJdUfwqETBrnYYMB6uNrJzOSbG+g==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, "node_modules/expo-constants": { "version": "17.0.3", "license": "MIT", diff --git a/package.json b/package.json index c2161eae32..4961135ba5 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,8 @@ "redux-persist": "^6.0.0", "tamagui": "^1.117.1", "timezone-mock": "^1.3.6", - "tsconfig-paths-webpack-plugin": "^4.2.0" + "tsconfig-paths-webpack-plugin": "^4.2.0", + "expo-blur": "~14.0.1" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.stories.tsx b/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.stories.tsx new file mode 100644 index 0000000000..ae0cef8819 --- /dev/null +++ b/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.stories.tsx @@ -0,0 +1,32 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { BlurredIdenticonBackground } from '@/src/components/BlurredIdenticonBackground' +import { View } from 'tamagui' + +const meta: Meta = { + title: 'BlurredIdenticonBackground', + component: BlurredIdenticonBackground, + argTypes: {}, +} + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + address: '0xA77DE01e157f9f57C7c4A326eeE9C4874D0598b6', + }, + decorators: [ + (Story) => ( + // This is a hack to make the story full screen + // we apply global decorator padding of 16 in preview.tsx + // and then we remove it here + + + + ), + ], + parameters: { + layout: 'fullscreen', + }, +} diff --git a/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx b/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx new file mode 100644 index 0000000000..0f2a437a66 --- /dev/null +++ b/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx @@ -0,0 +1,69 @@ +import { blo } from 'blo' +import { View } from 'tamagui' +import { Image } from 'expo-image' +import { Dimensions, StyleSheet } from 'react-native' +import { BlurView } from 'expo-blur' +import React from 'react' +import { Address } from '@/src/types/address' + +type Props = { + address: Address + height?: number +} +export const BlurredIdenticonBackground = ({ address, height = 125 }: Props) => { + const blockie = blo(address) + return ( + + + + + + + + + ) +} + +const styles = StyleSheet.create({ + container: { + position: 'absolute', + left: 0, + right: 0, + }, + containerInner: { + position: 'relative', + left: 0, + right: 0, + }, + containerInnerBackground: { + backgroundColor: '#000', + }, + identicon: { + bottom: 20, + opacity: 0.7, + position: 'absolute', + borderRadius: '50%', + width: Dimensions.get('window').width, + height: Dimensions.get('window').width, + }, + blurView: { + position: 'absolute', + bottom: 0, + width: '100%', + }, +}) diff --git a/src/components/BlurredIdenticonBackground/index.tsx b/src/components/BlurredIdenticonBackground/index.tsx new file mode 100644 index 0000000000..fcca8f3f86 --- /dev/null +++ b/src/components/BlurredIdenticonBackground/index.tsx @@ -0,0 +1 @@ +export { BlurredIdenticonBackground } from './BlurredIdenticonBackground' diff --git a/src/features/Assets/components/AssetsHeader/AssetsHeader.tsx b/src/features/Assets/components/AssetsHeader/AssetsHeader.tsx index 73bc9b6abb..fa0e163129 100644 --- a/src/features/Assets/components/AssetsHeader/AssetsHeader.tsx +++ b/src/features/Assets/components/AssetsHeader/AssetsHeader.tsx @@ -1,8 +1,8 @@ import React from 'react' -import { StyledAssetsHeader } from './styles' -import { View } from 'tamagui' import { BalanceContainer } from '../Balance' import { PendingTransactions } from '@/src/components/StatusBanners/PendingTransactions' +import { View } from 'tamagui' +import { StyledAssetsHeader } from './styles' interface AssetsHeaderProps { amount: number @@ -14,7 +14,7 @@ interface AssetsHeaderProps { export function AssetsHeader({ amount, isLoading, onPendingTransactionsPress, hasMore }: AssetsHeaderProps) { return ( - + {amount > 0 && ( { + const activeSafe = useSelector(selectActiveSafe) + return ( + + + + + + + + + + {shortenAddress(activeSafe.address)} + + + + + + + + + + + ) +} + +const styles = StyleSheet.create({ + headerContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: 10, + paddingVertical: 16, + paddingBottom: 0, + }, +}) diff --git a/src/features/Assets/components/Navbar/index.tsx b/src/features/Assets/components/Navbar/index.tsx new file mode 100644 index 0000000000..7d0badea6a --- /dev/null +++ b/src/features/Assets/components/Navbar/index.tsx @@ -0,0 +1 @@ +export { Navbar } from './Navbar' diff --git a/src/features/Settings/Settings.container.tsx b/src/features/Settings/Settings.container.tsx index 54446c1c96..9a460c3489 100644 --- a/src/features/Settings/Settings.container.tsx +++ b/src/features/Settings/Settings.container.tsx @@ -1,24 +1,15 @@ -import { useEffect } from 'react' import { useGetSafeQuery } from '@/src/store/gateway' import { SafeState } from '@/src/store/gateway/AUTO_GENERATED/safes' -import { useNavigation } from 'expo-router' import { useSelector } from 'react-redux' import { selectActiveSafe } from '@/src/store/activeSafeSlice' -import SettingsPresentation from './Settings' +import { Settings } from './Settings' export const SettingsContainer = () => { - const navigation = useNavigation() const { chainId, address } = useSelector(selectActiveSafe) const { data = {} as SafeState } = useGetSafeQuery({ chainId: chainId, safeAddress: address, }) - useEffect(() => { - navigation.setParams({ - safeAddress: address, - }) - }, [address]) - - return + return } diff --git a/src/features/Settings/Settings.tsx b/src/features/Settings/Settings.tsx index 29b083a500..ca0f8a937c 100644 --- a/src/features/Settings/Settings.tsx +++ b/src/features/Settings/Settings.tsx @@ -5,141 +5,149 @@ import { SafeListItem } from '@/src/components/SafeListItem' import { Skeleton } from 'moti/skeleton' import { Pressable } from 'react-native' import { EthAddress } from '@/src/components/EthAddress' +import { SafeState } from '@/src/store/gateway/AUTO_GENERATED/safes' import { Address } from '@/src/types/address' import { router } from 'expo-router' import { IdenticonWithBadge } from '@/src/features/Settings/components/IdenticonWithBadge' -import { SafeState } from '@/src/store/gateway/AUTO_GENERATED/safes' + +import { Navbar } from '@/src/features/Settings/components/Navbar/Navbar' interface SettingsProps { data: SafeState address: `0x${string}` } -function Settings({ address, data }: SettingsProps) { +export const Settings = ({ address, data }: SettingsProps) => { const { owners = [], threshold, implementation } = data return ( - - - - - -

- My DAO -

- - + + + + + + - - - - - saaafe.xyz - - -
- - - - - - - {owners.length} - - +

+ My DAO +

+ + - - Signers - -
- - + - - {threshold}/{owners.length} - + saaafe.xyz - - Threshold - -
- - - Members - [{ opacity: pressed ? 0.5 : 1.0 }]} - onPress={() => { - router.push('/signers') - }} + + - } - rightNode={ - - - - {owners.length} - - - - - - - } - /> - - + + + + {owners.length} + + + + + Signers + + - - General - + + + + + {threshold}/{owners.length} + + + + + Threshold + + + + + + + Members [{ opacity: pressed ? 0.5 : 1.0 }]} onPress={() => { - router.push('/notifications') + router.push('/signers') }} > } - rightNode={} + label={'Signers'} + leftNode={} + rightNode={ + + + + {owners.length} + + + + + + + } /> - -
- - {/* Footer */} - - {implementation?.name} - - -
+ + General + + [{ opacity: pressed ? 0.5 : 1.0 }]} + onPress={() => { + router.push('/notifications') + }} + > + } + rightNode={} + /> + + + + + + + {/* Footer */} + + {implementation?.name} + + + + ) } - -export default Settings diff --git a/src/features/Settings/components/Navbar/Navbar.tsx b/src/features/Settings/components/Navbar/Navbar.tsx index 37cb25391c..f75927b3b1 100644 --- a/src/features/Settings/components/Navbar/Navbar.tsx +++ b/src/features/Settings/components/Navbar/Navbar.tsx @@ -2,12 +2,34 @@ import React from 'react' import { View } from 'tamagui' import { SettingsMenu } from '@/src/features/Settings/components/Navbar/SettingsMenu' import { SettingsButton } from '@/src/features/Settings/components/Navbar/SettingsButton' +import { BlurredIdenticonBackground } from '@/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground' +import { StyleSheet } from 'react-native' +import { SafeAreaView } from 'react-native-safe-area-context' +import { Address } from '@/src/types/address' + +export const Navbar = (props: { safeAddress: Address }) => { + const { safeAddress } = props -export const Navbar = (props: { safeAddress: string }) => { return ( - - - + + {safeAddress && } + + + + + + ) } + +const styles = StyleSheet.create({ + headerContainer: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'flex-end', + paddingHorizontal: 10, + paddingVertical: 16, + paddingBottom: 0, + }, +}) From 3e1a251085190f3dc2496223cb1011c3fa80f059 Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Thu, 28 Nov 2024 18:03:15 +0100 Subject: [PATCH 36/49] fix: crash in production (#44) The endpoint was returning more results, but we were not going after the next page. Instead we were agian polling the first page and this ended up in 429. --- src/store/gateway/cgwClient.ts | 3 ++- src/store/gateway/chains/index.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/store/gateway/cgwClient.ts b/src/store/gateway/cgwClient.ts index e0ed6e3d6f..f132eda01e 100644 --- a/src/store/gateway/cgwClient.ts +++ b/src/store/gateway/cgwClient.ts @@ -1,6 +1,7 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' +import { GATEWAY_URL } from '@/src/config/constants' export const cgwClient = createApi({ - baseQuery: fetchBaseQuery({ baseUrl: 'https://safe-client.safe.global/' }), + baseQuery: fetchBaseQuery({ baseUrl: GATEWAY_URL }), endpoints: () => ({}), }) diff --git a/src/store/gateway/chains/index.ts b/src/store/gateway/chains/index.ts index 94cf5d9b9a..da8ada79b3 100644 --- a/src/store/gateway/chains/index.ts +++ b/src/store/gateway/chains/index.ts @@ -21,7 +21,7 @@ const getChainsConfigs = async ( const nextResults = [...results, ...data.results] if (data.next) { - return getChainsConfigs(url, nextResults) + return getChainsConfigs(data.next, nextResults) } return chainsAdapter.setAll(initialState, nextResults) From 6ea50533b4ec782691f0ef41253e58e28a675e92 Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Thu, 28 Nov 2024 18:12:03 +0100 Subject: [PATCH 37/49] fix: wrong background (#45) --- src/features/Settings/Settings.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/features/Settings/Settings.tsx b/src/features/Settings/Settings.tsx index ca0f8a937c..078eda2274 100644 --- a/src/features/Settings/Settings.tsx +++ b/src/features/Settings/Settings.tsx @@ -62,7 +62,7 @@ export const Settings = ({ address, data }: SettingsProps) => { {
- + From d95540597873280f1348273071dd7c841d766fe7 Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Fri, 29 Nov 2024 20:27:37 +0100 Subject: [PATCH 38/49] chore: manual ios deployment (#46) --- app.config.js | 4 +++ ios/safemobileapp.xcodeproj/project.pbxproj | 2 ++ .../xcschemes/safemobileapp.xcscheme | 2 +- .../Contents.json | 20 +++++++++++++++ .../SplashScreenLogo.imageset/Contents.json | 23 ++++++++++++++++++ .../SplashScreenLogo.imageset/image.png | Bin 0 -> 59836 bytes .../SplashScreenLogo.imageset/image@2x.png | Bin 0 -> 59836 bytes .../SplashScreenLogo.imageset/image@3x.png | Bin 0 -> 59836 bytes ios/safemobileapp/Info.plist | 2 ++ ios/safemobileapp/SplashScreen.storyboard | 19 ++++++++------- 10 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenBackground.colorset/Contents.json create mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/Contents.json create mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image.png create mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@2x.png create mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@3x.png diff --git a/app.config.js b/app.config.js index 4c221b97f0..fa0d7ea270 100644 --- a/app.config.js +++ b/app.config.js @@ -19,7 +19,11 @@ module.exports = { }, ios: { supportsTablet: true, + appleTeamId: 'MXRS32BBL4', bundleIdentifier: 'global.safe.mobileapp', + config: { + usesNonExemptEncryption: false, + } }, android: { adaptiveIcon: { diff --git a/ios/safemobileapp.xcodeproj/project.pbxproj b/ios/safemobileapp.xcodeproj/project.pbxproj index e1fd4eae1f..1ab4076f07 100644 --- a/ios/safemobileapp.xcodeproj/project.pbxproj +++ b/ios/safemobileapp.xcodeproj/project.pbxproj @@ -359,6 +359,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = safemobileapp/safemobileapp.entitlements; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = MXRS32BBL4; ENABLE_BITCODE = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", @@ -395,6 +396,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = safemobileapp/safemobileapp.entitlements; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = MXRS32BBL4; INFOPLIST_FILE = safemobileapp/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/ios/safemobileapp.xcodeproj/xcshareddata/xcschemes/safemobileapp.xcscheme b/ios/safemobileapp.xcodeproj/xcshareddata/xcschemes/safemobileapp.xcscheme index 2e28f9b075..dcea7e3533 100644 --- a/ios/safemobileapp.xcodeproj/xcshareddata/xcschemes/safemobileapp.xcscheme +++ b/ios/safemobileapp.xcodeproj/xcshareddata/xcschemes/safemobileapp.xcscheme @@ -41,7 +41,7 @@ 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 literal 0 HcmV?d00001 diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@2x.png b/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c52c2c68019b49c56da4faf7d8835a8392cfef7a GIT binary patch literal 59836 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 literal 0 HcmV?d00001 diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@3x.png b/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c52c2c68019b49c56da4faf7d8835a8392cfef7a GIT binary patch literal 59836 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 literal 0 HcmV?d00001 diff --git a/ios/safemobileapp/Info.plist b/ios/safemobileapp/Info.plist index a1835136e4..1b564e5f58 100644 --- a/ios/safemobileapp/Info.plist +++ b/ios/safemobileapp/Info.plist @@ -34,6 +34,8 @@ CFBundleVersion 1 + ITSAppUsesNonExemptEncryption + LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/ios/safemobileapp/SplashScreen.storyboard b/ios/safemobileapp/SplashScreen.storyboard index ed03a52992..312f250938 100644 --- a/ios/safemobileapp/SplashScreen.storyboard +++ b/ios/safemobileapp/SplashScreen.storyboard @@ -18,25 +18,19 @@ - + - - - - - - - - + + @@ -47,5 +41,12 @@ + + + + + + + \ No newline at end of file From 46dae038c3943f000968f78186d3ca7951b4d2ea Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Mon, 2 Dec 2024 12:52:45 +0100 Subject: [PATCH 39/49] Fix android UI glitches (#47) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: blurred background on android not working * fix: identicon not being circular on android * fix: visual topbar issues on android * fix: android menu icons * fix: app home screen warnings * fix: remove empty space * fix: typo * fix: remove unused style * fix: remove background prop * fix: use StatusBar component instead of mutate in useEffect * fix: remove unnecessary package * fix: Toast message in android devices * fix: add withDrawableAssets config to add drawable folder in the pre-build command * feat: add withDrawableAssets config --------- Co-authored-by: Clóvis Neto --- .../drawable/baseline_arrow_outward_24.xml | 5 + .../baseline_auto_awesome_motion_24.xml | 5 + .../main/res/drawable/baseline_create_24.xml | 5 + .../main/res/drawable/baseline_delete_24.xml | 5 + .../main/res/drawable/baseline_explore_24.xml | 5 + app.config.js | 1 + app/_layout.tsx | 6 + assets/drawable/baseline_arrow_outward_24.xml | 5 + .../baseline_auto_awesome_motion_24.xml | 5 + assets/drawable/baseline_create_24.xml | 5 + assets/drawable/baseline_delete_24.xml | 5 + assets/drawable/baseline_explore_24.xml | 5 + assets/drawable/rn_edit_text_material.xml | 37 ++++ package-lock.json | 164 ++++++++++++++++-- package.json | 6 +- .../BlurredIdenticonBackground.tsx | 38 ++-- src/components/Dropdown/sheetComponents.tsx | 6 +- src/components/Identicon/Identicon.tsx | 7 +- .../Assets/components/Navbar/Navbar.tsx | 30 ++-- .../PendingTxList/PendingTxList.container.tsx | 1 - .../Settings/components/Navbar/Navbar.tsx | 15 +- .../components/Navbar/SettingsMenu.tsx | 20 +-- src/theme/provider/safeTheme.tsx | 4 +- src/theme/provider/toastProvider.tsx | 2 +- withDrawableAssets.js | 51 ++++++ 25 files changed, 369 insertions(+), 69 deletions(-) create mode 100644 android/app/src/main/res/drawable/baseline_arrow_outward_24.xml create mode 100644 android/app/src/main/res/drawable/baseline_auto_awesome_motion_24.xml create mode 100644 android/app/src/main/res/drawable/baseline_create_24.xml create mode 100644 android/app/src/main/res/drawable/baseline_delete_24.xml create mode 100644 android/app/src/main/res/drawable/baseline_explore_24.xml create mode 100644 assets/drawable/baseline_arrow_outward_24.xml create mode 100644 assets/drawable/baseline_auto_awesome_motion_24.xml create mode 100644 assets/drawable/baseline_create_24.xml create mode 100644 assets/drawable/baseline_delete_24.xml create mode 100644 assets/drawable/baseline_explore_24.xml create mode 100644 assets/drawable/rn_edit_text_material.xml create mode 100644 withDrawableAssets.js diff --git a/android/app/src/main/res/drawable/baseline_arrow_outward_24.xml b/android/app/src/main/res/drawable/baseline_arrow_outward_24.xml new file mode 100644 index 0000000000..d4a7c99417 --- /dev/null +++ b/android/app/src/main/res/drawable/baseline_arrow_outward_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/main/res/drawable/baseline_auto_awesome_motion_24.xml b/android/app/src/main/res/drawable/baseline_auto_awesome_motion_24.xml new file mode 100644 index 0000000000..619df85e42 --- /dev/null +++ b/android/app/src/main/res/drawable/baseline_auto_awesome_motion_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/main/res/drawable/baseline_create_24.xml b/android/app/src/main/res/drawable/baseline_create_24.xml new file mode 100644 index 0000000000..3c53db7ec8 --- /dev/null +++ b/android/app/src/main/res/drawable/baseline_create_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/main/res/drawable/baseline_delete_24.xml b/android/app/src/main/res/drawable/baseline_delete_24.xml new file mode 100644 index 0000000000..26ba1f0606 --- /dev/null +++ b/android/app/src/main/res/drawable/baseline_delete_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/main/res/drawable/baseline_explore_24.xml b/android/app/src/main/res/drawable/baseline_explore_24.xml new file mode 100644 index 0000000000..419d867ad9 --- /dev/null +++ b/android/app/src/main/res/drawable/baseline_explore_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app.config.js b/app.config.js index fa0d7ea270..81fec38ca8 100644 --- a/app.config.js +++ b/app.config.js @@ -45,6 +45,7 @@ module.exports = { fonts: ['./assets/fonts/safe-icons/safe-icons.ttf'], }, ], + ['./withDrawableAssets.js', './assets/drawable'], ], experiments: { typedRoutes: true, diff --git a/app/_layout.tsx b/app/_layout.tsx index c6e722b47c..1e3d32e456 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -11,6 +11,12 @@ import { GestureHandlerRootView } from 'react-native-gesture-handler' import { BottomSheetModalProvider } from '@gorhom/bottom-sheet' import { PortalProvider } from '@tamagui/portal' import { SafeToastProvider } from '@/src/theme/provider/toastProvider' +import { configureReanimatedLogger, ReanimatedLogLevel } from 'react-native-reanimated' + +configureReanimatedLogger({ + level: ReanimatedLogLevel.warn, + strict: false, +}) function RootLayout() { store.dispatch(apiSliceWithChainsConfig.endpoints.getChainsConfig.initiate()) diff --git a/assets/drawable/baseline_arrow_outward_24.xml b/assets/drawable/baseline_arrow_outward_24.xml new file mode 100644 index 0000000000..d4a7c99417 --- /dev/null +++ b/assets/drawable/baseline_arrow_outward_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/drawable/baseline_auto_awesome_motion_24.xml b/assets/drawable/baseline_auto_awesome_motion_24.xml new file mode 100644 index 0000000000..619df85e42 --- /dev/null +++ b/assets/drawable/baseline_auto_awesome_motion_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/drawable/baseline_create_24.xml b/assets/drawable/baseline_create_24.xml new file mode 100644 index 0000000000..3c53db7ec8 --- /dev/null +++ b/assets/drawable/baseline_create_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/drawable/baseline_delete_24.xml b/assets/drawable/baseline_delete_24.xml new file mode 100644 index 0000000000..26ba1f0606 --- /dev/null +++ b/assets/drawable/baseline_delete_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/drawable/baseline_explore_24.xml b/assets/drawable/baseline_explore_24.xml new file mode 100644 index 0000000000..419d867ad9 --- /dev/null +++ b/assets/drawable/baseline_explore_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/drawable/rn_edit_text_material.xml b/assets/drawable/rn_edit_text_material.xml new file mode 100644 index 0000000000..5c25e728ea --- /dev/null +++ b/assets/drawable/rn_edit_text_material.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index d0405e7c04..c7199d57d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,9 @@ "version": "1.0.0", "dependencies": { "@cowprotocol/app-data": "^2.3.0", + "@expo/config-plugins": "^9.0.10", "@expo/vector-icons": "^14.0.2", "@react-native-clipboard/clipboard": "^1.15.0", - "@react-native-community/blur": "^4.4.1", "@react-native-menu/menu": "^1.1.6", "@react-native/babel-preset": "^0.76.2", "@react-navigation/material-top-tabs": "^7.0.1", @@ -3432,7 +3432,9 @@ } }, "node_modules/@expo/config-plugins": { - "version": "9.0.9", + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.10.tgz", + "integrity": "sha512-4piPSylJ8z3to+YZpl/6M2mLxASOdIFANA8FYihsTf9kWlyimV9L/+MGgPXJcieaHXYZZqOryf8hQFVeg/68+A==", "license": "MIT", "dependencies": { "@expo/config-types": "^52.0.0", @@ -5648,16 +5650,6 @@ } } }, - "node_modules/@react-native-community/blur": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@react-native-community/blur/-/blur-4.4.1.tgz", - "integrity": "sha512-XBSsRiYxE/MOEln2ayunShfJtWztHwUxLFcSL20o+HNNRnuUDv+GXkF6FmM2zE8ZUfrnhQ/zeTqvnuDPGw6O8A==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, "node_modules/@react-native-community/datetimepicker": { "version": "8.2.0", "dev": true, @@ -15070,6 +15062,154 @@ "react-native": "*" } }, + "node_modules/expo/node_modules/@expo/config-plugins": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.9.tgz", + "integrity": "sha512-pbgbY3SwCMwkijhfe163J05BrTx4MqzeaV+nVgUMs7vRcjHY1tfM57Pdv6SPtgeDvZ8fvdXFXXzkJva+a7C9Bw==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^52.0.0", + "@expo/json-file": "~9.0.0", + "@expo/plist": "^0.2.0", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^1.0.0", + "glob": "^10.4.2", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/expo/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expo/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/expo/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/expo/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expo/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/expo/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/expo/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/exponential-backoff": { "version": "3.1.1", "license": "Apache-2.0" diff --git a/package.json b/package.json index 4961135ba5..ad84f3982c 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,11 @@ }, "dependencies": { "@cowprotocol/app-data": "^2.3.0", + "@expo/config-plugins": "^9.0.10", "@expo/vector-icons": "^14.0.2", "@react-native-clipboard/clipboard": "^1.15.0", "@react-native-menu/menu": "^1.1.6", "@react-native/babel-preset": "^0.76.2", - "@react-native-community/blur": "^4.4.1", "@react-navigation/material-top-tabs": "^7.0.1", "@react-navigation/native": "^7.0.0", "@reduxjs/toolkit": "^2.2.8", @@ -55,6 +55,7 @@ "date-fns": "^4.1.0", "deepmerge": "^4.3.1", "expo": "~52.0.7", + "expo-blur": "~14.0.1", "expo-constants": "~17.0.2", "expo-font": "~13.0.1", "expo-image": "~2.0.1", @@ -82,8 +83,7 @@ "redux-persist": "^6.0.0", "tamagui": "^1.117.1", "timezone-mock": "^1.3.6", - "tsconfig-paths-webpack-plugin": "^4.2.0", - "expo-blur": "~14.0.1" + "tsconfig-paths-webpack-plugin": "^4.2.0" }, "devDependencies": { "@babel/core": "^7.25.2", diff --git a/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx b/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx index 0f2a437a66..1b6af57cf6 100644 --- a/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx +++ b/src/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx @@ -1,7 +1,7 @@ import { blo } from 'blo' import { View } from 'tamagui' import { Image } from 'expo-image' -import { Dimensions, StyleSheet } from 'react-native' +import { Dimensions, StyleSheet, useColorScheme } from 'react-native' import { BlurView } from 'expo-blur' import React from 'react' import { Address } from '@/src/types/address' @@ -9,11 +9,14 @@ import { Address } from '@/src/types/address' type Props = { address: Address height?: number + children: React.ReactNode } -export const BlurredIdenticonBackground = ({ address, height = 125 }: Props) => { +export const BlurredIdenticonBackground = ({ address, height = 125, children }: Props) => { const blockie = blo(address) + const colorScheme = useColorScheme() + return ( - + }, ]} > - + + + + + {children} ) } const styles = StyleSheet.create({ - container: { - position: 'absolute', - left: 0, - right: 0, - }, containerInner: { position: 'relative', - left: 0, - right: 0, }, containerInnerBackground: { - backgroundColor: '#000', + position: 'absolute', + width: '100%', + height: '100%', }, - identicon: { + // Android cannot handle border-radius on Image component + // so we need to wrap it in a View with borderRadius + androidHack: { + borderRadius: '50%', + overflow: 'hidden', bottom: 20, - opacity: 0.7, position: 'absolute', - borderRadius: '50%', + }, + identicon: { width: Dimensions.get('window').width, height: Dimensions.get('window').width, }, diff --git a/src/components/Dropdown/sheetComponents.tsx b/src/components/Dropdown/sheetComponents.tsx index 4ae01f1fe9..8710158f35 100644 --- a/src/components/Dropdown/sheetComponents.tsx +++ b/src/components/Dropdown/sheetComponents.tsx @@ -2,7 +2,7 @@ import React from 'react' import { View as RCView, StyleSheet } from 'react-native' import { View } from 'tamagui' import { BottomSheetBackgroundProps, useBottomSheetModal } from '@gorhom/bottom-sheet' -import { BlurView } from '@react-native-community/blur' +import { BlurView } from 'expo-blur' const BackgroundComponent = React.memo(({ style }: BottomSheetBackgroundProps) => { return ( @@ -27,7 +27,7 @@ const BackdropComponent = React.memo(() => { width="100%" height="100%" > - + ) }) @@ -42,6 +42,8 @@ const styles = StyleSheet.create({ left: 0, bottom: 0, right: 0, + width: '100%', + height: '100%', }, }) diff --git a/src/components/Identicon/Identicon.tsx b/src/components/Identicon/Identicon.tsx index a8aaccdf51..1d2cdd2494 100644 --- a/src/components/Identicon/Identicon.tsx +++ b/src/components/Identicon/Identicon.tsx @@ -1,6 +1,7 @@ import { blo } from 'blo' import { Image } from 'expo-image' import { type Address } from '@/src/types/address' +import { View } from 'tamagui' type Props = { address: Address @@ -18,5 +19,9 @@ export const Identicon = ({ address, rounded, size }: Props) => { const blockie = blo(address) - return + return ( + + + + ) } diff --git a/src/features/Assets/components/Navbar/Navbar.tsx b/src/features/Assets/components/Navbar/Navbar.tsx index 85fc26af7d..0700470f2e 100644 --- a/src/features/Assets/components/Navbar/Navbar.tsx +++ b/src/features/Assets/components/Navbar/Navbar.tsx @@ -14,24 +14,24 @@ export const Navbar = () => { const activeSafe = useSelector(selectActiveSafe) return ( - + + + + - - - - - - - {shortenAddress(activeSafe.address)} - - + + + {shortenAddress(activeSafe.address)} + + + - - - - - + + + + + ) } diff --git a/src/features/PendingTx/components/PendingTxList/PendingTxList.container.tsx b/src/features/PendingTx/components/PendingTxList/PendingTxList.container.tsx index 51d713ea24..4598e0121d 100644 --- a/src/features/PendingTx/components/PendingTxList/PendingTxList.container.tsx +++ b/src/features/PendingTx/components/PendingTxList/PendingTxList.container.tsx @@ -41,7 +41,6 @@ export function PendingTxListContainer({ const LargeHeader = ( - {' '} Pending Transactions {isLoading ? ( diff --git a/src/features/Settings/components/Navbar/Navbar.tsx b/src/features/Settings/components/Navbar/Navbar.tsx index f75927b3b1..1aa862e81a 100644 --- a/src/features/Settings/components/Navbar/Navbar.tsx +++ b/src/features/Settings/components/Navbar/Navbar.tsx @@ -12,13 +12,14 @@ export const Navbar = (props: { safeAddress: Address }) => { return ( - {safeAddress && } - - - - - - + + + + + + + + ) } diff --git a/src/features/Settings/components/Navbar/SettingsMenu.tsx b/src/features/Settings/components/Navbar/SettingsMenu.tsx index 72eac7a71b..cba28adcb0 100644 --- a/src/features/Settings/components/Navbar/SettingsMenu.tsx +++ b/src/features/Settings/components/Navbar/SettingsMenu.tsx @@ -82,40 +82,38 @@ const Menu = ({ onPressAction, color, destructiveColor }: MenuProps) => { { id: 'rename', title: 'Rename', - titleColor: color, image: Platform.select({ ios: 'pencil', - android: 'ic_menu_add', + android: 'baseline_create_24', }), - imageColor: color, + imageColor: Platform.select({ ios: color, android: '#000' }), }, { id: 'explorer', title: 'View on Explorer', - titleColor: color, image: Platform.select({ ios: 'link', - android: 'ic_menu_share', + android: 'baseline_explore_24', }), - imageColor: color, + imageColor: Platform.select({ ios: color, android: '#000' }), }, { id: 'copy', title: 'Copy address', image: Platform.select({ ios: 'doc.on.doc', - android: 'ic_menu_delete', + android: 'baseline_auto_awesome_motion_24', }), - imageColor: color, + imageColor: Platform.select({ ios: color, android: '#000' }), }, { id: 'share', title: 'Share account', image: Platform.select({ ios: 'square.and.arrow.up.on.square', - android: 'ic_menu_delete', + android: 'baseline_arrow_outward_24', }), - imageColor: color, + imageColor: Platform.select({ ios: color, android: '#000' }), }, { id: 'remove', @@ -125,7 +123,7 @@ const Menu = ({ onPressAction, color, destructiveColor }: MenuProps) => { }, image: Platform.select({ ios: 'trash', - android: 'ic_menu_delete', + android: 'baseline_delete_24', }), imageColor: destructiveColor, }, diff --git a/src/theme/provider/safeTheme.tsx b/src/theme/provider/safeTheme.tsx index 1184af292b..7340b83e68 100644 --- a/src/theme/provider/safeTheme.tsx +++ b/src/theme/provider/safeTheme.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { useColorScheme } from 'react-native' +import { StatusBar, useColorScheme } from 'react-native' import { ThemeProvider } from '@react-navigation/native' import { TamaguiProvider } from '@tamagui/core' @@ -29,6 +29,8 @@ export const SafeThemeProvider = ({ children }: SafeThemeProviderProps) => { return ( + + {themeProvider} diff --git a/src/theme/provider/toastProvider.tsx b/src/theme/provider/toastProvider.tsx index 41901ce0d3..acde0f2fb2 100644 --- a/src/theme/provider/toastProvider.tsx +++ b/src/theme/provider/toastProvider.tsx @@ -39,7 +39,7 @@ const CurrentToast = () => { backgroundColor={'$backgroundPaper'} viewportName={currentToast.viewportName} > - + {currentToast.title} {!!currentToast.message && {currentToast.message}} diff --git a/withDrawableAssets.js b/withDrawableAssets.js new file mode 100644 index 0000000000..bd902e87b3 --- /dev/null +++ b/withDrawableAssets.js @@ -0,0 +1,51 @@ +const fs = require('fs') +const path = require('path') +const { withDangerousMod } = require('@expo/config-plugins') + +const androidFolderPath = ['app', 'src', 'main', 'res', 'drawable'] + +const withDrawableAssets = function (expoConfig, files) { + return withDangerousMod(expoConfig, [ + 'android', + function (modConfig) { + if (modConfig.modRequest.platform === 'android') { + const androidDwarablePath = path.join(modConfig.modRequest.platformProjectRoot, ...androidFolderPath) + + if (!Array.isArray(files)) { + files = [files] + } + + files.forEach(function (file) { + const isFile = fs.lstatSync(file).isFile() + if (isFile) { + fs.copyFileSync(file, path.join(androidDwarablePath, path.basename(file))) + } else { + copyFolderRecursiveSync(file, androidDwarablePath) + } + }) + } + return modConfig + }, + ]) +} + +function copyFolderRecursiveSync(source, target) { + if (!fs.existsSync(target)) { + fs.mkdirSync(target) + } + + const files = fs.readdirSync(source) + + files.forEach(function (file) { + const sourcePath = path.join(source, file) + const targetPath = path.join(target, file) + + if (fs.lstatSync(sourcePath).isDirectory()) { + copyFolderRecursiveSync(sourcePath, targetPath) + } else { + fs.copyFileSync(sourcePath, targetPath) + } + }) +} + +module.exports = withDrawableAssets From d24abe299eabc0c0b0c3e8ebcf4f27749c6dc93a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=B3vis=20Neto?= Date: Wed, 4 Dec 2024 11:41:31 +0100 Subject: [PATCH 40/49] fix: avoid using complex values to not have the UnhandledLinkingContext error (#51) --- .storybook/preview.tsx | 25 ++-- ios/Podfile.lock | 167 +++++++++++-------------- src/components/Badge/badge.stories.tsx | 31 +++-- 3 files changed, 104 insertions(+), 119 deletions(-) diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 190262a4b1..86f9a42021 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -4,6 +4,7 @@ import { SafeThemeProvider } from '@/src/theme/provider/safeTheme' import { View } from 'react-native' import { SafeToastProvider } from '@/src/theme/provider/toastProvider' import { SafeAreaProvider } from 'react-native-safe-area-context' +import { PortalProvider } from 'tamagui' const preview: Preview = { parameters: { @@ -18,17 +19,19 @@ const preview: Preview = { decorators: [ (Story) => { return ( - - - - - - - - - - - + + + + + + + + + + + + + ) }, ], diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0bdea054ea..280b2abb33 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1306,27 +1306,6 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - react-native-blur (4.4.1): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - react-native-menu (1.1.6): - DoubleConversion - glog @@ -2114,7 +2093,6 @@ DEPENDENCIES: - 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-blur (from `../node_modules/@react-native-community/blur`)" - "react-native-menu (from `../node_modules/@react-native-menu/menu`)" - react-native-mmkv (from `../node_modules/react-native-mmkv`) - react-native-pager-view (from `../node_modules/react-native-pager-view`) @@ -2271,8 +2249,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" - react-native-blur: - :path: "../node_modules/@react-native-community/blur" react-native-menu: :path: "../node_modules/@react-native-menu/menu" react-native-mmkv: @@ -2356,98 +2332,97 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 1dca942403ed9342f98334bf4c3621f011aa7946 - Burnt: dde5dd245f124a4594098e3938ba71aae4ec83c3 + Burnt: e3a3397e26172fca31a59bb27421475a58068836 DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 - EXConstants: dd2fe64c6cdb1383b694c309a63028a8e9f2be6d - Expo: 46cbe74ce0d0f4a4d7b726e90693eb8dfcec6de0 - ExpoAsset: 8138f2a9ec55ae1ad7c3871448379f7d97692d15 - ExpoBlur: 562b3da84d3cd79016c411671eaf71a404266415 - ExpoFileSystem: cc31b7a48031ab565f9eb5c2b61aa08d774a271a - ExpoFont: 7522d869d84ee2ee8093ee997fef5b86f85d856b - ExpoHead: e18c3b28f8e22de7e1f26c085c346a91ea7f459b - ExpoImage: baf7dee5cb59e3b7b9c8dc204c54385fcc39ff71 - ExpoKeepAwake: 783e68647b969b210a786047c3daa7b753dcac1f - ExpoLinearGradient: 7ca3b1d1625a1ab85c129abce4a3cdc78a9500a3 - ExpoLinking: 05ab69d3b5b1b0600d6a1a043d8d1ea3bb61a71a - ExpoModulesCore: f12deb734bfa4efc1f1783eafc324c933a985a48 - ExpoSplashScreen: a1c1b3a9648ab738be13fb109c42a85b32e08e5a - ExpoSystemUI: d8fb1abd91c7283d8ead3df77ed0575b85f1bb42 - ExpoWebBrowser: f08aaf1c8a02af8a768d83793186cb6d2c69f529 + EXConstants: 277129d9a42ba2cf1fad375e7eaa9939005c60be + Expo: 0036dbc379382e2e039898c944ab01dba3a1abb5 + ExpoAsset: 6f7a8887cbb9fb39fdb0808e7f6f74ba0e1ae9b6 + ExpoBlur: 2b92367da8158eeaee9bfa940d82512a09c8e0c6 + ExpoFileSystem: 7265de9e7b7050c494f92332110818381f832606 + ExpoFont: 12b0217e42ac97029d0f317f0486039a8508cf52 + ExpoHead: bef002012f34e4859531bdc25902bd64fea098d8 + ExpoImage: d2046d80eec1ab7981c1b2123065e2a711168468 + ExpoKeepAwake: 22173f45d767c7d37403fdf48292726901d69ce7 + ExpoLinearGradient: 18148bd38f98fa0229c1f9df23393b32ab6d2d32 + ExpoLinking: ff40f710843188087fe60c37d710d49708eab4c8 + ExpoModulesCore: d7e806e5ca2f2ed5c2a47dcda16546362de828f2 + ExpoSplashScreen: 46129900c20ab3c48e6ceac9b04b410a1f6bb585 + ExpoSystemUI: ba85687bad99292492410057073047b9b5cb5010 + ExpoWebBrowser: b658ba8a9161f1b54afb279591cfce2cb73330fa FBLazyVector: bc70dcb22ad30ce734a7cce7210791dc737e230f fmt: 10c6e61f4be25dc963c36bd73fc7b1705fe975be glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a hermes-engine: 3852e37f6158a2fcfad23e31215ed495da3a6a40 libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f - RCT-Folly: bf5c0376ffe4dd2cf438dcf86db385df9fdce648 + RCT-Folly: 84578c8756030547307e4572ab1947de1685c599 RCTDeprecation: d575d28132f93e5deef4849d5afffb4ac4e63226 RCTRequired: e2e5df1df76aac8685aabfebca389e6bec64792b RCTTypeSafety: 30e36ceafa26979860e13fb3f234fb61692924c2 React: 10ad41b51f981992714011b6a4e081234c28dc2e React-callinvoker: 58b51494f8b2cca07a27fc6f69273239c30a1e70 - React-Core: 54860c16fb5873a6f00dd44d8979bbb648b34c7c - React-CoreModules: 443101f113a7b5d51b93e061574dcadf7850f8cc - React-cxxreact: 5407ecb854a755de34c0e6b03965d3a51c28c933 + React-Core: 7a5e9897daf0189c0233b25243d6704e5b9025d8 + React-CoreModules: 09d4f4ddd85ce9301c4b06dfe68750a82ee4b4f5 + React-cxxreact: 29bfe097a993c73a314f569998fe863eb6fb8a18 React-debug: 252c723eb205cc508aa9690a16dff46293c30ed8 - React-defaultsnativemodule: 1fb982daba4ac5bb3052ae262a919a0d117f3b1b - React-domnativemodule: 914401fb13804b7828020d7b3a89afa72ff22564 - React-Fabric: 58696d9eaee305bb5a5af26071966dcfb941f9eb - React-FabricComponents: a037b977430eceae4bac539934497bacc8de3971 - React-FabricImage: 2658c3e383195f69e7c83e4f75519bee17c3169a + React-defaultsnativemodule: f32fc96c2787aa5548a2438f9c9d39df30457529 + React-domnativemodule: 409bb66e48c19997551f7e5adc0e4402adf3e5e8 + React-Fabric: 7214dbd96d80c2c5871e3940b2a922ae4ff7a66d + React-FabricComponents: 4b46303dad5862b2c132494c6933d70e8b2b5271 + React-FabricImage: ac6e46b8d6e12deb20887684c8cd1b60d573c738 React-featureflags: 7dc483869b3a940dcd92c7942c5e3492ad6afe68 - React-featureflagsnativemodule: 7a50dda8a6d3883139c47b4bda797156737240db - React-graphics: 066863eb87b142f0603fed08c71bac452238ac3e - React-hermes: 8f31f252aff98a4cb711ccf6644cccfe35d8edd1 - React-idlecallbacksnativemodule: c3f68fe97e379c4c1b6c4ba25e5d450cbe931e25 - React-ImageManager: 36240f8ab7181551574ca443da507272dbbf7014 - React-jserrorhandler: 1aa045c492222751dc476bcb973f787e82f952b9 - React-jsi: b96853ac12c1dab5fe3ea131f959fda0bbaf1151 - React-jsiexecutor: e38748a0e9d899f63dec562f93ac06c7acbc813d - React-jsinspector: 91b3c73d2afb7627af7872cedb0b74a0f00f57d1 - React-jsitracing: a340047c9fd31a36b222569c402e472e20557805 - React-logger: 81d58ca6f1d93fca9a770bda6cc1c4fbfcc99c9c - React-Mapbuffer: 726951e68f4bb1c2513d322f2548798b2a3d628d - React-microtasksnativemodule: 7a69a9b8fded72ea3cf81923ecf75cad5558ed26 - react-native-blur: 28b0a731ed804bed3e88757c2414305896e6b47e - react-native-menu: ebd682442bb8a48e86dd2e4d41260bc1daf670b5 - react-native-mmkv: bb0824bed68c01f7cc681eefa58059097bdaa796 - react-native-pager-view: 94195f1bf32e7f78359fa20057c97e632364a08b - react-native-safe-area-context: 458f6b948437afcb59198016b26bbd02ff9c3b47 - react-native-slider: 124ce99f9cd2d04c79f020da6dee9f8d38a6b8c7 + React-featureflagsnativemodule: 2e65d2c94448d588a605de0d2aadce9c39c7ce31 + React-graphics: 52ca86af6628cb95cc472b2f0f7c42018906881d + React-hermes: ab8705477c497a5839966bd57471ee3611f864f8 + React-idlecallbacksnativemodule: ad29fb45bc50ebbbbb6a08a93e25909f65e2ca12 + React-ImageManager: 68a1bc3ba2c11eb01b01ebbd1e682fa265b6dc2e + React-jserrorhandler: 8bc8fc6c85c743af48143d693a8d661cb23bc96d + React-jsi: de2c6119671b281671fabf9e96eb11110207fe9d + React-jsiexecutor: 936132921f4d991af7b4faa7424fc54e67791dd0 + React-jsinspector: adc8764a6d2a331c20f42db9192f348b3f8050fa + React-jsitracing: 3f04035f1a39efe206056c4a28b725673c2e696b + React-logger: addd140841248966c2547eb94836399cc1061f4d + React-Mapbuffer: 029b5332e78af8c67c4b5e65edfc717068b8eac1 + React-microtasksnativemodule: f30949ee318ba90b9668de1e325b98838b9a4da2 + react-native-menu: 2ae57ae345762db416ee7c44ece7f39955675fe9 + react-native-mmkv: eca12be5e3400be2d995a2edaa3c6c2e67b5e3ec + react-native-pager-view: ddcdfa41b65930c9c648ff715a4afa1bb0c2358d + react-native-safe-area-context: 0f16e24dc808e9f0ced17f2bdcec692b2376fb68 + react-native-slider: d1a9121980fc81678c6d30b82f312c778fba563c React-nativeconfig: 470fce6d871c02dc5eff250a362d56391b7f52d6 - React-NativeModulesApple: 6297fc3136c1fd42884795c51d7207de6312b606 - React-perflogger: f2c94413cfad44817c96cab33753831e73f0d0dd - React-performancetimeline: d6e493713e6aab3cc8b7c1c07e97160e22dd79cc + React-NativeModulesApple: 1586448c61a7c2bd4040cc03ccde66a72037e77e + React-perflogger: c8860eaab4fe60d628b27bf0086a372c429fc74f + React-performancetimeline: 94e04b2067bc774df42ced96c8c3582fba9d7f88 React-RCTActionSheet: 2eb26cbf384f3d3b2cb2e23be850a956d83f77ab - React-RCTAnimation: 59463699a92edc6705ce5306bb789d6a0ca4df0b - React-RCTAppDelegate: 4d9efca7caa477b106e3d55af339d0e071441536 - React-RCTBlob: 0883f5363069ad30f628c970fcb413a619e42804 - React-RCTFabric: 4c761af601a1fe0061b15df97af9fb77403362a2 - React-RCTImage: 78884b7ea6ef4f7bb9655614bf09a40054f282ce - React-RCTLinking: b9beba7465fd9a1ed7a88a4e7fc403d26e17ab95 - React-RCTNetwork: 701d9c050077596b15a11b6b573ed95c309d2315 - React-RCTSettings: e700a82e3e923c10060b8f65297f9d321b93d8eb - React-RCTText: e782ce1c3f9d915daf50d97157f8c226e8f3d206 - React-RCTVibration: 2a19c56be78cb7afce9f4f3471aacfb063f32a00 + React-RCTAnimation: aa0a663829963ca72f4c722e71bd5debbecc1348 + React-RCTAppDelegate: 12688b64e1e28e0eb1c628690678ae5d3ab356b4 + React-RCTBlob: bef788ef3433170f9748d0e00d1afc7be64bc51d + React-RCTFabric: f1ce02d6fecbf5266bfafa228eed179ed2c182e7 + React-RCTImage: a9de66d305fa02008759a2aa5a723b68d18907e5 + React-RCTLinking: 15fe8ccad84a4a5274d55b9d43e223896718772d + React-RCTNetwork: 7635ab6b7617648e5b5e35cdb3a4edab6fa309a6 + React-RCTSettings: 18e666705ea62aac59f2a8d50ced87b9b8902c7b + React-RCTText: 5cf76f649b4781362d23f9ee3d52e8d12a74dd18 + React-RCTVibration: bd72dc267866c8cd524c9a61d15060949ff24cf9 React-rendererconsistency: b389e324712bf0869529823216e922836ed9b737 - React-rendererdebug: 9f5629032c0937c62b21dcaf96b374a149bf8a44 + React-rendererdebug: 6b5dcd3797ec96001304e6bfaae408fa4f3ce3f3 React-rncore: 2cf6b2348ee5d5431c4735180364b207ecf47123 - React-RuntimeApple: 84d648b9a87c34041d6628dde50d1acf54e5bf89 - React-RuntimeCore: 79290b2eb17a25c1b23c4d5dde13d43c20467eef + React-RuntimeApple: cb6e7f3e8911da8ebfdd3b0e7776c1db656c7f6b + React-RuntimeCore: b6213eb42011ecc9a97060f8714d8d57b97775c4 React-runtimeexecutor: 69e27948ee2127400297c7de50b809a7cd127a15 - React-RuntimeHermes: 5fe2082f98187410c1815c532f72348fbe1d0517 - React-runtimescheduler: 95b7087f459699756c1b7feb3f4637066c337b62 + React-RuntimeHermes: 3a974aa24b83a7a0396edb35cb333c1d744563e0 + React-runtimescheduler: 567b00b76261df4a791ea37eb076c1c496c08ac2 React-timing: 97673939f96f79031d2a5a0a92285618475149ec - React-utils: ed6cb7ba089ac0856aa104df12691e99abbf14e1 - ReactCodegen: 93b271af49774429f34d7fd561197020d86436e2 - ReactCommon: 208cb02e3c0bb8a727b3e1a1782202bcfa5d9631 - RNCAsyncStorage: a927b768986f83467b635cf6d7559e6edb46db7a - RNCClipboard: 8212ca9e8370d0e23bfb7f5a591380da5a63456d - RNDateTimePicker: 6008d74df8122d6af6d9d08096bff19a8c6ba647 - RNGestureHandler: fc5ce5bf284640d3af6431c3a5c3bc121e98d045 - RNReanimated: df96d71c9d7deeecb980a54d1f15bb17f43952a7 - RNScreens: 27587018b2e6082f5172b1ecf158c14a0e8842d6 - RNSVG: 536cd3c866c878faf72beaba166c8b02fe2b762b + React-utils: c8c0c746031419a29cfd8c72a394fdeac0684a84 + ReactCodegen: a64e8f3a8bba0ecf88fce06c2874e021d55148f3 + ReactCommon: 7b9403030ff3430ccffed63cd25c8aeab2a3ea7e + RNCAsyncStorage: ff8f69859448bde50f1c25d3e7eb37555fed33ab + RNCClipboard: 356f0acf1d62d41398269d5f47b1d950c2a593fe + RNDateTimePicker: 9ec036a62ad0f5a2d04c1c7829338e87b4e423e7 + RNGestureHandler: 16ef3dc2d7ecb09f240f25df5255953c4098819b + RNReanimated: 01d743d77838211eeec6bb9fbee99458b0bcf857 + RNScreens: 1b1282f5fd21119667bb361d736d4edaca3c35e0 + RNSVG: 030717ff82ea8f2117347c2fcf52a2d1eafba9ba SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3 SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c diff --git a/src/components/Badge/badge.stories.tsx b/src/components/Badge/badge.stories.tsx index b44e7a1bac..a4d968778b 100644 --- a/src/components/Badge/badge.stories.tsx +++ b/src/components/Badge/badge.stories.tsx @@ -1,8 +1,8 @@ import type { Meta, StoryObj } from '@storybook/react' import { Badge } from '@/src/components/Badge' -import { View, Text } from 'tamagui' import { SafeFontIcon } from '@/src/components/SafeFontIcon/SafeFontIcon' import React from 'react' +import { Text, View } from 'tamagui' const meta: Meta = { title: 'Badge', @@ -22,8 +22,8 @@ export const Circular: Story = { }, } export const CircularWithIcon: Story = { - args: { - content: , + render: function Render(args) { + return } /> }, } export const NonCircular: Story = { @@ -45,15 +45,22 @@ export const NonCircularBold: Story = { export const NonCircularWithComplexContent: Story = { args: { - content: ( - - - - - 3/9 - - - ), circular: false, }, + render: function Render(args) { + return ( + + + + + 3/9 + + + } + /> + ) + }, } From cac233e35fe01d96d4bf053595596938e4677d92 Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Wed, 4 Dec 2024 17:20:09 +0100 Subject: [PATCH 41/49] Setup Maestro & remove detox (#48) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add maestro e2e tests * refactor: remove detox and native files Removed detox as we are going to use maestro. Reasons for the decision - detox is not compatible with the latest RN version - detox apparently is no longer recommended for e2e tests on expo EAS. Sicne we don’t use detox, we don’t need to keep the native files in the repo. They are auto-generated on the fly by expo. * fix: update snapshot test for PendingTransactions * fix: update package.lock The package.lock went out of sync due to the last git merge conflicts resolution. * refactor: remove withDrawableAssets from root dir The code is in the expo-plugins folder now * refactor: update readme --- .detoxrc.js | 83 - .gitignore | 4 + README.md | 58 +- android/.gitignore | 16 - android/app/build.gradle | 186 -- android/app/debug.keystore | Bin 2257 -> 0 bytes android/app/proguard-rules.pro | 14 - .../com.global.safe.mobileapp/DetoxTest.java | 35 - android/app/src/debug/AndroidManifest.xml | 7 - android/app/src/main/AndroidManifest.xml | 33 - .../app/src/main/assets/fonts/safe-icons.ttf | Bin 24648 -> 0 bytes .../com/global/safe/mobileapp/MainActivity.kt | 65 - .../global/safe/mobileapp/MainApplication.kt | 57 - .../res/drawable-hdpi/splashscreen_image.png | Bin 59836 -> 0 bytes .../res/drawable-mdpi/splashscreen_image.png | Bin 59836 -> 0 bytes .../res/drawable-xhdpi/splashscreen_image.png | Bin 59836 -> 0 bytes .../drawable-xxhdpi/splashscreen_image.png | Bin 59836 -> 0 bytes .../drawable-xxxhdpi/splashscreen_image.png | Bin 59836 -> 0 bytes .../res/drawable/rn_edit_text_material.xml | 37 - .../src/main/res/drawable/splashscreen.xml | 3 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 8377 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 8031 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 10372 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 5199 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 5079 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 6526 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 11624 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 11145 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 14257 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 18266 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 18064 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 22474 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 25203 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 25030 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 30705 -> 0 bytes .../app/src/main/res/values-night/colors.xml | 1 - android/app/src/main/res/values/colors.xml | 6 - android/app/src/main/res/values/strings.xml | 6 - android/app/src/main/res/values/styles.xml | 17 - .../main/res/xml/network_security_config.xml | 7 - android/build.gradle | 44 - android/gradle.properties | 59 - android/gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 - android/gradlew | 252 -- android/gradlew.bat | 94 - .../react-settings-plugin/build.gradle.kts | 19 - .../expo/plugins/ReactSettingsPlugin.kt | 10 - android/settings.gradle | 38 - app.config.js | 4 +- app/(tabs)/_layout.tsx | 4 +- .../drawable/baseline_arrow_outward_24.xml | 0 .../baseline_auto_awesome_motion_24.xml | 0 .../android}/drawable/baseline_create_24.xml | 0 .../android}/drawable/baseline_delete_24.xml | 0 .../android}/drawable/baseline_explore_24.xml | 0 e2e/flow.yml | 13 + e2e/jest.config.js | 12 - e2e/starter.test.js | 18 - e2e/transactions.test.js | 16 - .../withDrawableAssets.js | 0 ios/.gitignore | 30 - ios/.xcode.env | 11 - ios/Podfile | 66 - ios/Podfile.lock | 2436 ----------------- ios/Podfile.properties.json | 5 - ios/safemobileapp.xcodeproj/project.pbxproj | 578 ---- .../xcschemes/safemobileapp.xcscheme | 88 - .../contents.xcworkspacedata | 10 - ios/safemobileapp/AppDelegate.h | 7 - ios/safemobileapp/AppDelegate.mm | 62 - .../App-Icon-1024x1024@1x.png | Bin 59468 -> 0 bytes .../AppIcon.appiconset/Contents.json | 14 - .../Images.xcassets/Contents.json | 6 - .../SplashScreen.imageset/Contents.json | 21 - .../SplashScreen.imageset/image.png | Bin 59836 -> 0 bytes .../Contents.json | 21 - .../SplashScreenBackground.imageset/image.png | Bin 68 -> 0 bytes ios/safemobileapp/Info.plist | 83 - ios/safemobileapp/PrivacyInfo.xcprivacy | 48 - ios/safemobileapp/SplashScreen.storyboard | 52 - ios/safemobileapp/Supporting/Expo.plist | 12 - ios/safemobileapp/main.m | 10 - ios/safemobileapp/noop-file.swift | 4 - .../safemobileapp-Bridging-Header.h | 3 - ios/safemobileapp/safemobileapp.entitlements | 5 - package-lock.json | 957 +------ package.json | 7 +- src/components/Alert/Alert.tsx | 4 +- .../PendingTransactions.tsx | 1 + .../PendingTransactions.test.tsx.snap | 1 + 93 files changed, 75 insertions(+), 5702 deletions(-) delete mode 100644 .detoxrc.js delete mode 100644 android/.gitignore delete mode 100644 android/app/build.gradle delete mode 100644 android/app/debug.keystore delete mode 100644 android/app/proguard-rules.pro delete mode 100644 android/app/src/androidTest/java/com/com.global.safe.mobileapp/DetoxTest.java delete mode 100644 android/app/src/debug/AndroidManifest.xml delete mode 100644 android/app/src/main/AndroidManifest.xml delete mode 100644 android/app/src/main/assets/fonts/safe-icons.ttf delete mode 100644 android/app/src/main/java/com/global/safe/mobileapp/MainActivity.kt delete mode 100644 android/app/src/main/java/com/global/safe/mobileapp/MainApplication.kt delete mode 100644 android/app/src/main/res/drawable-hdpi/splashscreen_image.png delete mode 100644 android/app/src/main/res/drawable-mdpi/splashscreen_image.png delete mode 100644 android/app/src/main/res/drawable-xhdpi/splashscreen_image.png delete mode 100644 android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png delete mode 100644 android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png delete mode 100644 android/app/src/main/res/drawable/rn_edit_text_material.xml delete mode 100644 android/app/src/main/res/drawable/splashscreen.xml delete mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/values-night/colors.xml delete mode 100644 android/app/src/main/res/values/colors.xml delete mode 100644 android/app/src/main/res/values/strings.xml delete mode 100644 android/app/src/main/res/values/styles.xml delete mode 100644 android/app/src/main/res/xml/network_security_config.xml delete mode 100644 android/build.gradle delete mode 100644 android/gradle.properties delete mode 100644 android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 android/gradlew delete mode 100644 android/gradlew.bat delete mode 100644 android/react-settings-plugin/build.gradle.kts delete mode 100644 android/react-settings-plugin/src/main/kotlin/expo/plugins/ReactSettingsPlugin.kt delete mode 100644 android/settings.gradle rename {android/app/src/main/res => assets/android}/drawable/baseline_arrow_outward_24.xml (100%) rename {android/app/src/main/res => assets/android}/drawable/baseline_auto_awesome_motion_24.xml (100%) rename {android/app/src/main/res => assets/android}/drawable/baseline_create_24.xml (100%) rename {android/app/src/main/res => assets/android}/drawable/baseline_delete_24.xml (100%) rename {android/app/src/main/res => assets/android}/drawable/baseline_explore_24.xml (100%) create mode 100644 e2e/flow.yml delete mode 100644 e2e/jest.config.js delete mode 100644 e2e/starter.test.js delete mode 100644 e2e/transactions.test.js rename withDrawableAssets.js => expo-plugins/withDrawableAssets.js (100%) delete mode 100644 ios/.gitignore delete mode 100644 ios/.xcode.env delete mode 100644 ios/Podfile delete mode 100644 ios/Podfile.lock delete mode 100644 ios/Podfile.properties.json delete mode 100644 ios/safemobileapp.xcodeproj/project.pbxproj delete mode 100644 ios/safemobileapp.xcodeproj/xcshareddata/xcschemes/safemobileapp.xcscheme delete mode 100644 ios/safemobileapp.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/safemobileapp/AppDelegate.h delete mode 100644 ios/safemobileapp/AppDelegate.mm delete mode 100644 ios/safemobileapp/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png delete mode 100644 ios/safemobileapp/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ios/safemobileapp/Images.xcassets/Contents.json delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreen.imageset/Contents.json delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreen.imageset/image.png delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenBackground.imageset/Contents.json delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenBackground.imageset/image.png delete mode 100644 ios/safemobileapp/Info.plist delete mode 100644 ios/safemobileapp/PrivacyInfo.xcprivacy delete mode 100644 ios/safemobileapp/SplashScreen.storyboard delete mode 100644 ios/safemobileapp/Supporting/Expo.plist delete mode 100644 ios/safemobileapp/main.m delete mode 100644 ios/safemobileapp/noop-file.swift delete mode 100644 ios/safemobileapp/safemobileapp-Bridging-Header.h delete mode 100644 ios/safemobileapp/safemobileapp.entitlements diff --git a/.detoxrc.js b/.detoxrc.js deleted file mode 100644 index e5b60ca416..0000000000 --- a/.detoxrc.js +++ /dev/null @@ -1,83 +0,0 @@ -/** @type {Detox.DetoxConfig} */ -module.exports = { - testRunner: { - args: { - $0: 'jest', - config: 'e2e/jest.config.js', - }, - jest: { - setupTimeout: 120000, - }, - }, - apps: { - 'ios.debug': { - type: 'ios.app', - binaryPath: 'ios/build/Build/Products/Debug-iphonesimulator/safemobileapp.app', - build: - 'xcodebuild -workspace ios/safemobileapp.xcworkspace -scheme safemobileapp -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build', - }, - 'ios.release': { - type: 'ios.app', - binaryPath: 'ios/build/Build/Products/Release-iphonesimulator/safemobileapp.app', - build: - 'xcodebuild -workspace ios/safemobileapp.xcworkspace -scheme safemobileapp -configuration Release -sdk iphonesimulator -derivedDataPath ios/build', - }, - 'android.debug': { - type: 'android.apk', - binaryPath: 'android/app/build/outputs/apk/debug/app-debug.apk', - build: 'cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug', - reversePorts: [8081], - }, - 'android.release': { - type: 'android.apk', - binaryPath: 'android/app/build/outputs/apk/release/app-release.apk', - build: 'cd android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release', - }, - }, - devices: { - simulator: { - type: 'ios.simulator', - device: { - type: 'iPhone 15 Pro Max', - }, - }, - attached: { - type: 'android.attached', - device: { - adbName: '.*', - }, - }, - emulator: { - type: 'android.emulator', - device: { - avdName: 'Pixel_8_API_35', - }, - }, - }, - configurations: { - 'ios.sim.debug': { - device: 'simulator', - app: 'ios.debug', - }, - 'ios.sim.release': { - device: 'simulator', - app: 'ios.release', - }, - 'android.att.debug': { - device: 'attached', - app: 'android.debug', - }, - 'android.att.release': { - device: 'attached', - app: 'android.release', - }, - 'android.emu.debug': { - device: 'emulator', - app: 'android.debug', - }, - 'android.emu.release': { - device: 'emulator', - app: 'android.release', - }, - }, -} diff --git a/.gitignore b/.gitignore index 0384f6f536..53f54a61b5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,7 @@ expo-env.d.ts *storybook.log /storybook-static + +# Android and iOS build files +android/ +ios/ diff --git a/README.md b/README.md index 96ff72d4b6..ad1be8f89f 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,9 @@ or for android ### How to open custom devtools menu -currently our app have redux, rtk-query and react devtools support. To run one of them is pretty straightforward, you just need to run the app, and then in the terminal where expo server is runnig, you press `shift + m` and the devtools options will apper for you. +currently our app have redux, rtk-query and react devtools support. To run one of them is pretty straightforward, you +just need to run the app, and then in the terminal where expo server is runnig, you press `shift + m` and the devtools +options will apper for you. Then select one of them and happy debugging 👨‍💻👩‍💻 ## Running the storybook @@ -43,62 +45,52 @@ Then select one of them and happy debugging 👨‍💻👩‍💻 ## How to run the e2e tests -We're using DETOX for e2e. Before run the tests script, you should first install DETOX by following this steps bellow: +We're using [Maestro](https://maestro.mobile.dev/) for e2e. Before run the tests you should install Maestro according to +the documentation steps for your OS. -### 1. install DETOX cli: +### How to run a dev build and e2e tests -```bash -npm install detox-cli --global -``` - -### 2. [MacOS Only] applesimutils - -This tool is required by Detox to work with iOS simulators. The recommended way to install applesimutils is via Homebrew: +To build the dev version of the app for tests, depending on the platform +you are building for, you can run either: ```bash -brew tap wix/brew -brew install applesimutils +npm run e2e:metro-ios ``` -### 3. Build the detox configs - -for IOS: +or ```bash -detox build --configuration ios.sim.debug +npm run e2e:metro-android ``` -or for Android: +This commands will build the app for e2e tests - the difference to a normal dev/production build is that files ending +with `.e2e.ts|.e2e.tsx` will be included in the build and they take precedence over the normal files. This is useful to +mock some services or to add some test specific code. -```bash -detox build --configuration android.emu.debug -``` - -### 4. Run the tests - -Since this is a debug configuration, you need to have React Native packager running in parallel before you start Detox tests: +in a second terminal run the e2e tests: ```bash -npx expo start +npm run e2e:run ``` -in another terminal, you can run: +### Use maestro studio to write tests -for ios: +You can use maestro studio to write tests, to do that you can run the following command: ```bash -detox test --configuration ios.sim.debug +maestro studio ``` -or for android: +Once the tests are written you can export the yaml to the e2e folder and run the new flow together with the other tests. -```bash -detox test --configuration android.emu.debug -``` +### Run the e2e tests in CI +To run the tests in CI you can add the `eas-build-ios:build-and-maestro-test` label to a PR and the tests will run in +Expo CI. ## Unit tests -We use Jest for running our unit/component/hook tests and [React Native Testing Library](https://callstack.github.io/react-native-testing-library/) to manipulate them. +We use Jest for running our unit/component/hook tests +and [React Native Testing Library](https://callstack.github.io/react-native-testing-library/) to manipulate them. To run the tests you can just type in your terminal: diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index 8a6be07718..0000000000 --- a/android/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -# OSX -# -.DS_Store - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml -*.hprof -.cxx/ - -# Bundle artifacts -*.jsbundle diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index a9cd408991..0000000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,186 +0,0 @@ -apply plugin: "com.android.application" -apply plugin: "org.jetbrains.kotlin.android" -apply plugin: "com.facebook.react" - -def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() - -/** - * 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 { - entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) - reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() - hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" - codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() - - // Use Expo CLI to bundle the app, this ensures the Metro config - // works correctly with Expo projects. - cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) - bundleCommand = "export:embed" - - /* 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") - - /* 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 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 = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() - -/** - * The preferred build flavor of JavaScriptCore (JSC) - * - * For example, to use the international variant, you can use: - * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` - * - * 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 = 'org.webkit:android-jsc:+' - -android { - ndkVersion rootProject.ext.ndkVersion - - buildToolsVersion rootProject.ext.buildToolsVersion - compileSdk rootProject.ext.compileSdkVersion - - namespace 'com.global.safe.mobileapp' - defaultConfig { - testBuildType System.getProperty('testBuildType', 'debug') - testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' - applicationId 'com.global.safe.mobileapp' - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0.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 - shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true) - - // Detox-specific additions to pro-guard - proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro" - } - } - packagingOptions { - jniLibs { - useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) - } - } - androidResources { - ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~' - } -} - -// Apply static values from `gradle.properties` to the `android.packagingOptions` -// Accepts values in comma delimited lists, example: -// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini -["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> - // Split option: 'foo,bar' -> ['foo', 'bar'] - def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); - // Trim all elements in place. - for (i in 0.. 0) { - println "android.packagingOptions.$prop += $options ($options.length)" - // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' - options.each { - android.packagingOptions[prop] += it - } - } -} - -dependencies { - // The version of react-native is set by the React Native Gradle Plugin - implementation("com.facebook.react:react-android") - implementation("androidx.appcompat:appcompat:1.1.0") - - // detox dependencies - androidTestImplementation('com.wix:detox:+') - - - def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; - def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; - def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; - - if (isGifEnabled) { - // For animated gif support - implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") - } - - if (isWebpEnabled) { - // For webp support - implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") - if (isWebpAnimatedEnabled) { - // Animated webp support - implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") - } - } - - if (hermesEnabled.toBoolean()) { - implementation("com.facebook.react:hermes-android") - } else { - implementation jscFlavor - } -} diff --git a/android/app/debug.keystore b/android/app/debug.keystore deleted file mode 100644 index 364e105ed39fbfd62001429a68140672b06ec0de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2257 zcmchYXEfYt8;7T1^dLH$VOTZ%2NOdOH5j5LYLtZ0q7x-V8_6gU5)#7dkq{HTmsfNq zB3ZqcAxeY^G10@?efK?Q&)M(qInVv!xjx+IKEL}p*K@LYvIzo#AZG>st5|P)KF1_Z;y){W{<7K{nl!CPuE z_^(!C(Ol0n8 zK13*rzAtW>(wULKPRYLd7G18F8#1P`V*9`(Poj26eOXYyBVZPno~Cvvhx7vPjAuZo zF?VD!zB~QG(!zbw#qsxT8%BSpqMZ4f70ZPn-3y$L8{EVbbN9$H`B&Z1quk9tgp5FM zuxp3pJ0b8u|3+#5bkJ4SRnCF2l7#DyLYXYY8*?OuAwK4E6J{0N=O3QNVzQ$L#FKkR zi-c@&!nDvezOV$i$Lr}iF$XEcwnybQ6WZrMKuw8gCL^U#D;q3t&HpTbqyD%vG=TeDlzCT~MXUPC|Leb-Uk+ z=vnMd(|>ld?Fh>V8poP;q;;nc@en$|rnP0ytzD&fFkCeUE^kG9Kx4wUh!!rpjwKDP zyw_e|a^x_w3E zP}}@$g>*LLJ4i0`Gx)qltL}@;mDv}D*xR^oeWcWdPkW@Uu)B^X&4W1$p6}ze!zudJ zyiLg@uggoMIArBr*27EZV7djDg@W1MaL+rcZ-lrANJQ%%>u8)ZMWU@R2qtnmG(acP z0d_^!t>}5W zpT`*2NR+0+SpTHb+6Js4b;%LJB;B_-ChhnU5py}iJtku*hm5F0!iql8Hrpcy1aYbT z1*dKC5ua6pMX@@iONI?Hpr%h;&YaXp9n!ND7-=a%BD7v&g zOO41M6EbE24mJ#S$Ui0-brR5ML%@|ndz^)YLMMV1atna{Fw<;TF@>d&F|!Z>8eg>>hkFrV)W+uv=`^F9^e zzzM2*oOjT9%gLoub%(R57p-`TXFe#oh1_{&N-YN z<}artH|m=d8TQuKSWE)Z%puU|g|^^NFwC#N=@dPhasyYjoy(fdEVfKR@cXKHZV-`06HsP`|Ftx;8(YD$fFXumLWbGnu$GMqRncXYY9mwz9$ap zQtfZB^_BeNYITh^hA7+(XNFox5WMeG_LtJ%*Q}$8VKDI_p8^pqX)}NMb`0e|wgF7D zuQACY_Ua<1ri{;Jwt@_1sW9zzdgnyh_O#8y+C;LcZq6=4e^cs6KvmK@$vVpKFGbQ= z$)Eux5C|Fx;Gtmv9^#Y-g@7Rt7*eLp5n!gJmn7&B_L$G?NCN`AP>cXQEz}%F%K;vUs{+l4Q{}eWW;ATe2 zqvXzxoIDy(u;F2q1JH7Sf;{jy_j})F+cKlIOmNfjBGHoG^CN zM|Ho&&X|L-36f}Q-obEACz`sI%2f&k>z5c$2TyTSj~vmO)BW~+N^kt`Jt@R|s!){H ze1_eCrlNaPkJQhL$WG&iRvF*YG=gXd1IyYQ9ew|iYn7r~g!wOnw;@n42>enAxBv*A zEmV*N#sxdicyNM=A4|yaOC5MByts}s_Hpfj|y<6G=o=!3S@eIFKDdpR7|FY>L&Wat&oW&cm&X~ z5Bt>Fcq(fgnvlvLSYg&o6>&fY`ODg4`V^lWWD=%oJ#Kbad2u~! zLECFS*??>|vDsNR&pH=Ze0Eo`sC_G`OjoEKVHY|wmwlX&(XBE<@sx3Hd^gtd-fNwUHsylg06p`U2y_={u}Bc in AndroidManifest.xml - @Rule - public ActivityTestRule mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false); - - @Test - public void runDetoxTests() { - // This is optional - in case you've decided to integrate TestButler - // See https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#8-test-butler-support-optional - // TestButlerProbe.assertReadyIfInstalled(); - - DetoxConfig detoxConfig = new DetoxConfig(); - detoxConfig.idlePolicyConfig.masterTimeoutSec = 90; - detoxConfig.idlePolicyConfig.idleResourceTimeoutSec = 60; - detoxConfig.rnContextLoadTimeoutSec = (BuildConfig.DEBUG ? 180 : 60); - - Detox.runTests(mActivityRule, detoxConfig); - } -} \ No newline at end of file diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 3ec2507bab..0000000000 --- a/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index ced5176ff1..0000000000 --- a/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/src/main/assets/fonts/safe-icons.ttf b/android/app/src/main/assets/fonts/safe-icons.ttf deleted file mode 100644 index 8a4a0963fc75bf4a3eff981f72b4fd86f69b4f6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24648 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 diff --git a/android/app/src/main/java/com/global/safe/mobileapp/MainActivity.kt b/android/app/src/main/java/com/global/safe/mobileapp/MainActivity.kt deleted file mode 100644 index 7e223106b2..0000000000 --- a/android/app/src/main/java/com/global/safe/mobileapp/MainActivity.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.global.safe.mobileapp -import expo.modules.splashscreen.SplashScreenManager - -import android.os.Build -import android.os.Bundle - -import com.facebook.react.ReactActivity -import com.facebook.react.ReactActivityDelegate -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled -import com.facebook.react.defaults.DefaultReactActivityDelegate - -import expo.modules.ReactActivityDelegateWrapper - -class MainActivity : ReactActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - // Set the theme to AppTheme BEFORE onCreate to support - // coloring the background, status bar, and navigation bar. - // This is required for expo-splash-screen. - // setTheme(R.style.AppTheme); - // @generated begin expo-splashscreen - expo prebuild (DO NOT MODIFY) sync-f3ff59a738c56c9a6119210cb55f0b613eb8b6af - SplashScreenManager.registerOnActivity(this) - // @generated end expo-splashscreen - super.onCreate(null) - } - - /** - * Returns the name of the main component registered from JavaScript. This is used to schedule - * rendering of the component. - */ - override fun getMainComponentName(): String = "main" - - /** - * 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 { - return ReactActivityDelegateWrapper( - this, - BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, - object : DefaultReactActivityDelegate( - this, - mainComponentName, - fabricEnabled - ){}) - } - - /** - * Align the back button behavior with Android S - * where moving root activities to background instead of finishing activities. - * @see onBackPressed - */ - override fun invokeDefaultOnBackPressed() { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { - if (!moveTaskToBack(false)) { - // For non-root activities, use the default implementation to finish them. - super.invokeDefaultOnBackPressed() - } - return - } - - // Use the default back button implementation on Android S - // because it's doing more than [Activity.moveTaskToBack] in fact. - super.invokeDefaultOnBackPressed() - } -} diff --git a/android/app/src/main/java/com/global/safe/mobileapp/MainApplication.kt b/android/app/src/main/java/com/global/safe/mobileapp/MainApplication.kt deleted file mode 100644 index 1b9f50dc8e..0000000000 --- a/android/app/src/main/java/com/global/safe/mobileapp/MainApplication.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.global.safe.mobileapp - -import android.app.Application -import android.content.res.Configuration - -import com.facebook.react.PackageList -import com.facebook.react.ReactApplication -import com.facebook.react.ReactNativeHost -import com.facebook.react.ReactPackage -import com.facebook.react.ReactHost -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load -import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.react.soloader.OpenSourceMergedSoMapping -import com.facebook.soloader.SoLoader - -import expo.modules.ApplicationLifecycleDispatcher -import expo.modules.ReactNativeHostWrapper - -class MainApplication : Application(), ReactApplication { - - override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( - this, - object : DefaultReactNativeHost(this) { - override fun getPackages(): List { - val packages = PackageList(this).packages - // Packages that cannot be autolinked yet can be added manually here, for example: - // packages.add(new MyReactNativePackage()); - return packages - } - - override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" - - 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() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) - - override fun onCreate() { - super.onCreate() - SoLoader.init(this, OpenSourceMergedSoMapping) - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - load() - } - ApplicationLifecycleDispatcher.onApplicationCreate(this) - } - - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) - } -} diff --git a/android/app/src/main/res/drawable-hdpi/splashscreen_image.png b/android/app/src/main/res/drawable-hdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 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 diff --git a/android/app/src/main/res/drawable-mdpi/splashscreen_image.png b/android/app/src/main/res/drawable-mdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 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 diff --git a/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png b/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 zcmeFYhdJXQHaXO4jIWvB@{(MA$w+KE2Rh-B_lhOBH3G+$(HPd?7cVl zdA-rq_xj!czv}w7yx*^J&hwn}Jmd3J@ro?*UYfl)I5@;|7o@J@;Orv6!P(nR zv>Se-+)KuRgERb4PU@VpJ?_|NTwM62+w+Z-2_iiB?!W*3lfZux_)h}=N#H*T{3n6` zB=DaE{*%Ce68KL7|4HCK3H&F4|6fbMt?gm3YC&CzSbb6Vs&g(gzhB$a*HxZUB~lcD zczabJj_`1Z{^bG^5PpYtSHTt|i&3o!8 z`>$knyE43EOeMjmJxRz;P2V4M<;*?fTXM_NfDm;}zg7YyW_d+A{tVC<#_=Qkg`n{7z1qNa3Wu&gu0z=x*n%~JU zz|+Lo4mclee&FI{UZ;`^Eeq$(&*Lmt^*g&1sOl=y#@Yp9;^+Wk9-eGOd zFL@)!lw2y;{tE+f;qIbi9L}2w)@{iHxTyF~z;c`{h5ZC2k!!vRf)UU04 z*Z+B5H@%CLHlv1`PEN0*TBsyXoui$5pn5;84L7A)I&qkfbVoIMI2|qC?n}Rql}3k8 zE|AY8{pK_7>sAw!o<8N&bl!1ld?w$scHy*M8O6a-Pcm(fH*I}CZXgm+op~pXyWFT? zsfTpYmHG+~WfFTX5vu|G9mj1PEm{+*%N)|fEc!gIM=Gh=sNm*@A4$ziNpM*v`0=-5 ziJmEX0z}d%j8pt$B)Y*?z=W^7QuX(R5}BlChm4yaT6ET$iCBlJbzVq^fo!OCtZUog z6ozy-x5F~zNj(D7>1tw3TTPy&YJMnpc$P{+Ym<7jI>h?Gl}2V!GMw9|KH%e+e6WnO zs(l=2&E3u?S0Xby?~tL{opCc|^PY!~gKoM|Jsc=j=h?($-EN%Li|CT?)%XlcWK4M} zO|yxUnpIP-C*_q>Cs_m}Be}5}1!NlTh^>6cK(=H3u}{0+Ghetp?T41pW`_bzpVXU= zeA?sbn7lzospyeEOB*(UG(^eFzELOP+kLpMb4b8Qn=jd>S4;@PP2?a-&06>V3Jd%cU8#8sy(C+LoIDt*LAnyiC`V`TqK7-Vg8Q zVoQrh;0- zgTjXWlR?Rz>q+xQ1*#vek6JvSr#26Wp>%-nEVd;iv&IP8!6F;`B49p-ricW{mlSV-OL%GqjRCsz4aC=U* z)xi08a`Un9sKYuLM!bQbMc>Rn5)Jc-V*;6)!nLwFl9)!huO|V_!5`>0#P=}Ew=)y( z>`wYdj`m8uwLf3D$+KkGnI@LW-b?0t}bEfP3R>Zfv*paH* zuLv(@?HnzM&QLZG%>PJbjCV0zW7)PdX>YJa@Dag01h+6H*oIMHYGn*@=Q$9?Au!Nk zYSDu`_$p)p(NtFY@1A&$^rQ;{Q0hpJCB)mp_J?NQhWK%VGfGtMBJaJCzQ+xk@V5{6 z!zeH_R=#A91DhvJ_O)D9j!y=%B{HHsf0V3k8gLxJpZmH_ZHNGI=TT&r)ghUnxUh6N zn!nEgYBFuyJrN~9r}KWW`ZC6wOVf8-OdBb)wi_ebX)&$t~J!=nrsp>X7?x+VR^5@1C1{D_?K`Fifo?pI(O`v8>W+F0ve|(30 zhxIc+u(w4AM5U}~jSuA~0h7i}0;WydM&+F$7na^bP@~EmVp{SQqRWUj*p*NqGQB{7 z9mfK}x<^Xm8Fy%$9F1AYe%4X#XQ@@u0w&)DM9Fs)EHIo3r^(!cNZ5HRz04j0QwK)F zZQsQ4LnjvYfe=hj)Op90=F0c1XFD$2n7zG$8{MVB_61+@Y64va&mXOqL2w1EVJ2dB z4d3pn9}D33H5TT(j{;l?1K^eT@uBE{47xpDj^;{zx(+ihEGFMRC$Sw&%0lBjzsQ*8 zQp+_-XUkjdo=6lxdc!zI`!o8ztVR_EB?=($JEpQ!+k&PXjgBLx&5#!fJx@HfVIY!w zp?$|6`EVn%17CI68zNJd;o}ZoeZ4bEA`t0!l&#uy9;6^l>ArXYB8X3eZ^QW=1=2u7 zq^Is75PgYIXcgx!@^5&>Y zAmO(dtg-k+f9cQt=2aU%s)f;4#>nI6bFF0VM9z%iurGVsQ;DVuN7Q$Gv-iAW0L19{ z@yh7k_T6(5jXSCZHq&710a1oMARY{q#-3~LLOc9%i|Wvc3ZSJbqaO!W7duAN83L$x zME3){AH>M?8i0O$4*_vLRrydVh~5ZA?+iLo$}8Wc0|pqPu8D{wD7-<`U%XFb%_&1TxY|HhVlvxW4W)oexHoV@n zEh$=gHpY_!9|{V>+=(F~(r>wZw?!?#yA5%MR#AkX48o*Ie=AbSQ3?H!{@Ex^!snei z4D1p9F$|0I=99BZG)yySkMm}hZ_NMT&8!h8*EFC?r8XzgegxnK-wM^o0W&ddI%3p5 zSHiGSwmMO;7!g@Cnw&SWoUl0;ys^sO9$%BH*B}ic4___a(3j8LFm33VccxsZfar5+ zDm5Td`ETU(Ty6zc=Xbj-2TzJ`dKWDz)H3r9){CBYhvbgrM2sJ zt}9?TV>2?xbe(h^vn~{eM1yjWjL3CFpCn7|HiyrxjZ#?y0-qV>q z-JY=}kkKDC@Xclx`f0V+u4sLQ);xcjs(ZCIOUt#-M{wg<7Mv#Fcu3pzqM1{RT1)kw zVoq8C%ME@mbCKhqh+4-OIPFaCsZ}#u z)#}!U=<3y0>*{f*z2fB!36cHu>V8MHHvES3)2k3(?~pR|gLJ@s#tOXvA^m}4U#s1P zcmsv3OyH4$V%VoT96fbQmm5}<4uGxEk7p@y>=__pO$HX49vSLpG^`jJQkUs?Mo(iX z(*DdgZk#$+zR`BB7~B%6PXj*FuzESQsDJ}otf!2F346P*fcy$ctd8{@hhd{mtj=69 zP}67hhu19)Wh;gZL{>5_H`j~q^-SbV<}B82uGN`m=rs7xNvym~HK;HM^yL-~pr?uT z<~zJ@EJNx;PaPX8E8{8^%J;Q8FN8Nuez4l4sq-kfRztHUPqDe4)rq3bjajSXke!&X z-8MI$)cXknG!2ccM_=u@_4UFASoz@VPe8)r&qaT~wZ^xkV{3hz6X%O8y1CZAcy4|r z6q|Byvg@|0D`-2Gm#1GhjsRgdT~6vUMb*7Lk)>6%Tp;ee{^MuldYfI*Vwd>xPrJfd z3=9u-2P*hw^)eg&IgHxcZOhRgKWp+?Lv;rd`1J=w#_DudSFK#>+ao7Giu*B#RPa!( z&YG@Tr4|*5!*{ZGYuDFvF7Wv2(l7OE6>hF|*>&42eo)Wa7)#k0;p%?ny}m9KD73h^ z$g96F*cmCy6Syt}-}$e@Yps#y7YB~b%A*Zx*O%jUIeGlXxOm_(^n0sR*uWcfpQ=mW z8tJ_*4KU+epaQT!?loCgws9Gb0)N-z8QeGq+vG%6k4@IC>%xK7Lv#z9Hna;(#c`&@ zR0(l10WhYaI#$O`8}$M+g-!>y#qr7o9uFA?2w!fGyMHY#D_t&(fqU?>NTW25Ra}lU zuUy!9UQ;WRQ6hZ%|I|>=f%8k=XJ;K<=U*m&GmvXtA_X- z4saGNH6d;BIkBLw*X{XtYpVrnM5@tm(BCpciXMe9@qVq24$&PjKRqiL${Vt*#4Fpb zTMLge%ku<=*wHX)JUbG`>p4&zBexKydmJsfeQXN;@#^sVH#DlHU8H#RDNT9w1CFQ3 z>G|?~b@|!IEH5IWuh+=TE1rz~>N1s;|9N->=a;?-9gcluHK?nW;rQxu4{4M1&uDO> z65wQ;*xLtG)4&^}?~fS6zj12mHU6A4@dJwRL}0x9EK{g}e5gQ;pFx^|)qC$F5ZRC* zO(`{g%gcw(_YS&D3~n|=ZVWFLTJ=|*+SF=<)xFt6r8|xo!y8dT-;Wr8mnKO!Y)m&K z;rGs57U{p?(!a5fVRNZsQ<`#fSbV)_(sfilrRXKcy^SyUq+)B8v3|~Tu~cHV8*7gU z#XqK532zp6I@gIJo9nV#bk<$G)LaUcnzP>ycE0 z;}Q}84?55q9-;=cc79fTb9QqmuY3KcUGlB_{hRXed@VbAGUPnCI30KyIo#vC=Apda z+y0Pl;21c+aNfz&;7z^3$L=^#-2r(ke+GUkA%Vea?Jc*Ny5%Z$(4xLI@GP#|;%8y7 zlThz`Q_e3PfUe2zcCE4T@vgO6a1|e>l5K5muS~+v)xGN74(l0Z8To#;b>X6mr4*6* zOZ7~CPHWMw83xl%Rmj;$f6)4;4t!^`a>I@@e52VdUM7YbAHbJFp+A}YbZfF*+HD7X_>b%5NU_boh=g*ptETNnMJM8tnXMjNGiCIl#h(@JS<9e$@`I1to9UxAS}v*kJ#+Zm0R?lx}q7HBq}hK!jkjR*@|_ znU%>Rl2@Jh)GutM<$Y9Q3-u*_VlN}>&y$L;v|?YV0#nu+E^%qDjJz3)bR0J3(%d_l z1Zl#b92|%?cjFZA;uMpg*uoOBtKWf8TN&? zMJo?(a4LASB)Dkq5&DtRWx&B8PJTP*Lp5Gnm*ZCex-KJc6C&>;Lm7$oWN>B|k4Bqs z4!xn`(kKA!740CP+SVwu5)pBLu+#F$i(oGOR7W86n9@BNTz;pby{{#JLm3npix6_0 z_{ysvd4Hz2sV;wIM6hsUbFJ2@X#NXGiCCOhG>8*2$*rtON3O)tc(J<8Nqc9Oro%=XJH5kFLq$aH(p!Cc zhu{8w7U}mO&Dk9ebfP>^9-a4@+Ldw(dp;hzeLZ1=&5#D8yWnwybjH=D$@_SuTd zdA#frwpl(`;WCoss{g+5g-Y zTlgB4`1~-odH8LlHmxYBOh@+B?%p2pca*dz0BY%JZMQd;-XHRXR_^YK5|ESSrn;_9Ew5#pU)toIph zNm*ZYT{MsU+WXa8L45XmnS%2QW)`#fz!?c#G^~D#LyEkTn3#Ycw{DNE9fo;c$ z-_&5H)9{F_#9Ri|rr+l5Ddb|mnJ&c!Yv#}8Z7y0B*l?oe}%)!8cefbMYfmD$j z)&i}fRtud}u6=?@6SGC@{ansHk1o}T)4E8Co^Id0wAuEMVM<`KL~N?N+gLQF zmnh|9nb9Gfx?RZv6qn8T+i*Nq$0B$yq!#GrF`YYZ=@@Guc{iEm+?SXL{TGHOPM$lJ zPHnpQgh%>nK^YUHS5{fZiRbEp>9YQnX`>U2jJ#bYyI+mx6m~sa{4n`8P-1d4&pVB} z=-~#R{{h99rgAuClY{4_l*4S@o;-PC6ry-gng|y+muXdOcc`7z z7M5Zzw)YLW^@ehHJKQ$?{b`id*Uv*wKRyP(=R&$@YqNKU#Tku>!3x%am6G$Zo8QLf zsE2&_;NlYDN?>a@l8_xZpj1OHh%4!4X1r(?wq9)RG?67XKa^rWCC1*wek zGW~KIPP@Q`zdV7u@JR0?cTv1v;C4*sXShTaNOT?rjw%wBUr6DC}ZABgD zt!D~1D@0+P5(Fti)irl^pWOoR2^ zEtuQs$41JIqZgK^p9-aI zWX=~r^d)s3563?z*BAe)Pb}%V7mFA6uHALBtxrFfbb)?CWX{?iwH~y+WlOfc3oO@-Eb{j=$f-DEb><;Y|!`^uKH{}VRG(vY_etk>ktBRu{~)fh?v2#aHvE>`M5k9+ItT-569!ab3a@MuypHE3!}lVO zi1QE5FXLzXTo!(@MnyGP=Q6+>X-3c>I@NC1^mTJ-y>o?YeTKEm{YNH=NsRcBr@L=< zJdlkzJjOSd|JYQnlK}VFv19M#L@JpR`Yub_eY4YP01_ntXB6rA2Vz0}rP?OrGZ(cPk36*%?{cI* z)T-RPv06tjeod=;YH6%Ghx>e;aqIC?8!tSf|G7XXSe6O?e8l7OuT%+KpkYCQJJk2b zOH&6)?l!(<9*QN4B0cwu<{Qtxgdzd4{M_7tGs|Dz3V~6{>;hdsZ)rI)w4+&k5c@5B zOgtDg^-g#xf;AKEBF#n;3f9tasOhoJNqzcgd8sX-kj$hi?wTA~*9|;397f9|keAcD zQ?2P1M_nkxkoz%TA0E-#zh6csm6!-OnoaTm%U`%D@ld>o<4*WOUS(WX*7vpHZfE5X?Ro_my8@el>^r(a~|F@@Qs<0P{ z2UEks?HgPt4M=St_60wFUP66pIgr9CQ}i8O z*cnl77u`EzVtaCR0Lwn)o=wBH!mrJOT5XeT!;I4UD1Ch7H*#}xHC8vx*87UmCj-qo zbwjRycIaSNjaNI(ku;TQNO}3&Noog8`~t3RACjAFjQ`MIN%rW!eqWuse4K)jZ6GL*ZSPDrJJLNGmTH%)0n<9 zN=Y#{NN+Q7q@U&Ed-twp!XmqKi7diIh^&~Y&U;8h^X9XHgJD`$XKtAVr2?9(y?KLc>n=;{CnS_l;T*v0-A#moihMhUPc=!l z7^wr22ka%no$hES7sQ_OkbkeCDHpy}Re2N^Z7nx>XJjWFZU%nT;>_!bx|PsKYnR61 z%yFghL~?+qE$pLwTZ4ZeZFgO=`R{uvw7JRs0-r`hPQ7K$r@xjZ6{x1+HbDzOHZHkDsr7A<@?40BE>tbe1q*%oQgKxnrMO6Y~J|%LysW z5KnH?a$9Qv_3vzB@RcIm%@ms$mB-4rrWPq~@jK-66=bx%9$+3GZg~H=9d-9&$^oR- z8VyyeGa7Ks5WPD~A)jku-BMXbmN+u9Ry+{TA~+Xy@LrMg{NlsYe0;sQzu|b`z3aQ0 z9I07yZrQHq4WH^()6kI9O^yp_J&x1?N}CVVdi^R51j*J1Zx!;{-T5$C-^2ld=VQj6 zqg!w`MzQ(HM6`p#`M%%YO~DYQXb(}#XpZiiPp8gJ?qMRw!{e`xf4AW4o2>ZF9iMJT zBAq&5r51tFqcmpid3KY9xw)_Ne%>Es72g;w+87m7`qUBMuF|ZRHGX{@;(Z@I@{pq7 zo+cuGmau&V0rr=^u@`n`F&w&2O!_gS`98`_D*0E7;+<_QboE`cyGk=)KJ2~Fb` zXTEc?C?-p1#4d9gy=IK z&{@&iNTV?#lrJf~Elt$$5c}EUq(hv>K$jwpL_WDgF$iXl7^i(P(#nEw?a!AlGow%h z^@PK4SoL4z3I0|PA(s$Rt$SApnPP#TA3Ow3 z|BUGL7k{9j)bu#up1Tf=jg3!C&>`oygmW)vY^A;b#hc437kL0)N{7e=i8@I^-``fW zO@vaZ&p$;6q&L{-@}p%9{8;@H5fmiq{1mFyZq$5fZ@;K*JJ9(G;MjSC+^*w`lSyO! zZ2Q-gE7fh_(Sn8{bh3rKj-V-dc~tS(Ke5eV-}6M9^@sk5xq9sdQO(hf7`9d3ZLtIy zohsCGjS@f0H-gZJ132Pw?ys_YNfE3KLR92ses>g3$~&w~&O(yV)YZ5``+4EEehNC< z;vJy+9l%f_!WzKo!(Iys>VfU6x3-U5jG44^NDtmvUJC`_$cAjd&H)$$+(Yh$QTlky zP*$G&ksY`wTHpP)W?%u?=FAfUT500-4D>YfD{Hu&D6Sx`-*Wv1IRahcF$fcnmRo-# z5%gFCi}iS{PI6?(0zyl^ADjm%_9jN*YkdwoXqHfB_UAFMrVOyc>?hX>-y zL6)?pYdVSd@!SXyzrcZEsp6p-12lCo0>CMf?t6)v1Ar2570vVGHO zh{vx;pma*%8EIq$HN(Qnn!E39eK<(7_hJM6*xn4nJV~G>t=p6@+dIzVARgZ0tLV|2 zT8Rn$Z(7$v5jDT;dWJlMeRc#EmHU2L4GS)6Tb%X^-t$ChpmskoJp!AZf8=lzwzTM$ zb5aJdInTA}=wmdL@L!4EN+nV(C{iC#4Yqjt^clVpaLU;}|1YxAU?d=5v=E0_f!5db zs!0(7LR_`BkycUnDt#CVNoxOJvF469q7%0jCVPVDuWC)Tcsfb z4YV8q4|3O6%+cf?Q?Ro$Q?LdhfT)3RiVOllq8>j#zo^oU8(H7@K1d3zmJ1uXLAoSMIT6(%yX9hEhmWu8rKKMT;m=c5F$RIZ3r{LUA zT3#yx8IKtgU{>LX>qPx>$Xo7`dVUj2d3kvSbTA(IwC6R2slFUlpWc4~hofz3b9cBw zYx$5LmJw`KB#z&5aSafbq7ToUB7m%iNeOlChu|+ zJ6bl@3vK~7bm`lKRLM-ae%3EyWghW$l}~n)Kb=<>Cl{lb!<==x_-gRXN`a)zDGKI@NCIs|_@pz?#Yp!>;!RwAM!Yd=#P{P*li} ztapg73U)u#j6=nMhAQ6;LbKCnr%I#2wBco`Esy&O%gR+Ex+$lFhBcqv? z=4R(=zOBva$>1t0z@XmW8FC#qoZ@RYc}Isb=%4qZIEJi+yJ%^1S~$M3-=+XKcV)S5 zy7&b>2SBHQawQH?KTbaUcq8}&VfzEN*-9qIMbVX0MZL=lSsP2ViJ$%fvdTX|-pVkK z6A-+64=GnW?DAx9t%8CN2Ny^A$6bgI4Hh{V)k3cPKdHXG#h$ap$X$UmIctBKuXEjc z@{UOi_%Y-?kUrS}$dctS%Qhe@(nYSv^geh;R0wdI);5{h2_|?b zO9ldN>!NoO+k?gqzViw|l&fmalS%0tPl{$fS)^3+1(e~LUPE@Q?k2^L&;-?-FsWUL zPN9Ov_cO58MtRbu(Js+~l2#93eN7a7vM4qpxDB~$59KZ_cN;j*&6VzxeV?R<8-`N( z?vKM5JDZSN^2Pem&N zvu3EYIWPN>r`$hF?1v@#%ipO)LMaFO0;34qA^gw0<+9=9V5RJ9_1GcgzPE1>@lU`p zN+6MaJgmnYp&kqrr@pd8JTS8#=JiEI#|IBN2x*+an`9G*e3{k})lxbQJXrH*% zJ*Q)OKyj4Z|GFzkxz&~+lW9AbPhizNqYbGnN-h>qRdzSZ6z_n$@jXj1!S^ixF%JsN z_tw52fvumM#1dEj%P};F_RuSo^d;Ut!_#Uwl>3+_1JbLy{4-W>^AhZ+!z%kfrHId$ z`Nl&A1-qF@fdp!NQ>s_wP^ud6}b4;VeLzRiY9c3W@?(lo8WLH5XiP%1VdP zHKnqKz|ePp@dt*DY8e0(S)cX-^{!dcjXRE$I`a`SCfawzTo$ql>l+N9=-mDTBAnPJ z?FYZwD+)e$C?FvBwSK*3m1oy6mZ*fRarh~fZ`1=Q8(ECHXELH&nMI?j*wArM-~=hD zPs{^UMMCE``tG{ENVEQ#%jvCa*1Ii1qU0W>L-qXREqhGt5X~;}w@A42n_u~(dPdtr zEvJ#ijZ=#$_KLBT13H2GsCxC4KF>nhi}GnKXN<#ki|6IK!isX+yQr)OgiFR}WMU7U z*al(4tjOqyZS;d%oU1F>w8jijEvvqp4082z#fX`5eQ(l+r0NiOvaFna+vpZ<~U3kK`J=fMw#Ooh*inbKAH`PY&G`Gz|nXmZ_o^-6l~Asm#<7up$a& z9;MGfOrR3N|2+zxsN3(sq-4@NSGwd67FPnLbqQy81DiguLVxQgloqW@6A$&x%#ep zx`3#f!@0>m^gtgvARg>OSZ)~{XaR>HOPtD{cKXQSF-#T16MKjqVF9#L$5qS+x)*Ec z0dI1(H`sE%yw)1$i4mI}wVIXlOX#swM!B%%aKE@y2hYAJ5k^K9W=4su#f6URJz=i- z2RD02e>zYcvWM&xj;EFO_8lERvcAaIqJoe2Uh$0#MZa2nhUG$>$W+rgh&`BM0RcWd zsGKRndq~=6d8N~-vCq){$RS{>x^t)M=vKapOs-K|dqVvZhk0ndz*Oy#`9{*4rA5Je zqlv|Rh6ZaZooh5k)!-Si6tf&c72%ijvDx~}2xqn@Fr_6xA)&RaN#q$1XdW6sLLM|$ zGmoAMVHZQ?{6%2??B7nh4biWBRe++uzy6okK#tE~WpM>xh3e??@H1lfDszn}72}~U z_6KdU7#wi%?3z&RN%8X-&={yF8C5p;_vyEbNIN5 zFunsGB8w8OGg#3Vv%8~E0Qd@_S?VyjCJFl1CkRfpwJGqCbUe>C2sWKYsR=#^zO8gBR zKPFM}f2p@Iwbe7)kHVI?kc$zColi0GR;A`3oVg*h-XV&k6{4c_VWKNx(E5s=^2`nXI92izoL}D2-$HQvN3Q%xTxQyaTFKJ z=f=rF{Jf{HR9^5iY8_x?P3J>p{zhF{l8{;zdSw@hQ~iJrt$B zo+mvaNhBS_CMf}hVXtEs52B_3)QJhms`z81P8<+C!4e~-RLbu~=EbJuq398Vo`bg~ z4~Qq+VoJVtv6P=o^2C8Eem7{1-im!fE^#X%2<;sm^d!t>y~VY_rX^W}fmc51BQ*7| zW?%WW`{^Pp&V^e|6e}}nk@mm+o!Qc6Si9GPH#ZzzBk%}t_DJA7x97r@=#8boVaCBd z!QxTuIF|W#p_c3HyyMmjvzdm6I5}MUNL>*t?$sy2d1|~cz8W{0T0y_M|6<`{!KCw| ztoTZgx?3?Zxj1aMb_^CAgy*!FaV`X1kRX!irP_mo{V6{fo|#m@d7f>B=T=IL=O&fI z8nHCbYB%w|<8J7UeWRl(Z>H#>(7?!e$-}LfiwuX^NTGw)}IkaIuSFeaO>1x|&sNy0Q?v zR-Q_;FORtW=m$ZHl)^Pn2sTr^TZbvF+dgI|qs7D0RS-#)bJeAkV`9-5|dTQ;~bQ}Pvmuso}9&N=J_##gGUcW2LXml z&sUu%-LuOrh7IAB4gQ7@4UI51$($=^nJ?lT4N^xP1_BQ>Y0 zj|Lf+@{@|j0r*cGki36E$>Z2XoakFj9&R(dk~uO&(qIzs6xhkJWTlH9WL4c{l58xH zOHSyZ^l)V4XWN^1@8}pByPd0NmssiV>oQcWRZN<{-yAIZE}#q*bpccnlDv4~D5Hhn z+4&Aa(#h*8B2}vKDoZ~YSbI17S;d!A-@UU{o|-BlolH(j>R@4+n)VaVU+uDUUAcA( z0Gc0+!t3I2TOrUX|R7>rN_-^E~l)k0-;= z0xSJ4&ZBNHmSn$}H@PvFz&5M3@lC;Htwvnai?C=)d9(JljZJnLI|;7Q|8(<8-46a71}2j=f47Ap$|_6Wbehz?dp~;VEwx022HCEGc;U6VVB! z{Bx9VoU&BeFYdXZ#$ILTEeHq$M6p-J#5{=!@?w7p*kI93W&8O8?J1#j@huKpjHDxze#qrNm|A(nK)OA+6*^CYitQNkHUY z=>uNbSCl-+z+3v@JuyCru#t@maLRrJSi|WRej^3#U3CDM8+g!dd@*_`mdbmP?L8>X z2F~;rAugLFU3x3oCj|lwh*_EN#`8+#UC#YL2l`#CCy-&>W zg$bmdGTh>Xt2~twOxXtoY(@NyRo~irGnI_k2m7ox$Bf07K7+Rta9L@xbIpZ{gcc>< zQc{rv?`AB+`V>cfyx9C(g>l!V9>2*AG_?BANi3yD7+2!K&(Q>yqPa_su7_F73zzja zFwfX3wHCRV_H^^DtHHs$8w;%TZHvZ51CBE<#8-k{pU_Nkan?qz&rFi|qLy1{%y3#^ zanX9(=DGqDD1V(_`JT|ZD!!2FX-BnJe8oL^a5F9FIZK(b?jA;f1K9h~H=wio=TkA& z&cw&CUjxJMmoGy~e-rflDrLXC8z_AyG$sf<$d-DIk-x#aaN%i8{#(^!ZwMH@k)Me? z0saU;<(8kUiYEcc!QLiDj_Tr`%E%KhE6H(YXdu9mw8ls{=(ViFRM`e|Db!c{7V&<$td9IN!q9X6^;0ek( z5$z-vh&eSjYVYSS1|GGQ;G=dAN~g1R$gKzCJP5jM5LNh@lb&AW1_FLkux7Giap6pfsqzRC~V)>ISd(L~oHn6I7|`VkNhpM8)T=M0&7D zm>bPAC4PeZN(yEcVlF#=JcX`{EsZI$9gkV;iTjk|!9&$oB5BVPBT3Vt)EBk=AZgtj zLsP4% z`W1Tyet3@3z-LeuKjM^YN3HS_3Y3taJmo<%CZM<_H^2-?vY8zvF>?}!|DZrQ1bFqL zr>D#xP;?$5x2|9wBDvsn5NJLtj6D!x#UOMS6#=A!Lr2Dj>B|ft4TmKWJ%^)Fzk3heHLtx$8<35<8_<4aPqVzO==&=zP zdX+W9n5fA$6_JT2rNrcLf8{WY^W#SYGVh@>Rmf{G!N(^@Awv;{@_5yD&w~0%rvDCl zP+J;i@#th;XyjY;u%k2nJTSH&)vD=(GvA$hulA+3AFV7`(f+20DKwfg`JX9Zj-QQ^V*9_ zBE&E|w}=w-E1uA2hpxLyM#t9ROl(|gDzpj$)?KqUrnTC$>U_wdxUbQ|A7ldUKUCpZ z^Z>Ifd$iQ%ZlQZH3!AZ8dYgk%{&%IHs=xgC%hXl^10w?{qicAXxpgEPYwO2Y@=5(J z5#_pnsZ^<613Dsk(7{yI>aJIvoIbnpDj~XISuUXi^@T{zw%ucVvKI=NcluV*c){L~ zQ#T3&VMGaat)udK*XESdnOfUMQTyx>m<8ZL0-5baO3qSN!Y}?xK|)K`lRc1bBC{|x z#Cmt?Xih1MFwa3r55S9x35Vnh&p7YF3>x2=8Je)gqsA_cqsAoP#edWrpdrd&)YOIK zOhOI>P9_LLU%JPg`$b?NL3iLHbQ|l@L{Yu`@_)_Z17!5Y1n@Q2vTqYr)#kLjz&2evbIr1KnS? zzs_Mv?pCaaW>}F$b3k=mNgDH$r$u=AcjxK=R{owSRnh@}p4T;ubx~p5g=hHG&dB8y zjz9TTBBD-wREwRNNxGC0T@7=N23l+{q+X!131_hSqWxK)Z0V?s4?4CEC-)*}{b_3y z_Z8UL3;P}XqJhlB7$_ejo7mA53~v41^hLF@_gOU$3~xTl;z;|5S~@m1B6bC{wLqF% zT-RI7g<;UZG|MOp>N^am=$s|;r$w%QGxuQKEjgBH9GK!vMt zFUh^RmA|%+Y-aw3Ne|0?et=DoJ;)h3gmf0H%W0}cNB8=uGHR$M#%w^aJc(Iu*UOYP zh9M}yqH35JBUAxsY1^RpG=ch0&~N%8!sciHiXHS#8-}fOM@1tl zMn`GUWLX6r8jwKs89?-{E4RG3pbr`)k0yrIZ?+4gfgQ7HKL-a=^!vmB;0<4q$=j7bfMsVau{xl6>w2U1fs2?^k1V0+2=vd0x%Vp6wJj1(Ekmx z^38*8ZYV@nI7ul7nlnKYQx3l*Ji!cqk!(-yAa9O_#jv)>Ivy12y@AU>eUi~EV~Cxss8)^?4D=%%tZ>wn1Wk5ig08260k;a^Mf3y%Z;3ND9+zkd&It8O!jWSBZqiHne7c;5YLn3H z(Lsubs0K3?4yk)!Zfg~l&t&xzx2NGGTF^sC=T)eezwqd)oU;4fkVpOfm!{E}!M}au zC8e##SLp`?Tcyued#@f*=>?ty`?&F-zy~$V3H+msiha3`lAc-{v8Bf7PaSAXTx>Ip z!*2l!rpQLs5rvC5BSyZmW}bOA7mnK}03csgcg zL~O+z@P>#<<`KlDphb1k(9m=rMkbMXU+f3UlXx3d2MOTLtXknY*4DpUid#W zacCA1EQBpBH}{jrNugF$g+~^k0^>ti_Z%BoemV;iR`BryG|U<0K#&}m_~)Y(@P}3@ zn0BH=8y_d?G>2YaU}6-^5s|_1wB%wCb)2VHV8U1f);U#oE9FOa2O9y?e2QHj=Kk1$ zSl^)?*{R!a4c%G{j#VokwC;k*ks%A_P9(s@DEQO>3Cyi4*^n=Wfj>Z26#^5En#x~C z`d<*7oZ?@_nr0m5v1=awKuBU8bs2CBA7YU>1fzqyu(S&S<0CQZ{{i1)Lsj=5c8Ljh zQGbB{d=w>`M2uLuDjSHJn)Tb`!>y08d<@+Q-QXl-0VsU4H8r;XaM$`P+i5=IUW7(N zu|Vl@5*vd4lS@cO-2``BfDIdNHzJYGO*}!K0gZzXJFQLBq(F1;nIS0fV@(>MtllT( z5>lK9?~ZIocE_!zKi2T#zk)|LC9sO0$QWGnA@<@;2J%&!4e+tMT1bE025D45kLRidSwq`_{6k1k9GZHIL>Xsh+Is| z3g<4=f*=wzzl+Mq;6Th*N$-T^318Dvh+yF33U$%1{u-C!zZCOwdpHeDD;ljE$aO^v zVBFd47*futKYN~sG`RWnm1|B2^Sg%|p z-%%bmcXbvE6SHU(_|Wf9IX24fS#1p1I0H*$kZh%Z0b3-PQ30n$`^CkidXk(EEAC(+DsON$^MmMll0BFDS?=)=|v(GRe2j|@Vo zoChXT!FV!J4(PIxlrW(98O=PS2A%q2DGv2le)62a7NmC}slkxGujy^5gJfYnaDG8T z#a%n@tq%r#{%0#|VX;T38T$0(^830?@N+yj3LlzkGoC$Yvput6>!9sKZGGc4j1pUL z!fXT9;3FdS(MDPJ$LaMk;VOIQ8ikmP0)>$pvLWEeE3nyJtSR1{-^FlaoGs1&TY>M% zk8R3%@F_g05cH|3t0`FO zd457fCiu6uNJoXb^>JDHHcy^SamOi!BZK!_pRTXwe^Y$-aIxR`X@ufrp6EoW*m$zp z&E&eJ=p6BPyF83j3O!V32JXEM;ENhME-R@kC(p{m^a!6Z*+e=d;(|M)^|eu==aOOH z+J2Fnj@_zeNXncz*jm8NXT?I9t2^V6J87J|V(Gnjm-E=8u7pd^6S2q3^UdL=?Kz^{}q! z!D{icm3UR`(};+lM<1%mSW_#_*PjsZI*VO zu)gR4BJwCnWc^z6pY&M-x%4{5V| zJm7|`sxwK7XV<1migp9Ez4(aXDhCbyRDbBPQBqM29Kh2MtX4kx!aYVc+>wIA%-Br5 z=xzmtV!nWYaBoiXLw?!Y95c6C4vPy2<2^E?9;nqo7r0oK1NYGtj-`G4l#IQw;52F3 zc~VzH3J?%mBOj`k#$~L(yCa#Z%31V?jJauef2b0 zhUj4KomV1u^Uw}H#=hsaGxo9?jTT*JIqUqBu^-}kv z&-#%u2M+H)=|`YS4_`pG)N<#=znHg zQXF)jyn)}H(o5fDQ<6SrkLQI>!(jpn7f0IAn`xp@?I5^*;l0W=*5jmvms}2ceaJCg z&)(2{#5W!0>&ZDp z2y?4_PZxZ_O5Wt;;IUbs`*oxHRp?nfX-C-`ned@1Z%P%-Td!m(Fg<6B&mLiGw=N+d zK!*;+V5BQLS05~J?f}7Oa>?hH<9QVc3bi!Yg9jU87WPlj$x!rF$jE+NkV|)aOA+YV zASJ7>PsvfW4f?poxBDfhY?r^NE2d{;gkaiT4PN;kA*WQpV3gjX!FBE67WNFx!4MyeK;fErSCy*g;h@ zU&G2RHc_gZzg7tUayxP@#MioSzf#Oj9%UpjUD-{69sZ`Wf`U1Te7LyXalapoA0@Rv zh}bP$7DFa)ZEdU95L4AZbN1j@U88-HzZ{bB%U0$|&t`A9&y%7EbW9E(*;ByXjy-$_ z2rj93Fuu5WH;OG7oPr!)WJ`;1ZiHL!S`Kdlpyt6b7NWJ0-j02zO19Ie%o*;;~$|v#5a?Zn4qnH)9Z!kRa%(0tSBUiv|{!o$^XOGo4`}m zeR1O#H?EM2NQMlFGAknUSR|AtAww!kp^(gTrpi<*G8K6wW9Ez*OBqsBWG+Nx%IyBv zKIrlM-v9f4K3#I}xo7Xa_8PwHyVf~p>zfm@z9)GA`}6Xy*+AA+Id3A~^VjJ_bXp8o zYhtIhzBO311#~uL-_e^kH7X&8pXnPV?0)~ASvmYvbc`!gaHiu8Memc`>_mx5)5Vj! z9n_>5koE3%sG8$N1`vT60NyIXWEre9PgAb zxI^0Eg}P5PkO*OTagheygiV_~vhe;HBkV*U5Dk)+l-jDg*bK2J5PZz2d9tp!?gOVn zqRQp&$YHX=OkYH!N7kFA7Xk;rtn8~CD;2Q##Adqw5P}L3e-fTA~^79?T5A z&SQElJ`uwXl$)EeaU;r!BMX#%+=L~;tygcE z|BnW%tH+d8R=caV(=lysvggd@=HbQ#oysXZ>Om8HesAffS?Y!yra;0|9cj#{l29yf zqeX^VA^!EqZl8+GC!2O1PZdETO1MCs8v(0^ktZ~Ax#1vnzro@y@C~c?%}8Y&sK}N6 z;myIHiX1Fb(rAdV+7&k_dsO~hM+`c-y0jIhT{*B74CZGh@MBC-S3zsZ%QqV`xhegl zYMwjH5ASj6aq|kx#i8anjR@pEoBb}%5hOuBz22za2dR;Pn1Hmv5?`ycP4VJf?@2ix=FSeG1v%CD7JyZyZ z@cTwA`k#&!ooe92XVmE`R)$BIRIQ@dJzkg>Dc!_gc~K^WNFu;CU`UdJqwgxitgcz;uL$61p`_}QIc2JC$uCTIjnL`8 zbx}(<$<*F6LYE_Yq0}Vp(};fCi2mCJu{R4Ra}rH5Kb==Ag`XpiXEGa#@68n7%URKe z_tQ)T*g@4DLes&`93!avKD(6dNSAGJ<*eF^-qYuV+N7%6&L+cqr)$ow{m8zxcEFL= zT+=h{#E|rmbR&jEW*zudAj)Ed-Z9!1a%tq8kjDkMg(#e_{K+NND%7}!8rV{>nu?n! z{5L&`YfqHvC-c4KmVh{|Vm*Z^TCj<`q zcY-GBU|%A8DZD5*2H|+|baF z=Te$qQewQAb!ySB=u}#J6#HfP-bwV0=U;=r(?57%-7w>lo?l{Yl<^5ZY{>h1J>C4w z;rYZX;Obfwo+01l#^@Es$Vi;qgtSm{r`??jN7V!sXbY2s2C7|rHZbq#$U>>07%l1` zem^fS_{5E$F<$dZ|tc3!mHNttVh-&B!G%agCfyAS)Ug z9yfa%0hE&_xb5{ejVR;0 z_?*O3X(H_-Gtq@VC|YpJowUSum49&8nEkx?GrS8AQm9jK`+*>=nsH0ZL1i zvmPr`Ax-(nV9Ht=*)RS$?|! z=ujz1*gjroVKSg?Wrh9ZGpl`98)P*0*CXFgJ$**j9i&uC5 z#}R$<98qX_3!`&XR`tLSh~XwLhUvGF)w`TMtgL$Y%maP+LB-9^otdh=hbJ=?ntOKh zq5JS`Wpw5o%0FA?Ht%~lxsRK?%Y8654vFF^qLnmclf>dSB zulESF^w>u*GFn&c>dxfF1KdEU!TJ`Kl<;+zpU_apui?37A7g-t;$Iz@a{2kVbSx8o z!_1qs2n6-p7rs!dKLphJ7oi>FJG(jR`B6Zhy!dq>XQiS9aDOYHmmvUQygL8pC1#%p z>i!oxViJEFx2q741UAf}$`$CaamfjsZY*8bjd+-9ArV zrASi+=bjhL+Z0@LeO@G&8+J{SVNQh^P_rCa4ct~#@n75*oP<&-1YLOmBnIV5^oB3LernxbE0vl)V=|rT=|4Y|!|xqN!2iT!p@dD_uNDXKLn><*I$Ui2BuM*# z&n`qv@U5~?lQ0PX^!{(^1jJXFL!!h0In^nZwY*rvNzayRcSQb={28@lf{iTX-3Ud) z?6!VKR7OS4FMM?2_4&zeWGQRuransR!XYgpRQ9RPi|iI|=(pq2y zB7A2y+hKeAO_D7SI`(@-@$PCXynDA%I9kT(&mrgBe-4e#0Sngf9qwlZ8O%}RqU-a% z|5drIXRzcp49|EcA?$JY|c*7H^GDcuF6xjL=Ln_z`qzclxP`(%f`L-d@X>XN# zotddtH+z@TKjf%GV5`n58`I@ETN-lIAgXjb4@$NnJ*vtTmh)zDl=ZyK7z}L56<|kL zwo-$MA=)VM;Txb0AbqGLuXxMUqsI$o-bP0a+L#WY58(r zBP3c@!kJZPTK-E6g~sc+%F-&UJ_ipMa*?m&Zrn zsvZMchaPPe=3)xB&Yj#qcNN2*D9?m#X7It-Ni2 z17db}#2ZWz3=h|QQQgQfw#f(O)dN3OR(6$QoyF_P2n+NXcnXS^+;@d+mB_mGeeyd! z@~3MI@W_Yc1Q+yPf@bpZ?S5w2CF1lzjb7Y)|80VQsf3jC-xZj>XEF#u)?su5>~!vP z3qx+!dBNBgX;%KN-~A`$S1Bz_?Pj}O$Fa13brnfxH~R=~jbheYRXa&+JNXDW^0ccz zs|R|`-ejs~TUe4jfbe~BiP8EFWP$GP9hAtK?~9C&Q>M{Q26e%_7x8m`tXJRiY*!J+ z2CNalpG?+>Cso?IKiz3{4X%$pup3FVXAy`a#98tZR*F&fxlS>UmoCBx$X-+@Z9`t#se?bR1UWLvMY?sKL%bO0#NUGnV{H3f?RajwI(RW8`rdra(7IrB0$) z#;=2s5MLMJ4%_x?Tm?6Nurclp@V2)e9ZBA6We%R84hYkPpl*e^C7}e@zL|c3#-~B6 z^9BaT0zCcJn$_+7u-)C)Ty>)B)%aOd&{`*#XS>{IEv=qBeJKpWzml7=6tfPQV9PI`Z0E7@GlOKTYJOax>C;4Jq=2sy5ZQb z*gQ25=?*UOrGLe28bJjyRl$>euibzx`FE81#V;C7-hI}wv3lHmm|umUb{i-;RRKF` z5m-@*?vWiTOaZ2xa>-!GQX0HJ!5~eQJo@CLZ(hCPPz^{!M7N#pC6KfyvFFP8&^ulSxO>Z7c8fXUaDafD=#-B4+?4w~Zt=%d zfCvOLfK-j>^G+&RS=pCXPh_Nxlr`7<{mV_*ogU$l7HC)E`j<{_*Fo&N>QN9s7W0Al z^y~rN@Il4nJYw(e~TEfZfMfhc8-?7+I-AeJQ_*(psM~*ZVlnNfB0s)T| z_@^g9eVtdx!cZu;YQ;>u0O~#TQ9v!FItcoPy?ggK+7AWs6cA1`+&>0<|NH~fg+DK? z&dv6e^`;m7S~g(9Ke=pe<4TIFbO*nhm)*huOi`ym@hjIwjOZi&2aiy0tRl7HylV=; z^$(2=|5DRzj8%vXP?e_L2T+K}7UX*A=RkGulx5REOSOHs+ln3dUhYXgxa-YfOZ2b> z7;NdwzIiBRRTb(@Pf!1trn^O5GrW|l<(D-0Mqn`kIrch7Rb?FNUSEwmR&-$y^MGmv zXNag)9#o{Nj4<_oA_kFbHe5}N!|g4yN+^zGaw$10!dS}jL7;k>q=v}B85jWxP_5ka z_nyu}#qp!>RlrzNPC%87@6Dms?YkS}np5fu) z_bQM}doc3 zH&Y6FfW~wj9d2AOB|Q*m8eykp(&2Df={b&|hM#Vq$=B$PHhLs@IGa}(ijqg~9k#bc z2G~ZsIx4yJ0c>ND;lSn*-mo8!Jd}VO>rW(U6b)piUst9y`$6?iD07Eg9;!hqb7fn! zSFDWhP;xeb0BhCv{ecPGqIG&2ugbRzE*mKffH|U*sIJO;9gBbx9oYd|m3t9Od!&?m zo=**W+&jdCYEgazpqI{)+4iSNWPYmLNA}IbHSk~-ov+6|ruTol_C5+K%QG)hr$9cT>~yeb`n)tTHPs zZ0>Zol0vx!OtbTK;vl`El;ibDabDmUI@O>DNKYC0co>8j0c~^~$g#s8za=*6*a1&u zOkX?X;=$XgBMWwAL%0Rij>nFpg;Ok27Hond8mc`^EKD#BE?)1TA_@k%UPV45eraS$ zPd{~<1(JeQQ`nc1B0%JUE6sKcH(ce)LXoz0{&*zen5*j`)6siBer!hGN=gGc#PmJ? zM!aYH2yc#fxbUKy&z1LAN9x>1p=LARy-??lkee@3wmIKzrm`#P@WTcol`4;2CdBm} z9y6a)ZA<4q_<^mp_<@q8#DD#C7M4ytKtB7{^Od#P-@+h43*4>lUnF)2yNot>)y|cB zwyh(pA?FSK*gOr*nY6_F-m>Y4`8=8X5i=9#fS5bLC^-0rst@ZkOYCC z9P{V>7KaX*#DnQW($r=O`d~*7yc!_}irffwDEKbkDgdt{V5TyLbX8>?%iGH~Sg{w=d z%E}NP954R(IB@su^5V5fFv7<+tWA`_^$?JzL85^?Qy)K4q*_$r?+m8!87yuD=elKU zh`s;16bqW6T6Pr<9ox|7vwG% z3ou+0Rqjg^QO&NYrz;Uf+071BV6KpSi;Q+2ursTZUYPA?LObVb*Zq48pahI(&hL3S z$KbIL6b>sn8Rq0cTZbU%I4aGbH%0qiaLMh8!}*_g-c$i=rNWhMX*Vt&&B`SQdN~8R zUMtEkQl?V)TkcgmVi-UR+jeVx5FH_E={eHvNL1WUnQCPsXu-QEW+L3$dEVM)u>vU^ zG`J{B1FuxF6d<^d+ctd?hR!dGmwdg7+IoKYuFc zqJw3zY-^Z;09yd8hcQGF_*c-^a~zEIXR*0qek@dUAraaab=6k)nf~^MU;#TS(7M-< zy@jJ*fZ}8YQ0|s$l+F2}^bvVD%rSunuzHWFL-5`py`z9r%!q17M>{`xn!$Fl^6UW_ zBRQeIhZy7tI>18U4YH5-)|B@)7dvOyzCzo=S1AR0fYJ)yKzSVy5nu>=E5tyu-QExF z5qx|r!(){^Ftx11K)EzNR+O5reG^m#UN%7w6?GB#O+?&+B{X#qTG~4E$s{E_t~lW1 z4U1|FbjSG?e>{9$3&)yV=TCizK^M+x->0HL5xsTLXZlz!-_zWk1 zbs=iEa#_GS55Y@86UETj{9+N(aA>;nB_QptDJqh-oJ`>dRxH-EvHt-`BN_crzV! z=!#r8P=kePU}C=79*)-%<;S5qA7cN~A5y0-M1iZJf)<(Pizv=l3$qxl0p~$I7Cbr7 z+O?i7P9nbq-rV}DEauvs#zr44A#a{I1mFge+->yS>d?CrQ1IvKNISSIn;dX|&ETF9 z1Dw$G9{MdHU;~hG?gSNR%^CH}V1Je|^30r-pDk`_k#u3q8~UiG<=Y>T-sr8^N)~2} z0PLV!O85!1n}aWrXrKX*b#!~DG%bS9sO^vN=%JEpTg#OK3S8SuWK-hs4|$p$!uC2f}=m z9T2#LEVheB@|s!qz78T8QeBkJVcbiTI_4s<-k`kO($Dxql~JD(;!nfwuPGLq@)Gj9 zTb?XdAgO|^l_kLXPy^l0^9W91?;tiW{t-s3V0~AYxBqP|dS{EPNsTvB zoL49>$=VF9AII>&K1*eJV$m1CHym`An;a++P9H=W02wifB5zb8!d!+2fs4jw2?V}6 zLX@hAylS2*pWPb$xzw^d3}FAwX9tHT|hdB|LJ|>R&w~(-A3GxL#89?L`O570W!fc8m3o~CC zcNZ75+aL8;&qhrS7r1{MVAzdeqZ35XFI-D#PeZP@5YbPf0l51b{6^Vjs%; z@UQfE-W)Cj$#EN2p;)d^=tR&#O{4nARg?Wy0ZhK_~~+u^r(@iqUfy-ACqM6$_T! z!*h-5@66YzWNzNLgEck?Atn*k*Q#tvQK!Dx_mzsJoyFk<_VjFDKtH&(=&|z`F zdbL})a3>ZDu44542dMLMB3^w}H9mhSH-$*e0HlKb&@4S9_rPS*k2+uMCJu=b6Pgaf zMVq(20af@l8%#VJ-D1 z`<{9P9Rj&7H%8e$ms{F(i(|YUmVv8R|FubY*lN;h>(W0LuyieIKXj>PLE9|k%WN_T zAZw_X+_>UU2s@h)G*~vj)Qi}VZ<`o%Wg}7@eiZpOaUEnrkQlkegX-%!2FkyX14mw7 zLLyURWgw}@e=mc=x5aHClGmdiMK7`lHn0JQ5t-|CYO>Y_aVH=0%wDl1RRk4 z5Kc?{dJ;QO82cdP5*_LTfZM|uqPB&bmerPN4*igk%LnJzsVRL&j_zu9N26y0d%?*&BEp(H=QzPI-q;E95IdU_^E zJi9?+OAEFG3msn_j)Q%1+YREQp@dk#2lSqe3J7A?wfpc@5%L0U=o`7g7#~g~TEWH0 zX{tSJ-f2mG_ZS&x?^XPYfF3EX*0yK1a|^atIIZ?MFa>LS99^!A{~?fRT((4J6H*Zi z-_p^f4q_%R|9$_^aig_PYOWKczF(8_iUK^`N!0>ScrVa8tO<@M7B*W~(#$_>ZZ~v? zz-nPYYPf+AyxH><&keJ(BI58F@Nj|xZnh-wTF0!g_79H9=Z3!b^a;lv=wE(vD(zA< zG~Jl6oW7(AoqE>9cB^QjYO7>RLJ*}6A@NeQRWlpv1$lN!f(QChpkc2WGa^-jj`35l z87uf(M-sk6gw{Sdwp!}zN%#ytO}_L*g(;f<9BTNJBvbAY{hWI#a@k*O>2inMc*)ch z%{I|@{q}Psq&aD>QMupUo>ajZ<+HOZY4*VJp>kf}TtoR%!{qq#%5NEH!nE;NmcG7B zYAt7FzxFNIH>SFOqWTu)o?R=;<)%wc2BAEdS{sjV;f1dv0roKH<4^(#64*{ZRj{9!ewiLzQRj)iwqOfT=5E-M{Le z1bMC;>h{=A@DWr@(TUmr#dJ>92 z-Qs(WUyj;_f%@`$riv!NXdlS|t2ke3@}T`w^1Yd~q7uwLA zb_-6!&c_XXY>8dm(5@DlBg+1B^{7%43ht4aVtf)FZZ`!8_nQSu6ShXUP?5>KpH;&su;EF7sK7qge_Qa1>Hi=HMK--DaFY*<>SO}(_KuSB*`i*w8Rgp z6ik1%2)#fHa{JxSMT$p<`BFmg1A_OA)jpt=OO`%_G_6dKCY8!>5$0hmo!srk)Cg3Z zb6Hq~24dKd#F1Lc_VlG`xarZ9JVKS%5p)4mnazfP8g@wl=PSxB*u@My>+G&1N*THp zJSIz^yfkDVmLLaLh0K5J7obT!;X;E&rSm@r2F%q10WDyeDJoK;Y&1=C<0UVP2+2)M zKyk6pNX%nUhWAGvR5~* z$r4BYcMU*Yi1S{Y-M4rP@D5hILKzgC+`+U38!7hR0#PC=?Nwvc2}($xV5g59|L%G2 z%mhAg?8*MK(xmycLwd>j!y;DapsIKP+H3b%D1ycv@blhCB;rFhmTrmS~_l$F_?(?>0dpt(HI z;biK~s{+crbLTFQC1#(rj5l!WW7-IoAv}%*9w!IY)4&AatT0PElhrCp?Wg+j8si}LR%NF^f*$L{7e+_`%8`?pw^s~2dw zO?~+1vN~cIlqH-TBgj-PMqfN!X>co!qufkC*3d_5iV&Q5WY4egy_#X|5_HN$OU6%R zWJ!0}AMmxk`Oaon!0hmV5Hj%W>p+&#tNh2GJTIL&ku`2Frl{UZ%%VBGb)IT|$s=Xa z#r1a?FYHluJUOUx_$&R?0cQF!(ue)R7S@NZo2psZ)3^=wc#jPf4N}Ed?H!{D;Qdv; zqDN{E)##@V?8M*Ec`rg*3_3nIP7|=xp!Re9@19DEZ(4IlEsonaG@d=HU{L$#{2`$( zC)8=xr$+`>Q-4+{GEOtr)#LX8;r{xT%;|vFy#%+RFP3-5)o&CFs|gy{P@5p*Et7MTY9(4gBc16Ee7)5yEgkj>KrcX+JP-X1Od{b z5rq~1voYG4t{TEE#pV`^7V#sURPnN{?H%?DC&tZRnAK%u#4(k+4?fMlNzR)_+#Ime zlIm7%!3~G8s?BiM|A-AfgIr>1khDZTp3NH+WSuQzv3VFQS*4!}G)-#Oe0SIcde zyK#f_d1`vv>H@yB=ULkiJ7xx6$hGq_pCW~9#MuP-qxk79EsD+R1em9^yJG0{!67CZm=)5}1 z{lg{`Ju6~YtM(d7U%7(mf!pZe)Ds-rJtjzVZSY*z*=(QuKO%3ol}k+OOS0(oWE>Rc z9y^7!9usiBj!}d`C1|}_(}VKdU+`7G&|jawIsP-#a_5&pZCS>*7@B!E^rQgZ5F}rQ zB3*ukaF;)yTSL))I?i0V>0lw}7L4z98TlF06gzkNTZ-Pyj@r#nvTydqbQe$mZ2WdM zfZHiqpqQS6WJqeh36n6})U-oxVGiusEo~4Dc^QUK9@~tRsGLOg zG}1^;cGi3o9Ao2}^K_=Oxrchr7!Hwl957IdlGwjj-mW;a08vG}+IZj{coi>ZRrH*a zyP4o>1e;OC2-|giT|1j}EK~Rk1mq0s#7tN#|96!yj>>R217k9=jbt{R{Pk;bK$g!D z7v356@~#y-klSlH);TR0`tdJM56lrT!mP&NQOq73X!r&K3NvoE4U{`CCr6y_j2pEQ zDIH_ZR)?=}kk-{$XkeG z8>qaQ3dV#DPRttqZ@|(kPzU$^=R-=a4sUcsa;EQU5>kbM&u>TGEiiO@r>?)7Vu9`W z*n5M6SFfI3X3`r|x+~Rp#MHLQk~G++w-wa<1vi`_PS)iG328KV7qT<0XwOG0n&;XV z0&0=F5URhJV$xNXzAE$=40;Y+GA2ewv&5)tzZ<@FYzDwm;J#;wpD|MY;G*oS(WpI)?v?r5hhpG5$>-jI@Iu{3`C2>ySN z`5HSil%WDeQpY!gTBNw7Um@jAlm#tS^h!&Q97o!|jX0ZJL$gC-9miuUJ?K;TzHxfy zkDpp^eOr^`SPdhxq6*BLw*~G4UkaFr0=d|yEg(Up)G1e6e+)b-iwrn)=oS@sSwY^; zBB#Md1%3^gx%Q_|(??yivHD$vd^0koR9*u7oRG3G z!})gnLXj#hHO>8>#O$I?+E6z66xlRrZ?Ut=*I*}X%Gk^Dl3pe>tB?mr=buhxAGjbi{gW`@T(j*KWxN~&4_~Q^5Pruo zqdvImFU?Qv?B3%WaYaBkmG5q+?enk^>U=*H+*du%Ny&wpS_^`$B< zfSAM4_7EIjEEWtefW{)5Dcz3DENv?mUmts$-aBk^4fzC6+MAMWdS*caah;y$WaVZi z9d2A^EVxs7M-Yq+P8c~n{rzL(H`gs1PbcvIx7nP}in@BaJ7Q^&GuGAGdgSLZ4R9ZF zg(U5cy~9CU+Y+L`7B2|IefA`8*uC}Q^^JyiAL|vKNQe8^&b7i5?_ae~mGmJs`|S-5 zk^|zFL)BCE4z)x(eES(>9;AVnXhyclH%UF#qM6Dm`Yt;JE!NX8-Isfl?)JRKX zk%p+-9Oa2``Ze;kbbhowpjK_9iosX_=F<3w{*G;TTZ?RLY;-l7gN;>B^;|MZX7aPe z8+Rk6_M&af>J}5##}9?hRBdP9zC-4l)1)1bQlxLEB#L?I?ECWz@~)22rqdrfssRfS zqoq@H8uPDY0w37N&!f_*io%9vxuWC_L$14KK@o$@vyQ*IjOz#Oe~X~bjENL%c3u9% zqaO$UbpNzcSe!|mXkLJwq4uu|f4QvI-%;S0s|#Twn-W2vmrWesW?$1#z{6yJ{=8(} z{UJ#3D|qS-c&92sJsETBFX7JPozEY<0z^QV_6=+Zez& zJ(z6ao7>)%|0BjCoqQE#}{C zgUR#R?D36B4r?0RvSUa$ZfxY&mvw7g4cZCNY})~1kKK;PY0>?JrL0Uy^BH# z+5DxB+@hCxjux&~?lL|ncRQO*_$O8l)*cL?LO$KvSOlmLiCV=(2E;H;lqG;ZD&cgrej?(I`>w;KLt{!qIVF`o1OUsRn||f z%^#;V!A=u=K;B8<7;?}nEdI@f4-bz2og-b}4Qn*VZ&}%;=~wM7u{jE^&9Sjm{N|GZ zXN^uWRJbD z=Vi3jy#TW4=yXDJ^KGusgG$;_9F9BfW)6Kw_r zmu#+_zlm!Me_97Q#Lh#Zbk*mwtA`;RO(^oHSeV(-Yy~Ye@VIFPhb4f(t{-3g(TITc z3st}sxix)nUUvn&<_m@5ukp9Zv* zZ2_U_aVsP`{qAP8v^Kuk;l1AIWhESidHclF;czR-xC%ij$^8YA@EXN!seA*Wt@X=j z1DayYdtH{veFsWxX>IZW!T*z@&ocXnNdCy-ggkEhw6>)1U~Q+FX%bUiv*(l?h3Mz<4; z4g$xR8Ny9vc~9-RqK?65W#DZeLw19p>UAc}-mS^9Z=ulltNc@o%U@Uf`D=LRHVB+x zLbgJnOVV_`+pt}Z)2u|+;f`X8k@S_$t&r3es(|D)H!i~9gv&P}UDBtI=izdGmdW|@ zJrE03&G`o*S_s9Ro<5v>4jgOMD-@gUo@5*FvV`nXo%P?@Vj#@0*}u*6d47iCA9x!r zN=JXgqEb>)__fid2!qw@y3Kr?$I`r~03UvJ$Qu5I|8J112$!m0eIe2MCG}1BTuRIi zMLBWF9SAQxajdHS12|W|+`VJakY@f7$Cz0^_|e;@#p2{C=tH_tn=7_fmtFYS?g;$e zfs!kvz6SmuMohA&)iMJ$5*J@H_#U8)@6H|}K5h8mwu10{LhMAa{lJnewh>j%DLCucY-L zE?nEj3K9MM(g%MA85C{MwAgpJI~>>1IqMDyVUIf_#2zdgtaa}_iZ4)xDYdp9k9;6% z!toxng;cH13zsjC{M19z12g#VoOE__V4(_|lX}-7gyt2#w74v#xep>>f+Z9sb5u{o zmdExT;_~dBuVg9=IRaBdvLC!fsat{EKiE{7?UgGoNzXF!6+wtux0nG&z5CvfdS(CO zbpUnIpwfM!`G7}fgT|HxvV5-G`1!rAJS(jf{324%NyW`5v1r5j=DmQo6yry&+@H9T zf{;%$s73j(Jlh@jr7sqGN_StKfHS^@)nVhKSQ;H&yioh>Srq&ZPz2?=3{&q_gN#Yk ze*QW*f-+;|S|4F9m4^Udh<#POQF?mvd>kSdZp2cV$+7}81q3kbjsmDxcOx2p#{ zl%@f|`O>eWD14kLyKltb?oTH_U()0R>o1L@#&GqdW!W`L{a5z}12= z3j?Axs0{FwWuy+M3V-zIQRh(oZ`{B$7nBXBbH*-a`GD&v$h4mQftE35@GqSf*h#sj zpwaJjb<5ZE6Edz|b#GXmAi>zP#hKfhUUTDT}&0L_t}JMKv2IoZw@x=G&y;Iy$7-sc{pv zlC7V%##*^k18M4cKwO97Rt|fjv}rpKe-Q{D44SaIjrk8!=_wDeeEH905$va$^}J++ zSdg=~XoNSORpW!9wlX!<0 zhV-8TeBRIOx`@Smj|_XUziDoFTUpUmkGI%WA#YZT52ChHO{l`$*HWOBvYwHT`13^CuBd*ZMe>L$83YT{| zmJfr1+S5F*hk%fx7b}kep7DxJEZi82vSvHf4bD+vPP@U>n^q=o>E-6xYK?W44jx5H zxd|yHdTl&?;VT9o2$!FWto1MrJ28P+A;^9dmS!@SV=Tg$!?PY!ZCpVFH#MU^B1kKo zHqUpKc}~=1E_I46^`#tB0Tn$DuL1PoFwip?2+^f<%0?7izD`Ue;=_;C7@f{6n}6Ur z;iLGb0wYh`+c|X33Wz36-K0>dI%{8hKA#)!@`0yjQ21LthAEm>pbVTiRmqc zl6owHq5x$kVmvPL3dmKov`qOvYGB$^&zZS#JF+(SZxg${)cd)*LDdgM$4SI!E_{h!{<08HDvD1Jc(Hk#0qO?)I}%>Yz*cA&8wV76)+6+a~;)mGuQiAfT)g z7Ur}cX4XTA@`8Uy3cj0{>##BWY%_>pxqci?2Spzs!Yv1(;Ip3A{G|e%HxF?Eoq~Yt z^at>^VMZwOAw<@(|LWM4tKU9je93*lTO8~PN^`H9D}qpArbO(;cc~3J(O_t3eQ8+v zIWNjgDG=ERwYl?>EZUeNtlKX0Izs|=shW45Wslj)Z<8f zYu0_C3aIDh2ikpfqy!b9}jS(^H=pif$M}3BwvD)<>WNugjUDgG+qx})J?#f^2ujO7ek3ol| z6=GvKV9gG)a#D`~6{&XdfLq*u<@0Bg<3@`|tw(DAAPj&Fd)O4R_I1ACIy=$WY@>_x zq|K47t?1!L$y@f)s_G(o2GntpEjoHf5QLEzs4@harH-w5^ZcXEX@?to?dK;8;KA~d z$jx+K0EUlGiCO>c>G3s3EQ-}k3A_5r}AN=7q`~3K0x2c zjy4gdSc$S5%%;`|rJl3EBcx%L>4+vEv@2647UdU%_VB!iH<0bVy9jyPan{Zw0L&qx z8gapF0P@YW7>xEy<>k$wR3Ikl=)*U6OiN^3fWQg|Mey%(4-Q9v^ZKtl3CHJDwB+6fMi<|iq2czw1(}iT7bXifrqbtivZL&UaT_*AqU^n@4er`2 z*v5ye#N4UQAq!nCR1~a+byPg z>=>@0g`YM|{S^{haQ!&(EoK}twPa>E3JdrTrPnnx4jiQ}H&Gl%%YhEzupqBxeJ6o? z$5Bzi3di93E6n1q^{_s47WcX)UMFLBo1#M4r&1n{wFlP9jDz*vzAYU4=46omlUTSdFJ-|LKj;=a7~{zc5l3Cc%1zF#&4A!h*HC7|9HQN#7Bu+U6e|h0=SC)9r(K9KvHaGtc?Ohs< z_gD-qM^APPsFtdQ=hjJ3a-*+Pv-&#onbH0T_mX&c2s?u_d}>CkOpXSbx?L#`BXN79 zLIe~i7peu6&P;`ey3Ki0DMD#@i{s4CPtu+@lTR#FLe2qYJ~j*SP*@h45Oa88E$b4V(SE3cheOt`kbvWqaZsjeZzk)tWBAcR#wla$x5=R= z%uds;(Nb|LbbqJoc(E&KYB4(}Pg&V3!q-cio;kH%u^1kCy4tuEPl@-M@ zg-#lQ)1nFB8^Zai$?%DASZjIN4Vf{d?;;~|YZAGK%*eKxGi zB$ojnR)5tDqUH6NhnvVO$oYxlWK+6i7PPk|$X*h}(VzV|GCVoI87(Lfo}(XE>rD;2 zOiO?gBnl%Lzc|K?6H>wWi9^QW914r9Qqcecsun&Y*~L;|aY*==h4ZR&>y;3Js&6qA|V@$I;3atbfdlPqCI zNlMDJ-z}kCqzZT%qZ!@f)YQ`^qW4R91^40t3&Im5#0$+SaVkEw6=Cpy14?Q(3g69& zOW~pNcHQp1^@kJ}T0DP);tW{KzIbK%EkMbQL^1oq$VsftD-EIDDxqZPU|L*pf}2!y zgZt`pS~2Ri&A3;>i_SD#jpG)?sOd8DV%dZVXkU~#)rD0At11Ju3!=)-$>8%7MY z8=TuB@LCOA6cq=e@SI_}#%5Y0L_QHuMonw7uw1@MjX#5)E89GV<6Kt)9OF(4UVM36 z%&5T`cPafl2QD}2?k;622VpI1k!@!h$%edaUq(gcy0I%$8K37gq3_`}`0&Aykvsjn zyqEopyvJ0{Wa(;#uX$8PAXE<-1lVbQJz)2OA|NT*B7GN5^a7`77QmPyI>bp9xzqk& z@TznqRN%OAz9Xy_zxP`ZENHt9g1~TiVnrwepE)go^@KT&qQWekr&1Y5IS#K7S`G_Z z7NQp!{J%Cq(87+BTpUMetm0s!umGDfgL7$sv4V$T+3p*UTm{bJH^$*-3HQ|n9;h|b zfJjc+3@#)JzKAw)DsW^wg|CzULkn6sxmgxDAe$|eN(YyE^4iO$zRsF1!V~$VGcR6? zb%m!bD=i+Cx!we2@vfIpU%bgx3eF(L_H60G zkNaFMHA2ZknWm)+ZJ~#gKaAMIXYaX6{w$9hLxW2hIuO<*e1Vp>YbRih1ek3NJn!h1Z;fY!8RA zny@$}juVGB!x6{TOI#^&*ElIy$ys0sss{Kr{N;tyw7`A9akH?3N?YIh0+-qFa$9(MpJXTV1W{Q2k{DQSzW4sdSwNv?G?DiLAd_Ra& zn!+ltc`^>2V+h)%DZ}T%m|Z;z7sq@4_Enlmgtnm-&vLi<$#@(-NTYgl;HGL`#x2?8 z5q5zi;eKi*Oub=tfx7~k!>T*L`>`-+hgI{QW7d4lgF>b+qOonnWDPdG<_UWBCPufS z$OS1v$wVzZkI+IdeWvkz3)FupaZ|PIw#E}s(0CO#=&T_FwCt9Uy_ZU={+9zhuYtaN zANd99!9z+e{lRc}eQ<_}`_yG_;#>vf-)EP>72QNPW9yS!%e8=9Nn$h9CI|k2p-4m% zl9c}>{+Sf1fm1IwRU9COclfk>BYd?^_C&N@-;u-{k+tOqgFZ8lv>%@5Ns3k5Kv3AWWJgVLpA2t{@Kb}hsKUrMWB`j;&si^sAl~XkwR6RtRDZ|@TthT2sB*;g&OfGtUzeR5f* zH0uQ!^kZSZCwqCVF{N0|jTH})^C@dO@`;?kPpe6UC8!ang(V@o-XoyztMLLbrKT0z1|D2xpkB57d3ws7VlQXaF8#Vz*&r zj7suXQ+?jU`(MeX=Q)`1Fo!4P@o_NnO4DiGYq&t;g`-XlOv(cqdc!`kaC)I_#PpI^ znuc=($4#yJJi+3?M)cj1-3E%c`GYL3m#9xiMv>ZR*l@i_o`$s<1dCm#x~^y@RQhy) zX+Wtch&gOYjyNKB(q3z4)C#?}pE(Umkk6W$sDKPN2uuW+ zD9w|PEk%BWhY1qAaI{HmufdV?B<)?NsMf?5o(uZz!+nWIIxy_5Oq1+GHBAj;GqMdV zNhm{79-l}OTO$NHzxwwU4Ht~|Q{IAwn`~Ss$SbQYA}m<5+0clR7PdMJl5(WO5Cp=4 zhdw*!{)aNq{@{Z|$9;*694rJ9a8}I=4sS15llkx^?Tv`y!?KB`RpS(CeChXs{1PXQ z5{HP~3l1+t9+0tuX{a;)m)QFdfge;Be1f98EYhO4niXGjHqqi#1^eY24*Wa*((SvO zKzHd8Mg2N5Vh@1bJ2dN9*umVS@EJ7PrZi>z^~|Z#pB|apv7l*hdikhLgPjDW~s( zw|hdp!vp~^AcepBhoHhMYicB2D7w;MH>CWW zTNCNQlF;fZM6(>g1teJTr0JW88{I(v&$|G~8C2^)o#94iSE7+ZQEpMe@s8waEQu_Af7rmxqx>u)ko7oh+slNtyI zkYQxOS{{0hL0R=VcfG68oKSyl*pLHBNa}w*eo}H?6nL&{4B+t36dA{f zJZN~?<_*5)Yfg*3I3F2M>@ zYm{F&o(#=emIaLGq-ay)%Y1p7)VH!Q;b8nA`2WAg*3GM8EyAfOmE_n1rYb3CbmL;f zUH=p3MJ}a_Sdj5BgX_$V+USzoBx+%wVAIUglO@7VX64IU<{Rf<&}2UU#aoS0f4i3U zhmFq20?UE%6vg zBsNy0DXJl#7NVAxHBZ{>P5<>wfRHKLKB&UEL>g)CiaA!Uh}pLJ*c9KLIqASQ5WB&ISCB^Dk?r6$ zSob&aH823v>=wS1(6sdQ(+qY%w}@WUoSrMm2P~L2`2joB2$RoqfSU&_oK^~)E7t%I z6O>9$SgY%-^~ffg4Oqo$DJOb1AkT*Z3)ZJH9$#coAP&g*SN6g{6aKL|!#?y~>@ diff --git a/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png b/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 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 diff --git a/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png b/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 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 diff --git a/android/app/src/main/res/drawable/rn_edit_text_material.xml b/android/app/src/main/res/drawable/rn_edit_text_material.xml deleted file mode 100644 index 5c25e728ea..0000000000 --- a/android/app/src/main/res/drawable/rn_edit_text_material.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/splashscreen.xml b/android/app/src/main/res/drawable/splashscreen.xml deleted file mode 100644 index c8568e1622..0000000000 --- a/android/app/src/main/res/drawable/splashscreen.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 3941bea9b9..0000000000 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 3941bea9b9..0000000000 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 0a61c1b272eea7a762c3657ede11f4ce39a8cab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8377 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 ap01I+?%QjQg+EDH;Oyw`z}f46`Tqd3=8|dv diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index ac03dbf69f0d7bfe4cd103b20ae5228aec2ce383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8031 zcmb_hdpy(s_utLtGHkg`Zc8bZ%S=M9tGN^@a*HrwN^+^(O&b#NVN%ScMp8^^$St?I zqzO?{?pA~(_fM|zd;9+W`Tqa=J@(l4cyF)Ud7anmJfF{V63$zh2@CEO1c5-pr_G5r z!1t5gH$NQsY+jO-0f7__o+c7(L&3kBgmU_V9xW_(uZD=+bgvG53vq64Qku$vZfzg1 zf12)Cl2P~K`xhsMz2nu)68jWq{UQ4|KG%MJ>iQk`WjhWIfpF~2ZOx&?bLt2_S5 zZo|c2l!e5Z5$~DW8tGuj(l)5oi|hm=26+V*NQ%2{7;RC0UcM4h$T4 zG!@rU_ue(HS=nb>W7qU4vyW-T(g*+BHtv1anF>cyyaYo8FELA^|D`Ve{w-$)x?7a~ z3OvXOW|X?bsv2u@?dNY^fBHw+Vy4krmE1H*jS%8SlGJd}E4*{DJI~9@6EkE9>V(*g zYu2hp;7WN%p~|+TAj0`V`bL_{VOtAC*1&1SITy}J9%$PFSqHL*$RjGL*P&I=?_V}H z7H?AX2L}iJVA7(C+dL6?HoOz0D|-df4xOT6o0nMyedOTh@mrraw{F(G_X>MxYXOzpQ~!3erfmnX)R}f_bRll5anb0!>IwQ)?9HZRi0)pU zJrllYU70Hmsyni?2Lp=h{AYM}${oc?K34@7-04b+migU6BqN+hLHx)(#T^mTx_J`0 z1zv*&APkz>`WIVAMQ)r3I1;dzdzIvDYoVRh{xt@>s`5(lqN|dvcAew|o-Ra%=R*G6 z z3!tyW_g68O<|$E{`#U!yW!MnMJf|$a8yalP@H^^iar&#fYfke*deSXrNiI*EBDJfp z(N58V*)pBOT7>icCm~_XF=XU1WTKmRUAC&DtQyNy;7i^g4)BvvDt0Ok?<;$1Ku7Cdx%ErW$C26n<%AK8u8eo9q0p-FW1)UW_#YiEzo9 zt6AUbyT`herzmrNn%ZA=R}Dx;yfHhA4%?2PB=p5LP@nK!P!(8+`a38{E2Qu9=UHFh zoQ7;duG0;a0&If5=df0gM;3XyR7s^p;_3Fh%Z?FZs>l`$_QqnbT0PFpqxop z)vb^a^()t}k10%?B>7?dbdK_qjk=UGydGRoo#c#wJ3&!GDy$;u5EUGg^7Ks;trN0p z#r7afo+9tvQOGMU&d%t}%~){5uk=50auwRzGwT9|&zNb`j(G_afjEPMAFtj?R}Q~V*>zQp$3gGJg$ydSCts)^7AQTT!8=Tn zVc*M(J5Wcy176?cY+fp#X{(}9q#R*$ zQY@Ks|2F(2m=>wzKbUFbBUhe@Z6|$=sr|h9j8Xs8=@zFQ%LIkV@Q7@AC3KWvZ4gA_zShN1;yest0%U)th}J^-wn)yE~d<4UBWtE>YJs zQzhRVlkN(=aVP*4V9@Vf&%C~p=2Ij;ag%e18c6b@AH_Ck@(XITDD!8Xph>W@{bJs? zV;#Wnj3>2OKYq~)MyCd+5%bH>oGuCC(bbq?IaYyo1oL*Bb+g8qLdjpmiMyO%P213F zV96iPv3?9-8~M}_gV+Yx0&o+;-QuP9jVhocn2k_RwE%%0_$BxYJ5{M^;L5`<3BCZ4 zsl(5lUU)nRNZLDR!GZAHd6DxsHU2(z3RhnM(V?}XM{d@sN50*RloI$xxlpxQ^9m$C zYls!q&jniiouH_}^+eZH*`Q$~%`-Zt;J#0aynIe@eD{*!*h!;8R$+Q0f0=9{)KDlm zdbON+Ag`|5z^_e@R$y$vz0tQMWoNf*n<|Pa?29mb;^fq-jQtOOc*yq?>27SP6DLkQ z&CkCk5MX?^tJ>{LU!S3I5Ff9iHn>9Hi~Kx+UrTEo2oqn1JFuGN7ZsN>IC99c@_D70%Yu7S5>J`&(0dcLmMiChySUlsAzL7EyBKoRN;|j9Q!z0 zW|ufR+_!*vBKcNhO6$1Q*jWkI5ycAsW18Xme8HF0 zw0~L0nTu;N!Jm&Gw{mMkS*yN;)VwM#-t5uwqm#hcE2$+-~#H{^*q78 z@0Rp#&~NM%f>4sCp~ipX5mo^5nU*GjgStKp#Lg5 z8T5!+3&)5?j&44~pE9q|M}OzzCF2uQP=UR{^L_^6jHgc96&LGFTCYd1?bEy{23vOl zf=Tv0){kqn?r0aG9D-f20e24xF#Sbs_-I{?+yP=bF*Oa?_U?NBK}!kp0H0zGd<$Hi zwGRL%&PlcsCxN$jdf)f8#_u|lO8ydoD}nJnPn;TrX0yq2+t@2C+*%3z160?pqMEbW zy!Q|ALGD}f;lWa8PjgaE^P4^4UJhq0s&2eZhls4zt=34wGkt#Q&=JOS@DR!K;7yHI zCdipTcr8}o->I{V^No<%0QMc!?dBu}uttC+*Ff)Fny9%2Mzs{^aJ?>H;lX3>LOZ(L6Hnvzk;j6+^&4{dQw;e zdJP;UWGJ#)wAwZ36x8zrOpR}n=KRuW>v5(F5aQiD>5PFc#T$HFJ=;Y8m4*de1gY(j zVjU<46;}X_!S2Wc1UWg4dV&`W@I>3y!0>^L80^<}thH)A7%xi85z>d&i5^&J2uNGK zBe~JOIiNZ^<%drT<7`r&H$6gR-nC6E#~dKg=V7&A6g|b-1T`^49ip9Jr1fY@B9KKmdh-M72V$GE9b`K|1E##ZLTH{=|3)O@k+eO0=q5exeH8h#F`Os(a zA7oajE?aEk1x`iYSb|)6UmhT#2V(bwZM8iK$%w(u*(lb1P1+)Gx3udy*z>C0kSak2 zq!Kx6JHI@HIWRg^^)@i_$bub7u-c9#GseL#MEwzAD}cvMhBIwLjC$ZI$QI#?fHL6s z6A1t<3}LyA=D3ZQ^Dk*O@kDJm-yy=Vq8N_=fpzB&>#c#D_Aq z=@!&lB17qWi8qSzb`{zUv}|ElE7%RZ`nfC#tOmLKb6JLUKc5z^X&*86`7Nj@JsBEi zv|z^jJE|R|*$NO}IPiFk?O1V37Ag)aukEZx6iTJ$7tQSpZ;#xy2akxS{cEfAuIE(i zoHw--1d!Ma$i11nt?df@VEuSIgfJ)Prxmq}^@JdC@$;|l~C zq#n<{Gc(z1Ay1+bbwn757l?Jkmd?%*L0?cZL=taI);DIZ+wS{b2~r1XHnSbO`EMrG z6&XVpriW{47zX?;m)nvCIDYIg4N_UG;n%P+am~)?+#<-9X1%8XFl!?;7`l#A@#>Gk za-|nAJs|u;^d!bz5&y{W-1(7fLkk+%2*e`qk|P@H?9B9uqT zgN7pe6=t<;S9J`Co+tKqYBYB;Ox1@@+WEl^I^!`|v?NHFJUmWmxP$&q$>Xb*x`ImO zL(-*FdM(K3Mwe7ivI^9*4ZTvPxc`;8sAe*WSJ~T=6jS&H%=UF0ZyRODYLS6XHm{c8gIz61N3L&v+$ z*$OSKfup}>W`fJ-v#7G{Xv*i&QH{Lv@?V1J_3_pO;hpBA*I=W_;pU?N!Ok8VanUtM zYk%Q)rLZx@0Qf~6px%w|bXPgC0^{=&je4Jx#E5IhTR0kTF!h$0V{Ke9cnUuy$@;)h zzs}zyaRhNKH<;yh-<&83^?WBoP^d*n$P}xs?cz?Gd|`SmE#y{+L)1s0>Cw7qK$dIZ z8cPE=?CKzWOQ$*4^iI5K%#(8&VKve0}$H8*B*fASC=t5rmjcpheKII zChD1;pv=-c@`_7RNjUVnP&lLX4lUbKJtCFmt4|rkxF@Gp#Taf{kCd;J#Ykh($3J!m zCg~jQITd>r$vB(W9n8A_ce*?VIE-Q4pE{laMm#@DGZg6ciQr zc9DZ5WyeP(&yahbXYSq-a;3x-FuBCJim-cq-jOT8g<`3)(2)HUH9MDi4B5RJkd8JR zk!iFJXb`z_bn{ZDeC)Rq2w9QWRNvim?}+O3gFXiR(Z1PRc#<^r~ zxkcfe!61->@1oAb|+B%3Unx|bRfwBBfjLofdLVec`ffv{!gWA z<{&c&qf|arUI&j%+_b(E{})j|AqyvCRpu4zfL^YR+~)l1F69(6Z)?b z=(ke|`=)^7v6Fibr(y+9hCN19Jq7~3F>2xsErJ$Kuexw2a|Em}n)B2t=RJ18aEFOv zB7LE1(V+!1afgw6`h+iV>>*O%A*|uR<`x-Fz(_s^9|CvB3=^c(dEQEIj7NMfr@qk!#t+WozSGUzHjJbIZp5POv$h~9C=V&V7 zUY#eeBXI>0b>^h!>3A&H=(*FjZa`MN9-m{AJdE(ox^GF4XF$Hhza`B2*9;CF6cX5N92X(G#nIvgaVh4ys+Sb)k46UNWC#wB?iTQzVB_W@AdzY9J5G z0}@s#fQR(>`W31T_?NmEZ%A8mN`vYzGNhz_EV7bDuAkMYb@U&4p_XbJHJU@Q(gvaAZ=u>pHTyf4Q6 z@R}8B;<1vutN>tJ233-j;IoKhEi|-uu3;AtJcHlAA1Sye%}h`0yT*n<8@0zzjcQBV z6-tUi)j+}E9U??`&y~@-f!nYKutE9rWen$FSs?HV@2xTW$FZ zMYat{#}pwz5*r&8rjH8b2r-I6LM_BaUmC^;fi=^Uq!C%#^JPf zde@tI`y-2cG@Swbjxu*~8QIGkYOJiBOf4yy3ksBF0_xPw*MC0r#&C6@5!W+EBffLi z7%eSo>4ma8BJp!(ChA;4^DR!!&9Rc=Vmbddee^RMlZc3S&YiQ4yc*vx6z#NjORrb` zP1p*KZ5$0}`J`}Nk>mql@X>w?R)Gn2M?@d7C{wR~tQ=vzGI5!{4ybE&8&!39gTQAR zMPXw9=u|M?9O#AQtpFN)3U6*}kw$$*%YnW=6-isYll`PHY+ryiFra2XwC~d``du2d zX}fK6OYo14xK=l!wybpV-*=iw*?j8ix&-GdEr#>*{78?nQ5dsUKu3NJ${mA<7N;jG z<=G~h#ppwBh%AT))B)p8ALEpT4sV~%e zbhVg{?1XFIlD2IkA{E6dfZBD8fkKRMV%1`dDIg{G7swkDCTlsVoV`4}slYpBATy)a zpUDx!ddJjS1*P=><5UpIT>tRLrCCH|z?!t{fzbR&T!IFRYwN#>9S$`x@_Q$bShY3%Nz32z~DkHQJQ^6FqYfys6K9%L(Q^ z0D^3n@_nxdi-r#Ns*ijQh9vZlL7%+&Sw5=ZzLK_D<4qL>a{Y*O$Zg@ReDg`cz9l)- zj!Zz+>Yd~8)R~R&fO*iWAx}J4B!1uaKJHX~w?9d}$Zrq(HmtTeNy=nbDS7Rt+vuz7 z2s?{I+3iQrn-OdQ)-Sbxqx?Eu7YrRBAM62PWeCrKsz9pv`wN`jh)%e&5!8Q1r-u54 zSZ~AW2ia9r6_~CF!<;Ec8jD+Vt7Fz@QgYvXAVkUqluE1L>u(2cvZwfa{29Q3`A#R$ zo=O24N!hG7+xqiUuh|)O-Phr2f-Rq(o9IZa$tyUhwS)~kH+M(vw_rb0~kLB{s6B`>@V7#^1*xj zJwO|uuUI)w*Q1%xDfK>q=uKt*rCQoNbWF5m35EtrAw!&G$YD?zUH`Ts5SKogB|phn zzz+e476skC?aEZ9iQ)*4kUgeb&-kwl7U7rNoquOaq+K` zz;T~oJcvLa5*`*FJ}cT6^g%__gh*x#91B1s;z}zk$!Y;aGqb6ex?zd4ec5tp7u zWUm^MQ9(gLQ%wd)S=bBOn&rGuH}1WcG&DMQ;kD1tQ2K4S;ioTO)*DJn-q*W3=AdAA zMv##CsWwh8r?<{>H@%fJ`uWzH7BUZjsQ&thRo%c&OAe<2z7#SlH7E@&OF{$Qq6yhq zG=kPmLqfdr;$K`)r2r+Fk)+E&sEv-)O3oCR1vvv*Y(5Y3bPeFz-s{R%VD=9Tgq;cr zDL}7f`m7&kp93~C$C_Ai3)A0+^@iMUul`T1LBuGsO|Xrj;&J}?uQ%lb8$a|y=C-vK zlz1xi3$`6&$I`CFn%#ii49C2SDq0x2U!!L8ASsOE{hk>oN-nL`+hE%4jr8HB9VJ_ z6xR6J#EQDXB>#l|BlFAGlK|P+mlz<(MNr3S$R5aI5Xo&R>W>0Yu30+rjpBE7VG*Zt z+ch=?WI+`p>VPNs`aYeZGXXJmC|u&ttd*rE%fIaeGK%A2INLA|Dnym!P>&DF>-u2js-mB z|99moqIM+d2dOwZx2L`Me7eKo`DHmy3RMBf+Z`)UBTk6Z$7vqM$$96HbwH9>d_sUE z)PI~VM|ue$!Aw!E(qNf0NjgY-PeHsTqFwl9-HvIgW7fzn#@ZfWiGH_Emy zkIWEJD?toVJc0pUI>#d%6z_GhN& z>A%{eQ*UTyRI|_oAkFT3gnLW#SwaAc8)ZxZa>xgHYyiIPjF0w<(7l@~AzdWrdiB?- zgZU~&th(+hFdDV!{lCC)X--}JP(}BD*Iu!^XcBivR&-XhGJ4-3e?BsGq_Za*fft=M zjmw#!-XUq@CMIwsbblW*Mui(0cjqkPDk!tNCmSpa!87whFu*z@<3{s1+t_7kpt_o7 oJgNDADVqL27li-2=DaPMDtG3DVeZaxpl}X4ZDK_%IZ2BCA1mLy>i_@% diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 26deb9725b93d28d1abab5f2ec9fa854347b7a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10372 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 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index fd1a2c712acd1eaf5ffc3ba1ec9edcdc4a96197c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5199 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 ULJ*w>3_FmIhrfIM_Q;I?0&7K2ZU6uP diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 4d3ac7a4e63d1954fbf72d3bc9633ab895613e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6526 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 Q|0*m59V6{3%^MH@2XeGXI|C&+GYoUe^^HYYQ>q z-NL{8@{1VmgsCn3JIw!INDw}+C>;3k%P$8sai%8rQJX$=h{gUB(e!G3Y>6v!ti_w; zeZ>0KUj^q@*5hv&a_`_iC`V{@3vQwwy}&84W>g%iIATYo?zUJt(A1%%ee+Z=BYS*4 zrN_%aETzPW^CYQLNn(r0+a-aisS2zh+xL-=&d}AX{&3Z-F2g)>@%>P!yvXq~+Yy=n z6CdkeV(wsfIMa$#-8?h1Efm-xYN^L+=oWoS*QOfZM0YGNpNQVF*mA7|^@jhOo6Yb- zvRtmx|`jI)&LGR2>gqdVQ((Z6)ce(k{cUP^qO zn;%(mBVk@vF~xV}eYDtJ!ABVrtONyCV6#tXWjDrnw-$Sbxu2yv~ko$P0AS2 zS&+@pGM7LQcJ?wvd+O|Ws-<4Wa(b68kJ%=o**=Yroemy13UyC5XH^UZJ`L0x3MLgZ z>@Yb6C#aMWl8MCQZ7iqNJ&HEfL-Q?pF@+ipc~@te^fMBITm#b(-}1L~TwWu0tgYRh zmo>wmrTJ3JWpLD557j>%&bi;);Y{aNE>n#(xmp<8rh_M%v)dXmHze|gsz0=)3 ziwdRBC|J(gpMwF@7o$+iO+9w|6m@qSX?lJ!#XpWB)9Xjv?8m>w^}%E4W4*NWZH`uM zxMFhRHE_0T>tpfH^gR}w;Xy+}?xZJaVu@{@Q?Fm&q!1tWWO~!sDOgTpoBYzeR>jyH zDkq*@zSx{v@^n&1QAm2TkZjG&#h92=6@$kxtJZK!<8M(NB+S&?w=`wkm5CfTPx}1V z-DdboZS%?vaZJv4Vynl@(2y8jN<>ys3;9WAyLcV?>Kx%duY4#_Yxk)3P3&!9{9kXU zis(@buhU%m%N98#_3xQgJGO-W+x{ID?O_ul=c;+I5LY^Gw~5WrKOzg89li1~Y1v?3 z>KS;Mv5>epOIU7kOf<*yuKHf%jOE3}Jgg=vy3nFxu>9HlnntC1K;Cprfkcl6Re1=l zkutG!CcFeL3C1Uyv!+Js_tnhU^etUxv&CP&eED85C%*RXwW-67j(cx#juTl(*4o-N zTd8})Dg;1+*HK*%MGcl=t=1=~*=V+a#JBuf#FkJvNfOV2+Ys!Y8#B6-Q*B3&)z3&z zsnt-tJjY#r^X3G+%?Z3zTF(l@XU-Vt<{S0Xvh z`l$9Q?p+7z~)uXU?luaSh|XOv4_Yqp`0+cr9^qTVj^o4C(vH6{I%1>Y=>f zF4QPn9kOioNM2f!)aw?C-$C$g6m4uT3Y0*b5!Md;SdjDu(B6(W8-G;zVQLK&7ID%?Qp1m1yh}HS`P9VRFzzGe5AQvTf2zy^plO+9u9apGMiT~)Qm_VsBSsl+FKp^eSW zsu^68P?3IyRrBbb!GM7J5eaY6A|X$l=|#D%J;8TI&*RloFHh<`S8#enZhNlVZ%Vk? zFRhb*ppt8tk+J<8`NjfG=adiP5A+avWZ_m=zf zHF_Ct!}>->Uiw(7SR0KW?M87eS<43FhY-c1=ihgjy=t|QbIR9I~ z{d{Fy=hv_Hs#!PRL_dK|gPby-FgblXvkWq7w_+#24(a8;)+Ywj?q3+|%{2CS)wF#~ zB!AAdaB5?b9ZOX%3k!SB{c)?^(S@O*q3o|;)5M4@270^rx~SkK5^sn6K5qEo!-r|5 zrJJ&PvlpU{74D)C(R5GGkc&?z-n)kLql846>e=fFus`-|{@m|X zA>qq^=zHMbFB{ytCC3)@^fvN*zrL~;veZ(s)9dNv>Z$~fIkJ`J8%)N&dUc!q;RB`D zC$%ah-q_d3^I}|F)rSbX)nkgCy}fmJ0-l8J27sukF`8eT3^k=xJel9Kx*GiFQuK+t zBcBc%8{-k}>JLvWwASLQ8{OQnETj^-SQ)prHl^|L zqde-0kiUP=#_EK~`|!+5j`UdmSHmN+ii+9r)2OAlsqm||-N?oV`lSw`YUw>IJGO`v z8n7gp9`xw%-;$`>Nq{87%>G0c17h7Jve{X)Z z#HJ7xtGj#23D5{%nPKidu8~MQCDqlLG-Ci|E2h;?HXsi;oSVBlfK%n72B(_nEFBps z*;c08-^;l5?Cj(FKF-pGj@}I}c2a#qLwY8)4;i9n_(x}T{bZy05s0JiFspO(XmcE+ zFEuQ-+}7Ql9*rjPBBIa?^j6`zpkzA2O#7-Ciu9m{_3YUu1(F6w1UBb&loietc4WLs z@0+k$@ta03-u5wS(D8c?-mM;oZl1yu$_IbpRKr;fGg%mtY(|D#_XNbauaS5ca}T-w z3AdLb#=pyK$L${PpY$HS?m%U61 zHIbq*8w8*M?Hh}Kl%SmMy>OzHC77IE-3)b|W9(TX9NaPh0pydQDP>k?jz=e$WcGB< zKRmTxd`FK4(Oc`?Ab)Lz8=%>RIe$SFs%5r80d2dW zq55}^){oDo|H@A9Qhf6{LXiZAd-$-eQDbYXU7-+5Qo>Bzq*emcG|I&6HsV2!@Oax) z0E>)`bHvoYUoR{wN}Vyth9!X!F?Wl3!m14I`~%7vj#z;t)mI-s{=vz}+}cS4RN?pKo%;Q;Zd#tw^DH10@Uf>iJW`fZS~Ga?+ymw>9M34 zcrGZ40}BiL(vwd69!XE)EG!%yfgMTfktCjMn|pTtH#LEdV=rbXm;8rAvwDB6+Iau& z-S0v7xaT1DEDIecR#$)TF(rToK(kS)mrHCI=u(uheNNAt)hLBR$I`IaSPtZrYfsOw zmQ{T|i??SF=Nrj#m)6EmiOEa{S+EcZY>g)Mjqqyqj%d}-+kED5vHIOkYx~UFO zctw+wp{%qqM!ZdGLH_Zhv{#TP#JZv2BqTd}-ZkIKb5*2LorqkR*HRLqL5*oI6^{0R z@WD}aiZuV&M)Q3(tvkKa3=~tb^ZpCcm$2po1^v~*C|2k>P1y?|op z-k}f7#25PRa8RApC37wbGo>ik3j|zxoT!A)dhPJpRJvA{(k@0ui3!MaXZ|&zI#Vzf#N;!2YwYaI%j)jI0y7iyQ{9sBCWjZcFDoWg=vd`4Oyl<&{6UY)KG0cJgL2C?{MS!E`? z^Zv!CVM!yPoocQUh<`pvgZRV^o*FrxWcZg8I`OnYfi&-FdUEpNGElE8GqeB16wE`l zn+ZP#iMud(nqS@{?g0myuE-5DIA94Y0>k{1yRG@{Iw-{Sfw0{v=W7$KD|-E}cG(X9 zTvpAQ*0C}}@@`C125#~-ZYzSA3orYD2h7ZJ8kk8}*P(`>s}}%74jwF=2KHx5z0-1O zJp;`iRzVbx&DmN~;h=XgU#*9u*)}d{+N=_*5KrjTDu2Vjaz?g(?!KRaS`q(HiikFTFI+(UjC z54uH~&%~Gz;Mw4r;A}sq6FE@U{nO10f*vkd0waVKBoGlQsb?S>)rJBOg4y**FkX8^ z-`Kbec+BX(|4N!^H$Mm9D+}lgY>;L?g~BFnhFI^e^)Eq{D=UIH;_;1+bN6LufyZ6C zbhXMh=G%r8j~NA3{`K0D9U$HEvJk=75i+Lefb>ZwU~S5LHOi&#f@tjiA1Z5?ww)*9>u~w zXGk57!P3hC2Fj{T@qdya`bWHW@e^$um_~qoSO-X-KDgo>yV7+(+tkALW*@OwY19p1uvGP^f0N67V}doBkEP!aO;iM(?1TYU`AiEd}vjg;#l z?&{Rq&k400J%9Dmvky$vWVE$Z*X-pP1Ee_{%pQ#W?m~-Q|YNg zAR_jO!r?aTp1tZ&-Qf>5=)n}B3~xKj!L*=Z<~=eMIE000tTHDQbcAR(k|+|8XB#4y z?+yhE>i0#t74-bmfq=>O~NY$tiz);E_ z8^R*C^i7lA=k%GTZ1{@GcCSS%k)+I?Fw?Yw?n>}aq*6ND)P`v?x zCS}Gi`QK8MagP|c7FG+t1BwvLhJ{!sdM0AWPt(fpzKuROv0xa_)Jl_*AUtR-sGQL6 zjKAh9QyhQ2ugY)XLqd5cpOoA6ShVPSvAQ+;m&2dz9-I?jeaiD&*$ z#joHGj9u|kz{XPk21Y~Ty)|||czl1BeP+gXim?LDwo~hvslI`Mm+WA`(Y*2pHA)s1 zTQ>?(so}a!S*4}F%8Rh%5eUmFAy=Jll&o3t?B$dW9WqzE+wv4G5k1I(uS z%J^m?Kd1Q05KB=ZOy3`eEz_)^7*%*OpuwfIYF32c3j*UuSnL8$#gCLSAVc6k@Q)S9 zISJ|{UaC)8u16X(pzG~O9xKgORtv~uXb$KC@L9Ia)oFm%2IFe@7+xxme``iIKhH9} zMT&f!_meup_kctMZOHf)7!^nQ>a|OCP89MB5(eH41)7>VV*qERGY&q;j|9z_n0L+!ALLnL8j$i{hQCQR$99mw5>qs|Y*4u#0rz7Nae@99wB0rKl;J$@B0YOG;FdLnv)?J1tX zS^;WyA>wxSXhf7jDY7N(&$_$#$ZEgc=OKCHC> zea~j(qythiK^|vJKu+FphuR5>b^v^Z0bM)!yJ$9W31QjgCX3SXdJVjkU5MOP9+Qt? z4j44sfyboqH%;*}KoVS&CQJh9+nwIT0P7gY^$`U{(d1t(qdhLh#;Rg%K~jKOXka9- zpg4Q^JcW4b?z773lzEH0>eU2AQj~`kW>_`J5Nx?@XeF58Yt#Me_d&**$k8c#0`9v4 zrz-390pAOYAtFJ+sp;)DDzLr^(BcHS`<#TK902@_X)U*>bBBLRGMrck-U3b{?<_`^ zj49F_0pT<|i$oNE`Zy})Oj~mDaemSq`CGOrrM}+Vl;VDqll$X*&E@Dela6hk{!nhy z=GMv5NeJFW_pKlN82b=E*&gI}vh{Yj`of4PW(jr@w0e7#aVekWlP zzHI5B+Ex#}T8;YqAOJEbQs4vo6oHBS}+3mE3dL<%5U$hv>t@&^-)$AR$&(?11#1piPoBoN1xaYbGD(Dzc#f z4OLGKGrJCg_cAzr%eM97I0PxEcsT4ps1!;p`M`#}K2?)iA6dm??PFz-i6HQ2o$kHm z+kSij32(nV<0-^SaTj5waOq?ffD?z9#5UL1WwD(YM)^{=%N76gQ|{!q5zrY za?ra3<sXripK(UZZ5`u<8Z*34y4{8-&4jtXq1_b|H|d)+w8GNGqOZvma-Zs@qUnCc2J3-xnc?12fY#u_-`-AI5q_H(j(Dp zi*g7e*OUShB%--@dHDbl3H=!GrCyF2J|$t^MYuxv$n}_*u15a1LIE2xrAoL65(Z2v z2-gc{1W>p(KlIqC?AV*N4sg8)|D&?=e^ z%cu$oJ@ld|uIZXs+fD??#lh*nAU=Q~nbZQifD#D=>-#aVL{^+=W)*{X#^wgju7VuO zgFg(d{+)D@jI}vB+)2Wyazywd?~-4A4=4v_PylUG=jJKsGXk--2YRXXE;w@Ks8rYD zyu`(ePbXa^5qbTB(6lN+!Tq$-z|j96rLD5L8;NFjF1eB0txLy&iXy#NH9*lqhjw@xw(tE_SO}(_Bm;q!&~ zUL#uu`ec#e5fjtl7g1Qe(P7{-YFgM$P+acwY%yS(6On4JRYPuthO)w77G8{wJ`i1~ zkrQ8y5^ij1p@F|?7>khtRCPd_Lj(~^p#cEKrWCR;Wn$v^corD9B~_$qUeF=rCsfx$ zDvx)?X6-)kbU8XoOwh1t6yy0CHcXzI;iYI?U7QegqOR z+&vj|td9Jc-I_npy~s#AFz@(H9c}Yr+rlZp2-t+HkjoVh=PCLbtc&`$0S%!rdUghr zz_&Qe3{sQ*?YH}o+%{|cpgDj3JP;{9*Z{#$0YCterYpDoqFg?#@DSX>dt5_bZ=Glb zQKdG@)DSc*vc)XnIIcftus2&x9#b%2FOo2s@;XB%CXYb zL#ZVwV3lNnyIjN9QHko{?E-iFMTlofHN7;Jg>vEhM=y8uz}AS3YhF{{7VV*R^VFIK zg;+T_?KUid$g}b^OFOmSj#&Zx6}r$dqgh}8dIC8jdIL5(4Lj2oouG{4EB&0+$pYMl zfcvrrMahuA@O%Z0*OW54$u!C%0)8^5?gXP-Fu$ndm26_^} zF>Q^E%k%3@@^yyJmni{w90Tnu8(k>LcOuF_ls*p+f~gHU7}T4ozG|6?hH~-?PVi(5 zbPkMi&0Bb8;7WDHL}0Sx+BLx3ErbsGU>eG0rmO2Hl&&#L z3G@xlF41HQvc}AE9(2xN+Fk`QY#TPQdFZ z6~0=9R^4XK(yA>Osn95cHs<{6uDeKYifZ3HWhhV&oKVmv0=c<+A2HH2C-t`*Z_K-i zZwIZzck=V9tHtjGlw%RjwCSOttzapD2RYDTlDRi7su%*P49el+;;&|S8w0+uuU^QO zDSQB>=-IPB7a9Ed3!|?!8iFDTtKsf(%^TEIYmW^isWqw zert3+9IiYHkpb}tZXpXCGr%TtdqzsFxP1;P6%0_xB!q0IIS?X17Qh>NaaBwFcRcLB zZS&|G=-jSuA0}@#rR>stvI_kf*y6C=U@#TllIs=p1jW5Jo;(FEHq_;Fg;Ov+0Gwc8 zTKBM#(ZiJ)tRE3M{o#Wtl)EBlT3JPf#lT!70@0RKwYV_hR55sT7+QzWEj(_zDnCqC zMYCT|vO}R`NL9vx4D?L^#~s>ESA@U-024aRJn~27zU+mQKnGxC<@PL}ZE#VS>!-itnmqr8)#Av>=JBV3J2`Oij&<&=?|rE^TV)4bZrj=+H8lset_mgZ>`B z30dfvwM(-wnB4NBxj8mEO2~!)o`PmQD7+XXyo0D|yfp`&EmAO{r z7YF2lCj}M~O!OeT-$d_&5uPhkL+@62pVkdQ<#Oz$65Akd%HdD}Kpp9YSEr)Mnb7-& zHV$yjr_d+GQSX3!4#?~6>Vp3Nl0TG4P`p6M9xgz??5ToNUrYg?C3l_aJyZAQkhdv` z*Bwj(hlI!UNq`BL2|X@%ubQw5N5pCnBoyd8JmFjXkGgty^t{FUaB;*qhvqAjo6BXm zCH;py!-&!N5#OafOD%cOM-<=#k-kTrTN2;rg`xsX$~Y?p(uCZ8P*oKk03wOuW=Rmu zI&4;4sjdRlqJx1(v%$%D-Gpgy5#zVthAzse?K6qWJE?@hb9$U=T=eC!1P}} z34O-H_TO+Yg5p6B4i7Jd3Xtcw2=fn6Ka*I;A*W-Z>jHW4qleSCGV=wn7Ra3X_s8Xn z#_%O>V?h8aX={7Y6?G`hFbHUUI`dt`5%LB590jL~p`lPwKPa7Y1^m zOHaap8>EcW%W#BZ2PdwZZwEMdR+rqi6+j0jd4TsCRddflIorlUdZ*c}xx)kyJA6;; zgQ#vF9Y`}JPADiwE?sjvf)_)^UW0T|1DOuYMzG`9>O%%PiM1)gq)01GS=761@w>0x zTBgs$eC_G`JU`v0iE(18I&9s|{XLc9GqK$xe*w< z$uUm0nmi4iRFD%e1V>eV>?d;Bs|E%%fUVZTB#`tzXazWgF2MYrhgF~+%p1bcA&>bS zskE_)KeRVVEe9c6>rwGzXzvBXgN~n!)Y}~nx&*eC8-90Vjii1ABo+8=;N(H~_s5W- z&^8tri)vt#3_&Iy*fHuXP^y9ey9=+UWb?E;ez2uK0SslXClVJ4E`~Vv~yl^=S zxt{KDcex(GNZ*7$PncHAl|;z(fO!Q6P$cwSfed>8=Va}Vu}co6uhgs3Uj2yo|MqdZ zVpC=p2#OMv53nXtI4%%$1%g;Xz$vU|n1L9@LIJm9^cqky?GuCc!#AwKuso7_X7c(Y zhA07)TJ#nMI=2M%;~Q9r1W1P*3k8k{o&eHb9{T%~bpDl2qa(7ynGbz*RM@sjETwS- zEL4JeQD0v?FZ6R5b7aIOYRgX&2r)K}fE6uDk3d6EIFnLrdv`YN|H8-P?*dys-u@%8 T!gB&9sDHtkS)0}z^Sb= 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 Za-wxV!t(TUd!WS@wBOc+(qO|#{9nh>`J4a% diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 95ac5824e9d715c20b2a4330889120c60bbfcd87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14257 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index f7f1d06908af8ba1320d9aa6474f792883db430a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18064 zcmd?Q`8$;F8#g|inX%8<*Nh=+X%I$P24f8kW|EyO71@(5HN#*mX>3Kvl6A7Zm940W zvSq7CA&m%a$daP;+ehdGA1=eq9myw2-9U$577-f1LzOMV_H9uNq` zZ*4_%1cAWBf4@jL@E@OCyb4)=M|F&G{#R+Bc?UL}zyy%w{R_yIIq{;Y0yhys4Hnm@1T!$Vr?=^s~J z(BJ#JZJ72}zfG(2Rk7liSo-No zu;Jjn&wIS<@wXN3?p7a#+jH3iAI2PfMGRd_7pAR&Y9=QS8x);?%89+bEGlU*w%LVE zT8_Q#?6(fQPv^V69P63=WYb_wT`LB7Zw?>ZG-w+5f9_&MzVwsLD=d&DS0BS0#9Zca2E@TVnm*Ropn zt#mC{2zW$0*b3HVnm=QHQTA2JQIH!{U`w)^zYf}lcwi!TcADu7%^-ggeSs*n_`kKn zDo;0cY4{L9Of6W=M9o~0{ETs~Kyff2^UZYUYBIruvdJ1`YHHQGN-!#(aT$arCdYWf zi@(%5>bRw^TxOOK+M#dlDQ%)YMl0%s0I&{=Ogoj10*MAq{oqz;grv}Xyx&M@Be&9E z38PVlhW)?(=~bC1JDlUbs6 z*oZRLBXi;p5DPqC<$wVTd81;aVgxQ8ZWgr>wPBH++>4h1O^KLNIuAA;#XZy9bo_fmw0?8RN13f!A`RzgGHO9hdC&n#f z;IdU4^sPyLiTN8YKTB@`(z8Bpk^*)QyazsO_VLeX)Er-gLfFGryM!2RPllfFv+zbo zI&#s2J`a2249oR4AfC<}RzxxUau^YtMVNJ`LA5O59f30x<6hRQ^IGS}l&^*zD zvOR*0Ks8H~% z-o_4&cpqqO(;qvE21X_DJq<5DETfRGVBijys~HLHQ=XC@z49PKVh~n%u0&!9We&{i;5+gf#I1Q`~ z3i{UDj#QJYwYS^>lLY7Uo7+^u`+UFkvmUmIz7V8#$;Id#^h0nWYVoRB566Tg_vM1b zm%mqcp+apUHI$iO!NpuHkC7>ktRX{e@){wcwYA~ycTbXtjuB7sy!#GUnI%XW%umIc zQmu$h&N^2!7e-&1_Z)9%aPCr7e_GV?p(8<^sg1!Os0}cC$BJk~PPxpq2&^5v*Ea9M zIkOxwRU1KPToyZr@h1*DdV8t3i}uTUWmVizUazi1g$`NgD26pIbfb#7F7(2;OspPp z&r=*G##49X?zNql4NH#fETzeCUFJSbU`Z_|VV}$_bZqisex8+96MS0 zxjc^hSv(%^u6^`qCQGAw0=3eL{q?FLH~|*gWA4za#<{Tkpb_#%YQTZOrNB2(w7Z9> zWw9zNuuqGmOuJf^-9zNp|2%n8KGh5kh8n(|UUFO4)en-E17}4yeu)_0G!fIbp-4(d z_=Sb7|HQBEK6aS+iSl&Oj`4rqS)8`eXhxeM2vkl;aZZ%&ou0YOJ6GA#_I(T!4?PPB zlCaFzW2{FnKbV^@7Vc^h{g8ifc{+ertlDFZ5zTub`m>|;nx^O5=C=Rj@V%X@MT8@; zA4;vF>)N#)?9Mjr`e2V#=SzH^Z^IjdCBUu^?o&ZjIVi7c)YahNR_@-gc+8l{qI-Np;7^4DKG^>dF|jp%t76@%b!AFfnO1WCW%{?XW>TzUkD!;!3n_$B1o(!{MB z_)%G5bGxg(>eBL_E@6$9UOx!3)q~vsZt>ns1xdjz%>=4nRG?8=#eL=0%h7x}ivi2|Tfo zr`DXspOeXrWmCo-MIS2XE^*)()SueX=BI6!dt(&u%QlyWz z5=MIIuDspdf{q%+&$)4eewr(D>^baxLNf@}hdh#mGnM#Hzggc(*c<|@ufZC8b#LTf zwC6OHePc(y)>ZZIk=QK$ygrW=tpRyKSdtD3LhjsO7v1}v8-fQH>{zH!NBt>J-U#^> zZYtB2d-qBvV z<$X=23u_piJ!0a;eF3Z`7{i5H|LrM{JwdC&7IVclMRpd^N|S!2w(|Gd3I%-;{h1&6 zE)>!&cJ2(Fst+Ds8r|+1o8CRUu4K;8Q!W1TR%Q#%oN_Y#TgkGtbl4QO#V$`r(>YcY zeMfp6W--~2KTgl;xX1%c2QQBx>((;yVoB==^uj-&DoZ_8+tmVKT&?}&NZCo&lSA1( z?zrQS41yF*%-h+USGN&z4s;%5e`@jokYP+WgoE4;c;}p+VP-6hR$(Lf2lg{j9MrgU z@fZEsf48LDi3-h)Y&;uj6$1HDPK+>w^;n0QW+2&NS2;wc9=H{2P@2ygEH(e> z#R(MQJKk$ z1g06mmCAIyM;!KHm$R%#JF_;)n^P7JN1rPB1t&a?>{Kv$%oQPo$$W$Oc`ecd;X3n^ zZ%#@0L$KE9_631KJ78*|@lEpfgi4@BGq?U!XCX@;j^}#gNxwFjbjd7&e`QSmQ|oIr z|Dow6gD~YV<#o~JW6`H3d*x%UBew}wHpFu&9G+~>(dCH0T)*zt2Y>Sw{;y3{uD_&I z%tvC;iR$z80NW1mz=hyH+A&2$M!WUD@Lb_%8&&d@c{$sSGAeFBiWrf>z}lj{A1U_O zUzl|&dkoV^ou8?19TM>i-t1=Uedt(rSNRIw@Z`v{@2a$F5A4YQ?uaZ|CTutbi3>J! z6CEPuvm#5yeL#3oq{M%MEBwHeA^)Zn)_7VJHX8NXG(vJc&XId%iju2cQCr1U;uLF> zzQZ|RfE|a)bL41PX{0Q=28lQM-C|ViLc*lOfVy8}HgCvU>ct+apdY2W3oI#&MwJRA zU2S=-WZSF~sP;5`l@IOHeFT((O)ylvd2A~7e(Oj=jPMZ0PG$L+DaVxK?Z~t1#Tt}! zm~iwK29O&UOLU6*8}1iP0P?#1xUc-%k?Ez)29K_s^Fz}q$_>Frau@Z+@6fK2Y^a7N zp(*Kdz>+ZSFzL5=SaI-`SgMwV0Qk{@yCp-f+_Z~(!Mz>i1v3Pr`c~R0+nfJpNz|W` zO}v7_3&$Lk{tWq(!kF_8jx^S`647bky7JY1jGr|)L%T;jO=Lk9RhW9mrlOPzPSiKZ z1whOloaD2PpA;?USyZ$@7VIPf>20j=^=tJxIxa@oqBV?fMI0<21yw9ft5|{v4|lrD zDn15lz&x$%l*znuhx@P{t{lyFEpuFh4KxS)ze!oUA{vp6@sUc*)@uo@xT8!33iS7z&e7zU zLhYEsh{oU>j82GOyra4~9@r}Rwq^L$bCi7JjIcwP%GZRASgRlHZ6DWSj-aM-=U|^zCb2??A~mAvk@f|c*Sa66 zJ5XrlkEC?%;^&fG!xCM5$*G`H5FO34D~fv@kcgiOW?u#`s(JGQftoPscQvSJKWnGO z#jWYJ?i}}5#BUJE(T(cPpI>uqD!2f*6foWd8A5`Mz%rRPC6jKZ;YSaHei@NWJ}XWB z)(1jG7?ZUC%E=%+<{@XhB4iMk52fF7p7-yWuGV2*=EDn|KEdL_^X6oHzzYPC(H}T-MiF z*w>n&0|23Hu*zB7!^&82$GQ`*PhYtAHmhy{!FFKFvr7vhuj@bEE1P0{ew}$|XzZG% z+}jKHroo)&>>8>dbSj57d3Wl9z=oc;bl*xS5g&JNL|47}{ACng{3lP?fme*JAC080 zzXRjrI4CqJ)7j0%##dRNcJJv+38?= zhy%;KTie^(o>5Vv`T3$Te+y9^8K2HtmO19f6Ripe$)-M=09HIKSyNH*VIRkrGB5|B zG<;i=!vIhz3r=%!aC0-nU~Ns@ppmpxT9hpsYZ@G^laTOdGTF2Rg?jxQ7=K3)nBPzl zo6lZgt7!?PfJH?`^Lu-HkAr&Rl9J3|G#5$OlY6#Z&Y(?N4YlU~CnqQ|B1_~4LJ4!k z&${DP0AE({-FdgeY1!YW=`C$?^*M~Mnan3gxs=Wib22g78V@Bb^p)e_6ocjfWo zi@sEx8Zxnbdit{sTE86lDBo|Ov(c5a1LXB9h(VLry32(GKsvF9J%SdWa&BM0P>oL7 zX{o#AOZcJO3dg^gu8#5>?p(bU^<}qxbeT8r<)(@8`EMV-fpU+hh1-)AE+b zS3#76L9cax(28O8@~t9Ur@L;BaJmnL&vxb`&q7ls+UtWe2T#lNgGDr~b1G>)YP%~X-P|)QZEmW~+e`mwGr&!WXj{eQu?NL~p z(xkv(CvZ~-&~*lg;TJ$neoWccc9?KytMdY{q{%VrzFt|T}pxt~38rah*lPY2k>U@hV?wJ2{eFH=lO?K;_({20Biip80uJ%lSW%pGw{mqABvN ztvbstGkN{$CtmCFC;jSR98&NnF1i6Z!L+YF_z~BZtD_F<@?@tw7myOxJ%uLMzhRfI zRlcrOs>#&^AQz-lrq+jyk_ZfBA$v*RhieNQ^Elg0|Kf5p6`yI00sJYvc z?f`s|?e^VMC~2oc|K?q>`HO7ku7!w>u}w{RH19?|nd`_A2`UPCQk27DsqKqzZBlb~71sl_?)zD929AenWig7y`h(@?G5}{( za_~%9tEeRR6MzA4Ad3jXfC?pqoX@*neRProp@b-kCb~=Ymo#CWB1FeWBe$0^pPPYUC%3t}wyd%ptIh0HP_5@}i?X_;>(;~5o+V9*PKktGG z2h;&V3UTWgWz{EhB7@u|yT&EiwfwPI8>0+O(cB0I2vs(E`PfqJtxYOZbHj{T^u1d0 zkIqVdC4{p1el%)CUIEz0!q$(>Y^W!nhHJ3nJ>hFy^mu4|ZX67lxA0^}Gh>2>V)$x$ z7Z&OYfHa5vBOt)VbaVFE0aA`gBm96;tN6<8m@)OI@!$;;jA9fZ$&BRylSVt_pJc3` z{wy`?kth19LvU-aD zc4kE% z`n+@0`RW2^bvHLCGTBzvEr^Cc~;mi3mu zBZ-gb@Z4!(s(hxw`3@Ps8Ium%+8zC~Fa&OWM!y zH}7UGj7BH^>egHmzW7>61=m{i4vILrWepiw2 zLDS#dcl2>vzCmuAwrJLd4tkFNf_=6O=FAUR$U*6=;BVmbWmc}lqmYpP83JP`bRe6+ zmgwx6?xXYJr!>6np%BOS85Jp(h1lZf-=M{amgC-UNZ<*uUedl8k0DzPV8&O0gN!pe zUnHI0KK#;n{BLqNfMN#5Xk`b69mkVQ4tZN~k0ays>2l$Xdm=&7`#mBk^J~|SO>HM| zj#|Jlr5Ou9qKPlgd^8p@AK?PnA;`;@2`)nw3Mrb ziKp$q=$tiY8jnoBp3Kvybd!iid>2fzyZHSy$1ULGUuj4$FeH6(9e}C_%mGFAAh0mZ zZh{!jBGf@geIWC)5XvGgtgiLib%(yJDcmuO? z7_+B+2HY&ZuG}RA4~1eQ@C&s=+YS>89X^ve2iw5-t7XNjnX75QMiGHlqEtEXiTdCN z?CBIErLK{6Mb^T8qfoxnza{>6g7{J{*OWv93FAvU9KP)3Km0!b6#@+i3s^;`#wy zt(*W#=mY#}ft{q|;aQ&h+BWnOV$T$l1`v7Z;{X|SBnBAX*_86$l!d`QR@RQ-Lopxp zOsDt^*~;vY)9K<#G6e2F$t;c5wof5L#jV$(m900F#=S_U0#r`UKer4M9fH6-Q%oKr z{>JdY8jbG2+7T>Ux;CPUZN-8 zV79}={dCncgE>o+?Cdge=#UCJOXLOb2fR2bfc&wBE!8(b3okA@0VngmD-*=o5PvWh zvN~gY`R4FTIs~1%8GuP&ztAQ2CVk?sg+uS1JoNGd^U94oY)h5$o3$GbL2mHEGxfnh z{=8FmlVobF(qnn^$eP#?z($SXyUvcA=5KBSdGUnYz9p`L&Ahsj#x=DL#3Qz_&+WmbA)Wzw`?jqLb}94 zGoMJ`88WI&p*_w8Li;T3t0l`T-^;-Q04>l6Ns`%Tdz|v=8G`{4fa{g9^uZmuWc~qw zn~vVetW|mp*|q)#@WgwA#CZX4h6C$=1FEMljJjZ7+I|jKnYDzI&x0>vqJn^mX6~Zt z1$~=5VPlom+UBG4ugcXs+GTN_(z3V&-i!i_Y&EDFlC2bDkWRvLh-=W>etC?e&%*l; z0SB$lir5TlXXS%>4+8?6xX2IS8d?9Ros9`5Mno3qa?kYA!@_`y+Fv1@1p;ki50JWB z^YRy+ftYpFYW5raaAjQAag#WV1%}!=*+8)RdrsI)R9!FzH zr0lC3o#2iee>SyL3RA*d?~E>vOpK23E04q@k1_pp(oNmT2T4U89D6|AVMxm%~e9 zAc?Yy6@H+;Zevlm(XJ9W)G75m_tvlhf2OPz=1Z)OE{4nWKsZ@kjx9QUhX{k?oCEiID zjHpn$Q~3a_e*lzW&7XEo+@J9DDDCTsz=JE3!#Hf5=sL{TPj0d~TMJX+!3Nb;<43vt zOxKij+~~hzBn-&@mIR4|*qt1(Z;uVr!)lv#Ych{35(W@vo}i-LLZA9zSA@Gg>!rk; zxulhl2Xq&8hy2!ss5a2|r;?aovW|;k44B%iK>Y}<&HT8ci3C8}eyZs9sOugNP`V&- zT-xLuMQ12i-->+rtizz9TT7)sYSG9d4JW=e>38R5IMMI80pDEQU|XfgqK_6v=qr)C z`#Rv3svMbD^Y0?O|TA5O?~1vcEM83TFAp%_p?fr zoIfF751cY#_iq!X0L)4-LR-~k%`Oj2=`0m`pdd+_?56?==t4&7lfA1;xi-X{{y{2B z!&`=Opps9b_e$QlF|M~x>2Vc()zW1=Rl<@Y#^iS4R?HOgQ8(bzc9)5Uvke@R941=Q z`4|JIG8HPWYYl$rPzR-186LzM4#&KN8a$J55$g8<=i1U!B`t~VN>FTo4$dmjQ>Gm; z90qTasy(=UsPILD6+bQZmUXr38=*H@6CSJww`>z~Imva}$_9;|C+9b+pBbBlp{R45|=vVK|WlVE$>KUNd(}N#37=Y*;iVedL<-V+H}S$U%ky!F-X<3 zIpq*2kUKoRYk;$5r3@?nsZ=8(3+F4_qn`yg}@q@_KtjO+=`-RzEVJNgn#=4^*eO_ZRd3 z8)Lmkji%;}k~kx!`M+M2o}&{p4=WIFL<`)U+rxCmdOI6sX?vh@tE&OQuO1FkBR!x5 zQH5jP1C2M=wYGm4b?_}-BbWirFb6#0%MUaV_TIKv{%g%RUO)sSibmk<`o`!c2iLs>ezef6-*(%aYMauXRrW#U;X+D^|R&q(1oT zM=n4u!lQo*gt-D&-Yc}=(=Jwv^)AqKHM1Z~dS|9!z`3D13$?d8W6W8D1~vn(N*?kc zHHoSrP@$#{P^%37MWAptOa*75Hux_*6edwAwpx^gTjAu7l$bjgjjB#*4U%rC=?`*+5IaeMH2N3TCE$o@w{&{NmGBqi{jNhv0hkDc^e*8$Ajx4jPud%S7K*JFaa8@CVF|36H*l_yWICeV0&Wn|GGFZBV-Ah6*q(C80p5 zI_rV~)Bu=V(>hV=-?<+j__3m>ghIcT?;tl-KFT*Js27!c$XYFsT4H5bK6KBIkT0vU zjrreQ8xbV$9M9pFgs;lC+M(9fh6p(;V^sORf%uZ=BWF^=8ynz@FvnhYR2~?eaBw}) zqAnsDRUogG{nge+J{BaHl*)49uJ_M8goQdx)Dn)X<|hYza&__%IsrM^%bhyWVw z)P>4r2ed6NDJWncWQG$LK|=tJ6s%J!1*cfca^@NZuK9(`r33?Yz243&qDwmL(vRi3K*{0_i^O)BZGQ?wj9D1)0v~KOmUQ?iPPnZZ(Gh8{ za-YyEFlQ zq}C3FX1*|7=(ux(k8w^q>_}aTVqJ3{I;iMk_ZrR9woZ^Suv7e{?o4`kV~q`c4J=nS zu|pZzsSkD>vgwdGhlx6(80?1u8jwtOlypE#r~Zv3tyC55(WqhQoOvK<_#~hZ#cHE)7FVx3_i*w_ zlkZ8Ub7K7^@{%~EtKuu~t%Aj2qM09JRMTttossmedhC~zwdy4oH&N(v~B?CZ=@ zpt=zNTu%9u78pSkX|1n1#1+cbCLdMQ%5MmGWd?#4sG!eg0^|ST&4nJo_|t+1sja7` z9>Pc#b)QoKEMED)@hOJjpBhXcs^)b_;f0a1GbE+rp!aaKMmopU+o%qr81OV-6P@;Eh3Wqei{%wh zn5>mgTxM>{pNno>NE-bZ_=Z^gd?bA#>pEc^yz!oWDsMa<dS`*mS;g|vaNH9NTqz2>>(5xd`=3E;Q3dGs~^WW*tDEmLmnkaYM8MEH9n~D09 z(<#d;k$~DKV-^JRI_J#9B+6wW{xH-Fmpus{86$%rYn*lrnLd6NxDmeWHK!A@@({->dOq5U;Zy zN^!q;evifH=pH_dYZrmJ+K5<1*iZlEZ5as5Sdq0T6_37*f{NH#b8j45YG@oDX&)YkPPdXiBMbMFwYK_+y z+>b0B#15;EmnIg&{3L!nQ9S?mCVup0Erg;0&Jy-f>JiqXyLPkgtX)kLMuRQN#m2+PzN(feF} zdfsA9hq!Lgu9#D#9d?wvZ2^U+AL7 znw7kby}2o<{=@2KD?haB7hwzP&a)@?8gq2)jL$u_qFh1>8Jl} zODDeyGS|wW9ahaXw|=RsoaN^1$Q5qz_dAM59J;J&OL$bQ82mVE;q|tyR=B}q*dfG? z)bag;l!OfA8q5VL1U(MvsdnRfAhIREX=m+v%d`tv>8#LzqXoJiX< zbIS-Sgap#C&&kTPIxkIWzsp$VYmpteF#hT7g-chx4}?7*Cw-UaG%@#GCZp2w4vkd5jn1Do#&O7i*4K`z6E{7& z_EvdcJ95qGHQD9-7|R%#B&2BRtI~V6=ayG%ES`p+;EsXBKu-6-A3S)_1X==njeK0% zzab@V>c)3DC!I_j-FOr$OA+eXXdoDwnxkiTa7{x#o=LO3vu4k-M*Xv@S&L`O9+#bw z8kowh#PK^hnVt&;MQe_;dAGzdQx25EUYcxehxB5|@ZE?4XW%F%Coqn?ERz(aoYH(o ziXsG9R9Sk;pIF6x|979C-I(j;f^jF?YuDX_K4U0gp+km@jP7w&<7!uj{3 zE8pkz#Ou`bh0axfKr`ihbkln;cyq3g~St~-|q@Vfdn#7f`+BP9?2Rpx7lMAil z3|I8PRUf{VmzQ%DSo@!=1zHA}HKw#sM&*=~KXz4^Eu#hr;}5u_KWve)@aqrIK3ADZ z`ZxhZ#W#XzZ0SjpG1v`~!_<4@j;K0vkF9{2nOP&yWFYPWSv|D2sY=OHl$}Ysd?THl zAK4xHssF;!)VJivu#mHKq;^ThXw^{H*bWfW;~EyVYCwy?*3M3Fa^bk?=|@3cUVqW7 zA@~8f5wL)Q6s3w~s2k3d5-OZsq*?UTM>lP!Q{HL}wi`>6DO5~OCKvAfqOcKUmtMwE z3LJ6by?u`8%o(LhMVJ2$6Q`(OiO(X-EMwodq^ki7WIT{f-byO|ln{x&XDzc7#oVK+ z*VYPWXXN_DLMclLt5?uj@O1M1^pz3om-@Wg<%-tJhtS=U1t-nXKbvb$7&MY z`TXiSOrQP%-y4(($c-&^n!KpFju+)6RyavO=h|oaWCSb8U*#QlDLEHMdu)-wSSKpC z)V&3DQRXkstht4pvCXqbEIEDeV7Yxw$UUQ5*xRKMUVK$(%NA4h;XaB-)7SLKSirq# z&GeY;t((>_I}Zokv&k6^Hh<}r7^6$_^0GAR&Fhzd%8Q&~=GIwJeqEN)Gfa#1kXZ^X zb57h(Nk2>gnhH$+nPgvM-ymJv)U;s!17#h`T^=kx9DwfG@GyVrMl-BcnVj@@o}8M} z6f<2ZfN$`7^Qwi2TVKtLeOGz+?!(;ad)lO$p(Jc&X1QbCeM)HP-wPCfdceIG3Qjfl zl9jtlAbz0DgpZG}MIL=h@2G9UvD`r%cQ9fYb_#50i>-15p6_`SOn!Tde`0DX|MTaT zFGRl+9ByxZ3h=j=-cj;wA)6meBzy~PQ+9Wc z0gcNN@@8hwO76WCa>(;J1bqAZdpI2aOOAEn-OSA6?TNZ=qQg_gR)ySwaZ>jFKA0?7 z_2^O7?(PG==7YU$(6&1^>Cc4B%*=Jkfb*1c3;Blweh)(e9L%uZN;($##*Aj(W@vMk z=Ii(Gi@-a=%xLY3_V%^#?3a(+E@(#TOhyVflkyGkz5NOW3{Hi<2V-y7u(p2us3}`M zF8=4s)+eX@!TICtZ1xkjkW$C?mp!76p&exmBqM6h@qK&Yhigg+e=*->zK(RY)9oSe zZm=Ts)|EWV9?M9q?2$Y?+MfQzALu~+#D<}D6az05KfEFJYI3qf>w<^x!fb11lH#YI z1;}V<=$SV~WNq;#m(8!`;az1!(Th=rt}qk&cIcH&`ykqh+{$%l=5zCcK^!6?;FiF* zwo47SISH=<#y@}tH+0B6$0vpky5zB#QX%$@WqxsbfyTBJ_-=(-tc$W=>U^Fm&P@n zKt8V~T!gPnGvCz$!aZniHDN!bkNiW<950PZQC*qBL@HDV%2Wq-ja6aJLZeBVT#GMJ z(-E2F_|d4OF2vRsLUuYFtuI&MmRp$s4#=gC8v*axB?#M^3gm7Sb0_Bg%Ml5l^23M? zs5g)334&Ps`^o|qVDiSJD#YUHvZD02%uY4yQx~2~q%SOOGp|T(nX$cUQQpSrXiH@B zJ+pJADX|p!`zLwJ7i7X7Bi@$2*oVmQ?|#CEc#cWf0NKfONzGeV^g1h|e&?`Z0V|?_ zwfU%1dP}A3dU~gETQ+i8<1- zM?C_1B^k_J86W>XqIKt2o~DTD3^{vCnUIxkG%olo{JD+or2cThx>5Aaz&Hr$16KrS zKve#|d8X!?+XGC3_{v#oYi65tN2$rX!_RL-t%{nO#3b>SV}P8(xB{I89lZxc2la~3 z*58=YwKJK?<6^XjLW>|ZvX0@Cz1fliO|(y6CgZonee@zPm9!)PJ#aE-GgsndV&p#(En4ZhXsq{U`yh~UG3qY|JFEmsVtSI8K?>8*_OmZ#; z5VxL}l~$UX97%n7vujK>V3=5-`7t2~0LQ{6?Qng%4!5626A!meLle=gCN%;9?|GUsOw;o)tt0rI%ZF?F_-hOi^K*1Tori z89%|YteaE3y9ylaxW-yhet6zLBfCLcB5a56$H&dO$C~;wGmzRLU1LoG<;}=NG4GQp z`r}SShUp4^WbX!c;ptv6wl8)NsIGkuHEQa0Lt_%EDpVrMkR&It;o+UJNx$8 z(IuVdmQSUUV)O>=*pK*x$4}B$C3;%!bbF2W<2N7u3g^_LrXSa z68&~3TO@%k1#aXk-&7_IC&_?i1hfPP)*ZE}(TQEcS_~58RN}?t@$Z;QL0Y`XmgeNk zSE%i}YUrpYtO|QB8_iOaKa_zHu2PM{HXcZKGN0AO%$PmU_PdnwGNkMpHbjFHbDOcQ zW>a<@WK5Y1GEaZL@J7AJA?IQUZ&fK(hOP1dwnbXoysNpO(Q`oza9Sz}FS4b@G^di3 z5RA&l+&;gufjDh0jCr32c~1K%e?I}e*nr6(2*56JwRCmy;RFj1UBWWGu7MijZ;tp}yubFwqgJ_} zvg;44PRxv59PO5TBex}si3b6lqd^(e!?eRDKjo?%hZrR$F(o1~d|OvIx>li1`Kb$d z;{h1j6jgg1*&$M3mz=ndnoXP2+c~3KguLex`+ip1bmlwf6s?#G*&C4LdDk`CKIhOw zT$XrV0qD|uLu1fIkStp-x6=0kV-?mVy4X;r&wNL9$!s`Fkb}7hd~&3$g4?ySBEJ+; zbNpQ36|ZRbsH)^V!dUXl&bj6Ef)TZz3zz2F#mrO=owEC@_~8++t^XSl^l0k2HNe#8 zFp>VlUuXc8yCPxwkno?ttS)B`@@bS=2<_s&c%1o{>jKv>s2bu#J%nMS#t~bPFVtm1 zDfl+zmv-I(t{vox87WR`mbufQD(qfIp0-hZAmE3_khkipl^HA7yGxr2Ml=8fI=3v+ zp+(P1rO82$1I$$*<*2II2_bW|aN$lY7aVwcQjK%T(+t1>qHImJ$+c^dS5NQ*R{*g5 zuew#riwE+CYFV4nK1zJ4g`}>~PA7^uNQx;l&wt8~N*kdw?}Exyf|*$XxpmAKiy2 z9)7kerUvYWn_ggEfh;Pmxj7BfMSPSFtrdxM$XoNIA>V^z^+esM#r!Yi+OZZ*JZKw>?w)~91fFR){z=*`t!y0x*3=5_X(|e8rv{s+L zvhe0-=#@%WSDF5XlN())jUmH}LOx0j_>e1F^qzk5N5}C<^F>+eoeCG?5vV=C&$ENL zn1&tR+s`iCN8K2q4!>YUR3IOMdd}6c=9GF|II9^8r=Homq5~W^jcV8l^7VKtorESv zF?S3>LW#h;5-lHp3MqS&RsH_@!tYYeCKc=HWyZjNn11l_^mQTDv_{3*wDl8fn`Q;p zM|vh;YegCCF`x?auAtd(*#;IfV7%MY5-HREYs@Qhi+|%wPiQJy$6L_<5VD{yunSL~ zzqB9UB&JWruI*{+DD+H-tQGCi)J<2qq_!l+bEyGr2TguF&uli!pg{54&5VwqvWagA zK||73$Zz(POG3bNrhAxi81hI}SqakR}JRu$%|Y;9)kQ5X%<8| z$Ya0qtU@^MVbOF_hrP}p{SITGYmvy$Q;wpAG^ruLsc8eIOui$b$PUEMTY=w~0NsF5 z=Yp=TjxAM(Or?&;LM!*E2Y@SqxOt(4L4XhpzehZ?rHaX=8SCnkTfk%N-~5G6C3us@cV`m1 zmp<@_-H8qHN6JP++mq&atBhlfAD40;qW`EX3r!imT^5S?0WU=0Jzco(^KbERT-P?Q z`_7TD!_rwho&8h*JpK8CjR}(j%?S?AS7~83sj+Maj2X%hZEA^F@xVN%{JMiw?+%sp z*0#!NJC=P;pwh1FVbY9jf#5LwGa-gw-J}Wnr;eoz3Z z0FO|YvuW(nuC7BkL;-Xo-y^A;wH1 z$KGUo<+cUWZ#oMCWG`*NGmpDW4XbJegb`@Ho@Jzr9i#oA34js+2_k;OfMTdk|B*}h zOsIywq8+9^7A`*!Munn>=+`OXCNh>3#uQTdo$)fod>dEA)a?d9cI1+m0CJn8JnGOqFWN&B9Z)il7q z%ve!$Ul)AM?KPww(!SA!;(1keU!BNHa5IVINYNfctD!wVN#2I*hsL??L!Xy*$jn0L zmg8{&!bFLCX@U6i60n@_lY7_<^myVh{GCuG_#COqlYWTF)k0Rm z!ScwGB0iuM=r?fesr(w^)>zqH!YSImHRZODb?J{sQ6S%a3v?gZL}nR5>!H_u`4_$#Hg4Ye-bXw#^b{fv^JS>syGm{7c*q{9soz?e-*@U6IL2RX@5Oeg( zqW+F=0me%tZ}4#}SiMs662}{sH4L>)vlOivcCWgmx~M8^*wD)Ow{NUviIO>c}Pjv&!G41=eu KpUXO@geCyPqIRYL diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 6508f74207cc3a45391a22e58c598a273d863c3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22474 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 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index d54716bfad547896ba03ea9230518d615477fba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30705 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 diff --git a/android/app/src/main/res/values-night/colors.xml b/android/app/src/main/res/values-night/colors.xml deleted file mode 100644 index 3c05de5be8..0000000000 --- a/android/app/src/main/res/values-night/colors.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml deleted file mode 100644 index f387b90114..0000000000 --- a/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - #ffffff - #ffffff - #023c69 - #ffffff - \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml deleted file mode 100644 index df5a65e008..0000000000 --- a/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - safe.mobileapp - contain - false - automatic - \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml deleted file mode 100644 index ab7cb49e78..0000000000 --- a/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/xml/network_security_config.xml b/android/app/src/main/res/xml/network_security_config.xml deleted file mode 100644 index c7755e76fa..0000000000 --- a/android/app/src/main/res/xml/network_security_config.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 10.0.2.2 - localhost - - \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index f4701946ba..0000000000 --- a/android/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext { - buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0' - minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24') - compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35') - targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') - kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.24' - - ndkVersion = "26.1.10909125" - } - 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" - -allprojects { - repositories { - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm - url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) - } - maven { - // Android JSC is installed from npm - url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist')) - } - - google() - maven { - url "$rootDir/../node_modules/detox/Detox-android" - } - mavenCentral() - maven { url 'https://www.jitpack.io' } - } -} diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index b6107a2f22..0000000000 --- a/android/gradle.properties +++ /dev/null @@ -1,59 +0,0 @@ -# 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 - -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true - -# Enable AAPT2 PNG crunching -android.enablePngCrunchInReleaseBuilds=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 - -# Enable GIF support in React Native images (~200 B increase) -expo.gif.enabled=true -# Enable webp support in React Native images (~85 KB increase) -expo.webp.enabled=true -# Enable animated webp support (~3.4 MB increase) -# Disabled by default because iOS doesn't support animated webp -expo.webp.animated=false - -# Enable network inspector -EX_DEV_CLIENT_NETWORK_INSPECTOR=true - -# Use legacy packaging to compress native libraries in the resulting APK. -expo.useLegacyPackaging=false diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e6441136f3d4ba8a0da8d277868979cfbc8ad796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43453 zcma&N1CXTcmMvW9vTb(Rwr$&4wr$(C?dmSu>@vG-+vuvg^_??!{yS%8zW-#zn-LkA z5&1^$^{lnmUON?}LBF8_K|(?T0Ra(xUH{($5eN!MR#ZihR#HxkUPe+_R8Cn`RRs(P z_^*#_XlXmGv7!4;*Y%p4nw?{bNp@UZHv1?Um8r6)Fei3p@ClJn0ECfg1hkeuUU@Or zDaPa;U3fE=3L}DooL;8f;P0ipPt0Z~9P0)lbStMS)ag54=uL9ia-Lm3nh|@(Y?B`; zx_#arJIpXH!U{fbCbI^17}6Ri*H<>OLR%c|^mh8+)*h~K8Z!9)DPf zR2h?lbDZQ`p9P;&DQ4F0sur@TMa!Y}S8irn(%d-gi0*WxxCSk*A?3lGh=gcYN?FGl z7D=Js!i~0=u3rox^eO3i@$0=n{K1lPNU zwmfjRVmLOCRfe=seV&P*1Iq=^i`502keY8Uy-WNPwVNNtJFx?IwAyRPZo2Wo1+S(xF37LJZ~%i)kpFQ3Fw=mXfd@>%+)RpYQLnr}B~~zoof(JVm^^&f zxKV^+3D3$A1G;qh4gPVjhrC8e(VYUHv#dy^)(RoUFM?o%W-EHxufuWf(l*@-l+7vt z=l`qmR56K~F|v<^Pd*p~1_y^P0P^aPC##d8+HqX4IR1gu+7w#~TBFphJxF)T$2WEa zxa?H&6=Qe7d(#tha?_1uQys2KtHQ{)Qco)qwGjrdNL7thd^G5i8Os)CHqc>iOidS} z%nFEDdm=GXBw=yXe1W-ShHHFb?Cc70+$W~z_+}nAoHFYI1MV1wZegw*0y^tC*s%3h zhD3tN8b=Gv&rj}!SUM6|ajSPp*58KR7MPpI{oAJCtY~JECm)*m_x>AZEu>DFgUcby z1Qaw8lU4jZpQ_$;*7RME+gq1KySGG#Wql>aL~k9tLrSO()LWn*q&YxHEuzmwd1?aAtI zBJ>P=&$=l1efe1CDU;`Fd+_;&wI07?V0aAIgc(!{a z0Jg6Y=inXc3^n!U0Atk`iCFIQooHqcWhO(qrieUOW8X(x?(RD}iYDLMjSwffH2~tB z)oDgNBLB^AJBM1M^c5HdRx6fBfka`(LD-qrlh5jqH~);#nw|iyp)()xVYak3;Ybik z0j`(+69aK*B>)e_p%=wu8XC&9e{AO4c~O1U`5X9}?0mrd*m$_EUek{R?DNSh(=br# z#Q61gBzEpmy`$pA*6!87 zSDD+=@fTY7<4A?GLqpA?Pb2z$pbCc4B4zL{BeZ?F-8`s$?>*lXXtn*NC61>|*w7J* z$?!iB{6R-0=KFmyp1nnEmLsA-H0a6l+1uaH^g%c(p{iT&YFrbQ$&PRb8Up#X3@Zsk zD^^&LK~111%cqlP%!_gFNa^dTYT?rhkGl}5=fL{a`UViaXWI$k-UcHJwmaH1s=S$4 z%4)PdWJX;hh5UoK?6aWoyLxX&NhNRqKam7tcOkLh{%j3K^4Mgx1@i|Pi&}<^5>hs5 zm8?uOS>%)NzT(%PjVPGa?X%`N2TQCKbeH2l;cTnHiHppPSJ<7y-yEIiC!P*ikl&!B z%+?>VttCOQM@ShFguHVjxX^?mHX^hSaO_;pnyh^v9EumqSZTi+#f&_Vaija0Q-e*| z7ulQj6Fs*bbmsWp{`auM04gGwsYYdNNZcg|ph0OgD>7O}Asn7^Z=eI>`$2*v78;sj-}oMoEj&@)9+ycEOo92xSyY344^ z11Hb8^kdOvbf^GNAK++bYioknrpdN>+u8R?JxG=!2Kd9r=YWCOJYXYuM0cOq^FhEd zBg2puKy__7VT3-r*dG4c62Wgxi52EMCQ`bKgf*#*ou(D4-ZN$+mg&7$u!! z-^+Z%;-3IDwqZ|K=ah85OLwkO zKxNBh+4QHh)u9D?MFtpbl)us}9+V!D%w9jfAMYEb>%$A;u)rrI zuBudh;5PN}_6J_}l55P3l_)&RMlH{m!)ai-i$g)&*M`eN$XQMw{v^r@-125^RRCF0 z^2>|DxhQw(mtNEI2Kj(;KblC7x=JlK$@78`O~>V!`|1Lm-^JR$-5pUANAnb(5}B}JGjBsliK4& zk6y(;$e&h)lh2)L=bvZKbvh@>vLlreBdH8No2>$#%_Wp1U0N7Ank!6$dFSi#xzh|( zRi{Uw%-4W!{IXZ)fWx@XX6;&(m_F%c6~X8hx=BN1&q}*( zoaNjWabE{oUPb!Bt$eyd#$5j9rItB-h*5JiNi(v^e|XKAj*8(k<5-2$&ZBR5fF|JA z9&m4fbzNQnAU}r8ab>fFV%J0z5awe#UZ|bz?Ur)U9bCIKWEzi2%A+5CLqh?}K4JHi z4vtM;+uPsVz{Lfr;78W78gC;z*yTch~4YkLr&m-7%-xc ztw6Mh2d>_iO*$Rd8(-Cr1_V8EO1f*^@wRoSozS) zy1UoC@pruAaC8Z_7~_w4Q6n*&B0AjOmMWa;sIav&gu z|J5&|{=a@vR!~k-OjKEgPFCzcJ>#A1uL&7xTDn;{XBdeM}V=l3B8fE1--DHjSaxoSjNKEM9|U9#m2<3>n{Iuo`r3UZp;>GkT2YBNAh|b z^jTq-hJp(ebZh#Lk8hVBP%qXwv-@vbvoREX$TqRGTgEi$%_F9tZES@z8Bx}$#5eeG zk^UsLBH{bc2VBW)*EdS({yw=?qmevwi?BL6*=12k9zM5gJv1>y#ML4!)iiPzVaH9% zgSImetD@dam~e>{LvVh!phhzpW+iFvWpGT#CVE5TQ40n%F|p(sP5mXxna+Ev7PDwA zamaV4m*^~*xV+&p;W749xhb_X=$|LD;FHuB&JL5?*Y2-oIT(wYY2;73<^#46S~Gx| z^cez%V7x$81}UWqS13Gz80379Rj;6~WdiXWOSsdmzY39L;Hg3MH43o*y8ibNBBH`(av4|u;YPq%{R;IuYow<+GEsf@R?=@tT@!}?#>zIIn0CoyV!hq3mw zHj>OOjfJM3F{RG#6ujzo?y32m^tgSXf@v=J$ELdJ+=5j|=F-~hP$G&}tDZsZE?5rX ztGj`!S>)CFmdkccxM9eGIcGnS2AfK#gXwj%esuIBNJQP1WV~b~+D7PJTmWGTSDrR` zEAu4B8l>NPuhsk5a`rReSya2nfV1EK01+G!x8aBdTs3Io$u5!6n6KX%uv@DxAp3F@{4UYg4SWJtQ-W~0MDb|j-$lwVn znAm*Pl!?Ps&3wO=R115RWKb*JKoexo*)uhhHBncEDMSVa_PyA>k{Zm2(wMQ(5NM3# z)jkza|GoWEQo4^s*wE(gHz?Xsg4`}HUAcs42cM1-qq_=+=!Gk^y710j=66(cSWqUe zklbm8+zB_syQv5A2rj!Vbw8;|$@C!vfNmNV!yJIWDQ>{+2x zKjuFX`~~HKG~^6h5FntRpnnHt=D&rq0>IJ9#F0eM)Y-)GpRjiN7gkA8wvnG#K=q{q z9dBn8_~wm4J<3J_vl|9H{7q6u2A!cW{bp#r*-f{gOV^e=8S{nc1DxMHFwuM$;aVI^ zz6A*}m8N-&x8;aunp1w7_vtB*pa+OYBw=TMc6QK=mbA-|Cf* zvyh8D4LRJImooUaSb7t*fVfih<97Gf@VE0|z>NcBwBQze);Rh!k3K_sfunToZY;f2 z^HmC4KjHRVg+eKYj;PRN^|E0>Gj_zagfRbrki68I^#~6-HaHg3BUW%+clM1xQEdPYt_g<2K+z!$>*$9nQ>; zf9Bei{?zY^-e{q_*|W#2rJG`2fy@{%6u0i_VEWTq$*(ZN37|8lFFFt)nCG({r!q#9 z5VK_kkSJ3?zOH)OezMT{!YkCuSSn!K#-Rhl$uUM(bq*jY? zi1xbMVthJ`E>d>(f3)~fozjg^@eheMF6<)I`oeJYx4*+M&%c9VArn(OM-wp%M<-`x z7sLP1&3^%Nld9Dhm@$3f2}87!quhI@nwd@3~fZl_3LYW-B?Ia>ui`ELg z&Qfe!7m6ze=mZ`Ia9$z|ARSw|IdMpooY4YiPN8K z4B(ts3p%2i(Td=tgEHX z0UQ_>URBtG+-?0E;E7Ld^dyZ;jjw0}XZ(}-QzC6+NN=40oDb2^v!L1g9xRvE#@IBR zO!b-2N7wVfLV;mhEaXQ9XAU+>=XVA6f&T4Z-@AX!leJ8obP^P^wP0aICND?~w&NykJ#54x3_@r7IDMdRNy4Hh;h*!u(Ol(#0bJdwEo$5437-UBjQ+j=Ic>Q2z` zJNDf0yO6@mr6y1#n3)s(W|$iE_i8r@Gd@!DWDqZ7J&~gAm1#~maIGJ1sls^gxL9LLG_NhU!pTGty!TbhzQnu)I*S^54U6Yu%ZeCg`R>Q zhBv$n5j0v%O_j{QYWG!R9W?5_b&67KB$t}&e2LdMvd(PxN6Ir!H4>PNlerpBL>Zvyy!yw z-SOo8caEpDt(}|gKPBd$qND5#a5nju^O>V&;f890?yEOfkSG^HQVmEbM3Ugzu+UtH zC(INPDdraBN?P%kE;*Ae%Wto&sgw(crfZ#Qy(<4nk;S|hD3j{IQRI6Yq|f^basLY; z-HB&Je%Gg}Jt@={_C{L$!RM;$$|iD6vu#3w?v?*;&()uB|I-XqEKqZPS!reW9JkLewLb!70T7n`i!gNtb1%vN- zySZj{8-1>6E%H&=V}LM#xmt`J3XQoaD|@XygXjdZ1+P77-=;=eYpoEQ01B@L*a(uW zrZeZz?HJsw_4g0vhUgkg@VF8<-X$B8pOqCuWAl28uB|@r`19DTUQQsb^pfqB6QtiT z*`_UZ`fT}vtUY#%sq2{rchyfu*pCg;uec2$-$N_xgjZcoumE5vSI{+s@iLWoz^Mf; zuI8kDP{!XY6OP~q5}%1&L}CtfH^N<3o4L@J@zg1-mt{9L`s^z$Vgb|mr{@WiwAqKg zp#t-lhrU>F8o0s1q_9y`gQNf~Vb!F%70f}$>i7o4ho$`uciNf=xgJ>&!gSt0g;M>*x4-`U)ysFW&Vs^Vk6m%?iuWU+o&m(2Jm26Y(3%TL; zA7T)BP{WS!&xmxNw%J=$MPfn(9*^*TV;$JwRy8Zl*yUZi8jWYF>==j~&S|Xinsb%c z2?B+kpet*muEW7@AzjBA^wAJBY8i|#C{WtO_or&Nj2{=6JTTX05}|H>N2B|Wf!*3_ z7hW*j6p3TvpghEc6-wufFiY!%-GvOx*bZrhZu+7?iSrZL5q9}igiF^*R3%DE4aCHZ zqu>xS8LkW+Auv%z-<1Xs92u23R$nk@Pk}MU5!gT|c7vGlEA%G^2th&Q*zfg%-D^=f z&J_}jskj|Q;73NP4<4k*Y%pXPU2Thoqr+5uH1yEYM|VtBPW6lXaetokD0u z9qVek6Q&wk)tFbQ8(^HGf3Wp16gKmr>G;#G(HRBx?F`9AIRboK+;OfHaLJ(P>IP0w zyTbTkx_THEOs%Q&aPrxbZrJlio+hCC_HK<4%f3ZoSAyG7Dn`=X=&h@m*|UYO-4Hq0 z-Bq&+Ie!S##4A6OGoC~>ZW`Y5J)*ouaFl_e9GA*VSL!O_@xGiBw!AF}1{tB)z(w%c zS1Hmrb9OC8>0a_$BzeiN?rkPLc9%&;1CZW*4}CDDNr2gcl_3z+WC15&H1Zc2{o~i) z)LLW=WQ{?ricmC`G1GfJ0Yp4Dy~Ba;j6ZV4r{8xRs`13{dD!xXmr^Aga|C=iSmor% z8hi|pTXH)5Yf&v~exp3o+sY4B^^b*eYkkCYl*T{*=-0HniSA_1F53eCb{x~1k3*`W zr~};p1A`k{1DV9=UPnLDgz{aJH=-LQo<5%+Em!DNN252xwIf*wF_zS^!(XSm(9eoj z=*dXG&n0>)_)N5oc6v!>-bd(2ragD8O=M|wGW z!xJQS<)u70m&6OmrF0WSsr@I%T*c#Qo#Ha4d3COcX+9}hM5!7JIGF>7<~C(Ear^Sn zm^ZFkV6~Ula6+8S?oOROOA6$C&q&dp`>oR-2Ym3(HT@O7Sd5c~+kjrmM)YmgPH*tL zX+znN>`tv;5eOfX?h{AuX^LK~V#gPCu=)Tigtq9&?7Xh$qN|%A$?V*v=&-2F$zTUv z`C#WyIrChS5|Kgm_GeudCFf;)!WH7FI60j^0o#65o6`w*S7R@)88n$1nrgU(oU0M9 zx+EuMkC>(4j1;m6NoGqEkpJYJ?vc|B zOlwT3t&UgL!pX_P*6g36`ZXQ; z9~Cv}ANFnJGp(;ZhS(@FT;3e)0)Kp;h^x;$*xZn*k0U6-&FwI=uOGaODdrsp-!K$Ac32^c{+FhI-HkYd5v=`PGsg%6I`4d9Jy)uW0y%) zm&j^9WBAp*P8#kGJUhB!L?a%h$hJgQrx!6KCB_TRo%9{t0J7KW8!o1B!NC)VGLM5! zpZy5Jc{`r{1e(jd%jsG7k%I+m#CGS*BPA65ZVW~fLYw0dA-H_}O zrkGFL&P1PG9p2(%QiEWm6x;U-U&I#;Em$nx-_I^wtgw3xUPVVu zqSuKnx&dIT-XT+T10p;yjo1Y)z(x1fb8Dzfn8e yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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 '} - 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 -' "$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=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# 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, 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" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# 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/android/gradlew.bat b/android/gradlew.bat deleted file mode 100644 index 9b42019c79..0000000000 --- a/android/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@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=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -: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/android/react-settings-plugin/build.gradle.kts b/android/react-settings-plugin/build.gradle.kts deleted file mode 100644 index b4f6668e9e..0000000000 --- a/android/react-settings-plugin/build.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -plugins { - kotlin("jvm") version "1.9.24" - id("java-gradle-plugin") -} - -repositories { - mavenCentral() -} - -gradlePlugin { - plugins { - create("reactSettingsPlugin") { - id = "com.facebook.react.settings" - implementationClass = "expo.plugins.ReactSettingsPlugin" - } - } -} diff --git a/android/react-settings-plugin/src/main/kotlin/expo/plugins/ReactSettingsPlugin.kt b/android/react-settings-plugin/src/main/kotlin/expo/plugins/ReactSettingsPlugin.kt deleted file mode 100644 index c54f6c7a6a..0000000000 --- a/android/react-settings-plugin/src/main/kotlin/expo/plugins/ReactSettingsPlugin.kt +++ /dev/null @@ -1,10 +0,0 @@ -package expo.plugins - -import org.gradle.api.Plugin -import org.gradle.api.initialization.Settings - -class ReactSettingsPlugin : Plugin { - override fun apply(settings: Settings) { - // Do nothing, just register the plugin. - } -} diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index c0495954ba..0000000000 --- a/android/settings.gradle +++ /dev/null @@ -1,38 +0,0 @@ -pluginManagement { - includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile().toString()) -} -plugins { id("com.facebook.react.settings") } - -extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> - if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') { - ex.autolinkLibrariesFromCommand() - } else { - def command = [ - 'node', - '--no-warnings', - '--eval', - 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', - 'react-native-config', - '--json', - '--platform', - 'android' - ].toList() - ex.autolinkLibrariesFromCommand(command) - } -} - -rootProject.name = 'safe.mobileapp' - -dependencyResolutionManagement { - versionCatalogs { - reactAndroidLibs { - from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml"))) - } - } -} - -apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); -useExpoModules() - -include ':app' -includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile()) diff --git a/app.config.js b/app.config.js index 81fec38ca8..61a5402ec9 100644 --- a/app.config.js +++ b/app.config.js @@ -23,7 +23,7 @@ module.exports = { bundleIdentifier: 'global.safe.mobileapp', config: { usesNonExemptEncryption: false, - } + }, }, android: { adaptiveIcon: { @@ -45,7 +45,7 @@ module.exports = { fonts: ['./assets/fonts/safe-icons/safe-icons.ttf'], }, ], - ['./withDrawableAssets.js', './assets/drawable'], + ['./expo-plugins/withDrawableAssets.js', './assets/android/drawable'], ], experiments: { typedRoutes: true, diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 67f31e55b0..9810e0b327 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -11,6 +11,7 @@ export default function TabLayout() { options={{ header: AssetsNavbar, title: 'Home', + tabBarButtonTestID: 'tabHome', tabBarIcon: ({ color }) => , }} /> @@ -20,7 +21,7 @@ export default function TabLayout() { options={{ title: 'Transactions', headerShown: false, - tabBarButtonTestID: 'transactions', + tabBarButtonTestID: 'tabTransactions', tabBarIcon: ({ color }) => , }} /> @@ -31,6 +32,7 @@ export default function TabLayout() { return { title: 'Settings', headerShown: false, + tabBarButtonTestID: 'tabSettings', tabBarIcon: ({ color }) => , } }} diff --git a/android/app/src/main/res/drawable/baseline_arrow_outward_24.xml b/assets/android/drawable/baseline_arrow_outward_24.xml similarity index 100% rename from android/app/src/main/res/drawable/baseline_arrow_outward_24.xml rename to assets/android/drawable/baseline_arrow_outward_24.xml diff --git a/android/app/src/main/res/drawable/baseline_auto_awesome_motion_24.xml b/assets/android/drawable/baseline_auto_awesome_motion_24.xml similarity index 100% rename from android/app/src/main/res/drawable/baseline_auto_awesome_motion_24.xml rename to assets/android/drawable/baseline_auto_awesome_motion_24.xml diff --git a/android/app/src/main/res/drawable/baseline_create_24.xml b/assets/android/drawable/baseline_create_24.xml similarity index 100% rename from android/app/src/main/res/drawable/baseline_create_24.xml rename to assets/android/drawable/baseline_create_24.xml diff --git a/android/app/src/main/res/drawable/baseline_delete_24.xml b/assets/android/drawable/baseline_delete_24.xml similarity index 100% rename from android/app/src/main/res/drawable/baseline_delete_24.xml rename to assets/android/drawable/baseline_delete_24.xml diff --git a/android/app/src/main/res/drawable/baseline_explore_24.xml b/assets/android/drawable/baseline_explore_24.xml similarity index 100% rename from android/app/src/main/res/drawable/baseline_explore_24.xml rename to assets/android/drawable/baseline_explore_24.xml diff --git a/e2e/flow.yml b/e2e/flow.yml new file mode 100644 index 0000000000..17ff3b9220 --- /dev/null +++ b/e2e/flow.yml @@ -0,0 +1,13 @@ +appId: global.safe.mobileapp +--- +- launchApp +- tapOn: + id: "pending-transactions" +- tapOn: "(tabs)" +- tapOn: + id: "tabTransactions" +- "scroll" +- tapOn: + id: "tabSettings" +- assertVisible: "Signers" + diff --git a/e2e/jest.config.js b/e2e/jest.config.js deleted file mode 100644 index 3472f7161c..0000000000 --- a/e2e/jest.config.js +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('@jest/types').Config.InitialOptions} */ -module.exports = { - rootDir: '..', - testMatch: ['/e2e/**/*.test.js'], - testTimeout: 120000, - maxWorkers: 1, - globalSetup: 'detox/runners/jest/globalSetup', - globalTeardown: 'detox/runners/jest/globalTeardown', - reporters: ['detox/runners/jest/reporter'], - testEnvironment: 'detox/runners/jest/testEnvironment', - verbose: true, -} diff --git a/e2e/starter.test.js b/e2e/starter.test.js deleted file mode 100644 index 2ebda5266e..0000000000 --- a/e2e/starter.test.js +++ /dev/null @@ -1,18 +0,0 @@ -describe('Welcome', () => { - beforeAll(async () => { - await device.launchApp() - }) - - beforeEach(async () => { - await device.reloadReactNative() - }) - - it('should have welcome screen', async () => { - await expect(element(by.id('welcome-title'))).toBeVisible() - }) - - it('should show hello screen after tap', async () => { - await element(by.text('Explore')).tap() - await expect(element(by.id('explore-title'))).toBeVisible() - }) -}) diff --git a/e2e/transactions.test.js b/e2e/transactions.test.js deleted file mode 100644 index 96d3c86672..0000000000 --- a/e2e/transactions.test.js +++ /dev/null @@ -1,16 +0,0 @@ -describe('Transactions', () => { - beforeAll(async () => { - await device.launchApp() - }) - - beforeEach(async () => { - await device.reloadReactNative() - }) - - it('should navigate to transactions and be able to scroll', async () => { - await element(by.id('transactions')).tap() - await expect(element(by.text('History'))).toBeVisible() - await element(by.id('tx-history-list')).scroll(500, 'down') - await element(by.id('tx-history-list')).scroll(500, 'up') - }) -}) diff --git a/withDrawableAssets.js b/expo-plugins/withDrawableAssets.js similarity index 100% rename from withDrawableAssets.js rename to expo-plugins/withDrawableAssets.js diff --git a/ios/.gitignore b/ios/.gitignore deleted file mode 100644 index 8beb344303..0000000000 --- a/ios/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# 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 -project.xcworkspace -.xcode.env.local - -# Bundle artifacts -*.jsbundle - -# CocoaPods -/Pods/ diff --git a/ios/.xcode.env b/ios/.xcode.env deleted file mode 100644 index 3d5782c715..0000000000 --- a/ios/.xcode.env +++ /dev/null @@ -1,11 +0,0 @@ -# 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/ios/Podfile b/ios/Podfile deleted file mode 100644 index 5a8512b5a9..0000000000 --- a/ios/Podfile +++ /dev/null @@ -1,66 +0,0 @@ -require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") -require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") - -require 'json' -podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} - -ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' -ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] - -platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1' -install! 'cocoapods', - :deterministic_uuids => false - -prepare_react_native_project! - -target 'safemobileapp' do - use_expo_modules! - - if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1' - config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"]; - else - config_command = [ - 'node', - '--no-warnings', - '--eval', - 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', - 'react-native-config', - '--json', - '--platform', - 'ios' - ] - end - - config = use_native_modules!(config_command) - - use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] - use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] - - use_react_native!( - :path => config[:reactNativePath], - :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', - # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/..", - :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false', - ) - - post_install do |installer| - react_native_post_install( - installer, - config[:reactNativePath], - :mac_catalyst_enabled => false, - :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true', - ) - - # This is necessary for Xcode 14, because it signs resource bundles by default - # when building for devices. - installer.target_installation_results.pod_target_installation_results - .each do |pod_name, target_installation_result| - target_installation_result.resource_bundle_targets.each do |resource_bundle_target| - resource_bundle_target.build_configurations.each do |config| - config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' - end - end - end - end -end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index 280b2abb33..0000000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,2436 +0,0 @@ -PODS: - - boost (1.84.0) - - Burnt (0.12.2): - - ExpoModulesCore - - SPAlert (~> 4.2) - - SPIndicator (~> 1.6) - - DoubleConversion (1.1.6) - - EXConstants (17.0.3): - - ExpoModulesCore - - Expo (52.0.7): - - ExpoModulesCore - - ExpoAsset (11.0.1): - - ExpoModulesCore - - ExpoBlur (14.0.1): - - ExpoModulesCore - - ExpoFileSystem (18.0.3): - - ExpoModulesCore - - ExpoFont (13.0.1): - - ExpoModulesCore - - ExpoHead (4.0.6): - - ExpoModulesCore - - ExpoImage (2.0.1): - - ExpoModulesCore - - libavif/libdav1d - - SDWebImage (~> 5.19.1) - - SDWebImageAVIFCoder (~> 0.11.0) - - SDWebImageSVGCoder (~> 1.7.0) - - ExpoKeepAwake (14.0.1): - - ExpoModulesCore - - ExpoLinearGradient (14.0.1): - - ExpoModulesCore - - ExpoLinking (7.0.2): - - ExpoModulesCore - - ExpoModulesCore (2.0.3): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsinspector - - React-NativeModulesApple - - React-RCTAppDelegate - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - ExpoSplashScreen (0.29.11): - - ExpoModulesCore - - ExpoSystemUI (4.0.3): - - ExpoModulesCore - - ExpoWebBrowser (14.0.1): - - ExpoModulesCore - - FBLazyVector (0.76.2) - - fmt (9.1.0) - - glog (0.3.5) - - hermes-engine (0.76.2): - - hermes-engine/Pre-built (= 0.76.2) - - hermes-engine/Pre-built (0.76.2) - - libavif/core (0.11.1) - - libavif/libdav1d (0.11.1): - - libavif/core - - libdav1d (>= 0.6.0) - - libdav1d (1.2.0) - - RCT-Folly (2024.01.01.00): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - RCT-Folly/Default (= 2024.01.01.00) - - RCT-Folly/Default (2024.01.01.00): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - RCT-Folly/Fabric (2024.01.01.00): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - RCTDeprecation (0.76.2) - - RCTRequired (0.76.2) - - RCTTypeSafety (0.76.2): - - FBLazyVector (= 0.76.2) - - RCTRequired (= 0.76.2) - - React-Core (= 0.76.2) - - React (0.76.2): - - React-Core (= 0.76.2) - - React-Core/DevSupport (= 0.76.2) - - React-Core/RCTWebSocket (= 0.76.2) - - React-RCTActionSheet (= 0.76.2) - - React-RCTAnimation (= 0.76.2) - - React-RCTBlob (= 0.76.2) - - React-RCTImage (= 0.76.2) - - React-RCTLinking (= 0.76.2) - - React-RCTNetwork (= 0.76.2) - - React-RCTSettings (= 0.76.2) - - React-RCTText (= 0.76.2) - - React-RCTVibration (= 0.76.2) - - React-callinvoker (0.76.2) - - React-Core (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default (= 0.76.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/CoreModulesHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/Default (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/DevSupport (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default (= 0.76.2) - - React-Core/RCTWebSocket (= 0.76.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTActionSheetHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTAnimationHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTBlobHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTImageHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTLinkingHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTNetworkHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTSettingsHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTTextHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTVibrationHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTWebSocket (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default (= 0.76.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-CoreModules (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety (= 0.76.2) - - React-Core/CoreModulesHeaders (= 0.76.2) - - React-jsi (= 0.76.2) - - React-jsinspector - - React-NativeModulesApple - - React-RCTBlob - - React-RCTImage (= 0.76.2) - - ReactCodegen - - ReactCommon - - SocketRocket (= 0.7.1) - - React-cxxreact (0.76.2): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.76.2) - - React-debug (= 0.76.2) - - React-jsi (= 0.76.2) - - React-jsinspector - - React-logger (= 0.76.2) - - React-perflogger (= 0.76.2) - - React-runtimeexecutor (= 0.76.2) - - React-timing (= 0.76.2) - - React-debug (0.76.2) - - React-defaultsnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-domnativemodule - - React-Fabric - - React-featureflags - - React-featureflagsnativemodule - - React-graphics - - React-idlecallbacksnativemodule - - React-ImageManager - - React-microtasksnativemodule - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-domnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-FabricComponents - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/animations (= 0.76.2) - - React-Fabric/attributedstring (= 0.76.2) - - React-Fabric/componentregistry (= 0.76.2) - - React-Fabric/componentregistrynative (= 0.76.2) - - React-Fabric/components (= 0.76.2) - - React-Fabric/core (= 0.76.2) - - React-Fabric/dom (= 0.76.2) - - React-Fabric/imagemanager (= 0.76.2) - - React-Fabric/leakchecker (= 0.76.2) - - React-Fabric/mounting (= 0.76.2) - - React-Fabric/observers (= 0.76.2) - - React-Fabric/scheduler (= 0.76.2) - - React-Fabric/telemetry (= 0.76.2) - - React-Fabric/templateprocessor (= 0.76.2) - - React-Fabric/uimanager (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/animations (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.76.2) - - React-Fabric/components/root (= 0.76.2) - - React-Fabric/components/view (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric/core (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/dom (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/observers (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/observers/events (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - 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-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/uimanager/consistency (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-FabricComponents (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-FabricComponents/components (= 0.76.2) - - React-FabricComponents/textlayoutmanager (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.76.2) - - React-FabricComponents/components/iostextinput (= 0.76.2) - - React-FabricComponents/components/modal (= 0.76.2) - - React-FabricComponents/components/rncore (= 0.76.2) - - React-FabricComponents/components/safeareaview (= 0.76.2) - - React-FabricComponents/components/scrollview (= 0.76.2) - - React-FabricComponents/components/text (= 0.76.2) - - React-FabricComponents/components/textinput (= 0.76.2) - - React-FabricComponents/components/unimplementedview (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/inputaccessory (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/iostextinput (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/modal (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/rncore (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/safeareaview (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/scrollview (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/text (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/textinput (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/unimplementedview (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/textlayoutmanager (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricImage (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired (= 0.76.2) - - RCTTypeSafety (= 0.76.2) - - React-Fabric - - React-graphics - - React-ImageManager - - React-jsi - - React-jsiexecutor (= 0.76.2) - - React-logger - - React-rendererdebug - - React-utils - - ReactCommon - - Yoga - - React-featureflags (0.76.2) - - React-featureflagsnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-graphics (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-jsi - - React-jsiexecutor - - React-utils - - React-hermes (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-cxxreact (= 0.76.2) - - React-jsi - - React-jsiexecutor (= 0.76.2) - - React-jsinspector - - React-perflogger (= 0.76.2) - - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-ImageManager (0.76.2): - - glog - - RCT-Folly/Fabric - - React-Core/Default - - React-debug - - React-Fabric - - React-graphics - - React-rendererdebug - - React-utils - - React-jserrorhandler (0.76.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-cxxreact - - React-debug - - React-jsi - - React-jsi (0.76.2): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-jsiexecutor (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-cxxreact (= 0.76.2) - - React-jsi (= 0.76.2) - - React-jsinspector - - React-perflogger (= 0.76.2) - - React-jsinspector (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-featureflags - - React-jsi - - React-perflogger (= 0.76.2) - - React-runtimeexecutor (= 0.76.2) - - React-jsitracing (0.76.2): - - React-jsi - - React-logger (0.76.2): - - glog - - React-Mapbuffer (0.76.2): - - glog - - React-debug - - React-microtasksnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-menu (1.1.6): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-mmkv (3.1.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-pager-view (6.4.1): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - react-native-pager-view/common (= 6.4.1) - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-pager-view/common (6.4.1): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-safe-area-context (4.12.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - react-native-safe-area-context/common (= 4.12.0) - - react-native-safe-area-context/fabric (= 4.12.0) - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-safe-area-context/common (4.12.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-safe-area-context/fabric (4.12.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - react-native-safe-area-context/common - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-slider (4.5.5): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - react-native-slider/common (= 4.5.5) - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-slider/common (4.5.5): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-nativeconfig (0.76.2) - - React-NativeModulesApple (0.76.2): - - glog - - hermes-engine - - React-callinvoker - - React-Core - - React-cxxreact - - React-jsi - - React-jsinspector - - React-runtimeexecutor - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-perflogger (0.76.2): - - DoubleConversion - - RCT-Folly (= 2024.01.01.00) - - React-performancetimeline (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - React-cxxreact - - React-timing - - React-RCTActionSheet (0.76.2): - - React-Core/RCTActionSheetHeaders (= 0.76.2) - - React-RCTAnimation (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety - - React-Core/RCTAnimationHeaders - - React-jsi - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - React-RCTAppDelegate (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-CoreModules - - React-debug - - React-defaultsnativemodule - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-nativeconfig - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-RCTNetwork - - React-rendererdebug - - React-RuntimeApple - - React-RuntimeCore - - React-RuntimeHermes - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon - - React-RCTBlob (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-Core/RCTBlobHeaders - - React-Core/RCTWebSocket - - React-jsi - - React-jsinspector - - React-NativeModulesApple - - React-RCTNetwork - - ReactCodegen - - ReactCommon - - React-RCTFabric (0.76.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-Core - - React-debug - - React-Fabric - - React-FabricComponents - - React-FabricImage - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-jsinspector - - React-nativeconfig - - React-performancetimeline - - React-RCTImage - - React-RCTText - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - Yoga - - React-RCTImage (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety - - React-Core/RCTImageHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTNetwork - - ReactCodegen - - ReactCommon - - React-RCTLinking (0.76.2): - - React-Core/RCTLinkingHeaders (= 0.76.2) - - React-jsi (= 0.76.2) - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - ReactCommon/turbomodule/core (= 0.76.2) - - React-RCTNetwork (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety - - React-Core/RCTNetworkHeaders - - React-jsi - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - React-RCTSettings (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety - - React-Core/RCTSettingsHeaders - - React-jsi - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - React-RCTText (0.76.2): - - React-Core/RCTTextHeaders (= 0.76.2) - - Yoga - - React-RCTVibration (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - React-Core/RCTVibrationHeaders - - React-jsi - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - React-rendererconsistency (0.76.2) - - React-rendererdebug (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - RCT-Folly (= 2024.01.01.00) - - React-debug - - React-rncore (0.76.2) - - React-RuntimeApple (0.76.2): - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-callinvoker - - React-Core/Default - - React-CoreModules - - React-cxxreact - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-Mapbuffer - - React-NativeModulesApple - - React-RCTFabric - - React-RuntimeCore - - React-runtimeexecutor - - React-RuntimeHermes - - React-runtimescheduler - - React-utils - - React-RuntimeCore (0.76.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-cxxreact - - React-featureflags - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-performancetimeline - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - React-runtimeexecutor (0.76.2): - - React-jsi (= 0.76.2) - - React-RuntimeHermes (0.76.2): - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-featureflags - - React-hermes - - React-jsi - - React-jsinspector - - React-jsitracing - - React-nativeconfig - - React-RuntimeCore - - React-utils - - React-runtimescheduler (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker - - React-cxxreact - - React-debug - - React-featureflags - - React-jsi - - React-performancetimeline - - React-rendererconsistency - - React-rendererdebug - - React-runtimeexecutor - - React-timing - - React-utils - - React-timing (0.76.2) - - React-utils (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-debug - - React-jsi (= 0.76.2) - - ReactCodegen (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-FabricImage - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - ReactCommon (0.76.2): - - ReactCommon/turbomodule (= 0.76.2) - - ReactCommon/turbomodule (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.76.2) - - React-cxxreact (= 0.76.2) - - React-jsi (= 0.76.2) - - React-logger (= 0.76.2) - - React-perflogger (= 0.76.2) - - ReactCommon/turbomodule/bridging (= 0.76.2) - - ReactCommon/turbomodule/core (= 0.76.2) - - ReactCommon/turbomodule/bridging (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.76.2) - - React-cxxreact (= 0.76.2) - - React-jsi (= 0.76.2) - - React-logger (= 0.76.2) - - React-perflogger (= 0.76.2) - - ReactCommon/turbomodule/core (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.76.2) - - React-cxxreact (= 0.76.2) - - React-debug (= 0.76.2) - - React-featureflags (= 0.76.2) - - React-jsi (= 0.76.2) - - React-logger (= 0.76.2) - - React-perflogger (= 0.76.2) - - React-utils (= 0.76.2) - - RNCAsyncStorage (1.23.1): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNCClipboard (1.15.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNDateTimePicker (8.2.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNGestureHandler (2.20.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNReanimated (3.16.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 3.16.2) - - RNReanimated/worklets (= 3.16.2) - - Yoga - - RNReanimated/reanimated (3.16.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 3.16.2) - - Yoga - - RNReanimated/reanimated/apple (3.16.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNReanimated/worklets (3.16.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNScreens (4.1.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNScreens/common (= 4.1.0) - - Yoga - - RNScreens/common (4.1.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNSVG (15.8.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNSVG/common (= 15.8.0) - - Yoga - - RNSVG/common (15.8.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - SDWebImage (5.19.7): - - SDWebImage/Core (= 5.19.7) - - SDWebImage/Core (5.19.7) - - SDWebImageAVIFCoder (0.11.0): - - libavif/core (>= 0.11.0) - - SDWebImage (~> 5.10) - - SDWebImageSVGCoder (1.7.0): - - SDWebImage/Core (~> 5.6) - - SocketRocket (0.7.1) - - SPAlert (4.2.0) - - SPIndicator (1.6.4) - - Yoga (0.0.0) - -DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - - Burnt (from `../node_modules/burnt/ios`) - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - EXConstants (from `../node_modules/expo-constants/ios`) - - Expo (from `../node_modules/expo`) - - ExpoAsset (from `../node_modules/expo-asset/ios`) - - ExpoBlur (from `../node_modules/expo-blur/ios`) - - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - - ExpoFont (from `../node_modules/expo-font/ios`) - - ExpoHead (from `../node_modules/expo-router/ios`) - - ExpoImage (from `../node_modules/expo-image/ios`) - - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) - - ExpoLinearGradient (from `../node_modules/expo-linear-gradient/ios`) - - ExpoLinking (from `../node_modules/expo-linking/ios`) - - ExpoModulesCore (from `../node_modules/expo-modules-core`) - - ExpoSplashScreen (from `../node_modules/expo-splash-screen/ios`) - - ExpoSystemUI (from `../node_modules/expo-system-ui/ios`) - - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) - - 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`) - - RCT-Folly/Fabric (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-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-menu (from `../node_modules/@react-native-menu/menu`)" - - react-native-mmkv (from `../node_modules/react-native-mmkv`) - - react-native-pager-view (from `../node_modules/react-native-pager-view`) - - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) - - "react-native-slider (from `../node_modules/@react-native-community/slider`)" - - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) - - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - - 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-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-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-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-rncore (from `../node_modules/react-native/ReactCommon`) - - 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`) - - 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`)" - - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" - - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - - RNReanimated (from `../node_modules/react-native-reanimated`) - - RNScreens (from `../node_modules/react-native-screens`) - - RNSVG (from `../node_modules/react-native-svg`) - - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) - -SPEC REPOS: - trunk: - - libavif - - libdav1d - - SDWebImage - - SDWebImageAVIFCoder - - SDWebImageSVGCoder - - SocketRocket - - SPAlert - - SPIndicator - -EXTERNAL SOURCES: - boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" - Burnt: - :path: "../node_modules/burnt/ios" - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" - EXConstants: - :path: "../node_modules/expo-constants/ios" - Expo: - :path: "../node_modules/expo" - ExpoAsset: - :path: "../node_modules/expo-asset/ios" - ExpoBlur: - :path: "../node_modules/expo-blur/ios" - ExpoFileSystem: - :path: "../node_modules/expo-file-system/ios" - ExpoFont: - :path: "../node_modules/expo-font/ios" - ExpoHead: - :path: "../node_modules/expo-router/ios" - ExpoImage: - :path: "../node_modules/expo-image/ios" - ExpoKeepAwake: - :path: "../node_modules/expo-keep-awake/ios" - ExpoLinearGradient: - :path: "../node_modules/expo-linear-gradient/ios" - ExpoLinking: - :path: "../node_modules/expo-linking/ios" - ExpoModulesCore: - :path: "../node_modules/expo-modules-core" - ExpoSplashScreen: - :path: "../node_modules/expo-splash-screen/ios" - ExpoSystemUI: - :path: "../node_modules/expo-system-ui/ios" - ExpoWebBrowser: - :path: "../node_modules/expo-web-browser/ios" - 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-2024-11-12-RNv0.76.2-5b4aa20c719830dcf5684832b89a6edb95ac3d64 - 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-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-menu: - :path: "../node_modules/@react-native-menu/menu" - react-native-mmkv: - :path: "../node_modules/react-native-mmkv" - react-native-pager-view: - :path: "../node_modules/react-native-pager-view" - react-native-safe-area-context: - :path: "../node_modules/react-native-safe-area-context" - react-native-slider: - :path: "../node_modules/@react-native-community/slider" - React-nativeconfig: - :path: "../node_modules/react-native/ReactCommon" - React-NativeModulesApple: - :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" - 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-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-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-rendererdebug: - :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" - React-rncore: - :path: "../node_modules/react-native/ReactCommon" - 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" - 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" - RNDateTimePicker: - :path: "../node_modules/@react-native-community/datetimepicker" - RNGestureHandler: - :path: "../node_modules/react-native-gesture-handler" - RNReanimated: - :path: "../node_modules/react-native-reanimated" - 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: 1dca942403ed9342f98334bf4c3621f011aa7946 - Burnt: e3a3397e26172fca31a59bb27421475a58068836 - DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 - EXConstants: 277129d9a42ba2cf1fad375e7eaa9939005c60be - Expo: 0036dbc379382e2e039898c944ab01dba3a1abb5 - ExpoAsset: 6f7a8887cbb9fb39fdb0808e7f6f74ba0e1ae9b6 - ExpoBlur: 2b92367da8158eeaee9bfa940d82512a09c8e0c6 - ExpoFileSystem: 7265de9e7b7050c494f92332110818381f832606 - ExpoFont: 12b0217e42ac97029d0f317f0486039a8508cf52 - ExpoHead: bef002012f34e4859531bdc25902bd64fea098d8 - ExpoImage: d2046d80eec1ab7981c1b2123065e2a711168468 - ExpoKeepAwake: 22173f45d767c7d37403fdf48292726901d69ce7 - ExpoLinearGradient: 18148bd38f98fa0229c1f9df23393b32ab6d2d32 - ExpoLinking: ff40f710843188087fe60c37d710d49708eab4c8 - ExpoModulesCore: d7e806e5ca2f2ed5c2a47dcda16546362de828f2 - ExpoSplashScreen: 46129900c20ab3c48e6ceac9b04b410a1f6bb585 - ExpoSystemUI: ba85687bad99292492410057073047b9b5cb5010 - ExpoWebBrowser: b658ba8a9161f1b54afb279591cfce2cb73330fa - FBLazyVector: bc70dcb22ad30ce734a7cce7210791dc737e230f - fmt: 10c6e61f4be25dc963c36bd73fc7b1705fe975be - glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a - hermes-engine: 3852e37f6158a2fcfad23e31215ed495da3a6a40 - libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 - libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f - RCT-Folly: 84578c8756030547307e4572ab1947de1685c599 - RCTDeprecation: d575d28132f93e5deef4849d5afffb4ac4e63226 - RCTRequired: e2e5df1df76aac8685aabfebca389e6bec64792b - RCTTypeSafety: 30e36ceafa26979860e13fb3f234fb61692924c2 - React: 10ad41b51f981992714011b6a4e081234c28dc2e - React-callinvoker: 58b51494f8b2cca07a27fc6f69273239c30a1e70 - React-Core: 7a5e9897daf0189c0233b25243d6704e5b9025d8 - React-CoreModules: 09d4f4ddd85ce9301c4b06dfe68750a82ee4b4f5 - React-cxxreact: 29bfe097a993c73a314f569998fe863eb6fb8a18 - React-debug: 252c723eb205cc508aa9690a16dff46293c30ed8 - React-defaultsnativemodule: f32fc96c2787aa5548a2438f9c9d39df30457529 - React-domnativemodule: 409bb66e48c19997551f7e5adc0e4402adf3e5e8 - React-Fabric: 7214dbd96d80c2c5871e3940b2a922ae4ff7a66d - React-FabricComponents: 4b46303dad5862b2c132494c6933d70e8b2b5271 - React-FabricImage: ac6e46b8d6e12deb20887684c8cd1b60d573c738 - React-featureflags: 7dc483869b3a940dcd92c7942c5e3492ad6afe68 - React-featureflagsnativemodule: 2e65d2c94448d588a605de0d2aadce9c39c7ce31 - React-graphics: 52ca86af6628cb95cc472b2f0f7c42018906881d - React-hermes: ab8705477c497a5839966bd57471ee3611f864f8 - React-idlecallbacksnativemodule: ad29fb45bc50ebbbbb6a08a93e25909f65e2ca12 - React-ImageManager: 68a1bc3ba2c11eb01b01ebbd1e682fa265b6dc2e - React-jserrorhandler: 8bc8fc6c85c743af48143d693a8d661cb23bc96d - React-jsi: de2c6119671b281671fabf9e96eb11110207fe9d - React-jsiexecutor: 936132921f4d991af7b4faa7424fc54e67791dd0 - React-jsinspector: adc8764a6d2a331c20f42db9192f348b3f8050fa - React-jsitracing: 3f04035f1a39efe206056c4a28b725673c2e696b - React-logger: addd140841248966c2547eb94836399cc1061f4d - React-Mapbuffer: 029b5332e78af8c67c4b5e65edfc717068b8eac1 - React-microtasksnativemodule: f30949ee318ba90b9668de1e325b98838b9a4da2 - react-native-menu: 2ae57ae345762db416ee7c44ece7f39955675fe9 - react-native-mmkv: eca12be5e3400be2d995a2edaa3c6c2e67b5e3ec - react-native-pager-view: ddcdfa41b65930c9c648ff715a4afa1bb0c2358d - react-native-safe-area-context: 0f16e24dc808e9f0ced17f2bdcec692b2376fb68 - react-native-slider: d1a9121980fc81678c6d30b82f312c778fba563c - React-nativeconfig: 470fce6d871c02dc5eff250a362d56391b7f52d6 - React-NativeModulesApple: 1586448c61a7c2bd4040cc03ccde66a72037e77e - React-perflogger: c8860eaab4fe60d628b27bf0086a372c429fc74f - React-performancetimeline: 94e04b2067bc774df42ced96c8c3582fba9d7f88 - React-RCTActionSheet: 2eb26cbf384f3d3b2cb2e23be850a956d83f77ab - React-RCTAnimation: aa0a663829963ca72f4c722e71bd5debbecc1348 - React-RCTAppDelegate: 12688b64e1e28e0eb1c628690678ae5d3ab356b4 - React-RCTBlob: bef788ef3433170f9748d0e00d1afc7be64bc51d - React-RCTFabric: f1ce02d6fecbf5266bfafa228eed179ed2c182e7 - React-RCTImage: a9de66d305fa02008759a2aa5a723b68d18907e5 - React-RCTLinking: 15fe8ccad84a4a5274d55b9d43e223896718772d - React-RCTNetwork: 7635ab6b7617648e5b5e35cdb3a4edab6fa309a6 - React-RCTSettings: 18e666705ea62aac59f2a8d50ced87b9b8902c7b - React-RCTText: 5cf76f649b4781362d23f9ee3d52e8d12a74dd18 - React-RCTVibration: bd72dc267866c8cd524c9a61d15060949ff24cf9 - React-rendererconsistency: b389e324712bf0869529823216e922836ed9b737 - React-rendererdebug: 6b5dcd3797ec96001304e6bfaae408fa4f3ce3f3 - React-rncore: 2cf6b2348ee5d5431c4735180364b207ecf47123 - React-RuntimeApple: cb6e7f3e8911da8ebfdd3b0e7776c1db656c7f6b - React-RuntimeCore: b6213eb42011ecc9a97060f8714d8d57b97775c4 - React-runtimeexecutor: 69e27948ee2127400297c7de50b809a7cd127a15 - React-RuntimeHermes: 3a974aa24b83a7a0396edb35cb333c1d744563e0 - React-runtimescheduler: 567b00b76261df4a791ea37eb076c1c496c08ac2 - React-timing: 97673939f96f79031d2a5a0a92285618475149ec - React-utils: c8c0c746031419a29cfd8c72a394fdeac0684a84 - ReactCodegen: a64e8f3a8bba0ecf88fce06c2874e021d55148f3 - ReactCommon: 7b9403030ff3430ccffed63cd25c8aeab2a3ea7e - RNCAsyncStorage: ff8f69859448bde50f1c25d3e7eb37555fed33ab - RNCClipboard: 356f0acf1d62d41398269d5f47b1d950c2a593fe - RNDateTimePicker: 9ec036a62ad0f5a2d04c1c7829338e87b4e423e7 - RNGestureHandler: 16ef3dc2d7ecb09f240f25df5255953c4098819b - RNReanimated: 01d743d77838211eeec6bb9fbee99458b0bcf857 - RNScreens: 1b1282f5fd21119667bb361d736d4edaca3c35e0 - RNSVG: 030717ff82ea8f2117347c2fcf52a2d1eafba9ba - SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3 - SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90 - SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c - SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - SPAlert: 735da1f16a887e294719217572ce1f936d8c8782 - SPIndicator: 93e0a4fb23de51294ac48e874c0f081a5e293e4f - Yoga: 96872ee462cfc43866ad013c8160d4ff6b85709b - -PODFILE CHECKSUM: e5f3b6715986e511457ef689bead97e5b5a08273 - -COCOAPODS: 1.15.2 diff --git a/ios/Podfile.properties.json b/ios/Podfile.properties.json deleted file mode 100644 index 417e2e5ab4..0000000000 --- a/ios/Podfile.properties.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "expo.jsEngine": "hermes", - "EX_DEV_CLIENT_NETWORK_INSPECTOR": "true", - "newArchEnabled": "true" -} diff --git a/ios/safemobileapp.xcodeproj/project.pbxproj b/ios/safemobileapp.xcodeproj/project.pbxproj deleted file mode 100644 index 1ab4076f07..0000000000 --- a/ios/safemobileapp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,578 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; - 87DFB8EED400425FB02CE3E7 /* safe-icons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BB28408C904B48088BE6E7AC /* safe-icons.ttf */; }; - 89B579F96C9D4FEFAA3B14F0 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91904C16D02E4B1CB8DA3C01 /* noop-file.swift */; }; - 96905EF65AED1B983A6B3ABC /* libPods-safemobileapp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-safemobileapp.a */; }; - B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; - BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; - FEB0C1336BF0B3C5564DF87E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 4B458A06FD57039F81921E1F /* PrivacyInfo.xcprivacy */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 13B07F961A680F5B00A75B9A /* safemobileapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = safemobileapp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = safemobileapp/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = safemobileapp/AppDelegate.mm; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = safemobileapp/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = safemobileapp/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = safemobileapp/main.m; sourceTree = ""; }; - 4B458A06FD57039F81921E1F /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = safemobileapp/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-safemobileapp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-safemobileapp.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6C2E3173556A471DD304B334 /* Pods-safemobileapp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-safemobileapp.debug.xcconfig"; path = "Target Support Files/Pods-safemobileapp/Pods-safemobileapp.debug.xcconfig"; sourceTree = ""; }; - 7A4D352CD337FB3A3BF06240 /* Pods-safemobileapp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-safemobileapp.release.xcconfig"; path = "Target Support Files/Pods-safemobileapp/Pods-safemobileapp.release.xcconfig"; sourceTree = ""; }; - 91904C16D02E4B1CB8DA3C01 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "safemobileapp/noop-file.swift"; sourceTree = ""; }; - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = safemobileapp/SplashScreen.storyboard; sourceTree = ""; }; - BB28408C904B48088BE6E7AC /* safe-icons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "safe-icons.ttf"; path = "../assets/fonts/safe-icons/safe-icons.ttf"; sourceTree = ""; }; - BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; - E49B90EB375041F1A5D3E653 /* safemobileapp-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "safemobileapp-Bridging-Header.h"; path = "safemobileapp/safemobileapp-Bridging-Header.h"; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-safemobileapp/ExpoModulesProvider.swift"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 96905EF65AED1B983A6B3ABC /* libPods-safemobileapp.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0C3FCFFE722C49D39909FAB1 /* Resources */ = { - isa = PBXGroup; - children = ( - BB28408C904B48088BE6E7AC /* safe-icons.ttf */, - ); - name = Resources; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* safemobileapp */ = { - isa = PBXGroup; - children = ( - BB2F792B24A3F905000567C9 /* Supporting */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.mm */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB71A68108700A75B9A /* main.m */, - AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, - 91904C16D02E4B1CB8DA3C01 /* noop-file.swift */, - E49B90EB375041F1A5D3E653 /* safemobileapp-Bridging-Header.h */, - 4B458A06FD57039F81921E1F /* PrivacyInfo.xcprivacy */, - ); - name = safemobileapp; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-safemobileapp.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* safemobileapp */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - D65327D7A22EEC0BE12398D9 /* Pods */, - D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, - 0C3FCFFE722C49D39909FAB1 /* Resources */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* safemobileapp.app */, - ); - name = Products; - sourceTree = ""; - }; - 92DBD88DE9BF7D494EA9DA96 /* safemobileapp */ = { - isa = PBXGroup; - children = ( - FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, - ); - name = safemobileapp; - sourceTree = ""; - }; - BB2F792B24A3F905000567C9 /* Supporting */ = { - isa = PBXGroup; - children = ( - BB2F792C24A3F905000567C9 /* Expo.plist */, - ); - name = Supporting; - path = safemobileapp/Supporting; - sourceTree = ""; - }; - D65327D7A22EEC0BE12398D9 /* Pods */ = { - isa = PBXGroup; - children = ( - 6C2E3173556A471DD304B334 /* Pods-safemobileapp.debug.xcconfig */, - 7A4D352CD337FB3A3BF06240 /* Pods-safemobileapp.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { - isa = PBXGroup; - children = ( - 92DBD88DE9BF7D494EA9DA96 /* safemobileapp */, - ); - name = ExpoModulesProviders; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 13B07F861A680F5B00A75B9A /* safemobileapp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "safemobileapp" */; - buildPhases = ( - 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, - 6E0660BEB61296183ABEC2CE /* [Expo] Configure project */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, - B60CDFAD64732149C4D700A7 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = safemobileapp; - productName = safemobileapp; - productReference = 13B07F961A680F5B00A75B9A /* safemobileapp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1130; - TargetAttributes = { - 13B07F861A680F5B00A75B9A = { - LastSwiftMigration = 1250; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "safemobileapp" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* safemobileapp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, - 87DFB8EED400425FB02CE3E7 /* safe-icons.ttf in Resources */, - FEB0C1336BF0B3C5564DF87E /* PrivacyInfo.xcprivacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; - }; - 08A4A3CD28434E44B6B9DE2E /* [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-safemobileapp-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; - }; - 6E0660BEB61296183ABEC2CE /* [Expo] Configure project */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "[Expo] Configure project"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-safemobileapp/expo-configure-project.sh\"\n"; - }; - 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-safemobileapp/Pods-safemobileapp-resources.sh", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle", - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-safemobileapp/Pods-safemobileapp-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - B60CDFAD64732149C4D700A7 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-safemobileapp/Pods-safemobileapp-frameworks.sh", - "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-safemobileapp/Pods-safemobileapp-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, - 89B579F96C9D4FEFAA3B14F0 /* noop-file.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-safemobileapp.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = safemobileapp/safemobileapp.entitlements; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = MXRS32BBL4; - ENABLE_BITCODE = NO; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "FB_SONARKIT_ENABLED=1", - ); - INFOPLIST_FILE = safemobileapp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = global.safe.mobileapp; - PRODUCT_NAME = safemobileapp; - SWIFT_OBJC_BRIDGING_HEADER = "safemobileapp/safemobileapp-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-safemobileapp.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = safemobileapp/safemobileapp.entitlements; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = MXRS32BBL4; - INFOPLIST_FILE = safemobileapp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = global.safe.mobileapp; - PRODUCT_NAME = safemobileapp; - SWIFT_OBJC_BRIDGING_HEADER = "safemobileapp/safemobileapp-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CC = ""; - 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_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; - CXX = ""; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - 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 = 13.4; - LD = ""; - LDPLUSPLUS = ""; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - 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; - CC = ""; - 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_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; - CXX = ""; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - 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 = 13.4; - LD = ""; - LDPLUSPLUS = ""; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - 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 "safemobileapp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "safemobileapp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/ios/safemobileapp.xcodeproj/xcshareddata/xcschemes/safemobileapp.xcscheme b/ios/safemobileapp.xcodeproj/xcshareddata/xcschemes/safemobileapp.xcscheme deleted file mode 100644 index dcea7e3533..0000000000 --- a/ios/safemobileapp.xcodeproj/xcshareddata/xcschemes/safemobileapp.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/safemobileapp.xcworkspace/contents.xcworkspacedata b/ios/safemobileapp.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 8dc2431581..0000000000 --- a/ios/safemobileapp.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/ios/safemobileapp/AppDelegate.h b/ios/safemobileapp/AppDelegate.h deleted file mode 100644 index 1658a437eb..0000000000 --- a/ios/safemobileapp/AppDelegate.h +++ /dev/null @@ -1,7 +0,0 @@ -#import -#import -#import - -@interface AppDelegate : EXAppDelegateWrapper - -@end diff --git a/ios/safemobileapp/AppDelegate.mm b/ios/safemobileapp/AppDelegate.mm deleted file mode 100644 index b27f83286d..0000000000 --- a/ios/safemobileapp/AppDelegate.mm +++ /dev/null @@ -1,62 +0,0 @@ -#import "AppDelegate.h" - -#import -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.moduleName = @"main"; - - // You can add your custom initial props in the dictionary below. - // They will be passed down to the ViewController used by React Native. - self.initialProps = @{}; - - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [self bundleURL]; -} - -- (NSURL *)bundleURL -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -// Linking API -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { - return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; -} - -// Universal Links -- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { - BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; - return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken -{ - return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error -{ - return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; -} - -// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries -- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler -{ - return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; -} - -@end diff --git a/ios/safemobileapp/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/ios/safemobileapp/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png deleted file mode 100644 index 2732229faf0f150332a6f03c098d0bae8dc69ffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59468 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

p$Nf`sWhN9ZlZ}5n9H171I?`d6Jxm!1n;ow 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 J?wX%|{(mrMfIa{K diff --git a/ios/safemobileapp/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/safemobileapp/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 90d8d4c2a9..0000000000 --- a/ios/safemobileapp/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "images": [ - { - "filename": "App-Icon-1024x1024@1x.png", - "idiom": "universal", - "platform": "ios", - "size": "1024x1024" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/ios/safemobileapp/Images.xcassets/Contents.json b/ios/safemobileapp/Images.xcassets/Contents.json deleted file mode 100644 index ed285c2e5f..0000000000 --- a/ios/safemobileapp/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "expo" - } -} diff --git a/ios/safemobileapp/Images.xcassets/SplashScreen.imageset/Contents.json b/ios/safemobileapp/Images.xcassets/SplashScreen.imageset/Contents.json deleted file mode 100644 index 3cf8489772..0000000000 --- a/ios/safemobileapp/Images.xcassets/SplashScreen.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "filename": "image.png", - "scale": "1x" - }, - { - "idiom": "universal", - "scale": "2x" - }, - { - "idiom": "universal", - "scale": "3x" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/ios/safemobileapp/Images.xcassets/SplashScreen.imageset/image.png b/ios/safemobileapp/Images.xcassets/SplashScreen.imageset/image.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 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 diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenBackground.imageset/Contents.json b/ios/safemobileapp/Images.xcassets/SplashScreenBackground.imageset/Contents.json deleted file mode 100644 index 3cf8489772..0000000000 --- a/ios/safemobileapp/Images.xcassets/SplashScreenBackground.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "filename": "image.png", - "scale": "1x" - }, - { - "idiom": "universal", - "scale": "2x" - }, - { - "idiom": "universal", - "scale": "3x" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenBackground.imageset/image.png b/ios/safemobileapp/Images.xcassets/SplashScreenBackground.imageset/image.png deleted file mode 100644 index 33ddf20bb375ee42a98cb8a8c0952ba7f3ac62f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blZci7-kP61+AN(u~oWGg>p6AXe Q0tz#Dy85}Sb4q9e0EL(iEdT%j diff --git a/ios/safemobileapp/Info.plist b/ios/safemobileapp/Info.plist deleted file mode 100644 index 1b564e5f58..0000000000 --- a/ios/safemobileapp/Info.plist +++ /dev/null @@ -1,83 +0,0 @@ - - - - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - safe.mobileapp - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLSchemes - - myapp - global.safe.mobileapp - - - - CFBundleVersion - 1 - ITSAppUsesNonExemptEncryption - - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - NSAllowsLocalNetworking - - - NSUserActivityTypes - - $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route - - UIAppFonts - - safe-icons.ttf - - UILaunchStoryboardName - SplashScreen - UIRequiredDeviceCapabilities - - arm64 - - UIRequiresFullScreen - - UIStatusBarStyle - UIStatusBarStyleDefault - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIUserInterfaceStyle - Automatic - UIViewControllerBasedStatusBarAppearance - - - \ No newline at end of file diff --git a/ios/safemobileapp/PrivacyInfo.xcprivacy b/ios/safemobileapp/PrivacyInfo.xcprivacy deleted file mode 100644 index 5bb83c5d43..0000000000 --- a/ios/safemobileapp/PrivacyInfo.xcprivacy +++ /dev/null @@ -1,48 +0,0 @@ - - - - - NSPrivacyAccessedAPITypes - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryUserDefaults - NSPrivacyAccessedAPITypeReasons - - CA92.1 - - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryFileTimestamp - NSPrivacyAccessedAPITypeReasons - - 0A2A.1 - 3B52.1 - C617.1 - - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryDiskSpace - NSPrivacyAccessedAPITypeReasons - - E174.1 - 85F4.1 - - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategorySystemBootTime - NSPrivacyAccessedAPITypeReasons - - 35F9.1 - - - - NSPrivacyCollectedDataTypes - - NSPrivacyTracking - - - diff --git a/ios/safemobileapp/SplashScreen.storyboard b/ios/safemobileapp/SplashScreen.storyboard deleted file mode 100644 index 312f250938..0000000000 --- a/ios/safemobileapp/SplashScreen.storyboard +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ios/safemobileapp/Supporting/Expo.plist b/ios/safemobileapp/Supporting/Expo.plist deleted file mode 100644 index 750be020cf..0000000000 --- a/ios/safemobileapp/Supporting/Expo.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - EXUpdatesCheckOnLaunch - ALWAYS - EXUpdatesEnabled - - EXUpdatesLaunchWaitMs - 0 - - \ No newline at end of file diff --git a/ios/safemobileapp/main.m b/ios/safemobileapp/main.m deleted file mode 100644 index 25181b6ccb..0000000000 --- a/ios/safemobileapp/main.m +++ /dev/null @@ -1,10 +0,0 @@ -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} - diff --git a/ios/safemobileapp/noop-file.swift b/ios/safemobileapp/noop-file.swift deleted file mode 100644 index b2ffafbfc6..0000000000 --- a/ios/safemobileapp/noop-file.swift +++ /dev/null @@ -1,4 +0,0 @@ -// -// @generated -// A blank Swift file must be created for native modules with Swift files to work correctly. -// diff --git a/ios/safemobileapp/safemobileapp-Bridging-Header.h b/ios/safemobileapp/safemobileapp-Bridging-Header.h deleted file mode 100644 index e11d920b12..0000000000 --- a/ios/safemobileapp/safemobileapp-Bridging-Header.h +++ /dev/null @@ -1,3 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// diff --git a/ios/safemobileapp/safemobileapp.entitlements b/ios/safemobileapp/safemobileapp.entitlements deleted file mode 100644 index f683276c57..0000000000 --- a/ios/safemobileapp/safemobileapp.entitlements +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c7199d57d7..334847be28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@expo/config-plugins": "^9.0.10", "@expo/vector-icons": "^14.0.2", "@react-native-clipboard/clipboard": "^1.15.0", + "@react-native-community/blur": "^4.4.1", "@react-native-menu/menu": "^1.1.6", "@react-native/babel-preset": "^0.76.2", "@react-navigation/material-top-tabs": "^7.0.1", @@ -86,7 +87,6 @@ "@types/node": "^22.9.1", "@types/react": "~18.3.12", "babel-loader": "^8.4.1", - "detox": "^20.27.6", "eslint": "^9.12.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", @@ -4431,11 +4431,6 @@ "node": ">=8" } }, - "node_modules/@flatten-js/interval-tree": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/@floating-ui/core": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", @@ -5650,6 +5645,16 @@ } } }, + "node_modules/@react-native-community/blur": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@react-native-community/blur/-/blur-4.4.1.tgz", + "integrity": "sha512-XBSsRiYxE/MOEln2ayunShfJtWztHwUxLFcSL20o+HNNRnuUDv+GXkF6FmM2zE8ZUfrnhQ/zeTqvnuDPGw6O8A==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/@react-native-community/datetimepicker": { "version": "8.2.0", "dev": true, @@ -11244,11 +11249,6 @@ "node": ">=16" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "dev": true, - "license": "MIT" - }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -11307,11 +11307,6 @@ "version": "1.2.1", "dev": true }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/browserslist": { "version": "4.24.0", "funding": [ @@ -11391,101 +11386,6 @@ "version": "1.1.2", "license": "MIT" }, - "node_modules/bunyan": { - "version": "1.8.15", - "dev": true, - "engines": [ - "node >=0.10.0" - ], - "license": "MIT", - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/bunyan-debug-stream": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "bunyan": "*" - } - }, - "node_modules/bunyan-debug-stream/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/bunyan-debug-stream/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/bunyan-debug-stream/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/bunyan-debug-stream/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/bunyan-debug-stream/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/bunyan-debug-stream/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/burnt": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/burnt/-/burnt-0.12.2.tgz", @@ -11571,11 +11471,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/caf": { - "version": "15.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/call-bind": { "version": "1.0.7", "license": "MIT", @@ -11874,50 +11769,6 @@ "node": ">= 16" } }, - "node_modules/child-process-promise": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^4.0.2", - "node-version": "^1.0.0", - "promise-polyfill": "^6.0.1" - } - }, - "node_modules/child-process-promise/node_modules/cross-spawn": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/child-process-promise/node_modules/lru-cache": { - "version": "4.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/child-process-promise/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/child-process-promise/node_modules/yallist": { - "version": "2.1.2", - "dev": true, - "license": "ISC" - }, "node_modules/chokidar": { "version": "3.6.0", "license": "MIT", @@ -13077,434 +12928,6 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, - "node_modules/detox": { - "version": "20.27.6", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.6.3", - "bunyan": "^1.8.12", - "bunyan-debug-stream": "^3.1.0", - "caf": "^15.0.1", - "chalk": "^4.0.0", - "child-process-promise": "^2.2.0", - "detox-copilot": "^0.0.23", - "execa": "^5.1.1", - "find-up": "^5.0.0", - "fs-extra": "^11.0.0", - "funpermaproxy": "^1.1.0", - "glob": "^8.0.3", - "ini": "^1.3.4", - "jest-environment-emit": "^1.0.8", - "json-cycle": "^1.3.0", - "lodash": "^4.17.11", - "multi-sort-stream": "^1.0.3", - "multipipe": "^4.0.0", - "node-ipc": "9.2.1", - "proper-lockfile": "^3.0.2", - "resolve-from": "^5.0.0", - "sanitize-filename": "^1.6.1", - "semver": "^7.0.0", - "serialize-error": "^8.0.1", - "shell-quote": "^1.7.2", - "signal-exit": "^3.0.3", - "stream-json": "^1.7.4", - "strip-ansi": "^6.0.1", - "telnet-client": "1.2.8", - "tempfile": "^2.0.0", - "trace-event-lib": "^1.3.1", - "which": "^1.3.1", - "ws": "^7.0.0", - "yargs": "^17.0.0", - "yargs-parser": "^21.0.0", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "detox": "local-cli/cli.js" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "jest": "29.x.x || 28.x.x || ^27.2.5" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - } - } - }, - "node_modules/detox-copilot": { - "version": "0.0.23", - "dev": true, - "license": "MIT" - }, - "node_modules/detox/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/detox/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/detox/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/detox/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/detox/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/detox/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/detox/node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/detox/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detox/node_modules/glob": { - "version": "8.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/detox/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detox/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detox/node_modules/jest-environment-emit": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "bunyamin": "^1.5.2", - "bunyan": "^2.0.5", - "bunyan-debug-stream": "^3.1.0", - "funpermaproxy": "^1.1.0", - "lodash.merge": "^4.6.2", - "node-ipc": "9.2.1", - "strip-ansi": "^6.0.0", - "tslib": "^2.5.3" - }, - "engines": { - "node": ">=16.14.0" - }, - "peerDependencies": { - "@jest/environment": ">=27.2.5", - "@jest/types": ">=27.2.5", - "jest": ">=27.2.5", - "jest-environment-jsdom": ">=27.2.5", - "jest-environment-node": ">=27.2.5" - }, - "peerDependenciesMeta": { - "@jest/environment": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "jest": { - "optional": true - }, - "jest-environment-jsdom": { - "optional": true - }, - "jest-environment-node": { - "optional": true - } - } - }, - "node_modules/detox/node_modules/jest-environment-emit/node_modules/bunyamin": { - "version": "1.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@flatten-js/interval-tree": "^1.1.2", - "multi-sort-stream": "^1.0.4", - "stream-json": "^1.7.5", - "trace-event-lib": "^1.3.1" - }, - "engines": { - "node": ">=14.18.2" - }, - "peerDependencies": { - "@types/bunyan": "^1.8.8", - "bunyan": "^1.8.15 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@types/bunyan": { - "optional": true - }, - "bunyan": { - "optional": true - } - } - }, - "node_modules/detox/node_modules/jest-environment-emit/node_modules/bunyan": { - "version": "2.0.5", - "dev": true, - "engines": [ - "node >=0.10.0" - ], - "license": "MIT", - "dependencies": { - "exeunt": "1.1.0" - }, - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/detox/node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/detox/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detox/node_modules/minimatch": { - "version": "5.1.6", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/detox/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/detox/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detox/node_modules/semver": { - "version": "7.6.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/detox/node_modules/serialize-error": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detox/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/detox/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detox/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/detox/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/detox/node_modules/ws": { - "version": "7.5.10", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -13648,48 +13071,19 @@ "version": "11.0.6", "license": "BSD-2-Clause", "dependencies": { - "dotenv": "^16.4.4" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "dev": true, - "hasInstallScript": true, - "license": "BSD-2-Clause", - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" + "dotenv": "^16.4.4" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/eastasianwidth": { "version": "0.2.0", "license": "MIT" }, - "node_modules/easy-stack": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/edit-json-file": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/edit-json-file/-/edit-json-file-1.8.0.tgz", @@ -14538,14 +13932,6 @@ "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/event-pubsub": { - "version": "4.3.0", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "license": "MIT", @@ -14640,14 +14026,6 @@ "which": "bin/which" } }, - "node_modules/exeunt": { - "version": "1.1.0", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=0.10" - } - }, "node_modules/exit": { "version": "0.1.2", "dev": true, @@ -15482,14 +14860,6 @@ "integrity": "sha512-OCpo8LTk8eZ2sdDCwbU2Lc3ivYsdM6yod6jP2jHcNEFcjPhkgH0+POzTIol7xx1LZgtbI5rkO5jqxsG5MWtPjQ==", "license": "MIT" }, - "node_modules/flat": { - "version": "5.0.2", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { "version": "4.0.1", "dev": true, @@ -15944,14 +15314,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/funpermaproxy": { - "version": "1.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.3.0" - } - }, "node_modules/fuse.js": { "version": "7.0.0", "dev": true, @@ -19321,25 +18683,6 @@ "version": "1.1.0", "license": "MIT" }, - "node_modules/js-message": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/js-queue": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "easy-stack": "^1.0.1" - }, - "engines": { - "node": ">=1.0.0" - } - }, "node_modules/js-sha3": { "version": "0.8.0", "license": "MIT" @@ -19541,14 +18884,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-cycle": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "license": "MIT" @@ -21089,15 +20424,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/moment": { - "version": "2.30.1", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "*" - } - }, "node_modules/moti": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/moti/-/moti-0.29.0.tgz", @@ -21121,11 +20447,6 @@ "version": "2.1.3", "license": "MIT" }, - "node_modules/multi-sort-stream": { - "version": "1.0.4", - "dev": true, - "license": "bsd" - }, "node_modules/multibase": { "version": "4.0.6", "license": "MIT", @@ -21203,15 +20524,6 @@ "multiformats": "^9.4.2" } }, - "node_modules/multipipe": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer2": "^0.1.2", - "object-assign": "^4.1.0" - } - }, "node_modules/murmurhash3js-revisited": { "version": "3.0.0", "license": "MIT", @@ -21219,48 +20531,6 @@ "node": ">=8.0.0" } }, - "node_modules/mv": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/mz": { "version": "2.7.0", "license": "MIT", @@ -21270,12 +20540,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.20.0", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/nanoid": { "version": "3.3.7", "funding": [ @@ -21297,15 +20561,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ncp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "ncp": "bin/ncp" - } - }, "node_modules/negotiator": { "version": "0.6.3", "license": "MIT", @@ -21408,19 +20663,6 @@ "version": "0.4.0", "license": "MIT" }, - "node_modules/node-ipc": { - "version": "9.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "event-pubsub": "4.3.0", - "js-message": "1.0.7", - "js-queue": "2.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/node-readfiles": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", @@ -21435,14 +20677,6 @@ "version": "2.0.18", "license": "MIT" }, - "node_modules/node-version": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/normalize-package-data": { "version": "3.0.3", "license": "BSD-2-Clause", @@ -22513,11 +21747,6 @@ "asap": "~2.0.3" } }, - "node_modules/promise-polyfill": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/prompts": { "version": "2.4.2", "license": "MIT", @@ -22538,16 +21767,6 @@ "react-is": "^16.13.1" } }, - "node_modules/proper-lockfile": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.11", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, "node_modules/protobufjs": { "version": "6.11.4", "hasInstallScript": true, @@ -22572,11 +21791,6 @@ "pbts": "bin/pbts" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, "node_modules/psl": { "version": "1.9.0", "dev": true, @@ -23951,14 +23165,6 @@ "node": ">=4" } }, - "node_modules/retry": { - "version": "0.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.0.4", "license": "MIT", @@ -24032,12 +23238,6 @@ "version": "5.1.2", "license": "MIT" }, - "node_modules/safe-json-stringify": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/safe-regex-test": { "version": "1.0.3", "dev": true, @@ -24059,14 +23259,6 @@ "dev": true, "license": "MIT" }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "dev": true, - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, "node_modules/sax": { "version": "1.4.1", "license": "ISC" @@ -24796,19 +23988,6 @@ "node": ">= 0.10.0" } }, - "node_modules/stream-chain": { - "version": "2.2.5", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stream-json": { - "version": "1.8.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "stream-chain": "^2.2.5" - } - }, "node_modules/stream-slice": { "version": "0.1.2", "license": "MIT" @@ -25384,18 +24563,6 @@ "version": "4.0.0", "license": "ISC" }, - "node_modules/telnet-client": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.5.4" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/kozjak" - } - }, "node_modules/temp": { "version": "0.8.4", "license": "MIT", @@ -25423,34 +24590,6 @@ "rimraf": "bin.js" } }, - "node_modules/tempfile": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tempfile/node_modules/temp-dir": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tempfile/node_modules/uuid": { - "version": "3.4.0", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/tempy": { "version": "0.7.1", "license": "MIT", @@ -25777,17 +24916,6 @@ "node": ">=12" } }, - "node_modules/trace-event-lib": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/trim-newlines": { "version": "3.0.1", "license": "MIT", @@ -25795,14 +24923,6 @@ "node": ">=8" } }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "dev": true, - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, "node_modules/ts-api-utils": { "version": "1.3.0", "dev": true, @@ -26412,11 +25532,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "dev": true, - "license": "(WTFPL OR MIT)" - }, "node_modules/util": { "version": "0.12.5", "license": "MIT", @@ -27097,42 +26212,6 @@ "node": ">=12" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index ad84f3982c..de8d445cdb 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,17 @@ "generate:icons": "node ./scripts/generateIconTypes.js", "prepare": "husky", "api-generate": " npx @rtk-query/codegen-openapi openapi-config.ts", - "build-storybook": "STORYBOOK_WEB='true' storybook build" + "build-storybook": "STORYBOOK_WEB='true' storybook build", + "e2e:metro-ios": "EXPO_PUBLIC_ENV=e2e NODE_ENV=test RN_SRC_EXT=e2e.ts,e2e.tsx expo run:ios", + "e2e:metro-android": "EXPO_PUBLIC_ENV=e2e NODE_ENV=test RN_SRC_EXT=e2e.ts,e2e.tsx expo run:android", + "e2e:run": "maestro test e2e" }, "dependencies": { "@cowprotocol/app-data": "^2.3.0", "@expo/config-plugins": "^9.0.10", "@expo/vector-icons": "^14.0.2", "@react-native-clipboard/clipboard": "^1.15.0", + "@react-native-community/blur": "^4.4.1", "@react-native-menu/menu": "^1.1.6", "@react-native/babel-preset": "^0.76.2", "@react-navigation/material-top-tabs": "^7.0.1", @@ -111,7 +115,6 @@ "@types/node": "^22.9.1", "@types/react": "~18.3.12", "babel-loader": "^8.4.1", - "detox": "^20.27.6", "eslint": "^9.12.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", diff --git a/src/components/Alert/Alert.tsx b/src/components/Alert/Alert.tsx index 08442d1442..8f14f69bab 100644 --- a/src/components/Alert/Alert.tsx +++ b/src/components/Alert/Alert.tsx @@ -15,6 +15,7 @@ interface AlertProps { endIcon?: React.ReactNode startIcon?: React.ReactNode onPress?: () => void + testID?: string } const icons = { @@ -41,11 +42,12 @@ export const Alert = ({ endIcon, displayIcon = true, onPress, + testID, }: AlertProps) => { const Icon = getAlertIcon(type, iconName, displayIcon) return ( - + ) } diff --git a/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap b/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap index 28f2e431c4..8fbe02a1f1 100644 --- a/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap +++ b/src/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap @@ -35,6 +35,7 @@ exports[`PendingTransactions should render the pending transactions in fullWidth "opacity": 1, } } + testID="pending-transactions" > Date: Wed, 4 Dec 2024 17:50:49 +0100 Subject: [PATCH 42/49] Eas (#49) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feature: build with eas We are now able to build on eas. For android: Since the app didn’t go through the app store approval versions we submit need to be in draft state. --- .eas/build/build-and-maestro-test.yml | 8 + .gitignore | 4 +- app.config.js | 20 +- app/_layout.tsx | 14 +- eas.json | 73 ++ expo-plugins/withDrawableAssets.js | 11 +- package-lock.json | 1249 ++++++++++++++++++++----- package.json | 21 +- 8 files changed, 1133 insertions(+), 267 deletions(-) create mode 100644 .eas/build/build-and-maestro-test.yml create mode 100644 eas.json diff --git a/.eas/build/build-and-maestro-test.yml b/.eas/build/build-and-maestro-test.yml new file mode 100644 index 0000000000..126058f799 --- /dev/null +++ b/.eas/build/build-and-maestro-test.yml @@ -0,0 +1,8 @@ +build: + name: Create a build and run Maestro tests on it + steps: + - eas/build + - eas/maestro_test: + inputs: + flow_path: | + e2e/flow.yml diff --git a/.gitignore b/.gitignore index 53f54a61b5..4453806e56 100644 --- a/.gitignore +++ b/.gitignore @@ -33,5 +33,5 @@ expo-env.d.ts /storybook-static # Android and iOS build files -android/ -ios/ +/android/* +/ios/* diff --git a/app.config.js b/app.config.js index 61a5402ec9..8ff93167fb 100644 --- a/app.config.js +++ b/app.config.js @@ -1,11 +1,17 @@ /* eslint-disable no-undef */ -module.exports = { +const IS_DEV = process.env.APP_VARIANT === 'development' + +export default { expo: { - name: 'safe.mobileapp', - slug: 'safe.mobileapp', + name: IS_DEV ? 'Safe{Wallet} MVP - Development' : 'Safe{Wallet} MVP', + slug: 'safe-mobileapp', + owner: 'safeglobal', version: '1.0.0', extra: { storybookEnabled: process.env.STORYBOOK_ENABLED, + eas: { + projectId: '27e9e907-8675-474d-99ee-6c94e7b83a5c', + }, }, orientation: 'portrait', icon: './assets/images/icon.png', @@ -18,19 +24,19 @@ module.exports = { backgroundColor: '#ffffff', }, ios: { - supportsTablet: true, - appleTeamId: 'MXRS32BBL4', - bundleIdentifier: 'global.safe.mobileapp', config: { usesNonExemptEncryption: false, }, + supportsTablet: true, + appleTeamId: 'MXRS32BBL4', + bundleIdentifier: IS_DEV ? 'global.safe.mobileapp.dev' : 'global.safe.mobileapp', }, android: { adaptiveIcon: { foregroundImage: './assets/images/adaptive-icon.png', backgroundColor: '#ffffff', }, - package: 'com.global.safe.mobileapp', + package: IS_DEV ? 'global.safe.mobileapp.dev' : 'global.safe.mobileapp', }, web: { bundler: 'metro', diff --git a/app/_layout.tsx b/app/_layout.tsx index 1e3d32e456..286b4a8958 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -7,7 +7,7 @@ import { PersistGate } from 'redux-persist/integration/react' import { isStorybookEnv } from '@/src/config/constants' import { apiSliceWithChainsConfig } from '@/src/store/gateway/chains/index' import { GestureHandlerRootView } from 'react-native-gesture-handler' - +import { HeaderBackButton } from '@react-navigation/elements' import { BottomSheetModalProvider } from '@gorhom/bottom-sheet' import { PortalProvider } from '@tamagui/portal' import { SafeToastProvider } from '@/src/theme/provider/toastProvider' @@ -30,10 +30,18 @@ function RootLayout() { ({ headerBackButtonDisplayMode: 'minimal', headerShadowVisible: false, - }} + headerLeft: (props) => ( + + ), + })} > diff --git a/eas.json b/eas.json new file mode 100644 index 0000000000..6d540ffbb1 --- /dev/null +++ b/eas.json @@ -0,0 +1,73 @@ +{ + "cli": { + "version": ">= 13.4.2", + "appVersionSource": "remote" + }, + "build": { + "base": { + "node": "20.18.0", + "android": { + "image": "sdk-52" + }, + "ios": { + "image": "sdk-52" + } + }, + "development": { + "extends": "base", + "environment": "development", + "developmentClient": true, + "env": { + "APP_VARIANT": "development" + } + }, + "preview-ios-simulator": { + "extends": "base", + "environment": "preview", + "distribution": "internal", + "ios": { + "simulator": true + } + }, + "preview": { + "extends": "base", + "environment": "preview", + "distribution": "internal", + "ios": { + }, + "android": { + "buildType": "apk" + } + }, + "production": { + "extends": "base", + "environment": "production", + "autoIncrement": true, + "env": { + "APP_VARIANT": "production" + } + }, + "build-and-maestro-test": { + "withoutCredentials": true, + "config": "build-and-maestro-test.yml", + "android": { + "buildType": "apk", + "image": "latest" + }, + "ios": { + "simulator": true, + "image": "latest" + } + } + }, + "submit": { + "production": { + "ios": { + "ascAppId": "6738784305" + }, + "android": { + "releaseStatus": "draft" + } + } + } +} diff --git a/expo-plugins/withDrawableAssets.js b/expo-plugins/withDrawableAssets.js index bd902e87b3..e60def06f7 100644 --- a/expo-plugins/withDrawableAssets.js +++ b/expo-plugins/withDrawableAssets.js @@ -9,18 +9,23 @@ const withDrawableAssets = function (expoConfig, files) { 'android', function (modConfig) { if (modConfig.modRequest.platform === 'android') { - const androidDwarablePath = path.join(modConfig.modRequest.platformProjectRoot, ...androidFolderPath) + const projectRoot = modConfig.modRequest.projectRoot + const androidDrawablePath = path.join(modConfig.modRequest.platformProjectRoot, ...androidFolderPath) if (!Array.isArray(files)) { files = [files] } files.forEach(function (file) { + if (!path.isAbsolute(file)) { + file = path.join(projectRoot, file) + } + const isFile = fs.lstatSync(file).isFile() if (isFile) { - fs.copyFileSync(file, path.join(androidDwarablePath, path.basename(file))) + fs.copyFileSync(file, path.join(androidDrawablePath, path.basename(file))) } else { - copyFolderRecursiveSync(file, androidDwarablePath) + copyFolderRecursiveSync(file, androidDrawablePath) } }) } diff --git a/package-lock.json b/package-lock.json index 334847be28..0bb748e5bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,30 +30,31 @@ "burnt": "^0.12.2", "date-fns": "^4.1.0", "deepmerge": "^4.3.1", - "expo": "~52.0.7", + "expo": "~52.0.14", "expo-blur": "~14.0.1", "expo-constants": "~17.0.2", + "expo-dev-client": "~5.0.5", "expo-font": "~13.0.1", - "expo-image": "~2.0.1", + "expo-image": "~2.0.3", "expo-linear-gradient": "^14.0.1", - "expo-linking": "~7.0.2", - "expo-router": "~4.0.6", - "expo-splash-screen": "~0.29.11", + "expo-linking": "~7.0.3", + "expo-router": "~4.0.11", + "expo-splash-screen": "~0.29.13", "expo-status-bar": "~2.0.0", - "expo-system-ui": "~4.0.3", + "expo-system-ui": "~4.0.5", "expo-web-browser": "~14.0.1", "lodash": "^4.17.21", "moti": "^0.29.0", "react": "18.3.1", "react-dom": "^18.3.1", - "react-native": "0.76.2", + "react-native": "0.76.3", "react-native-collapsible-tab-view": "^8.0.0", "react-native-gesture-handler": "~2.20.2", "react-native-mmkv": "^3.1.0", - "react-native-pager-view": "6.4.1", + "react-native-pager-view": "6.5.1", "react-native-reanimated": "^3.16.2", "react-native-safe-area-context": "4.12.0", - "react-native-screens": "~4.1.0", + "react-native-screens": "^4.0.0", "react-native-web": "^0.19.13", "react-redux": "^9.1.2", "redux-persist": "^6.0.0", @@ -106,6 +107,8 @@ }, "node_modules/@0no-co/graphql.web": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.11.tgz", + "integrity": "sha512-xuSJ9WXwTmtngWkbdEoopMo6F8NLtjy84UNAMsAr5C3/2SgAL/dEU10TMqTIsipqPQ8HA/7WzeqQ9DEQxSvPPA==", "license": "MIT", "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" @@ -623,6 +626,8 @@ }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", + "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", @@ -737,6 +742,8 @@ }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -2138,6 +2145,8 @@ "node_modules/@babel/traverse--for-generate-function-map": { "name": "@babel/traverse", "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.25.9", @@ -2154,6 +2163,8 @@ }, "node_modules/@babel/traverse--for-generate-function-map/node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "license": "MIT", "engines": { "node": ">=4" @@ -3210,23 +3221,27 @@ }, "node_modules/@expo/bunyan": { "version": "4.0.1", - "engines": [ - "node >=0.10.0" - ], + "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", + "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", "license": "MIT", "dependencies": { "uuid": "^8.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@expo/cli": { - "version": "0.21.5", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.0.tgz", + "integrity": "sha512-89yOeyA8ObTxxR8izv80foYITXPtsyU0Q+LTalD8PytISRtmWqgbJ2b8go2kPrJJRJ8urUKIIo6k6ShjMurRxw==", "license": "MIT", "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "^0.0.5", "@expo/config": "~10.0.4", - "@expo/config-plugins": "~9.0.3", + "@expo/config-plugins": "~9.0.10", "@expo/devcert": "^1.1.2", "@expo/env": "~0.4.0", "@expo/image-utils": "^0.6.0", @@ -3235,11 +3250,11 @@ "@expo/osascript": "^2.0.31", "@expo/package-manager": "^1.5.0", "@expo/plist": "^0.2.0", - "@expo/prebuild-config": "^8.0.16", + "@expo/prebuild-config": "^8.0.17", "@expo/rudder-sdk-node": "^1.1.1", "@expo/spawn-async": "^1.7.2", "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.76.2", + "@react-native/dev-middleware": "0.76.3", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", @@ -3300,6 +3315,8 @@ }, "node_modules/@expo/cli/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3313,6 +3330,8 @@ }, "node_modules/@expo/cli/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -3320,6 +3339,8 @@ }, "node_modules/@expo/cli/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3334,6 +3355,8 @@ }, "node_modules/@expo/cli/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3344,10 +3367,14 @@ }, "node_modules/@expo/cli/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/@expo/cli/node_modules/glob": { "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -3366,6 +3393,8 @@ }, "node_modules/@expo/cli/node_modules/glob/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -3379,6 +3408,8 @@ }, "node_modules/@expo/cli/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -3386,6 +3417,8 @@ }, "node_modules/@expo/cli/node_modules/semver": { "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3396,6 +3429,8 @@ }, "node_modules/@expo/cli/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -3406,6 +3441,8 @@ }, "node_modules/@expo/code-signing-certificates": { "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", + "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", "license": "MIT", "dependencies": { "node-forge": "^1.2.1", @@ -3413,11 +3450,13 @@ } }, "node_modules/@expo/config": { - "version": "10.0.4", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-10.0.5.tgz", + "integrity": "sha512-wq48h3HlAPq5v/gMprarAiVY1aEXNBVJ+Em0vrHcYFO8UyxzR6oIao2E4Ed3VWHqhTzPXkMPH4hKCKlzFVBFwQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~9.0.0", + "@expo/config-plugins": "~9.0.10", "@expo/config-types": "^52.0.0", "@expo/json-file": "^9.0.0", "deepmerge": "^4.3.1", @@ -3432,9 +3471,9 @@ } }, "node_modules/@expo/config-plugins": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.10.tgz", - "integrity": "sha512-4piPSylJ8z3to+YZpl/6M2mLxASOdIFANA8FYihsTf9kWlyimV9L/+MGgPXJcieaHXYZZqOryf8hQFVeg/68+A==", + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.11.tgz", + "integrity": "sha512-zufuPQWkeEpXfMWFx2lWStoN43p6cO13p8n2KMIEK6jJMC/kkfldYyl8gYtEEYAL1nFfOf/W2pIXXPQ2sggnSw==", "license": "MIT", "dependencies": { "@expo/config-types": "^52.0.0", @@ -3620,6 +3659,8 @@ }, "node_modules/@expo/devcert": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.1.4.tgz", + "integrity": "sha512-fqBODr8c72+gBSX5Ty3SIzaY4bXainlpab78+vEYEKL3fXmsOswMLf0+KE36mUEAa36BYabX7K3EiXOXX5OPMw==", "license": "MIT", "dependencies": { "application-config-path": "^0.1.0", @@ -3638,6 +3679,8 @@ }, "node_modules/@expo/devcert/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -3645,6 +3688,8 @@ }, "node_modules/@expo/devcert/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -3652,6 +3697,8 @@ }, "node_modules/@expo/devcert/node_modules/glob": { "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -3670,6 +3717,8 @@ }, "node_modules/@expo/devcert/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -3751,7 +3800,9 @@ } }, "node_modules/@expo/fingerprint": { - "version": "0.11.2", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.11.3.tgz", + "integrity": "sha512-9lgXmcIePvZ7Wef63XtvuN3HfCUevF4E4tQPdEbH9/dUWwpOvvwQ3KT4OJ9jdh8JJ3nTdO9eDQ/8k8xr1aQ5Kg==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -3771,6 +3822,8 @@ }, "node_modules/@expo/fingerprint/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3784,6 +3837,8 @@ }, "node_modules/@expo/fingerprint/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3798,6 +3853,8 @@ }, "node_modules/@expo/fingerprint/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3808,10 +3865,14 @@ }, "node_modules/@expo/fingerprint/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/@expo/fingerprint/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -3819,6 +3880,8 @@ }, "node_modules/@expo/fingerprint/node_modules/semver": { "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3829,6 +3892,8 @@ }, "node_modules/@expo/fingerprint/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -3975,7 +4040,9 @@ } }, "node_modules/@expo/metro-config": { - "version": "0.19.4", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.19.5.tgz", + "integrity": "sha512-wl5lVgXq4FN4kBJHNyU5U9J5hH8S8rYXrp/pgbwA+J/smQfiElYKMYomTGbHUb4LQ0VnmlX6/kI4x/zJk+mq7w==", "license": "MIT", "dependencies": { "@babel/core": "^7.20.0", @@ -4000,6 +4067,8 @@ }, "node_modules/@expo/metro-config/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4013,6 +4082,8 @@ }, "node_modules/@expo/metro-config/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -4020,6 +4091,8 @@ }, "node_modules/@expo/metro-config/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4034,6 +4107,8 @@ }, "node_modules/@expo/metro-config/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4044,10 +4119,14 @@ }, "node_modules/@expo/metro-config/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/@expo/metro-config/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", @@ -4061,6 +4140,8 @@ }, "node_modules/@expo/metro-config/node_modules/glob": { "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -4079,6 +4160,8 @@ }, "node_modules/@expo/metro-config/node_modules/glob/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -4092,6 +4175,8 @@ }, "node_modules/@expo/metro-config/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -4099,6 +4184,8 @@ }, "node_modules/@expo/metro-config/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -4109,6 +4196,8 @@ }, "node_modules/@expo/metro-config/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -4119,6 +4208,8 @@ }, "node_modules/@expo/metro-config/node_modules/universalify": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -4133,6 +4224,8 @@ }, "node_modules/@expo/osascript": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.4.tgz", + "integrity": "sha512-LcPjxJ5FOFpqPORm+5MRLV0CuYWMthJYV6eerF+lQVXKlvgSn3EOqaHC3Vf3H+vmB0f6G4kdvvFtg40vG4bIhA==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -4144,6 +4237,8 @@ }, "node_modules/@expo/package-manager": { "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.6.1.tgz", + "integrity": "sha512-4rT46wP/94Ll+CWXtFKok1Lbo9XncSUtErFOo/9/3FVughGbIfdG4SKZOAWIpr9wxwEfkyhHfAP9q71ONlWODw==", "license": "MIT", "dependencies": { "@expo/json-file": "^9.0.0", @@ -4162,6 +4257,8 @@ }, "node_modules/@expo/package-manager/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4175,6 +4272,8 @@ }, "node_modules/@expo/package-manager/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4189,6 +4288,8 @@ }, "node_modules/@expo/package-manager/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4199,10 +4300,14 @@ }, "node_modules/@expo/package-manager/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/@expo/package-manager/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -4210,10 +4315,14 @@ }, "node_modules/@expo/package-manager/node_modules/sudo-prompt": { "version": "9.1.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", + "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==", "license": "MIT" }, "node_modules/@expo/package-manager/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -4294,6 +4403,8 @@ }, "node_modules/@expo/rudder-sdk-node": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", + "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", "license": "MIT", "dependencies": { "@expo/bunyan": "^4.0.0", @@ -4340,7 +4451,9 @@ } }, "node_modules/@expo/xcpretty": { - "version": "4.3.1", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", + "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "license": "BSD-3-Clause", "dependencies": { "@babel/code-frame": "7.10.4", @@ -4354,6 +4467,8 @@ }, "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" @@ -4361,6 +4476,8 @@ }, "node_modules/@expo/xcpretty/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4374,10 +4491,14 @@ }, "node_modules/@expo/xcpretty/node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/@expo/xcpretty/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4392,6 +4513,8 @@ }, "node_modules/@expo/xcpretty/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4402,10 +4525,14 @@ }, "node_modules/@expo/xcpretty/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/@expo/xcpretty/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -4413,6 +4540,8 @@ }, "node_modules/@expo/xcpretty/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4423,6 +4552,8 @@ }, "node_modules/@expo/xcpretty/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -5501,6 +5632,8 @@ }, "node_modules/@npmcli/fs": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "license": "ISC", "dependencies": { "semver": "^7.3.5" @@ -5511,6 +5644,8 @@ }, "node_modules/@npmcli/fs/node_modules/semver": { "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5693,26 +5828,30 @@ } }, "node_modules/@react-native/assets-registry": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.3.tgz", + "integrity": "sha512-7Fnc3lzCFFpnoyL1egua6d/qUp0KiIpeSLbfOMln4nI2g2BMzyFHdPjJnpLV2NehmS0omOOkrfRqK5u1F/MXzA==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.3.tgz", + "integrity": "sha512-mZ7jmIIg4bUnxCqY3yTOkoHvvzsDyrZgfnIKiTGm5QACrsIGa5eT3pMFpMm2OpxGXRDrTMsYdPXE2rCyDX52VQ==", "license": "MIT", "dependencies": { - "@react-native/codegen": "0.76.2" + "@react-native/codegen": "0.76.3" }, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-preset": { - "version": "0.76.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.2.tgz", - "integrity": "sha512-/kbxZqy70mGONv23uZg7lm7ZCE4dO5dgMzVPz6QsveXIRHQBRLsSC+9w2iZEnYWpLayoWFmTbq8ZG+4W32D3bA==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.3.tgz", + "integrity": "sha512-zi2nPlQf9q2fmfPyzwWEj6DU96v8ziWtEfG7CTAX2PG/Vjfsr94vn/wWrCdhBVvLRQ6Kvd/MFAuDYpxmQwIiVQ==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -5756,7 +5895,7 @@ "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.76.2", + "@react-native/babel-plugin-codegen": "0.76.3", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" @@ -5787,7 +5926,9 @@ } }, "node_modules/@react-native/codegen": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.3.tgz", + "integrity": "sha512-oJCH/jbYeGmFJql8/y76gqWCCd74pyug41yzYAjREso1Z7xL88JhDyKMvxEnfhSdMOZYVl479N80xFiXPy3ZYA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", @@ -5807,11 +5948,13 @@ } }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.3.tgz", + "integrity": "sha512-vgsLixHS24jR0d0QqPykBWFaC+V8x9cM3cs4oYXw3W199jgBNGP9MWcUJLazD2vzrT/lUTVBVg0rBeB+4XR6fg==", "license": "MIT", "dependencies": { - "@react-native/dev-middleware": "0.76.2", - "@react-native/metro-babel-transformer": "0.76.2", + "@react-native/dev-middleware": "0.76.3", + "@react-native/metro-babel-transformer": "0.76.3", "chalk": "^4.0.0", "execa": "^5.1.1", "invariant": "^2.2.4", @@ -5836,6 +5979,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -5849,6 +5994,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -5863,6 +6010,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -5873,10 +6022,14 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/@react-native/community-cli-plugin/node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", @@ -5898,6 +6051,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", "engines": { "node": ">=10" @@ -5908,6 +6063,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -5915,6 +6072,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -5925,6 +6084,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", "engines": { "node": ">=6" @@ -5932,6 +6093,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "license": "MIT", "dependencies": { "path-key": "^3.0.0" @@ -5942,6 +6105,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -5955,6 +6120,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/semver": { "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5965,6 +6132,8 @@ }, "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -5974,18 +6143,22 @@ } }, "node_modules/@react-native/debugger-frontend": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.3.tgz", + "integrity": "sha512-pMHQ3NpPB28RxXciSvm2yD+uDx3pkhzfuWkc7VFgOduyzPSIr0zotUiOJzsAtrj8++bPbOsAraCeQhCqoOTWQw==", "license": "BSD-3-Clause", "engines": { "node": ">=18" } }, "node_modules/@react-native/dev-middleware": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.3.tgz", + "integrity": "sha512-b+2IpW40z1/S5Jo5JKrWPmucYU/PzeGyGBZZ/SJvmRnBDaP3txb9yIqNZAII1EWsKNhedh8vyRO5PSuJ9Juqzw==", "license": "MIT", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.76.2", + "@react-native/debugger-frontend": "0.76.3", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -6002,6 +6175,8 @@ }, "node_modules/@react-native/dev-middleware/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -6009,10 +6184,14 @@ }, "node_modules/@react-native/dev-middleware/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/@react-native/dev-middleware/node_modules/open": { "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "license": "MIT", "dependencies": { "is-docker": "^2.0.0", @@ -6027,31 +6206,39 @@ }, "node_modules/@react-native/dev-middleware/node_modules/ws": { "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", "license": "MIT", "dependencies": { "async-limiter": "~1.0.0" } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.3.tgz", + "integrity": "sha512-t0aYZ8ND7+yc+yIm6Yp52bInneYpki6RSIFZ9/LMUzgMKvEB62ptt/7sfho9QkKHCNxE1DJSWIqLIGi/iHHkyg==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.3.tgz", + "integrity": "sha512-pubJFArMMrdZiytH+W95KngcSQs+LsxOBsVHkwgMnpBfRUxXPMK4fudtBwWvhnwN76Oe+WhxSq7vOS5XgoPhmw==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.3.tgz", + "integrity": "sha512-b2zQPXmW7avw/7zewc9nzMULPIAjsTwN03hskhxHUJH5pzUf7pIklB3FrgYPZrRhJgzHiNl3tOPu7vqiKzBYPg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.76.2", + "@react-native/babel-preset": "0.76.3", "hermes-parser": "0.23.1", "nullthrows": "^1.1.1" }, @@ -6073,7 +6260,9 @@ "license": "MIT" }, "node_modules/@react-native/virtualized-lists": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.3.tgz", + "integrity": "sha512-wTGv9pVh3vAOWb29xFm+J9VRe9dUcUcb9FyaMLT/Hxa88W4wqa5ZMe1V9UvrrBiA1G5DKjv8/1ZcDsJhyugVKA==", "license": "MIT", "dependencies": { "invariant": "^2.2.4", @@ -6437,6 +6626,8 @@ }, "node_modules/@segment/loosely-validate-event": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", + "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", "dependencies": { "component-type": "^1.2.1", "join-component": "^1.1.0" @@ -10105,6 +10296,8 @@ }, "node_modules/@urql/core": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.0.8.tgz", + "integrity": "sha512-1GOnUw7/a9bzkcM0+U8U5MmxW2A7FE5YquuEmcJzTtW5tIs2EoS4F2ITpuKBjRBbyRjZgO860nWFPo1m4JImGA==", "license": "MIT", "dependencies": { "@0no-co/graphql.web": "^1.0.5", @@ -10113,6 +10306,8 @@ }, "node_modules/@urql/exchange-retry": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.0.tgz", + "integrity": "sha512-FLt+d81gP4oiHah4hWFDApimc+/xABWMU1AMYsZ1PVB0L0YPtrMCjbOp9WMM7hBzy4gbTDrG24sio0dCfSh/HQ==", "license": "MIT", "dependencies": { "@urql/core": "^5.0.0", @@ -10452,6 +10647,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", @@ -10589,10 +10786,14 @@ }, "node_modules/application-config-path": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", + "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==", "license": "MIT" }, "node_modules/arg": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT" }, "node_modules/argparse": { @@ -10660,6 +10861,8 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "license": "MIT", "engines": { "node": ">=8" @@ -11132,7 +11335,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "12.0.1", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.3.tgz", + "integrity": "sha512-1695e8y3U/HjifKx33vcNnFMSUSXwPWwhFxRlL6NRx2TENN6gySH82gPOWgxcra6gi+EJgXx52xG3PcqTjwW6w==", "license": "MIT", "dependencies": { "@babel/plugin-proposal-decorators": "^7.12.9", @@ -11141,7 +11346,7 @@ "@babel/plugin-transform-parameters": "^7.22.15", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.76.2", + "@react-native/babel-preset": "0.76.3", "babel-plugin-react-native-web": "~0.19.13", "react-refresh": "^0.14.2" }, @@ -11263,6 +11468,8 @@ }, "node_modules/bplist-creator": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", + "integrity": "sha512-xp/tcaV3T5PCiaY04mXga7o/TE+t95gqeLmADeBI1CvZtdWTbgBt3uLpvh4UWtenKeBhCV6oVxGk38yZr2uYEA==", "license": "MIT", "dependencies": { "stream-buffers": "~2.2.0" @@ -11270,6 +11477,8 @@ }, "node_modules/bplist-parser": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "dependencies": { "big-integer": "1.6.x" @@ -11403,6 +11612,8 @@ }, "node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11410,6 +11621,8 @@ }, "node_modules/cacache": { "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", @@ -11431,6 +11644,8 @@ }, "node_modules/cacache/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -11438,6 +11653,8 @@ }, "node_modules/cacache/node_modules/glob": { "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -11456,10 +11673,14 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/cacache/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -11497,6 +11718,8 @@ }, "node_modules/caller-callsite": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "license": "MIT", "dependencies": { "callsites": "^2.0.0" @@ -11507,6 +11730,8 @@ }, "node_modules/caller-callsite/node_modules/callsites": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "license": "MIT", "engines": { "node": ">=4" @@ -11514,6 +11739,8 @@ }, "node_modules/caller-path": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "license": "MIT", "dependencies": { "caller-callsite": "^2.0.0" @@ -11637,6 +11864,8 @@ }, "node_modules/charenc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "license": "BSD-3-Clause", "engines": { "node": "*" @@ -11793,6 +12022,8 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", "engines": { "node": ">=10" @@ -11907,6 +12138,8 @@ }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", "engines": { "node": ">=6" @@ -11914,6 +12147,8 @@ }, "node_modules/cli-cursor": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" @@ -11924,6 +12159,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", "engines": { "node": ">=6" @@ -12048,6 +12285,8 @@ }, "node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" @@ -12148,10 +12387,14 @@ }, "node_modules/command-exists": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", "license": "MIT" }, "node_modules/commander": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", "engines": { "node": ">= 10" @@ -12169,6 +12412,8 @@ }, "node_modules/component-type": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.2.tgz", + "integrity": "sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12176,6 +12421,8 @@ }, "node_modules/compressible": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" @@ -12186,6 +12433,8 @@ }, "node_modules/compression": { "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -12202,6 +12451,8 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -12209,10 +12460,14 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/compression/node_modules/negotiator": { "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12220,6 +12475,8 @@ }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -12302,10 +12559,14 @@ }, "node_modules/core-util-is": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, "node_modules/cosmiconfig": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "license": "MIT", "dependencies": { "import-fresh": "^2.0.0", @@ -12319,6 +12580,8 @@ }, "node_modules/cosmiconfig/node_modules/parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "license": "MIT", "dependencies": { "error-ex": "^1.3.1", @@ -12440,6 +12703,8 @@ }, "node_modules/crypt": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "license": "BSD-3-Clause", "engines": { "node": "*" @@ -12775,6 +13040,8 @@ }, "node_modules/deep-extend": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", "engines": { "node": ">=4.0.0" @@ -12794,6 +13061,8 @@ }, "node_modules/default-gateway": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "license": "BSD-2-Clause", "dependencies": { "execa": "^1.0.0", @@ -12805,6 +13074,8 @@ }, "node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -12853,6 +13124,8 @@ }, "node_modules/del": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "license": "MIT", "dependencies": { "globby": "^11.0.1", @@ -12880,6 +13153,8 @@ }, "node_modules/denodeify": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", "license": "MIT" }, "node_modules/depd": { @@ -12906,6 +13181,8 @@ }, "node_modules/detect-libc": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "license": "Apache-2.0", "bin": { "detect-libc": "bin/detect-libc.js" @@ -13160,6 +13437,8 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -13208,6 +13487,8 @@ }, "node_modules/env-editor": { "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "license": "MIT", "engines": { "node": ">=8" @@ -13226,6 +13507,8 @@ }, "node_modules/eol": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", "license": "MIT" }, "node_modules/err-code": { @@ -13953,10 +14236,14 @@ }, "node_modules/exec-async": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", + "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "license": "MIT" }, "node_modules/execa": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "license": "MIT", "dependencies": { "cross-spawn": "^6.0.0", @@ -13973,6 +14260,8 @@ }, "node_modules/execa/node_modules/cross-spawn": { "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "license": "MIT", "dependencies": { "nice-try": "^1.0.4", @@ -13987,6 +14276,8 @@ }, "node_modules/execa/node_modules/path-key": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "license": "MIT", "engines": { "node": ">=4" @@ -13994,6 +14285,8 @@ }, "node_modules/execa/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", "bin": { "semver": "bin/semver" @@ -14001,6 +14294,8 @@ }, "node_modules/execa/node_modules/shebang-command": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" @@ -14011,6 +14306,8 @@ }, "node_modules/execa/node_modules/shebang-regex": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -14018,6 +14315,8 @@ }, "node_modules/execa/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -14049,24 +14348,26 @@ } }, "node_modules/expo": { - "version": "52.0.7", + "version": "52.0.14", + "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.14.tgz", + "integrity": "sha512-omGLh6cmaFZPcvTuMZY9Pi0aBOseeJI7MjJAAbi2rFssNVJJme44jM0CJ4Hq3p/6XqSFlZMqnuAfsAAzm/c/Rg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.21.5", - "@expo/config": "~10.0.4", - "@expo/config-plugins": "9.0.9", - "@expo/fingerprint": "0.11.2", - "@expo/metro-config": "0.19.4", + "@expo/cli": "0.22.0", + "@expo/config": "~10.0.5", + "@expo/config-plugins": "~9.0.11", + "@expo/fingerprint": "0.11.3", + "@expo/metro-config": "0.19.5", "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~12.0.1", + "babel-preset-expo": "~12.0.3", "expo-asset": "~11.0.1", "expo-constants": "~17.0.3", - "expo-file-system": "~18.0.3", + "expo-file-system": "~18.0.4", "expo-font": "~13.0.1", "expo-keep-awake": "~14.0.1", - "expo-modules-autolinking": "2.0.2", - "expo-modules-core": "2.0.3", + "expo-modules-autolinking": "2.0.3", + "expo-modules-core": "2.1.1", "fbemitter": "^3.0.0", "web-streams-polyfill": "^3.3.2", "whatwg-url-without-unicode": "8.0.0-3" @@ -14131,8 +14432,78 @@ "react-native": "*" } }, + "node_modules/expo-dev-client": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-5.0.5.tgz", + "integrity": "sha512-LfrJ/a1UVqU1LxQ2oaduKWx2F0/1wDsiUv4lic4a2ug9wazGSR+bZ88fRlnAbhdMBfuymUKBMyUA+X3WDqf/bw==", + "license": "MIT", + "dependencies": { + "expo-dev-launcher": "5.0.18", + "expo-dev-menu": "6.0.13", + "expo-dev-menu-interface": "1.9.2", + "expo-manifests": "~0.15.0", + "expo-updates-interface": "~1.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-launcher": { + "version": "5.0.18", + "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-5.0.18.tgz", + "integrity": "sha512-rPPTR0KoHHpYl0MOAxc3IUZ/cUge3CFgE3Qmk8ccpQDL/PmhodsPqTcV6fnyKf1xuTa6hT7qI6CHJtSZbx6xNA==", + "license": "MIT", + "dependencies": { + "ajv": "8.11.0", + "expo-dev-menu": "6.0.13", + "expo-manifests": "~0.15.0", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-launcher/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/expo-dev-menu": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-6.0.13.tgz", + "integrity": "sha512-wLzTqGY89boVMNEqoWgIzYc7G6aXEsvsQrEXg9S5jkKfVyRcNvL46ppKkdGQ8AKkLm/wFQ2XkCk7C5izhxIb6g==", + "license": "MIT", + "dependencies": { + "expo-dev-menu-interface": "1.9.2" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-menu-interface": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-1.9.2.tgz", + "integrity": "sha512-9piGiHZYnNjoO9oQFWlVsndQ1jhTdGCKf81WfCMHbQBamna/zucC1A+jbGpyzE4icXZZ29CpsSd4uVR+tB2Rfw==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-file-system": { - "version": "18.0.3", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.4.tgz", + "integrity": "sha512-aAWEDwnu0XHOBYvQ9Q0+QIa+483vYJaC4IDsXyWQ73Rtsg273NZh5kYowY+cAocvoSmA99G6htrLBn11ax2bTQ==", "license": "MIT", "dependencies": { "web-streams-polyfill": "^3.3.2" @@ -14154,9 +14525,9 @@ } }, "node_modules/expo-image": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/expo-image/-/expo-image-2.0.1.tgz", - "integrity": "sha512-IwmeHw4mXe0Pk4qpvui8FTYLXXI4Jkwl2SwaaAmiO+OF2Sh1QGJ+pEhMQR67lKcDAj7atj1o1ZJ7MqQje5QLCg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expo-image/-/expo-image-2.0.3.tgz", + "integrity": "sha512-+YnHTQv8jbXaut3FY7TDhNiSiGZ927C329mHvTZWV4Fyj32/Hjhhmk7dqq9I6LrA0nqBBiJjFj3u6VdHvCBnZg==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -14170,6 +14541,12 @@ } } }, + "node_modules/expo-json-utils": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.14.0.tgz", + "integrity": "sha512-xjGfK9dL0B1wLnOqNkX0jM9p48Y0I5xEPzHude28LY67UmamUyAACkqhZGaPClyPNfdzczk7Ej6WaRMT3HfXvw==", + "license": "MIT" + }, "node_modules/expo-keep-awake": { "version": "14.0.1", "license": "MIT", @@ -14190,7 +14567,9 @@ } }, "node_modules/expo-linking": { - "version": "7.0.2", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-7.0.3.tgz", + "integrity": "sha512-YiDacNzeQZd/bdOwGyi+YlawM4GGbcSRkuFCpDGIK7D1KUGqLinBHwJvxUMb9Zert2Ois5IHtmZaZ1et6g229g==", "license": "MIT", "dependencies": { "expo-constants": "~17.0.0", @@ -14201,8 +14580,23 @@ "react-native": "*" } }, + "node_modules/expo-manifests": { + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-0.15.4.tgz", + "integrity": "sha512-Ki6+twRbm+HTX3L8larhOdDbSYPG3ojGnZepR/+TGg3JF/5yyscosDVY6c6z8xEGjKIjs1F813yq9yAfiPh8/g==", + "license": "MIT", + "dependencies": { + "@expo/config": "~10.0.4", + "expo-json-utils": "~0.14.0" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-modules-autolinking": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.0.3.tgz", + "integrity": "sha512-Q/ALJ54eS7Cr7cmbP+unEDTkHFQivQerWWrqZxuXOrSFYGCYU22+/xAZXaJOpZwseOVsP74zSkoRY/wBimVs7w==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -14220,6 +14614,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -14233,6 +14629,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -14247,6 +14645,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -14257,10 +14657,14 @@ }, "node_modules/expo-modules-autolinking/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/expo-modules-autolinking/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", @@ -14274,6 +14678,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -14281,6 +14687,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -14291,6 +14699,8 @@ }, "node_modules/expo-modules-autolinking/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -14301,20 +14711,26 @@ }, "node_modules/expo-modules-autolinking/node_modules/universalify": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/expo-modules-core": { - "version": "2.0.3", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.1.1.tgz", + "integrity": "sha512-yQzYCLR2mre4BNMXuqkeJ0oSNgmGEMI6BcmIzeNZbC2NFEjiaDpKvlV9bclYCtyVhUEVNbJcEPYMr6c1Y4eR4w==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" } }, "node_modules/expo-router": { - "version": "4.0.6", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-4.0.11.tgz", + "integrity": "sha512-2Qrd/fk98kC+CTg1umbuUaBaGkpdGStPpkSR99SoAjX6KWC1WhNMCv0hGFn7cRmSNOWQzgIfLGLERhRY1o4myw==", "license": "MIT", "dependencies": { "@expo/metro-runtime": "4.0.0", @@ -14338,7 +14754,7 @@ "expo-linking": "*", "react-native-reanimated": "*", "react-native-safe-area-context": "*", - "react-native-screens": "^4.0.0" + "react-native-screens": "*" }, "peerDependenciesMeta": { "@react-navigation/drawer": { @@ -14393,10 +14809,12 @@ } }, "node_modules/expo-splash-screen": { - "version": "0.29.11", + "version": "0.29.13", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.29.13.tgz", + "integrity": "sha512-OTaW6v2ErKTlguFDNi4PN+qrEFRA4TIEyFag4204CiFIpAB+13PqQiW4Ovt29aYlLERIjWD++PyoHeSdLSiZwg==", "license": "MIT", "dependencies": { - "@expo/prebuild-config": "^8.0.16" + "@expo/prebuild-config": "^8.0.17" }, "peerDependencies": { "expo": "*" @@ -14411,10 +14829,12 @@ } }, "node_modules/expo-system-ui": { - "version": "4.0.3", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-4.0.5.tgz", + "integrity": "sha512-PQJIFMAMnt3LrWCCHqg82zW+hXytvtJdFiiIYE2UuP0kDvl346tazQupbtJsSxJp1OpxhuNVhpvKoWV72is3bg==", "license": "MIT", "dependencies": { - "@react-native/normalize-colors": "0.76.2", + "@react-native/normalize-colors": "0.76.3", "debug": "^4.3.2" }, "peerDependencies": { @@ -14429,9 +14849,20 @@ } }, "node_modules/expo-system-ui/node_modules/@react-native/normalize-colors": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.3.tgz", + "integrity": "sha512-Yrpmrh4IDEupUUM/dqVxhAN8QW1VEUR3Qrk2lzJC1jB2s46hDe0hrMP2vs12YJqlzshteOthjwXQlY0TgIzgbg==", "license": "MIT" }, + "node_modules/expo-updates-interface": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-1.0.0.tgz", + "integrity": "sha512-93oWtvULJOj+Pp+N/lpTcFfuREX1wNeHtp7Lwn8EbzYYmdn37MvZU3TPW2tYYCZuhzmKEXnUblYcruYoDu7IrQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-web-browser": { "version": "14.0.1", "license": "MIT", @@ -14440,169 +14871,23 @@ "react-native": "*" } }, - "node_modules/expo/node_modules/@expo/config-plugins": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.9.tgz", - "integrity": "sha512-pbgbY3SwCMwkijhfe163J05BrTx4MqzeaV+nVgUMs7vRcjHY1tfM57Pdv6SPtgeDvZ8fvdXFXXzkJva+a7C9Bw==", - "license": "MIT", - "dependencies": { - "@expo/config-types": "^52.0.0", - "@expo/json-file": "~9.0.0", - "@expo/plist": "^0.2.0", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^1.0.0", - "glob": "^10.4.2", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/expo/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/expo/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/expo/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/expo/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/expo/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/expo/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/expo/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/expo/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/expo/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/expo/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "license": "Apache-2.0" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.2", + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.2", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -14686,6 +14971,8 @@ }, "node_modules/fetch-retry": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", + "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==", "license": "MIT" }, "node_modules/file-entry-cache": { @@ -14879,6 +15166,8 @@ }, "node_modules/flow-enums-runtime": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "license": "MIT" }, "node_modules/flow-parser": { @@ -15188,6 +15477,8 @@ }, "node_modules/form-data": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", + "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -15226,6 +15517,8 @@ }, "node_modules/freeport-async": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", + "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "license": "MIT", "engines": { "node": ">=8" @@ -15240,6 +15533,8 @@ }, "node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -15252,6 +15547,8 @@ }, "node_modules/fs-minipass": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" @@ -15387,6 +15684,8 @@ }, "node_modules/get-port": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "license": "MIT", "engines": { "node": ">=4" @@ -15394,6 +15693,8 @@ }, "node_modules/get-stream": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "license": "MIT", "dependencies": { "pump": "^3.0.0" @@ -15485,6 +15786,8 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "license": "MIT", "dependencies": { "array-union": "^2.1.0", @@ -15671,6 +15974,8 @@ }, "node_modules/hosted-git-info": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" @@ -15681,6 +15986,8 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/html-encoding-sniffer": { @@ -15986,6 +16293,8 @@ }, "node_modules/image-size": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "license": "MIT", "dependencies": { "queue": "6.0.2" @@ -16012,6 +16321,8 @@ }, "node_modules/import-fresh": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "license": "MIT", "dependencies": { "caller-path": "^2.0.0", @@ -16023,6 +16334,8 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "license": "MIT", "engines": { "node": ">=4" @@ -16074,6 +16387,8 @@ }, "node_modules/ini": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, "node_modules/inline-style-prefixer": { @@ -16095,6 +16410,8 @@ }, "node_modules/internal-ip": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "license": "MIT", "dependencies": { "default-gateway": "^4.2.0", @@ -16126,6 +16443,8 @@ }, "node_modules/ip-regex": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "license": "MIT", "engines": { "node": ">=4" @@ -16133,6 +16452,8 @@ }, "node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -16330,6 +16651,8 @@ }, "node_modules/is-buffer": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "license": "MIT" }, "node_modules/is-callable": { @@ -16385,6 +16708,8 @@ }, "node_modules/is-directory": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16504,6 +16829,8 @@ }, "node_modules/is-path-cwd": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "license": "MIT", "engines": { "node": ">=6" @@ -16511,6 +16838,8 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -16589,6 +16918,8 @@ }, "node_modules/is-stream": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16684,6 +17015,8 @@ }, "node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/isexe": { @@ -18681,6 +19014,8 @@ }, "node_modules/join-component": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", + "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==", "license": "MIT" }, "node_modules/js-sha3": { @@ -18886,6 +19221,8 @@ }, "node_modules/json-parse-better-errors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -18920,6 +19257,8 @@ }, "node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -19001,6 +19340,8 @@ }, "node_modules/lightningcss": { "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", + "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^1.0.3" @@ -19027,6 +19368,8 @@ }, "node_modules/lightningcss-darwin-arm64": { "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", + "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", "cpu": [ "arm64" ], @@ -19043,6 +19386,186 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", + "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", + "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", + "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", + "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", + "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", + "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", + "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", + "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", + "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lilconfig": { "version": "3.1.2", "dev": true, @@ -19371,6 +19894,8 @@ }, "node_modules/lodash.throttle": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "license": "MIT" }, "node_modules/lodash.truncate": { @@ -19381,6 +19906,8 @@ }, "node_modules/log-symbols": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "license": "MIT", "dependencies": { "chalk": "^2.0.1" @@ -19695,6 +20222,8 @@ }, "node_modules/md5": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "license": "BSD-3-Clause", "dependencies": { "charenc": "0.0.2", @@ -19809,6 +20338,8 @@ }, "node_modules/metro": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.0.tgz", + "integrity": "sha512-kzdzmpL0gKhEthZ9aOV7sTqvg6NuTxDV8SIm9pf9sO8VVEbKrQk5DNcwupOUjgPPFAuKUc2NkT0suyT62hm2xg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", @@ -19863,6 +20394,8 @@ }, "node_modules/metro-babel-transformer": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz", + "integrity": "sha512-Dc0QWK4wZIeHnyZ3sevWGTnnSkIDDn/SWyfrn99zbKbDOCoCYy71PAn9uCRrP/hduKLJQOy+tebd63Rr9D8tXg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -19876,10 +20409,14 @@ }, "node_modules/metro-babel-transformer/node_modules/hermes-estree": { "version": "0.24.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", + "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", "license": "MIT" }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { "version": "0.24.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", + "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", "license": "MIT", "dependencies": { "hermes-estree": "0.24.0" @@ -19887,6 +20424,8 @@ }, "node_modules/metro-cache": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.0.tgz", + "integrity": "sha512-DyuqySicHXkHUDZFVJmh0ygxBSx6pCKUrTcSgb884oiscV/ROt1Vhye+x+OIHcsodyA10gzZtrVtxIFV4l9I4g==", "license": "MIT", "dependencies": { "exponential-backoff": "^3.1.1", @@ -19899,6 +20438,8 @@ }, "node_modules/metro-cache-key": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.0.tgz", + "integrity": "sha512-qX/IwtknP9bQZL78OK9xeSvLM/xlGfrs6SlUGgHvrxtmGTRSsxcyqxR+c+7ch1xr05n62Gin/O44QKg5V70rNQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" @@ -19909,6 +20450,8 @@ }, "node_modules/metro-config": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.0.tgz", + "integrity": "sha512-6CinEaBe3WLpRlKlYXXu8r1UblJhbwD6Gtnoib5U8j6Pjp7XxMG9h/DGMeNp9aGLDu1OieUqiXpFo7O0/rR5Kg==", "license": "MIT", "dependencies": { "connect": "^3.6.5", @@ -19926,6 +20469,8 @@ }, "node_modules/metro-core": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.0.tgz", + "integrity": "sha512-CVkM5YCOAFkNMvJai6KzA0RpztzfEKRX62/PFMOJ9J7K0uq/UkOFLxcgpcncMIrfy0PbfEj811b69tjULUQe1Q==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", @@ -19938,6 +20483,8 @@ }, "node_modules/metro-file-map": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.0.tgz", + "integrity": "sha512-zMDI5uYhQCyxbye/AuFx/pAbsz9K+vKL7h1ShUXdN2fz4VUPiyQYRsRqOoVG1DsiCgzd5B6LW0YW77NFpjDQeg==", "license": "MIT", "dependencies": { "anymatch": "^3.0.3", @@ -19961,6 +20508,8 @@ }, "node_modules/metro-file-map/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -19968,10 +20517,14 @@ }, "node_modules/metro-file-map/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/metro-minify-terser": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.0.tgz", + "integrity": "sha512-U2ramh3W822ZR1nfXgIk+emxsf5eZSg10GbQrT0ZizImK8IZ5BmJY+BHRIkQgHzWFpExOVxC7kWbGL1bZALswA==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", @@ -19983,6 +20536,8 @@ }, "node_modules/metro-resolver": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.0.tgz", + "integrity": "sha512-Uu2Q+buHhm571cEwpPek8egMbdSTqmwT/5U7ZVNpK6Z2ElQBBCxd7HmFAslKXa7wgpTO2FAn6MqGeERbAtVDUA==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" @@ -19993,6 +20548,8 @@ }, "node_modules/metro-runtime": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.0.tgz", + "integrity": "sha512-6oYB5HOt37RuGz2eV4A6yhcl+PUTwJYLDlY9vhT+aVjbUWI6MdBCf69vc4f5K5Vpt+yOkjy+2LDwLS0ykWFwYw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", @@ -20004,6 +20561,8 @@ }, "node_modules/metro-source-map": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.0.tgz", + "integrity": "sha512-TzsVxhH83dyxg4A4+L1nzNO12I7ps5IHLjKGZH3Hrf549eiZivkdjYiq/S5lOB+p2HiQ+Ykcwtmcja95LIC62g==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.3", @@ -20023,6 +20582,8 @@ }, "node_modules/metro-source-map/node_modules/source-map": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -20030,6 +20591,8 @@ }, "node_modules/metro-symbolicate": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.0.tgz", + "integrity": "sha512-C/1rWbNTPYp6yzID8IPuQPpVGzJ2rbWYBATxlvQ9dfK5lVNoxcwz77hjcY8ISLsRRR15hyd/zbjCNKPKeNgE1Q==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", @@ -20049,6 +20612,8 @@ }, "node_modules/metro-symbolicate/node_modules/source-map": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -20056,6 +20621,8 @@ }, "node_modules/metro-transform-plugins": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.0.tgz", + "integrity": "sha512-uErLAPBvttGCrmGSCa0dNHlOTk3uJFVEVWa5WDg6tQ79PRmuYRwzUgLhVzn/9/kyr75eUX3QWXN79Jvu4txt6Q==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -20071,6 +20638,8 @@ }, "node_modules/metro-transform-worker": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.0.tgz", + "integrity": "sha512-HrQ0twiruhKy0yA+9nK5bIe3WQXZcC66PXTvRIos61/EASLAP2DzEmW7IxN/MGsfZegN2UzqL2CG38+mOB45vg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -20093,6 +20662,8 @@ }, "node_modules/metro/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -20106,6 +20677,8 @@ }, "node_modules/metro/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -20120,10 +20693,14 @@ }, "node_modules/metro/node_modules/ci-info": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "license": "MIT" }, "node_modules/metro/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -20134,10 +20711,14 @@ }, "node_modules/metro/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/metro/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -20145,6 +20726,8 @@ }, "node_modules/metro/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -20152,10 +20735,14 @@ }, "node_modules/metro/node_modules/hermes-estree": { "version": "0.24.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", + "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", "license": "MIT" }, "node_modules/metro/node_modules/hermes-parser": { "version": "0.24.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", + "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", "license": "MIT", "dependencies": { "hermes-estree": "0.24.0" @@ -20163,10 +20750,14 @@ }, "node_modules/metro/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/metro/node_modules/source-map": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -20174,6 +20765,8 @@ }, "node_modules/metro/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -20184,6 +20777,8 @@ }, "node_modules/metro/node_modules/ws": { "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", "engines": { "node": ">=8.3.0" @@ -20251,6 +20846,8 @@ }, "node_modules/mimic-fn": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "license": "MIT", "engines": { "node": ">=4" @@ -20333,6 +20930,8 @@ }, "node_modules/minipass-collect": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" @@ -20343,6 +20942,8 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -20353,6 +20954,8 @@ }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -20363,10 +20966,14 @@ }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -20377,6 +20984,8 @@ }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -20387,10 +20996,14 @@ }, "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { "minipass": "^3.0.0", @@ -20402,6 +21015,8 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -20412,6 +21027,8 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/mkdirp": { @@ -20574,10 +21191,14 @@ }, "node_modules/nested-error-stacks": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "license": "MIT" }, "node_modules/nice-try": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "license": "MIT" }, "node_modules/no-case": { @@ -20733,6 +21354,8 @@ }, "node_modules/npm-package-arg": { "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "license": "ISC", "dependencies": { "hosted-git-info": "^7.0.0", @@ -20746,6 +21369,8 @@ }, "node_modules/npm-package-arg/node_modules/semver": { "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -20756,6 +21381,8 @@ }, "node_modules/npm-run-path": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "license": "MIT", "dependencies": { "path-key": "^2.0.0" @@ -20766,6 +21393,8 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "license": "MIT", "engines": { "node": ">=4" @@ -20933,6 +21562,8 @@ }, "node_modules/ob1": { "version": "0.81.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.0.tgz", + "integrity": "sha512-6Cvrkxt1tqaRdWqTAMcVYEiO5i1xcF9y7t06nFdjFqkfPsEloCf8WwhXdwBpNUkVYSQlSGS7cDgVQR86miBfBQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" @@ -21064,6 +21695,8 @@ }, "node_modules/on-headers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -21078,6 +21711,8 @@ }, "node_modules/onetime": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" @@ -21127,6 +21762,8 @@ }, "node_modules/ora": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "license": "MIT", "dependencies": { "chalk": "^2.4.2", @@ -21142,6 +21779,8 @@ }, "node_modules/ora/node_modules/ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "license": "MIT", "engines": { "node": ">=6" @@ -21149,6 +21788,8 @@ }, "node_modules/ora/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" @@ -21159,6 +21800,8 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -21166,6 +21809,8 @@ }, "node_modules/p-finally": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "license": "MIT", "engines": { "node": ">=4" @@ -21199,6 +21844,8 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" @@ -21300,6 +21947,8 @@ }, "node_modules/password-prompt": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", + "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", "license": "0BSD", "dependencies": { "ansi-escapes": "^4.3.2", @@ -21379,6 +22028,8 @@ }, "node_modules/picomatch": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "license": "MIT", "engines": { "node": ">=10" @@ -21669,6 +22320,8 @@ }, "node_modules/pretty-bytes": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "license": "MIT", "engines": { "node": ">=6" @@ -21716,6 +22369,8 @@ }, "node_modules/proc-log": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -21731,10 +22386,14 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -21798,6 +22457,8 @@ }, "node_modules/pump": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -21828,6 +22489,8 @@ }, "node_modules/qrcode-terminal": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", + "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -21871,6 +22534,8 @@ }, "node_modules/queue": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "license": "MIT", "dependencies": { "inherits": "~2.0.3" @@ -21984,6 +22649,8 @@ }, "node_modules/rc": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -21997,6 +22664,8 @@ }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -22163,17 +22832,19 @@ "license": "MIT" }, "node_modules/react-native": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.3.tgz", + "integrity": "sha512-0TUhgmlouRNf6yuDIIAdbQl0g1VsONgCMsLs7Et64hjj5VLMCA7np+4dMrZvGZ3wRNqzgeyT9oWJsUm49AcwSQ==", "license": "MIT", "dependencies": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native/assets-registry": "0.76.2", - "@react-native/codegen": "0.76.2", - "@react-native/community-cli-plugin": "0.76.2", - "@react-native/gradle-plugin": "0.76.2", - "@react-native/js-polyfills": "0.76.2", - "@react-native/normalize-colors": "0.76.2", - "@react-native/virtualized-lists": "0.76.2", + "@react-native/assets-registry": "0.76.3", + "@react-native/codegen": "0.76.3", + "@react-native/community-cli-plugin": "0.76.3", + "@react-native/gradle-plugin": "0.76.3", + "@react-native/js-polyfills": "0.76.3", + "@react-native/normalize-colors": "0.76.3", + "@react-native/virtualized-lists": "0.76.3", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", @@ -22305,7 +22976,9 @@ } }, "node_modules/react-native-pager-view": { - "version": "6.4.1", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.5.1.tgz", + "integrity": "sha512-YdX7bP+rPYvATMU7HzlMq9JaG3ui/+cVRbFZFGW+QshDULANFg9ECR1BA7H7JTIcO/ZgWCwF+1aVmYG5yBA9Og==", "license": "MIT", "peerDependencies": { "react": "*", @@ -22423,7 +23096,9 @@ "license": "MIT" }, "node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.76.2", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.3.tgz", + "integrity": "sha512-Yrpmrh4IDEupUUM/dqVxhAN8QW1VEUR3Qrk2lzJC1jB2s46hDe0hrMP2vs12YJqlzshteOthjwXQlY0TgIzgbg==", "license": "MIT" }, "node_modules/react-native/node_modules/ansi-styles": { @@ -22767,6 +23442,8 @@ }, "node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -22800,6 +23477,8 @@ }, "node_modules/readline": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", "license": "BSD" }, "node_modules/recast": { @@ -22980,6 +23659,8 @@ }, "node_modules/remove-trailing-slash": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", + "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==", "license": "MIT" }, "node_modules/renderkid": { @@ -23085,6 +23766,8 @@ }, "node_modules/requireg": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "dependencies": { "nested-error-stacks": "~2.0.1", "rc": "~1.2.7", @@ -23096,6 +23779,8 @@ }, "node_modules/requireg/node_modules/resolve": { "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "license": "MIT", "dependencies": { "path-parse": "^1.0.5" @@ -23156,6 +23841,8 @@ }, "node_modules/restore-cursor": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "license": "MIT", "dependencies": { "onetime": "^2.0.0", @@ -23325,6 +24012,8 @@ }, "node_modules/send": { "version": "0.19.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", + "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -23347,6 +24036,8 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -23354,10 +24045,14 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/send/node_modules/encodeurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -23365,6 +24060,8 @@ }, "node_modules/send/node_modules/on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -23375,6 +24072,8 @@ }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -23382,6 +24081,8 @@ }, "node_modules/serialize-error": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -23836,6 +24537,8 @@ }, "node_modules/split": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "license": "MIT", "dependencies": { "through": "2" @@ -23857,6 +24560,8 @@ }, "node_modules/ssri": { "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "license": "ISC", "dependencies": { "minipass": "^7.0.3" @@ -24162,6 +24867,8 @@ }, "node_modules/strip-eof": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -24196,6 +24903,8 @@ }, "node_modules/structured-headers": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", + "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "license": "MIT" }, "node_modules/style-loader": { @@ -24294,6 +25003,8 @@ }, "node_modules/sudo-prompt": { "version": "8.2.5", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", + "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==", "license": "MIT" }, "node_modules/supports-color": { @@ -24308,6 +25019,8 @@ }, "node_modules/supports-hyperlinks": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0", @@ -24319,6 +25032,8 @@ }, "node_modules/supports-hyperlinks/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -24326,6 +25041,8 @@ }, "node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -24509,6 +25226,8 @@ }, "node_modules/tar": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -24524,6 +25243,8 @@ }, "node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -24534,6 +25255,8 @@ }, "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -24544,6 +25267,8 @@ }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", "engines": { "node": ">=8" @@ -24551,6 +25276,8 @@ }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -24561,6 +25288,8 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/temp": { @@ -24592,6 +25321,8 @@ }, "node_modules/tempy": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.7.1.tgz", + "integrity": "sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==", "license": "MIT", "dependencies": { "del": "^6.0.0", @@ -24609,6 +25340,8 @@ }, "node_modules/tempy/node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -24619,6 +25352,8 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -24629,6 +25364,8 @@ }, "node_modules/terminal-link": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", @@ -24802,14 +25539,20 @@ }, "node_modules/throat": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT" }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, "node_modules/through2": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", @@ -24854,6 +25597,8 @@ }, "node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -25342,6 +26087,8 @@ }, "node_modules/unique-filename": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" @@ -25352,6 +26099,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" @@ -25372,6 +26121,8 @@ }, "node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -25563,6 +26314,8 @@ }, "node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -25598,6 +26351,8 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -25609,6 +26364,8 @@ }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -25616,6 +26373,8 @@ }, "node_modules/vlq": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "license": "MIT" }, "node_modules/w-json": { @@ -25659,6 +26418,8 @@ }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", "dependencies": { "defaults": "^1.0.3" @@ -25977,6 +26738,8 @@ }, "node_modules/wonka": { "version": "6.3.4", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.4.tgz", + "integrity": "sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==", "license": "MIT" }, "node_modules/word-wrap": { @@ -26162,6 +26925,8 @@ }, "node_modules/xtend": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "license": "MIT", "engines": { "node": ">=0.4" diff --git a/package.json b/package.json index de8d445cdb..c98e60b893 100644 --- a/package.json +++ b/package.json @@ -58,36 +58,37 @@ "burnt": "^0.12.2", "date-fns": "^4.1.0", "deepmerge": "^4.3.1", - "expo": "~52.0.7", + "expo": "~52.0.14", "expo-blur": "~14.0.1", "expo-constants": "~17.0.2", "expo-font": "~13.0.1", - "expo-image": "~2.0.1", + "expo-image": "~2.0.3", "expo-linear-gradient": "^14.0.1", - "expo-linking": "~7.0.2", - "expo-router": "~4.0.6", - "expo-splash-screen": "~0.29.11", + "expo-linking": "~7.0.3", + "expo-router": "~4.0.11", + "expo-splash-screen": "~0.29.13", "expo-status-bar": "~2.0.0", - "expo-system-ui": "~4.0.3", + "expo-system-ui": "~4.0.5", "expo-web-browser": "~14.0.1", "lodash": "^4.17.21", "moti": "^0.29.0", "react": "18.3.1", "react-dom": "^18.3.1", - "react-native": "0.76.2", + "react-native": "0.76.3", "react-native-collapsible-tab-view": "^8.0.0", "react-native-gesture-handler": "~2.20.2", "react-native-mmkv": "^3.1.0", - "react-native-pager-view": "6.4.1", + "react-native-pager-view": "6.5.1", "react-native-reanimated": "^3.16.2", "react-native-safe-area-context": "4.12.0", - "react-native-screens": "~4.1.0", + "react-native-screens": "^4.0.0", "react-native-web": "^0.19.13", "react-redux": "^9.1.2", "redux-persist": "^6.0.0", "tamagui": "^1.117.1", "timezone-mock": "^1.3.6", - "tsconfig-paths-webpack-plugin": "^4.2.0" + "tsconfig-paths-webpack-plugin": "^4.2.0", + "expo-dev-client": "~5.0.5" }, "devDependencies": { "@babel/core": "^7.25.2", From 903f11442904ec36db62871e1dfe4d0c85fccc29 Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Thu, 5 Dec 2024 09:51:07 +0100 Subject: [PATCH 43/49] chore: clean up (#52) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We rely on Expo’s Continuous Native Generation (https://docs.expo.dev/workflow/continuous-native-generation/). For some reason those files were still left, despite the fact that we’ve ignored the ios and android folders. --- .../Contents.json | 20 --------------- .../SplashScreenLogo.imageset/Contents.json | 23 ------------------ .../SplashScreenLogo.imageset/image.png | Bin 59836 -> 0 bytes .../SplashScreenLogo.imageset/image@2x.png | Bin 59836 -> 0 bytes .../SplashScreenLogo.imageset/image@3x.png | Bin 59836 -> 0 bytes 5 files changed, 43 deletions(-) delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenBackground.colorset/Contents.json delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/Contents.json delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image.png delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@2x.png delete mode 100644 ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@3x.png diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenBackground.colorset/Contents.json b/ios/safemobileapp/Images.xcassets/SplashScreenBackground.colorset/Contents.json deleted file mode 100644 index 15f02abee4..0000000000 --- a/ios/safemobileapp/Images.xcassets/SplashScreenBackground.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors": [ - { - "color": { - "components": { - "alpha": "1.000", - "blue": "1.00000000000000", - "green": "1.00000000000000", - "red": "1.00000000000000" - }, - "color-space": "srgb" - }, - "idiom": "universal" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/Contents.json b/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/Contents.json deleted file mode 100644 index f65c008be7..0000000000 --- a/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images": [ - { - "idiom": "universal", - "filename": "image.png", - "scale": "1x" - }, - { - "idiom": "universal", - "filename": "image@2x.png", - "scale": "2x" - }, - { - "idiom": "universal", - "filename": "image@3x.png", - "scale": "3x" - } - ], - "info": { - "version": 1, - "author": "expo" - } -} \ No newline at end of file diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image.png b/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 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 diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@2x.png b/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@2x.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 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 diff --git a/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@3x.png b/ios/safemobileapp/Images.xcassets/SplashScreenLogo.imageset/image@3x.png deleted file mode 100644 index c52c2c68019b49c56da4faf7d8835a8392cfef7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59836 zcmeFYhdJXQHaXO4jIWvB@{(MA$w+KE2Rh-B_lhOBH3G+$(HPd?7cVl zdA-rq_xj!czv}w7yx*^J&hwn}Jmd3J@ro?*UYfl)I5@;|7o@J@;Orv6!P(nR zv>Se-+)KuRgERb4PU@VpJ?_|NTwM62+w+Z-2_iiB?!W*3lfZux_)h}=N#H*T{3n6` zB=DaE{*%Ce68KL7|4HCK3H&F4|6fbMt?gm3YC&CzSbb6Vs&g(gzhB$a*HxZUB~lcD zczabJj_`1Z{^bG^5PpYtSHTt|i&3o!8 z`>$knyE43EOeMjmJxRz;P2V4M<;*?fTXM_NfDm;}zg7YyW_d+A{tVC<#_=Qkg`n{7z1qNa3Wu&gu0z=x*n%~JU zz|+Lo4mclee&FI{UZ;`^Eeq$(&*Lmt^*g&1sOl=y#@Yp9;^+Wk9-eGOd zFL@)!lw2y;{tE+f;qIbi9L}2w)@{iHxTyF~z;c`{h5ZC2k!!vRf)UU04 z*Z+B5H@%CLHlv1`PEN0*TBsyXoui$5pn5;84L7A)I&qkfbVoIMI2|qC?n}Rql}3k8 zE|AY8{pK_7>sAw!o<8N&bl!1ld?w$scHy*M8O6a-Pcm(fH*I}CZXgm+op~pXyWFT? zsfTpYmHG+~WfFTX5vu|G9mj1PEm{+*%N)|fEc!gIM=Gh=sNm*@A4$ziNpM*v`0=-5 ziJmEX0z}d%j8pt$B)Y*?z=W^7QuX(R5}BlChm4yaT6ET$iCBlJbzVq^fo!OCtZUog z6ozy-x5F~zNj(D7>1tw3TTPy&YJMnpc$P{+Ym<7jI>h?Gl}2V!GMw9|KH%e+e6WnO zs(l=2&E3u?S0Xby?~tL{opCc|^PY!~gKoM|Jsc=j=h?($-EN%Li|CT?)%XlcWK4M} zO|yxUnpIP-C*_q>Cs_m}Be}5}1!NlTh^>6cK(=H3u}{0+Ghetp?T41pW`_bzpVXU= zeA?sbn7lzospyeEOB*(UG(^eFzELOP+kLpMb4b8Qn=jd>S4;@PP2?a-&06>V3Jd%cU8#8sy(C+LoIDt*LAnyiC`V`TqK7-Vg8Q zVoQrh;0- zgTjXWlR?Rz>q+xQ1*#vek6JvSr#26Wp>%-nEVd;iv&IP8!6F;`B49p-ricW{mlSV-OL%GqjRCsz4aC=U* z)xi08a`Un9sKYuLM!bQbMc>Rn5)Jc-V*;6)!nLwFl9)!huO|V_!5`>0#P=}Ew=)y( z>`wYdj`m8uwLf3D$+KkGnI@LW-b?0t}bEfP3R>Zfv*paH* zuLv(@?HnzM&QLZG%>PJbjCV0zW7)PdX>YJa@Dag01h+6H*oIMHYGn*@=Q$9?Au!Nk zYSDu`_$p)p(NtFY@1A&$^rQ;{Q0hpJCB)mp_J?NQhWK%VGfGtMBJaJCzQ+xk@V5{6 z!zeH_R=#A91DhvJ_O)D9j!y=%B{HHsf0V3k8gLxJpZmH_ZHNGI=TT&r)ghUnxUh6N zn!nEgYBFuyJrN~9r}KWW`ZC6wOVf8-OdBb)wi_ebX)&$t~J!=nrsp>X7?x+VR^5@1C1{D_?K`Fifo?pI(O`v8>W+F0ve|(30 zhxIc+u(w4AM5U}~jSuA~0h7i}0;WydM&+F$7na^bP@~EmVp{SQqRWUj*p*NqGQB{7 z9mfK}x<^Xm8Fy%$9F1AYe%4X#XQ@@u0w&)DM9Fs)EHIo3r^(!cNZ5HRz04j0QwK)F zZQsQ4LnjvYfe=hj)Op90=F0c1XFD$2n7zG$8{MVB_61+@Y64va&mXOqL2w1EVJ2dB z4d3pn9}D33H5TT(j{;l?1K^eT@uBE{47xpDj^;{zx(+ihEGFMRC$Sw&%0lBjzsQ*8 zQp+_-XUkjdo=6lxdc!zI`!o8ztVR_EB?=($JEpQ!+k&PXjgBLx&5#!fJx@HfVIY!w zp?$|6`EVn%17CI68zNJd;o}ZoeZ4bEA`t0!l&#uy9;6^l>ArXYB8X3eZ^QW=1=2u7 zq^Is75PgYIXcgx!@^5&>Y zAmO(dtg-k+f9cQt=2aU%s)f;4#>nI6bFF0VM9z%iurGVsQ;DVuN7Q$Gv-iAW0L19{ z@yh7k_T6(5jXSCZHq&710a1oMARY{q#-3~LLOc9%i|Wvc3ZSJbqaO!W7duAN83L$x zME3){AH>M?8i0O$4*_vLRrydVh~5ZA?+iLo$}8Wc0|pqPu8D{wD7-<`U%XFb%_&1TxY|HhVlvxW4W)oexHoV@n zEh$=gHpY_!9|{V>+=(F~(r>wZw?!?#yA5%MR#AkX48o*Ie=AbSQ3?H!{@Ex^!snei z4D1p9F$|0I=99BZG)yySkMm}hZ_NMT&8!h8*EFC?r8XzgegxnK-wM^o0W&ddI%3p5 zSHiGSwmMO;7!g@Cnw&SWoUl0;ys^sO9$%BH*B}ic4___a(3j8LFm33VccxsZfar5+ zDm5Td`ETU(Ty6zc=Xbj-2TzJ`dKWDz)H3r9){CBYhvbgrM2sJ zt}9?TV>2?xbe(h^vn~{eM1yjWjL3CFpCn7|HiyrxjZ#?y0-qV>q z-JY=}kkKDC@Xclx`f0V+u4sLQ);xcjs(ZCIOUt#-M{wg<7Mv#Fcu3pzqM1{RT1)kw zVoq8C%ME@mbCKhqh+4-OIPFaCsZ}#u z)#}!U=<3y0>*{f*z2fB!36cHu>V8MHHvES3)2k3(?~pR|gLJ@s#tOXvA^m}4U#s1P zcmsv3OyH4$V%VoT96fbQmm5}<4uGxEk7p@y>=__pO$HX49vSLpG^`jJQkUs?Mo(iX z(*DdgZk#$+zR`BB7~B%6PXj*FuzESQsDJ}otf!2F346P*fcy$ctd8{@hhd{mtj=69 zP}67hhu19)Wh;gZL{>5_H`j~q^-SbV<}B82uGN`m=rs7xNvym~HK;HM^yL-~pr?uT z<~zJ@EJNx;PaPX8E8{8^%J;Q8FN8Nuez4l4sq-kfRztHUPqDe4)rq3bjajSXke!&X z-8MI$)cXknG!2ccM_=u@_4UFASoz@VPe8)r&qaT~wZ^xkV{3hz6X%O8y1CZAcy4|r z6q|Byvg@|0D`-2Gm#1GhjsRgdT~6vUMb*7Lk)>6%Tp;ee{^MuldYfI*Vwd>xPrJfd z3=9u-2P*hw^)eg&IgHxcZOhRgKWp+?Lv;rd`1J=w#_DudSFK#>+ao7Giu*B#RPa!( z&YG@Tr4|*5!*{ZGYuDFvF7Wv2(l7OE6>hF|*>&42eo)Wa7)#k0;p%?ny}m9KD73h^ z$g96F*cmCy6Syt}-}$e@Yps#y7YB~b%A*Zx*O%jUIeGlXxOm_(^n0sR*uWcfpQ=mW z8tJ_*4KU+epaQT!?loCgws9Gb0)N-z8QeGq+vG%6k4@IC>%xK7Lv#z9Hna;(#c`&@ zR0(l10WhYaI#$O`8}$M+g-!>y#qr7o9uFA?2w!fGyMHY#D_t&(fqU?>NTW25Ra}lU zuUy!9UQ;WRQ6hZ%|I|>=f%8k=XJ;K<=U*m&GmvXtA_X- z4saGNH6d;BIkBLw*X{XtYpVrnM5@tm(BCpciXMe9@qVq24$&PjKRqiL${Vt*#4Fpb zTMLge%ku<=*wHX)JUbG`>p4&zBexKydmJsfeQXN;@#^sVH#DlHU8H#RDNT9w1CFQ3 z>G|?~b@|!IEH5IWuh+=TE1rz~>N1s;|9N->=a;?-9gcluHK?nW;rQxu4{4M1&uDO> z65wQ;*xLtG)4&^}?~fS6zj12mHU6A4@dJwRL}0x9EK{g}e5gQ;pFx^|)qC$F5ZRC* zO(`{g%gcw(_YS&D3~n|=ZVWFLTJ=|*+SF=<)xFt6r8|xo!y8dT-;Wr8mnKO!Y)m&K z;rGs57U{p?(!a5fVRNZsQ<`#fSbV)_(sfilrRXKcy^SyUq+)B8v3|~Tu~cHV8*7gU z#XqK532zp6I@gIJo9nV#bk<$G)LaUcnzP>ycE0 z;}Q}84?55q9-;=cc79fTb9QqmuY3KcUGlB_{hRXed@VbAGUPnCI30KyIo#vC=Apda z+y0Pl;21c+aNfz&;7z^3$L=^#-2r(ke+GUkA%Vea?Jc*Ny5%Z$(4xLI@GP#|;%8y7 zlThz`Q_e3PfUe2zcCE4T@vgO6a1|e>l5K5muS~+v)xGN74(l0Z8To#;b>X6mr4*6* zOZ7~CPHWMw83xl%Rmj;$f6)4;4t!^`a>I@@e52VdUM7YbAHbJFp+A}YbZfF*+HD7X_>b%5NU_boh=g*ptETNnMJM8tnXMjNGiCIl#h(@JS<9e$@`I1to9UxAS}v*kJ#+Zm0R?lx}q7HBq}hK!jkjR*@|_ znU%>Rl2@Jh)GutM<$Y9Q3-u*_VlN}>&y$L;v|?YV0#nu+E^%qDjJz3)bR0J3(%d_l z1Zl#b92|%?cjFZA;uMpg*uoOBtKWf8TN&? zMJo?(a4LASB)Dkq5&DtRWx&B8PJTP*Lp5Gnm*ZCex-KJc6C&>;Lm7$oWN>B|k4Bqs z4!xn`(kKA!740CP+SVwu5)pBLu+#F$i(oGOR7W86n9@BNTz;pby{{#JLm3npix6_0 z_{ysvd4Hz2sV;wIM6hsUbFJ2@X#NXGiCCOhG>8*2$*rtON3O)tc(J<8Nqc9Oro%=XJH5kFLq$aH(p!Cc zhu{8w7U}mO&Dk9ebfP>^9-a4@+Ldw(dp;hzeLZ1=&5#D8yWnwybjH=D$@_SuTd zdA#frwpl(`;WCoss{g+5g-Y zTlgB4`1~-odH8LlHmxYBOh@+B?%p2pca*dz0BY%JZMQd;-XHRXR_^YK5|ESSrn;_9Ew5#pU)toIph zNm*ZYT{MsU+WXa8L45XmnS%2QW)`#fz!?c#G^~D#LyEkTn3#Ycw{DNE9fo;c$ z-_&5H)9{F_#9Ri|rr+l5Ddb|mnJ&c!Yv#}8Z7y0B*l?oe}%)!8cefbMYfmD$j z)&i}fRtud}u6=?@6SGC@{ansHk1o}T)4E8Co^Id0wAuEMVM<`KL~N?N+gLQF zmnh|9nb9Gfx?RZv6qn8T+i*Nq$0B$yq!#GrF`YYZ=@@Guc{iEm+?SXL{TGHOPM$lJ zPHnpQgh%>nK^YUHS5{fZiRbEp>9YQnX`>U2jJ#bYyI+mx6m~sa{4n`8P-1d4&pVB} z=-~#R{{h99rgAuClY{4_l*4S@o;-PC6ry-gng|y+muXdOcc`7z z7M5Zzw)YLW^@ehHJKQ$?{b`id*Uv*wKRyP(=R&$@YqNKU#Tku>!3x%am6G$Zo8QLf zsE2&_;NlYDN?>a@l8_xZpj1OHh%4!4X1r(?wq9)RG?67XKa^rWCC1*wek zGW~KIPP@Q`zdV7u@JR0?cTv1v;C4*sXShTaNOT?rjw%wBUr6DC}ZABgD zt!D~1D@0+P5(Fti)irl^pWOoR2^ zEtuQs$41JIqZgK^p9-aI zWX=~r^d)s3563?z*BAe)Pb}%V7mFA6uHALBtxrFfbb)?CWX{?iwH~y+WlOfc3oO@-Eb{j=$f-DEb><;Y|!`^uKH{}VRG(vY_etk>ktBRu{~)fh?v2#aHvE>`M5k9+ItT-569!ab3a@MuypHE3!}lVO zi1QE5FXLzXTo!(@MnyGP=Q6+>X-3c>I@NC1^mTJ-y>o?YeTKEm{YNH=NsRcBr@L=< zJdlkzJjOSd|JYQnlK}VFv19M#L@JpR`Yub_eY4YP01_ntXB6rA2Vz0}rP?OrGZ(cPk36*%?{cI* z)T-RPv06tjeod=;YH6%Ghx>e;aqIC?8!tSf|G7XXSe6O?e8l7OuT%+KpkYCQJJk2b zOH&6)?l!(<9*QN4B0cwu<{Qtxgdzd4{M_7tGs|Dz3V~6{>;hdsZ)rI)w4+&k5c@5B zOgtDg^-g#xf;AKEBF#n;3f9tasOhoJNqzcgd8sX-kj$hi?wTA~*9|;397f9|keAcD zQ?2P1M_nkxkoz%TA0E-#zh6csm6!-OnoaTm%U`%D@ld>o<4*WOUS(WX*7vpHZfE5X?Ro_my8@el>^r(a~|F@@Qs<0P{ z2UEks?HgPt4M=St_60wFUP66pIgr9CQ}i8O z*cnl77u`EzVtaCR0Lwn)o=wBH!mrJOT5XeT!;I4UD1Ch7H*#}xHC8vx*87UmCj-qo zbwjRycIaSNjaNI(ku;TQNO}3&Noog8`~t3RACjAFjQ`MIN%rW!eqWuse4K)jZ6GL*ZSPDrJJLNGmTH%)0n<9 zN=Y#{NN+Q7q@U&Ed-twp!XmqKi7diIh^&~Y&U;8h^X9XHgJD`$XKtAVr2?9(y?KLc>n=;{CnS_l;T*v0-A#moihMhUPc=!l z7^wr22ka%no$hES7sQ_OkbkeCDHpy}Re2N^Z7nx>XJjWFZU%nT;>_!bx|PsKYnR61 z%yFghL~?+qE$pLwTZ4ZeZFgO=`R{uvw7JRs0-r`hPQ7K$r@xjZ6{x1+HbDzOHZHkDsr7A<@?40BE>tbe1q*%oQgKxnrMO6Y~J|%LysW z5KnH?a$9Qv_3vzB@RcIm%@ms$mB-4rrWPq~@jK-66=bx%9$+3GZg~H=9d-9&$^oR- z8VyyeGa7Ks5WPD~A)jku-BMXbmN+u9Ry+{TA~+Xy@LrMg{NlsYe0;sQzu|b`z3aQ0 z9I07yZrQHq4WH^()6kI9O^yp_J&x1?N}CVVdi^R51j*J1Zx!;{-T5$C-^2ld=VQj6 zqg!w`MzQ(HM6`p#`M%%YO~DYQXb(}#XpZiiPp8gJ?qMRw!{e`xf4AW4o2>ZF9iMJT zBAq&5r51tFqcmpid3KY9xw)_Ne%>Es72g;w+87m7`qUBMuF|ZRHGX{@;(Z@I@{pq7 zo+cuGmau&V0rr=^u@`n`F&w&2O!_gS`98`_D*0E7;+<_QboE`cyGk=)KJ2~Fb` zXTEc?C?-p1#4d9gy=IK z&{@&iNTV?#lrJf~Elt$$5c}EUq(hv>K$jwpL_WDgF$iXl7^i(P(#nEw?a!AlGow%h z^@PK4SoL4z3I0|PA(s$Rt$SApnPP#TA3Ow3 z|BUGL7k{9j)bu#up1Tf=jg3!C&>`oygmW)vY^A;b#hc437kL0)N{7e=i8@I^-``fW zO@vaZ&p$;6q&L{-@}p%9{8;@H5fmiq{1mFyZq$5fZ@;K*JJ9(G;MjSC+^*w`lSyO! zZ2Q-gE7fh_(Sn8{bh3rKj-V-dc~tS(Ke5eV-}6M9^@sk5xq9sdQO(hf7`9d3ZLtIy zohsCGjS@f0H-gZJ132Pw?ys_YNfE3KLR92ses>g3$~&w~&O(yV)YZ5``+4EEehNC< z;vJy+9l%f_!WzKo!(Iys>VfU6x3-U5jG44^NDtmvUJC`_$cAjd&H)$$+(Yh$QTlky zP*$G&ksY`wTHpP)W?%u?=FAfUT500-4D>YfD{Hu&D6Sx`-*Wv1IRahcF$fcnmRo-# z5%gFCi}iS{PI6?(0zyl^ADjm%_9jN*YkdwoXqHfB_UAFMrVOyc>?hX>-y zL6)?pYdVSd@!SXyzrcZEsp6p-12lCo0>CMf?t6)v1Ar2570vVGHO zh{vx;pma*%8EIq$HN(Qnn!E39eK<(7_hJM6*xn4nJV~G>t=p6@+dIzVARgZ0tLV|2 zT8Rn$Z(7$v5jDT;dWJlMeRc#EmHU2L4GS)6Tb%X^-t$ChpmskoJp!AZf8=lzwzTM$ zb5aJdInTA}=wmdL@L!4EN+nV(C{iC#4Yqjt^clVpaLU;}|1YxAU?d=5v=E0_f!5db zs!0(7LR_`BkycUnDt#CVNoxOJvF469q7%0jCVPVDuWC)Tcsfb z4YV8q4|3O6%+cf?Q?Ro$Q?LdhfT)3RiVOllq8>j#zo^oU8(H7@K1d3zmJ1uXLAoSMIT6(%yX9hEhmWu8rKKMT;m=c5F$RIZ3r{LUA zT3#yx8IKtgU{>LX>qPx>$Xo7`dVUj2d3kvSbTA(IwC6R2slFUlpWc4~hofz3b9cBw zYx$5LmJw`KB#z&5aSafbq7ToUB7m%iNeOlChu|+ zJ6bl@3vK~7bm`lKRLM-ae%3EyWghW$l}~n)Kb=<>Cl{lb!<==x_-gRXN`a)zDGKI@NCIs|_@pz?#Yp!>;!RwAM!Yd=#P{P*li} ztapg73U)u#j6=nMhAQ6;LbKCnr%I#2wBco`Esy&O%gR+Ex+$lFhBcqv? z=4R(=zOBva$>1t0z@XmW8FC#qoZ@RYc}Isb=%4qZIEJi+yJ%^1S~$M3-=+XKcV)S5 zy7&b>2SBHQawQH?KTbaUcq8}&VfzEN*-9qIMbVX0MZL=lSsP2ViJ$%fvdTX|-pVkK z6A-+64=GnW?DAx9t%8CN2Ny^A$6bgI4Hh{V)k3cPKdHXG#h$ap$X$UmIctBKuXEjc z@{UOi_%Y-?kUrS}$dctS%Qhe@(nYSv^geh;R0wdI);5{h2_|?b zO9ldN>!NoO+k?gqzViw|l&fmalS%0tPl{$fS)^3+1(e~LUPE@Q?k2^L&;-?-FsWUL zPN9Ov_cO58MtRbu(Js+~l2#93eN7a7vM4qpxDB~$59KZ_cN;j*&6VzxeV?R<8-`N( z?vKM5JDZSN^2Pem&N zvu3EYIWPN>r`$hF?1v@#%ipO)LMaFO0;34qA^gw0<+9=9V5RJ9_1GcgzPE1>@lU`p zN+6MaJgmnYp&kqrr@pd8JTS8#=JiEI#|IBN2x*+an`9G*e3{k})lxbQJXrH*% zJ*Q)OKyj4Z|GFzkxz&~+lW9AbPhizNqYbGnN-h>qRdzSZ6z_n$@jXj1!S^ixF%JsN z_tw52fvumM#1dEj%P};F_RuSo^d;Ut!_#Uwl>3+_1JbLy{4-W>^AhZ+!z%kfrHId$ z`Nl&A1-qF@fdp!NQ>s_wP^ud6}b4;VeLzRiY9c3W@?(lo8WLH5XiP%1VdP zHKnqKz|ePp@dt*DY8e0(S)cX-^{!dcjXRE$I`a`SCfawzTo$ql>l+N9=-mDTBAnPJ z?FYZwD+)e$C?FvBwSK*3m1oy6mZ*fRarh~fZ`1=Q8(ECHXELH&nMI?j*wArM-~=hD zPs{^UMMCE``tG{ENVEQ#%jvCa*1Ii1qU0W>L-qXREqhGt5X~;}w@A42n_u~(dPdtr zEvJ#ijZ=#$_KLBT13H2GsCxC4KF>nhi}GnKXN<#ki|6IK!isX+yQr)OgiFR}WMU7U z*al(4tjOqyZS;d%oU1F>w8jijEvvqp4082z#fX`5eQ(l+r0NiOvaFna+vpZ<~U3kK`J=fMw#Ooh*inbKAH`PY&G`Gz|nXmZ_o^-6l~Asm#<7up$a& z9;MGfOrR3N|2+zxsN3(sq-4@NSGwd67FPnLbqQy81DiguLVxQgloqW@6A$&x%#ep zx`3#f!@0>m^gtgvARg>OSZ)~{XaR>HOPtD{cKXQSF-#T16MKjqVF9#L$5qS+x)*Ec z0dI1(H`sE%yw)1$i4mI}wVIXlOX#swM!B%%aKE@y2hYAJ5k^K9W=4su#f6URJz=i- z2RD02e>zYcvWM&xj;EFO_8lERvcAaIqJoe2Uh$0#MZa2nhUG$>$W+rgh&`BM0RcWd zsGKRndq~=6d8N~-vCq){$RS{>x^t)M=vKapOs-K|dqVvZhk0ndz*Oy#`9{*4rA5Je zqlv|Rh6ZaZooh5k)!-Si6tf&c72%ijvDx~}2xqn@Fr_6xA)&RaN#q$1XdW6sLLM|$ zGmoAMVHZQ?{6%2??B7nh4biWBRe++uzy6okK#tE~WpM>xh3e??@H1lfDszn}72}~U z_6KdU7#wi%?3z&RN%8X-&={yF8C5p;_vyEbNIN5 zFunsGB8w8OGg#3Vv%8~E0Qd@_S?VyjCJFl1CkRfpwJGqCbUe>C2sWKYsR=#^zO8gBR zKPFM}f2p@Iwbe7)kHVI?kc$zColi0GR;A`3oVg*h-XV&k6{4c_VWKNx(E5s=^2`nXI92izoL}D2-$HQvN3Q%xTxQyaTFKJ z=f=rF{Jf{HR9^5iY8_x?P3J>p{zhF{l8{;zdSw@hQ~iJrt$B zo+mvaNhBS_CMf}hVXtEs52B_3)QJhms`z81P8<+C!4e~-RLbu~=EbJuq398Vo`bg~ z4~Qq+VoJVtv6P=o^2C8Eem7{1-im!fE^#X%2<;sm^d!t>y~VY_rX^W}fmc51BQ*7| zW?%WW`{^Pp&V^e|6e}}nk@mm+o!Qc6Si9GPH#ZzzBk%}t_DJA7x97r@=#8boVaCBd z!QxTuIF|W#p_c3HyyMmjvzdm6I5}MUNL>*t?$sy2d1|~cz8W{0T0y_M|6<`{!KCw| ztoTZgx?3?Zxj1aMb_^CAgy*!FaV`X1kRX!irP_mo{V6{fo|#m@d7f>B=T=IL=O&fI z8nHCbYB%w|<8J7UeWRl(Z>H#>(7?!e$-}LfiwuX^NTGw)}IkaIuSFeaO>1x|&sNy0Q?v zR-Q_;FORtW=m$ZHl)^Pn2sTr^TZbvF+dgI|qs7D0RS-#)bJeAkV`9-5|dTQ;~bQ}Pvmuso}9&N=J_##gGUcW2LXml z&sUu%-LuOrh7IAB4gQ7@4UI51$($=^nJ?lT4N^xP1_BQ>Y0 zj|Lf+@{@|j0r*cGki36E$>Z2XoakFj9&R(dk~uO&(qIzs6xhkJWTlH9WL4c{l58xH zOHSyZ^l)V4XWN^1@8}pByPd0NmssiV>oQcWRZN<{-yAIZE}#q*bpccnlDv4~D5Hhn z+4&Aa(#h*8B2}vKDoZ~YSbI17S;d!A-@UU{o|-BlolH(j>R@4+n)VaVU+uDUUAcA( z0Gc0+!t3I2TOrUX|R7>rN_-^E~l)k0-;= z0xSJ4&ZBNHmSn$}H@PvFz&5M3@lC;Htwvnai?C=)d9(JljZJnLI|;7Q|8(<8-46a71}2j=f47Ap$|_6Wbehz?dp~;VEwx022HCEGc;U6VVB! z{Bx9VoU&BeFYdXZ#$ILTEeHq$M6p-J#5{=!@?w7p*kI93W&8O8?J1#j@huKpjHDxze#qrNm|A(nK)OA+6*^CYitQNkHUY z=>uNbSCl-+z+3v@JuyCru#t@maLRrJSi|WRej^3#U3CDM8+g!dd@*_`mdbmP?L8>X z2F~;rAugLFU3x3oCj|lwh*_EN#`8+#UC#YL2l`#CCy-&>W zg$bmdGTh>Xt2~twOxXtoY(@NyRo~irGnI_k2m7ox$Bf07K7+Rta9L@xbIpZ{gcc>< zQc{rv?`AB+`V>cfyx9C(g>l!V9>2*AG_?BANi3yD7+2!K&(Q>yqPa_su7_F73zzja zFwfX3wHCRV_H^^DtHHs$8w;%TZHvZ51CBE<#8-k{pU_Nkan?qz&rFi|qLy1{%y3#^ zanX9(=DGqDD1V(_`JT|ZD!!2FX-BnJe8oL^a5F9FIZK(b?jA;f1K9h~H=wio=TkA& z&cw&CUjxJMmoGy~e-rflDrLXC8z_AyG$sf<$d-DIk-x#aaN%i8{#(^!ZwMH@k)Me? z0saU;<(8kUiYEcc!QLiDj_Tr`%E%KhE6H(YXdu9mw8ls{=(ViFRM`e|Db!c{7V&<$td9IN!q9X6^;0ek( z5$z-vh&eSjYVYSS1|GGQ;G=dAN~g1R$gKzCJP5jM5LNh@lb&AW1_FLkux7Giap6pfsqzRC~V)>ISd(L~oHn6I7|`VkNhpM8)T=M0&7D zm>bPAC4PeZN(yEcVlF#=JcX`{EsZI$9gkV;iTjk|!9&$oB5BVPBT3Vt)EBk=AZgtj zLsP4% z`W1Tyet3@3z-LeuKjM^YN3HS_3Y3taJmo<%CZM<_H^2-?vY8zvF>?}!|DZrQ1bFqL zr>D#xP;?$5x2|9wBDvsn5NJLtj6D!x#UOMS6#=A!Lr2Dj>B|ft4TmKWJ%^)Fzk3heHLtx$8<35<8_<4aPqVzO==&=zP zdX+W9n5fA$6_JT2rNrcLf8{WY^W#SYGVh@>Rmf{G!N(^@Awv;{@_5yD&w~0%rvDCl zP+J;i@#th;XyjY;u%k2nJTSH&)vD=(GvA$hulA+3AFV7`(f+20DKwfg`JX9Zj-QQ^V*9_ zBE&E|w}=w-E1uA2hpxLyM#t9ROl(|gDzpj$)?KqUrnTC$>U_wdxUbQ|A7ldUKUCpZ z^Z>Ifd$iQ%ZlQZH3!AZ8dYgk%{&%IHs=xgC%hXl^10w?{qicAXxpgEPYwO2Y@=5(J z5#_pnsZ^<613Dsk(7{yI>aJIvoIbnpDj~XISuUXi^@T{zw%ucVvKI=NcluV*c){L~ zQ#T3&VMGaat)udK*XESdnOfUMQTyx>m<8ZL0-5baO3qSN!Y}?xK|)K`lRc1bBC{|x z#Cmt?Xih1MFwa3r55S9x35Vnh&p7YF3>x2=8Je)gqsA_cqsAoP#edWrpdrd&)YOIK zOhOI>P9_LLU%JPg`$b?NL3iLHbQ|l@L{Yu`@_)_Z17!5Y1n@Q2vTqYr)#kLjz&2evbIr1KnS? zzs_Mv?pCaaW>}F$b3k=mNgDH$r$u=AcjxK=R{owSRnh@}p4T;ubx~p5g=hHG&dB8y zjz9TTBBD-wREwRNNxGC0T@7=N23l+{q+X!131_hSqWxK)Z0V?s4?4CEC-)*}{b_3y z_Z8UL3;P}XqJhlB7$_ejo7mA53~v41^hLF@_gOU$3~xTl;z;|5S~@m1B6bC{wLqF% zT-RI7g<;UZG|MOp>N^am=$s|;r$w%QGxuQKEjgBH9GK!vMt zFUh^RmA|%+Y-aw3Ne|0?et=DoJ;)h3gmf0H%W0}cNB8=uGHR$M#%w^aJc(Iu*UOYP zh9M}yqH35JBUAxsY1^RpG=ch0&~N%8!sciHiXHS#8-}fOM@1tl zMn`GUWLX6r8jwKs89?-{E4RG3pbr`)k0yrIZ?+4gfgQ7HKL-a=^!vmB;0<4q$=j7bfMsVau{xl6>w2U1fs2?^k1V0+2=vd0x%Vp6wJj1(Ekmx z^38*8ZYV@nI7ul7nlnKYQx3l*Ji!cqk!(-yAa9O_#jv)>Ivy12y@AU>eUi~EV~Cxss8)^?4D=%%tZ>wn1Wk5ig08260k;a^Mf3y%Z;3ND9+zkd&It8O!jWSBZqiHne7c;5YLn3H z(Lsubs0K3?4yk)!Zfg~l&t&xzx2NGGTF^sC=T)eezwqd)oU;4fkVpOfm!{E}!M}au zC8e##SLp`?Tcyued#@f*=>?ty`?&F-zy~$V3H+msiha3`lAc-{v8Bf7PaSAXTx>Ip z!*2l!rpQLs5rvC5BSyZmW}bOA7mnK}03csgcg zL~O+z@P>#<<`KlDphb1k(9m=rMkbMXU+f3UlXx3d2MOTLtXknY*4DpUid#W zacCA1EQBpBH}{jrNugF$g+~^k0^>ti_Z%BoemV;iR`BryG|U<0K#&}m_~)Y(@P}3@ zn0BH=8y_d?G>2YaU}6-^5s|_1wB%wCb)2VHV8U1f);U#oE9FOa2O9y?e2QHj=Kk1$ zSl^)?*{R!a4c%G{j#VokwC;k*ks%A_P9(s@DEQO>3Cyi4*^n=Wfj>Z26#^5En#x~C z`d<*7oZ?@_nr0m5v1=awKuBU8bs2CBA7YU>1fzqyu(S&S<0CQZ{{i1)Lsj=5c8Ljh zQGbB{d=w>`M2uLuDjSHJn)Tb`!>y08d<@+Q-QXl-0VsU4H8r;XaM$`P+i5=IUW7(N zu|Vl@5*vd4lS@cO-2``BfDIdNHzJYGO*}!K0gZzXJFQLBq(F1;nIS0fV@(>MtllT( z5>lK9?~ZIocE_!zKi2T#zk)|LC9sO0$QWGnA@<@;2J%&!4e+tMT1bE025D45kLRidSwq`_{6k1k9GZHIL>Xsh+Is| z3g<4=f*=wzzl+Mq;6Th*N$-T^318Dvh+yF33U$%1{u-C!zZCOwdpHeDD;ljE$aO^v zVBFd47*futKYN~sG`RWnm1|B2^Sg%|p z-%%bmcXbvE6SHU(_|Wf9IX24fS#1p1I0H*$kZh%Z0b3-PQ30n$`^CkidXk(EEAC(+DsON$^MmMll0BFDS?=)=|v(GRe2j|@Vo zoChXT!FV!J4(PIxlrW(98O=PS2A%q2DGv2le)62a7NmC}slkxGujy^5gJfYnaDG8T z#a%n@tq%r#{%0#|VX;T38T$0(^830?@N+yj3LlzkGoC$Yvput6>!9sKZGGc4j1pUL z!fXT9;3FdS(MDPJ$LaMk;VOIQ8ikmP0)>$pvLWEeE3nyJtSR1{-^FlaoGs1&TY>M% zk8R3%@F_g05cH|3t0`FO zd457fCiu6uNJoXb^>JDHHcy^SamOi!BZK!_pRTXwe^Y$-aIxR`X@ufrp6EoW*m$zp z&E&eJ=p6BPyF83j3O!V32JXEM;ENhME-R@kC(p{m^a!6Z*+e=d;(|M)^|eu==aOOH z+J2Fnj@_zeNXncz*jm8NXT?I9t2^V6J87J|V(Gnjm-E=8u7pd^6S2q3^UdL=?Kz^{}q! z!D{icm3UR`(};+lM<1%mSW_#_*PjsZI*VO zu)gR4BJwCnWc^z6pY&M-x%4{5V| zJm7|`sxwK7XV<1migp9Ez4(aXDhCbyRDbBPQBqM29Kh2MtX4kx!aYVc+>wIA%-Br5 z=xzmtV!nWYaBoiXLw?!Y95c6C4vPy2<2^E?9;nqo7r0oK1NYGtj-`G4l#IQw;52F3 zc~VzH3J?%mBOj`k#$~L(yCa#Z%31V?jJauef2b0 zhUj4KomV1u^Uw}H#=hsaGxo9?jTT*JIqUqBu^-}kv z&-#%u2M+H)=|`YS4_`pG)N<#=znHg zQXF)jyn)}H(o5fDQ<6SrkLQI>!(jpn7f0IAn`xp@?I5^*;l0W=*5jmvms}2ceaJCg z&)(2{#5W!0>&ZDp z2y?4_PZxZ_O5Wt;;IUbs`*oxHRp?nfX-C-`ned@1Z%P%-Td!m(Fg<6B&mLiGw=N+d zK!*;+V5BQLS05~J?f}7Oa>?hH<9QVc3bi!Yg9jU87WPlj$x!rF$jE+NkV|)aOA+YV zASJ7>PsvfW4f?poxBDfhY?r^NE2d{;gkaiT4PN;kA*WQpV3gjX!FBE67WNFx!4MyeK;fErSCy*g;h@ zU&G2RHc_gZzg7tUayxP@#MioSzf#Oj9%UpjUD-{69sZ`Wf`U1Te7LyXalapoA0@Rv zh}bP$7DFa)ZEdU95L4AZbN1j@U88-HzZ{bB%U0$|&t`A9&y%7EbW9E(*;ByXjy-$_ z2rj93Fuu5WH;OG7oPr!)WJ`;1ZiHL!S`Kdlpyt6b7NWJ0-j02zO19Ie%o*;;~$|v#5a?Zn4qnH)9Z!kRa%(0tSBUiv|{!o$^XOGo4`}m zeR1O#H?EM2NQMlFGAknUSR|AtAww!kp^(gTrpi<*G8K6wW9Ez*OBqsBWG+Nx%IyBv zKIrlM-v9f4K3#I}xo7Xa_8PwHyVf~p>zfm@z9)GA`}6Xy*+AA+Id3A~^VjJ_bXp8o zYhtIhzBO311#~uL-_e^kH7X&8pXnPV?0)~ASvmYvbc`!gaHiu8Memc`>_mx5)5Vj! z9n_>5koE3%sG8$N1`vT60NyIXWEre9PgAb zxI^0Eg}P5PkO*OTagheygiV_~vhe;HBkV*U5Dk)+l-jDg*bK2J5PZz2d9tp!?gOVn zqRQp&$YHX=OkYH!N7kFA7Xk;rtn8~CD;2Q##Adqw5P}L3e-fTA~^79?T5A z&SQElJ`uwXl$)EeaU;r!BMX#%+=L~;tygcE z|BnW%tH+d8R=caV(=lysvggd@=HbQ#oysXZ>Om8HesAffS?Y!yra;0|9cj#{l29yf zqeX^VA^!EqZl8+GC!2O1PZdETO1MCs8v(0^ktZ~Ax#1vnzro@y@C~c?%}8Y&sK}N6 z;myIHiX1Fb(rAdV+7&k_dsO~hM+`c-y0jIhT{*B74CZGh@MBC-S3zsZ%QqV`xhegl zYMwjH5ASj6aq|kx#i8anjR@pEoBb}%5hOuBz22za2dR;Pn1Hmv5?`ycP4VJf?@2ix=FSeG1v%CD7JyZyZ z@cTwA`k#&!ooe92XVmE`R)$BIRIQ@dJzkg>Dc!_gc~K^WNFu;CU`UdJqwgxitgcz;uL$61p`_}QIc2JC$uCTIjnL`8 zbx}(<$<*F6LYE_Yq0}Vp(};fCi2mCJu{R4Ra}rH5Kb==Ag`XpiXEGa#@68n7%URKe z_tQ)T*g@4DLes&`93!avKD(6dNSAGJ<*eF^-qYuV+N7%6&L+cqr)$ow{m8zxcEFL= zT+=h{#E|rmbR&jEW*zudAj)Ed-Z9!1a%tq8kjDkMg(#e_{K+NND%7}!8rV{>nu?n! z{5L&`YfqHvC-c4KmVh{|Vm*Z^TCj<`q zcY-GBU|%A8DZD5*2H|+|baF z=Te$qQewQAb!ySB=u}#J6#HfP-bwV0=U;=r(?57%-7w>lo?l{Yl<^5ZY{>h1J>C4w z;rYZX;Obfwo+01l#^@Es$Vi;qgtSm{r`??jN7V!sXbY2s2C7|rHZbq#$U>>07%l1` zem^fS_{5E$F<$dZ|tc3!mHNttVh-&B!G%agCfyAS)Ug z9yfa%0hE&_xb5{ejVR;0 z_?*O3X(H_-Gtq@VC|YpJowUSum49&8nEkx?GrS8AQm9jK`+*>=nsH0ZL1i zvmPr`Ax-(nV9Ht=*)RS$?|! z=ujz1*gjroVKSg?Wrh9ZGpl`98)P*0*CXFgJ$**j9i&uC5 z#}R$<98qX_3!`&XR`tLSh~XwLhUvGF)w`TMtgL$Y%maP+LB-9^otdh=hbJ=?ntOKh zq5JS`Wpw5o%0FA?Ht%~lxsRK?%Y8654vFF^qLnmclf>dSB zulESF^w>u*GFn&c>dxfF1KdEU!TJ`Kl<;+zpU_apui?37A7g-t;$Iz@a{2kVbSx8o z!_1qs2n6-p7rs!dKLphJ7oi>FJG(jR`B6Zhy!dq>XQiS9aDOYHmmvUQygL8pC1#%p z>i!oxViJEFx2q741UAf}$`$CaamfjsZY*8bjd+-9ArV zrASi+=bjhL+Z0@LeO@G&8+J{SVNQh^P_rCa4ct~#@n75*oP<&-1YLOmBnIV5^oB3LernxbE0vl)V=|rT=|4Y|!|xqN!2iT!p@dD_uNDXKLn><*I$Ui2BuM*# z&n`qv@U5~?lQ0PX^!{(^1jJXFL!!h0In^nZwY*rvNzayRcSQb={28@lf{iTX-3Ud) z?6!VKR7OS4FMM?2_4&zeWGQRuransR!XYgpRQ9RPi|iI|=(pq2y zB7A2y+hKeAO_D7SI`(@-@$PCXynDA%I9kT(&mrgBe-4e#0Sngf9qwlZ8O%}RqU-a% z|5drIXRzcp49|EcA?$JY|c*7H^GDcuF6xjL=Ln_z`qzclxP`(%f`L-d@X>XN# zotddtH+z@TKjf%GV5`n58`I@ETN-lIAgXjb4@$NnJ*vtTmh)zDl=ZyK7z}L56<|kL zwo-$MA=)VM;Txb0AbqGLuXxMUqsI$o-bP0a+L#WY58(r zBP3c@!kJZPTK-E6g~sc+%F-&UJ_ipMa*?m&Zrn zsvZMchaPPe=3)xB&Yj#qcNN2*D9?m#X7It-Ni2 z17db}#2ZWz3=h|QQQgQfw#f(O)dN3OR(6$QoyF_P2n+NXcnXS^+;@d+mB_mGeeyd! z@~3MI@W_Yc1Q+yPf@bpZ?S5w2CF1lzjb7Y)|80VQsf3jC-xZj>XEF#u)?su5>~!vP z3qx+!dBNBgX;%KN-~A`$S1Bz_?Pj}O$Fa13brnfxH~R=~jbheYRXa&+JNXDW^0ccz zs|R|`-ejs~TUe4jfbe~BiP8EFWP$GP9hAtK?~9C&Q>M{Q26e%_7x8m`tXJRiY*!J+ z2CNalpG?+>Cso?IKiz3{4X%$pup3FVXAy`a#98tZR*F&fxlS>UmoCBx$X-+@Z9`t#se?bR1UWLvMY?sKL%bO0#NUGnV{H3f?RajwI(RW8`rdra(7IrB0$) z#;=2s5MLMJ4%_x?Tm?6Nurclp@V2)e9ZBA6We%R84hYkPpl*e^C7}e@zL|c3#-~B6 z^9BaT0zCcJn$_+7u-)C)Ty>)B)%aOd&{`*#XS>{IEv=qBeJKpWzml7=6tfPQV9PI`Z0E7@GlOKTYJOax>C;4Jq=2sy5ZQb z*gQ25=?*UOrGLe28bJjyRl$>euibzx`FE81#V;C7-hI}wv3lHmm|umUb{i-;RRKF` z5m-@*?vWiTOaZ2xa>-!GQX0HJ!5~eQJo@CLZ(hCPPz^{!M7N#pC6KfyvFFP8&^ulSxO>Z7c8fXUaDafD=#-B4+?4w~Zt=%d zfCvOLfK-j>^G+&RS=pCXPh_Nxlr`7<{mV_*ogU$l7HC)E`j<{_*Fo&N>QN9s7W0Al z^y~rN@Il4nJYw(e~TEfZfMfhc8-?7+I-AeJQ_*(psM~*ZVlnNfB0s)T| z_@^g9eVtdx!cZu;YQ;>u0O~#TQ9v!FItcoPy?ggK+7AWs6cA1`+&>0<|NH~fg+DK? z&dv6e^`;m7S~g(9Ke=pe<4TIFbO*nhm)*huOi`ym@hjIwjOZi&2aiy0tRl7HylV=; z^$(2=|5DRzj8%vXP?e_L2T+K}7UX*A=RkGulx5REOSOHs+ln3dUhYXgxa-YfOZ2b> z7;NdwzIiBRRTb(@Pf!1trn^O5GrW|l<(D-0Mqn`kIrch7Rb?FNUSEwmR&-$y^MGmv zXNag)9#o{Nj4<_oA_kFbHe5}N!|g4yN+^zGaw$10!dS}jL7;k>q=v}B85jWxP_5ka z_nyu}#qp!>RlrzNPC%87@6Dms?YkS}np5fu) z_bQM}doc3 zH&Y6FfW~wj9d2AOB|Q*m8eykp(&2Df={b&|hM#Vq$=B$PHhLs@IGa}(ijqg~9k#bc z2G~ZsIx4yJ0c>ND;lSn*-mo8!Jd}VO>rW(U6b)piUst9y`$6?iD07Eg9;!hqb7fn! zSFDWhP;xeb0BhCv{ecPGqIG&2ugbRzE*mKffH|U*sIJO;9gBbx9oYd|m3t9Od!&?m zo=**W+&jdCYEgazpqI{)+4iSNWPYmLNA}IbHSk~-ov+6|ruTol_C5+K%QG)hr$9cT>~yeb`n)tTHPs zZ0>Zol0vx!OtbTK;vl`El;ibDabDmUI@O>DNKYC0co>8j0c~^~$g#s8za=*6*a1&u zOkX?X;=$XgBMWwAL%0Rij>nFpg;Ok27Hond8mc`^EKD#BE?)1TA_@k%UPV45eraS$ zPd{~<1(JeQQ`nc1B0%JUE6sKcH(ce)LXoz0{&*zen5*j`)6siBer!hGN=gGc#PmJ? zM!aYH2yc#fxbUKy&z1LAN9x>1p=LARy-??lkee@3wmIKzrm`#P@WTcol`4;2CdBm} z9y6a)ZA<4q_<^mp_<@q8#DD#C7M4ytKtB7{^Od#P-@+h43*4>lUnF)2yNot>)y|cB zwyh(pA?FSK*gOr*nY6_F-m>Y4`8=8X5i=9#fS5bLC^-0rst@ZkOYCC z9P{V>7KaX*#DnQW($r=O`d~*7yc!_}irffwDEKbkDgdt{V5TyLbX8>?%iGH~Sg{w=d z%E}NP954R(IB@su^5V5fFv7<+tWA`_^$?JzL85^?Qy)K4q*_$r?+m8!87yuD=elKU zh`s;16bqW6T6Pr<9ox|7vwG% z3ou+0Rqjg^QO&NYrz;Uf+071BV6KpSi;Q+2ursTZUYPA?LObVb*Zq48pahI(&hL3S z$KbIL6b>sn8Rq0cTZbU%I4aGbH%0qiaLMh8!}*_g-c$i=rNWhMX*Vt&&B`SQdN~8R zUMtEkQl?V)TkcgmVi-UR+jeVx5FH_E={eHvNL1WUnQCPsXu-QEW+L3$dEVM)u>vU^ zG`J{B1FuxF6d<^d+ctd?hR!dGmwdg7+IoKYuFc zqJw3zY-^Z;09yd8hcQGF_*c-^a~zEIXR*0qek@dUAraaab=6k)nf~^MU;#TS(7M-< zy@jJ*fZ}8YQ0|s$l+F2}^bvVD%rSunuzHWFL-5`py`z9r%!q17M>{`xn!$Fl^6UW_ zBRQeIhZy7tI>18U4YH5-)|B@)7dvOyzCzo=S1AR0fYJ)yKzSVy5nu>=E5tyu-QExF z5qx|r!(){^Ftx11K)EzNR+O5reG^m#UN%7w6?GB#O+?&+B{X#qTG~4E$s{E_t~lW1 z4U1|FbjSG?e>{9$3&)yV=TCizK^M+x->0HL5xsTLXZlz!-_zWk1 zbs=iEa#_GS55Y@86UETj{9+N(aA>;nB_QptDJqh-oJ`>dRxH-EvHt-`BN_crzV! z=!#r8P=kePU}C=79*)-%<;S5qA7cN~A5y0-M1iZJf)<(Pizv=l3$qxl0p~$I7Cbr7 z+O?i7P9nbq-rV}DEauvs#zr44A#a{I1mFge+->yS>d?CrQ1IvKNISSIn;dX|&ETF9 z1Dw$G9{MdHU;~hG?gSNR%^CH}V1Je|^30r-pDk`_k#u3q8~UiG<=Y>T-sr8^N)~2} z0PLV!O85!1n}aWrXrKX*b#!~DG%bS9sO^vN=%JEpTg#OK3S8SuWK-hs4|$p$!uC2f}=m z9T2#LEVheB@|s!qz78T8QeBkJVcbiTI_4s<-k`kO($Dxql~JD(;!nfwuPGLq@)Gj9 zTb?XdAgO|^l_kLXPy^l0^9W91?;tiW{t-s3V0~AYxBqP|dS{EPNsTvB zoL49>$=VF9AII>&K1*eJV$m1CHym`An;a++P9H=W02wifB5zb8!d!+2fs4jw2?V}6 zLX@hAylS2*pWPb$xzw^d3}FAwX9tHT|hdB|LJ|>R&w~(-A3GxL#89?L`O570W!fc8m3o~CC zcNZ75+aL8;&qhrS7r1{MVAzdeqZ35XFI-D#PeZP@5YbPf0l51b{6^Vjs%; z@UQfE-W)Cj$#EN2p;)d^=tR&#O{4nARg?Wy0ZhK_~~+u^r(@iqUfy-ACqM6$_T! z!*h-5@66YzWNzNLgEck?Atn*k*Q#tvQK!Dx_mzsJoyFk<_VjFDKtH&(=&|z`F zdbL})a3>ZDu44542dMLMB3^w}H9mhSH-$*e0HlKb&@4S9_rPS*k2+uMCJu=b6Pgaf zMVq(20af@l8%#VJ-D1 z`<{9P9Rj&7H%8e$ms{F(i(|YUmVv8R|FubY*lN;h>(W0LuyieIKXj>PLE9|k%WN_T zAZw_X+_>UU2s@h)G*~vj)Qi}VZ<`o%Wg}7@eiZpOaUEnrkQlkegX-%!2FkyX14mw7 zLLyURWgw}@e=mc=x5aHClGmdiMK7`lHn0JQ5t-|CYO>Y_aVH=0%wDl1RRk4 z5Kc?{dJ;QO82cdP5*_LTfZM|uqPB&bmerPN4*igk%LnJzsVRL&j_zu9N26y0d%?*&BEp(H=QzPI-q;E95IdU_^E zJi9?+OAEFG3msn_j)Q%1+YREQp@dk#2lSqe3J7A?wfpc@5%L0U=o`7g7#~g~TEWH0 zX{tSJ-f2mG_ZS&x?^XPYfF3EX*0yK1a|^atIIZ?MFa>LS99^!A{~?fRT((4J6H*Zi z-_p^f4q_%R|9$_^aig_PYOWKczF(8_iUK^`N!0>ScrVa8tO<@M7B*W~(#$_>ZZ~v? zz-nPYYPf+AyxH><&keJ(BI58F@Nj|xZnh-wTF0!g_79H9=Z3!b^a;lv=wE(vD(zA< zG~Jl6oW7(AoqE>9cB^QjYO7>RLJ*}6A@NeQRWlpv1$lN!f(QChpkc2WGa^-jj`35l z87uf(M-sk6gw{Sdwp!}zN%#ytO}_L*g(;f<9BTNJBvbAY{hWI#a@k*O>2inMc*)ch z%{I|@{q}Psq&aD>QMupUo>ajZ<+HOZY4*VJp>kf}TtoR%!{qq#%5NEH!nE;NmcG7B zYAt7FzxFNIH>SFOqWTu)o?R=;<)%wc2BAEdS{sjV;f1dv0roKH<4^(#64*{ZRj{9!ewiLzQRj)iwqOfT=5E-M{Le z1bMC;>h{=A@DWr@(TUmr#dJ>92 z-Qs(WUyj;_f%@`$riv!NXdlS|t2ke3@}T`w^1Yd~q7uwLA zb_-6!&c_XXY>8dm(5@DlBg+1B^{7%43ht4aVtf)FZZ`!8_nQSu6ShXUP?5>KpH;&su;EF7sK7qge_Qa1>Hi=HMK--DaFY*<>SO}(_KuSB*`i*w8Rgp z6ik1%2)#fHa{JxSMT$p<`BFmg1A_OA)jpt=OO`%_G_6dKCY8!>5$0hmo!srk)Cg3Z zb6Hq~24dKd#F1Lc_VlG`xarZ9JVKS%5p)4mnazfP8g@wl=PSxB*u@My>+G&1N*THp zJSIz^yfkDVmLLaLh0K5J7obT!;X;E&rSm@r2F%q10WDyeDJoK;Y&1=C<0UVP2+2)M zKyk6pNX%nUhWAGvR5~* z$r4BYcMU*Yi1S{Y-M4rP@D5hILKzgC+`+U38!7hR0#PC=?Nwvc2}($xV5g59|L%G2 z%mhAg?8*MK(xmycLwd>j!y;DapsIKP+H3b%D1ycv@blhCB;rFhmTrmS~_l$F_?(?>0dpt(HI z;biK~s{+crbLTFQC1#(rj5l!WW7-IoAv}%*9w!IY)4&AatT0PElhrCp?Wg+j8si}LR%NF^f*$L{7e+_`%8`?pw^s~2dw zO?~+1vN~cIlqH-TBgj-PMqfN!X>co!qufkC*3d_5iV&Q5WY4egy_#X|5_HN$OU6%R zWJ!0}AMmxk`Oaon!0hmV5Hj%W>p+&#tNh2GJTIL&ku`2Frl{UZ%%VBGb)IT|$s=Xa z#r1a?FYHluJUOUx_$&R?0cQF!(ue)R7S@NZo2psZ)3^=wc#jPf4N}Ed?H!{D;Qdv; zqDN{E)##@V?8M*Ec`rg*3_3nIP7|=xp!Re9@19DEZ(4IlEsonaG@d=HU{L$#{2`$( zC)8=xr$+`>Q-4+{GEOtr)#LX8;r{xT%;|vFy#%+RFP3-5)o&CFs|gy{P@5p*Et7MTY9(4gBc16Ee7)5yEgkj>KrcX+JP-X1Od{b z5rq~1voYG4t{TEE#pV`^7V#sURPnN{?H%?DC&tZRnAK%u#4(k+4?fMlNzR)_+#Ime zlIm7%!3~G8s?BiM|A-AfgIr>1khDZTp3NH+WSuQzv3VFQS*4!}G)-#Oe0SIcde zyK#f_d1`vv>H@yB=ULkiJ7xx6$hGq_pCW~9#MuP-qxk79EsD+R1em9^yJG0{!67CZm=)5}1 z{lg{`Ju6~YtM(d7U%7(mf!pZe)Ds-rJtjzVZSY*z*=(QuKO%3ol}k+OOS0(oWE>Rc z9y^7!9usiBj!}d`C1|}_(}VKdU+`7G&|jawIsP-#a_5&pZCS>*7@B!E^rQgZ5F}rQ zB3*ukaF;)yTSL))I?i0V>0lw}7L4z98TlF06gzkNTZ-Pyj@r#nvTydqbQe$mZ2WdM zfZHiqpqQS6WJqeh36n6})U-oxVGiusEo~4Dc^QUK9@~tRsGLOg zG}1^;cGi3o9Ao2}^K_=Oxrchr7!Hwl957IdlGwjj-mW;a08vG}+IZj{coi>ZRrH*a zyP4o>1e;OC2-|giT|1j}EK~Rk1mq0s#7tN#|96!yj>>R217k9=jbt{R{Pk;bK$g!D z7v356@~#y-klSlH);TR0`tdJM56lrT!mP&NQOq73X!r&K3NvoE4U{`CCr6y_j2pEQ zDIH_ZR)?=}kk-{$XkeG z8>qaQ3dV#DPRttqZ@|(kPzU$^=R-=a4sUcsa;EQU5>kbM&u>TGEiiO@r>?)7Vu9`W z*n5M6SFfI3X3`r|x+~Rp#MHLQk~G++w-wa<1vi`_PS)iG328KV7qT<0XwOG0n&;XV z0&0=F5URhJV$xNXzAE$=40;Y+GA2ewv&5)tzZ<@FYzDwm;J#;wpD|MY;G*oS(WpI)?v?r5hhpG5$>-jI@Iu{3`C2>ySN z`5HSil%WDeQpY!gTBNw7Um@jAlm#tS^h!&Q97o!|jX0ZJL$gC-9miuUJ?K;TzHxfy zkDpp^eOr^`SPdhxq6*BLw*~G4UkaFr0=d|yEg(Up)G1e6e+)b-iwrn)=oS@sSwY^; zBB#Md1%3^gx%Q_|(??yivHD$vd^0koR9*u7oRG3G z!})gnLXj#hHO>8>#O$I?+E6z66xlRrZ?Ut=*I*}X%Gk^Dl3pe>tB?mr=buhxAGjbi{gW`@T(j*KWxN~&4_~Q^5Pruo zqdvImFU?Qv?B3%WaYaBkmG5q+?enk^>U=*H+*du%Ny&wpS_^`$B< zfSAM4_7EIjEEWtefW{)5Dcz3DENv?mUmts$-aBk^4fzC6+MAMWdS*caah;y$WaVZi z9d2A^EVxs7M-Yq+P8c~n{rzL(H`gs1PbcvIx7nP}in@BaJ7Q^&GuGAGdgSLZ4R9ZF zg(U5cy~9CU+Y+L`7B2|IefA`8*uC}Q^^JyiAL|vKNQe8^&b7i5?_ae~mGmJs`|S-5 zk^|zFL)BCE4z)x(eES(>9;AVnXhyclH%UF#qM6Dm`Yt;JE!NX8-Isfl?)JRKX zk%p+-9Oa2``Ze;kbbhowpjK_9iosX_=F<3w{*G;TTZ?RLY;-l7gN;>B^;|MZX7aPe z8+Rk6_M&af>J}5##}9?hRBdP9zC-4l)1)1bQlxLEB#L?I?ECWz@~)22rqdrfssRfS zqoq@H8uPDY0w37N&!f_*io%9vxuWC_L$14KK@o$@vyQ*IjOz#Oe~X~bjENL%c3u9% zqaO$UbpNzcSe!|mXkLJwq4uu|f4QvI-%;S0s|#Twn-W2vmrWesW?$1#z{6yJ{=8(} z{UJ#3D|qS-c&92sJsETBFX7JPozEY<0z^QV_6=+Zez& zJ(z6ao7>)%|0BjCoqQE#}{C zgUR#R?D36B4r?0RvSUa$ZfxY&mvw7g4cZCNY})~1kKK;PY0>?JrL0Uy^BH# z+5DxB+@hCxjux&~?lL|ncRQO*_$O8l)*cL?LO$KvSOlmLiCV=(2E;H;lqG;ZD&cgrej?(I`>w;KLt{!qIVF`o1OUsRn||f z%^#;V!A=u=K;B8<7;?}nEdI@f4-bz2og-b}4Qn*VZ&}%;=~wM7u{jE^&9Sjm{N|GZ zXN^uWRJbD z=Vi3jy#TW4=yXDJ^KGusgG$;_9F9BfW)6Kw_r zmu#+_zlm!Me_97Q#Lh#Zbk*mwtA`;RO(^oHSeV(-Yy~Ye@VIFPhb4f(t{-3g(TITc z3st}sxix)nUUvn&<_m@5ukp9Zv* zZ2_U_aVsP`{qAP8v^Kuk;l1AIWhESidHclF;czR-xC%ij$^8YA@EXN!seA*Wt@X=j z1DayYdtH{veFsWxX>IZW!T*z@&ocXnNdCy-ggkEhw6>)1U~Q+FX%bUiv*(l?h3Mz<4; z4g$xR8Ny9vc~9-RqK?65W#DZeLw19p>UAc}-mS^9Z=ulltNc@o%U@Uf`D=LRHVB+x zLbgJnOVV_`+pt}Z)2u|+;f`X8k@S_$t&r3es(|D)H!i~9gv&P}UDBtI=izdGmdW|@ zJrE03&G`o*S_s9Ro<5v>4jgOMD-@gUo@5*FvV`nXo%P?@Vj#@0*}u*6d47iCA9x!r zN=JXgqEb>)__fid2!qw@y3Kr?$I`r~03UvJ$Qu5I|8J112$!m0eIe2MCG}1BTuRIi zMLBWF9SAQxajdHS12|W|+`VJakY@f7$Cz0^_|e;@#p2{C=tH_tn=7_fmtFYS?g;$e zfs!kvz6SmuMohA&)iMJ$5*J@H_#U8)@6H|}K5h8mwu10{LhMAa{lJnewh>j%DLCucY-L zE?nEj3K9MM(g%MA85C{MwAgpJI~>>1IqMDyVUIf_#2zdgtaa}_iZ4)xDYdp9k9;6% z!toxng;cH13zsjC{M19z12g#VoOE__V4(_|lX}-7gyt2#w74v#xep>>f+Z9sb5u{o zmdExT;_~dBuVg9=IRaBdvLC!fsat{EKiE{7?UgGoNzXF!6+wtux0nG&z5CvfdS(CO zbpUnIpwfM!`G7}fgT|HxvV5-G`1!rAJS(jf{324%NyW`5v1r5j=DmQo6yry&+@H9T zf{;%$s73j(Jlh@jr7sqGN_StKfHS^@)nVhKSQ;H&yioh>Srq&ZPz2?=3{&q_gN#Yk ze*QW*f-+;|S|4F9m4^Udh<#POQF?mvd>kSdZp2cV$+7}81q3kbjsmDxcOx2p#{ zl%@f|`O>eWD14kLyKltb?oTH_U()0R>o1L@#&GqdW!W`L{a5z}12= z3j?Axs0{FwWuy+M3V-zIQRh(oZ`{B$7nBXBbH*-a`GD&v$h4mQftE35@GqSf*h#sj zpwaJjb<5ZE6Edz|b#GXmAi>zP#hKfhUUTDT}&0L_t}JMKv2IoZw@x=G&y;Iy$7-sc{pv zlC7V%##*^k18M4cKwO97Rt|fjv}rpKe-Q{D44SaIjrk8!=_wDeeEH905$va$^}J++ zSdg=~XoNSORpW!9wlX!<0 zhV-8TeBRIOx`@Smj|_XUziDoFTUpUmkGI%WA#YZT52ChHO{l`$*HWOBvYwHT`13^CuBd*ZMe>L$83YT{| zmJfr1+S5F*hk%fx7b}kep7DxJEZi82vSvHf4bD+vPP@U>n^q=o>E-6xYK?W44jx5H zxd|yHdTl&?;VT9o2$!FWto1MrJ28P+A;^9dmS!@SV=Tg$!?PY!ZCpVFH#MU^B1kKo zHqUpKc}~=1E_I46^`#tB0Tn$DuL1PoFwip?2+^f<%0?7izD`Ue;=_;C7@f{6n}6Ur z;iLGb0wYh`+c|X33Wz36-K0>dI%{8hKA#)!@`0yjQ21LthAEm>pbVTiRmqc zl6owHq5x$kVmvPL3dmKov`qOvYGB$^&zZS#JF+(SZxg${)cd)*LDdgM$4SI!E_{h!{<08HDvD1Jc(Hk#0qO?)I}%>Yz*cA&8wV76)+6+a~;)mGuQiAfT)g z7Ur}cX4XTA@`8Uy3cj0{>##BWY%_>pxqci?2Spzs!Yv1(;Ip3A{G|e%HxF?Eoq~Yt z^at>^VMZwOAw<@(|LWM4tKU9je93*lTO8~PN^`H9D}qpArbO(;cc~3J(O_t3eQ8+v zIWNjgDG=ERwYl?>EZUeNtlKX0Izs|=shW45Wslj)Z<8f zYu0_C3aIDh2ikpfqy!b9}jS(^H=pif$M}3BwvD)<>WNugjUDgG+qx})J?#f^2ujO7ek3ol| z6=GvKV9gG)a#D`~6{&XdfLq*u<@0Bg<3@`|tw(DAAPj&Fd)O4R_I1ACIy=$WY@>_x zq|K47t?1!L$y@f)s_G(o2GntpEjoHf5QLEzs4@harH-w5^ZcXEX@?to?dK;8;KA~d z$jx+K0EUlGiCO>c>G3s3EQ-}k3A_5r}AN=7q`~3K0x2c zjy4gdSc$S5%%;`|rJl3EBcx%L>4+vEv@2647UdU%_VB!iH<0bVy9jyPan{Zw0L&qx z8gapF0P@YW7>xEy<>k$wR3Ikl=)*U6OiN^3fWQg|Mey%(4-Q9v^ZKtl3CHJDwB+6fMi<|iq2czw1(}iT7bXifrqbtivZL&UaT_*AqU^n@4er`2 z*v5ye#N4UQAq!nCR1~a+byPg z>=>@0g`YM|{S^{haQ!&(EoK}twPa>E3JdrTrPnnx4jiQ}H&Gl%%YhEzupqBxeJ6o? z$5Bzi3di93E6n1q^{_s47WcX)UMFLBo1#M4r&1n{wFlP9jDz*vzAYU4=46omlUTSdFJ-|LKj;=a7~{zc5l3Cc%1zF#&4A!h*HC7|9HQN#7Bu+U6e|h0=SC)9r(K9KvHaGtc?Ohs< z_gD-qM^APPsFtdQ=hjJ3a-*+Pv-&#onbH0T_mX&c2s?u_d}>CkOpXSbx?L#`BXN79 zLIe~i7peu6&P;`ey3Ki0DMD#@i{s4CPtu+@lTR#FLe2qYJ~j*SP*@h45Oa88E$b4V(SE3cheOt`kbvWqaZsjeZzk)tWBAcR#wla$x5=R= z%uds;(Nb|LbbqJoc(E&KYB4(}Pg&V3!q-cio;kH%u^1kCy4tuEPl@-M@ zg-#lQ)1nFB8^Zai$?%DASZjIN4Vf{d?;;~|YZAGK%*eKxGi zB$ojnR)5tDqUH6NhnvVO$oYxlWK+6i7PPk|$X*h}(VzV|GCVoI87(Lfo}(XE>rD;2 zOiO?gBnl%Lzc|K?6H>wWi9^QW914r9Qqcecsun&Y*~L;|aY*==h4ZR&>y;3Js&6qA|V@$I;3atbfdlPqCI zNlMDJ-z}kCqzZT%qZ!@f)YQ`^qW4R91^40t3&Im5#0$+SaVkEw6=Cpy14?Q(3g69& zOW~pNcHQp1^@kJ}T0DP);tW{KzIbK%EkMbQL^1oq$VsftD-EIDDxqZPU|L*pf}2!y zgZt`pS~2Ri&A3;>i_SD#jpG)?sOd8DV%dZVXkU~#)rD0At11Ju3!=)-$>8%7MY z8=TuB@LCOA6cq=e@SI_}#%5Y0L_QHuMonw7uw1@MjX#5)E89GV<6Kt)9OF(4UVM36 z%&5T`cPafl2QD}2?k;622VpI1k!@!h$%edaUq(gcy0I%$8K37gq3_`}`0&Aykvsjn zyqEopyvJ0{Wa(;#uX$8PAXE<-1lVbQJz)2OA|NT*B7GN5^a7`77QmPyI>bp9xzqk& z@TznqRN%OAz9Xy_zxP`ZENHt9g1~TiVnrwepE)go^@KT&qQWekr&1Y5IS#K7S`G_Z z7NQp!{J%Cq(87+BTpUMetm0s!umGDfgL7$sv4V$T+3p*UTm{bJH^$*-3HQ|n9;h|b zfJjc+3@#)JzKAw)DsW^wg|CzULkn6sxmgxDAe$|eN(YyE^4iO$zRsF1!V~$VGcR6? zb%m!bD=i+Cx!we2@vfIpU%bgx3eF(L_H60G zkNaFMHA2ZknWm)+ZJ~#gKaAMIXYaX6{w$9hLxW2hIuO<*e1Vp>YbRih1ek3NJn!h1Z;fY!8RA zny@$}juVGB!x6{TOI#^&*ElIy$ys0sss{Kr{N;tyw7`A9akH?3N?YIh0+-qFa$9(MpJXTV1W{Q2k{DQSzW4sdSwNv?G?DiLAd_Ra& zn!+ltc`^>2V+h)%DZ}T%m|Z;z7sq@4_Enlmgtnm-&vLi<$#@(-NTYgl;HGL`#x2?8 z5q5zi;eKi*Oub=tfx7~k!>T*L`>`-+hgI{QW7d4lgF>b+qOonnWDPdG<_UWBCPufS z$OS1v$wVzZkI+IdeWvkz3)FupaZ|PIw#E}s(0CO#=&T_FwCt9Uy_ZU={+9zhuYtaN zANd99!9z+e{lRc}eQ<_}`_yG_;#>vf-)EP>72QNPW9yS!%e8=9Nn$h9CI|k2p-4m% zl9c}>{+Sf1fm1IwRU9COclfk>BYd?^_C&N@-;u-{k+tOqgFZ8lv>%@5Ns3k5Kv3AWWJgVLpA2t{@Kb}hsKUrMWB`j;&si^sAl~XkwR6RtRDZ|@TthT2sB*;g&OfGtUzeR5f* zH0uQ!^kZSZCwqCVF{N0|jTH})^C@dO@`;?kPpe6UC8!ang(V@o-XoyztMLLbrKT0z1|D2xpkB57d3ws7VlQXaF8#Vz*&r zj7suXQ+?jU`(MeX=Q)`1Fo!4P@o_NnO4DiGYq&t;g`-XlOv(cqdc!`kaC)I_#PpI^ znuc=($4#yJJi+3?M)cj1-3E%c`GYL3m#9xiMv>ZR*l@i_o`$s<1dCm#x~^y@RQhy) zX+Wtch&gOYjyNKB(q3z4)C#?}pE(Umkk6W$sDKPN2uuW+ zD9w|PEk%BWhY1qAaI{HmufdV?B<)?NsMf?5o(uZz!+nWIIxy_5Oq1+GHBAj;GqMdV zNhm{79-l}OTO$NHzxwwU4Ht~|Q{IAwn`~Ss$SbQYA}m<5+0clR7PdMJl5(WO5Cp=4 zhdw*!{)aNq{@{Z|$9;*694rJ9a8}I=4sS15llkx^?Tv`y!?KB`RpS(CeChXs{1PXQ z5{HP~3l1+t9+0tuX{a;)m)QFdfge;Be1f98EYhO4niXGjHqqi#1^eY24*Wa*((SvO zKzHd8Mg2N5Vh@1bJ2dN9*umVS@EJ7PrZi>z^~|Z#pB|apv7l*hdikhLgPjDW~s( zw|hdp!vp~^AcepBhoHhMYicB2D7w;MH>CWW zTNCNQlF;fZM6(>g1teJTr0JW88{I(v&$|G~8C2^)o#94iSE7+ZQEpMe@s8waEQu_Af7rmxqx>u)ko7oh+slNtyI zkYQxOS{{0hL0R=VcfG68oKSyl*pLHBNa}w*eo}H?6nL&{4B+t36dA{f zJZN~?<_*5)Yfg*3I3F2M>@ zYm{F&o(#=emIaLGq-ay)%Y1p7)VH!Q;b8nA`2WAg*3GM8EyAfOmE_n1rYb3CbmL;f zUH=p3MJ}a_Sdj5BgX_$V+USzoBx+%wVAIUglO@7VX64IU<{Rf<&}2UU#aoS0f4i3U zhmFq20?UE%6vg zBsNy0DXJl#7NVAxHBZ{>P5<>wfRHKLKB&UEL>g)CiaA!Uh}pLJ*c9KLIqASQ5WB&ISCB^Dk?r6$ zSob&aH823v>=wS1(6sdQ(+qY%w}@WUoSrMm2P~L2`2joB2$RoqfSU&_oK^~)E7t%I z6O>9$SgY%-^~ffg4Oqo$DJOb1AkT*Z3)ZJH9$#coAP&g*SN6g{6aKL|!#?y~>@ From ff2cb7aaab93dbee9d486c8a649d64db95db8b7c Mon Sep 17 00:00:00 2001 From: Daniel Dimitrov Date: Fri, 6 Dec 2024 21:45:58 +0100 Subject: [PATCH 44/49] refactor: repository now follows a Monorepo structure (#55) * refactor: repository now follows a Monorepo structure Main project folders are now: - apps - packages Apps such as expo, nextjs live inside of the apps folder. Packages shared between the apps live in packages. I migrated to yarn v4 (from npm) as the general opinion is that yarn has better workspaces support. Also the web app uses it. * fix: enable corepack in CI And also switch to a newer node version in general * fix: collect coverage from right files * fix: make EAS happy * fix: typo --- .eas/build/build-and-maestro-test.yml | 8 - .../workflows/{lint.yml => mobile-lint.yml} | 18 +- .../{unit-tests.yml => mobile-unit-tests.yml} | 18 +- .gitignore | 85 +- .lintstagedrc.json | 6 +- .nvmrc | 2 +- .yarnrc.yml | 5 + README.md | 155 +- .../.eas/build/build-and-maestro-test.yml | 38 + apps/mobile/.gitignore | 37 + .../mobile/.prettierignore | 0 .prettierrc => apps/mobile/.prettierrc | 0 .../mobile/.storybook}/index.ts | 0 .../mobile/.storybook}/main.ts | 0 .../mobile/.storybook}/preview.tsx | 0 .../mobile/.storybook}/tsconfig.json | 0 .../mobile/CONTRIBUTING.md | 0 apps/mobile/README.md | 168 + .../mobile/__mocks__}/fileMock.js | 0 app.config.js => apps/mobile/app.config.js | 0 {app => apps/mobile/app}/(tabs)/_layout.tsx | 0 {app => apps/mobile/app}/(tabs)/index.tsx | 0 {app => apps/mobile/app}/(tabs)/settings.tsx | 0 .../(tabs)/transactions/(tabs)/_layout.tsx | 0 .../app}/(tabs)/transactions/(tabs)/index.tsx | 0 .../(tabs)/transactions/(tabs)/messages.tsx | 0 .../app}/(tabs)/transactions/_layout.tsx | 0 {app => apps/mobile/app}/+html.tsx | 0 {app => apps/mobile/app}/+not-found.tsx | 0 {app => apps/mobile/app}/_layout.tsx | 0 {app => apps/mobile/app}/app-settings.tsx | 0 {app => apps/mobile/app}/notifications.tsx | 0 .../mobile/app}/pending-transactions.tsx | 0 {app => apps/mobile/app}/signers.tsx | 0 .../drawable/baseline_arrow_outward_24.xml | 0 .../baseline_auto_awesome_motion_24.xml | 0 .../android/drawable/baseline_create_24.xml | 0 .../android/drawable/baseline_delete_24.xml | 0 .../android/drawable/baseline_explore_24.xml | 0 .../drawable/baseline_arrow_outward_24.xml | 0 .../baseline_auto_awesome_motion_24.xml | 0 .../assets}/drawable/baseline_create_24.xml | 0 .../assets}/drawable/baseline_delete_24.xml | 0 .../assets}/drawable/baseline_explore_24.xml | 0 .../drawable/rn_edit_text_material.xml | 0 .../assets}/fonts/SpaceMono-Regular.ttf | Bin .../assets}/fonts/safe-icons/safe-icons.ttf | Bin .../assets}/fonts/safe-icons/selection.json | 0 .../mobile/assets}/images/adaptive-icon.png | Bin .../mobile/assets}/images/favicon.png | Bin .../mobile/assets}/images/icon.png | Bin .../assets}/images/partial-react-logo.png | Bin .../mobile/assets}/images/react-logo.png | Bin .../mobile/assets}/images/react-logo@2x.png | Bin .../mobile/assets}/images/react-logo@3x.png | Bin .../mobile/assets}/images/splash.png | Bin .../mobile/babel.config.js | 0 {e2e => apps/mobile/e2e}/flow.yml | 0 eas.json => apps/mobile/eas.json | 7 +- .../mobile/eslint.config.mjs | 0 .../expo-plugins}/withDrawableAssets.js | 0 jest.config.js => apps/mobile/jest.config.js | 0 .../mobile/metro.config.js | 0 .../mobile/openapi-config.ts | 0 apps/mobile/package.json | 138 + .../mobile/resources}/icons/README.md | 0 .../resources}/icons/safe-icons/Read Me.txt | 0 .../icons/safe-icons/demo-files/demo.css | 0 .../icons/safe-icons/demo-files/demo.js | 1 - .../resources}/icons/safe-icons/demo.html | 0 .../icons/safe-icons/fonts/safe-icons.svg | 0 .../icons/safe-icons/fonts/safe-icons.ttf | Bin .../icons/safe-icons/fonts/safe-icons.woff | Bin .../icons/safe-icons/selection.json | 0 .../resources}/icons/safe-icons/style.css | 0 .../icons/source-svgs/add-owner.svg | 0 .../icons/source-svgs/address-book.svg | 0 .../icons/source-svgs/alert-triangle.svg | 0 .../resources}/icons/source-svgs/alert.svg | 0 .../icons/source-svgs/appearance.svg | 0 .../resources}/icons/source-svgs/apps.svg | 0 .../icons/source-svgs/arrow-down-1.svg | 0 .../icons/source-svgs/arrow-down.svg | 0 .../icons/source-svgs/arrow-left.svg | 0 .../icons/source-svgs/arrow-right.svg | 0 .../icons/source-svgs/arrow-sort.svg | 0 .../resources}/icons/source-svgs/arrow-up.svg | 0 .../resources}/icons/source-svgs/batch.svg | 0 .../resources}/icons/source-svgs/bell.svg | 0 .../resources}/icons/source-svgs/block.svg | 0 .../resources}/icons/source-svgs/blocks-1.svg | 0 .../resources}/icons/source-svgs/blocks.svg | 0 .../icons/source-svgs/bookmark-filled.svg | 0 .../resources}/icons/source-svgs/bookmark.svg | 0 .../resources}/icons/source-svgs/camera.svg | 0 .../resources}/icons/source-svgs/chat.svg | 0 .../icons/source-svgs/check-filled.svg | 0 .../icons/source-svgs/check-notifications.svg | 0 .../icons/source-svgs/check-oulined.svg | 0 .../resources}/icons/source-svgs/check.svg | 0 .../resources}/icons/source-svgs/clock.svg | 0 .../icons/source-svgs/close-filled.svg | 0 .../icons/source-svgs/close-outlined.svg | 0 .../resources}/icons/source-svgs/close.svg | 0 .../icons/source-svgs/code-blocks.svg | 0 .../resources}/icons/source-svgs/copy.svg | 0 .../icons/source-svgs/dapp-logo.svg | 0 .../resources}/icons/source-svgs/delete.svg | 0 .../resources}/icons/source-svgs/desktop.svg | 0 .../resources}/icons/source-svgs/document.svg | 0 .../icons/source-svgs/double-arrow.svg | 0 .../resources}/icons/source-svgs/download.svg | 0 .../source-svgs/dropdown-arrow-small.svg | 0 .../icons/source-svgs/edit-owner.svg | 0 .../resources}/icons/source-svgs/edit.svg | 0 .../icons/source-svgs/element-drag.svg | 0 .../icons/source-svgs/experimental.svg | 0 .../resources}/icons/source-svgs/export.svg | 0 .../icons/source-svgs/external-link.svg | 0 .../resources}/icons/source-svgs/eye-n.svg | 0 .../resources}/icons/source-svgs/eye-off.svg | 0 .../resources}/icons/source-svgs/file.svg | 0 .../resources}/icons/source-svgs/filter.svg | 0 .../resources}/icons/source-svgs/hardware.svg | 0 .../resources}/icons/source-svgs/home.svg | 0 .../resources}/icons/source-svgs/info.svg | 0 .../resources}/icons/source-svgs/key.svg | 0 .../resources}/icons/source-svgs/keystone.svg | 0 .../resources}/icons/source-svgs/ledger.svg | 0 .../icons/source-svgs/lightbulb.svg | 0 .../resources}/icons/source-svgs/link.svg | 0 .../resources}/icons/source-svgs/lock.svg | 0 .../resources}/icons/source-svgs/mobile.svg | 0 .../resources}/icons/source-svgs/nft.svg | 0 .../icons/source-svgs/options-horizontal.svg | 0 .../icons/source-svgs/options-vertical.svg | 0 .../resources}/icons/source-svgs/owners.svg | 0 .../resources}/icons/source-svgs/paste.svg | 0 .../icons/source-svgs/plus-filled.svg | 0 .../icons/source-svgs/plus-outlined.svg | 0 .../resources}/icons/source-svgs/plus.svg | 0 .../resources}/icons/source-svgs/points.svg | 0 .../icons/source-svgs/qr-code-1.svg | 0 .../resources}/icons/source-svgs/qr-code.svg | 0 .../resources}/icons/source-svgs/question.svg | 0 .../resources}/icons/source-svgs/repeat.svg | 0 .../icons/source-svgs/replace-owner.svg | 0 .../resources}/icons/source-svgs/rows-1.svg | 0 .../resources}/icons/source-svgs/rows-2.svg | 0 .../resources}/icons/source-svgs/rows.svg | 0 .../resources}/icons/source-svgs/safe.svg | 0 .../resources}/icons/source-svgs/scan-1.svg | 0 .../resources}/icons/source-svgs/scan.svg | 0 .../resources}/icons/source-svgs/search.svg | 0 .../resources}/icons/source-svgs/seed.svg | 0 .../resources}/icons/source-svgs/send-to.svg | 0 .../resources}/icons/source-svgs/settings.svg | 0 .../resources}/icons/source-svgs/share.svg | 0 .../icons/source-svgs/shield-crossed.svg | 0 .../resources}/icons/source-svgs/shield.svg | 0 .../resources}/icons/source-svgs/sign.svg | 0 .../resources}/icons/source-svgs/tag.svg | 0 .../resources}/icons/source-svgs/token.svg | 0 .../icons/source-svgs/transaction-batch.svg | 0 .../transaction-change-settings.svg | 0 .../source-svgs/transaction-contract.svg | 0 .../icons/source-svgs/transaction-execute.svg | 0 .../source-svgs/transaction-incoming.svg | 0 .../source-svgs/transaction-outgoing.svg | 0 .../source-svgs/transaction-partial-fill.svg | 0 .../source-svgs/transaction-recovery.svg | 0 .../icons/source-svgs/transaction-stake.svg | 0 .../icons/source-svgs/transaction-swap.svg | 0 .../icons/source-svgs/transactions.svg | 0 .../resources}/icons/source-svgs/unlock.svg | 0 .../resources}/icons/source-svgs/update.svg | 0 .../resources}/icons/source-svgs/upload.svg | 0 .../resources}/icons/source-svgs/wallet.svg | 0 .../icons/source-svgs/what-is-new.svg | 0 .../mobile/scripts}/generateIconTypes.js | 0 .../mobile/scripts}/reset-project.js | 0 .../src}/components/Alert/Alert.stories.tsx | 0 .../src}/components/Alert/Alert.test.tsx | 0 .../mobile/src}/components/Alert/Alert.tsx | 0 .../mobile/src}/components/Alert/index.ts | 0 .../mobile/src}/components/Badge/Badge.tsx | 0 .../src}/components/Badge/badge.stories.tsx | 0 .../mobile/src}/components/Badge/index.ts | 0 .../mobile/src}/components/Badge/theme.ts | 0 .../BlurredIdenticonBackground.stories.tsx | 0 .../BlurredIdenticonBackground.tsx | 0 .../BlurredIdenticonBackground/index.tsx | 0 .../Container/Container.stories.tsx | 0 .../components/Container/Container.test.tsx | 0 .../src}/components/Container/Container.tsx | 0 .../__snapshots__/Container.test.tsx.snap | 0 .../mobile/src}/components/Container/index.ts | 0 .../CopyButton/CopyButton.stories.tsx | 0 .../src}/components/CopyButton/CopyButton.tsx | 0 .../src}/components/CopyButton/index.ts | 0 .../components/DataRow/DataRow.stories.tsx | 0 .../src}/components/DataRow/DataRow.test.tsx | 0 .../src}/components/DataRow/DataRow.tsx | 0 .../mobile/src}/components/DataRow/index.ts | 0 .../components/Dropdown/Dropdown.test.tsx | 0 .../src}/components/Dropdown/Dropdown.tsx | 0 .../mobile/src}/components/Dropdown/index.ts | 0 .../components/Dropdown/sheetComponents.tsx | 0 .../EthAddress/ETHAddress.stories.tsx | 0 .../src}/components/EthAddress/ETHAddress.tsx | 0 .../src}/components/EthAddress/index.ts | 0 .../mobile/src}/components/Fiat/Fiat.test.tsx | 0 .../mobile/src}/components/Fiat/Fiat.tsx | 0 .../mobile/src}/components/Fiat/index.ts | 0 .../Identicon/Identicon.stories.tsx | 0 .../components/Identicon/Identicon.test.tsx | 0 .../src}/components/Identicon/Identicon.tsx | 0 .../mobile/src}/components/Identicon/index.ts | 0 .../InnerShadow/InnerShadow.test.tsx | 0 .../components/InnerShadow/InnerShadow.tsx | 0 .../__snapshots__/InnerShadow.test.tsx.snap | 0 .../src}/components/InnerShadow/index.ts | 0 .../mobile/src}/components/Logo/Logo.test.tsx | 0 .../mobile/src}/components/Logo/Logo.tsx | 0 .../mobile/src}/components/Logo/index.ts | 0 .../SafeFontIcon/SafeFontIcon.stories.tsx | 0 .../components/SafeFontIcon/SafeFontIcon.tsx | 0 .../src}/components/SafeFontIcon/index.ts | 0 .../SafeListItem/SafeListItem.test.tsx | 0 .../components/SafeListItem/SafeListItem.tsx | 0 .../__snapshots__/SafeListItem.test.tsx.snap | 0 .../src}/components/SafeListItem/index.tsx | 0 .../src}/components/SafeTab/SafeTab.tsx | 0 .../src}/components/SafeTab/SafeTabBar.tsx | 0 .../mobile/src}/components/SafeTab/index.tsx | 0 .../mobile/src}/components/SafeTab/types.ts | 0 .../PendingTransactions.stories.tsx | 0 .../PendingTransactions.test.tsx | 0 .../PendingTransactions.tsx | 0 .../PendingTransactions.test.tsx.snap | 0 .../PendingTransactions/index.tsx | 0 .../components/Title/LargeHeaderTitle.tsx | 0 .../src}/components/Title/NavBarTitle.tsx | 0 .../src}/components/Title/Title.test.tsx | 0 .../mobile/src}/components/Title/index.ts | 0 .../mobile/src}/components/TxInfo/TxInfo.tsx | 0 .../mobile/src}/components/TxInfo/index.tsx | 0 .../components/navigation/TabBarIcon.test.tsx | 0 .../src}/components/navigation/TabBarIcon.tsx | 0 .../src}/components/navigation/index.ts | 0 .../Card/AssetsCard/AssetsCard.test.tsx | 0 .../Card/AssetsCard/AssetsCard.tsx | 0 .../Card/AssetsCard/index.tsx | 0 .../Card/TxBatchCard/TxBatchCard.stories.tsx | 0 .../Card/TxBatchCard/TxBatchCard.test.tsx | 0 .../Card/TxBatchCard/TxBatchCard.tsx | 0 .../__snapshots__/TxBatchCard.test.tsx.snap | 0 .../Card/TxBatchCard/index.tsx | 0 .../TxConflictingCard/TxConflictingCard.tsx | 0 .../Card/TxConflictingCard/index.tsx | 0 .../TxContractInteractionCard.stories.tsx | 0 .../TxContractInteractionCard.test.tsx | 0 .../TxContractInteractionCard.tsx | 0 .../Card/TxContractInteractionCard/index.tsx | 0 .../TxCreationCard/TxCreationCard.stories.tsx | 0 .../TxCreationCard/TxCreationCard.test.tsx | 0 .../Card/TxCreationCard/TxCreationCard.tsx | 0 .../Card/TxCreationCard/index.ts | 0 .../TxGroupedCard/TxGroupedCard.stories.tsx | 0 .../Card/TxGroupedCard/TxGroupedCard.test.tsx | 0 .../Card/TxGroupedCard/TxGroupedCard.tsx | 0 .../Card/TxGroupedCard/index.tsx | 0 .../TxRejectionCard.stories.tsx | 0 .../TxRejectionCard/TxRejectionCard.test.tsx | 0 .../Card/TxRejectionCard/TxRejectionCard.tsx | 0 .../Card/TxRejectionCard/index.tsx | 0 .../TxSafeAppCard/TxSafeAppCard.stories.tsx | 0 .../Card/TxSafeAppCard/TxSafeAppCard.test.tsx | 0 .../Card/TxSafeAppCard/TxSafeAppCard.tsx | 0 .../Card/TxSafeAppCard/index.tsx | 0 .../TxSettingsCard/TxSettingCard.stories.tsx | 0 .../TxSettingsCard/TxSettingCard.test.tsx | 0 .../Card/TxSettingsCard/TxSettingsCard.tsx | 0 .../__snapshots__/TxSettingCard.test.tsx.snap | 0 .../Card/TxSettingsCard/index.tsx | 0 .../Card/TxSwapCard/TxSwapCard.stories.tsx | 0 .../Card/TxSwapCard/TxSwapCard.test.tsx | 0 .../Card/TxSwapCard/TxSwapCard.tsx | 0 .../__snapshots__/TxSwapCard.test.tsx.snap | 0 .../Card/TxSwapCard/index.tsx | 0 .../Card/TxTokenCard/TxTokenCard.stories.tsx | 0 .../Card/TxTokenCard/TxTokenCard.tsx | 0 .../Card/TxTokenCard/index.tsx | 0 {src => apps/mobile/src}/config/constants.ts | 0 .../src}/features/Assets/Assets.container.tsx | 0 .../AssetsHeader/AssetsHeader.container.tsx | 0 .../components/AssetsHeader/AssetsHeader.tsx | 0 .../Assets/components/AssetsHeader/index.tsx | 0 .../Assets/components/AssetsHeader/styles.ts | 0 .../components/Balance/Balance.container.tsx | 0 .../Assets/components/Balance/Balance.tsx | 0 .../Assets/components/Balance/ChainItems.tsx | 0 .../Assets/components/Balance/index.tsx | 0 .../Assets/components/Fallback/Fallback.tsx | 0 .../Assets/components/Fallback/index.ts | 0 .../Assets/components/NFTs/NFTItem.tsx | 0 .../Assets/components/NFTs/NFTs.container.tsx | 0 .../features/Assets/components/NFTs/index.tsx | 0 .../Assets/components/Navbar/Navbar.tsx | 0 .../Assets/components/Navbar/index.tsx | 0 .../Assets/components/NoFunds/EmptyToken.tsx | 0 .../Assets/components/NoFunds/NoFunds.tsx | 0 .../Assets/components/NoFunds/index.ts | 0 .../components/Tokens/Tokens.container.tsx | 0 .../Assets/components/Tokens/index.tsx | 0 .../mobile/src}/features/Assets/index.tsx | 0 .../mobile/src}/features/Assets/styles.ts | 0 .../Notifications/Notifications.container.tsx | 0 .../src}/features/Notifications/index.tsx | 0 .../PendingTx/PendingTx.container.tsx | 0 .../PendingTxList/PendingTxList.container.tsx | 0 .../components/PendingTxList/index.ts | 0 .../mobile/src}/features/PendingTx/index.tsx | 0 .../mobile/src}/features/PendingTx/utils.tsx | 0 .../features/Settings/Settings.container.tsx | 0 .../src}/features/Settings/Settings.tsx | 0 .../AppSettings/AppSettings.container.tsx | 0 .../components/AppSettings/AppSettings.tsx | 0 .../Settings/components/AppSettings/index.ts | 0 .../IdenticonWithBadge/IdenticonWithBadge.tsx | 0 .../components/IdenticonWithBadge/index.ts | 0 .../Settings/components/Navbar/Navbar.tsx | 0 .../components/Navbar/SettingsButton.tsx | 0 .../components/Navbar/SettingsMenu.tsx | 0 .../Settings/components/Navbar/index.ts | 0 .../mobile/src}/features/Settings/index.tsx | 0 .../features/Signers/Signers.container.tsx | 0 .../mobile/src}/features/Signers/index.tsx | 0 .../TxHistory/TxHistory.container.tsx | 0 .../TxHistoryList/TxHistoryList.tsx | 0 .../components/TxHistoryList/index.ts | 0 .../mobile/src}/features/TxHistory/index.tsx | 0 .../mobile/src}/features/TxHistory/utils.tsx | 0 .../hooks/useCopyAndDispatchToast/index.ts | 0 .../useCopyAndDisptachToast.test.tsx | 0 .../mobile/src}/hooks/usePendingTxs/index.ts | 0 .../src}/hooks/useTransactionType/index.tsx | 0 .../useTransactionType.test.tsx | 0 .../src}/navigation/useScrollableHeader.tsx | 0 {src => apps/mobile/src}/react-app-env.d.ts | 0 .../src}/services/exceptions/utils.test.ts | 0 .../mobile/src}/services/exceptions/utils.ts | 0 .../mobile/src}/store/activeChainSlice.ts | 0 .../mobile/src}/store/activeSafeSlice.ts | 0 .../store/gateway/AUTO_GENERATED/about.ts | 0 .../store/gateway/AUTO_GENERATED/accounts.ts | 0 .../src}/store/gateway/AUTO_GENERATED/auth.ts | 0 .../store/gateway/AUTO_GENERATED/balances.ts | 0 .../store/gateway/AUTO_GENERATED/chains.ts | 0 .../gateway/AUTO_GENERATED/collectibles.ts | 0 .../store/gateway/AUTO_GENERATED/community.ts | 0 .../store/gateway/AUTO_GENERATED/contracts.ts | 0 .../gateway/AUTO_GENERATED/data-decoded.ts | 0 .../store/gateway/AUTO_GENERATED/delegates.ts | 0 .../gateway/AUTO_GENERATED/estimations.ts | 0 .../store/gateway/AUTO_GENERATED/messages.ts | 0 .../gateway/AUTO_GENERATED/notifications.ts | 0 .../store/gateway/AUTO_GENERATED/owners.ts | 0 .../store/gateway/AUTO_GENERATED/relay.ts | 0 .../store/gateway/AUTO_GENERATED/safe-apps.ts | 0 .../store/gateway/AUTO_GENERATED/safes.ts | 0 .../AUTO_GENERATED/targeted-messages.ts | 0 .../gateway/AUTO_GENERATED/transactions.ts | 0 .../src}/store/gateway/api-schema/schema.json | 1242 +- .../mobile/src}/store/gateway/cgwClient.ts | 0 .../mobile/src}/store/gateway/chains/index.ts | 0 .../mobile/src}/store/gateway/index.ts | 0 .../mobile/src}/store/gateway/types.ts | 0 .../mobile/src}/store/gateway/utils.ts | 0 {src => apps/mobile/src}/store/hooks/index.ts | 0 .../src}/store/hooks/storeHooks.test.ts | 0 {src => apps/mobile/src}/store/index.ts | 0 {src => apps/mobile/src}/store/storage.ts | 0 .../mobile/src}/store/txHistorySlice.ts | 0 {src => apps/mobile/src}/tests/jest.setup.tsx | 0 {src => apps/mobile/src}/tests/mocks.ts | 0 {src => apps/mobile/src}/tests/test-utils.tsx | 0 .../mobile/src}/theme/helpers/utils.ts | 0 {src => apps/mobile/src}/theme/navigation.ts | 0 .../mobile/src}/theme/palettes/darkPalette.ts | 0 .../src}/theme/palettes/lightPalette.ts | 0 .../mobile/src}/theme/provider/font.tsx | 0 .../mobile/src}/theme/provider/safeTheme.tsx | 0 .../src}/theme/provider/toastProvider.tsx | 0 .../mobile/src}/theme/tamagui.config.ts | 0 {src => apps/mobile/src}/theme/tokens.ts | 0 {src => apps/mobile/src}/types/address.ts | 0 {src => apps/mobile/src}/types/iconTypes.ts | 0 .../mobile/src}/types/navigation.d.ts | 0 {src => apps/mobile/src}/utils/date.test.ts | 0 {src => apps/mobile/src}/utils/date.ts | 0 {src => apps/mobile/src}/utils/formatters.ts | 0 .../mobile/src}/utils/gateway.test.ts | 0 {src => apps/mobile/src}/utils/gateway.ts | 0 .../src}/utils/transaction-guards.test.ts | 0 .../mobile/src}/utils/transaction-guards.ts | 0 .../mobile/src}/utils/transactions.tsx | 0 tsconfig.json => apps/mobile/tsconfig.json | 0 package-lock.json | 27001 ---------------- package.json | 140 +- yarn.lock | 19545 +++++++++++ 411 files changed, 20358 insertions(+), 28256 deletions(-) delete mode 100644 .eas/build/build-and-maestro-test.yml rename .github/workflows/{lint.yml => mobile-lint.yml} (54%) rename .github/workflows/{unit-tests.yml => mobile-unit-tests.yml} (61%) create mode 100644 .yarnrc.yml create mode 100644 apps/mobile/.eas/build/build-and-maestro-test.yml create mode 100644 apps/mobile/.gitignore rename .prettierignore => apps/mobile/.prettierignore (100%) rename .prettierrc => apps/mobile/.prettierrc (100%) rename {.storybook => apps/mobile/.storybook}/index.ts (100%) rename {.storybook => apps/mobile/.storybook}/main.ts (100%) rename {.storybook => apps/mobile/.storybook}/preview.tsx (100%) rename {.storybook => apps/mobile/.storybook}/tsconfig.json (100%) rename CONTRIBUTING.md => apps/mobile/CONTRIBUTING.md (100%) create mode 100644 apps/mobile/README.md rename {__mocks__ => apps/mobile/__mocks__}/fileMock.js (100%) rename app.config.js => apps/mobile/app.config.js (100%) rename {app => apps/mobile/app}/(tabs)/_layout.tsx (100%) rename {app => apps/mobile/app}/(tabs)/index.tsx (100%) rename {app => apps/mobile/app}/(tabs)/settings.tsx (100%) rename {app => apps/mobile/app}/(tabs)/transactions/(tabs)/_layout.tsx (100%) rename {app => apps/mobile/app}/(tabs)/transactions/(tabs)/index.tsx (100%) rename {app => apps/mobile/app}/(tabs)/transactions/(tabs)/messages.tsx (100%) rename {app => apps/mobile/app}/(tabs)/transactions/_layout.tsx (100%) rename {app => apps/mobile/app}/+html.tsx (100%) rename {app => apps/mobile/app}/+not-found.tsx (100%) rename {app => apps/mobile/app}/_layout.tsx (100%) rename {app => apps/mobile/app}/app-settings.tsx (100%) rename {app => apps/mobile/app}/notifications.tsx (100%) rename {app => apps/mobile/app}/pending-transactions.tsx (100%) rename {app => apps/mobile/app}/signers.tsx (100%) rename {assets => apps/mobile/assets}/android/drawable/baseline_arrow_outward_24.xml (100%) rename {assets => apps/mobile/assets}/android/drawable/baseline_auto_awesome_motion_24.xml (100%) rename {assets => apps/mobile/assets}/android/drawable/baseline_create_24.xml (100%) rename {assets => apps/mobile/assets}/android/drawable/baseline_delete_24.xml (100%) rename {assets => apps/mobile/assets}/android/drawable/baseline_explore_24.xml (100%) rename {assets => apps/mobile/assets}/drawable/baseline_arrow_outward_24.xml (100%) rename {assets => apps/mobile/assets}/drawable/baseline_auto_awesome_motion_24.xml (100%) rename {assets => apps/mobile/assets}/drawable/baseline_create_24.xml (100%) rename {assets => apps/mobile/assets}/drawable/baseline_delete_24.xml (100%) rename {assets => apps/mobile/assets}/drawable/baseline_explore_24.xml (100%) rename {assets => apps/mobile/assets}/drawable/rn_edit_text_material.xml (100%) rename {assets => apps/mobile/assets}/fonts/SpaceMono-Regular.ttf (100%) rename {assets => apps/mobile/assets}/fonts/safe-icons/safe-icons.ttf (100%) rename {assets => apps/mobile/assets}/fonts/safe-icons/selection.json (100%) rename {assets => apps/mobile/assets}/images/adaptive-icon.png (100%) rename {assets => apps/mobile/assets}/images/favicon.png (100%) rename {assets => apps/mobile/assets}/images/icon.png (100%) rename {assets => apps/mobile/assets}/images/partial-react-logo.png (100%) rename {assets => apps/mobile/assets}/images/react-logo.png (100%) rename {assets => apps/mobile/assets}/images/react-logo@2x.png (100%) rename {assets => apps/mobile/assets}/images/react-logo@3x.png (100%) rename {assets => apps/mobile/assets}/images/splash.png (100%) rename babel.config.js => apps/mobile/babel.config.js (100%) rename {e2e => apps/mobile/e2e}/flow.yml (100%) rename eas.json => apps/mobile/eas.json (94%) rename eslint.config.mjs => apps/mobile/eslint.config.mjs (100%) rename {expo-plugins => apps/mobile/expo-plugins}/withDrawableAssets.js (100%) rename jest.config.js => apps/mobile/jest.config.js (100%) rename metro.config.js => apps/mobile/metro.config.js (100%) rename openapi-config.ts => apps/mobile/openapi-config.ts (100%) create mode 100644 apps/mobile/package.json rename {resources => apps/mobile/resources}/icons/README.md (100%) rename {resources => apps/mobile/resources}/icons/safe-icons/Read Me.txt (100%) rename {resources => apps/mobile/resources}/icons/safe-icons/demo-files/demo.css (100%) rename {resources => apps/mobile/resources}/icons/safe-icons/demo-files/demo.js (99%) rename {resources => apps/mobile/resources}/icons/safe-icons/demo.html (100%) rename {resources => apps/mobile/resources}/icons/safe-icons/fonts/safe-icons.svg (100%) rename {resources => apps/mobile/resources}/icons/safe-icons/fonts/safe-icons.ttf (100%) rename {resources => apps/mobile/resources}/icons/safe-icons/fonts/safe-icons.woff (100%) rename {resources => apps/mobile/resources}/icons/safe-icons/selection.json (100%) rename {resources => apps/mobile/resources}/icons/safe-icons/style.css (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/add-owner.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/address-book.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/alert-triangle.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/alert.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/appearance.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/apps.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/arrow-down-1.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/arrow-down.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/arrow-left.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/arrow-right.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/arrow-sort.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/arrow-up.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/batch.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/bell.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/block.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/blocks-1.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/blocks.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/bookmark-filled.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/bookmark.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/camera.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/chat.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/check-filled.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/check-notifications.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/check-oulined.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/check.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/clock.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/close-filled.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/close-outlined.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/close.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/code-blocks.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/copy.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/dapp-logo.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/delete.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/desktop.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/document.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/double-arrow.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/download.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/dropdown-arrow-small.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/edit-owner.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/edit.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/element-drag.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/experimental.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/export.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/external-link.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/eye-n.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/eye-off.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/file.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/filter.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/hardware.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/home.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/info.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/key.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/keystone.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/ledger.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/lightbulb.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/link.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/lock.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/mobile.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/nft.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/options-horizontal.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/options-vertical.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/owners.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/paste.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/plus-filled.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/plus-outlined.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/plus.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/points.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/qr-code-1.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/qr-code.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/question.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/repeat.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/replace-owner.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/rows-1.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/rows-2.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/rows.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/safe.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/scan-1.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/scan.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/search.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/seed.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/send-to.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/settings.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/share.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/shield-crossed.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/shield.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/sign.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/tag.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/token.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-batch.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-change-settings.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-contract.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-execute.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-incoming.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-outgoing.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-partial-fill.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-recovery.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-stake.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transaction-swap.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/transactions.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/unlock.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/update.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/upload.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/wallet.svg (100%) rename {resources => apps/mobile/resources}/icons/source-svgs/what-is-new.svg (100%) rename {scripts => apps/mobile/scripts}/generateIconTypes.js (100%) rename {scripts => apps/mobile/scripts}/reset-project.js (100%) rename {src => apps/mobile/src}/components/Alert/Alert.stories.tsx (100%) rename {src => apps/mobile/src}/components/Alert/Alert.test.tsx (100%) rename {src => apps/mobile/src}/components/Alert/Alert.tsx (100%) rename {src => apps/mobile/src}/components/Alert/index.ts (100%) rename {src => apps/mobile/src}/components/Badge/Badge.tsx (100%) rename {src => apps/mobile/src}/components/Badge/badge.stories.tsx (100%) rename {src => apps/mobile/src}/components/Badge/index.ts (100%) rename {src => apps/mobile/src}/components/Badge/theme.ts (100%) rename {src => apps/mobile/src}/components/BlurredIdenticonBackground/BlurredIdenticonBackground.stories.tsx (100%) rename {src => apps/mobile/src}/components/BlurredIdenticonBackground/BlurredIdenticonBackground.tsx (100%) rename {src => apps/mobile/src}/components/BlurredIdenticonBackground/index.tsx (100%) rename {src => apps/mobile/src}/components/Container/Container.stories.tsx (100%) rename {src => apps/mobile/src}/components/Container/Container.test.tsx (100%) rename {src => apps/mobile/src}/components/Container/Container.tsx (100%) rename {src => apps/mobile/src}/components/Container/__snapshots__/Container.test.tsx.snap (100%) rename {src => apps/mobile/src}/components/Container/index.ts (100%) rename {src => apps/mobile/src}/components/CopyButton/CopyButton.stories.tsx (100%) rename {src => apps/mobile/src}/components/CopyButton/CopyButton.tsx (100%) rename {src => apps/mobile/src}/components/CopyButton/index.ts (100%) rename {src => apps/mobile/src}/components/DataRow/DataRow.stories.tsx (100%) rename {src => apps/mobile/src}/components/DataRow/DataRow.test.tsx (100%) rename {src => apps/mobile/src}/components/DataRow/DataRow.tsx (100%) rename {src => apps/mobile/src}/components/DataRow/index.ts (100%) rename {src => apps/mobile/src}/components/Dropdown/Dropdown.test.tsx (100%) rename {src => apps/mobile/src}/components/Dropdown/Dropdown.tsx (100%) rename {src => apps/mobile/src}/components/Dropdown/index.ts (100%) rename {src => apps/mobile/src}/components/Dropdown/sheetComponents.tsx (100%) rename {src => apps/mobile/src}/components/EthAddress/ETHAddress.stories.tsx (100%) rename {src => apps/mobile/src}/components/EthAddress/ETHAddress.tsx (100%) rename {src => apps/mobile/src}/components/EthAddress/index.ts (100%) rename {src => apps/mobile/src}/components/Fiat/Fiat.test.tsx (100%) rename {src => apps/mobile/src}/components/Fiat/Fiat.tsx (100%) rename {src => apps/mobile/src}/components/Fiat/index.ts (100%) rename {src => apps/mobile/src}/components/Identicon/Identicon.stories.tsx (100%) rename {src => apps/mobile/src}/components/Identicon/Identicon.test.tsx (100%) rename {src => apps/mobile/src}/components/Identicon/Identicon.tsx (100%) rename {src => apps/mobile/src}/components/Identicon/index.ts (100%) rename {src => apps/mobile/src}/components/InnerShadow/InnerShadow.test.tsx (100%) rename {src => apps/mobile/src}/components/InnerShadow/InnerShadow.tsx (100%) rename {src => apps/mobile/src}/components/InnerShadow/__snapshots__/InnerShadow.test.tsx.snap (100%) rename {src => apps/mobile/src}/components/InnerShadow/index.ts (100%) rename {src => apps/mobile/src}/components/Logo/Logo.test.tsx (100%) rename {src => apps/mobile/src}/components/Logo/Logo.tsx (100%) rename {src => apps/mobile/src}/components/Logo/index.ts (100%) rename {src => apps/mobile/src}/components/SafeFontIcon/SafeFontIcon.stories.tsx (100%) rename {src => apps/mobile/src}/components/SafeFontIcon/SafeFontIcon.tsx (100%) rename {src => apps/mobile/src}/components/SafeFontIcon/index.ts (100%) rename {src => apps/mobile/src}/components/SafeListItem/SafeListItem.test.tsx (100%) rename {src => apps/mobile/src}/components/SafeListItem/SafeListItem.tsx (100%) rename {src => apps/mobile/src}/components/SafeListItem/__snapshots__/SafeListItem.test.tsx.snap (100%) rename {src => apps/mobile/src}/components/SafeListItem/index.tsx (100%) rename {src => apps/mobile/src}/components/SafeTab/SafeTab.tsx (100%) rename {src => apps/mobile/src}/components/SafeTab/SafeTabBar.tsx (100%) rename {src => apps/mobile/src}/components/SafeTab/index.tsx (100%) rename {src => apps/mobile/src}/components/SafeTab/types.ts (100%) rename {src => apps/mobile/src}/components/StatusBanners/PendingTransactions/PendingTransactions.stories.tsx (100%) rename {src => apps/mobile/src}/components/StatusBanners/PendingTransactions/PendingTransactions.test.tsx (100%) rename {src => apps/mobile/src}/components/StatusBanners/PendingTransactions/PendingTransactions.tsx (100%) rename {src => apps/mobile/src}/components/StatusBanners/PendingTransactions/__snapshots__/PendingTransactions.test.tsx.snap (100%) rename {src => apps/mobile/src}/components/StatusBanners/PendingTransactions/index.tsx (100%) rename {src => apps/mobile/src}/components/Title/LargeHeaderTitle.tsx (100%) rename {src => apps/mobile/src}/components/Title/NavBarTitle.tsx (100%) rename {src => apps/mobile/src}/components/Title/Title.test.tsx (100%) rename {src => apps/mobile/src}/components/Title/index.ts (100%) rename {src => apps/mobile/src}/components/TxInfo/TxInfo.tsx (100%) rename {src => apps/mobile/src}/components/TxInfo/index.tsx (100%) rename {src => apps/mobile/src}/components/navigation/TabBarIcon.test.tsx (100%) rename {src => apps/mobile/src}/components/navigation/TabBarIcon.tsx (100%) rename {src => apps/mobile/src}/components/navigation/index.ts (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/AssetsCard/AssetsCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/AssetsCard/AssetsCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/AssetsCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxBatchCard/TxBatchCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxBatchCard/TxBatchCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxBatchCard/TxBatchCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxBatchCard/__snapshots__/TxBatchCard.test.tsx.snap (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxBatchCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxConflictingCard/TxConflictingCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxConflictingCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxContractInteractionCard/TxContractInteractionCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxContractInteractionCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxCreationCard/TxCreationCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxCreationCard/TxCreationCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxCreationCard/TxCreationCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxCreationCard/index.ts (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxGroupedCard/TxGroupedCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxGroupedCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxRejectionCard/TxRejectionCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxRejectionCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSafeAppCard/TxSafeAppCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSafeAppCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSettingsCard/TxSettingCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSettingsCard/TxSettingCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSettingsCard/TxSettingsCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSettingsCard/__snapshots__/TxSettingCard.test.tsx.snap (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSettingsCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSwapCard/TxSwapCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSwapCard/TxSwapCard.test.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSwapCard/TxSwapCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSwapCard/__snapshots__/TxSwapCard.test.tsx.snap (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxSwapCard/index.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxTokenCard/TxTokenCard.stories.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxTokenCard/TxTokenCard.tsx (100%) rename {src => apps/mobile/src}/components/transactions-list/Card/TxTokenCard/index.tsx (100%) rename {src => apps/mobile/src}/config/constants.ts (100%) rename {src => apps/mobile/src}/features/Assets/Assets.container.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/AssetsHeader/AssetsHeader.container.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/AssetsHeader/AssetsHeader.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/AssetsHeader/index.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/AssetsHeader/styles.ts (100%) rename {src => apps/mobile/src}/features/Assets/components/Balance/Balance.container.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/Balance/Balance.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/Balance/ChainItems.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/Balance/index.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/Fallback/Fallback.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/Fallback/index.ts (100%) rename {src => apps/mobile/src}/features/Assets/components/NFTs/NFTItem.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/NFTs/NFTs.container.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/NFTs/index.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/Navbar/Navbar.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/Navbar/index.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/NoFunds/EmptyToken.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/NoFunds/NoFunds.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/NoFunds/index.ts (100%) rename {src => apps/mobile/src}/features/Assets/components/Tokens/Tokens.container.tsx (100%) rename {src => apps/mobile/src}/features/Assets/components/Tokens/index.tsx (100%) rename {src => apps/mobile/src}/features/Assets/index.tsx (100%) rename {src => apps/mobile/src}/features/Assets/styles.ts (100%) rename {src => apps/mobile/src}/features/Notifications/Notifications.container.tsx (100%) rename {src => apps/mobile/src}/features/Notifications/index.tsx (100%) rename {src => apps/mobile/src}/features/PendingTx/PendingTx.container.tsx (100%) rename {src => apps/mobile/src}/features/PendingTx/components/PendingTxList/PendingTxList.container.tsx (100%) rename {src => apps/mobile/src}/features/PendingTx/components/PendingTxList/index.ts (100%) rename {src => apps/mobile/src}/features/PendingTx/index.tsx (100%) rename {src => apps/mobile/src}/features/PendingTx/utils.tsx (100%) rename {src => apps/mobile/src}/features/Settings/Settings.container.tsx (100%) rename {src => apps/mobile/src}/features/Settings/Settings.tsx (100%) rename {src => apps/mobile/src}/features/Settings/components/AppSettings/AppSettings.container.tsx (100%) rename {src => apps/mobile/src}/features/Settings/components/AppSettings/AppSettings.tsx (100%) rename {src => apps/mobile/src}/features/Settings/components/AppSettings/index.ts (100%) rename {src => apps/mobile/src}/features/Settings/components/IdenticonWithBadge/IdenticonWithBadge.tsx (100%) rename {src => apps/mobile/src}/features/Settings/components/IdenticonWithBadge/index.ts (100%) rename {src => apps/mobile/src}/features/Settings/components/Navbar/Navbar.tsx (100%) rename {src => apps/mobile/src}/features/Settings/components/Navbar/SettingsButton.tsx (100%) rename {src => apps/mobile/src}/features/Settings/components/Navbar/SettingsMenu.tsx (100%) rename {src => apps/mobile/src}/features/Settings/components/Navbar/index.ts (100%) rename {src => apps/mobile/src}/features/Settings/index.tsx (100%) rename {src => apps/mobile/src}/features/Signers/Signers.container.tsx (100%) rename {src => apps/mobile/src}/features/Signers/index.tsx (100%) rename {src => apps/mobile/src}/features/TxHistory/TxHistory.container.tsx (100%) rename {src => apps/mobile/src}/features/TxHistory/components/TxHistoryList/TxHistoryList.tsx (100%) rename {src => apps/mobile/src}/features/TxHistory/components/TxHistoryList/index.ts (100%) rename {src => apps/mobile/src}/features/TxHistory/index.tsx (100%) rename {src => apps/mobile/src}/features/TxHistory/utils.tsx (100%) rename {src => apps/mobile/src}/hooks/useCopyAndDispatchToast/index.ts (100%) rename {src => apps/mobile/src}/hooks/useCopyAndDispatchToast/useCopyAndDisptachToast.test.tsx (100%) rename {src => apps/mobile/src}/hooks/usePendingTxs/index.ts (100%) rename {src => apps/mobile/src}/hooks/useTransactionType/index.tsx (100%) rename {src => apps/mobile/src}/hooks/useTransactionType/useTransactionType.test.tsx (100%) rename {src => apps/mobile/src}/navigation/useScrollableHeader.tsx (100%) rename {src => apps/mobile/src}/react-app-env.d.ts (100%) rename {src => apps/mobile/src}/services/exceptions/utils.test.ts (100%) rename {src => apps/mobile/src}/services/exceptions/utils.ts (100%) rename {src => apps/mobile/src}/store/activeChainSlice.ts (100%) rename {src => apps/mobile/src}/store/activeSafeSlice.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/about.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/accounts.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/auth.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/balances.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/chains.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/collectibles.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/community.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/contracts.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/data-decoded.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/delegates.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/estimations.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/messages.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/notifications.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/owners.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/relay.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/safe-apps.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/safes.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/targeted-messages.ts (100%) rename {src => apps/mobile/src}/store/gateway/AUTO_GENERATED/transactions.ts (100%) rename {src => apps/mobile/src}/store/gateway/api-schema/schema.json (89%) rename {src => apps/mobile/src}/store/gateway/cgwClient.ts (100%) rename {src => apps/mobile/src}/store/gateway/chains/index.ts (100%) rename {src => apps/mobile/src}/store/gateway/index.ts (100%) rename {src => apps/mobile/src}/store/gateway/types.ts (100%) rename {src => apps/mobile/src}/store/gateway/utils.ts (100%) rename {src => apps/mobile/src}/store/hooks/index.ts (100%) rename {src => apps/mobile/src}/store/hooks/storeHooks.test.ts (100%) rename {src => apps/mobile/src}/store/index.ts (100%) rename {src => apps/mobile/src}/store/storage.ts (100%) rename {src => apps/mobile/src}/store/txHistorySlice.ts (100%) rename {src => apps/mobile/src}/tests/jest.setup.tsx (100%) rename {src => apps/mobile/src}/tests/mocks.ts (100%) rename {src => apps/mobile/src}/tests/test-utils.tsx (100%) rename {src => apps/mobile/src}/theme/helpers/utils.ts (100%) rename {src => apps/mobile/src}/theme/navigation.ts (100%) rename {src => apps/mobile/src}/theme/palettes/darkPalette.ts (100%) rename {src => apps/mobile/src}/theme/palettes/lightPalette.ts (100%) rename {src => apps/mobile/src}/theme/provider/font.tsx (100%) rename {src => apps/mobile/src}/theme/provider/safeTheme.tsx (100%) rename {src => apps/mobile/src}/theme/provider/toastProvider.tsx (100%) rename {src => apps/mobile/src}/theme/tamagui.config.ts (100%) rename {src => apps/mobile/src}/theme/tokens.ts (100%) rename {src => apps/mobile/src}/types/address.ts (100%) rename {src => apps/mobile/src}/types/iconTypes.ts (100%) rename {src => apps/mobile/src}/types/navigation.d.ts (100%) rename {src => apps/mobile/src}/utils/date.test.ts (100%) rename {src => apps/mobile/src}/utils/date.ts (100%) rename {src => apps/mobile/src}/utils/formatters.ts (100%) rename {src => apps/mobile/src}/utils/gateway.test.ts (100%) rename {src => apps/mobile/src}/utils/gateway.ts (100%) rename {src => apps/mobile/src}/utils/transaction-guards.test.ts (100%) rename {src => apps/mobile/src}/utils/transaction-guards.ts (100%) rename {src => apps/mobile/src}/utils/transactions.tsx (100%) rename tsconfig.json => apps/mobile/tsconfig.json (100%) delete mode 100644 package-lock.json create mode 100644 yarn.lock diff --git a/.eas/build/build-and-maestro-test.yml b/.eas/build/build-and-maestro-test.yml deleted file mode 100644 index 126058f799..0000000000 --- a/.eas/build/build-and-maestro-test.yml +++ /dev/null @@ -1,8 +0,0 @@ -build: - name: Create a build and run Maestro tests on it - steps: - - eas/build - - eas/maestro_test: - inputs: - flow_path: | - e2e/flow.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/mobile-lint.yml similarity index 54% rename from .github/workflows/lint.yml rename to .github/workflows/mobile-lint.yml index a76dd60a06..0d485c2496 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/mobile-lint.yml @@ -4,7 +4,11 @@ on: push: branches: - main + paths: + - apps/mobile/** pull_request: + paths: + - apps/mobile/** jobs: lint: @@ -15,18 +19,20 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Enable Corepack + run: corepack enable + # Set up Node.js - - name: Set up Node.js - uses: actions/setup-node@v4 + - uses: actions/setup-node@v4 with: - node-version: 20 - cache: 'npm' + node-version: '22.11.0' # jod + cache: 'yarn' # Install dependencies - name: Install dependencies - run: npm ci + run: yarn install --immutable # Run tests with coverage - name: Run lint run: | - npm run lint + yarn workspace @safe-global/mobile run lint diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/mobile-unit-tests.yml similarity index 61% rename from .github/workflows/unit-tests.yml rename to .github/workflows/mobile-unit-tests.yml index d39b01b632..3c7ae75b81 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/mobile-unit-tests.yml @@ -4,7 +4,11 @@ on: push: branches: - main + paths: + - apps/mobile/** pull_request: + paths: + - apps/mobile/** jobs: test-and-coverage: @@ -15,21 +19,23 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Enable Corepack + run: corepack enable + # Set up Node.js - - name: Set up Node.js - uses: actions/setup-node@v4 + - uses: actions/setup-node@v4 with: - node-version: 20 - cache: 'npm' + node-version: '22.11.0' # jod + cache: 'yarn' # Install dependencies - name: Install dependencies - run: npm ci + run: yarn install --immutable # Run tests with coverage - name: Run Jest tests with coverage run: | - npm run test:coverage -- --collectCoverageFrom="./src/**" --coverageReporters=text --coverageReporters=json-summary | tee ./coverage.txt && exit ${PIPESTATUS[0]} + yarn workspace @safe-global/mobile test:coverage --coverageReporters=text --coverageReporters=json-summary | tee ./coverage.txt && exit ${PIPESTATUS[0]} - name: Jest Coverage Comment uses: MishaKav/jest-coverage-comment@v1 diff --git a/.gitignore b/.gitignore index 4453806e56..da4ab0ca92 100644 --- a/.gitignore +++ b/.gitignore @@ -1,37 +1,56 @@ -node_modules/ -.expo/ -dist/ -npm-debug.* -*.jks -*.p8 -*.p12 -*.key -*.mobileprovision -*.orig.* -web-build/ - -# Auto generated storybook file -.storybook/storybook.requires.ts - -# From jest -html -coverage - -# macOS -.DS_Store +.env + +/node_modules +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# expo +**/.expo/* + +# next.js +**/.next/* +/out/ + +# tamagui +**/.tamagui/* + +# production +/build -# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb -# The following patterns were generated by expo-cli +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env +.env.local +.env.local* +.env.development.local +.env.test.local +.env.production.local +.env.production + +# vercel +.vercel + +# typescript +*.tsbuildinfo + +# os +.DS_Store +THUMBS_DB +thumbs.db -expo-env.d.ts -# @end expo-cli -/.idea -# Tamagui UI generates a lot of cache files -.tamagui +**/node_modules/* -*storybook.log -/storybook-static +# intellij +.idea -# Android and iOS build files -/android/* -/ios/* +# Turborepo +.turbo diff --git a/.lintstagedrc.json b/.lintstagedrc.json index ae8a30eff5..c9e38faadb 100644 --- a/.lintstagedrc.json +++ b/.lintstagedrc.json @@ -1,5 +1,5 @@ { - "*.ts": ["prettier --write", "eslint"], - "*.tsx": ["prettier --write", "eslint"], - "assets/fonts/safe-icons/selection.json": ["node ./scripts/generateIconTypes.js", "git add ./src/types/iconTypes.ts"] + "*.ts": ["yarn prettier:fix", "yarn eslint"], + "*.tsx": ["yarn prettier:fix", "yarn eslint"], + "apps/mobile/assets/fonts/safe-icons/selection.json": ["node ./apps/mobile/scripts/generateIconTypes.js", "git add ./apps/mobile/src/types/iconTypes.ts"] } diff --git a/.nvmrc b/.nvmrc index f3f5c789c9..0c163eae58 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ - v20.17.0 \ No newline at end of file + v22.11.0 diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000000..91b1101f52 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,5 @@ +compressionLevel: mixed + +enableGlobalCache: false + +nodeLinker: node-modules diff --git a/README.md b/README.md index ad1be8f89f..22fff027f4 100644 --- a/README.md +++ b/README.md @@ -1,123 +1,140 @@ -# Safe Mobile App 👋 +# Safe Global Monorepo 🙋‍♂️ -## Setup the project +## Overview -1. install the npm dependencies +Welcome to the Safe Global Monorepo! This repository houses multiple applications and packages managed under a unified +structure using Yarn Workspaces. The monorepo setup simplifies dependency management and ensures consistent development +practices across projects. -```bash -npm install -``` +### Key Components -2. run expo install to make sure no package is missing +- **apps/**: Contains application projects (e.g., `mobile` for the Safe Mobile App). +- **packages/**: Shared libraries and utilities. -```bash -npx expo install -``` +## Getting Started -## Running the App +To get started, ensure you have the required tools installed and follow these steps: -```bash - npx expo run:ios --device -``` +### Prerequisites -or for android +- **Node.js**: Install the latest stable version from [Node.js](https://nodejs.org/). +- **Yarn**: Use Yarn version 4.5.3 or later. You can install it globally: ```bash - npx expo run:android --device +npm install -g yarn ``` -### How to open custom devtools menu +### Initial Setup -currently our app have redux, rtk-query and react devtools support. To run one of them is pretty straightforward, you -just need to run the app, and then in the terminal where expo server is runnig, you press `shift + m` and the devtools -options will apper for you. -Then select one of them and happy debugging 👨‍💻👩‍💻 +1. Clone the repository: -## Running the storybook +```bash +git clone +cd monorepo +``` -1. run the storybook command on your terminal +2. Install dependencies: ```bash - npm run storybook +yarn install ``` -2. press `i` for ios or `a` for android +## Monorepo Commands -## How to run the e2e tests +Here are some essential commands to help you navigate the monorepo: -We're using [Maestro](https://maestro.mobile.dev/) for e2e. Before run the tests you should install Maestro according to -the documentation steps for your OS. +### Workspace Management -### How to run a dev build and e2e tests +- **Run a script in a specific workspace:** -To build the dev version of the app for tests, depending on the platform -you are building for, you can run either: +```bash +yarn workspace