Repository: safe-global/web-core Branch: dev Commit: c32b790cabd0 Files: 5930 Total size: 22.0 MB Directory structure: gitextract_0zone9s6/ ├── .claude/ │ ├── commands/ │ │ ├── speckit.analyze.md │ │ ├── speckit.checklist.md │ │ ├── speckit.clarify.md │ │ ├── speckit.constitution.md │ │ ├── speckit.implement.md │ │ ├── speckit.plan.md │ │ ├── speckit.specify.md │ │ ├── speckit.tasks.md │ │ └── speckit.taskstoissues.md │ └── skills/ │ ├── cypress-e2e/ │ │ └── SKILL.md │ ├── design.figma-to-code/ │ │ ├── SKILL.md │ │ └── reference.md │ ├── design.prototype/ │ │ └── SKILL.md │ ├── design.sync-component/ │ │ └── SKILL.md │ ├── design.sync-variables/ │ │ └── SKILL.md │ └── design.verify/ │ └── SKILL.md ├── .codescene.yml ├── .cursor/ │ └── rules/ │ ├── cypress-e2e.mdc │ └── safe-monorepo.mdc ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-report.md │ │ ├── feature-request.md │ │ ├── task.md │ │ └── tech-debt.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── actions/ │ │ ├── branch-slug/ │ │ │ └── action.yml │ │ ├── build/ │ │ │ └── action.yml │ │ ├── build-storybook/ │ │ │ └── action.yml │ │ ├── cache-deps/ │ │ │ └── action.yml │ │ ├── corepack/ │ │ │ └── action.yml │ │ ├── cypress/ │ │ │ └── action.yml │ │ ├── upload-coverage/ │ │ │ └── action.yml │ │ ├── upload-to-storage-branch/ │ │ │ └── action.yml │ │ └── yarn/ │ │ └── action.yml │ ├── dependabot.yml │ ├── scripts/ │ │ ├── capture-mobile-screenshots.js │ │ ├── capture-page-screenshots.js │ │ ├── capture-web-storybook-screenshots.js │ │ ├── generate-mobile-story-urls.js │ │ ├── generate-web-story-urls.js │ │ ├── map-files-to-routes.js │ │ └── publish/ │ │ ├── download-artifact.js │ │ ├── post-comment.js │ │ └── resolve-pr.js │ └── workflows/ │ ├── claude-code-review.yml │ ├── mobile-checks.yml │ ├── mobile-dev-release.yml │ ├── mobile-e2e.yml │ ├── mobile-storybook-screenshots.yml │ ├── mobile-unit-tests.yml │ ├── package-utils-unit-tests.yml │ ├── page-screenshots-build.yml │ ├── page-screenshots-publish.yml │ ├── store-codegen-check.yml │ ├── store-codegen-drift.yml │ ├── tx-builder-checks.yml │ ├── tx-builder-deploy.yml │ ├── web-argos-e2e.yml │ ├── web-checks.yml │ ├── web-chromatic.yml │ ├── web-deploy-dev.yml │ ├── web-deploy-dockerhub.yml │ ├── web-e2e-full-ondemand.yml │ ├── web-e2e-hp-ondemand.yml │ ├── web-e2e-prod-ondemand.yml │ ├── web-e2e-smoke.yml │ ├── web-nextjs-bundle-analysis.yml │ ├── web-release-start.yml │ ├── web-storybook-screenshots-build.yml │ ├── web-storybook-screenshots-publish.yml │ ├── web-storybook-tests.yml │ ├── web-tag-release.yml │ └── web-unit-tests.yml ├── .gitignore ├── .husky/ │ ├── commit-msg │ ├── pre-commit │ └── pre-push ├── .lintstagedrc.mjs ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── .specify/ │ ├── memory/ │ │ └── constitution.md │ ├── scripts/ │ │ └── bash/ │ │ ├── check-prerequisites.sh │ │ ├── common.sh │ │ ├── create-new-feature.sh │ │ ├── setup-plan.sh │ │ └── update-agent-context.sh │ └── templates/ │ ├── agent-file-template.md │ ├── checklist-template.md │ ├── plan-template.md │ ├── spec-template.md │ └── tasks-template.md ├── .vscode/ │ └── settings.json ├── .yarn/ │ └── patches/ │ ├── @tamagui-image-npm-2.0.0-rc.26-04087a216c.patch │ ├── next-npm-15.5.8-7d525d02b9.patch │ ├── react-native-ble-plx+3.5.0.patch │ ├── react-native-device-crypto-npm-0.1.7-dbd2698fc4.patch │ ├── react-native-npm-0.83.4-77634a290c.patch │ └── react-native-qrcode-styled-npm-0.3.3-b5336fc77c.patch ├── .yarnrc.yml ├── AGENTS.md ├── CLAUDE.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── README.md ├── apps/ │ ├── mobile/ │ │ ├── .eas/ │ │ │ └── build/ │ │ │ └── build-and-maestro-test.yml │ │ ├── .easignore │ │ ├── .gitignore │ │ ├── .storybook/ │ │ │ ├── index.ts │ │ │ ├── main.ts │ │ │ ├── mocks/ │ │ │ │ ├── expo-fast-refresh.js │ │ │ │ ├── react-native-quick-crypto.js │ │ │ │ ├── react-native-reanimated.js │ │ │ │ ├── react-native-worklets/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── package.json │ │ │ │ └── react-refresh.js │ │ │ ├── preview.tsx │ │ │ ├── storybook.requires.d.ts │ │ │ └── tsconfig.json │ │ ├── AGENTS.md │ │ ├── README.md │ │ ├── __mocks__/ │ │ │ ├── fileMock.js │ │ │ ├── react-native-capture-protection.js │ │ │ └── react-native-collapsible-tab-view.tsx │ │ ├── app.config.ts │ │ ├── assets/ │ │ │ ├── android/ │ │ │ │ └── drawable/ │ │ │ │ ├── baseline_arrow_outward_24.xml │ │ │ │ ├── baseline_auto_awesome_motion_24.xml │ │ │ │ ├── baseline_content_copy_24.xml │ │ │ │ ├── baseline_create_24.xml │ │ │ │ ├── baseline_delete_24.xml │ │ │ │ ├── baseline_explore_24.xml │ │ │ │ └── ic_notification.xml │ │ │ └── fonts/ │ │ │ └── safe-icons/ │ │ │ └── safe-icons.icomoon.json │ │ ├── babel.config.js │ │ ├── docs/ │ │ │ ├── analytics.md │ │ │ ├── code-style.md │ │ │ ├── e2e-tests-guidelines.md │ │ │ ├── push-notifications.md │ │ │ └── release-procedure.md │ │ ├── e2e/ │ │ │ ├── README.md │ │ │ ├── config.yaml │ │ │ ├── tests/ │ │ │ │ ├── app-update/ │ │ │ │ │ ├── force-update.yml │ │ │ │ │ └── soft-update.yml │ │ │ │ ├── assets/ │ │ │ │ │ ├── __suite__.yml │ │ │ │ │ ├── change-currency.yml │ │ │ │ │ ├── view-positions.yml │ │ │ │ │ └── view-tokens-and-nfts.yml │ │ │ │ ├── connect-signer/ │ │ │ │ │ ├── __suite__.yml │ │ │ │ │ ├── connect-signer-collision.yml │ │ │ │ │ ├── connect-signer-not-owner.yml │ │ │ │ │ ├── connect-signer-success.yml │ │ │ │ │ ├── reconnect-wrong-wallet.yml │ │ │ │ │ ├── wc-gate-reconnect.yml │ │ │ │ │ └── wc-gate-switch-network.yml │ │ │ │ ├── onboarding/ │ │ │ │ │ ├── __suite__.yml │ │ │ │ │ ├── add-existing-safe.yml │ │ │ │ │ ├── add-safe-and-import-signer.yml │ │ │ │ │ ├── enhanced-onboarding-flow.yml │ │ │ │ │ ├── import-signer-private-key.yml │ │ │ │ │ ├── import-signer-seed-phrase.yml │ │ │ │ │ ├── import-signer.yml │ │ │ │ │ └── new-user-onboarding.yml │ │ │ │ ├── settings/ │ │ │ │ │ ├── __suite__.yml │ │ │ │ │ ├── address-book.yml │ │ │ │ │ ├── change-theme.yml │ │ │ │ │ ├── state-preservation.yml │ │ │ │ │ └── view-account-info.yml │ │ │ │ └── transactions/ │ │ │ │ ├── history/ │ │ │ │ │ ├── __suite__.yml │ │ │ │ │ ├── add-owner-threshold.yml │ │ │ │ │ ├── batch-transaction.yml │ │ │ │ │ ├── bulk-transactions.yml │ │ │ │ │ ├── change-threshold.yml │ │ │ │ │ ├── contract-interaction-delete-allowance.yml │ │ │ │ │ ├── contract-interaction-deposit.yml │ │ │ │ │ ├── disable-module.yml │ │ │ │ │ ├── limit-order.yml │ │ │ │ │ ├── received-transaction.yml │ │ │ │ │ ├── rejected-transaction.yml │ │ │ │ │ ├── remove-owner.yml │ │ │ │ │ ├── sent-transaction.yml │ │ │ │ │ ├── stake-claim.yml │ │ │ │ │ ├── stake-deposit.yml │ │ │ │ │ ├── swap-order.yml │ │ │ │ │ ├── swap-owner.yml │ │ │ │ │ └── view-transaction-history.yml │ │ │ │ └── pending/ │ │ │ │ ├── batch-transaction.yml │ │ │ │ ├── conflicting-transactions.yml │ │ │ │ ├── limit-order.yml │ │ │ │ ├── on-chain-rejection.yml │ │ │ │ ├── safe-shield/ │ │ │ │ │ ├── approve-malicious.yml │ │ │ │ │ ├── batch-2-actions.yml │ │ │ │ │ ├── batch-3-actions-benign.yml │ │ │ │ │ ├── batch-3-actions-warn.yml │ │ │ │ │ ├── batch-malicious.yml │ │ │ │ │ ├── contract-interaction-malicious.yml │ │ │ │ │ ├── pending-bridge-unknown-network.yml │ │ │ │ │ ├── pending-bridge.yml │ │ │ │ │ ├── send-dai-malicious.yml │ │ │ │ │ ├── send-matic-benign.yml │ │ │ │ │ ├── send-matic-malicious.yml │ │ │ │ │ ├── settings-change-fallback-handler.yml │ │ │ │ │ └── settings-change.yml │ │ │ │ ├── send-transaction.yml │ │ │ │ ├── set-fallback-handler.yml │ │ │ │ ├── settings-change.yml │ │ │ │ ├── swap-order.yml │ │ │ │ └── twap-order.yml │ │ │ └── utils/ │ │ │ ├── assertions/ │ │ │ │ ├── verify-action-detail.yml │ │ │ │ ├── verify-actions-list.yml │ │ │ │ ├── verify-advanced-details.yml │ │ │ │ ├── verify-balance-change.yml │ │ │ │ ├── verify-clipboard-content.yml │ │ │ │ ├── verify-explorer-link.yml │ │ │ │ ├── verify-review-and-execute.yml │ │ │ │ ├── verify-safe-shield-sheet.yml │ │ │ │ ├── verify-safe-shield-widget.yml │ │ │ │ ├── verify-share-link.yml │ │ │ │ ├── verify-tx-checks.yml │ │ │ │ ├── verify-tx-confirmations.yml │ │ │ │ ├── verify-tx-details.yml │ │ │ │ ├── verify-tx-history-confirmations.yml │ │ │ │ ├── verify-tx-info.yml │ │ │ │ ├── verify-tx-network.yml │ │ │ │ ├── verify-tx-recipient.yml │ │ │ │ └── verify-tx-sender.yml │ │ │ ├── components/ │ │ │ │ ├── advanced-details/ │ │ │ │ │ ├── data.yml │ │ │ │ │ └── parameters.yml │ │ │ │ ├── pending-tx/ │ │ │ │ │ ├── batch-tx-card.yml │ │ │ │ │ ├── batch-tx.yml │ │ │ │ │ ├── conflicting-txs-card.yml │ │ │ │ │ ├── limit-order-tx-card.yml │ │ │ │ │ ├── limit-order-tx.yml │ │ │ │ │ ├── on-chain-rejection-tx-card.yml │ │ │ │ │ ├── on-chain-rejection-tx.yml │ │ │ │ │ ├── send-tx-card.yml │ │ │ │ │ ├── send-tx.yml │ │ │ │ │ ├── setFallbackHandler-tx-card.yml │ │ │ │ │ ├── setFallbackHandler-tx.yml │ │ │ │ │ ├── settings-change-new-signer-tx-card.yml │ │ │ │ │ ├── settings-change-new-signer-tx.yml │ │ │ │ │ ├── swap-order-tx-card.yml │ │ │ │ │ ├── swap-order-tx.yml │ │ │ │ │ ├── tap-tx-card.yml │ │ │ │ │ ├── twap-order-tx-card.yml │ │ │ │ │ └── twap-order-tx.yml │ │ │ │ └── tx-history/ │ │ │ │ ├── add-owner-with-threshold-tx-card.yml │ │ │ │ ├── add-owner-with-threshold-tx.yml │ │ │ │ ├── batch-tx-card.yml │ │ │ │ ├── batch-tx.yml │ │ │ │ ├── bulk-tx-card.yml │ │ │ │ ├── bulk-tx.yml │ │ │ │ ├── change-threshold-tx-card.yml │ │ │ │ ├── change-threshold-tx.yml │ │ │ │ ├── contract-interaction-tx-card.yml │ │ │ │ ├── contract-interaction-tx.yml │ │ │ │ ├── disable-module-tx-card.yml │ │ │ │ ├── disable-module-tx.yml │ │ │ │ ├── limit-order-tx-card.yml │ │ │ │ ├── limit-order-tx.yml │ │ │ │ ├── received-tx-card.yml │ │ │ │ ├── received-tx.yml │ │ │ │ ├── reject-tx-card.yml │ │ │ │ ├── reject-tx.yml │ │ │ │ ├── remove-owner-tx-card.yml │ │ │ │ ├── remove-owner-tx.yml │ │ │ │ ├── sent-tx-card.yml │ │ │ │ ├── sent-tx.yml │ │ │ │ ├── stake-claim-tx-card.yml │ │ │ │ ├── stake-claim-tx.yml │ │ │ │ ├── stake-deposit-tx-card.yml │ │ │ │ ├── stake-deposit-tx.yml │ │ │ │ ├── swap-order-tx-card.yml │ │ │ │ ├── swap-order-tx.yml │ │ │ │ ├── swap-owner-tx-card.yml │ │ │ │ └── swap-owner-tx.yml │ │ │ ├── scripts/ │ │ │ │ └── defaults.js │ │ │ └── setup/ │ │ │ ├── app-start.yml │ │ │ ├── open-review-and-execute.yml │ │ │ └── switch-safe.yml │ │ ├── eas.json │ │ ├── eslint.config.mjs │ │ ├── expo-plugins/ │ │ │ ├── ssl-pinning/ │ │ │ │ ├── README.md │ │ │ │ └── withSSLPinning.js │ │ │ ├── withDrawableAssets.js │ │ │ └── withNotificationIcons.js │ │ ├── firebase.json │ │ ├── index.js │ │ ├── jest.config.js │ │ ├── metro.config.js │ │ ├── openapi-config.ts │ │ ├── package.json │ │ ├── queries.js │ │ ├── resources/ │ │ │ └── icons/ │ │ │ ├── README.md │ │ │ └── safe-icons/ │ │ │ ├── font/ │ │ │ │ ├── demo.html │ │ │ │ └── style.css │ │ │ └── safe-icons.icomoon.json │ │ ├── scripts/ │ │ │ ├── generateIconTypes.js │ │ │ ├── getCertificates.js │ │ │ └── reset-project.js │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── (import-accounts)/ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── form.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── signers.tsx │ │ │ │ ├── (send)/ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── amount.tsx │ │ │ │ │ ├── recipient.tsx │ │ │ │ │ ├── scan-qr.tsx │ │ │ │ │ └── token.tsx │ │ │ │ ├── (tabs)/ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── settings.tsx │ │ │ │ │ └── transactions.tsx │ │ │ │ ├── +html.tsx │ │ │ │ ├── +native-intent.tsx │ │ │ │ ├── +not-found.tsx │ │ │ │ ├── _layout.tsx │ │ │ │ ├── accounts-sheet.tsx │ │ │ │ ├── action-details.tsx │ │ │ │ ├── address-book.tsx │ │ │ │ ├── app-settings.tsx │ │ │ │ ├── biometrics-opt-in.tsx │ │ │ │ ├── change-estimated-fee-sheet.tsx │ │ │ │ ├── change-signer-sheet.tsx │ │ │ │ ├── confirm-transaction.tsx │ │ │ │ ├── confirmations-sheet.tsx │ │ │ │ ├── conflict-transaction-sheet.tsx │ │ │ │ ├── contact.tsx │ │ │ │ ├── currency.tsx │ │ │ │ ├── developer.tsx │ │ │ │ ├── execute-transaction/ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── ledger-connect.tsx │ │ │ │ │ ├── ledger-pairing.tsx │ │ │ │ │ └── ledger-review.tsx │ │ │ │ ├── execution-error.tsx │ │ │ │ ├── execution-success.tsx │ │ │ │ ├── get-started.tsx │ │ │ │ ├── history-transaction-details.tsx │ │ │ │ ├── how-to-execute-sheet.tsx │ │ │ │ ├── import-data/ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── enter-password.tsx │ │ │ │ │ ├── file-selection.tsx │ │ │ │ │ ├── help-import.tsx │ │ │ │ │ ├── import-error.tsx │ │ │ │ │ ├── import-progress.tsx │ │ │ │ │ ├── import-success.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── review-data.tsx │ │ │ │ ├── import-signers/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── _layout.test.tsx │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── connect-signer-error.tsx │ │ │ │ │ ├── connect-signer-success.tsx │ │ │ │ │ ├── hardware-devices.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── ledger-addresses.tsx │ │ │ │ │ ├── ledger-connect.tsx │ │ │ │ │ ├── ledger-error.tsx │ │ │ │ │ ├── ledger-pairing.tsx │ │ │ │ │ ├── ledger-success.tsx │ │ │ │ │ ├── loading.tsx │ │ │ │ │ ├── name-signer.tsx │ │ │ │ │ ├── private-key-error.tsx │ │ │ │ │ ├── private-key-success.tsx │ │ │ │ │ ├── private-key.tsx │ │ │ │ │ ├── reconnect-error.tsx │ │ │ │ │ ├── seed-phrase-addresses.tsx │ │ │ │ │ └── signer.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── manage-tokens-sheet.tsx │ │ │ │ ├── networks-sheet.tsx │ │ │ │ ├── notifications-center.tsx │ │ │ │ ├── notifications-opt-in.tsx │ │ │ │ ├── notifications-settings.tsx │ │ │ │ ├── onboarding.tsx │ │ │ │ ├── pending-transactions.tsx │ │ │ │ ├── protocol-detail-sheet.tsx │ │ │ │ ├── review-and-confirm.tsx │ │ │ │ ├── review-and-execute.tsx │ │ │ │ ├── safe-shield-details-sheet.tsx │ │ │ │ ├── share.tsx │ │ │ │ ├── sign-transaction/ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── ledger-connect.tsx │ │ │ │ │ ├── ledger-pairing.tsx │ │ │ │ │ └── ledger-review.tsx │ │ │ │ ├── signers/ │ │ │ │ │ ├── [address]/ │ │ │ │ │ │ └── private-key.tsx │ │ │ │ │ ├── [address].tsx │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── signing-error.tsx │ │ │ │ ├── signing-success.tsx │ │ │ │ ├── transaction-actions.tsx │ │ │ │ ├── transaction-checks.tsx │ │ │ │ └── transaction-parameters/ │ │ │ │ ├── (tabs)/ │ │ │ │ │ ├── _layout.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── parameters.tsx │ │ │ │ └── _layout.tsx │ │ │ ├── components/ │ │ │ │ ├── ActionsRow/ │ │ │ │ │ ├── ActionsRow.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Alert/ │ │ │ │ │ ├── Alert.stories.tsx │ │ │ │ │ ├── Alert.test.tsx │ │ │ │ │ ├── Alert.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── theme.ts │ │ │ │ ├── Badge/ │ │ │ │ │ ├── Badge.test.tsx │ │ │ │ │ ├── Badge.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Badge.test.tsx.snap │ │ │ │ │ ├── badge.stories.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── theme.ts │ │ │ │ ├── BadgeWrapper/ │ │ │ │ │ ├── BadgeWrapper.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── BlurredIdenticonBackground/ │ │ │ │ │ ├── BlurredIdenticonBackground.stories.tsx │ │ │ │ │ ├── BlurredIdenticonBackground.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Camera/ │ │ │ │ │ ├── QrCamera.test.tsx │ │ │ │ │ ├── QrCamera.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useCameraPermissionFlow.test.ts │ │ │ │ │ └── useCameraPermissionFlow.ts │ │ │ │ ├── ChainIndicator/ │ │ │ │ │ ├── ChainIndicator.stories.tsx │ │ │ │ │ ├── ChainIndicator.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ChainsDisplay/ │ │ │ │ │ ├── ChainsDisplay.stories.tsx │ │ │ │ │ ├── ChainsDisplay.test.tsx │ │ │ │ │ ├── ChainsDisplay.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── CloseButton/ │ │ │ │ │ ├── CloseButton.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ComingSoon/ │ │ │ │ │ └── ComingSoon.tsx │ │ │ │ ├── Container/ │ │ │ │ │ ├── Container.stories.tsx │ │ │ │ │ ├── Container.test.tsx │ │ │ │ │ ├── Container.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Container.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── CopyButton/ │ │ │ │ │ ├── CopyButton.stories.tsx │ │ │ │ │ ├── CopyButton.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── DataRow/ │ │ │ │ │ ├── DataRow.stories.tsx │ │ │ │ │ ├── DataRow.test.tsx │ │ │ │ │ ├── DataRow.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Dropdown/ │ │ │ │ │ ├── DropdownLabel.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── sheetComponents.tsx │ │ │ │ ├── EncodedData/ │ │ │ │ │ ├── EncodedData.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ErrorBoundary/ │ │ │ │ │ ├── SilentErrorBoundary.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── EthAddress/ │ │ │ │ │ ├── ETHAddress.stories.tsx │ │ │ │ │ ├── ETHAddress.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ExecutingMonitor/ │ │ │ │ │ ├── ExecutingMonitor.test.tsx │ │ │ │ │ ├── ExecutingMonitor.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Fiat/ │ │ │ │ │ ├── Fiat.test.tsx │ │ │ │ │ ├── Fiat.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── FiatChange/ │ │ │ │ │ ├── FiatChange.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── FiatChange.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── FloatingContainer/ │ │ │ │ │ ├── FloatingContainer.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── GradientText/ │ │ │ │ │ ├── GradientText.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── HashDisplay/ │ │ │ │ │ ├── HashDisplay.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── HashDisplay.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── HexDataDisplay/ │ │ │ │ │ ├── HexDataDisplay.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Identicon/ │ │ │ │ │ ├── Identicon.stories.tsx │ │ │ │ │ ├── Identicon.test.tsx │ │ │ │ │ ├── Identicon.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── InfoSheet/ │ │ │ │ │ ├── InfoSheet.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── InnerShadow/ │ │ │ │ │ ├── InnerShadow.test.tsx │ │ │ │ │ ├── InnerShadow.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── InnerShadow.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── LinearGradient/ │ │ │ │ │ ├── LinearGradien.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── LoadableSwitch/ │ │ │ │ │ ├── LoadableSwitch.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Loader/ │ │ │ │ │ ├── Loader.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── LoadingScreen/ │ │ │ │ │ ├── LoadingScreen.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Logo/ │ │ │ │ │ ├── Logo.test.tsx │ │ │ │ │ ├── Logo.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── NetworkBadge/ │ │ │ │ │ ├── NetworkBadge.stories.tsx │ │ │ │ │ ├── NetworkBadge.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── theme.ts │ │ │ │ ├── NetworkRow/ │ │ │ │ │ ├── NetworkRow.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── OptIn/ │ │ │ │ │ ├── OptIn.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ParametersButton/ │ │ │ │ │ ├── ParametersButton.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ProposalBadge/ │ │ │ │ │ ├── ProposalBadge.stories.tsx │ │ │ │ │ ├── ProposalBadge.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ReadOnlyWarningModal/ │ │ │ │ │ ├── ReadOnlyWarningModal.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── RiskAcknowledgmentCheckbox/ │ │ │ │ │ ├── RiskAcknowledgmentCheckbox.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SVGs/ │ │ │ │ │ └── SafeWalletLogo.tsx │ │ │ │ ├── SafeAccountInput/ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useImportSafe.test.tsx │ │ │ │ │ │ └── useImportSafe.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeAvatar/ │ │ │ │ │ ├── SafeAvatar.stories.tsx │ │ │ │ │ └── SafeAvatar.tsx │ │ │ │ ├── SafeBottomSheet/ │ │ │ │ │ ├── SafeBottomSheet.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SafeButton/ │ │ │ │ │ ├── SafeButton.stories.tsx │ │ │ │ │ ├── SafeButton.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SafeCard/ │ │ │ │ │ ├── SafeCard.stories.tsx │ │ │ │ │ ├── SafeCard.test.tsx │ │ │ │ │ ├── SafeCard.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SafeFontIcon/ │ │ │ │ │ ├── SafeFontIcon.stories.tsx │ │ │ │ │ ├── SafeFontIcon.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SafeInput/ │ │ │ │ │ ├── SafeInput.stories.tsx │ │ │ │ │ ├── SafeInput.test.tsx │ │ │ │ │ ├── SafeInput.tsx │ │ │ │ │ ├── SafeInputWithLabel.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── styled.ts │ │ │ │ │ ├── theme.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── SafeListItem/ │ │ │ │ │ ├── SafeListItem.test.tsx │ │ │ │ │ ├── SafeListItem.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── SafeListItem.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── theme.ts │ │ │ │ ├── SafeSearchBar/ │ │ │ │ │ └── SafeSearchBar.tsx │ │ │ │ ├── SafeSkeleton/ │ │ │ │ │ ├── SafeSkeleton.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeTab/ │ │ │ │ │ ├── SafeTab.tsx │ │ │ │ │ ├── SafeTabBar.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── theme.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── SelectExecutor/ │ │ │ │ │ ├── SelectExecutor.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SelectSigner/ │ │ │ │ │ ├── SelectSigner.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ShareButton/ │ │ │ │ │ ├── ShareButton.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SignerTypeBadge/ │ │ │ │ │ ├── SignerTypeBadge.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SigningMonitor/ │ │ │ │ │ ├── SigningMonitor.test.tsx │ │ │ │ │ ├── SigningMonitor.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── StatusBanners/ │ │ │ │ │ └── PendingTransactions/ │ │ │ │ │ ├── PendingTransactions.stories.tsx │ │ │ │ │ ├── PendingTransactions.test.tsx │ │ │ │ │ ├── PendingTransactions.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── PendingTransactions.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── SwapHeader/ │ │ │ │ │ ├── SwapHeader.test.tsx │ │ │ │ │ ├── SwapHeader.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Tab/ │ │ │ │ │ └── TabNameContext.tsx │ │ │ │ ├── Tag/ │ │ │ │ │ ├── Tag.stories.tsx │ │ │ │ │ ├── Tag.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ThresholdBadge/ │ │ │ │ │ ├── ThresholdBadge.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Title/ │ │ │ │ │ ├── LargeHeaderTitle.tsx │ │ │ │ │ ├── NavBarTitle.tsx │ │ │ │ │ ├── SectionTitle.tsx │ │ │ │ │ ├── Title.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TokenAmount/ │ │ │ │ │ ├── TokenAmount.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TokenIcon/ │ │ │ │ │ ├── TokenIcon.test.tsx │ │ │ │ │ ├── TokenIcon.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TransactionProcessingState/ │ │ │ │ │ ├── TransactionProcessingState.test.tsx │ │ │ │ │ ├── TransactionProcessingState.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TransactionSkeleton/ │ │ │ │ │ ├── TransactionSkeleton.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxInfo/ │ │ │ │ │ ├── TxInfo.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── ValidatorRow/ │ │ │ │ │ ├── ValidatorRow.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ValidatorStatus/ │ │ │ │ │ ├── ValidatorStatus.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── navigation/ │ │ │ │ │ ├── TabBarIcon.test.tsx │ │ │ │ │ ├── TabBarIcon.tsx │ │ │ │ │ └── index.ts │ │ │ │ └── transactions-list/ │ │ │ │ └── Card/ │ │ │ │ ├── AccountCard/ │ │ │ │ │ ├── AccountCard.stories.tsx │ │ │ │ │ ├── AccountCard.test.tsx │ │ │ │ │ ├── AccountCard.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── AssetsCard/ │ │ │ │ │ ├── AssetsCard.test.tsx │ │ │ │ │ ├── AssetsCard.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SignersCard/ │ │ │ │ │ ├── SignersCard.test.tsx │ │ │ │ │ ├── SignersCard.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── StakingTxDepositCard/ │ │ │ │ │ ├── StakingTxDepositCard.stories.tsx │ │ │ │ │ ├── StakingTxDepositCard.test.tsx │ │ │ │ │ ├── StakingTxDepositCard.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── StakingTxDepositCard.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── StakingTxExitCard/ │ │ │ │ │ ├── StakingTxExitCard.stories.tsx │ │ │ │ │ ├── StakingTxExitCard.test.tsx │ │ │ │ │ ├── StakingTxExitCard.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── StakingTxExitCard.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── StakingTxWithdrawCard/ │ │ │ │ │ ├── StakingTxWithdrawCard.stories.tsx │ │ │ │ │ ├── StakingTxWithdrawCard.test.tsx │ │ │ │ │ ├── StakingTxWithdrawCard.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── StakingTxWithdrawCard.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxBatchCard/ │ │ │ │ │ ├── TxBatchCard.stories.tsx │ │ │ │ │ ├── TxBatchCard.test.tsx │ │ │ │ │ ├── TxBatchCard.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── TxBatchCard.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxBridgeCard/ │ │ │ │ │ ├── TxBridgeCard.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TxConflictingCard/ │ │ │ │ │ ├── TxConflictingCard.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxContractInteractionCard/ │ │ │ │ │ ├── TxContractInteractionCard.stories.tsx │ │ │ │ │ ├── TxContractInteractionCard.test.tsx │ │ │ │ │ ├── TxContractInteractionCard.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxCreationCard/ │ │ │ │ │ ├── TxCreationCard.stories.tsx │ │ │ │ │ ├── TxCreationCard.test.tsx │ │ │ │ │ ├── TxCreationCard.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TxGroupedCard/ │ │ │ │ │ ├── TxGroupedCard.stories.tsx │ │ │ │ │ ├── TxGroupedCard.test.tsx │ │ │ │ │ ├── TxGroupedCard.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxLifiSwapCard/ │ │ │ │ │ ├── TxLifiSwapCard.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TxOrderCard/ │ │ │ │ │ ├── SellOrder.tsx │ │ │ │ │ ├── TwapOrder.tsx │ │ │ │ │ ├── TxOrderCard.stories.tsx │ │ │ │ │ ├── TxOrderCard.test.tsx │ │ │ │ │ ├── TxOrderCard.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxRejectionCard/ │ │ │ │ │ ├── TxRejectionCard.stories.tsx │ │ │ │ │ ├── TxRejectionCard.test.tsx │ │ │ │ │ ├── TxRejectionCard.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxSafeAppCard/ │ │ │ │ │ ├── TxSafeAppCard.stories.tsx │ │ │ │ │ ├── TxSafeAppCard.test.tsx │ │ │ │ │ ├── TxSafeAppCard.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxSettingsCard/ │ │ │ │ │ ├── TxSettingCard.stories.tsx │ │ │ │ │ ├── TxSettingCard.test.tsx │ │ │ │ │ ├── TxSettingsCard.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── TxSettingCard.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxTokenCard/ │ │ │ │ │ ├── TxTokenCard.stories.tsx │ │ │ │ │ ├── TxTokenCard.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── VaultTxDepositCard/ │ │ │ │ │ ├── VaultTxDepositCard.test.tsx │ │ │ │ │ ├── VaultTxDepositCard.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── VaultTxDepositCard.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ └── VaultTxRedeemCard/ │ │ │ │ ├── VaultTxRedeemCard.test.tsx │ │ │ │ ├── VaultTxRedeemCard.tsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── VaultTxRedeemCard.test.tsx.snap │ │ │ │ └── index.tsx │ │ │ ├── config/ │ │ │ │ └── constants.ts │ │ │ ├── context/ │ │ │ │ └── NotificationsContext.tsx │ │ │ ├── features/ │ │ │ │ ├── AccountsSheet/ │ │ │ │ │ ├── AccountItem/ │ │ │ │ │ │ ├── AccountItem.stories.tsx │ │ │ │ │ │ ├── AccountItem.test.tsx │ │ │ │ │ │ ├── AccountItem.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ └── useEditAccountItem.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── editAccountHelpers.test.ts │ │ │ │ │ │ ├── editAccountHelpers.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── AccountsSheet.container.tsx │ │ │ │ │ ├── MyAccounts/ │ │ │ │ │ │ ├── MyAccounts.container.test.tsx │ │ │ │ │ │ ├── MyAccounts.container.tsx │ │ │ │ │ │ ├── MyAccountsFooter.test.tsx │ │ │ │ │ │ ├── MyAccountsFooter.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── useMyAccountsAnalytics.test.ts │ │ │ │ │ │ │ ├── useMyAccountsAnalytics.ts │ │ │ │ │ │ │ └── useMyAccountsSortable.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── AccountsSheet.container.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ActionDetails/ │ │ │ │ │ ├── ActionDetails.container.tsx │ │ │ │ │ ├── ActionsDetails.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils.tsx │ │ │ │ ├── AddressBook/ │ │ │ │ │ ├── Contact/ │ │ │ │ │ │ ├── ContactDetail.container.tsx │ │ │ │ │ │ ├── ContactDisplayName.container.tsx │ │ │ │ │ │ ├── ContactForm.container.tsx │ │ │ │ │ │ ├── NetworkSelector/ │ │ │ │ │ │ │ ├── AllNetworksItem.tsx │ │ │ │ │ │ │ ├── ChainItem.tsx │ │ │ │ │ │ │ ├── NetworkSelector.tsx │ │ │ │ │ │ │ ├── NetworkSelectorContent.tsx │ │ │ │ │ │ │ ├── NetworkSelectorHeader.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── NetworkSelectorHeader.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── ContactActionButton.tsx │ │ │ │ │ │ │ ├── ContactAddressField.tsx │ │ │ │ │ │ │ ├── ContactHeader.tsx │ │ │ │ │ │ │ ├── ContactName.tsx │ │ │ │ │ │ │ ├── ContactNameField.tsx │ │ │ │ │ │ │ ├── ContactNetworkRow.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ ├── ContactActionButton.test.tsx │ │ │ │ │ │ │ │ ├── ContactAddressField.test.tsx │ │ │ │ │ │ │ │ ├── ContactHeader.test.tsx │ │ │ │ │ │ │ │ ├── ContactName.test.tsx │ │ │ │ │ │ │ │ └── ContactNetworkRow.test.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── useContactNetworkData.test.ts │ │ │ │ │ │ │ ├── useContactNetworkData.ts │ │ │ │ │ │ │ ├── useDeleteContact.test.ts │ │ │ │ │ │ │ ├── useDeleteContact.ts │ │ │ │ │ │ │ ├── useEditContact.test.ts │ │ │ │ │ │ │ └── useEditContact.ts │ │ │ │ │ │ └── schemas/ │ │ │ │ │ │ ├── contactSchema.test.ts │ │ │ │ │ │ ├── contactSchema.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── List/ │ │ │ │ │ │ ├── AddressBookList.container.test.tsx │ │ │ │ │ │ ├── AddressBookList.container.tsx │ │ │ │ │ │ ├── ContactItemActions.container.tsx │ │ │ │ │ │ ├── List.container.test.tsx │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── AddressBookListView.test.tsx │ │ │ │ │ │ │ ├── AddressBookListView.tsx │ │ │ │ │ │ │ ├── List/ │ │ │ │ │ │ │ │ ├── ContactItem.tsx │ │ │ │ │ │ │ │ ├── ContactListItems.tsx │ │ │ │ │ │ │ │ ├── EmptyAddressBookDark.tsx │ │ │ │ │ │ │ │ ├── EmptyAddressBookLight.tsx │ │ │ │ │ │ │ │ ├── NoContacts.tsx │ │ │ │ │ │ │ │ ├── NoContactsFound.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ └── ListView.test.tsx │ │ │ │ │ │ └── hooks/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── useContactActions.test.ts │ │ │ │ │ │ └── useContactActions.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── AdvancedDetails/ │ │ │ │ │ ├── TxData.container.tsx │ │ │ │ │ ├── TxParameters.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── Receiver/ │ │ │ │ │ │ ├── Receiver.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── Receiver.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── formatters/ │ │ │ │ │ │ ├── arrayValue.test.tsx │ │ │ │ │ │ ├── arrayValue.tsx │ │ │ │ │ │ ├── singleValue.test.tsx │ │ │ │ │ │ └── singleValue.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── formatParameters.test.tsx │ │ │ │ │ ├── formatParameters.tsx │ │ │ │ │ ├── formatTxDetails.test.tsx │ │ │ │ │ └── formatTxDetails.tsx │ │ │ │ ├── AppUpdate/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ForceUpdateScreen.tsx │ │ │ │ │ │ └── SoftUpdatePrompt.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ └── hooks/ │ │ │ │ │ ├── appUpdateE2eState.ts │ │ │ │ │ ├── useAppUpdateCheck.e2e.ts │ │ │ │ │ └── useAppUpdateCheck.ts │ │ │ │ ├── Assets/ │ │ │ │ │ ├── Assets.container.tsx │ │ │ │ │ ├── Assets.error.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AssetsHeader/ │ │ │ │ │ │ │ ├── AssetsHeader.container.tsx │ │ │ │ │ │ │ ├── AssetsHeader.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── styles.ts │ │ │ │ │ │ ├── Balance/ │ │ │ │ │ │ │ ├── Balance.container.tsx │ │ │ │ │ │ │ ├── Balance.tsx │ │ │ │ │ │ │ ├── ChainItems.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── Fallback/ │ │ │ │ │ │ │ ├── Fallback.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ManageTokensSheet/ │ │ │ │ │ │ │ ├── ManageTokensSheet.container.tsx │ │ │ │ │ │ │ ├── ManageTokensSheet.test.tsx │ │ │ │ │ │ │ ├── ManageTokensSheet.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── NFTs/ │ │ │ │ │ │ │ ├── NFTItem.tsx │ │ │ │ │ │ │ ├── NFTs.container.test.tsx │ │ │ │ │ │ │ ├── NFTs.container.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── Navbar/ │ │ │ │ │ │ │ ├── Navbar.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── theme.ts │ │ │ │ │ │ ├── NoFunds/ │ │ │ │ │ │ │ ├── EmptyNFT.tsx │ │ │ │ │ │ │ ├── EmptyToken.tsx │ │ │ │ │ │ │ ├── NoFunds.test.tsx │ │ │ │ │ │ │ ├── NoFunds.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── Positions/ │ │ │ │ │ │ │ ├── PositionItem/ │ │ │ │ │ │ │ │ ├── PositionFiatChange.test.tsx │ │ │ │ │ │ │ │ ├── PositionFiatChange.tsx │ │ │ │ │ │ │ │ ├── PositionItem.test.tsx │ │ │ │ │ │ │ │ ├── PositionItem.tsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ ├── PositionFiatChange.test.tsx.snap │ │ │ │ │ │ │ │ │ └── PositionItem.test.tsx.snap │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── Positions.container.test.tsx │ │ │ │ │ │ │ ├── Positions.container.tsx │ │ │ │ │ │ │ ├── PositionsEmpty/ │ │ │ │ │ │ │ │ ├── PositionsEmpty.test.tsx │ │ │ │ │ │ │ │ ├── PositionsEmpty.tsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ └── PositionsEmpty.test.tsx.snap │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── PositionsError/ │ │ │ │ │ │ │ │ ├── PositionsError.test.tsx │ │ │ │ │ │ │ │ ├── PositionsError.tsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ └── PositionsError.test.tsx.snap │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── ProtocolDetailSheet/ │ │ │ │ │ │ │ │ ├── ProtocolDetailSheet.container.tsx │ │ │ │ │ │ │ │ ├── ProtocolDetailSheet.tsx │ │ │ │ │ │ │ │ ├── ProtocolDetailSheetHeader.tsx │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ ├── ProtocolSection/ │ │ │ │ │ │ │ │ ├── ProtocolSection.test.tsx │ │ │ │ │ │ │ │ ├── ProtocolSection.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ReadOnly/ │ │ │ │ │ │ │ ├── ReadOnly.container.test.tsx │ │ │ │ │ │ │ ├── ReadOnly.container.tsx │ │ │ │ │ │ │ ├── ReadOnly.tsx │ │ │ │ │ │ │ └── ReadOnlyIconBlock.tsx │ │ │ │ │ │ └── Tokens/ │ │ │ │ │ │ ├── TokenItem.tsx │ │ │ │ │ │ ├── Tokens.container.test.tsx │ │ │ │ │ │ ├── Tokens.container.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── useTokenBalances.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ └── usePositions.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.ts │ │ │ │ ├── ChangeEstimatedFeeSheet/ │ │ │ │ │ ├── ChangeEstimatedFeeSheet.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── ChangeEstimatedFeeForm/ │ │ │ │ │ │ ├── ChangeEstimatedFeeForm.tsx │ │ │ │ │ │ ├── helpers.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── schema.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── ChangeSignerSheet/ │ │ │ │ │ ├── ChangeSignerSheet.container.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useAvailableSigners.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── ConfirmTx/ │ │ │ │ │ ├── ConfirmTx.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── CanNotSign/ │ │ │ │ │ │ │ ├── CanNotSign.test.tsx │ │ │ │ │ │ │ ├── CanNotSign.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ConfirmTxForm/ │ │ │ │ │ │ │ ├── ConfirmTxForm.test.tsx │ │ │ │ │ │ │ ├── ConfirmTxForm.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ConfirmationView/ │ │ │ │ │ │ │ ├── ConfirmationView.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ ├── ConfirmationsInfo/ │ │ │ │ │ │ │ ├── ConfirmationsInfo.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ExecuteForm/ │ │ │ │ │ │ │ ├── ExecuteForm.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ListTable/ │ │ │ │ │ │ │ ├── ListTable.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── LoadingTx/ │ │ │ │ │ │ │ ├── LoadingTx.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── PendingTx/ │ │ │ │ │ │ │ ├── PendingTx.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── PendingTxInfo/ │ │ │ │ │ │ │ ├── PendingTxInfo.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ReviewAndConfirm/ │ │ │ │ │ │ │ ├── ReviewAndConfirmContainer.tsx │ │ │ │ │ │ │ ├── ReviewAndConfirmView.tsx │ │ │ │ │ │ │ ├── ReviewFooter.test.tsx │ │ │ │ │ │ │ ├── ReviewFooter.tsx │ │ │ │ │ │ │ ├── ReviewHeader.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── tabs/ │ │ │ │ │ │ │ ├── DataTab.tsx │ │ │ │ │ │ │ ├── HashesTab.tsx │ │ │ │ │ │ │ └── JSONTab.tsx │ │ │ │ │ │ ├── SignForm/ │ │ │ │ │ │ │ ├── SignForm.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SignTransaction/ │ │ │ │ │ │ │ ├── SignError.tsx │ │ │ │ │ │ │ ├── SignSuccess.tsx │ │ │ │ │ │ │ └── hooks/ │ │ │ │ │ │ │ ├── useTransactionSigning.test.ts │ │ │ │ │ │ │ └── useTransactionSigning.ts │ │ │ │ │ │ ├── TransactionChecks/ │ │ │ │ │ │ │ ├── TransactionChecks.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── TransactionChecks.test.tsx │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ ├── TransactionChecksBottomContent.tsx │ │ │ │ │ │ │ │ ├── TransactionChecksLeftNode.tsx │ │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ │ ├── TransactionChecksBottomContent.test.tsx │ │ │ │ │ │ │ │ └── TransactionChecksLeftNode.test.tsx │ │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ │ └── useTransactionSecurity.test.ts │ │ │ │ │ │ │ │ └── useTransactionSecurity.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── transactionChecksUtils.test.ts │ │ │ │ │ │ │ └── transactionChecksUtils.ts │ │ │ │ │ │ ├── TransactionHeader/ │ │ │ │ │ │ │ ├── TransactionHeader.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── TransactionInfo/ │ │ │ │ │ │ │ ├── TransactionInfo.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── confirmation-views/ │ │ │ │ │ │ ├── AddSigner/ │ │ │ │ │ │ │ ├── AddSigner.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── AlreadySigned/ │ │ │ │ │ │ │ ├── AlreadySigned.test.tsx │ │ │ │ │ │ │ ├── AlreadySigned.tsx │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ └── AlreadySigned.test.tsx.snap │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── BridgeTransaction/ │ │ │ │ │ │ │ ├── BridgeTransaction.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── CancelTx/ │ │ │ │ │ │ │ ├── CancelTx.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── Contract/ │ │ │ │ │ │ │ ├── Contract.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── GenericView/ │ │ │ │ │ │ │ ├── GenericView.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── LifiSwapTransaction/ │ │ │ │ │ │ │ ├── LifiSwapHeader.tsx │ │ │ │ │ │ │ ├── LifiSwapTransaction.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── RemoveSigner/ │ │ │ │ │ │ │ ├── RemoveSigner.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── SendNFT/ │ │ │ │ │ │ │ ├── SendNFT.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── Stake/ │ │ │ │ │ │ │ ├── Deposit/ │ │ │ │ │ │ │ │ ├── Deposit.stories.tsx │ │ │ │ │ │ │ │ ├── Deposit.test.tsx │ │ │ │ │ │ │ │ ├── Deposit.tsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ └── Deposit.test.tsx.snap │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── Exit/ │ │ │ │ │ │ │ │ ├── Exit.stories.tsx │ │ │ │ │ │ │ │ ├── Exit.test.tsx │ │ │ │ │ │ │ │ ├── Exit.tsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ └── Exit.test.tsx.snap │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── WithdrawRequest/ │ │ │ │ │ │ │ │ ├── WithdrawRequest.stories.tsx │ │ │ │ │ │ │ │ ├── WithdrawRequest.test.tsx │ │ │ │ │ │ │ │ ├── WithdrawRequest.tsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ └── WithdrawRequest.test.tsx.snap │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── utils.test.tsx │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── SwapOrder/ │ │ │ │ │ │ │ ├── StatusLabel/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── SwapOrder.tsx │ │ │ │ │ │ │ ├── SwapOrderHeader.test.tsx │ │ │ │ │ │ │ ├── SwapOrderHeader.tsx │ │ │ │ │ │ │ ├── TwapFallbackHandlerWarning.tsx │ │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── useRecipientItem.test.tsx │ │ │ │ │ │ │ │ ├── useRecipientItem.tsx │ │ │ │ │ │ │ │ └── useRecipientItems.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── TokenTransfer/ │ │ │ │ │ │ │ ├── TokenTransfer.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── VaultDeposit/ │ │ │ │ │ │ │ ├── VaultDeposit.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ └── VaultRedeem/ │ │ │ │ │ │ ├── VaultRedeem.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useOpenExplorer/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── useOpenExplorer.ts │ │ │ │ │ │ ├── useTransactionData.test.ts │ │ │ │ │ │ ├── useTransactionData.ts │ │ │ │ │ │ ├── useTransactionSigner.test.ts │ │ │ │ │ │ ├── useTransactionSigner.ts │ │ │ │ │ │ ├── useTxSignerActions.test.ts │ │ │ │ │ │ ├── useTxSignerActions.ts │ │ │ │ │ │ ├── useTxSignerAutoSelection.test.ts │ │ │ │ │ │ ├── useTxSignerAutoSelection.ts │ │ │ │ │ │ ├── useTxSignerState.test.ts │ │ │ │ │ │ └── useTxSignerState.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── ConfirmationsSheet/ │ │ │ │ │ ├── ConfirmationsSheet.container.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ConflictTxSheet/ │ │ │ │ │ ├── ConflictTxSheet.container.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── DataImport/ │ │ │ │ │ ├── DataTransfer.container.tsx │ │ │ │ │ ├── EnterPassword.container.tsx │ │ │ │ │ ├── FileSelection.container.tsx │ │ │ │ │ ├── HelpImport.container.tsx │ │ │ │ │ ├── ImportError.container.tsx │ │ │ │ │ ├── ImportProgressScreen.container.tsx │ │ │ │ │ ├── ImportSuccessScreen.container.tsx │ │ │ │ │ ├── ReviewData.container.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── EnterPassword.test.tsx │ │ │ │ │ │ ├── FileSelection.test.tsx │ │ │ │ │ │ ├── ImportProgressScreen.test.tsx │ │ │ │ │ │ ├── ReviewData.test.tsx │ │ │ │ │ │ └── useLegacyImport.test.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── DataTransferView.tsx │ │ │ │ │ │ ├── EnterPasswordView.tsx │ │ │ │ │ │ ├── FileSelectionView.tsx │ │ │ │ │ │ ├── HelpImportView.tsx │ │ │ │ │ │ ├── ImportErrorView.tsx │ │ │ │ │ │ ├── ImportProgressScreenView.tsx │ │ │ │ │ │ ├── ImportSuccessScreenView.tsx │ │ │ │ │ │ └── ReviewDataView.tsx │ │ │ │ │ ├── context/ │ │ │ │ │ │ └── DataImportProvider.tsx │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── transforms.test.ts │ │ │ │ │ │ └── transforms.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ └── useLegacyImport.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Developer/ │ │ │ │ │ ├── Developer.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── Developer.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── ExecuteTx/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── CanNotEstimate/ │ │ │ │ │ │ │ ├── CanNotEstimate.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── CanNotExecute/ │ │ │ │ │ │ │ ├── CanNotExecute.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── EstimatedNetworkFee/ │ │ │ │ │ │ │ ├── EstimatedNetworkFee.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ExecuteError.tsx │ │ │ │ │ │ ├── ExecuteSuccess.tsx │ │ │ │ │ │ ├── RelayFee/ │ │ │ │ │ │ │ ├── RelayFee.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ReviewAndExecute/ │ │ │ │ │ │ │ ├── ReviewAndExecuteContainer.tsx │ │ │ │ │ │ │ ├── ReviewExecuteFooter.tsx │ │ │ │ │ │ │ ├── ReviewExecuteFooterSkeleton.tsx │ │ │ │ │ │ │ ├── helpers.test.ts │ │ │ │ │ │ │ └── helpers.ts │ │ │ │ │ │ └── SignerFee/ │ │ │ │ │ │ ├── SignerFee.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── hooks/ │ │ │ │ │ ├── useClearEstimatedFeeOnMount.ts │ │ │ │ │ ├── useExecutionFlow.test.ts │ │ │ │ │ ├── useExecutionFlow.ts │ │ │ │ │ ├── useExecutionFunds.test.tsx │ │ │ │ │ ├── useExecutionFunds.ts │ │ │ │ │ ├── useGasFee.test.ts │ │ │ │ │ ├── useGasFee.ts │ │ │ │ │ └── useTransactionExecution.ts │ │ │ │ ├── GetStarted/ │ │ │ │ │ ├── GetStarted.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── HistoryTransactionDetails/ │ │ │ │ │ ├── HistoryTransactionDetails.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── HistoryAdvancedDetailsButton/ │ │ │ │ │ │ │ ├── HistoryAdvancedDetailsButton.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── HistoryConfirmationsInfo/ │ │ │ │ │ │ │ ├── HistoryConfirmationsInfo.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── HistoryTransactionHeader/ │ │ │ │ │ │ │ ├── HistoryTransactionHeader.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── HistoryTransactionInfo/ │ │ │ │ │ │ │ ├── HistoryTransactionInfo.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── HistoryTransactionView/ │ │ │ │ │ │ │ ├── HistoryTransactionView.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ViewOnExplorerButton/ │ │ │ │ │ │ │ ├── ViewOnExplorerButton.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── history-views/ │ │ │ │ │ │ │ ├── CancelTx.tsx │ │ │ │ │ │ │ ├── HistoryAddSigner.tsx │ │ │ │ │ │ │ ├── HistoryChangeThreshold.tsx │ │ │ │ │ │ │ ├── HistoryContract.tsx │ │ │ │ │ │ │ ├── HistoryGenericView.tsx │ │ │ │ │ │ │ ├── HistoryRemoveSigner.tsx │ │ │ │ │ │ │ ├── HistoryStakeDeposit.tsx │ │ │ │ │ │ │ ├── HistoryStakeWithdraw.tsx │ │ │ │ │ │ │ ├── HistoryStakeWithdrawRequest.tsx │ │ │ │ │ │ │ ├── HistorySwapOrder.tsx │ │ │ │ │ │ │ ├── HistorySwapSigner.tsx │ │ │ │ │ │ │ ├── HistoryTokenTransfer.tsx │ │ │ │ │ │ │ ├── HistoryTransactionBase.tsx │ │ │ │ │ │ │ ├── HistoryVaultDeposit.tsx │ │ │ │ │ │ │ ├── HistoryVaultRedeem.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── shared/ │ │ │ │ │ │ ├── NetworkDisplay.tsx │ │ │ │ │ │ ├── ThresholdChangeDisplay.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── header.test.ts │ │ │ │ │ └── header.ts │ │ │ │ ├── HowToExecuteSheet/ │ │ │ │ │ ├── HowToExecuteSheet.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── RelayAvailable/ │ │ │ │ │ │ │ ├── RelayAvailable.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── RelayUnavailable/ │ │ │ │ │ │ ├── RelayUnavailable.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── ImportReadOnly/ │ │ │ │ │ ├── AddSignersForm.container.tsx │ │ │ │ │ ├── ImportAccountForm.container.tsx │ │ │ │ │ ├── NetworkBadge.container.tsx │ │ │ │ │ ├── ScanQrAccount.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AddSignersFormView.tsx │ │ │ │ │ │ ├── AvailableNetworks.tsx │ │ │ │ │ │ ├── ImportAccountFormView.tsx │ │ │ │ │ │ ├── ScanQrAccountView.tsx │ │ │ │ │ │ └── VerificationStatus.tsx │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── safes.test.tsx │ │ │ │ │ │ └── safes.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ └── useScan/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── useScan.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── schema.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── ImportSigner/ │ │ │ │ │ ├── ImportSigner.container.tsx │ │ │ │ │ ├── ImportSigner.test.tsx │ │ │ │ │ ├── SeedPhraseAddresses.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ConnectSignerError/ │ │ │ │ │ │ │ ├── ConnectSignerError.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── ConnectSignerError.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ImportError/ │ │ │ │ │ │ │ ├── ImportError.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ImportSuccess/ │ │ │ │ │ │ │ ├── ImportSuccess.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── LoadingImport/ │ │ │ │ │ │ │ ├── LoadingImport.container.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── NameSigner/ │ │ │ │ │ │ │ ├── NameSigner.container.tsx │ │ │ │ │ │ │ ├── NameSignerView.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ ├── NameSigner.test.tsx │ │ │ │ │ │ │ │ └── buildDefaultName.test.ts │ │ │ │ │ │ │ ├── buildDefaultName.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── ReconnectError/ │ │ │ │ │ │ ├── ReconnectError.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── ReconnectError.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── useImportPrivateKey.test.ts │ │ │ │ │ │ │ ├── useImportSeedPhraseAddress.test.ts │ │ │ │ │ │ │ ├── useSeedPhraseAddresses.test.ts │ │ │ │ │ │ │ └── useSignerCollisionGuard.test.ts │ │ │ │ │ │ ├── useImportPrivateKey.ts │ │ │ │ │ │ ├── useImportSeedPhraseAddress.ts │ │ │ │ │ │ ├── useSeedPhraseAddresses.ts │ │ │ │ │ │ └── useSignerCollisionGuard.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── findCollidingSigner.test.ts │ │ │ │ │ ├── findCollidingSigner.ts │ │ │ │ │ └── showCollisionAlert.ts │ │ │ │ ├── ImportSigners/ │ │ │ │ │ ├── ImportSigners.container.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── ImportSigners.container.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Ledger/ │ │ │ │ │ ├── LedgerAddresses.container.tsx │ │ │ │ │ ├── LedgerConnect.container.tsx │ │ │ │ │ ├── LedgerIntro.container.tsx │ │ │ │ │ ├── LedgerPairing.container.tsx │ │ │ │ │ ├── LedgerSuccess.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AddressItem.tsx │ │ │ │ │ │ ├── AddressesEmptyState.tsx │ │ │ │ │ │ ├── BluetoothError.tsx │ │ │ │ │ │ ├── DeviceList.tsx │ │ │ │ │ │ ├── EmptyState.tsx │ │ │ │ │ │ ├── LedgerConnect.tsx │ │ │ │ │ │ ├── LedgerError.tsx │ │ │ │ │ │ ├── LedgerImportError.tsx │ │ │ │ │ │ ├── LedgerPairing.tsx │ │ │ │ │ │ ├── LedgerProgress.tsx │ │ │ │ │ │ ├── LedgerSignerBadge.tsx │ │ │ │ │ │ ├── LedgerSuccess.tsx │ │ │ │ │ │ ├── LoadMoreButton.tsx │ │ │ │ │ │ ├── PairingError.tsx │ │ │ │ │ │ ├── PairingProgress.tsx │ │ │ │ │ │ └── ScanningProgress.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useBluetoothStatus.test.ts │ │ │ │ │ │ ├── useBluetoothStatus.ts │ │ │ │ │ │ ├── useImportLedgerAddress.test.ts │ │ │ │ │ │ ├── useImportLedgerAddress.ts │ │ │ │ │ │ ├── useLedgerAddresses.test.ts │ │ │ │ │ │ ├── useLedgerAddresses.ts │ │ │ │ │ │ ├── useLedgerConnection.test.ts │ │ │ │ │ │ ├── useLedgerConnection.ts │ │ │ │ │ │ ├── useLedgerDeviceScanning.test.ts │ │ │ │ │ │ └── useLedgerDeviceScanning.ts │ │ │ │ │ ├── icons/ │ │ │ │ │ │ ├── BluetoothIcon.tsx │ │ │ │ │ │ ├── DashIcon.tsx │ │ │ │ │ │ ├── LedgerIcon.tsx │ │ │ │ │ │ ├── PhoneIcon.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── LedgerExecute/ │ │ │ │ │ ├── LedgerConnect.container.tsx │ │ │ │ │ ├── LedgerPairing.container.tsx │ │ │ │ │ ├── LedgerReview.container.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── LedgerSign/ │ │ │ │ │ ├── LedgerConnect.container.tsx │ │ │ │ │ ├── LedgerPairing.container.tsx │ │ │ │ │ ├── LedgerReview.container.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── NetworksSheet/ │ │ │ │ │ ├── NetworksSheet.container.tsx │ │ │ │ │ ├── NetworksSheetFooter.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── NetworksSheetFooter.test.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── useScanForNewNetworks.test.ts │ │ │ │ │ │ └── useScanForNewNetworks.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Notifications/ │ │ │ │ │ ├── NotificationsCenter.container.tsx │ │ │ │ │ ├── NotificationsSettings.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── EmptyBell.tsx │ │ │ │ │ │ ├── NotificationPermissions.tsx │ │ │ │ │ │ ├── NotificationsScreenEmpty.tsx │ │ │ │ │ │ └── NotificationsSettingsView.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Onboarding/ │ │ │ │ │ ├── Onboarding.container.test.tsx │ │ │ │ │ ├── Onboarding.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── OnboardingCarousel/ │ │ │ │ │ │ │ ├── CarouselFeedback.test.tsx │ │ │ │ │ │ │ ├── CarouselFeedback.tsx │ │ │ │ │ │ │ ├── CarouselItem.test.tsx │ │ │ │ │ │ │ ├── CarouselItem.tsx │ │ │ │ │ │ │ ├── OnboardingCarousel.native.stories.tsx │ │ │ │ │ │ │ ├── OnboardingCarousel.test.tsx │ │ │ │ │ │ │ ├── OnboardingCarousel.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── items.tsx │ │ │ │ │ │ └── OnboardingHeader/ │ │ │ │ │ │ ├── OnboardingHeader.test.tsx │ │ │ │ │ │ ├── OnboardingHeader.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── PendingTx/ │ │ │ │ │ ├── PendingTx.container.test.tsx │ │ │ │ │ ├── PendingTx.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── PendingTxList/ │ │ │ │ │ │ ├── PendingTxList.container.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── utils.tsx │ │ │ │ ├── PrivateKey/ │ │ │ │ │ ├── PrivateKey.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── PrivateKeyView.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeShield/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AnalysisDetails/ │ │ │ │ │ │ │ ├── AnalysisDetails.stories.tsx │ │ │ │ │ │ │ ├── AnalysisDetails.test.tsx │ │ │ │ │ │ │ ├── AnalysisDetails.tsx │ │ │ │ │ │ │ ├── AnalysisDetailsContent.test.tsx │ │ │ │ │ │ │ ├── AnalysisDetailsContent.tsx │ │ │ │ │ │ │ ├── AnalysisDetailsHeader.test.tsx │ │ │ │ │ │ │ ├── AnalysisDetailsHeader.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── AnalysisGroup/ │ │ │ │ │ │ │ ├── AnalysisDisplay/ │ │ │ │ │ │ │ │ ├── AnalysisDisplay.test.tsx │ │ │ │ │ │ │ │ ├── AnalysisDisplay.tsx │ │ │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ │ │ ├── AddressChanges.test.tsx │ │ │ │ │ │ │ │ │ ├── AddressChanges.tsx │ │ │ │ │ │ │ │ │ ├── AddressListItem.test.tsx │ │ │ │ │ │ │ │ │ ├── AddressListItem.tsx │ │ │ │ │ │ │ │ │ ├── AnalysisDetailsDropdown.test.tsx │ │ │ │ │ │ │ │ │ ├── AnalysisDetailsDropdown.tsx │ │ │ │ │ │ │ │ │ ├── AnalysisDisplay.stories.tsx │ │ │ │ │ │ │ │ │ ├── AnalysisIssuesDisplay.test.tsx │ │ │ │ │ │ │ │ │ ├── AnalysisIssuesDisplay.tsx │ │ │ │ │ │ │ │ │ ├── ShowAllAddress.test.tsx │ │ │ │ │ │ │ │ │ └── ShowAllAddress.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── AnalysisGroup.stories.tsx │ │ │ │ │ │ │ ├── AnalysisGroup.test.tsx │ │ │ │ │ │ │ ├── AnalysisGroup.tsx │ │ │ │ │ │ │ ├── DelegateCallItem.tsx │ │ │ │ │ │ │ ├── FallbackHandlerItem.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── AnalysisLabel/ │ │ │ │ │ │ │ ├── AnalysisLabel.stories.tsx │ │ │ │ │ │ │ ├── AnalysisLabel.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── AnalysisPaper/ │ │ │ │ │ │ │ ├── AnalysisPaper.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── BalanceChange/ │ │ │ │ │ │ │ ├── BalanceChange.stories.tsx │ │ │ │ │ │ │ ├── BalanceChangeBlock.test.tsx │ │ │ │ │ │ │ ├── BalanceChangeBlock.tsx │ │ │ │ │ │ │ ├── BalanceChangeItem.test.tsx │ │ │ │ │ │ │ ├── BalanceChangeItem.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ ├── SafeShieldDetailsSheet/ │ │ │ │ │ │ │ ├── SafeShieldDetailsSheet.container.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SafeShieldHeadline/ │ │ │ │ │ │ │ ├── SafeShieldHeadline.stories.tsx │ │ │ │ │ │ │ ├── SafeShieldHeadline.test.tsx │ │ │ │ │ │ │ ├── SafeShieldHeadline.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── theme.ts │ │ │ │ │ │ │ └── variants.ts │ │ │ │ │ │ ├── SafeShieldIcons/ │ │ │ │ │ │ │ ├── SafeShieldInfo.tsx │ │ │ │ │ │ │ ├── SafeShieldIssues.tsx │ │ │ │ │ │ │ ├── SafeShieldNeutral.tsx │ │ │ │ │ │ │ ├── SafeShieldOk.tsx │ │ │ │ │ │ │ ├── SafeShieldWarning.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SafeShieldWidget/ │ │ │ │ │ │ │ ├── SafeShieldWidget.stories.tsx │ │ │ │ │ │ │ ├── SafeShieldWidget.tsx │ │ │ │ │ │ │ ├── WidgetAction/ │ │ │ │ │ │ │ │ ├── WidgetAction.stories.tsx │ │ │ │ │ │ │ │ ├── WidgetAction.tsx │ │ │ │ │ │ │ │ ├── constants.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── WidgetDisplay/ │ │ │ │ │ │ │ │ ├── ErrorWidget/ │ │ │ │ │ │ │ │ │ ├── ErrorWidget.test.tsx │ │ │ │ │ │ │ │ │ ├── ErrorWidget.tsx │ │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ │ ├── LoadingWidget/ │ │ │ │ │ │ │ │ │ ├── LoadingWidget.tsx │ │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ │ ├── WidgetDisplay.stories.tsx │ │ │ │ │ │ │ │ ├── WidgetDisplay.tsx │ │ │ │ │ │ │ │ ├── WidgetDisplayWrapper.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── theme.ts │ │ │ │ │ │ └── TransactionSimulation/ │ │ │ │ │ │ ├── TransactionSimulation.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ └── useTransactionSimulation.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── useAnalysisAddress.ts │ │ │ │ │ │ ├── useCounterpartyAnalysis.ts │ │ │ │ │ │ ├── useSafeShieldSeverity.ts │ │ │ │ │ │ └── useThreatAnalysis.ts │ │ │ │ │ └── theme.ts │ │ │ │ ├── Send/ │ │ │ │ │ ├── EnterAmount.container.tsx │ │ │ │ │ ├── ScanQrSend.container.tsx │ │ │ │ │ ├── SelectRecipient.container.tsx │ │ │ │ │ ├── SelectToken.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AddToAddressBookModal.tsx │ │ │ │ │ │ ├── AmountDisplay.tsx │ │ │ │ │ │ ├── CustomNonceModal.tsx │ │ │ │ │ │ ├── DialogModal.tsx │ │ │ │ │ │ ├── FooterAction.tsx │ │ │ │ │ │ ├── KnownOtherChainWarning.tsx │ │ │ │ │ │ ├── NonceBottomSheet.tsx │ │ │ │ │ │ ├── ProposerBottomSheet.tsx │ │ │ │ │ │ ├── RecipientDisplay.tsx │ │ │ │ │ │ ├── RecipientHeader.tsx │ │ │ │ │ │ ├── RecipientInput.tsx │ │ │ │ │ │ ├── RecipientSections.tsx │ │ │ │ │ │ ├── RecipientValidationBadge.tsx │ │ │ │ │ │ ├── SelectProposer.tsx │ │ │ │ │ │ ├── SuspiciousAddressComparison.tsx │ │ │ │ │ │ ├── TokenListItem.tsx │ │ │ │ │ │ └── TokenPill.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useAmountInput.test.ts │ │ │ │ │ │ ├── useAmountInput.ts │ │ │ │ │ │ ├── useEnsureActiveSigner.test.ts │ │ │ │ │ │ ├── useEnsureActiveSigner.ts │ │ │ │ │ │ ├── useFiatConversion.test.tsx │ │ │ │ │ │ ├── useFiatConversion.ts │ │ │ │ │ │ ├── useKeyboardVisible.ts │ │ │ │ │ │ ├── useMaxAmount.test.ts │ │ │ │ │ │ ├── useMaxAmount.ts │ │ │ │ │ │ ├── useNonce.test.ts │ │ │ │ │ │ ├── useNonce.ts │ │ │ │ │ │ ├── useNonceSelection.ts │ │ │ │ │ │ ├── useProposerSheet.ts │ │ │ │ │ │ ├── useRecipientSearch.ts │ │ │ │ │ │ ├── useRecipientValidation.test.ts │ │ │ │ │ │ ├── useRecipientValidation.ts │ │ │ │ │ │ ├── useSendTransaction.ts │ │ │ │ │ │ ├── useSuspiciousAddressDetection.ts │ │ │ │ │ │ └── useTokenBalance.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── services/ │ │ │ │ │ │ ├── proposeSendTransaction.test.ts │ │ │ │ │ │ ├── proposeSendTransaction.ts │ │ │ │ │ │ ├── tokenTransferParams.test.ts │ │ │ │ │ │ └── tokenTransferParams.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── Settings/ │ │ │ │ │ ├── Settings.container.tsx │ │ │ │ │ ├── Settings.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── Settings.test.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AppSettings/ │ │ │ │ │ │ │ ├── AppSettings.container.tsx │ │ │ │ │ │ │ ├── AppSettings.tsx │ │ │ │ │ │ │ ├── AppSettings.types.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── Currency/ │ │ │ │ │ │ │ ├── Currency.container.tsx │ │ │ │ │ │ │ ├── Currency.types.ts │ │ │ │ │ │ │ ├── CurrencyItem/ │ │ │ │ │ │ │ │ ├── CurrencyItem.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── CurrencySection/ │ │ │ │ │ │ │ │ ├── CurrencySection.tsx │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── CurrencyView.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── FloatingMenu.tsx │ │ │ │ │ │ └── Navbar/ │ │ │ │ │ │ ├── Navbar.tsx │ │ │ │ │ │ ├── SettingsButton.tsx │ │ │ │ │ │ ├── SettingsMenu.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Share/ │ │ │ │ │ ├── Share.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ShareView.test.tsx │ │ │ │ │ │ ├── ShareView.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── Signer/ │ │ │ │ │ ├── Signer.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── SignerHeader.tsx │ │ │ │ │ │ ├── SignerView.test.tsx │ │ │ │ │ │ └── SignerView.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── schema.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── Signers/ │ │ │ │ │ ├── Signers.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── SignersList/ │ │ │ │ │ │ ├── ImportedBadge.tsx │ │ │ │ │ │ ├── SignersList.tsx │ │ │ │ │ │ ├── SignersListHeader.tsx │ │ │ │ │ │ ├── SignersListItem.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ └── useSignersActions.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useSignersGroupService.test.ts │ │ │ │ │ │ └── useSignersGroupService.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── TransactionActions/ │ │ │ │ │ ├── TransactionActions.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── TxActionsList.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TransactionChecks/ │ │ │ │ │ ├── TransactionChecks.container.tsx │ │ │ │ │ ├── blockaid/ │ │ │ │ │ │ └── useBlockaid.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── TransactionChecksView.tsx │ │ │ │ │ │ └── blockaid/ │ │ │ │ │ │ ├── PoweredByBlockaid.tsx │ │ │ │ │ │ ├── ResultDescription.tsx │ │ │ │ │ │ ├── balance/ │ │ │ │ │ │ │ ├── BalanceChange.tsx │ │ │ │ │ │ │ ├── BlockaidBalanceChanges.tsx │ │ │ │ │ │ │ ├── FungibleBalanceChange.tsx │ │ │ │ │ │ │ └── NFTBalanceChange.tsx │ │ │ │ │ │ └── scans/ │ │ │ │ │ │ ├── BlockaidError.tsx │ │ │ │ │ │ ├── BlockaidHint.tsx │ │ │ │ │ │ ├── BlockaidMessage.tsx │ │ │ │ │ │ ├── BlockaidWarning.tsx │ │ │ │ │ │ └── ContractChangeWarning.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── tenderly/ │ │ │ │ │ ├── useSimulation.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── TxHistory/ │ │ │ │ │ ├── TxHistory.container.test.tsx │ │ │ │ │ ├── TxHistory.container.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── TransactionHeader/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── TxHistoryList/ │ │ │ │ │ │ ├── TxHistoryList.test.tsx │ │ │ │ │ │ ├── TxHistoryList.tsx │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── DateHeaderItem.tsx │ │ │ │ │ │ │ ├── ErrorComponent.tsx │ │ │ │ │ │ │ ├── GroupedTransactionItem.tsx │ │ │ │ │ │ │ ├── LoadingComponents.tsx │ │ │ │ │ │ │ └── TransactionListItem.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── utils.tsx │ │ │ │ └── WalletConnect/ │ │ │ │ ├── appKit.ts │ │ │ │ ├── components/ │ │ │ │ │ ├── AppKitInitializer/ │ │ │ │ │ │ ├── AppKitInitializer.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── AppKitInitializer.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── WalletConnectBadge/ │ │ │ │ │ │ ├── WalletConnectBadge.test.tsx │ │ │ │ │ │ ├── WalletConnectBadge.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── WalletConnectGate/ │ │ │ │ │ ├── WalletConnectGate.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── WalletConnectGate.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── context/ │ │ │ │ │ ├── WalletConnectContext.e2e.tsx │ │ │ │ │ ├── WalletConnectContext.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── WalletConnectContext.test.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ └── walletConnectE2eState.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useChainSync.test.ts │ │ │ │ │ │ ├── useConnect.test.ts │ │ │ │ │ │ ├── useImportSignerFlow.test.ts │ │ │ │ │ │ ├── useReconnectFlow.test.ts │ │ │ │ │ │ ├── useStableAppKitEvent.test.ts │ │ │ │ │ │ ├── useSwitchNetwork.test.ts │ │ │ │ │ │ ├── useWalletConnectSigning.test.ts │ │ │ │ │ │ └── useWalletConnectStatus.test.ts │ │ │ │ │ ├── useChainSync.ts │ │ │ │ │ ├── useConnect.ts │ │ │ │ │ ├── useImportSignerFlow.ts │ │ │ │ │ ├── useReconnectFlow.ts │ │ │ │ │ ├── useStableAppKitEvent.ts │ │ │ │ │ ├── useSwitchNetwork.ts │ │ │ │ │ ├── useWalletConnectSigning.ts │ │ │ │ │ └── useWalletConnectStatus.ts │ │ │ │ └── utils/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── chains.test.ts │ │ │ │ └── chains.ts │ │ │ ├── hooks/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── useAddressOwnershipValidation.test.ts │ │ │ │ │ ├── useDatadogConsent.test.ts │ │ │ │ │ ├── useDisplayName.test.ts │ │ │ │ │ ├── useNotificationHandler.test.ts │ │ │ │ │ ├── useScreenProtection.test.ts │ │ │ │ │ └── useShareTransaction.test.ts │ │ │ │ ├── coreSDK/ │ │ │ │ │ ├── safeCoreSDK.test.ts │ │ │ │ │ ├── safeCoreSDK.ts │ │ │ │ │ ├── useInitSafeCoreSDK.test.ts │ │ │ │ │ └── useInitSafeCoreSDK.ts │ │ │ │ ├── services/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useLazySafeOverviews.test.ts │ │ │ │ │ │ └── useSafeKnownChainsOverview.test.ts │ │ │ │ │ ├── overviewQueryArgs.ts │ │ │ │ │ ├── useLazySafeOverviews.ts │ │ │ │ │ ├── useSafeKnownChainsOverview.ts │ │ │ │ │ └── useSafeOverviewsQuery.ts │ │ │ │ ├── useAddressOwnershipValidation.ts │ │ │ │ ├── useAddresses.ts │ │ │ │ ├── useAnalytics.ts │ │ │ │ ├── useBalances.ts │ │ │ │ ├── useBiometrics.test.ts │ │ │ │ ├── useBiometrics.ts │ │ │ │ ├── useCopyAndDispatchToast/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useCopyAndDisptachToast.test.tsx │ │ │ │ ├── useCurrencies.ts │ │ │ │ ├── useDatadogConsent.ts │ │ │ │ ├── useDelegate.test.ts │ │ │ │ ├── useDelegate.ts │ │ │ │ ├── useDelegateCleanup/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── useDelegateCleanup.ts │ │ │ │ ├── useDisplayName.ts │ │ │ │ ├── useFeeParams/ │ │ │ │ │ ├── useFeeParams.test.ts │ │ │ │ │ └── useFeeParams.ts │ │ │ │ ├── useHasFeature.ts │ │ │ │ ├── useHasSigner.ts │ │ │ │ ├── useHeaderHeight.ts │ │ │ │ ├── useInitWeb3.ts │ │ │ │ ├── useIsMounted.ts │ │ │ │ ├── useIsNextTx.ts │ │ │ │ ├── useMakeSafesWithChainId/ │ │ │ │ │ ├── useMakeSafesWithChainId.test.ts │ │ │ │ │ └── useMakeSafesWithChainId.ts │ │ │ │ ├── useNotificationCleanup.ts │ │ │ │ ├── useNotificationGTWPermissions.test.ts │ │ │ │ ├── useNotificationGTWPermissions.ts │ │ │ │ ├── useNotificationHandler.ts │ │ │ │ ├── useNotificationManager.test.ts │ │ │ │ ├── useNotificationManager.ts │ │ │ │ ├── useNotificationPayload.test.ts │ │ │ │ ├── useNotificationPayload.ts │ │ │ │ ├── usePendingTxs/ │ │ │ │ │ └── index.ts │ │ │ │ ├── usePendingTxsMonitor.ts │ │ │ │ ├── usePreventLeaveScreen/ │ │ │ │ │ └── index.ts │ │ │ │ ├── useRegisterForNotifications.ts │ │ │ │ ├── useSafeCreationData.ts │ │ │ │ ├── useSafeInfo.ts │ │ │ │ ├── useSafeTx.test.ts │ │ │ │ ├── useSafeTx.ts │ │ │ │ ├── useScreenProtection.e2e.ts │ │ │ │ ├── useScreenProtection.ts │ │ │ │ ├── useScreenTracking.ts │ │ │ │ ├── useShareTransaction.ts │ │ │ │ ├── useSign/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useSign.test.ts │ │ │ │ │ └── useSign.ts │ │ │ │ ├── useSiwe.ts │ │ │ │ ├── useTokenDetails/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useTokenDetails.ts │ │ │ │ ├── useTotalBalances.ts │ │ │ │ ├── useTransactionProcessingState.test.tsx │ │ │ │ ├── useTransactionProcessingState.ts │ │ │ │ ├── useTransactionSigningState.ts │ │ │ │ ├── useTransactionType/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── useTransactionType.test.tsx │ │ │ │ └── wallets/ │ │ │ │ ├── web3.test.ts │ │ │ │ └── web3.ts │ │ │ ├── navigation/ │ │ │ │ ├── NavigationGuardHOC.tsx │ │ │ │ ├── dismissToConfirmTransaction.ts │ │ │ │ ├── hooks/ │ │ │ │ │ └── utils.tsx │ │ │ │ └── useScrollableHeader.tsx │ │ │ ├── platform/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── fetch.test.ts │ │ │ │ ├── crypto-shims.ts │ │ │ │ ├── fetch.ts │ │ │ │ ├── intl-polyfills.ts │ │ │ │ └── security.ts │ │ │ ├── providers/ │ │ │ │ └── DatadogWrapper.tsx │ │ │ ├── react-app-env.d.ts │ │ │ ├── services/ │ │ │ │ ├── analytics/ │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── datadogAnalytics.ts │ │ │ │ │ ├── events/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── copy.test.ts │ │ │ │ │ │ │ └── overview.test.ts │ │ │ │ │ │ ├── addressBook.ts │ │ │ │ │ │ ├── copy.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── nativeIntent.ts │ │ │ │ │ │ ├── overview.ts │ │ │ │ │ │ ├── safes.ts │ │ │ │ │ │ ├── settings.ts │ │ │ │ │ │ ├── signers.ts │ │ │ │ │ │ └── transactions.ts │ │ │ │ │ ├── firebaseAnalytics.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── bluetooth/ │ │ │ │ │ └── bluetooth.service.ts │ │ │ │ ├── contracts/ │ │ │ │ │ └── safeContracts.ts │ │ │ │ ├── delegate-cleanup/ │ │ │ │ │ ├── DelegateCleanupService.test.ts │ │ │ │ │ ├── DelegateCleanupService.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── key-storage/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── key-storage.service.test.ts │ │ │ │ │ ├── key-storage.service.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── wallet.service.ts │ │ │ │ ├── ledger/ │ │ │ │ │ ├── ledger-dmk.service.test.ts │ │ │ │ │ ├── ledger-dmk.service.ts │ │ │ │ │ ├── ledger-ethereum.service.test.ts │ │ │ │ │ ├── ledger-ethereum.service.ts │ │ │ │ │ ├── ledger-execution.service.test.ts │ │ │ │ │ ├── ledger-execution.service.ts │ │ │ │ │ ├── ledger-safe-signing.service.test.ts │ │ │ │ │ └── ledger-safe-signing.service.ts │ │ │ │ ├── notifications/ │ │ │ │ │ ├── BadgeManager.ts │ │ │ │ │ ├── FCMService.ts │ │ │ │ │ ├── NotificationService.test.ts │ │ │ │ │ ├── NotificationService.ts │ │ │ │ │ ├── SubscriptionManager.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── backend.test.ts │ │ │ │ │ │ └── notificationNavigationHandler.test.ts │ │ │ │ │ ├── backend.ts │ │ │ │ │ ├── backgroundHandlers.ts │ │ │ │ │ ├── notificationNavigationHandler.ts │ │ │ │ │ ├── notificationParser.test.ts │ │ │ │ │ ├── notificationParser.ts │ │ │ │ │ ├── operations.ts │ │ │ │ │ ├── registration.ts │ │ │ │ │ ├── store-sync/ │ │ │ │ │ │ ├── const.ts │ │ │ │ │ │ ├── read.ts │ │ │ │ │ │ └── sync.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── messageDeduplication.test.ts │ │ │ │ │ └── messageDeduplication.ts │ │ │ │ ├── remoteConfig/ │ │ │ │ │ ├── remoteConfigService.e2e.ts │ │ │ │ │ └── remoteConfigService.ts │ │ │ │ ├── tx/ │ │ │ │ │ ├── extractTx.test.ts │ │ │ │ │ ├── extractTx.ts │ │ │ │ │ ├── fetchTransactionDetails.ts │ │ │ │ │ ├── proposeNewTransaction.ts │ │ │ │ │ └── tx-sender/ │ │ │ │ │ ├── create.test.ts │ │ │ │ │ ├── create.ts │ │ │ │ │ ├── execute.test.ts │ │ │ │ │ ├── execute.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── sign.test.ts │ │ │ │ │ └── sign.ts │ │ │ │ ├── tx-execution/ │ │ │ │ │ ├── ledgerExecutor.test.ts │ │ │ │ │ ├── ledgerExecutor.ts │ │ │ │ │ ├── privateKeyExecutor.test.ts │ │ │ │ │ ├── privateKeyExecutor.ts │ │ │ │ │ ├── relayExecutor.test.ts │ │ │ │ │ ├── relayExecutor.ts │ │ │ │ │ ├── walletConnectExecutor.test.ts │ │ │ │ │ └── walletConnectExecutor.ts │ │ │ │ ├── walletconnect/ │ │ │ │ │ ├── walletconnect-signing.service.test.ts │ │ │ │ │ └── walletconnect-signing.service.ts │ │ │ │ └── web3/ │ │ │ │ └── index.ts │ │ │ ├── store/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── activeSafeSlice.test.ts │ │ │ │ │ ├── addressBookSlice.selector.test.ts │ │ │ │ │ ├── addressBookSlice.test.ts │ │ │ │ │ ├── migrations.test.ts │ │ │ │ │ ├── persistConfig.test.ts │ │ │ │ │ ├── persistMigrations.test.ts │ │ │ │ │ ├── safesSlice.test.ts │ │ │ │ │ ├── sanitizePendingQueriesTransform.test.ts │ │ │ │ │ ├── settingsSlice.test.ts │ │ │ │ │ └── signersSlice.test.ts │ │ │ │ ├── activeSafeSlice.ts │ │ │ │ ├── activeSignerSlice.ts │ │ │ │ ├── addressBookSlice.ts │ │ │ │ ├── biometricsSlice.ts │ │ │ │ ├── chains/ │ │ │ │ │ └── index.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── delegatesSlice.ts │ │ │ │ ├── estimatedFeeSlice.ts │ │ │ │ ├── executingStateSlice.test.ts │ │ │ │ ├── executingStateSlice.ts │ │ │ │ ├── executionMethodSlice.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── activeSafe.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── storeHooks.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── middleware/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── notificationSync.test.ts │ │ │ │ │ │ └── pendingTxs.test.ts │ │ │ │ │ ├── analytics/ │ │ │ │ │ │ ├── AnalyticsStrategyManager.ts │ │ │ │ │ │ └── strategies/ │ │ │ │ │ │ ├── AddressBookTrackingStrategy.ts │ │ │ │ │ │ ├── SafeManagementStrategy.ts │ │ │ │ │ │ ├── SafeViewedStrategy.ts │ │ │ │ │ │ ├── SettingsStrategy.ts │ │ │ │ │ │ ├── SignerTrackingStrategy.ts │ │ │ │ │ │ ├── TransactionConfirmationStrategy.ts │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── AddressBookTrackingStrategy.test.ts │ │ │ │ │ │ │ ├── SafeManagementStrategy.test.ts │ │ │ │ │ │ │ ├── SafeViewedStrategy.test.ts │ │ │ │ │ │ │ ├── SettingsStrategy.test.ts │ │ │ │ │ │ │ ├── SignerTrackingStrategy.test.ts │ │ │ │ │ │ │ └── TransactionConfirmationStrategy.test.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── analytics.ts │ │ │ │ │ ├── notificationSync.ts │ │ │ │ │ ├── notifications/ │ │ │ │ │ │ ├── NotificationStrategyManager.ts │ │ │ │ │ │ └── strategies/ │ │ │ │ │ │ ├── AddDelegateStrategy.ts │ │ │ │ │ │ ├── AddSafeStrategy.ts │ │ │ │ │ │ ├── RemoveSafeStrategy.ts │ │ │ │ │ │ ├── ToggleAppNotificationsStrategy.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── notifications.ts │ │ │ │ │ └── pendingTxs.ts │ │ │ │ ├── migrations.ts │ │ │ │ ├── myAccountsSlice.ts │ │ │ │ ├── notificationsSlice.ts │ │ │ │ ├── pendingTxsSlice.ts │ │ │ │ ├── resetE2EState.test.ts │ │ │ │ ├── resetE2EState.ts │ │ │ │ ├── safeSubscriptionsSlice.ts │ │ │ │ ├── safesSettingsSlice.test.ts │ │ │ │ ├── safesSettingsSlice.ts │ │ │ │ ├── safesSlice.ts │ │ │ │ ├── settingsSlice.test.ts │ │ │ │ ├── settingsSlice.ts │ │ │ │ ├── signerImportFlowSlice.ts │ │ │ │ ├── signerThunks.ts │ │ │ │ ├── signersBalance.ts │ │ │ │ ├── signersSlice.ts │ │ │ │ ├── signingStateSlice.test.ts │ │ │ │ ├── signingStateSlice.ts │ │ │ │ ├── storage.ts │ │ │ │ ├── txHistorySlice.ts │ │ │ │ └── utils/ │ │ │ │ ├── cookieHandling.test.ts │ │ │ │ ├── cookieHandling.ts │ │ │ │ ├── singletonStore.ts │ │ │ │ └── strategy/ │ │ │ │ ├── Strategy.ts │ │ │ │ └── StrategyManager.ts │ │ │ ├── tests/ │ │ │ │ ├── e2e-maestro/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── TestCtrls.e2e.tsx │ │ │ │ │ │ └── TestCtrls.tsx │ │ │ │ │ └── setup/ │ │ │ │ │ ├── assetsSetup.ts │ │ │ │ │ ├── connectSignerSetup.ts │ │ │ │ │ ├── historySetup.ts │ │ │ │ │ ├── mockData.ts │ │ │ │ │ ├── onboardingSetup.ts │ │ │ │ │ ├── pendingTxSetup.ts │ │ │ │ │ ├── positionsSetup.ts │ │ │ │ │ └── setupHelpers.ts │ │ │ │ ├── factories/ │ │ │ │ │ └── transaction.ts │ │ │ │ ├── jest.setup.tsx │ │ │ │ ├── mocks.ts │ │ │ │ ├── server.ts │ │ │ │ └── test-utils.tsx │ │ │ ├── theme/ │ │ │ │ ├── SafeStatusBar.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ └── SafeStatusBar.test.tsx │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useTheme.test.tsx │ │ │ │ │ ├── useSafeAreaPaddingBottom.tsx │ │ │ │ │ └── useTheme.tsx │ │ │ │ ├── navigation.ts │ │ │ │ ├── provider/ │ │ │ │ │ ├── DataFetchProvider.tsx │ │ │ │ │ ├── font.tsx │ │ │ │ │ ├── safeTheme.tsx │ │ │ │ │ ├── storybookTheme.tsx │ │ │ │ │ └── toastProvider.tsx │ │ │ │ ├── tamagui.config.ts │ │ │ │ └── tokens.ts │ │ │ ├── types/ │ │ │ │ ├── address.ts │ │ │ │ ├── iconTypes.ts │ │ │ │ ├── notifee.d.ts │ │ │ │ ├── react-native-device-info.d.ts │ │ │ │ ├── theme.ts │ │ │ │ └── txType.ts │ │ │ └── utils/ │ │ │ ├── balance.test.ts │ │ │ ├── balance.ts │ │ │ ├── chains.test.ts │ │ │ ├── chains.ts │ │ │ ├── currency.test.ts │ │ │ ├── currency.ts │ │ │ ├── date.test.ts │ │ │ ├── date.ts │ │ │ ├── delegate.ts │ │ │ ├── errors/ │ │ │ │ ├── index.ts │ │ │ │ └── standardErrors.ts │ │ │ ├── feeParams.test.ts │ │ │ ├── feeParams.ts │ │ │ ├── formatters.test.ts │ │ │ ├── formatters.ts │ │ │ ├── inputDetection.test.ts │ │ │ ├── inputDetection.ts │ │ │ ├── legacyData.test.ts │ │ │ ├── legacyData.ts │ │ │ ├── logger.ts │ │ │ ├── notifications/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── cleanup.test.ts │ │ │ │ ├── accountType.test.ts │ │ │ │ ├── accountType.ts │ │ │ │ ├── cleanup.ts │ │ │ │ └── index.ts │ │ │ ├── retry.ts │ │ │ ├── signer.test.ts │ │ │ ├── signer.ts │ │ │ ├── swapOrderUtils.test.tsx │ │ │ ├── swapOrderUtils.tsx │ │ │ ├── transaction-guards.test.ts │ │ │ ├── transaction-guards.ts │ │ │ ├── transactions.test.tsx │ │ │ ├── transactions.tsx │ │ │ ├── url.test.ts │ │ │ ├── url.ts │ │ │ ├── uuid.test.ts │ │ │ └── uuid.ts │ │ └── tsconfig.json │ ├── tx-builder/ │ │ ├── README.md │ │ ├── docs/ │ │ │ └── release-procedure.md │ │ ├── eslint.config.mjs │ │ ├── index.html │ │ ├── jest.config.cjs │ │ ├── package.json │ │ ├── public/ │ │ │ └── manifest.json │ │ ├── src/ │ │ │ ├── App.tsx │ │ │ ├── __mocks__/ │ │ │ │ └── fileMock.js │ │ │ ├── components/ │ │ │ │ ├── Accordion/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Button.tsx │ │ │ │ ├── Card/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ChecksumWarning.tsx │ │ │ │ ├── CreateNewBatchCard.tsx │ │ │ │ ├── Divider.tsx │ │ │ │ ├── Dot/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ETHHashInfo.tsx │ │ │ │ ├── EditableLabel.tsx │ │ │ │ ├── EllipsisMenu/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ErrorAlert.tsx │ │ │ │ ├── FixedIcon/ │ │ │ │ │ ├── images/ │ │ │ │ │ │ ├── arrowReceived.tsx │ │ │ │ │ │ ├── arrowReceivedWhite.tsx │ │ │ │ │ │ ├── arrowSent.tsx │ │ │ │ │ │ ├── arrowSentWhite.tsx │ │ │ │ │ │ ├── arrowSort.tsx │ │ │ │ │ │ ├── bullit.tsx │ │ │ │ │ │ ├── chevronDown.tsx │ │ │ │ │ │ ├── chevronLeft.tsx │ │ │ │ │ │ ├── chevronRight.tsx │ │ │ │ │ │ ├── chevronUp.tsx │ │ │ │ │ │ ├── connectedRinkeby.tsx │ │ │ │ │ │ ├── connectedWallet.tsx │ │ │ │ │ │ ├── creatingInProgress.tsx │ │ │ │ │ │ ├── dropdownArrowSmall.tsx │ │ │ │ │ │ ├── networkError.tsx │ │ │ │ │ │ ├── notConnected.tsx │ │ │ │ │ │ ├── notOwner.tsx │ │ │ │ │ │ ├── options.tsx │ │ │ │ │ │ ├── plus.tsx │ │ │ │ │ │ ├── settingsChange.tsx │ │ │ │ │ │ └── threeDots.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── GenericModal.tsx │ │ │ │ ├── Header.test.tsx │ │ │ │ ├── Header.tsx │ │ │ │ ├── Icon/ │ │ │ │ │ ├── images/ │ │ │ │ │ │ ├── alert.tsx │ │ │ │ │ │ ├── bookmark.tsx │ │ │ │ │ │ ├── bookmarkFilled.tsx │ │ │ │ │ │ ├── check.tsx │ │ │ │ │ │ ├── code.tsx │ │ │ │ │ │ ├── copy.tsx │ │ │ │ │ │ ├── cross.tsx │ │ │ │ │ │ ├── delete.tsx │ │ │ │ │ │ ├── edit.tsx │ │ │ │ │ │ ├── externalLink.tsx │ │ │ │ │ │ ├── import.tsx │ │ │ │ │ │ ├── info.tsx │ │ │ │ │ │ └── termsOfUse.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── IconText/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Link/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Loader/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── QuickTip.tsx │ │ │ │ ├── ShowMoreText.tsx │ │ │ │ ├── Switch.tsx │ │ │ │ ├── Text.tsx │ │ │ │ ├── Title.tsx │ │ │ │ ├── Tooltip.tsx │ │ │ │ ├── TransactionBatchListItem.tsx │ │ │ │ ├── TransactionDetails.tsx │ │ │ │ ├── TransactionsBatchList.tsx │ │ │ │ ├── VirtualizedList.tsx │ │ │ │ ├── Wrapper/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── buttons/ │ │ │ │ │ ├── ButtonLink/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CopyToClipboardBtn/ │ │ │ │ │ │ ├── copyTextToClipboard.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ExplorerButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── Identicon/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── forms/ │ │ │ │ │ ├── AddNewTransactionForm.tsx │ │ │ │ │ ├── SolidityForm.test.tsx │ │ │ │ │ ├── SolidityForm.tsx │ │ │ │ │ ├── fields/ │ │ │ │ │ │ ├── AddressContractField.tsx │ │ │ │ │ │ ├── AddressInput.tsx │ │ │ │ │ │ ├── Field.tsx │ │ │ │ │ │ ├── JsonField.tsx │ │ │ │ │ │ ├── SelectContractField.tsx │ │ │ │ │ │ ├── TextContractField.tsx │ │ │ │ │ │ ├── TextFieldInput.tsx │ │ │ │ │ │ ├── TextareaContractField.tsx │ │ │ │ │ │ ├── fields.test.ts │ │ │ │ │ │ ├── fields.ts │ │ │ │ │ │ └── styles.ts │ │ │ │ │ └── validations/ │ │ │ │ │ ├── basicSolidityValidation.ts │ │ │ │ │ ├── validateAddressField.ts │ │ │ │ │ ├── validateAmountField.ts │ │ │ │ │ ├── validateBooleanField.ts │ │ │ │ │ ├── validateField.ts │ │ │ │ │ ├── validateHexEncodedDataField.ts │ │ │ │ │ └── validations.test.ts │ │ │ │ └── modals/ │ │ │ │ ├── DeleteBatchFromLibrary.tsx │ │ │ │ ├── DeleteBatchModal.tsx │ │ │ │ ├── DeleteTransactionModal.tsx │ │ │ │ ├── EditTransactionModal.tsx │ │ │ │ ├── ImplementationABIDialog.tsx │ │ │ │ ├── SaveBatchModal.tsx │ │ │ │ ├── SuccessBatchCreationModal.tsx │ │ │ │ └── WrongChainBatchModal.tsx │ │ │ ├── global.ts │ │ │ ├── hooks/ │ │ │ │ ├── useAbi.ts │ │ │ │ ├── useAsync.ts │ │ │ │ ├── useDebounce.ts │ │ │ │ ├── useDropZone/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── useElementHeight/ │ │ │ │ │ └── useElementHeight.tsx │ │ │ │ ├── useModal/ │ │ │ │ │ └── useModal.tsx │ │ │ │ ├── useSimulation.ts │ │ │ │ └── useThrottle.ts │ │ │ ├── lib/ │ │ │ │ ├── analytics.ts │ │ │ │ ├── batches/ │ │ │ │ │ └── index.ts │ │ │ │ ├── checksum.test.ts │ │ │ │ ├── checksum.ts │ │ │ │ ├── getAbi.test.ts │ │ │ │ ├── getAbi.ts │ │ │ │ ├── interfaceRepository.ts │ │ │ │ ├── local-storage/ │ │ │ │ │ ├── Storage.ts │ │ │ │ │ └── local.ts │ │ │ │ ├── simulation/ │ │ │ │ │ ├── multisend.ts │ │ │ │ │ ├── simulation.ts │ │ │ │ │ └── types.ts │ │ │ │ └── storage.ts │ │ │ ├── main.tsx │ │ │ ├── mocks/ │ │ │ │ └── handlers.ts │ │ │ ├── pages/ │ │ │ │ ├── CreateTransactions.tsx │ │ │ │ ├── Dashboard.tsx │ │ │ │ ├── EditTransactionLibrary.tsx │ │ │ │ ├── ReviewAndConfirm.tsx │ │ │ │ ├── SaveTransactionLibrary.tsx │ │ │ │ └── TransactionLibrary.tsx │ │ │ ├── routes/ │ │ │ │ └── routes.ts │ │ │ ├── setupTests.ts │ │ │ ├── store/ │ │ │ │ ├── index.tsx │ │ │ │ ├── networkContext.tsx │ │ │ │ ├── transactionLibraryContext.tsx │ │ │ │ └── transactionsContext.tsx │ │ │ ├── test-utils.tsx │ │ │ ├── theme/ │ │ │ │ ├── SafeThemeProvider.tsx │ │ │ │ ├── darkPalette.ts │ │ │ │ ├── lightPalette.ts │ │ │ │ ├── safeTheme.ts │ │ │ │ └── typography.ts │ │ │ ├── typings/ │ │ │ │ ├── custom.d.ts │ │ │ │ ├── errors.ts │ │ │ │ ├── fonts.d.ts │ │ │ │ └── models.ts │ │ │ ├── utils/ │ │ │ │ ├── __mocks__/ │ │ │ │ │ └── env.ts │ │ │ │ ├── address.ts │ │ │ │ ├── env.ts │ │ │ │ └── strings.ts │ │ │ ├── utils.test.ts │ │ │ ├── utils.ts │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ └── web/ │ ├── .dockerignore │ ├── .gitignore │ ├── .storybook/ │ │ ├── AGENTS.md │ │ ├── COVERAGE.md │ │ ├── decorators/ │ │ │ ├── LayoutDecorator.tsx │ │ │ ├── MockProviderDecorator.tsx │ │ │ └── index.ts │ │ ├── main.ts │ │ ├── mocks/ │ │ │ ├── nextImage.js │ │ │ ├── querystring.ts │ │ │ ├── svgMock.tsx │ │ │ └── useIsOfficialHost.ts │ │ ├── preview-head.html │ │ ├── preview.tsx │ │ ├── shadcn-stories.css │ │ ├── shadcn.ts │ │ └── test-runner.mjs │ ├── .storybook-vite/ │ │ ├── main.ts │ │ ├── preview-head.html │ │ └── preview.tsx │ ├── AGENTS.md │ ├── Dockerfile │ ├── LICENSE │ ├── README.md │ ├── chromatic.config.json │ ├── components.json │ ├── cypress/ │ │ ├── AGENTS.md │ │ ├── CLAUDE.md │ │ ├── COVERAGE.md │ │ ├── ci.json │ │ ├── e2e/ │ │ │ ├── happypath/ │ │ │ │ ├── recovery_hp_1.cy.js │ │ │ │ ├── recovery_hp_2.cy.js │ │ │ │ ├── recovery_hp_3.cy.js │ │ │ │ ├── recovery_hp_4.cy.js │ │ │ │ ├── sendfunds_connected_wallet.cy.js │ │ │ │ ├── sendfunds_queue_1.cy.js │ │ │ │ ├── sendfunds_relay.cy.js │ │ │ │ ├── tx_history_filter_hp_1.cy.js │ │ │ │ └── tx_history_filter_hp_2.cy.js │ │ │ ├── happypath_2/ │ │ │ │ ├── add_owner.cy.js │ │ │ │ ├── create_safe_cf.cy.js │ │ │ │ ├── mass_payouts.cy.js │ │ │ │ ├── multichain_create_safe.cy.js │ │ │ │ ├── nested_safes.cy.js │ │ │ │ ├── proposers.cy.js │ │ │ │ ├── swaps.cy.js │ │ │ │ └── tx-builder.cy.js │ │ │ ├── pages/ │ │ │ │ ├── accounts_modal.pages.js │ │ │ │ ├── address_book.page.js │ │ │ │ ├── assets.pages.js │ │ │ │ ├── batches.pages.js │ │ │ │ ├── bridge.pages.js │ │ │ │ ├── copilot.js │ │ │ │ ├── create_tx.pages.js │ │ │ │ ├── create_wallet.pages.js │ │ │ │ ├── dashboard.pages.js │ │ │ │ ├── header.page.js │ │ │ │ ├── import_export.pages.js │ │ │ │ ├── load_safe.pages.js │ │ │ │ ├── main.page.js │ │ │ │ ├── messages.pages.js │ │ │ │ ├── modals/ │ │ │ │ │ └── message_confirmation.pages.js │ │ │ │ ├── modals.page.js │ │ │ │ ├── modules.page.js │ │ │ │ ├── navigation.page.js │ │ │ │ ├── nestedsafes.pages.js │ │ │ │ ├── network.pages.js │ │ │ │ ├── nfts.pages.js │ │ │ │ ├── notifications.page.js │ │ │ │ ├── owners.pages.js │ │ │ │ ├── portfolio.pages.js │ │ │ │ ├── proposers.pages.js │ │ │ │ ├── recovery.pages.js │ │ │ │ ├── safe_navigation.pages.js │ │ │ │ ├── safeapps.pages.js │ │ │ │ ├── sidebar.pages.js │ │ │ │ ├── spaces.page.js │ │ │ │ ├── spending_limits.pages.js │ │ │ │ ├── staking.page.js │ │ │ │ ├── swaps.pages.js │ │ │ │ ├── tables.page.js │ │ │ │ ├── transactions.page.js │ │ │ │ └── walletconnect.page.js │ │ │ ├── prodhealthcheck/ │ │ │ │ ├── add_owner.cy.js │ │ │ │ ├── create_tx.cy.js │ │ │ │ ├── load_safe.cy.js │ │ │ │ ├── messages_onchain.cy.js │ │ │ │ ├── multichain_network.cy.js │ │ │ │ ├── nfts.cy.js │ │ │ │ ├── recovery.cy.js │ │ │ │ ├── remove_owner.cy.js │ │ │ │ ├── sidebar.cy.js │ │ │ │ ├── sidebar_3.cy.js │ │ │ │ ├── spending_limits.cy.js │ │ │ │ ├── swaps_history_2.cy.js │ │ │ │ ├── swaps_tokens.cy.js │ │ │ │ ├── tokens.cy.js │ │ │ │ ├── tx_history.cy.js │ │ │ │ └── tx_history_2.cy.js │ │ │ ├── regression/ │ │ │ │ ├── add_owner.cy.js │ │ │ │ ├── address_book.cy.js │ │ │ │ ├── address_book_2.cy.js │ │ │ │ ├── address_book_3.cy.js │ │ │ │ ├── assets.cy.js │ │ │ │ ├── assets_2.cy.js │ │ │ │ ├── balances_pagination.cy.js │ │ │ │ ├── batch_tx.cy.js │ │ │ │ ├── bulk_execution.cy.js │ │ │ │ ├── copilot.cy.js │ │ │ │ ├── create_safe_cf.cy.js │ │ │ │ ├── create_safe_simple.cy.js │ │ │ │ ├── create_safe_simple_2.cy.js │ │ │ │ ├── create_safe_simple_3.cy.js │ │ │ │ ├── create_tx.cy.js │ │ │ │ ├── create_tx_2.cy.js │ │ │ │ ├── dashboard.cy.js │ │ │ │ ├── import_export_data_2.cy.js │ │ │ │ ├── limit_order.cy.js │ │ │ │ ├── limit_order_history.cy.js │ │ │ │ ├── limit_order_queue.cy.js │ │ │ │ ├── load_safe.cy.js │ │ │ │ ├── load_safe_2.cy.js │ │ │ │ ├── load_safe_3.cy.js │ │ │ │ ├── mass_payouts.cy.js │ │ │ │ ├── messages_offchain.cy.js │ │ │ │ ├── messages_onchain.cy.js │ │ │ │ ├── messages_popup.cy.js │ │ │ │ ├── multichain_create_safe.cy.js │ │ │ │ ├── multichain_create_safe_flow.cy.js │ │ │ │ ├── multichain_network.cy.js │ │ │ │ ├── multichain_networkswitch.cy.js │ │ │ │ ├── multichain_safe_selector.cy.js │ │ │ │ ├── multichain_setup.cy.js │ │ │ │ ├── multichain_setup_new.cy.js │ │ │ │ ├── multichain_sidebar.cy.js │ │ │ │ ├── nested_safes.cy.js │ │ │ │ ├── nested_safes_curation.cy.js │ │ │ │ ├── nested_safes_fund_asset.cy.js │ │ │ │ ├── nested_safes_review.cy.js │ │ │ │ ├── nfts.cy.js │ │ │ │ ├── nfts_2.cy.js │ │ │ │ ├── notifications.cy.js │ │ │ │ ├── portfolio.cy.js │ │ │ │ ├── proposers.cy.js │ │ │ │ ├── proposers_2.cy.js │ │ │ │ ├── recovery.cy.js │ │ │ │ ├── recovery_2.cy.js │ │ │ │ ├── remove_owner.cy.js │ │ │ │ ├── replace_owner.cy.js │ │ │ │ ├── safe_selector.cy.js │ │ │ │ ├── sidebar.cy.js │ │ │ │ ├── sidebar_2.cy.js │ │ │ │ ├── sidebar_3.cy.js │ │ │ │ ├── sidebar_4.cy.js │ │ │ │ ├── sidebar_5.cy.js │ │ │ │ ├── sidebar_6.cy.js │ │ │ │ ├── sidebar_7.cy.js │ │ │ │ ├── sidebar_8.cy.js │ │ │ │ ├── sidebar_9.cy.js │ │ │ │ ├── sidebar_new.cy.js │ │ │ │ ├── sidebar_nonowner.cy.js │ │ │ │ ├── spaces_basicflow.cy.js │ │ │ │ ├── spaces_dashboard.cy.js │ │ │ │ ├── spending_limits.cy.js │ │ │ │ ├── spending_limits_nonowner.cy.js │ │ │ │ ├── staking_history.cy.js │ │ │ │ ├── swaps.cy.js │ │ │ │ ├── swaps_2.cy.js │ │ │ │ ├── swaps_history.cy.js │ │ │ │ ├── swaps_history_2.cy.js │ │ │ │ ├── swaps_queue.cy.js │ │ │ │ ├── swaps_tokens.cy.js │ │ │ │ ├── tokens.cy.js │ │ │ │ ├── twaps_history.cy.js │ │ │ │ ├── twaps_integration.cy.js │ │ │ │ ├── twaps_queue.cy.js │ │ │ │ ├── tx_details_createtx.cy.js │ │ │ │ ├── tx_details_queue.cy.js │ │ │ │ ├── tx_history.cy.js │ │ │ │ ├── tx_history_2.cy.js │ │ │ │ ├── tx_history_3.cy.js │ │ │ │ ├── tx_history_4.cy.js │ │ │ │ ├── tx_history_5.cy.js │ │ │ │ ├── tx_history_6.cy.js │ │ │ │ ├── tx_history_filter.cy.js │ │ │ │ ├── tx_history_filter_2.cy.js │ │ │ │ ├── tx_notes.cy.js │ │ │ │ ├── tx_queue.cy.js │ │ │ │ ├── tx_queue_delete_btn.cy.js │ │ │ │ ├── tx_queue_reject_btn.cy.js │ │ │ │ ├── tx_queue_replace_btn.cy.js │ │ │ │ ├── tx_share_block.cy.js │ │ │ │ ├── walletconnect.cy.js │ │ │ │ └── walletconnect_2.cy.js │ │ │ ├── safe-apps/ │ │ │ │ ├── apps_list.cy.js │ │ │ │ ├── browser_permissions.cy.js │ │ │ │ ├── constants.js │ │ │ │ ├── drain_account.spec.cy.js │ │ │ │ ├── info_modal.cy.js │ │ │ │ ├── permissions_settings.cy.js │ │ │ │ ├── preview_drawer.cy.js │ │ │ │ ├── safe_permissions.cy.js │ │ │ │ ├── tx-builder.cy.js │ │ │ │ ├── tx-builder_2.cy.js │ │ │ │ └── tx-builder_3.cy.js │ │ │ ├── smoke/ │ │ │ │ ├── add_owner.cy.js │ │ │ │ ├── address_book.cy.js │ │ │ │ ├── assets.cy.js │ │ │ │ ├── balances_endpoints.cy.js │ │ │ │ ├── batch_tx.cy.js │ │ │ │ ├── create_tx.cy.js │ │ │ │ ├── dashboard.cy.js │ │ │ │ ├── import_export_data.cy.js │ │ │ │ ├── import_export_data_2.cy.js │ │ │ │ ├── landing.cy.js │ │ │ │ ├── load_safe.cy.js │ │ │ │ ├── messages_offchain.cy.js │ │ │ │ ├── nfts.cy.js │ │ │ │ ├── replace_owner.cy.js │ │ │ │ ├── safe_selector.cy.js │ │ │ │ ├── sidebar.cy.js │ │ │ │ ├── spending_limits.cy.js │ │ │ │ ├── tokens.cy.js │ │ │ │ └── tx_history.cy.js │ │ │ └── visual/ │ │ │ ├── address_book.cy.js │ │ │ ├── apps_custom.cy.js │ │ │ ├── balances.cy.js │ │ │ ├── batch_tx.cy.js │ │ │ ├── bridge.cy.js │ │ │ ├── create_tx_flow.cy.js │ │ │ ├── dashboard.cy.js │ │ │ ├── earn.cy.js │ │ │ ├── env_variables.cy.js │ │ │ ├── error_pages.cy.js │ │ │ ├── legal_pages.cy.js │ │ │ ├── messages.cy.js │ │ │ ├── msg_details.cy.js │ │ │ ├── new_safe.cy.js │ │ │ ├── new_safe_advanced.cy.js │ │ │ ├── nfts.cy.js │ │ │ ├── owner_management.cy.js │ │ │ ├── positions.cy.js │ │ │ ├── safe_apps.cy.js │ │ │ ├── settings_cookies.cy.js │ │ │ ├── settings_data_security.cy.js │ │ │ ├── settings_pages.cy.js │ │ │ ├── settings_safe_apps.cy.js │ │ │ ├── sidebar.cy.js │ │ │ ├── spaces.cy.js │ │ │ ├── spending_limits.cy.js │ │ │ ├── stake.cy.js │ │ │ ├── swap.cy.js │ │ │ ├── tx_details.cy.js │ │ │ ├── tx_history.cy.js │ │ │ ├── tx_queue.cy.js │ │ │ ├── user_settings.cy.js │ │ │ └── welcome.cy.js │ │ ├── fixtures/ │ │ │ ├── address_book_addedsafes.csv │ │ │ ├── address_book_duplicated.csv │ │ │ ├── address_book_empty_test.csv │ │ │ ├── address_book_networks.csv │ │ │ ├── address_book_test.csv │ │ │ ├── balances.json │ │ │ ├── data_import.json │ │ │ ├── history/ │ │ │ │ └── history_tx_1.json │ │ │ ├── messages/ │ │ │ │ └── messages.json │ │ │ ├── nfts/ │ │ │ │ └── nfts.json │ │ │ ├── pending_tx/ │ │ │ │ ├── pending_tx.json │ │ │ │ └── pending_tx_order.json │ │ │ ├── safe-app.html │ │ │ ├── safes/ │ │ │ │ ├── funds.json │ │ │ │ ├── nfts.json │ │ │ │ ├── recovery.json │ │ │ │ ├── safeapps.json │ │ │ │ └── static.js │ │ │ ├── spaces/ │ │ │ │ ├── address_book.json │ │ │ │ ├── members.json │ │ │ │ ├── staticSpaces.js │ │ │ │ ├── user.json │ │ │ │ └── visualSpacesApiMock.js │ │ │ ├── staking_data.json │ │ │ ├── swaps/ │ │ │ │ ├── quoteresponse1.json │ │ │ │ └── quoteresponse2.json │ │ │ ├── swaps_data.json │ │ │ ├── test-empty-batch.json │ │ │ ├── test-invalid-batch.json │ │ │ ├── test-mainnet-batch.json │ │ │ ├── test-modified-batch.json │ │ │ ├── test-working-batch.json │ │ │ ├── txhistory_data_data.json │ │ │ ├── txhistory_incoming_data.json │ │ │ └── txmessages_data.json │ │ ├── plugins/ │ │ │ └── index.js │ │ └── support/ │ │ ├── api/ │ │ │ ├── contracts.js │ │ │ ├── utils_ether.js │ │ │ └── utils_protocolkit.js │ │ ├── commands.js │ │ ├── constants.js │ │ ├── e2e.js │ │ ├── localstorage_data.js │ │ ├── safe-apps-commands.js │ │ ├── safes/ │ │ │ └── safesHandler.js │ │ ├── utils/ │ │ │ ├── checkers.js │ │ │ ├── ethers.js │ │ │ ├── gtag.js │ │ │ ├── txquery.js │ │ │ └── wallet.js │ │ └── visual-mocks.js │ ├── cypress.config.js │ ├── docs/ │ │ ├── TESTING.md │ │ ├── code-style.md │ │ ├── environments.md │ │ ├── feature-architecture.md │ │ ├── release-procedure-automated.md │ │ ├── release-procedure.md │ │ ├── spaces-accounts-architecture.md │ │ ├── storybook-snapshots.md │ │ ├── update-patch.md │ │ └── update-terms.md │ ├── eslint.config.mjs │ ├── jest.config.cjs │ ├── jest.setup.js │ ├── knip.json │ ├── mocks/ │ │ └── svg.js │ ├── next-env.d.ts │ ├── next.config.mjs │ ├── package.json │ ├── plugins/ │ │ └── sri-manifest-webpack-plugin.mjs │ ├── postcss.config.mjs │ ├── public/ │ │ ├── .well-known/ │ │ │ └── apple-app-site-association │ │ ├── beamer-embed.css │ │ ├── beamer-embed.js │ │ ├── fonts/ │ │ │ └── fonts.css │ │ ├── mockServiceWorker.js │ │ └── safe.webmanifest │ ├── scripts/ │ │ ├── cmp.sh │ │ ├── css-vars.ts │ │ ├── fetch-chains.ts │ │ ├── generate-routes.js │ │ ├── generate-storybook-tests.cjs │ │ ├── github/ │ │ │ ├── prepare_production_deployment.sh │ │ │ └── s3_upload.sh │ │ ├── integrity-hashes.cjs │ │ ├── release/ │ │ │ ├── README.md │ │ │ ├── generate-changelog.sh │ │ │ └── notify-slack.sh │ │ └── release-notes.sh │ ├── src/ │ │ ├── components/ │ │ │ ├── address-book/ │ │ │ │ ├── AddressBookHeader/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── AddressBookTable/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── EntryDialog/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ExportDialog/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ImportDialog/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── validation.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── validation.ts │ │ │ │ ├── RemoveDialog/ │ │ │ │ │ └── index.tsx │ │ │ │ └── index.stories.tsx │ │ │ ├── balances/ │ │ │ │ ├── AssetsHeader/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── AssetsTable/ │ │ │ │ │ ├── ActionButtons.tsx │ │ │ │ │ ├── AssetRowContent.tsx │ │ │ │ │ ├── FiatBalance.tsx │ │ │ │ │ ├── FiatChange.test.tsx │ │ │ │ │ ├── FiatChange.tsx │ │ │ │ │ ├── HiddenTokensInfo.tsx │ │ │ │ │ ├── PromoButtons.tsx │ │ │ │ │ ├── SendButton.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── AssetsTable.test.tsx │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useHideAssets.ts │ │ │ │ ├── CurrencySelect/ │ │ │ │ │ ├── CurrencySelect.stories.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── useCurrencies.ts │ │ │ │ ├── HiddenTokenButton/ │ │ │ │ │ ├── HiddenTokenButton.stories.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ManageTokensButton/ │ │ │ │ │ ├── ManageTokensMenu.module.css │ │ │ │ │ ├── ManageTokensMenu.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── ManageTokensButton.test.tsx │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TokenMenu/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ └── TotalAssetValue/ │ │ │ │ ├── TotalAssetValue.stories.tsx │ │ │ │ └── index.tsx │ │ │ ├── common/ │ │ │ │ ├── ActionCard/ │ │ │ │ │ ├── ActionCard.stories.tsx │ │ │ │ │ ├── ActionCard.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── AddFunds/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── AddressBookInput/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── AddressBookSourceProvider/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── AddressInput/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useNameResolver.ts │ │ │ │ ├── AddressInputReadOnly/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── AssetActionButton/ │ │ │ │ │ └── styles.module.css │ │ │ │ ├── AuditLog/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── BackLink/ │ │ │ │ │ ├── BackLink.stories.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── BlockedAddress/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Breadcrumbs/ │ │ │ │ │ ├── BreadcrumbItem.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Captcha/ │ │ │ │ │ ├── CaptchaModal.tsx │ │ │ │ │ ├── CaptchaProvider.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── CaptchaProvider.test.tsx │ │ │ │ │ │ ├── captchaHeadersInit.test.ts │ │ │ │ │ │ └── useCaptchaToken.test.ts │ │ │ │ │ ├── captchaHeadersInit.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── useCaptchaToken.ts │ │ │ │ ├── ChainIndicator/ │ │ │ │ │ ├── ChainIndicator.stories.test.tsx │ │ │ │ │ ├── ChainIndicator.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ChainIndicator.stories.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ChainSwitcher/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── CheckWallet/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── CheckWalletWithPermission/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Chip/ │ │ │ │ │ ├── Chip.stories.test.tsx │ │ │ │ │ ├── Chip.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Chip.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── ChoiceButton/ │ │ │ │ │ ├── ChoiceButton.stories.test.tsx │ │ │ │ │ ├── ChoiceButton.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ChoiceButton.stories.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ConnectWallet/ │ │ │ │ │ ├── AccountCenter.tsx │ │ │ │ │ ├── ConnectWalletButton.tsx │ │ │ │ │ ├── ConnectionCenter.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── AccountCenter.test.tsx │ │ │ │ │ │ └── ConnectionCenter.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useConnectWallet.ts │ │ │ │ ├── ContextMenu/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── CookieAndTermBanner/ │ │ │ │ │ ├── CookieBannerActions.tsx │ │ │ │ │ ├── CookieOptionsList.tsx │ │ │ │ │ ├── IntroText.tsx │ │ │ │ │ ├── WarningMessage.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── CooldownButton/ │ │ │ │ │ ├── CooldownButton.stories.test.tsx │ │ │ │ │ ├── CooldownButton.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── CooldownButton.stories.test.tsx.snap │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── CopyAddressButton/ │ │ │ │ │ ├── CopyAddressButton.stories.test.tsx │ │ │ │ │ ├── CopyAddressButton.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── CopyAddressButton.stories.test.tsx.snap │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── CopyButton/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── CopyTooltip/ │ │ │ │ │ ├── ConfirmCopyModal.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Countdown/ │ │ │ │ │ ├── Countdown.stories.test.tsx │ │ │ │ │ ├── Countdown.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Countdown.stories.test.tsx.snap │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── CustomLink/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── CustomTooltip/ │ │ │ │ │ ├── CustomTooltip.stories.test.tsx │ │ │ │ │ ├── CustomTooltip.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── CustomTooltip.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── DatePickerInput/ │ │ │ │ │ ├── DatePickerInput.stories.test.tsx │ │ │ │ │ ├── DatePickerInput.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── DatePickerInput.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── DateTime/ │ │ │ │ │ ├── DateTime.stories.test.tsx │ │ │ │ │ ├── DateTime.stories.tsx │ │ │ │ │ ├── DateTime.tsx │ │ │ │ │ ├── DateTimeContainer.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── DateTime.stories.test.tsx.snap │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Disclaimer/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── EnhancedTable/ │ │ │ │ │ ├── EnhancedTable.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ErrorBoundary/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── EthHashInfo/ │ │ │ │ │ ├── SrcEthHashInfo/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ExplorerButton/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ExternalLink/ │ │ │ │ │ ├── ExternalLink.stories.test.tsx │ │ │ │ │ ├── ExternalLink.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ExternalLink.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── FiatValue/ │ │ │ │ │ ├── FiatValue.stories.test.tsx │ │ │ │ │ ├── FiatValue.stories.tsx │ │ │ │ │ ├── FiatValue.test.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── FiatValue.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── FileUpload/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Footer/ │ │ │ │ │ ├── footer.type.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── GeoblockingProvider/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── GradientCircularProgress/ │ │ │ │ │ ├── GradientCircularProgress.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Header/ │ │ │ │ │ ├── Topbar/ │ │ │ │ │ │ ├── NotificationsPopover.test.tsx │ │ │ │ │ │ ├── NotificationsPopover.tsx │ │ │ │ │ │ ├── SafenetStakingButton.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── useNotificationsPopover.test.ts │ │ │ │ │ │ │ └── useNotificationsPopover.ts │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── HelpMenu/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Identicon/ │ │ │ │ │ ├── Identicon.stories.test.tsx │ │ │ │ │ ├── Identicon.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── Identicon.stories.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── IframeIcon/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ImageFallback/ │ │ │ │ │ ├── ImageFallback.stories.test.tsx │ │ │ │ │ ├── ImageFallback.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ImageFallback.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── InfiniteScroll/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── InfoTooltip/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── InlineRetryError/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── LazyWeb3Init/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── LegalDisclaimerContent/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── MarkdownContent/ │ │ │ │ │ ├── index.module.css │ │ │ │ │ └── index.tsx │ │ │ │ ├── MetaTags/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ModalDialog/ │ │ │ │ │ ├── ModalDialog.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Mui/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── NameInput/ │ │ │ │ │ ├── NameInput.stories.test.tsx │ │ │ │ │ ├── NameInput.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── NameInput.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── NamedAddressInfo/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── NavTabs/ │ │ │ │ │ ├── NavTabs.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Navigate/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── NestedSafeBreadcrumbs/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── NetworkInput/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── NetworkSelector/ │ │ │ │ │ ├── NetworkMultiSelectorInput.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Notifications/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useCounter.ts │ │ │ │ ├── NumberField/ │ │ │ │ │ ├── index.test.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── ObservabilityErrorBoundary/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── OnboardingTooltip/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── OnboardingTooltip.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── OnlyOwnerOrProposer/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── PageHeader/ │ │ │ │ │ ├── PageHeader.stories.test.tsx │ │ │ │ │ ├── PageHeader.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── PageHeader.stories.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── PageLayout/ │ │ │ │ │ ├── SideDrawer.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── PagePlaceholder/ │ │ │ │ │ ├── PagePlaceholder.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── PaginatedTxns/ │ │ │ │ │ ├── SkeletonTxList.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── PaperViewToggle/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Popup/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ProgressBar/ │ │ │ │ │ ├── ProgressBar.stories.test.tsx │ │ │ │ │ ├── ProgressBar.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── ProgressBar.stories.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── PromoBanner/ │ │ │ │ │ ├── PromoBanner.stories.test.tsx │ │ │ │ │ ├── PromoBanner.stories.tsx │ │ │ │ │ ├── PromoBanner.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── PromoBanner.stories.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── styles.module.css │ │ │ │ ├── QRCode/ │ │ │ │ │ ├── QRCode.stories.test.tsx │ │ │ │ │ ├── QRCode.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── QRCode.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeIcon/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeLoadingError/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeLogo/ │ │ │ │ │ ├── SafeLogo.module.css │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── SafeLogo.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafenetStakingWidget/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SignerSelector/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SpaceSafeBar/ │ │ │ │ │ ├── AccountsModal/ │ │ │ │ │ │ ├── MultiSafeItemCard.test.tsx │ │ │ │ │ │ ├── MultiSafeItemCard.tsx │ │ │ │ │ │ ├── PinnedMultiSafeItem.tsx │ │ │ │ │ │ ├── PinnedSafeContextMenu.tsx │ │ │ │ │ │ ├── PinnedSafeItem.tsx │ │ │ │ │ │ ├── SafeItemCard.test.tsx │ │ │ │ │ │ ├── SafeItemCard.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── shared.tsx │ │ │ │ │ ├── SpaceBackLink.test.tsx │ │ │ │ │ ├── SpaceBackLink.tsx │ │ │ │ │ ├── SpaceChainSelector.stories.tsx │ │ │ │ │ ├── SpaceChainSelector.test.tsx │ │ │ │ │ ├── SpaceChainSelector.tsx │ │ │ │ │ ├── SpaceNestedSafesButton.stories.tsx │ │ │ │ │ ├── SpaceNestedSafesButton.test.tsx │ │ │ │ │ ├── SpaceNestedSafesButton.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── useSafeBarSafes.test.ts │ │ │ │ │ │ │ ├── useSpaceBackLink.test.ts │ │ │ │ │ │ │ ├── useSpaceChainSelector.test.ts │ │ │ │ │ │ │ └── useSpaceSafeSelectorItems.test.ts │ │ │ │ │ │ ├── useSafeBarSafes.ts │ │ │ │ │ │ ├── useSpaceBackLink.ts │ │ │ │ │ │ ├── useSpaceChainSelector.ts │ │ │ │ │ │ └── useSpaceSafeSelectorItems.ts │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SpendingLimitLabel/ │ │ │ │ │ ├── SpendingLimitLabel.stories.test.tsx │ │ │ │ │ ├── SpendingLimitLabel.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── SpendingLimitLabel.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── SplitMenuButton/ │ │ │ │ │ ├── SplitMenuButton.stories.test.tsx │ │ │ │ │ ├── SplitMenuButton.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── SplitMenuButton.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── Sticky/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Table/ │ │ │ │ │ ├── DataRow.stories.test.tsx │ │ │ │ │ ├── DataRow.stories.tsx │ │ │ │ │ ├── DataRow.tsx │ │ │ │ │ ├── DataTable.stories.test.tsx │ │ │ │ │ ├── DataTable.stories.tsx │ │ │ │ │ ├── DataTable.tsx │ │ │ │ │ ├── EmptyRow.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── DataRow.stories.test.tsx.snap │ │ │ │ │ │ └── DataTable.stories.test.tsx.snap │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ToggleButtonGroup/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── TokenAmount/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TokenAmountInput/ │ │ │ │ │ ├── TokenAmountInput.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TokenIcon/ │ │ │ │ │ ├── TokenIcon.stories.test.tsx │ │ │ │ │ ├── TokenIcon.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── TokenIcon.stories.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Track/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxModalDialog/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── UnreadBadge/ │ │ │ │ │ ├── UnreadBadge.stories.test.tsx │ │ │ │ │ ├── UnreadBadge.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── UnreadBadge.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── WalletBalance/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── WalletIcon/ │ │ │ │ │ ├── WalletIcon.stories.test.tsx │ │ │ │ │ ├── WalletIcon.stories.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── WalletIcon.stories.test.tsx.snap │ │ │ │ │ └── index.tsx │ │ │ │ ├── WalletInfo/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── WalletOverview/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── WalletProvider/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── WidgetDisclaimer/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ └── icons/ │ │ │ │ └── CircularIcon/ │ │ │ │ ├── index.tsx │ │ │ │ └── styles.module.css │ │ │ ├── dashboard/ │ │ │ │ ├── ActionRequiredPanel/ │ │ │ │ │ ├── ActionRequiredPanel.test.tsx │ │ │ │ │ ├── ActionRequiredPanel.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useWarningCount.ts │ │ │ │ ├── AddFundsBanner/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Assets/ │ │ │ │ │ ├── Assets.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ExplorePossibleWidget/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── FirstSteps/ │ │ │ │ │ ├── FirstSteps.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── NewsCarousel/ │ │ │ │ │ ├── NewsDisclaimers.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ ├── banners/ │ │ │ │ │ │ ├── EarnBanner.stories.test.tsx │ │ │ │ │ │ ├── EarnBanner.stories.tsx │ │ │ │ │ │ ├── EarnBanner.tsx │ │ │ │ │ │ ├── EurcvBoostBanner.stories.test.tsx │ │ │ │ │ │ ├── EurcvBoostBanner.stories.tsx │ │ │ │ │ │ ├── EurcvBoostBanner.tsx │ │ │ │ │ │ ├── SpacesBanner.stories.test.tsx │ │ │ │ │ │ ├── SpacesBanner.stories.tsx │ │ │ │ │ │ ├── SpacesBanner.tsx │ │ │ │ │ │ ├── StakeBanner.stories.test.tsx │ │ │ │ │ │ ├── StakeBanner.stories.tsx │ │ │ │ │ │ ├── StakeBanner.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── EarnBanner.stories.test.tsx.snap │ │ │ │ │ │ ├── EurcvBoostBanner.stories.test.tsx.snap │ │ │ │ │ │ ├── SpacesBanner.stories.test.tsx.snap │ │ │ │ │ │ └── StakeBanner.stories.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── utils.ts │ │ │ │ ├── Overview/ │ │ │ │ │ ├── Overview.stories.tsx │ │ │ │ │ ├── Overview.tsx │ │ │ │ │ └── OverviewSkeleton.tsx │ │ │ │ ├── PendingTxs/ │ │ │ │ │ ├── PendingRecoveryListItem.tsx │ │ │ │ │ ├── PendingTxList.test.ts │ │ │ │ │ ├── PendingTxListItem.tsx │ │ │ │ │ ├── PendingTxsList.stories.tsx │ │ │ │ │ ├── PendingTxsList.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppsDashboardSection/ │ │ │ │ │ ├── SafeAppsDashboardSection.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── SafeAppsDashboardSection.test.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── StakingBanner/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ ├── useIsStakingBannerVisible.test.ts │ │ │ │ │ └── useIsStakingBannerVisible.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── styled.stories.tsx │ │ │ │ ├── styled.tsx │ │ │ │ └── styles.module.css │ │ │ ├── new-safe/ │ │ │ │ ├── CardStepper/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useCardStepper.ts │ │ │ │ ├── OwnerRow/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ReviewRow/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── create/ │ │ │ │ │ ├── AdvancedCreateSafe.tsx │ │ │ │ │ ├── CreateSafeInfos/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── InfoWidget/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── NetworkWarning/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── NoWalletConnectedWarning/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── OverviewWidget/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useEstimateSafeCreationGas.test.ts │ │ │ │ │ │ └── useSyncSafeCreationStep.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── logic/ │ │ │ │ │ │ ├── address-book.ts │ │ │ │ │ │ ├── index.test.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── steps/ │ │ │ │ │ │ ├── AdvancedOptionsStep/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── OwnerPolicyStep/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── useSafeSetupHints.ts │ │ │ │ │ │ ├── ReviewStep/ │ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── styles.module.css │ │ │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ ├── SetNameStep/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ │ └── StatusStep/ │ │ │ │ │ │ ├── LoadingSpinner/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ │ ├── StatusMessage.tsx │ │ │ │ │ │ ├── StatusStep.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── styles.module.css │ │ │ │ │ │ └── useUndeployedSafe.ts │ │ │ │ │ ├── styles.module.css │ │ │ │ │ ├── types.d.ts │ │ │ │ │ ├── useEstimateSafeCreationGas.ts │ │ │ │ │ └── useSyncSafeCreationStep.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ └── load/ │ │ │ │ ├── index.tsx │ │ │ │ └── steps/ │ │ │ │ ├── SafeOwnerStep/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeReviewStep/ │ │ │ │ │ └── index.tsx │ │ │ │ └── SetAddressStep/ │ │ │ │ └── index.tsx │ │ │ ├── notification-center/ │ │ │ │ ├── NotificationCenter/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── NotificationCenterItem/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── NotificationCenterList/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── NotificationRenewal/ │ │ │ │ │ └── index.tsx │ │ │ │ └── index.stories.tsx │ │ │ ├── safe-apps/ │ │ │ │ ├── AddCustomAppModal/ │ │ │ │ │ ├── CustomApp.tsx │ │ │ │ │ ├── CustomAppPlaceholder.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── AddCustomSafeAppCard/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── AppFrame/ │ │ │ │ │ ├── SafeAppIframe.tsx │ │ │ │ │ ├── ThirdPartyCookiesWarning.tsx │ │ │ │ │ ├── TransactionQueueBar/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── AppFrame.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ ├── useAppCommunicator.ts │ │ │ │ │ ├── useAppIsLoading.ts │ │ │ │ │ ├── useFromAppAnalytics.ts │ │ │ │ │ ├── useGetSafeInfo.ts │ │ │ │ │ ├── useThirdPartyCookies.test.ts │ │ │ │ │ ├── useThirdPartyCookies.ts │ │ │ │ │ └── useTransactionQueueBarState.ts │ │ │ │ ├── NativeSwapsCard/ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── PermissionCheckbox.tsx │ │ │ │ ├── PermissionsPrompt.tsx │ │ │ │ ├── RemoveCustomAppModal.tsx │ │ │ │ ├── SafeAppActionButtons/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeAppCard/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppIconCard/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeAppLandingPage/ │ │ │ │ │ ├── AppActions.tsx │ │ │ │ │ ├── SafeAppDetails.tsx │ │ │ │ │ ├── TryDemo.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeAppList/ │ │ │ │ │ ├── SafeAppList.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppPreviewDrawer/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppSocialLinksCard/ │ │ │ │ │ ├── SafeAppSocialLinksCard.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppTags/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppsErrorBoundary/ │ │ │ │ │ ├── SafeAppsLoadError.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppsFilters/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppsHeader/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppsInfoModal/ │ │ │ │ │ ├── AllowedFeaturesList.tsx │ │ │ │ │ ├── Domain.tsx │ │ │ │ │ ├── Slider.tsx │ │ │ │ │ ├── UnknownAppWarning.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useSafeAppsInfoModal.ts │ │ │ │ ├── SafeAppsListHeader/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppsSDKLink/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SafeAppsZeroResultsPlaceholder/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── hooks/ │ │ │ │ │ └── useShareSafeAppUrl.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ ├── safe-messages/ │ │ │ │ ├── DecodedMsg/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── InfoBox/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── Msg/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── MsgAuditLog/ │ │ │ │ │ ├── MsgAuditLog.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── MsgDetails/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── MsgList/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── MsgListItem/ │ │ │ │ │ ├── ExpandableMsgItem.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── MsgShareLink/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── MsgSigners/ │ │ │ │ │ ├── MsgSigners.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── MsgSummary/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── MsgType/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── PaginatedMsgs/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SignMsgButton/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SingleMsg/ │ │ │ │ │ ├── SingleMsg.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── index.stories.tsx │ │ │ ├── settings/ │ │ │ │ ├── ClearPendingTxs/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ContractVersion/ │ │ │ │ │ ├── ContractVersion.stories.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── DataManagement/ │ │ │ │ │ ├── FileListCard.tsx │ │ │ │ │ ├── ImportDialog.tsx │ │ │ │ │ ├── ImportFileUpload.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useGlobalImportFileParser.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useGlobalImportFileParser.ts │ │ │ │ ├── EnvironmentVariables/ │ │ │ │ │ ├── EnvHintButton/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── RpcProviderSection.tsx │ │ │ │ │ ├── TenderlySection.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── FallbackHandler/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── FeeTokenPreference/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── NestedSafesList/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ProposersList/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── PushNotifications/ │ │ │ │ │ ├── GlobalPushNotifications.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── GlobalPushNotifications.test.ts │ │ │ │ │ │ └── logic.test.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── useNotificationPreferences.test.ts │ │ │ │ │ │ │ ├── useNotificationRegistrations.test.ts │ │ │ │ │ │ │ ├── useNotificationTracking.test.ts │ │ │ │ │ │ │ ├── useNotificationsRenewal.test.ts │ │ │ │ │ │ │ ├── useNotificationsTokenVersion.test.ts │ │ │ │ │ │ │ └── useShowNotificationsRenewalMessage.test.ts │ │ │ │ │ │ ├── useNotificationPreferences.ts │ │ │ │ │ │ ├── useNotificationRegistrations.ts │ │ │ │ │ │ ├── useNotificationTracking.ts │ │ │ │ │ │ ├── useNotificationsRenewal.ts │ │ │ │ │ │ ├── useNotificationsTokenVersion.ts │ │ │ │ │ │ └── useShowNotificationsRenewalMessage.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── logic.ts │ │ │ │ │ └── styles.module.css │ │ │ │ ├── RequiredConfirmations/ │ │ │ │ │ ├── RequiredConfirmations.stories.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeAppsPermissions/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeAppsSigningMethod/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeModules/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── SafeModules.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SecurityLogin/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SecuritySettings/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SettingsHeader/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TransactionGuards/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── TransactionGuards.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── __tests__/ │ │ │ │ │ └── SecurityLogin.test.tsx │ │ │ │ └── owner/ │ │ │ │ ├── EditOwnerDialog/ │ │ │ │ │ └── index.tsx │ │ │ │ └── OwnerList/ │ │ │ │ ├── OwnerList.stories.tsx │ │ │ │ └── index.tsx │ │ │ ├── sidebar/ │ │ │ │ ├── DebugToggle/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── IndexingStatus/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── NestedSafeInfo/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── NestedSafeIntro/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── NestedSafesButton/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── NestedSafesList/ │ │ │ │ │ ├── SimilarityConfirmDialog.tsx │ │ │ │ │ ├── SimilarityGroupContainer.tsx │ │ │ │ │ ├── SimilarityWarning.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── useManageNestedSafes.ts │ │ │ │ ├── NestedSafesPopover/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ ├── utils.test.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── NewTxButton/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── QrCodeButton/ │ │ │ │ │ ├── QrModal.stories.tsx │ │ │ │ │ ├── QrModal.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeListContextMenu/ │ │ │ │ │ ├── MultiAccountContextMenu.stories.tsx │ │ │ │ │ ├── MultiAccountContextMenu.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeListRemoveDialog/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── Sidebar/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SidebarFooter/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SidebarHeader/ │ │ │ │ │ ├── SafeHeaderInfo.stories.tsx │ │ │ │ │ ├── SafeHeaderInfo.test.tsx │ │ │ │ │ ├── SafeHeaderInfo.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SidebarList/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ └── SidebarNavigation/ │ │ │ │ ├── config.tsx │ │ │ │ └── index.tsx │ │ │ ├── terms/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── safe-labs-terms.test.tsx │ │ │ │ ├── safe-labs-terms.tsx │ │ │ │ └── styles.module.css │ │ │ ├── theme/ │ │ │ │ ├── SafeThemeProvider.tsx │ │ │ │ ├── mui.d.ts │ │ │ │ └── safeTheme.ts │ │ │ ├── transactions/ │ │ │ │ ├── BatchExecuteButton/ │ │ │ │ │ ├── BatchExecuteHoverProvider.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── BulkTxListGroup/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── CsvTxExportButton/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── CsvTxExportModal/ │ │ │ │ │ ├── CsvTxExportModal.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ExecuteTxButton/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── GroupLabel/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── GroupedTxListItems/ │ │ │ │ │ ├── ReplaceTxHoverProvider.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── HexEncodedData/ │ │ │ │ │ ├── HexEncodedData.test.tsx │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── HexEncodedData.test.tsx.snap │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ImitationTransactionWarning/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── InfoDetails/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── MaliciousTxWarning/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── QueuedTxSimulation/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── RejectTxButton/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SafeCreationTx/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SignTxButton/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SignedMessagesHelpLink/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SingleTx/ │ │ │ │ │ ├── SingleTx.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TrustedToggle/ │ │ │ │ │ ├── TrustedToggleButton.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxConfirmations/ │ │ │ │ │ ├── TxConfirmations.stories.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxDateLabel/ │ │ │ │ │ ├── TxDateLabel.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxDetails/ │ │ │ │ │ ├── Summary/ │ │ │ │ │ │ ├── DecoderLinks.tsx │ │ │ │ │ │ ├── SafeTxHashDataRow/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── TxDataRow/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── TxData/ │ │ │ │ │ │ ├── DecodedData/ │ │ │ │ │ │ │ ├── MethodCall.tsx │ │ │ │ │ │ │ ├── MethodDetails/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── Multisend/ │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ │ │ ├── SingleTxDecoded/ │ │ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ ├── styles.module.css │ │ │ │ │ │ │ │ ├── useTransferTokenInfo.test.ts │ │ │ │ │ │ │ │ └── useTransferTokenInfo.ts │ │ │ │ │ │ │ ├── ValueArray/ │ │ │ │ │ │ │ │ ├── ValueArray.test.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── MigrationToL2TxData/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── NestedTransaction/ │ │ │ │ │ │ │ ├── ExecTransaction/ │ │ │ │ │ │ │ │ ├── ExecTransaction.stories.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ │ │ ├── NestedTransaction.tsx │ │ │ │ │ │ │ ├── OnChainConfirmation/ │ │ │ │ │ │ │ │ ├── OnChainConfirmation.stories.tsx │ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ │ │ └── useSignedHash.tsx │ │ │ │ │ │ ├── Rejection/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── SafeUpdate/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── SettingsChange/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── SpendingLimits/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── Staking/ │ │ │ │ │ │ │ ├── StakingConfirmationTxDeposit.tsx │ │ │ │ │ │ │ ├── StakingConfirmationTxWithdraw.tsx │ │ │ │ │ │ │ ├── StakingStatus.tsx │ │ │ │ │ │ │ ├── StakingTxDepositDetails.tsx │ │ │ │ │ │ │ ├── StakingTxExitDetails.tsx │ │ │ │ │ │ │ ├── StakingTxWithdrawDetails.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── Transfer/ │ │ │ │ │ │ │ ├── TransferActions.tsx │ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ ├── useTransferFiatValue.test.ts │ │ │ │ │ │ │ └── useTransferFiatValue.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxFilterForm/ │ │ │ │ │ ├── TxFilterForm.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxHeader/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxInfo/ │ │ │ │ │ ├── Staking/ │ │ │ │ │ │ ├── StakingTxDepositInfo.tsx │ │ │ │ │ │ ├── StakingTxExitInfo.tsx │ │ │ │ │ │ ├── StakingTxWithdrawInfo.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── SwapTx.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxList/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxListItem/ │ │ │ │ │ ├── ExpandableTransactionItem.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxNavigation/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxShareLink/ │ │ │ │ │ ├── TxShareLink.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxSigners/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxStatusChip/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxStatusLabel/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── TxSummary/ │ │ │ │ │ ├── QueueActions.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── TxType/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ └── Warning/ │ │ │ │ ├── Warning.stories.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles.module.css │ │ │ ├── tx/ │ │ │ │ ├── AdvancedParams/ │ │ │ │ │ ├── AdvancedParamsForm.tsx │ │ │ │ │ ├── GasLimitInput.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── useAdvancedParams.ts │ │ │ │ │ └── useUserNonce.ts │ │ │ │ ├── ApprovalEditor/ │ │ │ │ │ ├── ApprovalEditor.test.tsx │ │ │ │ │ ├── ApprovalEditorForm.test.tsx │ │ │ │ │ ├── ApprovalEditorForm.tsx │ │ │ │ │ ├── ApprovalItem.tsx │ │ │ │ │ ├── ApprovalValueField.tsx │ │ │ │ │ ├── Approvals.tsx │ │ │ │ │ ├── EditableApprovalItem.tsx │ │ │ │ │ ├── SpenderField.test.tsx │ │ │ │ │ ├── SpenderField.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useApprovalInfos.test.ts │ │ │ │ │ │ └── useApprovalInfos.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── utils/ │ │ │ │ │ └── approvals.ts │ │ │ │ ├── BalanceInfo/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ColorCodedTxAccordion/ │ │ │ │ │ ├── HelpTooltip.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmTxDetails/ │ │ │ │ │ ├── JsonView.tsx │ │ │ │ │ ├── NameChip.test.tsx │ │ │ │ │ ├── NameChip.tsx │ │ │ │ │ ├── Receipt.tsx │ │ │ │ │ └── TxDetailsRow.tsx │ │ │ │ ├── ConfirmTxReceipt/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ConfirmationOrder/ │ │ │ │ │ └── ConfirmationOrderHeader.tsx │ │ │ │ ├── ErrorMessage/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ExecuteCheckbox/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── ExecutionMethodSelector/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── FieldsGrid/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── GasParams/ │ │ │ │ │ ├── GasParams.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── RemainingRelays/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ReviewTransactionV2/ │ │ │ │ │ ├── ErrorTransactionPreview.tsx │ │ │ │ │ ├── ReviewTransactionContent.tsx │ │ │ │ │ ├── ReviewTransactionSkeleton.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SendFromBlock/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SendToBlock/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── SponsoredBy/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── SuccessMessage/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── confirmation-views/ │ │ │ │ │ ├── BatchTransactions/ │ │ │ │ │ │ ├── BatchTransactions.stories.test.tsx │ │ │ │ │ │ ├── BatchTransactions.stories.tsx │ │ │ │ │ │ ├── BatchTransactions.test.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── BatchTransactions.stories.test.tsx.snap │ │ │ │ │ │ │ └── BatchTransactions.test.tsx.snap │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── BridgeTransaction/ │ │ │ │ │ │ ├── BridgeTransaction.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── mockData.ts │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── ChangeThreshold/ │ │ │ │ │ │ ├── ChangeThreshold.stories.test.tsx │ │ │ │ │ │ ├── ChangeThreshold.stories.tsx │ │ │ │ │ │ ├── ChangeThreshold.test.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── ChangeThreshold.stories.test.tsx.snap │ │ │ │ │ │ │ └── ChangeThreshold.test.tsx.snap │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── LifiSwapTransaction/ │ │ │ │ │ │ ├── LifiSwapTransaction.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── mockData.ts │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── ManageSigners/ │ │ │ │ │ │ ├── ManageSigners.stories.tsx │ │ │ │ │ │ ├── get-new-safe-setup.test.ts │ │ │ │ │ │ ├── get-new-safe-setup.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── MigrateToL2Information/ │ │ │ │ │ │ ├── MigrateToL2Information.stories.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── NestedSafeCreation/ │ │ │ │ │ │ ├── NestedSafeCreation.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── SettingsChange/ │ │ │ │ │ │ ├── SettingsChange.stories.test.tsx │ │ │ │ │ │ ├── SettingsChange.stories.tsx │ │ │ │ │ │ ├── SettingsChange.test.tsx │ │ │ │ │ │ ├── UntrustedFallbackHandlerTxAlert.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── SettingsChange.stories.test.tsx.snap │ │ │ │ │ │ │ └── SettingsChange.test.tsx.snap │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── StakingTx/ │ │ │ │ │ │ ├── StakingTx.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── SwapOrder/ │ │ │ │ │ │ ├── SwapOrder.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── UpdateSafe/ │ │ │ │ │ │ ├── UpdateSafe.stories.tsx │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── types.d.ts │ │ │ │ │ ├── useTxPreview.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── security/ │ │ │ │ │ ├── BalanceChanges/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ └── tenderly/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useSimulation.test.ts │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ ├── useSimulation.ts │ │ │ │ │ └── utils.ts │ │ │ │ └── shared/ │ │ │ │ ├── ConfirmationTitle.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ └── hooks.test.ts │ │ │ │ ├── errors/ │ │ │ │ │ ├── NonOwnerError.tsx │ │ │ │ │ ├── RiskConfirmationError.tsx │ │ │ │ │ ├── UnknownContractError.tsx │ │ │ │ │ └── WalletRejectionError.tsx │ │ │ │ ├── hooks.ts │ │ │ │ ├── styles.module.css │ │ │ │ ├── tracking.test.ts │ │ │ │ ├── tracking.ts │ │ │ │ └── types.ts │ │ │ ├── tx-flow/ │ │ │ │ ├── SafeTxProvider.tsx │ │ │ │ ├── TxFlow.tsx │ │ │ │ ├── TxFlowProvider.tsx │ │ │ │ ├── TxFlowStep.tsx │ │ │ │ ├── TxInfoProvider.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ └── SafeTxProvider.test.tsx │ │ │ │ ├── actions/ │ │ │ │ │ ├── Batching/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ComboSubmit.tsx │ │ │ │ │ ├── Counterfactual.tsx │ │ │ │ │ ├── Execute/ │ │ │ │ │ │ ├── ExecuteForm.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── ExecuteForm.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── ExecuteThroughRole/ │ │ │ │ │ │ ├── ExecuteThroughRoleForm/ │ │ │ │ │ │ │ ├── __test__/ │ │ │ │ │ │ │ │ ├── ExecuteThroughRoleForm.test.tsx │ │ │ │ │ │ │ │ └── hooks.test.ts │ │ │ │ │ │ │ ├── hooks.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Propose/ │ │ │ │ │ │ ├── ProposerForm.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Sign/ │ │ │ │ │ │ ├── SignForm.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── SignForm.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── ComboSubmit.test.tsx │ │ │ │ │ │ └── ExecuteThroughRoleSlot.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── common/ │ │ │ │ │ ├── OwnerList/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SafeInfo/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── TxButton.tsx │ │ │ │ │ ├── TxCard/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── TxFlowContent/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── TxLayout/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── TxNonce/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── TxNonce.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── TxStatusWidget/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── constants.ts │ │ │ │ │ └── styles.module.css │ │ │ │ ├── features/ │ │ │ │ │ ├── BalanceChanges.tsx │ │ │ │ │ ├── ExecuteCheckbox.tsx │ │ │ │ │ ├── FeeInfoBanner.tsx │ │ │ │ │ ├── FeesPreview.tsx │ │ │ │ │ ├── RiskConfirmation.tsx │ │ │ │ │ ├── SignerSelect/ │ │ │ │ │ │ ├── SignerForm/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── TxNote.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── flows/ │ │ │ │ │ ├── AddOwner/ │ │ │ │ │ │ ├── ChooseOwner.tsx │ │ │ │ │ │ ├── ReviewOwner.tsx │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CancelRecovery/ │ │ │ │ │ │ ├── CancelRecoveryFlowReview.tsx │ │ │ │ │ │ ├── CancelRecoveryOverview.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── ChangeThreshold/ │ │ │ │ │ │ ├── ChooseThreshold.tsx │ │ │ │ │ │ ├── ReviewChangeThreshold.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ConfirmBatch/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ConfirmTx/ │ │ │ │ │ │ ├── ConfirmProposedTx.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CreateNestedSafe/ │ │ │ │ │ │ ├── ReviewNestedSafe.tsx │ │ │ │ │ │ ├── SetupNestedSafe.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── ExecuteBatch/ │ │ │ │ │ │ ├── DecodedTxs.tsx │ │ │ │ │ │ ├── ReviewBatch.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── useMultiSendContract.ts │ │ │ │ │ ├── ManagerSigners/ │ │ │ │ │ │ ├── ReviewSigners.tsx │ │ │ │ │ │ ├── SignersStructure.tsx │ │ │ │ │ │ ├── SignersStructureView.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── MigrateSafeL2/ │ │ │ │ │ │ ├── MigrateSafeL2Review.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── NestedTxSuccessScreen/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── NewSpendingLimit/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── SpendingLimitForm.test.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── NewTx/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── NftTransfer/ │ │ │ │ │ │ ├── ReviewNftBatch.tsx │ │ │ │ │ │ ├── SendNftBatch.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoverAccount/ │ │ │ │ │ │ ├── RecoverAccountFlowReview.tsx │ │ │ │ │ │ ├── RecoverAccountFlowSetup.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── RecoverAccountFlowSetup.test.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryAttempt/ │ │ │ │ │ │ ├── RecoveryAttemptReview.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RejectTx/ │ │ │ │ │ │ ├── RejectTx.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RemoveGuard/ │ │ │ │ │ │ ├── ReviewRemoveGuard.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RemoveModule/ │ │ │ │ │ │ ├── ReviewRemoveModule.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RemoveOwner/ │ │ │ │ │ │ ├── ReviewRemoveOwner.tsx │ │ │ │ │ │ ├── SetThreshold.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── RemoveRecovery/ │ │ │ │ │ │ ├── RemoveRecoveryFlowOverview.tsx │ │ │ │ │ │ ├── RemoveRecoveryFlowReview.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RemoveSpendingLimit/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ReplaceOwner/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ReplaceTx/ │ │ │ │ │ │ ├── DeleteTxModal.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SafeAppsTx/ │ │ │ │ │ │ ├── ReviewSafeAppsTx.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SignMessage/ │ │ │ │ │ │ ├── SignMessage.test.tsx │ │ │ │ │ │ ├── SignMessage.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SignMessageOnChain/ │ │ │ │ │ │ ├── ReviewSignMessageOnChain.test.tsx │ │ │ │ │ │ ├── ReviewSignMessageOnChain.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SuccessScreen/ │ │ │ │ │ │ ├── StatusStepper.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── statuses/ │ │ │ │ │ │ │ ├── DefaultStatus.tsx │ │ │ │ │ │ │ ├── IndexingStatus.tsx │ │ │ │ │ │ │ └── ProcessingStatus.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── TokenTransfer/ │ │ │ │ │ │ ├── CSVAirdropAppModal/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── CreateTokenTransfer.tsx │ │ │ │ │ │ ├── RecipientRow/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── ReviewRecipientRow.tsx │ │ │ │ │ │ ├── ReviewTokenTransfer.tsx │ │ │ │ │ │ ├── ReviewTokenTx.tsx │ │ │ │ │ │ ├── SendAmountBlock.stories.tsx │ │ │ │ │ │ ├── SendAmountBlock.tsx │ │ │ │ │ │ ├── SpendingLimitRow/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── CreateTokenTransfer.test.tsx │ │ │ │ │ │ │ ├── ReviewTokenTransfer.test.tsx │ │ │ │ │ │ │ ├── SendAmountBlock.test.tsx │ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── UpdateSafe/ │ │ │ │ │ │ ├── UpdateSafeReview.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── UpsertRecovery/ │ │ │ │ │ │ ├── RecovererSmartContractWarning.tsx │ │ │ │ │ │ ├── UpsertRecoveryFlowIntro.tsx │ │ │ │ │ │ ├── UpsertRecoveryFlowReview.tsx │ │ │ │ │ │ ├── UpsertRecoveryFlowSettings.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── styles.module.css │ │ │ │ │ │ ├── useRecoveryPeriods.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── slots/ │ │ │ │ │ ├── Slot.tsx │ │ │ │ │ ├── SlotProvider.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── useRegisterSlot.ts │ │ │ │ │ │ ├── useSlot.ts │ │ │ │ │ │ ├── useSlotContext.ts │ │ │ │ │ │ └── useSlotIds.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── withSlot.tsx │ │ │ │ └── useTxStepper.tsx │ │ │ ├── ui/ │ │ │ │ ├── README.md │ │ │ │ ├── ShadcnProvider.tsx │ │ │ │ ├── accordion.tsx │ │ │ │ ├── alert-dialog.tsx │ │ │ │ ├── alert.tsx │ │ │ │ ├── aspect-ratio.tsx │ │ │ │ ├── avatar.tsx │ │ │ │ ├── badge.tsx │ │ │ │ ├── breadcrumb.tsx │ │ │ │ ├── button.tsx │ │ │ │ ├── card.tsx │ │ │ │ ├── checkbox.tsx │ │ │ │ ├── collapsible.tsx │ │ │ │ ├── combobox.tsx │ │ │ │ ├── context-menu.tsx │ │ │ │ ├── dialog.tsx │ │ │ │ ├── docs/ │ │ │ │ │ └── figma-code-connect.md │ │ │ │ ├── drawer.tsx │ │ │ │ ├── dropdown-menu.tsx │ │ │ │ ├── empty.tsx │ │ │ │ ├── field.tsx │ │ │ │ ├── hover-card.tsx │ │ │ │ ├── input-group.tsx │ │ │ │ ├── input-otp.tsx │ │ │ │ ├── input.test.ts │ │ │ │ ├── input.tsx │ │ │ │ ├── kbd.tsx │ │ │ │ ├── label.tsx │ │ │ │ ├── native-select.tsx │ │ │ │ ├── navigation-menu.tsx │ │ │ │ ├── pagination.tsx │ │ │ │ ├── popover.tsx │ │ │ │ ├── progress.tsx │ │ │ │ ├── radio-group.tsx │ │ │ │ ├── resizable.tsx │ │ │ │ ├── scroll-area.tsx │ │ │ │ ├── select.tsx │ │ │ │ ├── separator.tsx │ │ │ │ ├── sheet.tsx │ │ │ │ ├── sidebar.tsx │ │ │ │ ├── skeleton.tsx │ │ │ │ ├── slider.tsx │ │ │ │ ├── sonner.tsx │ │ │ │ ├── spinner.tsx │ │ │ │ ├── stories/ │ │ │ │ │ ├── accordion.stories.tsx │ │ │ │ │ ├── alert-dialog.stories.tsx │ │ │ │ │ ├── alert.stories.tsx │ │ │ │ │ ├── aspect-ratio.stories.tsx │ │ │ │ │ ├── avatar.stories.tsx │ │ │ │ │ ├── badge.stories.tsx │ │ │ │ │ ├── breadcrumb.stories.tsx │ │ │ │ │ ├── button.stories.tsx │ │ │ │ │ ├── card.stories.tsx │ │ │ │ │ ├── checkbox.stories.tsx │ │ │ │ │ ├── collapsible.stories.tsx │ │ │ │ │ ├── combobox.stories.tsx │ │ │ │ │ ├── context-menu.stories.tsx │ │ │ │ │ ├── drawer.stories.tsx │ │ │ │ │ ├── dropdown-menu.stories.tsx │ │ │ │ │ ├── empty.stories.tsx │ │ │ │ │ ├── field.stories.tsx │ │ │ │ │ ├── hover-card.stories.tsx │ │ │ │ │ ├── input-group.stories.tsx │ │ │ │ │ ├── input-otp.stories.tsx │ │ │ │ │ ├── input.stories.tsx │ │ │ │ │ ├── kbd.stories.tsx │ │ │ │ │ ├── label.stories.tsx │ │ │ │ │ ├── native-select.stories.tsx │ │ │ │ │ ├── navigation-menu.stories.tsx │ │ │ │ │ ├── pagination.stories.tsx │ │ │ │ │ ├── popover.stories.tsx │ │ │ │ │ ├── progress.stories.tsx │ │ │ │ │ ├── radio-group.stories.tsx │ │ │ │ │ ├── resizable.stories.tsx │ │ │ │ │ ├── scroll-area.stories.tsx │ │ │ │ │ ├── select.stories.tsx │ │ │ │ │ ├── separator.stories.tsx │ │ │ │ │ ├── sheet.stories.tsx │ │ │ │ │ ├── sidebar.stories.tsx │ │ │ │ │ ├── skeleton.stories.tsx │ │ │ │ │ ├── slider.stories.tsx │ │ │ │ │ ├── sonner.stories.tsx │ │ │ │ │ ├── spinner.stories.tsx │ │ │ │ │ ├── switch.stories.tsx │ │ │ │ │ ├── table.stories.tsx │ │ │ │ │ ├── tabs.stories.tsx │ │ │ │ │ ├── textarea.stories.tsx │ │ │ │ │ ├── toggle.stories.tsx │ │ │ │ │ ├── tooltip.stories.tsx │ │ │ │ │ └── typography.stories.tsx │ │ │ │ ├── switch.tsx │ │ │ │ ├── table.tsx │ │ │ │ ├── tabs.tsx │ │ │ │ ├── textarea.tsx │ │ │ │ ├── toggle.tsx │ │ │ │ ├── tooltip.tsx │ │ │ │ └── typography.tsx │ │ │ ├── welcome/ │ │ │ │ ├── NewSafe.tsx │ │ │ │ ├── WelcomeLogin/ │ │ │ │ │ ├── WalletLogin.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── WalletLogin.test.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── useHomeAuth.test.ts │ │ │ │ │ │ │ └── useSignInRedirect.test.ts │ │ │ │ │ │ ├── useHomeAuth.ts │ │ │ │ │ │ └── useSignInRedirect.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── styles.module.css │ │ │ │ └── welcomeFooter.module.css │ │ │ └── wrappers/ │ │ │ ├── DisclaimerWrapper/ │ │ │ │ ├── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── FeatureWrapper/ │ │ │ │ ├── index.test.tsx │ │ │ │ └── index.tsx │ │ │ └── SanctionWrapper/ │ │ │ ├── index.test.tsx │ │ │ └── index.tsx │ │ ├── config/ │ │ │ ├── constants.ts │ │ │ ├── eurcv.ts │ │ │ ├── gateway.ts │ │ │ ├── routes.ts │ │ │ ├── securityHeaders.ts │ │ │ └── version.ts │ │ ├── definitions.d.ts │ │ ├── features/ │ │ │ ├── __core__/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useLoadFeature.test.ts │ │ │ │ ├── createFeatureHandle.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ ├── useLoadFeature.ts │ │ │ │ └── withSuspense.tsx │ │ │ ├── __tests__/ │ │ │ │ └── feature-flags-integration.test.tsx │ │ │ ├── actions-tray/ │ │ │ │ ├── components/ │ │ │ │ │ └── ActionsTray/ │ │ │ │ │ ├── ActionsTray.stories.tsx │ │ │ │ │ ├── ActionsTray.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── ActionsTray.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ └── index.ts │ │ │ ├── assets/ │ │ │ │ ├── components/ │ │ │ │ │ └── AssetsList/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ └── index.ts │ │ │ ├── batching/ │ │ │ │ ├── components/ │ │ │ │ │ ├── BatchIndicator/ │ │ │ │ │ │ ├── BatchTooltip.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── BatchSidebar/ │ │ │ │ │ │ ├── BatchTxItem.tsx │ │ │ │ │ │ ├── BatchTxList.tsx │ │ │ │ │ │ ├── EmptyBatch.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ └── BatchTooltip/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ └── useDraftBatch.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── index.ts │ │ │ │ └── store/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── batchSlice.test.ts │ │ │ │ └── batchSlice.ts │ │ │ ├── bridge/ │ │ │ │ ├── components/ │ │ │ │ │ ├── Bridge/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── BridgeWidget/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── hooks/ │ │ │ │ │ └── index.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ └── index.ts │ │ │ ├── counterfactual/ │ │ │ │ ├── components/ │ │ │ │ │ ├── ActivateAccountButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ActivateAccountFlow/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CheckBalance/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CounterfactualForm/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CounterfactualHooks/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CounterfactualStatusButton/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── CounterfactualSuccessScreen/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── FirstTxFlow/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── LazyCounterfactual/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PayNowPayLater/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ └── index.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useDeployGasLimit.test.ts │ │ │ │ │ │ └── usePendingSafeStatuses.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── safeCreationPendingStatuses.ts │ │ │ │ │ ├── useCounterfactualBalances.ts │ │ │ │ │ ├── useDeployGasLimit.ts │ │ │ │ │ ├── useIsCounterfactualEnabled.ts │ │ │ │ │ ├── useIsCounterfactualSafe.ts │ │ │ │ │ ├── usePendingSafeNotifications.ts │ │ │ │ │ └── usePendingSafeStatuses.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── services/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── safeDeployment.test.ts │ │ │ │ │ ├── getCounterfactualBalance.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── safeCreationEvents.ts │ │ │ │ │ ├── safeDeployment.ts │ │ │ │ │ └── typeGuards.ts │ │ │ │ ├── store/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── undeployedSafesSlice.ts │ │ │ │ └── types.ts │ │ │ ├── earn/ │ │ │ │ ├── components/ │ │ │ │ │ ├── EarnButton/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── EarnInfo/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── EarnPage/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── EarnView/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── EarnWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── VaultDepositConfirmation/ │ │ │ │ │ │ ├── VaultDepositConfirmation.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── VaultDepositTxDetails/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── VaultDepositTxInfo/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── VaultRedeemConfirmation/ │ │ │ │ │ │ ├── VaultRedeemConfirmation.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── mockData.ts │ │ │ │ │ ├── VaultRedeemTxDetails/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── VaultRedeemTxInfo/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useGetWidgetUrl.test.ts │ │ │ │ │ │ └── useIsEarnFeatureEnabled.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useGetWidgetUrl.ts │ │ │ │ │ └── useIsEarnFeatureEnabled.ts │ │ │ │ ├── index.ts │ │ │ │ ├── services/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils.ts │ │ │ │ └── types.ts │ │ │ ├── global-search/ │ │ │ │ ├── components/ │ │ │ │ │ ├── GlobalSearchInput/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── GlobalSearchModal/ │ │ │ │ │ │ ├── GlobalSearch.tsx │ │ │ │ │ │ ├── GlobalSearchModal.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── SearchSection/ │ │ │ │ │ ├── SearchSection.tsx │ │ │ │ │ ├── SectionVisibilityContext.tsx │ │ │ │ │ ├── SectionWrapper.tsx │ │ │ │ │ ├── sectionItems.ts │ │ │ │ │ └── sections/ │ │ │ │ │ ├── Accounts/ │ │ │ │ │ │ ├── AccountsSection.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── NavigateTo/ │ │ │ │ │ │ ├── NavigateToSection.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── TrustedSafes/ │ │ │ │ │ ├── TrustedSafesSection.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useGlobalSearchFilter.test.ts │ │ │ │ │ ├── useGlobalSearchFilter.ts │ │ │ │ │ └── useSearchKeyboardNavigation.ts │ │ │ │ ├── index.ts │ │ │ │ └── store/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── globalSearchSlice.test.ts │ │ │ │ ├── globalSearchSlice.ts │ │ │ │ └── index.ts │ │ │ ├── gtf/ │ │ │ │ ├── components/ │ │ │ │ │ ├── FeeInfoBanner/ │ │ │ │ │ │ ├── FeeInfoBanner.stories.tsx │ │ │ │ │ │ ├── FeeInfoBanner.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ └── FeesPreview/ │ │ │ │ │ ├── FeesPreview.stories.tsx │ │ │ │ │ ├── FeesPreview.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useFeesPreview.test.ts │ │ │ │ │ ├── useFeesPreview.ts │ │ │ │ │ └── useIsGtfSlotVisible.ts │ │ │ │ └── index.ts │ │ │ ├── hypernative/ │ │ │ │ ├── README.md │ │ │ │ ├── components/ │ │ │ │ │ ├── HnActivatedSettingsBanner/ │ │ │ │ │ │ ├── HnActivatedSettingsBanner.stories.tsx │ │ │ │ │ │ ├── HnActivatedSettingsBanner.tsx │ │ │ │ │ │ ├── config.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── HnAnalysisGroupCard/ │ │ │ │ │ │ ├── HnAnalysisGroupCard.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── HnBanner/ │ │ │ │ │ │ ├── HnBanner.stories.test.tsx │ │ │ │ │ │ ├── HnBanner.stories.tsx │ │ │ │ │ │ ├── HnBanner.test.tsx │ │ │ │ │ │ ├── HnBanner.tsx │ │ │ │ │ │ ├── HnBannerForCarousel.tsx │ │ │ │ │ │ ├── HnBannerForHistory.tsx │ │ │ │ │ │ ├── HnBannerForQueue.tsx │ │ │ │ │ │ ├── HnBannerWithDismissal.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── HnBanner.stories.test.tsx.snap │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── HnCustomChecksCard/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── HnCustomChecksCard.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── HnDashboardBanner/ │ │ │ │ │ │ ├── HnDashboardBanner.stories.test.tsx │ │ │ │ │ │ ├── HnDashboardBanner.stories.tsx │ │ │ │ │ │ ├── HnDashboardBanner.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── HnDashboardBanner.stories.test.tsx.snap │ │ │ │ │ │ ├── config.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── HnFeature/ │ │ │ │ │ │ ├── HnFeature.test.tsx │ │ │ │ │ │ └── HnFeature.tsx │ │ │ │ │ ├── HnInfoCard/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── HnInfoCard.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── HnLoginCard/ │ │ │ │ │ │ ├── HnLoginCard.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── HnLoginCard.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── HnMiniTxBanner/ │ │ │ │ │ │ ├── HnMiniTxBanner.stories.test.tsx │ │ │ │ │ │ ├── HnMiniTxBanner.stories.tsx │ │ │ │ │ │ ├── HnMiniTxBanner.tsx │ │ │ │ │ │ ├── HnMiniTxBannerWithDismissal.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── HnMiniTxBanner.stories.test.tsx.snap │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── HnPendingBanner/ │ │ │ │ │ │ ├── HnPendingBanner.stories.test.tsx │ │ │ │ │ │ ├── HnPendingBanner.stories.tsx │ │ │ │ │ │ ├── HnPendingBanner.tsx │ │ │ │ │ │ ├── HnPendingBannerWithDismissal.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── HnPendingBanner.stories.test.tsx.snap │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── HnQueueAssessment/ │ │ │ │ │ │ ├── HnQueueAssessment.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── HnQueueAssessmentBanner/ │ │ │ │ │ │ ├── HnQueueAssessmentBanner.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── HnQueueAssessmentBanner.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── HnQueueAssessmentProvider/ │ │ │ │ │ │ ├── HnQueueAssessmentProvider.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── HnSecurityReportBtn/ │ │ │ │ │ │ ├── HnSecurityReportBtn.stories.test.tsx │ │ │ │ │ │ ├── HnSecurityReportBtn.stories.tsx │ │ │ │ │ │ ├── HnSecurityReportBtn.tsx │ │ │ │ │ │ ├── HnSecurityReportBtnForTxDetails.tsx │ │ │ │ │ │ ├── HnSecurityReportBtnWithTxHash.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── HnSecurityReportBtn.stories.test.tsx.snap │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── HnSecurityReportBtnWithTxHash.test.tsx │ │ │ │ │ │ │ └── withGuardCheck.test.tsx │ │ │ │ │ │ ├── config.ts │ │ │ │ │ │ ├── styles.module.css │ │ │ │ │ │ ├── withGuardCheck.tsx │ │ │ │ │ │ └── withOwnerCheck.tsx │ │ │ │ │ ├── HnSecuritySection/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── HnSignupFlow/ │ │ │ │ │ │ ├── HnCalendlyStep.tsx │ │ │ │ │ │ ├── HnModal.stories.test.tsx │ │ │ │ │ │ ├── HnModal.stories.tsx │ │ │ │ │ │ ├── HnModal.tsx │ │ │ │ │ │ ├── HnSignupFlow.stories.test.tsx │ │ │ │ │ │ ├── HnSignupFlow.stories.tsx │ │ │ │ │ │ ├── HnSignupFlow.test.tsx │ │ │ │ │ │ ├── HnSignupFlow.tsx │ │ │ │ │ │ ├── HnSignupForm.test.tsx │ │ │ │ │ │ ├── HnSignupForm.tsx │ │ │ │ │ │ ├── HnSignupIntro.stories.test.tsx │ │ │ │ │ │ ├── HnSignupIntro.stories.tsx │ │ │ │ │ │ ├── HnSignupIntro.tsx │ │ │ │ │ │ ├── HnSignupLayout.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── HnModal.stories.test.tsx.snap │ │ │ │ │ │ │ ├── HnSignupFlow.stories.test.tsx.snap │ │ │ │ │ │ │ └── HnSignupIntro.stories.test.tsx.snap │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── HnCalendlyStep.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── HubSpotForm/ │ │ │ │ │ │ ├── HubSpotForm.stories.tsx │ │ │ │ │ │ ├── HubSpotForm.test.tsx │ │ │ │ │ │ ├── HubSpotForm.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── HypernativeLogo/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── HypernativeTooltip/ │ │ │ │ │ │ ├── HypernativeTooltip.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── SafeHeaderHnTooltip/ │ │ │ │ │ │ ├── SafeHeaderHnTooltip.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.ts │ │ │ │ │ ├── withHnBannerConditions/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── withHnFeature/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── withHnSignupFlow/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── config/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── oauth.test.ts │ │ │ │ │ └── oauth.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── contexts/ │ │ │ │ │ └── QueueAssessmentContext.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useAuthToken.test.ts │ │ │ │ │ │ ├── useBannerStorage.test.ts │ │ │ │ │ │ ├── useBannerVisibility.test.ts │ │ │ │ │ │ ├── useCalendly.test.ts │ │ │ │ │ │ ├── useHnAssessmentSeverity.test.ts │ │ │ │ │ │ ├── useHypernativeOAuth.test.tsx │ │ │ │ │ │ ├── useIsHypernativeEligible.test.tsx │ │ │ │ │ │ ├── useIsHypernativeGuard.test.ts │ │ │ │ │ │ ├── useShowHypernativeAssessment.test.ts │ │ │ │ │ │ ├── useThreatAnalysisHypernativeBatch.test.ts │ │ │ │ │ │ └── useTrackBannerEligibilityOnConnect.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useAssessmentUrl.ts │ │ │ │ │ ├── useAuthToken.ts │ │ │ │ │ ├── useBannerStorage.ts │ │ │ │ │ ├── useBannerVisibility.ts │ │ │ │ │ ├── useCalendly.ts │ │ │ │ │ ├── useHnAssessmentSeverity.ts │ │ │ │ │ ├── useHnQueueAssessment.ts │ │ │ │ │ ├── useHnQueueAssessmentResult.ts │ │ │ │ │ ├── useHypernativeOAuth.ts │ │ │ │ │ ├── useIsHypernativeEligible.ts │ │ │ │ │ ├── useIsHypernativeFeature.ts │ │ │ │ │ ├── useIsHypernativeGuard.ts │ │ │ │ │ ├── useIsHypernativeQueueScanFeature.ts │ │ │ │ │ ├── useShowHypernativeAssessment.ts │ │ │ │ │ ├── useThreatAnalysisHypernativeBatch.ts │ │ │ │ │ └── useTrackBannerEligibilityOnConnect.ts │ │ │ │ ├── index.ts │ │ │ │ ├── services/ │ │ │ │ │ ├── HypernativeGuard.abi.json │ │ │ │ │ ├── HypernativeGuardV2.abi.json │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── hypernativeGuardCheck.test.ts │ │ │ │ │ │ └── safeTxHashCalculation.test.ts │ │ │ │ │ ├── hypernativeGuardCheck.ts │ │ │ │ │ └── safeTxHashCalculation.ts │ │ │ │ ├── store/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── calendlySlice.test.ts │ │ │ │ │ │ ├── cookieStorage.test.ts │ │ │ │ │ │ └── hnStateSlice.test.ts │ │ │ │ │ ├── calendlySlice.ts │ │ │ │ │ ├── cookieStorage.ts │ │ │ │ │ ├── hnQueueAssessmentsSlice.ts │ │ │ │ │ ├── hnStateSlice.ts │ │ │ │ │ └── index.ts │ │ │ │ └── utils/ │ │ │ │ └── buildSecurityReportUrl.ts │ │ │ ├── ledger/ │ │ │ │ ├── components/ │ │ │ │ │ └── LedgerHashComparison/ │ │ │ │ │ ├── LedgerHashComparison.stories.tsx │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── index.ts │ │ │ │ ├── store/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ledgerHashStore.test.ts │ │ │ │ │ └── ledgerHashStore.ts │ │ │ │ └── types.ts │ │ │ ├── multichain/ │ │ │ │ ├── components/ │ │ │ │ │ ├── CreateSafeOnNewChain/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── NetworkLogosList/ │ │ │ │ │ │ ├── NetworkLogosList.stories.test.tsx │ │ │ │ │ │ ├── NetworkLogosList.stories.tsx │ │ │ │ │ │ ├── NetworkLogosList.test.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── NetworkLogosList.stories.test.tsx.snap │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── OutdatedMastercopyWarning/ │ │ │ │ │ │ ├── OutdatedMastercopyWarning.test.tsx │ │ │ │ │ │ └── OutdatedMastercopyWarning.tsx │ │ │ │ │ ├── SafeCreationNetworkInput/ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SignerSetupWarning/ │ │ │ │ │ │ ├── ChangeSignerSetupWarning.tsx │ │ │ │ │ │ └── InconsistentSignerSetupWarning.tsx │ │ │ │ │ └── UnsupportedMastercopyWarning/ │ │ │ │ │ └── UnsupportedMasterCopyWarning.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useAddNetworkState.test.ts │ │ │ │ │ │ ├── useCompatibleNetworks.test.ts │ │ │ │ │ │ └── useSafeCreationData.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useAddNetworkState.ts │ │ │ │ │ ├── useIsMultichainSafe.ts │ │ │ │ │ └── useSafeCreationData.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils/ │ │ │ │ ├── index.ts │ │ │ │ ├── utils.test.ts │ │ │ │ └── utils.ts │ │ │ ├── myAccounts/ │ │ │ │ ├── components/ │ │ │ │ │ ├── AccountItem/ │ │ │ │ │ │ ├── AccountItem.stories.tsx │ │ │ │ │ │ ├── AccountItemBalance.tsx │ │ │ │ │ │ ├── AccountItemButton.tsx │ │ │ │ │ │ ├── AccountItemChainBadge.tsx │ │ │ │ │ │ ├── AccountItemCheckbox.tsx │ │ │ │ │ │ ├── AccountItemContent.tsx │ │ │ │ │ │ ├── AccountItemContextMenu.tsx │ │ │ │ │ │ ├── AccountItemGroup.tsx │ │ │ │ │ │ ├── AccountItemIcon.tsx │ │ │ │ │ │ ├── AccountItemInfo.tsx │ │ │ │ │ │ ├── AccountItemLink.tsx │ │ │ │ │ │ ├── AccountItemPinButton.tsx │ │ │ │ │ │ ├── AccountItemQueueActions.tsx │ │ │ │ │ │ ├── AccountItemStatusChip.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── AccountItemPinButton.test.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── AccountItems/ │ │ │ │ │ │ ├── MultiAccountItem.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── AccountListFilters/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── AccountsHeader/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── AccountsList/ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── AccountsNavigation/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── AccountsWidget/ │ │ │ │ │ │ ├── AccountItemContent.tsx │ │ │ │ │ │ ├── AccountWidgetItem.tsx │ │ │ │ │ │ ├── AccountsWidget.stories.tsx │ │ │ │ │ │ ├── AccountsWidget.tsx │ │ │ │ │ │ ├── ExpandableAccountItem.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── AccountsWidget.test.tsx │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── AddNetworkButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── AllSafes/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ConnectWalletPrompt/ │ │ │ │ │ │ ├── ConnectWalletPrompt.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CreateButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CurrentSafe/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── DataWidget/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── FilteredSafes/ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── MigrationPrompt/ │ │ │ │ │ │ ├── MigrationPrompt.stories.tsx │ │ │ │ │ │ ├── MigrationPrompt.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── MyAccounts/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── MyAccountsV2/ │ │ │ │ │ │ ├── MyAccountsV2.tsx │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── AccountItem/ │ │ │ │ │ │ │ │ ├── MultiAccountItem.tsx │ │ │ │ │ │ │ │ ├── SingleAccountItem.tsx │ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ │ └── MultiAccountItem.test.tsx │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ ├── AccountsList/ │ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ │ └── AccountsSearch/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── NonPinnedWarning/ │ │ │ │ │ │ ├── AddTrustedSafeDialog.tsx │ │ │ │ │ │ ├── NonPinnedWarning.stories.tsx │ │ │ │ │ │ ├── NonPinnedWarning.test.tsx │ │ │ │ │ │ ├── SimilarAddressAlert.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── OrderByButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PinnedSafes/ │ │ │ │ │ │ ├── PinnedSafes.stories.tsx │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SafeSelectionModal/ │ │ │ │ │ │ ├── MultiChainSelectionItem.tsx │ │ │ │ │ │ ├── SafeSelectionItem.tsx │ │ │ │ │ │ ├── SafeSelectionList.tsx │ │ │ │ │ │ ├── SafeSelectionModal.stories.tsx │ │ │ │ │ │ ├── SafeSelectionModal.test.tsx │ │ │ │ │ │ ├── SecurityBanner.tsx │ │ │ │ │ │ ├── SelectAllConfirmDialog.tsx │ │ │ │ │ │ ├── SimilarityConfirmDialog.stories.tsx │ │ │ │ │ │ ├── SimilarityConfirmDialog.test.tsx │ │ │ │ │ │ ├── SimilarityConfirmDialog.tsx │ │ │ │ │ │ ├── SimilarityWarning.stories.tsx │ │ │ │ │ │ ├── SimilarityWarning.test.tsx │ │ │ │ │ │ ├── SimilarityWarning.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── SafesList/ │ │ │ │ │ ├── SafeListItem.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useMultiAccountItemData.test.ts │ │ │ │ │ │ ├── usePinActions.test.ts │ │ │ │ │ │ ├── useSafeItemData.test.ts │ │ │ │ │ │ └── useSingleChainPinActions.test.ts │ │ │ │ │ ├── useHasSafes.ts │ │ │ │ │ ├── useMigrationPrompt.ts │ │ │ │ │ ├── useMultiAccountItemData.ts │ │ │ │ │ ├── useNetworksOfSafe.ts │ │ │ │ │ ├── useNonPinnedSafeWarning.test.ts │ │ │ │ │ ├── useNonPinnedSafeWarning.ts │ │ │ │ │ ├── useNonPinnedSafeWarning.types.ts │ │ │ │ │ ├── usePinActions.ts │ │ │ │ │ ├── useSafeItemData.ts │ │ │ │ │ ├── useSafeSelectionModal.test.ts │ │ │ │ │ ├── useSafeSelectionModal.ts │ │ │ │ │ ├── useSafeSelectionModal.types.ts │ │ │ │ │ ├── useSimilarAddressDetection.ts │ │ │ │ │ ├── useSingleChainPinActions.ts │ │ │ │ │ ├── useSpaceAccountsData.ts │ │ │ │ │ ├── useTrackedSafesCount.ts │ │ │ │ │ ├── useTrustSafe.ts │ │ │ │ │ └── useVisitedSafes.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── styles.module.css │ │ │ │ └── types.ts │ │ │ ├── nfts/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── NftCollections.test.tsx │ │ │ │ ├── components/ │ │ │ │ │ ├── NftCollections/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── NftGrid/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── NftPreviewModal/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── NftSendForm/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── NftsPage/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── config.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ └── index.ts │ │ │ ├── no-fee-campaign/ │ │ │ │ ├── components/ │ │ │ │ │ ├── GasTooHighBanner/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── NoFeeCampaignBanner/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── NoFeeCampaignTransactionCard/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── useGasTooHigh.ts │ │ │ │ │ ├── useIsNoFeeCampaignEnabled.ts │ │ │ │ │ └── useNoFeeCampaignEligibility.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ └── index.ts │ │ │ ├── oidc-auth/ │ │ │ │ ├── components/ │ │ │ │ │ ├── EmailSignInButton/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── GoogleSignInButton/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── OidcSignInButton/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useOidcLogin.test.ts │ │ │ │ │ │ └── useOidcLoginCallback.test.ts │ │ │ │ │ ├── useOidcLogin.ts │ │ │ │ │ └── useOidcLoginCallback.ts │ │ │ │ └── index.ts │ │ │ ├── portfolio/ │ │ │ │ ├── components/ │ │ │ │ │ └── PortfolioRefreshHint/ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ └── usePortfolioRefetchOnTxHistory.ts │ │ │ │ └── index.ts │ │ │ ├── positions/ │ │ │ │ ├── components/ │ │ │ │ │ ├── PositionGroup/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PositionsEmpty/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PositionsHeader/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PositionsSkeleton/ │ │ │ │ │ │ ├── PositionsSkeleton.stories.test.tsx │ │ │ │ │ │ ├── PositionsSkeleton.stories.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── PositionsSkeleton.stories.test.tsx.snap │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PositionsUnavailable/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PositionsWidget/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ └── RefreshPositionsButton/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── RefreshPositionsButton.test.tsx │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── usePositions.test.ts │ │ │ │ │ ├── useIsPositionsFeatureEnabled.ts │ │ │ │ │ ├── usePositions.ts │ │ │ │ │ └── usePositionsFiatTotal.ts │ │ │ │ ├── index.tsx │ │ │ │ └── utils.ts │ │ │ ├── proposers/ │ │ │ │ ├── components/ │ │ │ │ │ ├── DelegationErrorBoundary.tsx │ │ │ │ │ ├── DeleteProposerDialog.tsx │ │ │ │ │ ├── EditProposerDialog.tsx │ │ │ │ │ ├── PendingDelegation.tsx │ │ │ │ │ ├── PendingDelegationsList.tsx │ │ │ │ │ ├── TxProposalChip.tsx │ │ │ │ │ ├── UpsertProposer.test.tsx │ │ │ │ │ └── UpsertProposer.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useDelegatorSelection.test.ts │ │ │ │ │ │ ├── useParentSafeThreshold.test.ts │ │ │ │ │ │ ├── usePendingDelegations.test.ts │ │ │ │ │ │ └── useSubmitDelegation.test.ts │ │ │ │ │ ├── useDelegatorSelection.ts │ │ │ │ │ ├── useParentSafeThreshold.ts │ │ │ │ │ ├── usePendingDelegations.ts │ │ │ │ │ └── useSubmitDelegation.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── services/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── delegationMessages.test.ts │ │ │ │ │ └── delegationMessages.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils/ │ │ │ │ ├── delegationFilters.ts │ │ │ │ ├── delegationParsing.ts │ │ │ │ ├── totp.ts │ │ │ │ ├── utils.test.ts │ │ │ │ └── utils.ts │ │ │ ├── recovery/ │ │ │ │ ├── README.md │ │ │ │ ├── components/ │ │ │ │ │ ├── CancelRecoveryButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CancelRecoveryReview/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ExecuteRecoveryButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── GroupedRecoveryListItems/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── RecoverAccountReview/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Recovery/ │ │ │ │ │ │ ├── RecoveryContent.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryCards/ │ │ │ │ │ │ ├── RecoveryInProgressCard.tsx │ │ │ │ │ │ ├── RecoveryProposalCard.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── RecoveryInProgressCard.test.tsx │ │ │ │ │ │ │ └── RecoveryProposalCard.test.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── RecoveryContext/ │ │ │ │ │ │ ├── RecoveryContextHooks.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── useRecoveryDelayModifiers.test.ts │ │ │ │ │ │ │ ├── useRecoveryPendingTxs.test.ts │ │ │ │ │ │ │ ├── useRecoveryState.test.tsx │ │ │ │ │ │ │ └── useRecoverySuccessEvents.test.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── useRecoveryDelayModifiers.ts │ │ │ │ │ │ ├── useRecoveryPendingTxs.ts │ │ │ │ │ │ ├── useRecoveryState.ts │ │ │ │ │ │ └── useRecoverySuccessEvents.ts │ │ │ │ │ ├── RecoveryDescription/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryDetails/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryHeader/ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryInfo/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryList/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryListItem/ │ │ │ │ │ │ ├── RecoveryListItemContext.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryModal/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoverySettings/ │ │ │ │ │ │ ├── DelayModifierRow.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── RecoverySigners/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryStatus/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoverySummary/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RecoveryType/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── RecoveryValidationErrors/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useClock.test.ts │ │ │ │ │ │ ├── useIsValidExecution.test.ts │ │ │ │ │ │ ├── useIsValidRecoveryExecution.test.ts │ │ │ │ │ │ └── useRecoveryTxState.test.tsx │ │ │ │ │ ├── useClock.ts │ │ │ │ │ ├── useIsRecoverer.ts │ │ │ │ │ ├── useIsRecoverySupported.ts │ │ │ │ │ ├── useIsValidRecoveryExecution.ts │ │ │ │ │ ├── useRecovery.ts │ │ │ │ │ ├── useRecoveryQueue.ts │ │ │ │ │ ├── useRecoveryTxNotification.ts │ │ │ │ │ └── useRecoveryTxState.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── index.ts │ │ │ │ └── services/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── delay-modifier.test.ts │ │ │ │ │ ├── proxies.test.ts │ │ │ │ │ ├── recovery-state.test.ts │ │ │ │ │ ├── selectors.test.ts │ │ │ │ │ ├── setup.test.ts │ │ │ │ │ ├── transaction-list.test.ts │ │ │ │ │ └── transaction.test.ts │ │ │ │ ├── delay-modifier.ts │ │ │ │ ├── proxies.ts │ │ │ │ ├── recovery-sender.ts │ │ │ │ ├── recovery-state.ts │ │ │ │ ├── recoveryEvents.ts │ │ │ │ ├── selectors.ts │ │ │ │ ├── setup.ts │ │ │ │ ├── transaction-list.ts │ │ │ │ └── transaction.ts │ │ │ ├── safe-overview/ │ │ │ │ ├── components/ │ │ │ │ │ └── AccountHeader/ │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── safe-shield/ │ │ │ │ ├── SafeShield.stories.test.tsx │ │ │ │ ├── SafeShield.stories.tsx │ │ │ │ ├── SafeShieldContext.tsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── SafeShield.stories.test.tsx.snap │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── SafeShieldContext.test.tsx │ │ │ │ │ └── SafeShieldWidget.test.tsx │ │ │ │ ├── components/ │ │ │ │ │ ├── AddressChanges/ │ │ │ │ │ │ ├── AddressChanges.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── AddressImage/ │ │ │ │ │ │ ├── AddressImage.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── AnalysisDetailsDropdown/ │ │ │ │ │ │ ├── AnalysisDetailsDropdown.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── AnalysisDetailsDropdown.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── AnalysisGroupCard/ │ │ │ │ │ │ ├── AnalysisCardItemWithLink.tsx │ │ │ │ │ │ ├── AnalysisGroupCard.tsx │ │ │ │ │ │ ├── AnalysisGroupCardItem.tsx │ │ │ │ │ │ ├── DelegateCallCardItem.tsx │ │ │ │ │ │ ├── FallbackHandlerCardItem.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── AnalysisGroupCardItem.test.tsx │ │ │ │ │ │ │ └── ShowAllAddress.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── AnalysisIssuesDisplay/ │ │ │ │ │ │ ├── AnalysisIssuesDisplay.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── AnalysisIssuesDisplay.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ReportFalseResultModal/ │ │ │ │ │ │ ├── ReportFalseResultModal.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── ReportFalseResultModal.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── SafeShieldContent/ │ │ │ │ │ │ ├── SafeShieldAnalysisEmpty.tsx │ │ │ │ │ │ ├── SafeShieldAnalysisLoading.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SafeShieldDisplay.tsx │ │ │ │ │ ├── SafeShieldHeader.tsx │ │ │ │ │ ├── SeverityIcon.tsx │ │ │ │ │ ├── ShowAllAddress/ │ │ │ │ │ │ └── ShowAllAddress.tsx │ │ │ │ │ ├── TenderlySimulation.tsx │ │ │ │ │ ├── ThreatAnalysis/ │ │ │ │ │ │ ├── AnalysisGroupCardDisabled.tsx │ │ │ │ │ │ ├── ThreatAnalysis.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── AnalysisGroupCardDisabled.test.tsx │ │ │ │ │ │ │ └── ThreatAnalysis.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── UntrustedSafeWarning/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── SafeShieldDisplay.test.tsx │ │ │ │ │ │ └── useNestedTransaction.test.tsx │ │ │ │ │ └── useNestedTransaction.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useNestedThreatAnalysis.test.tsx │ │ │ │ │ │ └── useThreatAnalysis.test.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useCheckSimulation.ts │ │ │ │ │ ├── useCounterpartyAnalysis.ts │ │ │ │ │ ├── useDelayedLoading.ts │ │ │ │ │ ├── useNestedThreatAnalysis.ts │ │ │ │ │ ├── useRecipientAnalysis.ts │ │ │ │ │ ├── useReportFalseResult.ts │ │ │ │ │ ├── useThreatAnalysis.ts │ │ │ │ │ └── useUntrustedSafeAnalysis.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ └── index.tsx │ │ │ ├── security/ │ │ │ │ ├── SECURITY_CHECKS_MATRIX.md │ │ │ │ ├── contract.ts │ │ │ │ ├── data/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── securityScoring.test.ts │ │ │ │ │ ├── scanResultsCache.ts │ │ │ │ │ ├── scanners/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── accountSetup.test.ts │ │ │ │ │ │ │ ├── contractVersion.test.ts │ │ │ │ │ │ │ ├── defaultValues.test.ts │ │ │ │ │ │ │ ├── factoryValidation.test.ts │ │ │ │ │ │ │ ├── fallbackHandler.test.ts │ │ │ │ │ │ │ ├── guard.test.ts │ │ │ │ │ │ │ ├── modules.test.ts │ │ │ │ │ │ │ ├── multichainSetup.test.ts │ │ │ │ │ │ │ ├── pendingTx.test.ts │ │ │ │ │ │ │ ├── recovery.test.ts │ │ │ │ │ │ │ ├── signerIntegrity.test.ts │ │ │ │ │ │ │ ├── transactionScanning.test.ts │ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ │ ├── accountSetup.ts │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── contractVersion.ts │ │ │ │ │ │ ├── factoryValidation.ts │ │ │ │ │ │ ├── fallbackHandler.ts │ │ │ │ │ │ ├── guard.ts │ │ │ │ │ │ ├── modules.ts │ │ │ │ │ │ ├── multichainSetup.ts │ │ │ │ │ │ ├── pendingTx.ts │ │ │ │ │ │ ├── recovery.ts │ │ │ │ │ │ ├── registry.ts │ │ │ │ │ │ ├── signerIntegrity.ts │ │ │ │ │ │ ├── test-helpers.ts │ │ │ │ │ │ ├── transactionScanning.ts │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── securityChecks.ts │ │ │ │ │ ├── securityScoring.ts │ │ │ │ │ └── securityTypes.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useSecurityHubFeatureRedirect.test.ts │ │ │ │ │ │ └── useSecurityScan.test.ts │ │ │ │ │ ├── useSecurityHubFeatureRedirect.ts │ │ │ │ │ └── useSecurityScan.ts │ │ │ │ ├── index.ts │ │ │ │ ├── testing.ts │ │ │ │ └── types.ts │ │ │ ├── spaces/ │ │ │ │ ├── components/ │ │ │ │ │ ├── AddAccounts/ │ │ │ │ │ │ ├── AddManually.tsx │ │ │ │ │ │ ├── SafesList.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── AddAccounts.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── AddMemberModal/ │ │ │ │ │ │ ├── AddMemberModal.test.tsx │ │ │ │ │ │ ├── MemberInfoForm.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── AddToSpacePopupModal/ │ │ │ │ │ │ ├── AddToSpacePopupModal.stories.tsx │ │ │ │ │ │ ├── AddToSpacePopupModal.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ └── AddToSpacePopupModal.test.tsx │ │ │ │ │ ├── AuthState/ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── CreateSpaceOnboarding/ │ │ │ │ │ │ ├── CreateSpaceOnboarding.stories.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── useExistingSpace.ts │ │ │ │ │ │ │ ├── useSpaceSubmit.test.ts │ │ │ │ │ │ │ └── useSpaceSubmit.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── Dashboard/ │ │ │ │ │ │ ├── AddAccountsCard.tsx │ │ │ │ │ │ ├── AggregatedBalances.tsx │ │ │ │ │ │ ├── DashboardHeader.stories.tsx │ │ │ │ │ │ ├── DashboardHeader.tsx │ │ │ │ │ │ ├── HeaderActions.stories.tsx │ │ │ │ │ │ ├── HeaderActions.tsx │ │ │ │ │ │ ├── ImportAddressBookCard.tsx │ │ │ │ │ │ ├── MembersCard.tsx │ │ │ │ │ │ ├── Page.tsx │ │ │ │ │ │ ├── PendingTxWidget.stories.tsx │ │ │ │ │ │ ├── PendingTxWidget.tsx │ │ │ │ │ │ ├── SpacesCTACard.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── PendingTxWidget.test.tsx │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── HeaderNavigation/ │ │ │ │ │ │ ├── HeaderNavigation.stories.tsx │ │ │ │ │ │ ├── HeaderNavigation.test.tsx │ │ │ │ │ │ ├── HeaderNavigation.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── InitialsAvatar/ │ │ │ │ │ │ ├── InitialsAvatar.stories.test.tsx │ │ │ │ │ │ ├── InitialsAvatar.stories.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── InitialsAvatar.stories.test.tsx.snap │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── InviteBanner/ │ │ │ │ │ │ ├── AcceptButton.tsx │ │ │ │ │ │ ├── AcceptInviteDialog.test.tsx │ │ │ │ │ │ ├── AcceptInviteDialog.tsx │ │ │ │ │ │ ├── DeclineButton.tsx │ │ │ │ │ │ ├── DeclineInviteDialog.test.tsx │ │ │ │ │ │ ├── DeclineInviteDialog.tsx │ │ │ │ │ │ ├── PreviewInvite.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── InviteMembersOnboarding/ │ │ │ │ │ │ ├── InviteMembersOnboarding.stories.tsx │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── AddressIdenticon.tsx │ │ │ │ │ │ │ ├── EnsAddressIdenticon.tsx │ │ │ │ │ │ │ └── MemberInviteRow.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── useInviteForm.test.tsx │ │ │ │ │ │ │ ├── useInviteForm.ts │ │ │ │ │ │ │ └── useInviteNavigation.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── LoadingState/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Members/ │ │ │ │ │ │ ├── Page.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── MembersList/ │ │ │ │ │ │ ├── EditMemberDialog.tsx │ │ │ │ │ │ ├── MemberName.tsx │ │ │ │ │ │ ├── RemoveMemberDialog.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SafeAccounts/ │ │ │ │ │ │ ├── AccountsSafesList.tsx │ │ │ │ │ │ ├── EmptySafeAccounts.tsx │ │ │ │ │ │ ├── Page.tsx │ │ │ │ │ │ ├── RemoveSafeDialog.tsx │ │ │ │ │ │ ├── SafeCardReadOnly.tsx │ │ │ │ │ │ ├── SafeCardsErrorBoundary.tsx │ │ │ │ │ │ ├── SendTransactionButton.tsx │ │ │ │ │ │ ├── SpaceSafeContextMenu.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── SpaceSafeContextMenu.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SafeSelectorDropdown/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── SafeSelectorDropdown.stories.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── SafeSelectorDropdown.test.tsx │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── AllNetworksSection.tsx │ │ │ │ │ │ │ ├── BalanceDisplay.tsx │ │ │ │ │ │ │ ├── ChainLogo.tsx │ │ │ │ │ │ │ ├── ChainSelectorBlock.tsx │ │ │ │ │ │ │ ├── MultiChainSafeItemRow.tsx │ │ │ │ │ │ │ ├── SafeBalanceBlock.tsx │ │ │ │ │ │ │ ├── SafeDropdownContainer.tsx │ │ │ │ │ │ │ ├── SafeInfoDisplay.tsx │ │ │ │ │ │ │ ├── SafeItem.tsx │ │ │ │ │ │ │ ├── SafeSelectorTriggerContent.tsx │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ ├── AllNetworksSection.test.tsx │ │ │ │ │ │ │ ├── MultiChainSafeItemRow.test.tsx │ │ │ │ │ │ │ ├── SafeDropdownContainer.test.tsx │ │ │ │ │ │ │ └── SafeSelectorTriggerContent.test.tsx │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── useSafeSelectorState.test.ts │ │ │ │ │ │ │ └── useSafeSelectorState.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ ├── utils/ │ │ │ │ │ │ │ └── classVariants.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── SafeWidget/ │ │ │ │ │ │ ├── SafeWidget.stories.tsx │ │ │ │ │ │ ├── SafeWidgetRoot.tsx │ │ │ │ │ │ ├── WidgetEmptyState.tsx │ │ │ │ │ │ ├── WidgetErrorState.tsx │ │ │ │ │ │ ├── WidgetFooter.tsx │ │ │ │ │ │ ├── WidgetItem.tsx │ │ │ │ │ │ ├── WidgetItemSkeleton.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── WidgetEmptyState.test.tsx │ │ │ │ │ │ │ └── WidgetErrorState.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SearchInput/ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SecurityHub/ │ │ │ │ │ │ ├── Page.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── SecurityPanelView.test.tsx │ │ │ │ │ │ │ ├── SecuritySafesTable.test.tsx │ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── SafeGradeChip/ │ │ │ │ │ │ │ │ └── SafeGradeChip.tsx │ │ │ │ │ │ │ ├── SecurityPanelView/ │ │ │ │ │ │ │ │ ├── PanelHeader.tsx │ │ │ │ │ │ │ │ ├── SectionPanel.tsx │ │ │ │ │ │ │ │ ├── SecurityChecksSection.tsx │ │ │ │ │ │ │ │ ├── SecurityPanelView.stories.test.tsx │ │ │ │ │ │ │ │ ├── SecurityPanelView.stories.tsx │ │ │ │ │ │ │ │ ├── SecurityPanelView.tsx │ │ │ │ │ │ │ │ ├── SignersSection.tsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ └── SecurityPanelView.stories.test.tsx.snap │ │ │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ │ │ ├── usePanelHeader.ts │ │ │ │ │ │ │ │ │ ├── useSecurityChecks.tsx │ │ │ │ │ │ │ │ │ └── useSignerRows.tsx │ │ │ │ │ │ │ │ └── primitives.tsx │ │ │ │ │ │ │ ├── SecurityReportDrawer/ │ │ │ │ │ │ │ │ ├── SecurityReportDrawer.stories.test.tsx │ │ │ │ │ │ │ │ ├── SecurityReportDrawer.stories.tsx │ │ │ │ │ │ │ │ ├── SecurityReportDrawer.tsx │ │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ │ └── SecurityReportDrawer.stories.test.tsx.snap │ │ │ │ │ │ │ ├── SecuritySafesTable/ │ │ │ │ │ │ │ │ ├── MultichainSafeRow.tsx │ │ │ │ │ │ │ │ ├── SecuritySafesTable.stories.test.tsx │ │ │ │ │ │ │ │ ├── SecuritySafesTable.stories.tsx │ │ │ │ │ │ │ │ ├── SecuritySafesTable.tsx │ │ │ │ │ │ │ │ ├── SingleSafeRow.tsx │ │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ │ └── SecuritySafesTable.stories.test.tsx.snap │ │ │ │ │ │ │ │ ├── cells.tsx │ │ │ │ │ │ │ │ ├── constants.tsx │ │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ │ ├── StatusCell/ │ │ │ │ │ │ │ │ └── StatusCell.tsx │ │ │ │ │ │ │ └── WorkspaceHealthCard/ │ │ │ │ │ │ │ ├── WorkspaceHealthCard.stories.test.tsx │ │ │ │ │ │ │ ├── WorkspaceHealthCard.stories.tsx │ │ │ │ │ │ │ ├── WorkspaceHealthCard.tsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ └── WorkspaceHealthCard.stories.test.tsx.snap │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ ├── useAutoScanOrchestrator.test.ts │ │ │ │ │ │ │ │ ├── useReconciledSpaceSafes.test.ts │ │ │ │ │ │ │ │ ├── useReportDrawer.test.ts │ │ │ │ │ │ │ │ └── useScanResultsState.test.ts │ │ │ │ │ │ │ ├── useAutoScanOrchestrator.ts │ │ │ │ │ │ │ ├── useReconciledSpaceSafes.ts │ │ │ │ │ │ │ ├── useReportDrawer.ts │ │ │ │ │ │ │ └── useScanResultsState.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── SelectAllToggle/ │ │ │ │ │ │ ├── SelectAllToggle.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ └── SelectAllToggle.test.tsx │ │ │ │ │ ├── SelectSafeModal/ │ │ │ │ │ │ ├── SafeSearch.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── useSafeActionMapper.test.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── useSafeActionMapper.tsx │ │ │ │ │ ├── SelectSafesOnboarding/ │ │ │ │ │ │ ├── SelectSafesOnboarding.stories.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── OnboardingSelectAllForm.test.tsx │ │ │ │ │ │ │ └── SelectSafesOnboarding.test.tsx │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── ChainLogo.tsx │ │ │ │ │ │ │ ├── ConnectWalletPrompt.tsx │ │ │ │ │ │ │ ├── FiatBalance.tsx │ │ │ │ │ │ │ ├── OnboardingSafesList.tsx │ │ │ │ │ │ │ ├── SafeAvatar.tsx │ │ │ │ │ │ │ ├── SafeCard.tsx │ │ │ │ │ │ │ ├── SafeCardLayout.tsx │ │ │ │ │ │ │ ├── SimilarAddressAlert.tsx │ │ │ │ │ │ │ ├── StepIndicator.tsx │ │ │ │ │ │ │ ├── ThresholdBadge.tsx │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ ├── ConnectWalletPrompt.test.tsx │ │ │ │ │ │ │ ├── OnboardingSafesList.test.tsx │ │ │ │ │ │ │ └── SafeCard.test.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ ├── useOnboardingSafes.test.ts │ │ │ │ │ │ │ │ └── useOnboardingSubmit.test.ts │ │ │ │ │ │ │ ├── useOnboardingNavigation.ts │ │ │ │ │ │ │ ├── useOnboardingSafes.ts │ │ │ │ │ │ │ ├── useOnboardingSubmit.ts │ │ │ │ │ │ │ └── useSafeCardData.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SetupWidget/ │ │ │ │ │ │ ├── SetupWidget.stories.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── SetupWidget.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Sidebar/ │ │ │ │ │ │ ├── ApiCtaSidebar/ │ │ │ │ │ │ │ ├── ApiCtaSidebar.stories.tsx │ │ │ │ │ │ │ ├── ApiCtaSidebar.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── ApiCtaSidebar.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── BackToSpaceButton/ │ │ │ │ │ │ │ ├── BackToSpaceButton.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── NewTransactionButton/ │ │ │ │ │ │ │ ├── SidebarActionButton.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SidebarActionButton.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SafeSidebar.stories.tsx │ │ │ │ │ │ ├── SidebarCommonFooter/ │ │ │ │ │ │ │ ├── SidebarCommonFooter.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SidebarCommonFooter.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SidebarIndexingStatus/ │ │ │ │ │ │ │ ├── SidebarIndexingStatus.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SidebarIndexingStatus.test.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ │ ├── SidebarProfileSection.stories.tsx │ │ │ │ │ │ ├── SidebarProfileSection.tsx │ │ │ │ │ │ ├── SidebarSkeleton/ │ │ │ │ │ │ │ ├── SidebarSkeleton.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── SidebarTopBar/ │ │ │ │ │ │ │ ├── SidebarTopBar.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SidebarTopBar.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SpacesEnhancedSidebar/ │ │ │ │ │ │ │ ├── SpacesEnhancedSidebar.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SpacesEnhancedSidebar.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SpacesSidebar.stories.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── EnhancedSidebar.test.tsx │ │ │ │ │ │ │ ├── SidebarProfileSection.test.tsx │ │ │ │ │ │ │ ├── getSidebarVariant.test.ts │ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ ├── useAddSafeToSpace.test.ts │ │ │ │ │ │ │ │ ├── useResolvedSidebarNav.test.ts │ │ │ │ │ │ │ │ └── useSidebarHydrated.test.ts │ │ │ │ │ │ │ ├── useAddSafeToSpace.ts │ │ │ │ │ │ │ ├── useResolvedSidebarNav.ts │ │ │ │ │ │ │ └── useSidebarHydrated.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── styles.module.css │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ ├── utils/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── variants/ │ │ │ │ │ │ ├── NavItem/ │ │ │ │ │ │ │ ├── NavItem.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── NavItem.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SafeSidebarContent/ │ │ │ │ │ │ │ ├── SafeSidebarContent.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SafeSidebarContent.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SafeSidebarVariant/ │ │ │ │ │ │ │ ├── SafeSidebarVariant.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SafeSidebarVariant.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SafeSidebarWorkspaceHeader/ │ │ │ │ │ │ │ ├── SafeSidebarWorkspaceHeader.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SafeSidebarWorkspaceHeader.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SpaceSelectorDropdown/ │ │ │ │ │ │ │ ├── SpaceSelectorDropdown.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SpaceSelectorDropdown.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SpacesSidebarContent/ │ │ │ │ │ │ │ ├── SpacesSidebarContent.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SpacesSidebarContent.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── SpacesSidebarVariant/ │ │ │ │ │ │ │ ├── SpacesSidebarVariant.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── SpacesSidebarVariant.test.tsx │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── SignInButton/ │ │ │ │ │ │ ├── SignInButton.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SignInOptions/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SignedOutState/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SpaceAddressBook/ │ │ │ │ │ │ ├── ActivityLog.tsx │ │ │ │ │ │ ├── AddContact.tsx │ │ │ │ │ │ ├── AddPrivateContact.tsx │ │ │ │ │ │ ├── AddToWorkspaceButton.tsx │ │ │ │ │ │ ├── DeleteContactDialog.tsx │ │ │ │ │ │ ├── EditContactDialog.tsx │ │ │ │ │ │ ├── EmptyAddressBook.tsx │ │ │ │ │ │ ├── Import/ │ │ │ │ │ │ │ ├── ContactsList.tsx │ │ │ │ │ │ │ ├── ImportAddressBookDialog.tsx │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── ImportAddressBookDialog.test.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── Page.tsx │ │ │ │ │ │ ├── PendingRequestsTable.tsx │ │ │ │ │ │ ├── RemoveDuplicateButton.tsx │ │ │ │ │ │ ├── RequestToAddButton.tsx │ │ │ │ │ │ ├── SpaceAddressBookActions.tsx │ │ │ │ │ │ ├── SpaceAddressBookTable.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── ActivityLog.test.ts │ │ │ │ │ │ │ ├── SpaceAddressBookTable.test.tsx │ │ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── useContactSearch.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── SpaceBreadcrumbs/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SpaceCard/ │ │ │ │ │ │ ├── SpaceContextMenu.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SpaceCardNew/ │ │ │ │ │ │ ├── SpaceCardNew.stories.tsx │ │ │ │ │ │ ├── SpaceContextMenuNew.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SpaceCreationModal/ │ │ │ │ │ │ ├── SpaceCreationModal.test.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SpaceInfoModal/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SpaceSettings/ │ │ │ │ │ │ ├── DeleteSpaceDialog.tsx │ │ │ │ │ │ ├── ErrorAlert.tsx │ │ │ │ │ │ ├── LeaveSpaceDialog.tsx │ │ │ │ │ │ ├── Page.tsx │ │ │ │ │ │ ├── UpdateSpaceDialog.tsx │ │ │ │ │ │ ├── UpdateSpaceForm.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── UpdateSpaceForm.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── styles.module.css │ │ │ │ │ │ └── useUpdateSpace.ts │ │ │ │ │ ├── SpaceSidebar/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SpaceSidebarNavigation/ │ │ │ │ │ │ ├── config.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SpaceSidebarSelector/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SpacesDashboardWidget/ │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SpacesFeedbackPopup/ │ │ │ │ │ │ ├── SpacesFeedbackPopup.stories.tsx │ │ │ │ │ │ ├── SpacesFeedbackPopup.tsx │ │ │ │ │ │ ├── SpacesFeedbackPopupContainer.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── SpacesFeedbackPopup.test.tsx │ │ │ │ │ │ │ └── SpacesFeedbackPopupContainer.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── SpacesList/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── SpacesList.test.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── StepIndicator/ │ │ │ │ │ │ ├── StepIndicator.stories.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── TotalValueElement/ │ │ │ │ │ │ ├── TotalValueElement.stories.tsx │ │ │ │ │ │ ├── TotalValueElement.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── UnauthorizedState/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── UserSettings/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── selectAllHelpers.test.ts │ │ │ │ │ │ ├── useAllMembers.test.ts │ │ │ │ │ │ ├── useAutoScan.test.ts │ │ │ │ │ │ ├── useCurrentMemberProfile.test.ts │ │ │ │ │ │ ├── useGetSpaceAddressBook.test.ts │ │ │ │ │ │ ├── useIsQualifiedSafe.test.ts │ │ │ │ │ │ ├── useSafeScanContext.test.ts │ │ │ │ │ │ ├── useSelectAll.test.tsx │ │ │ │ │ │ ├── useSpacePendingTransactions.test.ts │ │ │ │ │ │ ├── useSpaceSafes.test.tsx │ │ │ │ │ │ ├── useSpaceSafesWithQueue.test.ts │ │ │ │ │ │ └── useTrackSpace.test.ts │ │ │ │ │ ├── selectAllHelpers.ts │ │ │ │ │ ├── useAddressBookSearch.ts │ │ │ │ │ ├── useAutoScan.ts │ │ │ │ │ ├── useCurrentSpaceId.ts │ │ │ │ │ ├── useFeatureFlagRedirect.ts │ │ │ │ │ ├── useGetAddressBookRequests.ts │ │ │ │ │ ├── useGetPrivateAddressBook.ts │ │ │ │ │ ├── useGetSpaceAddressBook.ts │ │ │ │ │ ├── useIsLastActiveAdmin.ts │ │ │ │ │ ├── useIsQualifiedSafe.ts │ │ │ │ │ ├── useMembersSearch.ts │ │ │ │ │ ├── useSafeScanContext.ts │ │ │ │ │ ├── useSelectAll.ts │ │ │ │ │ ├── useSelectAll.types.ts │ │ │ │ │ ├── useSpaceMembers.tsx │ │ │ │ │ ├── useSpacePendingTransactions.ts │ │ │ │ │ ├── useSpaceSafes.tsx │ │ │ │ │ ├── useSpaceSafesWithQueue.ts │ │ │ │ │ └── useTrackSpace.ts │ │ │ │ ├── index.ts │ │ │ │ ├── store/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── safeActionsModalSlice.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ ├── speedup/ │ │ │ │ ├── components/ │ │ │ │ │ ├── SpeedUpModal/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── SpeedUpMonitor/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── index.ts │ │ │ │ └── services/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── isSpeedableTx.test.ts │ │ │ │ └── isSpeedableTx.ts │ │ │ ├── spending-limits/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── spendingLimitDeployments.test.ts │ │ │ │ │ └── spendingLimitLoader.test.ts │ │ │ │ ├── components/ │ │ │ │ │ ├── CreateSpendingLimit/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── RemoveSpendingLimitReview/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ReviewSpendingLimit/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ReviewSpendingLimitTx/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SpendingLimitRow/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SpendingLimitsLoader/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── SpendingLimitsSettings/ │ │ │ │ │ ├── NoSpendingLimits.tsx │ │ │ │ │ ├── SpendingLimits.stories.tsx │ │ │ │ │ ├── SpendingLimitsTable.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── docs/ │ │ │ │ │ └── README.md │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useSpendingLimits.test.ts │ │ │ │ │ ├── useIsOnlySpendingLimitBeneficiary.ts │ │ │ │ │ ├── useSpendingLimit.ts │ │ │ │ │ ├── useSpendingLimitGas.ts │ │ │ │ │ └── useSpendingLimits.ts │ │ │ │ ├── index.ts │ │ │ │ ├── services/ │ │ │ │ │ ├── spendingLimitContracts.ts │ │ │ │ │ ├── spendingLimitDeployments.ts │ │ │ │ │ ├── spendingLimitExecution.ts │ │ │ │ │ ├── spendingLimitLoader.ts │ │ │ │ │ └── spendingLimitParams.ts │ │ │ │ ├── store/ │ │ │ │ │ └── spendingLimitsSlice.ts │ │ │ │ └── types.ts │ │ │ ├── stake/ │ │ │ │ ├── components/ │ │ │ │ │ ├── StakeButton/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── StakePage/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── StakingConfirmationTx/ │ │ │ │ │ │ ├── Exit.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── StakingStatus/ │ │ │ │ │ │ ├── StakingStatus.stories.test.tsx │ │ │ │ │ │ ├── StakingStatus.stories.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── StakingStatus.stories.test.tsx.snap │ │ │ │ │ └── StakingWidget/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── helpers/ │ │ │ │ │ └── utils.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── useGetStakeWidgetUrl.ts │ │ │ │ │ ├── useIsStakingBannerEnabled.ts │ │ │ │ │ └── useIsStakingFeatureEnabled.ts │ │ │ │ └── index.ts │ │ │ ├── support-chat/ │ │ │ │ ├── components/ │ │ │ │ │ └── SupportChatDrawer.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ └── useSupportChat.ts │ │ │ │ └── index.ts │ │ │ ├── swap/ │ │ │ │ ├── components/ │ │ │ │ │ ├── FallbackSwapWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── HelpIconTooltip/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── OrderId/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── StatusLabel/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SwapButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SwapOrder/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── rows/ │ │ │ │ │ │ │ ├── PartBuyAmount.tsx │ │ │ │ │ │ │ ├── PartDuration.tsx │ │ │ │ │ │ │ ├── PartSellAmount.tsx │ │ │ │ │ │ │ └── SurplusFee.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SwapOrderConfirmationView/ │ │ │ │ │ │ ├── OrderFeeConfirmationView.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── index.stories.test.tsx.snap │ │ │ │ │ │ ├── index.stories.test.tsx │ │ │ │ │ │ ├── index.stories.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── styles.module.css │ │ │ │ │ ├── SwapProgress/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SwapTokens/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SwapWidget/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── TwapFallbackHandlerWarning/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── helpers/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── cowSupportedChainId.test.ts │ │ │ │ │ │ ├── fee.test.ts │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ ├── cowSupportedChainId.ts │ │ │ │ │ ├── data/ │ │ │ │ │ │ └── stablecoins.ts │ │ │ │ │ ├── fee.ts │ │ │ │ │ ├── swapOrderBuilder.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useIsExpiredSwap.test.ts │ │ │ │ │ │ └── useIsTWAPFallbackHandler.test.ts │ │ │ │ │ ├── useIsExpiredSwap.ts │ │ │ │ │ ├── useIsSwapFeatureEnabled.ts │ │ │ │ │ └── useIsTWAPFallbackHandler.ts │ │ │ │ ├── index.ts │ │ │ │ ├── store/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── swapParamsSlice.ts │ │ │ │ ├── styles.module.css │ │ │ │ └── useSwapConsent.ts │ │ │ ├── targeted-features/ │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useIsOutreachSafe.test.ts │ │ │ │ │ │ └── useIsTargetedFeature.test.ts │ │ │ │ │ ├── useIsOutreachSafe.ts │ │ │ │ │ └── useIsTargetedFeature.ts │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── targeted-outreach/ │ │ │ │ ├── components/ │ │ │ │ │ └── OutreachPopup/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── constants.ts │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useShowOutreachPopup.test.ts │ │ │ │ │ └── useShowOutreachPopup.tsx │ │ │ │ ├── index.stories.tsx │ │ │ │ └── index.ts │ │ │ ├── transactions/ │ │ │ │ ├── components/ │ │ │ │ │ └── PendingTxList/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── index.ts │ │ │ │ ├── utils.test.ts │ │ │ │ └── utils.ts │ │ │ ├── tx-notes/ │ │ │ │ ├── components/ │ │ │ │ │ ├── TxNote/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── TxNoteForm/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── TxNoteInput/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── encodeTxNote.test.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── index.stories.tsx │ │ │ │ ├── index.ts │ │ │ │ └── services/ │ │ │ │ └── encodeTxNote.ts │ │ │ ├── wallet/ │ │ │ │ ├── components/ │ │ │ │ │ └── WalletPopover/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── contract.ts │ │ │ │ ├── feature.ts │ │ │ │ ├── hooks/ │ │ │ │ │ └── useWalletPopover.ts │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ └── walletconnect/ │ │ │ ├── __tests__/ │ │ │ │ └── WalletConnectContext.test.tsx │ │ │ ├── components/ │ │ │ │ ├── WalletConnectContext/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── WalletConnectUi/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── WcChainSwitchModal/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── WcConnectionForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── WcConnectionState/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── WcErrorMessage/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── WcHeaderWidget/ │ │ │ │ │ ├── WcIcon.test.tsx │ │ │ │ │ ├── WcIcon.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── WcHints/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── WcInput/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── WcLogoHeader/ │ │ │ │ │ ├── index.test.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ ├── WcProposalForm/ │ │ │ │ │ ├── CompatibilityWarning.tsx │ │ │ │ │ ├── ProposalVerification.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useCompatibilityWarning.test.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── styles.module.css │ │ │ │ │ └── useCompatibilityWarning.ts │ │ │ │ ├── WcSessionList/ │ │ │ │ │ ├── WcNoSessions.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── styles.module.css │ │ │ │ └── WcSessionManager/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── constants.ts │ │ │ ├── contract.ts │ │ │ ├── feature.ts │ │ │ ├── hooks/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useWalletConnectSearchParamUri.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── useWalletConnectSearchParamUri.ts │ │ │ │ └── useWcUri.ts │ │ │ ├── index.stories.tsx │ │ │ ├── index.ts │ │ │ ├── services/ │ │ │ │ ├── WalletConnectWallet.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── WalletConnectWallet.test.ts │ │ │ │ │ └── utils.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── tracking.ts │ │ │ │ ├── utils.ts │ │ │ │ └── walletConnectInstance.ts │ │ │ ├── store/ │ │ │ │ ├── index.ts │ │ │ │ ├── wcChainSwitchSlice.ts │ │ │ │ └── wcPopupStore.ts │ │ │ └── types.ts │ │ ├── hooks/ │ │ │ ├── Beamer/ │ │ │ │ └── useBeamer.ts │ │ │ ├── __tests__/ │ │ │ │ ├── useAddressResolver.test.ts │ │ │ │ ├── useAdjustUrl.test.ts │ │ │ │ ├── useAllAddressBooks.test.ts │ │ │ │ ├── useAsync.test.ts │ │ │ │ ├── useBatchedTxs.test.ts │ │ │ │ ├── useChainId.test.ts │ │ │ │ ├── useCompatibilityFallbackHandlerDeployments.test.ts │ │ │ │ ├── useGasLimit.test.ts │ │ │ │ ├── useGasPrice.test.ts │ │ │ │ ├── useHasUntrustedFallbackHandler.test.ts │ │ │ │ ├── useIsPinnedSafe.test.ts │ │ │ │ ├── useIsSafeOwner.test.tsx │ │ │ │ ├── useLoadBalances.test.ts │ │ │ │ ├── useLogout.test.ts │ │ │ │ ├── useLogoutCallback.test.ts │ │ │ │ ├── useMasterCopies.test.ts │ │ │ │ ├── useMatchSafe.test.ts │ │ │ │ ├── useNestedSafeOwners.test.ts │ │ │ │ ├── useOnceVisible.test.ts │ │ │ │ ├── usePendingTxs.test.ts │ │ │ │ ├── usePredictSafeAddressFromTxDetails.test.ts │ │ │ │ ├── usePreviousNonces.test.ts │ │ │ │ ├── useRankedSafeApps.test.ts │ │ │ │ ├── useRefetchBalances.test.ts │ │ │ │ ├── useRemainingRelays.test.ts │ │ │ │ ├── useRemoteSafeApps.test.ts │ │ │ │ ├── useSafeAddressFromUrl.test.ts │ │ │ │ ├── useSafeInfo.test.ts │ │ │ │ ├── useSafeLabsTerms.test.ts │ │ │ │ ├── useSafeNotifications.test.ts │ │ │ │ ├── useSafeTokenEnabled.test.ts │ │ │ │ ├── useSanctionedAddress.test.ts │ │ │ │ ├── useTopbarElevation.test.ts │ │ │ │ ├── useTxDetails.test.ts │ │ │ │ ├── useTxPendingStatus.test.ts │ │ │ │ ├── useTxQueue.test.ts │ │ │ │ ├── useTxTracking.test.ts │ │ │ │ ├── useVisibleBalances.test.ts │ │ │ │ └── useWalletCanPay.test.ts │ │ │ ├── coreSDK/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── safeCoreSDK.test.ts │ │ │ │ │ └── useInitSafeCoreSDK.test.ts │ │ │ │ ├── safeCoreSDK.ts │ │ │ │ └── useInitSafeCoreSDK.ts │ │ │ ├── loadables/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useLoadBalances.test.ts │ │ │ │ ├── useLoadBalances.ts │ │ │ │ ├── useLoadSafeInfo.ts │ │ │ │ ├── useLoadTxHistory.ts │ │ │ │ ├── useLoadTxQueue.ts │ │ │ │ └── useTrustedTokenBalances.ts │ │ │ ├── messages/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── useIsSafeMessagePending.test.ts │ │ │ │ │ ├── useIsSafeMessageSignableBy.test.ts │ │ │ │ │ ├── useSafeMessageNotifications.test.ts │ │ │ │ │ ├── useSafeMessagePendingStatuses.test.ts │ │ │ │ │ └── useSafeMessageStatus.test.ts │ │ │ │ ├── useDecodedSafeMessage.ts │ │ │ │ ├── useIsSafeMessagePending.ts │ │ │ │ ├── useIsSafeMessageSignableBy.ts │ │ │ │ ├── useSafeMessage.ts │ │ │ │ ├── useSafeMessageNotifications.ts │ │ │ │ ├── useSafeMessagePendingStatuses.ts │ │ │ │ ├── useSafeMessageStatus.ts │ │ │ │ ├── useSafeMessages.ts │ │ │ │ ├── useSafeMsgTracking.ts │ │ │ │ └── useSyncSafeMessageSigner.ts │ │ │ ├── safe-apps/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useCategoryFilter.test.ts │ │ │ │ ├── permissions/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useBrowserPermissions.ts │ │ │ │ │ └── useSafePermissions.ts │ │ │ │ ├── useAppsFilterByCategory.ts │ │ │ │ ├── useAppsFilterByOptimizedForBatch.ts │ │ │ │ ├── useAppsSearch.ts │ │ │ │ ├── useCategoryFilter.ts │ │ │ │ ├── useCustomAppCommunicator.tsx │ │ │ │ ├── useCustomSafeApps.ts │ │ │ │ ├── useOpenedSafeApps.ts │ │ │ │ ├── usePinnedSafeApps.ts │ │ │ │ ├── useRankedSafeApps.ts │ │ │ │ ├── useRemoteSafeApps.ts │ │ │ │ ├── useSafeAppFromBackend.ts │ │ │ │ ├── useSafeAppFromManifest.ts │ │ │ │ ├── useSafeAppPreviewDrawer.ts │ │ │ │ ├── useSafeAppRedirects.ts │ │ │ │ ├── useSafeAppUrl.ts │ │ │ │ ├── useSafeApps.ts │ │ │ │ ├── useSafeAppsFilters.ts │ │ │ │ └── useTxBuilderApp.ts │ │ │ ├── safes/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── useAllSafes.test.ts │ │ │ │ │ └── useAllSafesGrouped.test.ts │ │ │ │ ├── comparators.ts │ │ │ │ ├── index.ts │ │ │ │ ├── useAllOwnedSafes.ts │ │ │ │ ├── useAllSafes.ts │ │ │ │ ├── useAllSafesGrouped.ts │ │ │ │ ├── useGetHref.ts │ │ │ │ └── useSafesSearch.ts │ │ │ ├── use-mobile.ts │ │ │ ├── useAddressBook.ts │ │ │ ├── useAddressResolver.ts │ │ │ ├── useAdjustUrl.ts │ │ │ ├── useAllAddressBooks.ts │ │ │ ├── useBalances.ts │ │ │ ├── useBatchedTxs.ts │ │ │ ├── useBlockedAddress.ts │ │ │ ├── useBytecodeComparison.ts │ │ │ ├── useChainId.ts │ │ │ ├── useChains.ts │ │ │ ├── useChangedValue.ts │ │ │ ├── useCollectibles.ts │ │ │ ├── useCompatibilityFallbackHandlerDeployments.ts │ │ │ ├── useConsent.ts │ │ │ ├── useCuratedNestedSafes.ts │ │ │ ├── useDarkMode.ts │ │ │ ├── useEffectiveSafeParams.ts │ │ │ ├── useFilteredNestedSafes.ts │ │ │ ├── useGasLimit.ts │ │ │ ├── useGasPrice.ts │ │ │ ├── useHasUntrustedFallbackHandler.ts │ │ │ ├── useHiddenTokenCounts.ts │ │ │ ├── useHiddenTokens.ts │ │ │ ├── useHighlightHiddenTab.ts │ │ │ ├── useInitSession.ts │ │ │ ├── useIsMac.ts │ │ │ ├── useIsNestedSafeOwner.ts │ │ │ ├── useIsOfficialHost.ts │ │ │ ├── useIsPending.ts │ │ │ ├── useIsPinnedSafe.ts │ │ │ ├── useIsSafeOwner.ts │ │ │ ├── useIsSidebarRoute.ts │ │ │ ├── useIsSpaceRoute.ts │ │ │ ├── useIsTrustedSafe.ts │ │ │ ├── useIsValidExecution.ts │ │ │ ├── useIsWrongChain.ts │ │ │ ├── useKeyboardObserver/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useKeyboardObserver.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── keyboardActionHandlers.ts │ │ │ │ ├── keyboardListeners.ts │ │ │ │ └── useKeyboardObserver.ts │ │ │ ├── useLastSafe.ts │ │ │ ├── useLoadableStores.ts │ │ │ ├── useLogout.ts │ │ │ ├── useLogoutCallback.ts │ │ │ ├── useMasterCopies.ts │ │ │ ├── useMatchSafe.ts │ │ │ ├── useMnemonicName/ │ │ │ │ ├── dict.ts │ │ │ │ ├── index.ts │ │ │ │ └── useMnemonicName.test.ts │ │ │ ├── useNativeTokenDisplay.ts │ │ │ ├── useNativeTokenInfo.ts │ │ │ ├── useNestedSafeOwners.tsx │ │ │ ├── useNestedSafesVisibility.ts │ │ │ ├── useOnceVisible.ts │ │ │ ├── useOrigin.ts │ │ │ ├── useOwnedSafes.ts │ │ │ ├── useParentSafe.ts │ │ │ ├── usePendingTxs.ts │ │ │ ├── usePredictSafeAddressFromTxDetails.ts │ │ │ ├── usePreventNavigation.ts │ │ │ ├── usePreviousNonces.ts │ │ │ ├── useProposers.ts │ │ │ ├── useRefetchBalances.ts │ │ │ ├── useRemainingRelays.ts │ │ │ ├── useRouterGuard/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useRouterGuard.test.ts │ │ │ │ ├── activationGuards/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useFlowActivationGuard.test.ts │ │ │ │ │ └── useFlowActivationGuard.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ ├── useSafeAddress.ts │ │ │ ├── useSafeAddressFromUrl.ts │ │ │ ├── useSafeDisplayName.ts │ │ │ ├── useSafeInfo.ts │ │ │ ├── useSafeLabsTerms.ts │ │ │ ├── useSafeNotifications.ts │ │ │ ├── useSafeTokenEnabled.ts │ │ │ ├── useSanctionedAddress.ts │ │ │ ├── useSearchFilter.ts │ │ │ ├── useTopbarElevation.ts │ │ │ ├── useTransactionStatus.ts │ │ │ ├── useTransactionType.tsx │ │ │ ├── useTxDetails.ts │ │ │ ├── useTxHistory.ts │ │ │ ├── useTxNotifications.ts │ │ │ ├── useTxPendingStatuses.ts │ │ │ ├── useTxQueue.ts │ │ │ ├── useTxTracking.ts │ │ │ ├── useValidateTxData.ts │ │ │ ├── useVisibleBalances.ts │ │ │ ├── useWalletCanPay.ts │ │ │ ├── useWalletCanRelay.ts │ │ │ └── wallets/ │ │ │ ├── __tests__/ │ │ │ │ ├── useOnboard.test.ts │ │ │ │ └── useWallet.test.tsx │ │ │ ├── consts.ts │ │ │ ├── useInitWeb3.ts │ │ │ ├── useOnboard.ts │ │ │ ├── useWallet.ts │ │ │ ├── useWalletBalance.ts │ │ │ ├── wallets.ts │ │ │ ├── web3.ts │ │ │ └── web3ReadOnly.ts │ │ ├── markdown/ │ │ │ ├── cookie/ │ │ │ │ └── cookie.md │ │ │ ├── privacy/ │ │ │ │ └── privacy.md │ │ │ └── terms/ │ │ │ ├── terms.md │ │ │ └── version.js │ │ ├── pages/ │ │ │ ├── 403.tsx │ │ │ ├── 404.tsx │ │ │ ├── _app.tsx │ │ │ ├── _document.tsx │ │ │ ├── _offline.tsx │ │ │ ├── addOwner.tsx │ │ │ ├── address-book.tsx │ │ │ ├── apps/ │ │ │ │ ├── bookmarked.tsx │ │ │ │ ├── custom.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── open.tsx │ │ │ ├── balances/ │ │ │ │ ├── index.tsx │ │ │ │ ├── nfts.tsx │ │ │ │ └── positions.tsx │ │ │ ├── bridge.tsx │ │ │ ├── cookie.tsx │ │ │ ├── dashboard/ │ │ │ │ └── new.tsx │ │ │ ├── earn.tsx │ │ │ ├── home.tsx │ │ │ ├── hypernative/ │ │ │ │ └── oauth-callback.tsx │ │ │ ├── imprint.tsx │ │ │ ├── index.tsx │ │ │ ├── licenses.tsx │ │ │ ├── new-safe/ │ │ │ │ ├── advanced-create.tsx │ │ │ │ ├── create.tsx │ │ │ │ └── load.tsx │ │ │ ├── privacy.tsx │ │ │ ├── safe-labs-terms.tsx │ │ │ ├── settings/ │ │ │ │ ├── appearance.tsx │ │ │ │ ├── cookies.tsx │ │ │ │ ├── data.tsx │ │ │ │ ├── environment-variables.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── modules.tsx │ │ │ │ ├── notifications.tsx │ │ │ │ ├── safe-apps/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── security.tsx │ │ │ │ └── setup.tsx │ │ │ ├── share/ │ │ │ │ └── safe-app.tsx │ │ │ ├── spaces/ │ │ │ │ ├── address-book.tsx │ │ │ │ ├── create-space.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── members.tsx │ │ │ │ ├── safe-accounts.tsx │ │ │ │ ├── security.tsx │ │ │ │ └── settings.tsx │ │ │ ├── stake.tsx │ │ │ ├── swap.tsx │ │ │ ├── terms.tsx │ │ │ ├── transactions/ │ │ │ │ ├── history.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── messages.tsx │ │ │ │ ├── msg.tsx │ │ │ │ ├── queue.tsx │ │ │ │ └── tx.tsx │ │ │ ├── user-settings.tsx │ │ │ ├── wc.tsx │ │ │ └── welcome/ │ │ │ ├── accounts.tsx │ │ │ ├── create-space.tsx │ │ │ ├── index.tsx │ │ │ ├── invite-members.tsx │ │ │ ├── select-safes.tsx │ │ │ └── spaces.tsx │ │ ├── permissions/ │ │ │ ├── config.test.ts │ │ │ ├── config.ts │ │ │ ├── getRolePermissions.test.ts │ │ │ ├── getRolePermissions.ts │ │ │ ├── hoc/ │ │ │ │ ├── withPermission.test.tsx │ │ │ │ ├── withPermission.tsx │ │ │ │ ├── withRole.test.tsx │ │ │ │ └── withRole.tsx │ │ │ └── hooks/ │ │ │ ├── useHasPermission.test.tsx │ │ │ ├── useHasPermission.ts │ │ │ ├── useHasRoles.test.tsx │ │ │ ├── useHasRoles.ts │ │ │ ├── usePermission.test.ts │ │ │ ├── usePermission.ts │ │ │ ├── useRoleProps.test.tsx │ │ │ ├── useRoleProps.ts │ │ │ ├── useRoles.test.tsx │ │ │ └── useRoles.ts │ │ ├── service-workers/ │ │ │ └── firebase-messaging/ │ │ │ ├── __tests__/ │ │ │ │ └── notifications.test.ts │ │ │ ├── gateway-utils.ts │ │ │ ├── notification-mapper.ts │ │ │ ├── notifications.ts │ │ │ └── webhook-types.ts │ │ ├── services/ │ │ │ ├── EventBus.ts │ │ │ ├── analytics/ │ │ │ │ ├── Analytics.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── ga-mixpanel-mapping.test.ts │ │ │ │ │ ├── gtm.test.ts │ │ │ │ │ ├── mixpanel-events.test.ts │ │ │ │ │ ├── mixpanel.test.ts │ │ │ │ │ ├── tx-tracking.test.ts │ │ │ │ │ ├── useMixpanel.test.ts │ │ │ │ │ └── useMixpanelUserProperties.test.ts │ │ │ │ ├── events/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── swaps.test.ts │ │ │ │ │ ├── addressBook.ts │ │ │ │ │ ├── assets.ts │ │ │ │ │ ├── attention-panel.ts │ │ │ │ │ ├── batching.ts │ │ │ │ │ ├── bridge.ts │ │ │ │ │ ├── counterfactual.ts │ │ │ │ │ ├── createLoadSafe.ts │ │ │ │ │ ├── earn.ts │ │ │ │ │ ├── hypernative.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── modals.ts │ │ │ │ │ ├── nested-safes.ts │ │ │ │ │ ├── nfts.ts │ │ │ │ │ ├── outreach.ts │ │ │ │ │ ├── overview.ts │ │ │ │ │ ├── portfolio.ts │ │ │ │ │ ├── positions.ts │ │ │ │ │ ├── push-notifications.ts │ │ │ │ │ ├── recovery.ts │ │ │ │ │ ├── reject-tx.ts │ │ │ │ │ ├── safe-shield.ts │ │ │ │ │ ├── safeApps.ts │ │ │ │ │ ├── settings.ts │ │ │ │ │ ├── spaces.ts │ │ │ │ │ ├── stake.ts │ │ │ │ │ ├── swaps.ts │ │ │ │ │ ├── terms.ts │ │ │ │ │ ├── transactions.ts │ │ │ │ │ ├── txList.ts │ │ │ │ │ ├── wallet.ts │ │ │ │ │ └── walletconnect.ts │ │ │ │ ├── ga-mixpanel-mapping.ts │ │ │ │ ├── gtm.ts │ │ │ │ ├── index.ts │ │ │ │ ├── mixpanel-events.ts │ │ │ │ ├── mixpanel.ts │ │ │ │ ├── tx-tracking.ts │ │ │ │ ├── types.ts │ │ │ │ ├── useGtm.ts │ │ │ │ ├── useMetaEvents.ts │ │ │ │ ├── useMixpanel.ts │ │ │ │ └── useMixpanelUserProperties.ts │ │ │ ├── beamer/ │ │ │ │ └── index.ts │ │ │ ├── contracts/ │ │ │ │ ├── ContractErrorCodes.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── deployments.test.ts │ │ │ │ │ └── safeContracts.test.ts │ │ │ │ └── safeContracts.ts │ │ │ ├── ens/ │ │ │ │ ├── index.test.ts │ │ │ │ └── index.ts │ │ │ ├── exceptions/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── index.test.ts │ │ │ │ └── index.ts │ │ │ ├── local-storage/ │ │ │ │ ├── Storage.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── local.test.ts │ │ │ │ │ └── useLocalStorage.test.ts │ │ │ │ ├── local.ts │ │ │ │ ├── session.ts │ │ │ │ ├── storageHelpers.ts │ │ │ │ └── useLocalStorage.ts │ │ │ ├── ls-migration/ │ │ │ │ ├── addedSafes.ts │ │ │ │ ├── addressBook.ts │ │ │ │ ├── batch.ts │ │ │ │ ├── common.ts │ │ │ │ └── tests.test.ts │ │ │ ├── observability/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── composite.test.ts │ │ │ │ │ ├── factory.test.ts │ │ │ │ │ ├── index.test.ts │ │ │ │ │ └── noop.test.ts │ │ │ │ ├── factory.ts │ │ │ │ ├── index.ts │ │ │ │ ├── providers/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── datadog.test.ts │ │ │ │ │ ├── composite.ts │ │ │ │ │ ├── datadog.ts │ │ │ │ │ └── noop.ts │ │ │ │ └── types.ts │ │ │ ├── onboard/ │ │ │ │ ├── ledger-module.ts │ │ │ │ └── trezor/ │ │ │ │ ├── constants.ts │ │ │ │ ├── errors.ts │ │ │ │ ├── module.test.ts │ │ │ │ ├── module.ts │ │ │ │ ├── sdk.ts │ │ │ │ └── types.ts │ │ │ ├── onboard.ts │ │ │ ├── private-key-module/ │ │ │ │ ├── PkModulePopup.tsx │ │ │ │ ├── constants.ts │ │ │ │ ├── icon.ts │ │ │ │ ├── index.ts │ │ │ │ └── pk-popup-store.ts │ │ │ ├── push-notifications/ │ │ │ │ ├── firebase.ts │ │ │ │ ├── preferences.ts │ │ │ │ └── tracking.ts │ │ │ ├── safe-apps/ │ │ │ │ ├── AppCommunicator.test.ts │ │ │ │ ├── AppCommunicator.ts │ │ │ │ ├── manifest.ts │ │ │ │ ├── track-app-usage-count.ts │ │ │ │ └── utils.ts │ │ │ ├── safe-labs-terms/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── index.test.ts │ │ │ │ │ └── security.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── security.ts │ │ │ ├── safe-messages/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── safeMsgSender.test.ts │ │ │ │ ├── safeMsgEvents.ts │ │ │ │ ├── safeMsgNotifications.ts │ │ │ │ └── safeMsgSender.ts │ │ │ ├── safe-wallet-provider/ │ │ │ │ ├── index.test.ts │ │ │ │ ├── index.ts │ │ │ │ ├── notifications.test.ts │ │ │ │ ├── notifications.ts │ │ │ │ ├── useSafeWalletProvider.test.tsx │ │ │ │ └── useSafeWalletProvider.tsx │ │ │ ├── sessionExpiry/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useSessionExpiryGuard.test.tsx │ │ │ │ └── useSessionExpiryGuard.ts │ │ │ ├── siwe/ │ │ │ │ ├── useSiwe.tsx │ │ │ │ └── utils/ │ │ │ │ └── index.ts │ │ │ ├── tracking/ │ │ │ │ └── abTesting.ts │ │ │ ├── transactions/ │ │ │ │ └── index.ts │ │ │ └── tx/ │ │ │ ├── __tests__/ │ │ │ │ ├── encodeSignatures.test.ts │ │ │ │ ├── extractTxInfo.test.ts │ │ │ │ ├── proposeTransaction.test.ts │ │ │ │ ├── safeUpdateParams.test.ts │ │ │ │ ├── spendingLimitParams.test.ts │ │ │ │ ├── tokenTransferParams.test.ts │ │ │ │ ├── txEvents.test.ts │ │ │ │ └── txMonitor.test.ts │ │ │ ├── encodeSignatures.ts │ │ │ ├── extractTxInfo.ts │ │ │ ├── proposeTransaction.ts │ │ │ ├── safeUpdateParams.ts │ │ │ ├── tokenTransferParams.ts │ │ │ ├── tx-sender/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── ts-sender.test.ts │ │ │ │ ├── create.ts │ │ │ │ ├── dispatch.ts │ │ │ │ ├── index.ts │ │ │ │ ├── recommendedNonce.ts │ │ │ │ └── sdk.ts │ │ │ ├── txEvents.ts │ │ │ └── txMonitor.ts │ │ ├── store/ │ │ │ ├── __tests__/ │ │ │ │ ├── addedSafesSlice.test.ts │ │ │ │ ├── addressBookSlice.test.ts │ │ │ │ ├── authSlice.test.ts │ │ │ │ ├── broadcast.test.ts │ │ │ │ ├── cookiesAndTermsSlice.test.ts │ │ │ │ ├── index.test.ts │ │ │ │ ├── notificationsSlice.test.ts │ │ │ │ ├── pendingSafeMessagesSlice.test.ts │ │ │ │ ├── pendingTxsSlice.test.ts │ │ │ │ ├── reconcileAuth.test.ts │ │ │ │ ├── safeAppsSlice.test.ts │ │ │ │ ├── safeMessagesSlice.test.ts │ │ │ │ ├── safeOverviews.test.ts │ │ │ │ ├── sessionSlice.test.ts │ │ │ │ ├── settingsSlice.test.ts │ │ │ │ ├── swapOrderSlice.test.ts │ │ │ │ ├── txHistorySlice.test.ts │ │ │ │ ├── txQueueSlice.test.ts │ │ │ │ └── useInitStaticChains.test.tsx │ │ │ ├── addedSafesSlice.ts │ │ │ ├── addressBookSlice.ts │ │ │ ├── api/ │ │ │ │ ├── gateway/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── safeOverviews.ts │ │ │ │ ├── ofac.ts │ │ │ │ └── safePass.ts │ │ │ ├── authSlice.ts │ │ │ ├── broadcast.ts │ │ │ ├── common.ts │ │ │ ├── cookiesAndTermsSlice.ts │ │ │ ├── index.ts │ │ │ ├── notificationsSlice.ts │ │ │ ├── orderByPreferenceSlice.ts │ │ │ ├── pendingSafeMessagesSlice.ts │ │ │ ├── pendingTxsSlice.ts │ │ │ ├── persistStore.ts │ │ │ ├── popupSlice.ts │ │ │ ├── reconcileAuth.ts │ │ │ ├── safeAppsSlice.ts │ │ │ ├── safeInfoSlice.ts │ │ │ ├── safeMessagesSlice.ts │ │ │ ├── sessionSlice.ts │ │ │ ├── settingsSlice.ts │ │ │ ├── slices.ts │ │ │ ├── swapOrderSlice.ts │ │ │ ├── txHistorySlice.ts │ │ │ ├── txQueueSlice.ts │ │ │ ├── useHydrateStore.ts │ │ │ └── visitedSafesSlice.ts │ │ ├── stories/ │ │ │ ├── Configure.mdx │ │ │ ├── mocks/ │ │ │ │ ├── MockContextProvider.tsx │ │ │ │ ├── chains.ts │ │ │ │ ├── createMockStory.tsx │ │ │ │ ├── defaults.ts │ │ │ │ ├── handlers.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ └── wallets.ts │ │ │ ├── pages/ │ │ │ │ ├── 403.stories.tsx │ │ │ │ ├── 404.stories.tsx │ │ │ │ ├── _offline.stories.tsx │ │ │ │ ├── address-book.stories.tsx │ │ │ │ ├── apps/ │ │ │ │ │ ├── Apps.stories.tsx │ │ │ │ │ └── Custom.stories.tsx │ │ │ │ ├── balances/ │ │ │ │ │ ├── Balances.stories.tsx │ │ │ │ │ ├── Nfts.stories.tsx │ │ │ │ │ └── Positions.stories.tsx │ │ │ │ ├── bridge.stories.tsx │ │ │ │ ├── earn.stories.tsx │ │ │ │ ├── home.stories.tsx │ │ │ │ ├── imprint.stories.tsx │ │ │ │ ├── licenses.stories.tsx │ │ │ │ ├── new-safe/ │ │ │ │ │ ├── AdvancedCreate.stories.tsx │ │ │ │ │ ├── Create.stories.tsx │ │ │ │ │ └── Load.stories.tsx │ │ │ │ ├── safe-labs-terms.stories.tsx │ │ │ │ ├── settings/ │ │ │ │ │ ├── Appearance.stories.tsx │ │ │ │ │ ├── Cookies.stories.tsx │ │ │ │ │ ├── Data.stories.tsx │ │ │ │ │ ├── EnvironmentVariables.stories.tsx │ │ │ │ │ ├── Modules.stories.tsx │ │ │ │ │ ├── Notifications.stories.tsx │ │ │ │ │ ├── Security.stories.tsx │ │ │ │ │ ├── Setup.stories.tsx │ │ │ │ │ └── safe-apps/ │ │ │ │ │ └── SafeApps.stories.tsx │ │ │ │ ├── spaces/ │ │ │ │ │ ├── AddressBook.stories.tsx │ │ │ │ │ ├── Members.stories.tsx │ │ │ │ │ ├── SafeAccounts.stories.tsx │ │ │ │ │ ├── Settings.stories.tsx │ │ │ │ │ └── SpaceDashboard.stories.tsx │ │ │ │ ├── stake.stories.tsx │ │ │ │ ├── swap.stories.tsx │ │ │ │ ├── transactions/ │ │ │ │ │ ├── History.stories.tsx │ │ │ │ │ ├── Messages.stories.tsx │ │ │ │ │ ├── Msg.stories.tsx │ │ │ │ │ ├── Queue.stories.tsx │ │ │ │ │ └── Tx.stories.tsx │ │ │ │ ├── user-settings.stories.tsx │ │ │ │ └── welcome/ │ │ │ │ ├── Accounts.stories.tsx │ │ │ │ ├── Spaces.stories.tsx │ │ │ │ └── Welcome.stories.tsx │ │ │ ├── routerDecorator.tsx │ │ │ └── storeDecorator.tsx │ │ ├── styles/ │ │ │ ├── accordion.module.css │ │ │ ├── fonts.css │ │ │ ├── globals.css │ │ │ ├── inputs.module.css │ │ │ ├── onboard.css │ │ │ ├── shadcn.css │ │ │ └── vars.css │ │ ├── tests/ │ │ │ ├── Builder.ts │ │ │ ├── __tests__/ │ │ │ │ ├── auto-generated-sync.test.ts │ │ │ │ ├── fixtures-match-schema.test.ts │ │ │ │ └── renderWithScenario.test.tsx │ │ │ ├── builders/ │ │ │ │ ├── balances.ts │ │ │ │ ├── chains.ts │ │ │ │ ├── collectibles.ts │ │ │ │ ├── eip1193Provider.ts │ │ │ │ ├── pendingTx.ts │ │ │ │ ├── safe.ts │ │ │ │ ├── safeItem.ts │ │ │ │ ├── safeMessage.ts │ │ │ │ ├── safeTx.ts │ │ │ │ ├── transactionDetails.ts │ │ │ │ ├── utils.ts │ │ │ │ └── wallet.ts │ │ │ ├── mocks/ │ │ │ │ ├── chains.ts │ │ │ │ ├── contractManager.ts │ │ │ │ ├── hooks.ts │ │ │ │ ├── providers.ts │ │ │ │ └── transactions.ts │ │ │ ├── msw/ │ │ │ │ └── hypernative-oauth-handler.test.ts │ │ │ ├── pages/ │ │ │ │ ├── 404.test.tsx │ │ │ │ ├── apps-share.test.tsx │ │ │ │ ├── apps.test.tsx │ │ │ │ └── hypernative-oauth-callback.test.tsx │ │ │ ├── scenario-utils.tsx │ │ │ ├── server.ts │ │ │ ├── storybook-setup.ts │ │ │ ├── test-utils.tsx │ │ │ └── transactions.ts │ │ └── utils/ │ │ ├── SimpleTxWatcher.ts │ │ ├── __tests__/ │ │ │ ├── SimpleTxWatcher.test.ts │ │ │ ├── chains.test.ts │ │ │ ├── clipboard.test.ts │ │ │ ├── ethers-utils.test.ts │ │ │ ├── fiat.test.ts │ │ │ ├── helpers.test.ts │ │ │ ├── hex.test.ts │ │ │ ├── mad-props.test.tsx │ │ │ ├── nested-safes.test.ts │ │ │ ├── safe-hashes.test.ts │ │ │ ├── safe-messages.test.ts │ │ │ ├── safe-migrations.test.ts │ │ │ ├── safe-version.test.ts │ │ │ ├── signers.test.ts │ │ │ ├── tokens.test.ts │ │ │ ├── transaction-calldata.test.ts │ │ │ ├── transaction-errors.test.ts │ │ │ ├── transaction-guards.test.ts │ │ │ ├── transactions.test.ts │ │ │ ├── tx-history-filter.test.ts │ │ │ ├── tx-list.test.ts │ │ │ ├── url.test.ts │ │ │ └── wallets.test.ts │ │ ├── chains.ts │ │ ├── clipboard.ts │ │ ├── cn.ts │ │ ├── createEmotionCache.ts │ │ ├── ethers-utils.ts │ │ ├── featureToggled.tsx │ │ ├── fiat.ts │ │ ├── gateway.ts │ │ ├── helpers.ts │ │ ├── hex.ts │ │ ├── mad-props.tsx │ │ ├── nested-safe-wallet.ts │ │ ├── nested-safes.ts │ │ ├── providers/ │ │ │ └── UncheckedJsonRpcSigner.ts │ │ ├── relaying.ts │ │ ├── rtkQuery.ts │ │ ├── safe-hashes.ts │ │ ├── safe-message-guards.ts │ │ ├── safe-migrations.ts │ │ ├── safe-versions.ts │ │ ├── signers.ts │ │ ├── tokens.ts │ │ ├── transaction-calldata.ts │ │ ├── transaction-errors.ts │ │ ├── transaction-guards.ts │ │ ├── transactions.ts │ │ ├── tx-details.ts │ │ ├── tx-history-filter.ts │ │ ├── tx-link.ts │ │ ├── tx-list.ts │ │ ├── url.ts │ │ └── wallets.ts │ └── tsconfig.json ├── config/ │ ├── eslint/ │ │ └── base.mjs │ ├── test/ │ │ ├── factories/ │ │ │ ├── addresses.ts │ │ │ ├── chains.ts │ │ │ ├── index.ts │ │ │ ├── protocolKit.ts │ │ │ ├── provider.ts │ │ │ ├── safeInfo.ts │ │ │ └── safeTx.ts │ │ ├── index.ts │ │ ├── mocks/ │ │ │ └── analytics.ts │ │ ├── msw/ │ │ │ ├── factories/ │ │ │ │ ├── index.ts │ │ │ │ ├── safeFactory.ts │ │ │ │ ├── tokenFactory.ts │ │ │ │ └── transactionFactory.ts │ │ │ ├── fixtures/ │ │ │ │ ├── balances/ │ │ │ │ │ ├── ef-safe.json │ │ │ │ │ ├── empty.json │ │ │ │ │ ├── safe-token-holder.json │ │ │ │ │ ├── spam-tokens.json │ │ │ │ │ └── vitalik.json │ │ │ │ ├── chains/ │ │ │ │ │ ├── all.json │ │ │ │ │ └── mainnet.json │ │ │ │ ├── index.ts │ │ │ │ ├── portfolio/ │ │ │ │ │ ├── ef-safe.json │ │ │ │ │ ├── empty.json │ │ │ │ │ ├── safe-token-holder.json │ │ │ │ │ ├── spam-tokens.json │ │ │ │ │ └── vitalik.json │ │ │ │ ├── positions/ │ │ │ │ │ ├── ef-safe.json │ │ │ │ │ ├── empty.json │ │ │ │ │ ├── safe-token-holder.json │ │ │ │ │ ├── spam-tokens.json │ │ │ │ │ └── vitalik.json │ │ │ │ ├── safe-apps/ │ │ │ │ │ └── mainnet.json │ │ │ │ └── safes/ │ │ │ │ ├── ef-safe.json │ │ │ │ ├── safe-token-holder.json │ │ │ │ ├── sepolia.json │ │ │ │ ├── spam-tokens.json │ │ │ │ └── vitalik.json │ │ │ ├── handlers/ │ │ │ │ ├── fromFixtures.ts │ │ │ │ ├── index.ts │ │ │ │ ├── safe.ts │ │ │ │ ├── transactions.ts │ │ │ │ └── web3.ts │ │ │ ├── handlers.ts │ │ │ ├── index.ts │ │ │ ├── mockSafeApps.ts │ │ │ ├── scenarios/ │ │ │ │ ├── emptyState.ts │ │ │ │ ├── errorState.ts │ │ │ │ ├── index.ts │ │ │ │ └── loadingState.ts │ │ │ ├── scripts/ │ │ │ │ └── fetch-fixtures.ts │ │ │ └── testServer.ts │ │ ├── package.json │ │ ├── presets/ │ │ │ └── jest-preset.js │ │ └── tsconfig.json │ └── tsconfig/ │ ├── confs/ │ │ └── base.json │ └── package.json ├── docs/ │ ├── resolutions.md │ └── solutions/ │ └── workflow-issues/ │ ├── direct-native-file-edits-in-expo-project-20260319.md │ └── eslint-warnings-ignored-during-refactor-20260203.md ├── expo-plugins/ │ └── notification-service-ios/ │ ├── README.md │ ├── app.plugin.js │ ├── ios-notification-service-files/ │ │ ├── NotifeeNotificationServiceExtension-Info.plist │ │ ├── NotifeeNotificationServiceExtension.entitlements │ │ ├── NotificationService.swift │ │ └── Utils/ │ │ ├── BoolString.swift │ │ ├── CharacterSet+Hex.swift │ │ ├── ConfigurationKey.swift │ │ ├── Data+MultisigExtension.swift │ │ ├── DataString.swift │ │ ├── UInt256.swift │ │ └── UInt256String.swift │ ├── package.json │ ├── plugin/ │ │ ├── config.ts │ │ ├── ios.ts │ │ ├── types.ts │ │ ├── utils.ts │ │ └── withNotifee.ts │ └── tsconfig.json ├── package.json ├── packages/ │ ├── AGENTS.md │ ├── store/ │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── api-schema/ │ │ │ │ └── schema.json │ │ │ ├── check-auto-generated-sync.ts │ │ │ ├── fetch-schema.ts │ │ │ └── openapi-config.ts │ │ ├── src/ │ │ │ ├── gateway/ │ │ │ │ ├── AUTO_GENERATED/ │ │ │ │ │ ├── .schema-hash │ │ │ │ │ ├── about.ts │ │ │ │ │ ├── auth.ts │ │ │ │ │ ├── balances.ts │ │ │ │ │ ├── chains.ts │ │ │ │ │ ├── collectibles.ts │ │ │ │ │ ├── community.ts │ │ │ │ │ ├── contracts.ts │ │ │ │ │ ├── csv-export.ts │ │ │ │ │ ├── data-decoded.ts │ │ │ │ │ ├── delegates.ts │ │ │ │ │ ├── estimations.ts │ │ │ │ │ ├── messages.ts │ │ │ │ │ ├── notifications.ts │ │ │ │ │ ├── owners.ts │ │ │ │ │ ├── portfolios.ts │ │ │ │ │ ├── positions.ts │ │ │ │ │ ├── relay.ts │ │ │ │ │ ├── safe-apps.ts │ │ │ │ │ ├── safe-shield.ts │ │ │ │ │ ├── safes.ts │ │ │ │ │ ├── spaces.ts │ │ │ │ │ ├── targeted-messages.ts │ │ │ │ │ ├── transactions.ts │ │ │ │ │ └── users.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── balances.test.ts │ │ │ │ │ └── transactions.test.ts │ │ │ │ ├── cgwClient-hooks.test.ts │ │ │ │ ├── cgwClient.test.ts │ │ │ │ ├── cgwClient.ts │ │ │ │ ├── chains/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── index.test.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── collectibles.ts │ │ │ │ ├── index.ts │ │ │ │ ├── safes/ │ │ │ │ │ └── index.ts │ │ │ │ ├── transactions.ts │ │ │ │ └── types.ts │ │ │ ├── hypernative/ │ │ │ │ ├── hypernativeApi.dto.ts │ │ │ │ └── hypernativeApi.ts │ │ │ ├── index.ts │ │ │ ├── settingsSlice.ts │ │ │ ├── slices/ │ │ │ │ └── SafeInfo/ │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ └── utils/ │ │ │ ├── __tests__/ │ │ │ │ └── infiniteQuery.test.ts │ │ │ ├── infiniteQuery.ts │ │ │ ├── persistTransformFilter.test.ts │ │ │ └── persistTransformFilter.ts │ │ └── tsconfig.json │ ├── theme/ │ │ ├── ARCHITECTURE.md │ │ ├── README.md │ │ ├── eslint.config.mjs │ │ ├── jest.config.cjs │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── generate-css-vars.ts │ │ ├── src/ │ │ │ ├── generators/ │ │ │ │ ├── css-vars.test.ts │ │ │ │ ├── css-vars.ts │ │ │ │ ├── mui-extensions.ts │ │ │ │ ├── mui.ts │ │ │ │ ├── tamagui.test.ts │ │ │ │ ├── tamagui.ts │ │ │ │ └── types.ts │ │ │ ├── index.ts │ │ │ ├── palettes/ │ │ │ │ ├── dark.ts │ │ │ │ ├── index.ts │ │ │ │ ├── light.ts │ │ │ │ ├── palettes.test.ts │ │ │ │ ├── static.ts │ │ │ │ └── types.ts │ │ │ ├── tokens/ │ │ │ │ ├── index.ts │ │ │ │ ├── radius.ts │ │ │ │ ├── spacing.ts │ │ │ │ └── typography.ts │ │ │ └── utils/ │ │ │ ├── flatten.test.ts │ │ │ └── flatten.ts │ │ └── tsconfig.json │ └── utils/ │ ├── .gitignore │ ├── README.md │ ├── eslint.config.mjs │ ├── jest.config.js │ ├── package.json │ ├── src/ │ │ ├── components/ │ │ │ ├── confirmation-views/ │ │ │ │ └── BridgeTransaction/ │ │ │ │ ├── BridgeWarnings.ts │ │ │ │ └── useBridgeWarningLogic.ts │ │ │ └── tx/ │ │ │ ├── ApprovalEditor/ │ │ │ │ └── utils/ │ │ │ │ └── approvals.ts │ │ │ └── security/ │ │ │ ├── blockaid/ │ │ │ │ └── utils.ts │ │ │ ├── shared/ │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ └── tenderly/ │ │ │ ├── __tests__/ │ │ │ │ └── utils.test.ts │ │ │ ├── types.ts │ │ │ ├── useSimulation.ts │ │ │ └── utils.ts │ │ ├── config/ │ │ │ ├── chains.ts │ │ │ └── constants.ts │ │ ├── features/ │ │ │ ├── counterfactual/ │ │ │ │ ├── store/ │ │ │ │ │ └── types.ts │ │ │ │ └── types.ts │ │ │ ├── multichain/ │ │ │ │ └── hooks/ │ │ │ │ └── useCompatibleNetworks.ts │ │ │ ├── positions/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── calculatePositionsFiatTotal.test.ts │ │ │ │ │ ├── calculateProtocolPercentage.test.ts │ │ │ │ │ ├── getPositionsEndpointConfig.test.ts │ │ │ │ │ ├── getReadablePositionType.test.ts │ │ │ │ │ └── transformAppBalancesToProtocols.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── utils/ │ │ │ │ ├── calculatePositionsFiatTotal.ts │ │ │ │ ├── calculateProtocolPercentage.ts │ │ │ │ ├── getPositionsEndpointConfig.ts │ │ │ │ ├── getReadablePositionType.ts │ │ │ │ └── transformAppBalancesToProtocols.ts │ │ │ ├── safe-shield/ │ │ │ │ ├── builders/ │ │ │ │ │ ├── contract-address.builder.ts │ │ │ │ │ ├── contract-analysis-result.builder.ts │ │ │ │ │ ├── contract-analysis.builder.ts │ │ │ │ │ ├── deadlock-analysis-result.builder.ts │ │ │ │ │ ├── deadlock-analysis.builder.ts │ │ │ │ │ ├── full-analysis.builder.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── recipient-address.builder.ts │ │ │ │ │ ├── recipient-analysis-result.builder.ts │ │ │ │ │ ├── recipient-analysis.builder.ts │ │ │ │ │ ├── threat-analysis-result.builder.ts │ │ │ │ │ └── threat-analysis.builder.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── hooks/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── useCounterpartyAnalysis.test.ts │ │ │ │ │ │ ├── useFetchMultiRecipientAnalysis.test.ts │ │ │ │ │ │ ├── useFetchRecipientAnalysis.test.ts │ │ │ │ │ │ ├── useParsedOrigin.test.fixtures.ts │ │ │ │ │ │ ├── useParsedOrigin.test.ts │ │ │ │ │ │ ├── useRecipientAnalysis.test.ts │ │ │ │ │ │ ├── useThreatAnalysis.test.ts │ │ │ │ │ │ ├── useThreatAnalysisHypernative.test.ts │ │ │ │ │ │ ├── useThreatAnalysisHypernativeBatch.test.ts │ │ │ │ │ │ └── useThreatAnalysisHypernativeMessage.test.ts │ │ │ │ │ ├── address-analysis/ │ │ │ │ │ │ ├── address-activity/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── useAddressActivity.test.ts │ │ │ │ │ │ │ └── useAddressActivity.ts │ │ │ │ │ │ ├── address-book-check/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── useAddressBookCheck.test.ts │ │ │ │ │ │ │ └── useAddressBookCheck.ts │ │ │ │ │ │ ├── config.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useCounterpartyAnalysis.ts │ │ │ │ │ ├── useFetchMultiRecipientAnalysis.ts │ │ │ │ │ ├── useFetchRecipientAnalysis.ts │ │ │ │ │ ├── useHighlightedSeverity.ts │ │ │ │ │ ├── useParsedOrigin.ts │ │ │ │ │ ├── useRecipientAnalysis.ts │ │ │ │ │ ├── useThreatAnalysis.ts │ │ │ │ │ ├── useThreatAnalysisHypernative.ts │ │ │ │ │ ├── useThreatAnalysisHypernativeBatch.ts │ │ │ │ │ ├── useThreatAnalysisHypernativeMessage.ts │ │ │ │ │ └── util-hooks/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useAsyncDeepCompare.ts │ │ │ │ │ ├── useEffectDeepCompare.ts │ │ │ │ │ └── useMemoDeepCompare.ts │ │ │ │ ├── types/ │ │ │ │ │ ├── hypernative.type.ts │ │ │ │ │ └── index.ts │ │ │ │ └── utils/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── analysisUtils.test.ts │ │ │ │ │ ├── buildHypernativeBatchRequestData.test.ts │ │ │ │ │ ├── buildHypernativeMessageRequestData.test.ts │ │ │ │ │ ├── filterNonSafeRecipients.test.ts │ │ │ │ │ ├── generateTypedData.test.ts │ │ │ │ │ ├── getOverallStatus.test.ts │ │ │ │ │ ├── mapConsolidatedAnalysisResults.test.ts │ │ │ │ │ ├── mapHypernativeResponse.test.ts │ │ │ │ │ ├── mapVisibleAnalysisResults.test.ts │ │ │ │ │ ├── mergeAnalysisResults.test.ts │ │ │ │ │ ├── stringUtils.test.ts │ │ │ │ │ └── transformThreatAnalysisResponse.test.ts │ │ │ │ ├── analysisUtils.ts │ │ │ │ ├── buildHypernativeBatchRequestData.ts │ │ │ │ ├── buildHypernativeMessageRequestData.ts │ │ │ │ ├── buildHypernativeRequestData.ts │ │ │ │ ├── errors.ts │ │ │ │ ├── filterNonSafeRecipients.ts │ │ │ │ ├── generateTypedData.ts │ │ │ │ ├── getOverallStatus.ts │ │ │ │ ├── getPrimaryAnalysisResult.ts │ │ │ │ ├── index.ts │ │ │ │ ├── mapConsolidatedAnalysisResults.ts │ │ │ │ ├── mapHypernativeResponse.ts │ │ │ │ ├── mapVisibleAnalysisResults.ts │ │ │ │ ├── mergeAnalysisResults.ts │ │ │ │ ├── stringUtils.ts │ │ │ │ └── transformThreatAnalysisResponse.ts │ │ │ ├── stake/ │ │ │ │ ├── constants.ts │ │ │ │ └── utils/ │ │ │ │ └── beaconChain.ts │ │ │ └── swap/ │ │ │ ├── helpers/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── utils.test.ts │ │ │ │ ├── fee.ts │ │ │ │ └── utils.ts │ │ │ └── types.ts │ │ ├── hooks/ │ │ │ ├── __tests__/ │ │ │ │ ├── portfolioBalances.test.ts │ │ │ │ ├── useDebounce.test.ts │ │ │ │ ├── useIntervalCounter.test.ts │ │ │ │ └── useTotalBalances.test.ts │ │ │ ├── coreSDK/ │ │ │ │ ├── gasLimitUtils.ts │ │ │ │ ├── types.ts │ │ │ │ └── utils.ts │ │ │ ├── portfolioBalances.ts │ │ │ ├── useAsync.ts │ │ │ ├── useDebounce.ts │ │ │ ├── useDefaultGasLimit.ts │ │ │ ├── useDefaultGasPrice.ts │ │ │ ├── useIntervalCounter.ts │ │ │ ├── useSignerCanPay.ts │ │ │ ├── useTotalBalances.ts │ │ │ └── useTxTokenInfo.ts │ │ ├── services/ │ │ │ ├── ExternalStore.ts │ │ │ ├── RelayTxWatcher.ts │ │ │ ├── SimplePoller.ts │ │ │ ├── SimpleTxWatcher.ts │ │ │ ├── contracts/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── bytecodeComparison.test.ts │ │ │ │ │ ├── deployments.test.ts │ │ │ │ │ └── safeContracts.test.ts │ │ │ │ ├── bytecodeComparison.ts │ │ │ │ ├── deployments.ts │ │ │ │ ├── safeContracts.ts │ │ │ │ └── utils.ts │ │ │ ├── delegates/ │ │ │ │ └── index.ts │ │ │ ├── encodeSignatures.ts │ │ │ ├── exceptions/ │ │ │ │ ├── ErrorCodes.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ └── utils.test.ts │ │ │ │ └── utils.ts │ │ │ └── security/ │ │ │ └── modules/ │ │ │ ├── ApprovalModule/ │ │ │ │ └── index.ts │ │ │ ├── BlockaidModule/ │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── DelegateCallModule/ │ │ │ │ ├── index.test.ts │ │ │ │ └── index.ts │ │ │ └── types.ts │ │ ├── tests/ │ │ │ ├── Builder.ts │ │ │ ├── builders/ │ │ │ │ └── chains.ts │ │ │ ├── transactions.ts │ │ │ ├── utils.ts │ │ │ └── web3Provider.ts │ │ └── utils/ │ │ ├── __tests__/ │ │ │ ├── addressSimilarity.test.ts │ │ │ ├── addresses.test.ts │ │ │ ├── date.test.ts │ │ │ ├── formatNumber.test.ts │ │ │ ├── formatters.test.ts │ │ │ ├── gateway.test.ts │ │ │ ├── image.test.ts │ │ │ ├── numbers.test.ts │ │ │ ├── safe-setup-comparison.test.ts │ │ │ ├── validation.test.ts │ │ │ └── web3.test.ts │ │ ├── addressSimilarity.ts │ │ ├── addressSimilarity.types.ts │ │ ├── addresses.ts │ │ ├── chains.ts │ │ ├── constants.ts │ │ ├── date.ts │ │ ├── formatNumber.ts │ │ ├── formatters.ts │ │ ├── gateway.ts │ │ ├── helpers.ts │ │ ├── hex.ts │ │ ├── image.ts │ │ ├── multicall/ │ │ │ ├── deployments.ts │ │ │ ├── index.ts │ │ │ └── multicall.test.ts │ │ ├── numbers.ts │ │ ├── safe-hashes.ts │ │ ├── safe-messages.ts │ │ ├── safe-setup-comparison.ts │ │ ├── safe.ts │ │ ├── safeTransaction.ts │ │ ├── tokens.ts │ │ ├── validation.ts │ │ └── web3.ts │ └── tsconfig.json ├── scripts/ │ ├── jest.config.cjs │ ├── storybook/ │ │ ├── __tests__/ │ │ │ ├── coverage.test.ts │ │ │ ├── family.test.ts │ │ │ ├── priority.test.ts │ │ │ └── scanner.test.ts │ │ ├── coverage.ts │ │ ├── family.ts │ │ ├── generate-storybook-coverage.ts │ │ ├── priority.ts │ │ ├── scanner.ts │ │ └── types.ts │ ├── test-scaffold.mjs │ ├── verify-changed-hook.mjs │ └── verify.mjs ├── specs/ │ ├── 001-feature-architecture/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ └── feature-module.ts │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 001-migrate-hypernative-v3/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ └── hypernative-contract.ts │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 001-migrate-tx-builder/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ ├── external-apis.md │ │ │ ├── safe-apps-sdk.md │ │ │ └── tenderly-simulation.md │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 001-mobile-positions-tab/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 001-nested-safe-proposer/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ └── delegate-api.md │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 001-shadcn-storybook-migration/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ ├── common-component.stories.template.tsx │ │ │ ├── msw-handler.template.ts │ │ │ ├── page.stories.template.tsx │ │ │ └── ui-component.stories.template.tsx │ │ ├── data-model.md │ │ ├── msw-fixtures.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 002-bridge-refactor/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ └── README.md │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 002-counterfactual-refactor/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ └── public-api.ts │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 002-ledger-refactor/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ └── ledger-public-api.ts │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 002-refactor-earn-feature/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ └── feature-module.ts │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ ├── 004-migrate-no-fee-campaign/ │ │ ├── checklists/ │ │ │ └── requirements.md │ │ ├── contracts/ │ │ │ └── NoFeeCampaignContract.ts │ │ ├── data-model.md │ │ ├── plan.md │ │ ├── quickstart.md │ │ ├── research.md │ │ ├── spec.md │ │ └── tasks.md │ └── 004-proposer-multisig-validation/ │ ├── checklists/ │ │ └── requirements.md │ ├── contracts/ │ │ └── api-usage.md │ ├── data-model.md │ ├── plan.md │ ├── quickstart.md │ ├── research.md │ ├── spec.md │ └── tasks.md ├── tools/ │ └── codemods/ │ └── migrate-feature/ │ ├── .gitignore │ ├── QUICKSTART.md │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── analyze.ts │ │ ├── execute.ts │ │ ├── index.ts │ │ ├── templates.ts │ │ ├── transforms/ │ │ │ ├── exports.ts │ │ │ ├── fileStructure.ts │ │ │ ├── imports.ts │ │ │ └── relativeImports.ts │ │ ├── types.ts │ │ └── utils.ts │ └── tsconfig.json ├── turbo.json └── yarn.config.cjs ================================================ FILE CONTENTS ================================================ ================================================ FILE: .claude/commands/speckit.analyze.md ================================================ --- description: Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation. --- ## User Input ```text $ARGUMENTS ``` You **MUST** consider the user input before proceeding (if not empty). ## Goal Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (`spec.md`, `plan.md`, `tasks.md`) before implementation. This command MUST run only after `/speckit.tasks` has successfully produced a complete `tasks.md`. ## Operating Constraints **STRICTLY READ-ONLY**: Do **not** modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually). **Constitution Authority**: The project constitution (`.specify/memory/constitution.md`) is **non-negotiable** within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjustment of the spec, plan, or tasks—not dilution, reinterpretation, or silent ignoring of the principle. If a principle itself needs to change, that must occur in a separate, explicit constitution update outside `/speckit.analyze`. ## Execution Steps ### 1. Initialize Analysis Context Run `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths: - SPEC = FEATURE_DIR/spec.md - PLAN = FEATURE_DIR/plan.md - TASKS = FEATURE_DIR/tasks.md Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command). For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). ### 2. Load Artifacts (Progressive Disclosure) Load only the minimal necessary context from each artifact: **From spec.md:** - Overview/Context - Functional Requirements - Non-Functional Requirements - User Stories - Edge Cases (if present) **From plan.md:** - Architecture/stack choices - Data Model references - Phases - Technical constraints **From tasks.md:** - Task IDs - Descriptions - Phase grouping - Parallel markers [P] - Referenced file paths **From constitution:** - Load `.specify/memory/constitution.md` for principle validation ### 3. Build Semantic Models Create internal representations (do not include raw artifacts in output): - **Requirements inventory**: Each functional + non-functional requirement with a stable key (derive slug based on imperative phrase; e.g., "User can upload file" → `user-can-upload-file`) - **User story/action inventory**: Discrete user actions with acceptance criteria - **Task coverage mapping**: Map each task to one or more requirements or stories (inference by keyword / explicit reference patterns like IDs or key phrases) - **Constitution rule set**: Extract principle names and MUST/SHOULD normative statements ### 4. Detection Passes (Token-Efficient Analysis) Focus on high-signal findings. Limit to 50 findings total; aggregate remainder in overflow summary. #### A. Duplication Detection - Identify near-duplicate requirements - Mark lower-quality phrasing for consolidation #### B. Ambiguity Detection - Flag vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria - Flag unresolved placeholders (TODO, TKTK, ???, ``, etc.) #### C. Underspecification - Requirements with verbs but missing object or measurable outcome - User stories missing acceptance criteria alignment - Tasks referencing files or components not defined in spec/plan #### D. Constitution Alignment - Any requirement or plan element conflicting with a MUST principle - Missing mandated sections or quality gates from constitution #### E. Coverage Gaps - Requirements with zero associated tasks - Tasks with no mapped requirement/story - Non-functional requirements not reflected in tasks (e.g., performance, security) #### F. Inconsistency - Terminology drift (same concept named differently across files) - Data entities referenced in plan but absent in spec (or vice versa) - Task ordering contradictions (e.g., integration tasks before foundational setup tasks without dependency note) - Conflicting requirements (e.g., one requires Next.js while other specifies Vue) ### 5. Severity Assignment Use this heuristic to prioritize findings: - **CRITICAL**: Violates constitution MUST, missing core spec artifact, or requirement with zero coverage that blocks baseline functionality - **HIGH**: Duplicate or conflicting requirement, ambiguous security/performance attribute, untestable acceptance criterion - **MEDIUM**: Terminology drift, missing non-functional task coverage, underspecified edge case - **LOW**: Style/wording improvements, minor redundancy not affecting execution order ### 6. Produce Compact Analysis Report Output a Markdown report (no file writes) with the following structure: ## Specification Analysis Report | ID | Category | Severity | Location(s) | Summary | Recommendation | | --- | ----------- | -------- | ---------------- | ---------------------------- | ------------------------------------ | | A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version | (Add one row per finding; generate stable IDs prefixed by category initial.) **Coverage Summary Table:** | Requirement Key | Has Task? | Task IDs | Notes | | --------------- | --------- | -------- | ----- | **Constitution Alignment Issues:** (if any) **Unmapped Tasks:** (if any) **Metrics:** - Total Requirements - Total Tasks - Coverage % (requirements with >=1 task) - Ambiguity Count - Duplication Count - Critical Issues Count ### 7. Provide Next Actions At end of report, output a concise Next Actions block: - If CRITICAL issues exist: Recommend resolving before `/speckit.implement` - If only LOW/MEDIUM: User may proceed, but provide improvement suggestions - Provide explicit command suggestions: e.g., "Run /speckit.specify with refinement", "Run /speckit.plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'" ### 8. Offer Remediation Ask the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.) ## Operating Principles ### Context Efficiency - **Minimal high-signal tokens**: Focus on actionable findings, not exhaustive documentation - **Progressive disclosure**: Load artifacts incrementally; don't dump all content into analysis - **Token-efficient output**: Limit findings table to 50 rows; summarize overflow - **Deterministic results**: Rerunning without changes should produce consistent IDs and counts ### Analysis Guidelines - **NEVER modify files** (this is read-only analysis) - **NEVER hallucinate missing sections** (if absent, report them accurately) - **Prioritize constitution violations** (these are always CRITICAL) - **Use examples over exhaustive rules** (cite specific instances, not generic patterns) - **Report zero issues gracefully** (emit success report with coverage statistics) ## Context $ARGUMENTS ================================================ FILE: .claude/commands/speckit.checklist.md ================================================ --- description: Generate a custom checklist for the current feature based on user requirements. --- ## Checklist Purpose: "Unit Tests for English" **CRITICAL CONCEPT**: Checklists are **UNIT TESTS FOR REQUIREMENTS WRITING** - they validate the quality, clarity, and completeness of requirements in a given domain. **NOT for verification/testing**: - ❌ NOT "Verify the button clicks correctly" - ❌ NOT "Test error handling works" - ❌ NOT "Confirm the API returns 200" - ❌ NOT checking if code/implementation matches the spec **FOR requirements quality validation**: - ✅ "Are visual hierarchy requirements defined for all card types?" (completeness) - ✅ "Is 'prominent display' quantified with specific sizing/positioning?" (clarity) - ✅ "Are hover state requirements consistent across all interactive elements?" (consistency) - ✅ "Are accessibility requirements defined for keyboard navigation?" (coverage) - ✅ "Does the spec define what happens when logo image fails to load?" (edge cases) **Metaphor**: If your spec is code written in English, the checklist is its unit test suite. You're testing whether the requirements are well-written, complete, unambiguous, and ready for implementation - NOT whether the implementation works. ## User Input ```text $ARGUMENTS ``` You **MUST** consider the user input before proceeding (if not empty). ## Execution Steps 1. **Setup**: Run `.specify/scripts/bash/check-prerequisites.sh --json` from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS list. - All file paths must be absolute. - For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). 2. **Clarify intent (dynamic)**: Derive up to THREE initial contextual clarifying questions (no pre-baked catalog). They MUST: - Be generated from the user's phrasing + extracted signals from spec/plan/tasks - Only ask about information that materially changes checklist content - Be skipped individually if already unambiguous in `$ARGUMENTS` - Prefer precision over breadth Generation algorithm: 1. Extract signals: feature domain keywords (e.g., auth, latency, UX, API), risk indicators ("critical", "must", "compliance"), stakeholder hints ("QA", "review", "security team"), and explicit deliverables ("a11y", "rollback", "contracts"). 2. Cluster signals into candidate focus areas (max 4) ranked by relevance. 3. Identify probable audience & timing (author, reviewer, QA, release) if not explicit. 4. Detect missing dimensions: scope breadth, depth/rigor, risk emphasis, exclusion boundaries, measurable acceptance criteria. 5. Formulate questions chosen from these archetypes: - Scope refinement (e.g., "Should this include integration touchpoints with X and Y or stay limited to local module correctness?") - Risk prioritization (e.g., "Which of these potential risk areas should receive mandatory gating checks?") - Depth calibration (e.g., "Is this a lightweight pre-commit sanity list or a formal release gate?") - Audience framing (e.g., "Will this be used by the author only or peers during PR review?") - Boundary exclusion (e.g., "Should we explicitly exclude performance tuning items this round?") - Scenario class gap (e.g., "No recovery flows detected—are rollback / partial failure paths in scope?") Question formatting rules: - If presenting options, generate a compact table with columns: Option | Candidate | Why It Matters - Limit to A–E options maximum; omit table if a free-form answer is clearer - Never ask the user to restate what they already said - Avoid speculative categories (no hallucination). If uncertain, ask explicitly: "Confirm whether X belongs in scope." Defaults when interaction impossible: - Depth: Standard - Audience: Reviewer (PR) if code-related; Author otherwise - Focus: Top 2 relevance clusters Output the questions (label Q1/Q2/Q3). After answers: if ≥2 scenario classes (Alternate / Exception / Recovery / Non-Functional domain) remain unclear, you MAY ask up to TWO more targeted follow‑ups (Q4/Q5) with a one-line justification each (e.g., "Unresolved recovery path risk"). Do not exceed five total questions. Skip escalation if user explicitly declines more. 3. **Understand user request**: Combine `$ARGUMENTS` + clarifying answers: - Derive checklist theme (e.g., security, review, deploy, ux) - Consolidate explicit must-have items mentioned by user - Map focus selections to category scaffolding - Infer any missing context from spec/plan/tasks (do NOT hallucinate) 4. **Load feature context**: Read from FEATURE_DIR: - spec.md: Feature requirements and scope - plan.md (if exists): Technical details, dependencies - tasks.md (if exists): Implementation tasks **Context Loading Strategy**: - Load only necessary portions relevant to active focus areas (avoid full-file dumping) - Prefer summarizing long sections into concise scenario/requirement bullets - Use progressive disclosure: add follow-on retrieval only if gaps detected - If source docs are large, generate interim summary items instead of embedding raw text 5. **Generate checklist** - Create "Unit Tests for Requirements": - Create `FEATURE_DIR/checklists/` directory if it doesn't exist - Generate unique checklist filename: - Use short, descriptive name based on domain (e.g., `ux.md`, `api.md`, `security.md`) - Format: `[domain].md` - If file exists, append to existing file - Number items sequentially starting from CHK001 - Each `/speckit.checklist` run creates a NEW file (never overwrites existing checklists) **CORE PRINCIPLE - Test the Requirements, Not the Implementation**: Every checklist item MUST evaluate the REQUIREMENTS THEMSELVES for: - **Completeness**: Are all necessary requirements present? - **Clarity**: Are requirements unambiguous and specific? - **Consistency**: Do requirements align with each other? - **Measurability**: Can requirements be objectively verified? - **Coverage**: Are all scenarios/edge cases addressed? **Category Structure** - Group items by requirement quality dimensions: - **Requirement Completeness** (Are all necessary requirements documented?) - **Requirement Clarity** (Are requirements specific and unambiguous?) - **Requirement Consistency** (Do requirements align without conflicts?) - **Acceptance Criteria Quality** (Are success criteria measurable?) - **Scenario Coverage** (Are all flows/cases addressed?) - **Edge Case Coverage** (Are boundary conditions defined?) - **Non-Functional Requirements** (Performance, Security, Accessibility, etc. - are they specified?) - **Dependencies & Assumptions** (Are they documented and validated?) - **Ambiguities & Conflicts** (What needs clarification?) **HOW TO WRITE CHECKLIST ITEMS - "Unit Tests for English"**: ❌ **WRONG** (Testing implementation): - "Verify landing page displays 3 episode cards" - "Test hover states work on desktop" - "Confirm logo click navigates home" ✅ **CORRECT** (Testing requirements quality): - "Are the exact number and layout of featured episodes specified?" [Completeness] - "Is 'prominent display' quantified with specific sizing/positioning?" [Clarity] - "Are hover state requirements consistent across all interactive elements?" [Consistency] - "Are keyboard navigation requirements defined for all interactive UI?" [Coverage] - "Is the fallback behavior specified when logo image fails to load?" [Edge Cases] - "Are loading states defined for asynchronous episode data?" [Completeness] - "Does the spec define visual hierarchy for competing UI elements?" [Clarity] **ITEM STRUCTURE**: Each item should follow this pattern: - Question format asking about requirement quality - Focus on what's WRITTEN (or not written) in the spec/plan - Include quality dimension in brackets [Completeness/Clarity/Consistency/etc.] - Reference spec section `[Spec §X.Y]` when checking existing requirements - Use `[Gap]` marker when checking for missing requirements **EXAMPLES BY QUALITY DIMENSION**: Completeness: - "Are error handling requirements defined for all API failure modes? [Gap]" - "Are accessibility requirements specified for all interactive elements? [Completeness]" - "Are mobile breakpoint requirements defined for responsive layouts? [Gap]" Clarity: - "Is 'fast loading' quantified with specific timing thresholds? [Clarity, Spec §NFR-2]" - "Are 'related episodes' selection criteria explicitly defined? [Clarity, Spec §FR-5]" - "Is 'prominent' defined with measurable visual properties? [Ambiguity, Spec §FR-4]" Consistency: - "Do navigation requirements align across all pages? [Consistency, Spec §FR-10]" - "Are card component requirements consistent between landing and detail pages? [Consistency]" Coverage: - "Are requirements defined for zero-state scenarios (no episodes)? [Coverage, Edge Case]" - "Are concurrent user interaction scenarios addressed? [Coverage, Gap]" - "Are requirements specified for partial data loading failures? [Coverage, Exception Flow]" Measurability: - "Are visual hierarchy requirements measurable/testable? [Acceptance Criteria, Spec §FR-1]" - "Can 'balanced visual weight' be objectively verified? [Measurability, Spec §FR-2]" **Scenario Classification & Coverage** (Requirements Quality Focus): - Check if requirements exist for: Primary, Alternate, Exception/Error, Recovery, Non-Functional scenarios - For each scenario class, ask: "Are [scenario type] requirements complete, clear, and consistent?" - If scenario class missing: "Are [scenario type] requirements intentionally excluded or missing? [Gap]" - Include resilience/rollback when state mutation occurs: "Are rollback requirements defined for migration failures? [Gap]" **Traceability Requirements**: - MINIMUM: ≥80% of items MUST include at least one traceability reference - Each item should reference: spec section `[Spec §X.Y]`, or use markers: `[Gap]`, `[Ambiguity]`, `[Conflict]`, `[Assumption]` - If no ID system exists: "Is a requirement & acceptance criteria ID scheme established? [Traceability]" **Surface & Resolve Issues** (Requirements Quality Problems): Ask questions about the requirements themselves: - Ambiguities: "Is the term 'fast' quantified with specific metrics? [Ambiguity, Spec §NFR-1]" - Conflicts: "Do navigation requirements conflict between §FR-10 and §FR-10a? [Conflict]" - Assumptions: "Is the assumption of 'always available podcast API' validated? [Assumption]" - Dependencies: "Are external podcast API requirements documented? [Dependency, Gap]" - Missing definitions: "Is 'visual hierarchy' defined with measurable criteria? [Gap]" **Content Consolidation**: - Soft cap: If raw candidate items > 40, prioritize by risk/impact - Merge near-duplicates checking the same requirement aspect - If >5 low-impact edge cases, create one item: "Are edge cases X, Y, Z addressed in requirements? [Coverage]" **🚫 ABSOLUTELY PROHIBITED** - These make it an implementation test, not a requirements test: - ❌ Any item starting with "Verify", "Test", "Confirm", "Check" + implementation behavior - ❌ References to code execution, user actions, system behavior - ❌ "Displays correctly", "works properly", "functions as expected" - ❌ "Click", "navigate", "render", "load", "execute" - ❌ Test cases, test plans, QA procedures - ❌ Implementation details (frameworks, APIs, algorithms) **✅ REQUIRED PATTERNS** - These test requirements quality: - ✅ "Are [requirement type] defined/specified/documented for [scenario]?" - ✅ "Is [vague term] quantified/clarified with specific criteria?" - ✅ "Are requirements consistent between [section A] and [section B]?" - ✅ "Can [requirement] be objectively measured/verified?" - ✅ "Are [edge cases/scenarios] addressed in requirements?" - ✅ "Does the spec define [missing aspect]?" 6. **Structure Reference**: Generate the checklist following the canonical template in `.specify/templates/checklist-template.md` for title, meta section, category headings, and ID formatting. If template is unavailable, use: H1 title, purpose/created meta lines, `##` category sections containing `- [ ] CHK### ` lines with globally incrementing IDs starting at CHK001. 7. **Report**: Output full path to created checklist, item count, and remind user that each run creates a new file. Summarize: - Focus areas selected - Depth level - Actor/timing - Any explicit user-specified must-have items incorporated **Important**: Each `/speckit.checklist` command invocation creates a checklist file using short, descriptive names unless file already exists. This allows: - Multiple checklists of different types (e.g., `ux.md`, `test.md`, `security.md`) - Simple, memorable filenames that indicate checklist purpose - Easy identification and navigation in the `checklists/` folder To avoid clutter, use descriptive types and clean up obsolete checklists when done. ## Example Checklist Types & Sample Items **UX Requirements Quality:** `ux.md` Sample items (testing the requirements, NOT the implementation): - "Are visual hierarchy requirements defined with measurable criteria? [Clarity, Spec §FR-1]" - "Is the number and positioning of UI elements explicitly specified? [Completeness, Spec §FR-1]" - "Are interaction state requirements (hover, focus, active) consistently defined? [Consistency]" - "Are accessibility requirements specified for all interactive elements? [Coverage, Gap]" - "Is fallback behavior defined when images fail to load? [Edge Case, Gap]" - "Can 'prominent display' be objectively measured? [Measurability, Spec §FR-4]" **API Requirements Quality:** `api.md` Sample items: - "Are error response formats specified for all failure scenarios? [Completeness]" - "Are rate limiting requirements quantified with specific thresholds? [Clarity]" - "Are authentication requirements consistent across all endpoints? [Consistency]" - "Are retry/timeout requirements defined for external dependencies? [Coverage, Gap]" - "Is versioning strategy documented in requirements? [Gap]" **Performance Requirements Quality:** `performance.md` Sample items: - "Are performance requirements quantified with specific metrics? [Clarity]" - "Are performance targets defined for all critical user journeys? [Coverage]" - "Are performance requirements under different load conditions specified? [Completeness]" - "Can performance requirements be objectively measured? [Measurability]" - "Are degradation requirements defined for high-load scenarios? [Edge Case, Gap]" **Security Requirements Quality:** `security.md` Sample items: - "Are authentication requirements specified for all protected resources? [Coverage]" - "Are data protection requirements defined for sensitive information? [Completeness]" - "Is the threat model documented and requirements aligned to it? [Traceability]" - "Are security requirements consistent with compliance obligations? [Consistency]" - "Are security failure/breach response requirements defined? [Gap, Exception Flow]" ## Anti-Examples: What NOT To Do **❌ WRONG - These test implementation, not requirements:** ```markdown - [ ] CHK001 - Verify landing page displays 3 episode cards [Spec §FR-001] - [ ] CHK002 - Test hover states work correctly on desktop [Spec §FR-003] - [ ] CHK003 - Confirm logo click navigates to home page [Spec §FR-010] - [ ] CHK004 - Check that related episodes section shows 3-5 items [Spec §FR-005] ``` **✅ CORRECT - These test requirements quality:** ```markdown - [ ] CHK001 - Are the number and layout of featured episodes explicitly specified? [Completeness, Spec §FR-001] - [ ] CHK002 - Are hover state requirements consistently defined for all interactive elements? [Consistency, Spec §FR-003] - [ ] CHK003 - Are navigation requirements clear for all clickable brand elements? [Clarity, Spec §FR-010] - [ ] CHK004 - Is the selection criteria for related episodes documented? [Gap, Spec §FR-005] - [ ] CHK005 - Are loading state requirements defined for asynchronous episode data? [Gap] - [ ] CHK006 - Can "visual hierarchy" requirements be objectively measured? [Measurability, Spec §FR-001] ``` **Key Differences:** - Wrong: Tests if the system works correctly - Correct: Tests if the requirements are written correctly - Wrong: Verification of behavior - Correct: Validation of requirement quality - Wrong: "Does it do X?" - Correct: "Is X clearly specified?" ================================================ FILE: .claude/commands/speckit.clarify.md ================================================ --- description: Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec. handoffs: - label: Build Technical Plan agent: speckit.plan prompt: Create a plan for the spec. I am building with... --- ## User Input ```text $ARGUMENTS ``` You **MUST** consider the user input before proceeding (if not empty). ## Outline Goal: Detect and reduce ambiguity or missing decision points in the active feature specification and record the clarifications directly in the spec file. Note: This clarification workflow is expected to run (and be completed) BEFORE invoking `/speckit.plan`. If the user explicitly states they are skipping clarification (e.g., exploratory spike), you may proceed, but must warn that downstream rework risk increases. Execution steps: 1. Run `.specify/scripts/bash/check-prerequisites.sh --json --paths-only` from repo root **once** (combined `--json --paths-only` mode / `-Json -PathsOnly`). Parse minimal JSON payload fields: - `FEATURE_DIR` - `FEATURE_SPEC` - (Optionally capture `IMPL_PLAN`, `TASKS` for future chained flows.) - If JSON parsing fails, abort and instruct user to re-run `/speckit.specify` or verify feature branch environment. - For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot"). 2. Load the current spec file. Perform a structured ambiguity & coverage scan using this taxonomy. For each category, mark status: Clear / Partial / Missing. Produce an internal coverage map used for prioritization (do not output raw map unless no questions will be asked). Functional Scope & Behavior: - Core user goals & success criteria - Explicit out-of-scope declarations - User roles / personas differentiation Domain & Data Model: - Entities, attributes, relationships - Identity & uniqueness rules - Lifecycle/state transitions - Data volume / scale assumptions Interaction & UX Flow: - Critical user journeys / sequences - Error/empty/loading states - Accessibility or localization notes Non-Functional Quality Attributes: - Performance (latency, throughput targets) - Scalability (horizontal/vertical, limits) - Reliability & availability (uptime, recovery expectations) - Observability (logging, metrics, tracing signals) - Security & privacy (authN/Z, data protection, threat assumptions) - Compliance / regulatory constraints (if any) Integration & External Dependencies: - External services/APIs and failure modes - Data import/export formats - Protocol/versioning assumptions Edge Cases & Failure Handling: - Negative scenarios - Rate limiting / throttling - Conflict resolution (e.g., concurrent edits) Constraints & Tradeoffs: - Technical constraints (language, storage, hosting) - Explicit tradeoffs or rejected alternatives Terminology & Consistency: - Canonical glossary terms - Avoided synonyms / deprecated terms Completion Signals: - Acceptance criteria testability - Measurable Definition of Done style indicators Misc / Placeholders: - TODO markers / unresolved decisions - Ambiguous adjectives ("robust", "intuitive") lacking quantification For each category with Partial or Missing status, add a candidate question opportunity unless: - Clarification would not materially change implementation or validation strategy - Information is better deferred to planning phase (note internally) 3. Generate (internally) a prioritized queue of candidate clarification questions (maximum 5). Do NOT output them all at once. Apply these constraints: - Maximum of 10 total questions across the whole session. - Each question must be answerable with EITHER: - A short multiple‑choice selection (2–5 distinct, mutually exclusive options), OR - A one-word / short‑phrase answer (explicitly constrain: "Answer in <=5 words"). - Only include questions whose answers materially impact architecture, data modeling, task decomposition, test design, UX behavior, operational readiness, or compliance validation. - Ensure category coverage balance: attempt to cover the highest impact unresolved categories first; avoid asking two low-impact questions when a single high-impact area (e.g., security posture) is unresolved. - Exclude questions already answered, trivial stylistic preferences, or plan-level execution details (unless blocking correctness). - Favor clarifications that reduce downstream rework risk or prevent misaligned acceptance tests. - If more than 5 categories remain unresolved, select the top 5 by (Impact \* Uncertainty) heuristic. 4. Sequential questioning loop (interactive): - Present EXACTLY ONE question at a time. - For multiple‑choice questions: - **Analyze all options** and determine the **most suitable option** based on: - Best practices for the project type - Common patterns in similar implementations - Risk reduction (security, performance, maintainability) - Alignment with any explicit project goals or constraints visible in the spec - Present your **recommended option prominently** at the top with clear reasoning (1-2 sentences explaining why this is the best choice). - Format as: `**Recommended:** Option [X] - ` - Then render all options as a Markdown table: | Option | Description | | ------ | --------------------------------------------------------------------------------------------------- | | A |