wallet-stack 1.0.0-alpha.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/app.plugin.js +1 -0
- package/locales/base/translation.json +2998 -0
- package/locales/de/translation.json +2998 -0
- package/locales/en-US/translation.json +2998 -0
- package/locales/es-419/translation.json +2998 -0
- package/locales/fr-FR/translation.json +2998 -0
- package/locales/index.ts +163 -0
- package/locales/it-IT/translation.json +2998 -0
- package/locales/pl-PL/translation.json +3004 -0
- package/locales/pt-BR/translation.json +2998 -0
- package/locales/ru-RU/translation.json +3004 -0
- package/locales/th-TH/translation.json +2995 -0
- package/locales/tr-TR/translation.json +2998 -0
- package/locales/uk-UA/translation.json +3004 -0
- package/locales/vi-VN/translation.json +2995 -0
- package/locales/zh-CN/translation.json +2995 -0
- package/metro-config.js +40 -0
- package/package.json +227 -0
- package/plugin/build/consts.d.ts +2 -0
- package/plugin/build/consts.js +6 -0
- package/plugin/build/index.d.ts +8 -0
- package/plugin/build/index.js +21 -0
- package/plugin/build/withAndroidUserAgent.d.ts +8 -0
- package/plugin/build/withAndroidUserAgent.js +86 -0
- package/plugin/build/withAndroidWindowSoftInputModeAdjustNothing.d.ts +6 -0
- package/plugin/build/withAndroidWindowSoftInputModeAdjustNothing.js +16 -0
- package/plugin/build/withIosAppDelegateResetKeychain.d.ts +2 -0
- package/plugin/build/withIosAppDelegateResetKeychain.js +77 -0
- package/plugin/build/withIosUserAgent.d.ts +8 -0
- package/plugin/build/withIosUserAgent.js +56 -0
- package/plugin/tsconfig.json +13 -0
- package/src/RevokePhoneNumber.tsx +117 -0
- package/src/abis/IWalletJumpstart.ts +472 -0
- package/src/account/AccountErrorScreen.test.tsx +47 -0
- package/src/account/AccountErrorScreen.tsx +72 -0
- package/src/account/AccountKeyEducation.test.tsx +20 -0
- package/src/account/AccountKeyEducation.tsx +83 -0
- package/src/account/AccountSetupFailureScreen.test.tsx +59 -0
- package/src/account/AccountSetupFailureScreen.tsx +42 -0
- package/src/account/Education.test.tsx +48 -0
- package/src/account/Education.tsx +235 -0
- package/src/account/GoldEducation.test.tsx +35 -0
- package/src/account/GoldEducation.tsx +82 -0
- package/src/account/LegalSubmenu.test.tsx +84 -0
- package/src/account/LegalSubmenu.tsx +74 -0
- package/src/account/LicenseDisclaimer.txt +15310 -0
- package/src/account/Licenses.test.tsx +17 -0
- package/src/account/Licenses.tsx +43 -0
- package/src/account/PreferencesSubmenu.test.tsx +66 -0
- package/src/account/PreferencesSubmenu.tsx +87 -0
- package/src/account/PrivateKey.test.tsx +241 -0
- package/src/account/PrivateKey.tsx +169 -0
- package/src/account/Profile.test.tsx +77 -0
- package/src/account/Profile.tsx +153 -0
- package/src/account/ProfileSubmenu.test.tsx +105 -0
- package/src/account/ProfileSubmenu.tsx +89 -0
- package/src/account/SecuritySubmenu.test.tsx +305 -0
- package/src/account/SecuritySubmenu.tsx +435 -0
- package/src/account/ShakeForSupport.test.tsx +23 -0
- package/src/account/ShakeForSupport.tsx +112 -0
- package/src/account/StoreWipeRecoveryScreen.test.tsx +39 -0
- package/src/account/StoreWipeRecoveryScreen.tsx +50 -0
- package/src/account/Support.test.tsx +67 -0
- package/src/account/Support.tsx +69 -0
- package/src/account/SupportContact.test.tsx +95 -0
- package/src/account/SupportContact.tsx +265 -0
- package/src/account/__snapshots__/AccountKeyEducation.test.tsx.snap +579 -0
- package/src/account/__snapshots__/Education.test.tsx.snap +286 -0
- package/src/account/__snapshots__/GoldEducation.test.tsx.snap +579 -0
- package/src/account/__snapshots__/Licenses.test.tsx.snap +33 -0
- package/src/account/__snapshots__/ShakeForSupport.test.tsx.snap +3 -0
- package/src/account/actions.ts +270 -0
- package/src/account/reducer.test.ts +28 -0
- package/src/account/reducer.ts +296 -0
- package/src/account/saga.test.ts +209 -0
- package/src/account/saga.ts +249 -0
- package/src/account/selectors.test.ts +18 -0
- package/src/account/selectors.ts +60 -0
- package/src/account/updateAccountRegistration.ts +35 -0
- package/src/account/utils.ts +36 -0
- package/src/account/zendesk.test.ts +166 -0
- package/src/account/zendesk.ts +199 -0
- package/src/alert/AlertBanner.test.tsx +123 -0
- package/src/alert/AlertBanner.tsx +84 -0
- package/src/alert/actions.ts +127 -0
- package/src/alert/reducer.ts +52 -0
- package/src/analytics/AppAnalytics.test.ts +334 -0
- package/src/analytics/AppAnalytics.ts +369 -0
- package/src/analytics/AsyncStoragePersistor.ts +34 -0
- package/src/analytics/Events.test.tsx +49 -0
- package/src/analytics/Events.tsx +648 -0
- package/src/analytics/InjectTraits.ts +34 -0
- package/src/analytics/Properties.tsx +1645 -0
- package/src/analytics/README.md +24 -0
- package/src/analytics/docs.ts +675 -0
- package/src/analytics/saga.test.ts +57 -0
- package/src/analytics/saga.ts +21 -0
- package/src/analytics/selectors.test.ts +391 -0
- package/src/analytics/selectors.ts +200 -0
- package/src/analytics/types.ts +46 -0
- package/src/app/App.test.tsx +25 -0
- package/src/app/App.tsx +124 -0
- package/src/app/AppInitGate.test.tsx +100 -0
- package/src/app/AppInitGate.tsx +77 -0
- package/src/app/AppLoading.test.tsx +11 -0
- package/src/app/AppLoading.tsx +79 -0
- package/src/app/DebugImages.tsx +110 -0
- package/src/app/ErrorBoundary.test.tsx +19 -0
- package/src/app/ErrorBoundary.tsx +41 -0
- package/src/app/ErrorMessages.ts +40 -0
- package/src/app/ErrorScreen.test.tsx +26 -0
- package/src/app/ErrorScreen.tsx +57 -0
- package/src/app/SanctionedCountryErrorScreen.tsx +37 -0
- package/src/app/UpgradeScreen.tsx +28 -0
- package/src/app/__snapshots__/AppLoading.test.tsx.snap +35 -0
- package/src/app/__snapshots__/ErrorScreen.test.tsx.snap +365 -0
- package/src/app/actions.ts +301 -0
- package/src/app/crowd_mobile.png +0 -0
- package/src/app/reducers.ts +204 -0
- package/src/app/saga.test.ts +651 -0
- package/src/app/saga.ts +367 -0
- package/src/app/selectors.ts +53 -0
- package/src/app/useDeepLinks.test.tsx +43 -0
- package/src/app/useDeepLinks.ts +72 -0
- package/src/app/utils.ts +14 -0
- package/src/appConfig.test.ts +37 -0
- package/src/appConfig.ts +20 -0
- package/src/backup/BackupComplete.test.tsx +61 -0
- package/src/backup/BackupComplete.tsx +69 -0
- package/src/backup/BackupIntroduction.test.tsx +37 -0
- package/src/backup/BackupIntroduction.tsx +157 -0
- package/src/backup/BackupPhrase.test.tsx +71 -0
- package/src/backup/BackupPhrase.tsx +208 -0
- package/src/backup/BackupPhraseContainer.test.tsx +43 -0
- package/src/backup/BackupPhraseContainer.tsx +207 -0
- package/src/backup/BackupQuiz.test.tsx +130 -0
- package/src/backup/BackupQuiz.tsx +429 -0
- package/src/backup/CancelConfirm.tsx +60 -0
- package/src/backup/QuizzBottom.tsx +57 -0
- package/src/backup/__snapshots__/BackupComplete.test.tsx.snap +58 -0
- package/src/backup/__snapshots__/BackupPhrase.test.tsx.snap +906 -0
- package/src/backup/__snapshots__/BackupPhraseContainer.test.tsx.snap +719 -0
- package/src/backup/__snapshots__/BackupQuiz.test.tsx.snap +1313 -0
- package/src/backup/utils.test.ts +91 -0
- package/src/backup/utils.ts +103 -0
- package/src/celoNews/CeloNewsFeed.test.tsx +157 -0
- package/src/celoNews/CeloNewsFeed.tsx +161 -0
- package/src/celoNews/CeloNewsFeedItem.test.tsx +46 -0
- package/src/celoNews/CeloNewsFeedItem.tsx +104 -0
- package/src/celoNews/types.ts +14 -0
- package/src/components/AccountNumber.test.tsx +25 -0
- package/src/components/AccountNumber.tsx +78 -0
- package/src/components/AccountNumberCard.tsx +23 -0
- package/src/components/Avatar.test.tsx +67 -0
- package/src/components/Avatar.tsx +72 -0
- package/src/components/BackButton.tsx +44 -0
- package/src/components/BeatingHeartLoader.tsx +39 -0
- package/src/components/BorderlessButton.tsx +25 -0
- package/src/components/BottomSheet.tsx +84 -0
- package/src/components/BottomSheetBase.tsx +87 -0
- package/src/components/BottomSheetScrollView.tsx +54 -0
- package/src/components/Button.test.tsx +94 -0
- package/src/components/Button.tsx +259 -0
- package/src/components/CallToActionsBar.tsx +68 -0
- package/src/components/CancelButton.test.tsx +11 -0
- package/src/components/CancelButton.tsx +58 -0
- package/src/components/Card.tsx +34 -0
- package/src/components/CircleButton.test.tsx +35 -0
- package/src/components/CircleButton.tsx +64 -0
- package/src/components/ClipboardAwarePasteButton.tsx +65 -0
- package/src/components/CloseButton.tsx +41 -0
- package/src/components/CodeInput.test.tsx +26 -0
- package/src/components/CodeInput.tsx +124 -0
- package/src/components/CodeRow.test.tsx +27 -0
- package/src/components/CodeRow.tsx +163 -0
- package/src/components/ContactCircle.test.tsx +67 -0
- package/src/components/ContactCircle.tsx +133 -0
- package/src/components/ContactCircleSelf.tsx +28 -0
- package/src/components/CurrencyDisplay.tsx +242 -0
- package/src/components/DataFieldWithCopy.tsx +75 -0
- package/src/components/DevSkipButton.tsx +105 -0
- package/src/components/Dialog.test.tsx +14 -0
- package/src/components/Dialog.tsx +124 -0
- package/src/components/Dropdown.tsx +98 -0
- package/src/components/EmptyView.tsx +34 -0
- package/src/components/ErrorMessageInline.tsx +78 -0
- package/src/components/ExchangesBottomSheet.test.tsx +84 -0
- package/src/components/ExchangesBottomSheet.tsx +74 -0
- package/src/components/Expandable.tsx +57 -0
- package/src/components/FeeDrawer.test.tsx +150 -0
- package/src/components/FeeDrawer.tsx +127 -0
- package/src/components/FeeIcon.test.tsx +14 -0
- package/src/components/FeeIcon.tsx +95 -0
- package/src/components/FeeInfoBottomSheet.test.tsx +320 -0
- package/src/components/FeeInfoBottomSheet.tsx +219 -0
- package/src/components/FilterChipsCarousel.tsx +143 -0
- package/src/components/FormField.tsx +23 -0
- package/src/components/FormLabel.tsx +21 -0
- package/src/components/FormTextInput.tsx +16 -0
- package/src/components/FullscreenCTA.test.tsx +58 -0
- package/src/components/FullscreenCTA.tsx +60 -0
- package/src/components/GasFeeWarning.test.tsx +126 -0
- package/src/components/GasFeeWarning.tsx +124 -0
- package/src/components/GradientBlock.tsx +20 -0
- package/src/components/HorizontalLine.tsx +18 -0
- package/src/components/IconWithNetworkBadge.test.tsx +49 -0
- package/src/components/IconWithNetworkBadge.tsx +69 -0
- package/src/components/InLineNotification.test.tsx +74 -0
- package/src/components/InLineNotification.tsx +160 -0
- package/src/components/InfoBottomSheet.test.tsx +55 -0
- package/src/components/InfoBottomSheet.tsx +79 -0
- package/src/components/ItemSeparator.test.tsx +8 -0
- package/src/components/ItemSeparator.tsx +16 -0
- package/src/components/KeyboardAwareScrollView.tsx +104 -0
- package/src/components/KeyboardSpacer.tsx +168 -0
- package/src/components/LabelWithInfo.tsx +57 -0
- package/src/components/LegacyTokenDisplay.test.tsx +282 -0
- package/src/components/LegacyTokenDisplay.tsx +63 -0
- package/src/components/LegacyTokenTotalLineItem.test.tsx +90 -0
- package/src/components/LegacyTokenTotalLineItem.tsx +38 -0
- package/src/components/LineItemRow.tsx +74 -0
- package/src/components/ListItem.test.tsx +19 -0
- package/src/components/ListItem.tsx +44 -0
- package/src/components/MessagingCard.tsx +21 -0
- package/src/components/Modal.tsx +57 -0
- package/src/components/NumberKeypad.test.tsx +21 -0
- package/src/components/NumberKeypad.tsx +102 -0
- package/src/components/NumberTicker.tsx +115 -0
- package/src/components/OnboardingCard.tsx +61 -0
- package/src/components/Pagination.tsx +39 -0
- package/src/components/PercentageIndicator.test.tsx +118 -0
- package/src/components/PercentageIndicator.tsx +75 -0
- package/src/components/PhoneNumberInput.test.tsx +99 -0
- package/src/components/PhoneNumberInput.tsx +132 -0
- package/src/components/PhoneNumberWithFlag.tsx +54 -0
- package/src/components/QrScanButton.test.tsx +21 -0
- package/src/components/QrScanButton.tsx +30 -0
- package/src/components/RecoveryPhraseInput.test.tsx +26 -0
- package/src/components/RecoveryPhraseInput.tsx +188 -0
- package/src/components/ReviewHeader.test.tsx +21 -0
- package/src/components/ReviewHeader.tsx +36 -0
- package/src/components/ReviewTransaction.test.tsx +474 -0
- package/src/components/ReviewTransaction.tsx +526 -0
- package/src/components/RowDivider.tsx +36 -0
- package/src/components/SearchInput.tsx +40 -0
- package/src/components/SectionHead.test.tsx +9 -0
- package/src/components/SectionHead.tsx +33 -0
- package/src/components/SegmentedControl.test.tsx +28 -0
- package/src/components/SegmentedControl.tsx +156 -0
- package/src/components/SelectRecipientButton.tsx +89 -0
- package/src/components/SelectionOption.test.tsx +18 -0
- package/src/components/SelectionOption.tsx +62 -0
- package/src/components/SettingsGearButton.tsx +30 -0
- package/src/components/SettingsItem.test.tsx +80 -0
- package/src/components/SettingsItem.tsx +195 -0
- package/src/components/SimpleMessagingCard.test.tsx +54 -0
- package/src/components/SimpleMessagingCard.tsx +90 -0
- package/src/components/SingleDigitInput.tsx +53 -0
- package/src/components/SkeletonPlaceholder.tsx +33 -0
- package/src/components/SmallButton.test.tsx +41 -0
- package/src/components/SmallButton.tsx +74 -0
- package/src/components/SmartTopAlert.test.tsx +22 -0
- package/src/components/SmartTopAlert.tsx +183 -0
- package/src/components/Switch.tsx +19 -0
- package/src/components/TextButton.tsx +22 -0
- package/src/components/TextInput.tsx +133 -0
- package/src/components/TextInputWithButtons.test.tsx +24 -0
- package/src/components/TextInputWithButtons.tsx +54 -0
- package/src/components/Toast.test.tsx +62 -0
- package/src/components/Toast.tsx +180 -0
- package/src/components/TokenBalance.test.tsx +389 -0
- package/src/components/TokenBalance.tsx +321 -0
- package/src/components/TokenBottomSheet.test.tsx +356 -0
- package/src/components/TokenBottomSheet.tsx +413 -0
- package/src/components/TokenDisplay.test.tsx +274 -0
- package/src/components/TokenDisplay.tsx +104 -0
- package/src/components/TokenEnterAmount.test.tsx +461 -0
- package/src/components/TokenEnterAmount.tsx +591 -0
- package/src/components/TokenIcon.test.tsx +93 -0
- package/src/components/TokenIcon.tsx +142 -0
- package/src/components/TokenTotalLineItem.test.tsx +199 -0
- package/src/components/TokenTotalLineItem.tsx +103 -0
- package/src/components/Touchable.tsx +48 -0
- package/src/components/ValidatedTextInput.tsx +96 -0
- package/src/components/WebView.tsx +43 -0
- package/src/components/WithPasteAware.tsx +113 -0
- package/src/components/WithTextInputPasteAware.tsx +51 -0
- package/src/components/__snapshots__/AccountNumber.test.tsx.snap +87 -0
- package/src/components/__snapshots__/Avatar.test.tsx.snap +435 -0
- package/src/components/__snapshots__/Button.test.tsx.snap +292 -0
- package/src/components/__snapshots__/CircleButton.test.tsx.snap +211 -0
- package/src/components/__snapshots__/CodeRow.test.tsx.snap +211 -0
- package/src/components/__snapshots__/ContactCircle.test.tsx.snap +46 -0
- package/src/components/__snapshots__/Dialog.test.tsx.snap +248 -0
- package/src/components/__snapshots__/FeeIcon.test.tsx.snap +147 -0
- package/src/components/__snapshots__/FullscreenCTA.test.tsx.snap +183 -0
- package/src/components/__snapshots__/ItemSeparator.test.tsx.snap +13 -0
- package/src/components/__snapshots__/NumberKeypad.test.tsx.snap +1434 -0
- package/src/components/__snapshots__/PhoneNumberInput.test.tsx.snap +202 -0
- package/src/components/__snapshots__/SectionHead.test.tsx.snap +32 -0
- package/src/components/__snapshots__/SelectionOption.test.tsx.snap +197 -0
- package/src/components/__snapshots__/SettingsItem.test.tsx.snap +226 -0
- package/src/components/__snapshots__/SmartTopAlert.test.tsx.snap +103 -0
- package/src/components/__snapshots__/TextInputWithButtons.test.tsx.snap +78 -0
- package/src/components/header/CustomHeader.tsx +56 -0
- package/src/components/multiSelect/MultiSelectBottomSheet.test.tsx +175 -0
- package/src/components/multiSelect/MultiSelectBottomSheet.tsx +249 -0
- package/src/components/multiSelect/NetworkMultiSelectBottomSheet.test.tsx +77 -0
- package/src/components/multiSelect/NetworkMultiSelectBottomSheet.tsx +56 -0
- package/src/components/useShowOrHideAnimation.tsx +33 -0
- package/src/config.enc +0 -0
- package/src/config.ts +186 -0
- package/src/dapps/DappShortcutTransactionRequest.test.tsx +187 -0
- package/src/dapps/DappShortcutTransactionRequest.tsx +270 -0
- package/src/dapps/DappShortcutsRewards.test.tsx +292 -0
- package/src/dapps/DappShortcutsRewards.tsx +284 -0
- package/src/dapps/DappsScreen.test.tsx +716 -0
- package/src/dapps/DappsScreen.tsx +365 -0
- package/src/dapps/saga.test.ts +194 -0
- package/src/dapps/saga.ts +136 -0
- package/src/dapps/selectors.test.ts +127 -0
- package/src/dapps/selectors.ts +123 -0
- package/src/dapps/slice.ts +110 -0
- package/src/dapps/types.ts +30 -0
- package/src/dappsExplorer/DappCard.tsx +141 -0
- package/src/dappsExplorer/DappFeaturedActions.test.tsx +72 -0
- package/src/dappsExplorer/DappFeaturedActions.tsx +121 -0
- package/src/dappsExplorer/DiscoverDappsCard.tsx +186 -0
- package/src/dappsExplorer/NoResults.tsx +126 -0
- package/src/dappsExplorer/TabDiscover.test.tsx +397 -0
- package/src/dappsExplorer/TabDiscover.tsx +76 -0
- package/src/dappsExplorer/searchDappList.test.tsx +69 -0
- package/src/dappsExplorer/searchDappList.tsx +113 -0
- package/src/dappsExplorer/useDappFavoritedToast.tsx +56 -0
- package/src/dappsExplorer/useOpenDapp.tsx +31 -0
- package/src/divviProtocol/saga.test.ts +51 -0
- package/src/divviProtocol/saga.ts +44 -0
- package/src/earn/ActionCard.tsx +46 -0
- package/src/earn/EarnDepositConfirmationScreen.test.tsx +603 -0
- package/src/earn/EarnDepositConfirmationScreen.tsx +596 -0
- package/src/earn/EarnEnterAmount.test.tsx +1296 -0
- package/src/earn/EarnEnterAmount.tsx +815 -0
- package/src/earn/EarnEntrypoint.test.tsx +100 -0
- package/src/earn/EarnEntrypoint.tsx +127 -0
- package/src/earn/EarnHome.test.tsx +237 -0
- package/src/earn/EarnHome.tsx +411 -0
- package/src/earn/EarnInfoScreen.test.tsx +96 -0
- package/src/earn/EarnInfoScreen.tsx +174 -0
- package/src/earn/EarnTabBar.test.tsx +43 -0
- package/src/earn/EarnTabBar.tsx +73 -0
- package/src/earn/EarnWithdrawConfirmationScreen.test.tsx +1022 -0
- package/src/earn/EarnWithdrawConfirmationScreen.tsx +476 -0
- package/src/earn/PoolCard.test.tsx +68 -0
- package/src/earn/PoolCard.tsx +218 -0
- package/src/earn/PoolList.tsx +87 -0
- package/src/earn/TabEarn.test.tsx +159 -0
- package/src/earn/TabEarn.tsx +354 -0
- package/src/earn/hooks.test.tsx +328 -0
- package/src/earn/hooks.ts +178 -0
- package/src/earn/poolInfoScreen/BeforeDepositBottomSheet.test.tsx +411 -0
- package/src/earn/poolInfoScreen/BeforeDepositBottomSheet.tsx +448 -0
- package/src/earn/poolInfoScreen/Cards.tsx +383 -0
- package/src/earn/poolInfoScreen/EarnPoolInfoScreen.test.tsx +498 -0
- package/src/earn/poolInfoScreen/EarnPoolInfoScreen.tsx +595 -0
- package/src/earn/poolInfoScreen/SafetyCard.test.tsx +108 -0
- package/src/earn/poolInfoScreen/SafetyCard.tsx +165 -0
- package/src/earn/poolInfoScreen/TokenIcons.tsx +37 -0
- package/src/earn/poolInfoScreen/WithdrawBottomSheet.test.tsx +235 -0
- package/src/earn/poolInfoScreen/WithdrawBottomSheet.tsx +168 -0
- package/src/earn/prepareTransactions.test.ts +616 -0
- package/src/earn/prepareTransactions.ts +281 -0
- package/src/earn/saga.test.ts +1149 -0
- package/src/earn/saga.ts +456 -0
- package/src/earn/selectors.ts +5 -0
- package/src/earn/simulateTransactions.test.ts +121 -0
- package/src/earn/simulateTransactions.ts +58 -0
- package/src/earn/slice.test.ts +87 -0
- package/src/earn/slice.ts +73 -0
- package/src/earn/types.ts +70 -0
- package/src/earn/utils.test.ts +48 -0
- package/src/earn/utils.ts +54 -0
- package/src/fiatExchanges/BidaliScreen.test.tsx +163 -0
- package/src/fiatExchanges/BidaliScreen.tsx +189 -0
- package/src/fiatExchanges/CashInSuccess.test.tsx +54 -0
- package/src/fiatExchanges/CashInSuccess.tsx +104 -0
- package/src/fiatExchanges/ExchangeQR.test.tsx +100 -0
- package/src/fiatExchanges/ExchangeQR.tsx +94 -0
- package/src/fiatExchanges/ExternalExchanges.test.tsx +67 -0
- package/src/fiatExchanges/ExternalExchanges.tsx +104 -0
- package/src/fiatExchanges/FiatExchangeAmount.test.tsx +418 -0
- package/src/fiatExchanges/FiatExchangeAmount.tsx +305 -0
- package/src/fiatExchanges/FiatExchangeCurrencyBottomSheet.test.tsx +309 -0
- package/src/fiatExchanges/FiatExchangeCurrencyBottomSheet.tsx +139 -0
- package/src/fiatExchanges/PaymentMethodSection.test.tsx +259 -0
- package/src/fiatExchanges/PaymentMethodSection.tsx +378 -0
- package/src/fiatExchanges/ReviewFees.test.tsx +74 -0
- package/src/fiatExchanges/ReviewFees.tsx +202 -0
- package/src/fiatExchanges/SelectProvider.test.tsx +415 -0
- package/src/fiatExchanges/SelectProvider.tsx +649 -0
- package/src/fiatExchanges/SimplexScreen.test.tsx +109 -0
- package/src/fiatExchanges/SimplexScreen.tsx +185 -0
- package/src/fiatExchanges/Spend.tsx +104 -0
- package/src/fiatExchanges/WithdrawSpend.test.tsx +37 -0
- package/src/fiatExchanges/WithdrawSpend.tsx +139 -0
- package/src/fiatExchanges/__snapshots__/CashInSuccess.test.tsx.snap +351 -0
- package/src/fiatExchanges/__snapshots__/FiatExchangeAmount.test.tsx.snap +397 -0
- package/src/fiatExchanges/__snapshots__/ReviewFees.test.tsx.snap +844 -0
- package/src/fiatExchanges/__snapshots__/SimplexScreen.test.tsx.snap +1083 -0
- package/src/fiatExchanges/actions.ts +67 -0
- package/src/fiatExchanges/amount.test.tsx +48 -0
- package/src/fiatExchanges/amount.tsx +45 -0
- package/src/fiatExchanges/quotes/ExternalQuote.test.ts +172 -0
- package/src/fiatExchanges/quotes/ExternalQuote.ts +121 -0
- package/src/fiatExchanges/quotes/FiatConnectQuote.test.ts +718 -0
- package/src/fiatExchanges/quotes/FiatConnectQuote.ts +343 -0
- package/src/fiatExchanges/quotes/NormalizedQuote.ts +47 -0
- package/src/fiatExchanges/quotes/constants.ts +63 -0
- package/src/fiatExchanges/quotes/normalizeQuotes.test.ts +102 -0
- package/src/fiatExchanges/quotes/normalizeQuotes.ts +76 -0
- package/src/fiatExchanges/quotes/utils.ts +31 -0
- package/src/fiatExchanges/reducer.ts +65 -0
- package/src/fiatExchanges/saga.test.ts +281 -0
- package/src/fiatExchanges/saga.ts +195 -0
- package/src/fiatExchanges/types.ts +104 -0
- package/src/fiatExchanges/utils.test.ts +159 -0
- package/src/fiatExchanges/utils.tsx +287 -0
- package/src/fiatconnect/FiatDetailsScreen.test.tsx +371 -0
- package/src/fiatconnect/FiatDetailsScreen.tsx +441 -0
- package/src/fiatconnect/LinkAccountScreen.test.tsx +107 -0
- package/src/fiatconnect/LinkAccountScreen.tsx +180 -0
- package/src/fiatconnect/RefetchQuoteScreen.test.tsx +119 -0
- package/src/fiatconnect/RefetchQuoteScreen.tsx +68 -0
- package/src/fiatconnect/ReviewScreen.test.tsx +505 -0
- package/src/fiatconnect/ReviewScreen.tsx +708 -0
- package/src/fiatconnect/TransferStatusScreen.test.tsx +399 -0
- package/src/fiatconnect/TransferStatusScreen.tsx +351 -0
- package/src/fiatconnect/clients.test.tsx +83 -0
- package/src/fiatconnect/clients.ts +69 -0
- package/src/fiatconnect/consts.ts +41 -0
- package/src/fiatconnect/fiatAccountSchemas/accountNumber.test.ts +60 -0
- package/src/fiatconnect/fiatAccountSchemas/accountNumber.ts +55 -0
- package/src/fiatconnect/fiatAccountSchemas/ibanNumber.test.ts +53 -0
- package/src/fiatconnect/fiatAccountSchemas/ibanNumber.ts +56 -0
- package/src/fiatconnect/fiatAccountSchemas/ifscAccount.test.ts +45 -0
- package/src/fiatconnect/fiatAccountSchemas/ifscAccount.ts +58 -0
- package/src/fiatconnect/fiatAccountSchemas/index.test.ts +119 -0
- package/src/fiatconnect/fiatAccountSchemas/index.ts +89 -0
- package/src/fiatconnect/fiatAccountSchemas/mobileMoney.test.ts +29 -0
- package/src/fiatconnect/fiatAccountSchemas/mobileMoney.ts +61 -0
- package/src/fiatconnect/fiatAccountSchemas/pixAccount.test.ts +45 -0
- package/src/fiatconnect/fiatAccountSchemas/pixAccount.ts +62 -0
- package/src/fiatconnect/fiatAccountSchemas/types.ts +40 -0
- package/src/fiatconnect/index.test.ts +244 -0
- package/src/fiatconnect/index.ts +179 -0
- package/src/fiatconnect/kyc/KycDenied.test.tsx +139 -0
- package/src/fiatconnect/kyc/KycDenied.tsx +144 -0
- package/src/fiatconnect/kyc/KycExpired.test.tsx +128 -0
- package/src/fiatconnect/kyc/KycExpired.tsx +127 -0
- package/src/fiatconnect/kyc/KycInactive.test.tsx +139 -0
- package/src/fiatconnect/kyc/KycInactive.tsx +100 -0
- package/src/fiatconnect/kyc/KycPending.test.tsx +82 -0
- package/src/fiatconnect/kyc/KycPending.tsx +106 -0
- package/src/fiatconnect/kyc/getNavigationOptions.tsx +72 -0
- package/src/fiatconnect/saga.test.ts +2594 -0
- package/src/fiatconnect/saga.ts +1133 -0
- package/src/fiatconnect/selectors.ts +24 -0
- package/src/fiatconnect/slice.test.ts +79 -0
- package/src/fiatconnect/slice.ts +380 -0
- package/src/fiatconnect/types.ts +24 -0
- package/src/firebase/actions.ts +11 -0
- package/src/firebase/db-rules.json +129 -0
- package/src/firebase/firebase.test.ts +190 -0
- package/src/firebase/firebase.ts +315 -0
- package/src/firebase/notifications.test.ts +180 -0
- package/src/firebase/notifications.ts +106 -0
- package/src/firebase/saga.test.ts +23 -0
- package/src/firebase/saga.ts +81 -0
- package/src/flags.ts +76 -0
- package/src/home/ActionsCarousel.test.tsx +162 -0
- package/src/home/ActionsCarousel.tsx +161 -0
- package/src/home/DivviBottomSheet.test.tsx +59 -0
- package/src/home/DivviBottomSheet.tsx +197 -0
- package/src/home/GetStarted.test.tsx +47 -0
- package/src/home/GetStarted.tsx +115 -0
- package/src/home/NotificationBell.test.tsx +81 -0
- package/src/home/NotificationBell.tsx +42 -0
- package/src/home/NotificationBox.test.tsx +373 -0
- package/src/home/NotificationBox.tsx +362 -0
- package/src/home/NotificationCenter.test.tsx +466 -0
- package/src/home/NotificationCenter.tsx +185 -0
- package/src/home/SendBar.tsx +60 -0
- package/src/home/TabHome.test.tsx +336 -0
- package/src/home/TabHome.tsx +181 -0
- package/src/home/__snapshots__/NotificationBox.test.tsx.snap +933 -0
- package/src/home/actions.ts +154 -0
- package/src/home/celebration/ConfettiCelebration.tsx +170 -0
- package/src/home/celebration/NftCelebration.test.tsx +137 -0
- package/src/home/celebration/NftCelebration.tsx +207 -0
- package/src/home/celebration/NftReward.test.tsx +94 -0
- package/src/home/celebration/NftReward.tsx +172 -0
- package/src/home/celebration/confettiAnimation.json +5126 -0
- package/src/home/celebration/utils.test.ts +32 -0
- package/src/home/celebration/utils.ts +21 -0
- package/src/home/reducers.test.ts +245 -0
- package/src/home/reducers.ts +191 -0
- package/src/home/saga.test.ts +34 -0
- package/src/home/saga.ts +87 -0
- package/src/home/selectors.test.ts +302 -0
- package/src/home/selectors.ts +82 -0
- package/src/home/types.ts +31 -0
- package/src/i18n/i18n.test.ts +106 -0
- package/src/i18n/index.ts +88 -0
- package/src/i18n/otaTranslations.test.ts +34 -0
- package/src/i18n/otaTranslations.ts +15 -0
- package/src/i18n/saga.test.ts +106 -0
- package/src/i18n/saga.ts +92 -0
- package/src/i18n/selectors.ts +12 -0
- package/src/i18n/slice.ts +46 -0
- package/src/i18n/useChangeLanguage.test.tsx +53 -0
- package/src/i18n/useChangeLanguage.ts +19 -0
- package/src/icons/Activity.tsx +21 -0
- package/src/icons/Apple.tsx +14 -0
- package/src/icons/ArrowDown.tsx +19 -0
- package/src/icons/ArrowRightThick.tsx +16 -0
- package/src/icons/Attention.tsx +22 -0
- package/src/icons/BackChevron.tsx +24 -0
- package/src/icons/Backspace.tsx +31 -0
- package/src/icons/BankIcon.tsx +23 -0
- package/src/icons/Celebration.tsx +18 -0
- package/src/icons/CheckCircle.tsx +19 -0
- package/src/icons/Checkmark.tsx +26 -0
- package/src/icons/CircleArrowIcon.tsx +39 -0
- package/src/icons/CircledIcon.tsx +47 -0
- package/src/icons/Clipboard.tsx +17 -0
- package/src/icons/ClockIcon.tsx +23 -0
- package/src/icons/CloudCheck.tsx +19 -0
- package/src/icons/ComingSoon.tsx +18 -0
- package/src/icons/CopyIcon.tsx +14 -0
- package/src/icons/CrossChainIndicator.tsx +36 -0
- package/src/icons/DataDown.tsx +16 -0
- package/src/icons/DataUp.tsx +16 -0
- package/src/icons/DownArrowIcon.tsx +37 -0
- package/src/icons/EarnCoins.tsx +22 -0
- package/src/icons/Error.tsx +30 -0
- package/src/icons/Exit.tsx +18 -0
- package/src/icons/ExploreTokens.tsx +17 -0
- package/src/icons/EyeIcon.tsx +22 -0
- package/src/icons/ForwardChevron.tsx +30 -0
- package/src/icons/GearIcon.tsx +19 -0
- package/src/icons/Google.tsx +14 -0
- package/src/icons/GradientIcon.tsx +70 -0
- package/src/icons/GreenLoadingSpinner.tsx +16 -0
- package/src/icons/GreenLoadingSpinnerToCheck.tsx +16 -0
- package/src/icons/HamburgerCard.tsx +55 -0
- package/src/icons/Help.tsx +21 -0
- package/src/icons/HiddenEyeIcon.tsx +26 -0
- package/src/icons/ImageErrorIcon.tsx +26 -0
- package/src/icons/InfoIcon.tsx +33 -0
- package/src/icons/KeylessBackup.tsx +32 -0
- package/src/icons/LinkArrow.tsx +27 -0
- package/src/icons/LoadingSpinner.tsx +25 -0
- package/src/icons/Lock.tsx +19 -0
- package/src/icons/MagicWand.tsx +20 -0
- package/src/icons/Manage.tsx +22 -0
- package/src/icons/NotificationBellIcon.tsx +25 -0
- package/src/icons/OpenLinkIcon.tsx +18 -0
- package/src/icons/Paste.tsx +33 -0
- package/src/icons/Phone.tsx +20 -0
- package/src/icons/Preferences.tsx +21 -0
- package/src/icons/QRCode.tsx +14 -0
- package/src/icons/RadioButton.tsx +39 -0
- package/src/icons/RedLoadingSpinnerToInfo.tsx +16 -0
- package/src/icons/Refresh.tsx +30 -0
- package/src/icons/Reward.tsx +29 -0
- package/src/icons/ScanIcon.tsx +26 -0
- package/src/icons/Search.tsx +25 -0
- package/src/icons/Share.tsx +21 -0
- package/src/icons/Social.tsx +15 -0
- package/src/icons/Stack.tsx +21 -0
- package/src/icons/StarOutline.tsx +14 -0
- package/src/icons/SwapAndDeposit.tsx +20 -0
- package/src/icons/SwapArrows.tsx +20 -0
- package/src/icons/ThumbsUpIllustration.tsx +64 -0
- package/src/icons/Times.tsx +38 -0
- package/src/icons/TripleDotVertical.tsx +18 -0
- package/src/icons/Trophy.tsx +18 -0
- package/src/icons/User.tsx +19 -0
- package/src/icons/Warning.tsx +22 -0
- package/src/icons/biometry/Face.tsx +28 -0
- package/src/icons/biometry/FaceID.tsx +18 -0
- package/src/icons/biometry/Fingerprint.tsx +16 -0
- package/src/icons/biometry/Iris.tsx +22 -0
- package/src/icons/biometry/TouchID.tsx +44 -0
- package/src/icons/loadingSpinnerGreen.json +401 -0
- package/src/icons/lottie-json/greenLoadingSpinner.json +370 -0
- package/src/icons/lottie-json/greenLoadingSpinnerToCheck.json +666 -0
- package/src/icons/lottie-json/redLoadingSpinnerToInfo.json +950 -0
- package/src/icons/navigator/Discover.tsx +17 -0
- package/src/icons/navigator/Home.tsx +18 -0
- package/src/icons/navigator/Wallet.tsx +18 -0
- package/src/icons/quick-actions/Add.tsx +18 -0
- package/src/icons/quick-actions/More.tsx +19 -0
- package/src/icons/quick-actions/Receive.tsx +18 -0
- package/src/icons/quick-actions/Send.tsx +18 -0
- package/src/icons/quick-actions/Withdraw.tsx +18 -0
- package/src/identity/actions.ts +244 -0
- package/src/identity/contactMapping.test.ts +391 -0
- package/src/identity/contactMapping.ts +422 -0
- package/src/identity/reducer.ts +243 -0
- package/src/identity/saga.test.ts +103 -0
- package/src/identity/saga.ts +122 -0
- package/src/identity/secureSend.ts +171 -0
- package/src/identity/selectors.ts +16 -0
- package/src/identity/types.ts +14 -0
- package/src/images/Blob.tsx +20 -0
- package/src/images/Celebration.tsx +35 -0
- package/src/images/DivviLogo.tsx +22 -0
- package/src/images/GuideKeyIcon.tsx +51 -0
- package/src/images/Images.ts +22 -0
- package/src/images/Logo.tsx +66 -0
- package/src/images/LogoHeart.tsx +206 -0
- package/src/images/NftReceivedIcon.tsx +18 -0
- package/src/images/NftSentIcon.tsx +18 -0
- package/src/images/Palm.tsx +21 -0
- package/src/images/Star.tsx +20 -0
- package/src/images/WelcomeLogo.tsx +19 -0
- package/src/images/assets/account-key-1.png +0 -0
- package/src/images/assets/account-key-1@1.5x.png +0 -0
- package/src/images/assets/account-key-1@2x.png +0 -0
- package/src/images/assets/account-key-1@3x.png +0 -0
- package/src/images/assets/account-key-1@4x.png +0 -0
- package/src/images/assets/account-key-2.png +0 -0
- package/src/images/assets/account-key-2@1.5x.png +0 -0
- package/src/images/assets/account-key-2@2x.png +0 -0
- package/src/images/assets/account-key-2@3x.png +0 -0
- package/src/images/assets/account-key-2@4x.png +0 -0
- package/src/images/assets/account-key-3.png +0 -0
- package/src/images/assets/account-key-3@1.5x.png +0 -0
- package/src/images/assets/account-key-3@2x.png +0 -0
- package/src/images/assets/account-key-3@3x.png +0 -0
- package/src/images/assets/account-key-3@4x.png +0 -0
- package/src/images/assets/account-key-4.png +0 -0
- package/src/images/assets/account-key-4@1.5x.png +0 -0
- package/src/images/assets/account-key-4@2x.png +0 -0
- package/src/images/assets/account-key-4@3x.png +0 -0
- package/src/images/assets/account-key-4@4x.png +0 -0
- package/src/images/assets/biometry-face-id.png +0 -0
- package/src/images/assets/biometry-face-id@1.5x.png +0 -0
- package/src/images/assets/biometry-face-id@2x.png +0 -0
- package/src/images/assets/biometry-face-id@3x.png +0 -0
- package/src/images/assets/biometry-face-id@4x.png +0 -0
- package/src/images/assets/biometry-face.png +0 -0
- package/src/images/assets/biometry-face@1.5x.png +0 -0
- package/src/images/assets/biometry-face@2x.png +0 -0
- package/src/images/assets/biometry-face@3x.png +0 -0
- package/src/images/assets/biometry-face@4x.png +0 -0
- package/src/images/assets/biometry-fingerprint.png +0 -0
- package/src/images/assets/biometry-fingerprint@1.5x.png +0 -0
- package/src/images/assets/biometry-fingerprint@2x.png +0 -0
- package/src/images/assets/biometry-fingerprint@3x.png +0 -0
- package/src/images/assets/biometry-fingerprint@4x.png +0 -0
- package/src/images/assets/biometry-iris.png +0 -0
- package/src/images/assets/biometry-iris@1.5x.png +0 -0
- package/src/images/assets/biometry-iris@2x.png +0 -0
- package/src/images/assets/biometry-iris@3x.png +0 -0
- package/src/images/assets/biometry-iris@4x.png +0 -0
- package/src/images/assets/biometry-touch-id.png +0 -0
- package/src/images/assets/biometry-touch-id@1.5x.png +0 -0
- package/src/images/assets/biometry-touch-id@2x.png +0 -0
- package/src/images/assets/biometry-touch-id@3x.png +0 -0
- package/src/images/assets/biometry-touch-id@4x.png +0 -0
- package/src/images/assets/celo-education-1.png +0 -0
- package/src/images/assets/celo-education-1@1.5x.png +0 -0
- package/src/images/assets/celo-education-1@2x.png +0 -0
- package/src/images/assets/celo-education-1@3x.png +0 -0
- package/src/images/assets/celo-education-1@4x.png +0 -0
- package/src/images/assets/celo-education-2.png +0 -0
- package/src/images/assets/celo-education-2@1.5x.png +0 -0
- package/src/images/assets/celo-education-2@2x.png +0 -0
- package/src/images/assets/celo-education-2@3x.png +0 -0
- package/src/images/assets/celo-education-2@4x.png +0 -0
- package/src/images/assets/celo-education-3.png +0 -0
- package/src/images/assets/celo-education-3@1.5x.png +0 -0
- package/src/images/assets/celo-education-3@2x.png +0 -0
- package/src/images/assets/celo-education-3@3x.png +0 -0
- package/src/images/assets/celo-education-3@4x.png +0 -0
- package/src/images/assets/celo-education-4.png +0 -0
- package/src/images/assets/celo-education-4@1.5x.png +0 -0
- package/src/images/assets/celo-education-4@2x.png +0 -0
- package/src/images/assets/celo-education-4@3x.png +0 -0
- package/src/images/assets/celo-education-4@4x.png +0 -0
- package/src/images/assets/earn-card-background.png +0 -0
- package/src/images/assets/earn-card-background@1.5x.png +0 -0
- package/src/images/assets/earn-card-background@2x.png +0 -0
- package/src/images/assets/earn-card-background@3x.png +0 -0
- package/src/images/assets/earn-card-background@4x.png +0 -0
- package/src/images/assets/email.png +0 -0
- package/src/images/assets/email@1.5x.png +0 -0
- package/src/images/assets/email@2x.png +0 -0
- package/src/images/assets/email@3x.png +0 -0
- package/src/images/assets/email@4x.png +0 -0
- package/src/images/assets/fiat-exchange.png +0 -0
- package/src/images/assets/fiat-exchange@1.5x.png +0 -0
- package/src/images/assets/fiat-exchange@2x.png +0 -0
- package/src/images/assets/fiat-exchange@3x.png +0 -0
- package/src/images/assets/fiat-exchange@4x.png +0 -0
- package/src/images/assets/get-verified.png +0 -0
- package/src/images/assets/get-verified@1.5x.png +0 -0
- package/src/images/assets/get-verified@2x.png +0 -0
- package/src/images/assets/get-verified@3x.png +0 -0
- package/src/images/assets/get-verified@4x.png +0 -0
- package/src/images/assets/learn-celo.png +0 -0
- package/src/images/assets/learn-celo@1.5x.png +0 -0
- package/src/images/assets/learn-celo@2x.png +0 -0
- package/src/images/assets/learn-celo@3x.png +0 -0
- package/src/images/assets/learn-celo@4x.png +0 -0
- package/src/images/assets/pie.png +0 -0
- package/src/images/assets/pie@1.5x.png +0 -0
- package/src/images/assets/pie@2x.png +0 -0
- package/src/images/assets/pie@3x.png +0 -0
- package/src/images/assets/pie@4x.png +0 -0
- package/src/images/assets/points-card-background.png +0 -0
- package/src/images/assets/points-card-background@1.5x.png +0 -0
- package/src/images/assets/points-card-background@2x.png +0 -0
- package/src/images/assets/points-card-background@3x.png +0 -0
- package/src/images/assets/points-card-background@4x.png +0 -0
- package/src/images/assets/points-illustration.png +0 -0
- package/src/images/assets/points-illustration@1.5x.png +0 -0
- package/src/images/assets/points-illustration@2x.png +0 -0
- package/src/images/assets/points-illustration@3x.png +0 -0
- package/src/images/assets/points-illustration@4x.png +0 -0
- package/src/images/assets/wallet-safe.png +0 -0
- package/src/images/assets/wallet-safe@1.5x.png +0 -0
- package/src/images/assets/wallet-safe@2x.png +0 -0
- package/src/images/assets/wallet-safe@3x.png +0 -0
- package/src/images/assets/wallet-safe@4x.png +0 -0
- package/src/import/ImportWallet.test.tsx +102 -0
- package/src/import/ImportWallet.tsx +277 -0
- package/src/import/actions.ts +41 -0
- package/src/import/reducer.ts +28 -0
- package/src/import/saga.test.ts +165 -0
- package/src/import/saga.ts +250 -0
- package/src/in-house-liquidity/client.test.ts +34 -0
- package/src/in-house-liquidity/client.ts +38 -0
- package/src/in-house-liquidity/index.test.ts +258 -0
- package/src/in-house-liquidity/index.ts +187 -0
- package/src/index.d.ts +25 -0
- package/src/jumpstart/JumpstartTransactionDetailsScreen.test.tsx +329 -0
- package/src/jumpstart/JumpstartTransactionDetailsScreen.tsx +407 -0
- package/src/jumpstart/fetchClaimStatus.ts +46 -0
- package/src/jumpstart/saga.test.ts +117 -0
- package/src/jumpstart/saga.ts +82 -0
- package/src/jumpstart/selectors.ts +5 -0
- package/src/jumpstart/slice.test.ts +51 -0
- package/src/jumpstart/slice.ts +64 -0
- package/src/keylessBackup/EnvelopeIcon.tsx +19 -0
- package/src/keylessBackup/KeylessBackupCancelButton.test.tsx +55 -0
- package/src/keylessBackup/KeylessBackupCancelButton.tsx +26 -0
- package/src/keylessBackup/KeylessBackupIntro.test.tsx +76 -0
- package/src/keylessBackup/KeylessBackupIntro.tsx +175 -0
- package/src/keylessBackup/KeylessBackupPhoneCodeInput.test.tsx +256 -0
- package/src/keylessBackup/KeylessBackupPhoneCodeInput.tsx +257 -0
- package/src/keylessBackup/KeylessBackupPhoneInput.test.tsx +67 -0
- package/src/keylessBackup/KeylessBackupPhoneInput.tsx +203 -0
- package/src/keylessBackup/KeylessBackupProgress.test.tsx +371 -0
- package/src/keylessBackup/KeylessBackupProgress.tsx +495 -0
- package/src/keylessBackup/LinkPhoneNumber.test.tsx +57 -0
- package/src/keylessBackup/LinkPhoneNumber.tsx +107 -0
- package/src/keylessBackup/SignInWithEmail.test.tsx +271 -0
- package/src/keylessBackup/SignInWithEmail.tsx +348 -0
- package/src/keylessBackup/SmartphoneIcon.tsx +19 -0
- package/src/keylessBackup/WalletSecurityPrimer.test.tsx +31 -0
- package/src/keylessBackup/WalletSecurityPrimer.tsx +81 -0
- package/src/keylessBackup/encryption.test.ts +139 -0
- package/src/keylessBackup/encryption.ts +121 -0
- package/src/keylessBackup/hooks.ts +179 -0
- package/src/keylessBackup/index.test.ts +204 -0
- package/src/keylessBackup/index.ts +98 -0
- package/src/keylessBackup/keychain.test.ts +55 -0
- package/src/keylessBackup/keychain.ts +30 -0
- package/src/keylessBackup/saga.test.ts +427 -0
- package/src/keylessBackup/saga.ts +264 -0
- package/src/keylessBackup/selectors.ts +8 -0
- package/src/keylessBackup/slice.ts +108 -0
- package/src/keylessBackup/types.ts +25 -0
- package/src/keylessBackup/web3auth.test.ts +74 -0
- package/src/keylessBackup/web3auth.ts +54 -0
- package/src/language/Language.test.tsx +41 -0
- package/src/language/Language.tsx +99 -0
- package/src/localCurrency/SelectLocalCurrency.test.tsx +19 -0
- package/src/localCurrency/SelectLocalCurrency.tsx +83 -0
- package/src/localCurrency/actions.ts +49 -0
- package/src/localCurrency/consts.test.ts +9 -0
- package/src/localCurrency/consts.ts +97 -0
- package/src/localCurrency/convert.test.ts +30 -0
- package/src/localCurrency/convert.ts +66 -0
- package/src/localCurrency/hooks.test.tsx +146 -0
- package/src/localCurrency/hooks.ts +47 -0
- package/src/localCurrency/reducer.ts +59 -0
- package/src/localCurrency/saga.test.ts +34 -0
- package/src/localCurrency/saga.ts +61 -0
- package/src/localCurrency/selectors.test.ts +47 -0
- package/src/localCurrency/selectors.ts +66 -0
- package/src/localCurrency/types.ts +6 -0
- package/src/missingGlobals.ts +21 -0
- package/src/nameGenerator/index.test.ts +46 -0
- package/src/nameGenerator/index.ts +17 -0
- package/src/nameGenerator/names.ts +938 -0
- package/src/navigator/DemoModeAuthBlock.test.tsx +60 -0
- package/src/navigator/DemoModeAuthBlock.tsx +61 -0
- package/src/navigator/DemoModeChipIndicator.test.tsx +109 -0
- package/src/navigator/DemoModeChipIndicator.tsx +76 -0
- package/src/navigator/Headers.tsx +263 -0
- package/src/navigator/NavigationService.test.tsx +74 -0
- package/src/navigator/NavigationService.ts +244 -0
- package/src/navigator/Navigator.tsx +760 -0
- package/src/navigator/NavigatorWrapper.test.tsx +65 -0
- package/src/navigator/NavigatorWrapper.tsx +248 -0
- package/src/navigator/QRNavigator.test.tsx +61 -0
- package/src/navigator/QRNavigator.tsx +144 -0
- package/src/navigator/Screens.tsx +107 -0
- package/src/navigator/ScrollAwareHeader.tsx +57 -0
- package/src/navigator/SettingsMenu.test.tsx +253 -0
- package/src/navigator/SettingsMenu.tsx +353 -0
- package/src/navigator/TabNavigator.test.tsx +181 -0
- package/src/navigator/TabNavigator.tsx +142 -0
- package/src/navigator/TopBarButton.test.tsx +44 -0
- package/src/navigator/TopBarButton.tsx +88 -0
- package/src/navigator/TopBarIconButtonV2.test.tsx +17 -0
- package/src/navigator/TopBarIconButtonV2.tsx +85 -0
- package/src/navigator/initialRoute.test.tsx +32 -0
- package/src/navigator/initialRoute.tsx +29 -0
- package/src/navigator/types.tsx +346 -0
- package/src/networkInfo/actions.ts +28 -0
- package/src/networkInfo/reducer.ts +44 -0
- package/src/networkInfo/saga.test.ts +43 -0
- package/src/networkInfo/saga.ts +100 -0
- package/src/networkInfo/selectors.ts +4 -0
- package/src/nfts/NftMedia.test.tsx +114 -0
- package/src/nfts/NftMedia.tsx +205 -0
- package/src/nfts/NftsInfoCarousel.test.tsx +218 -0
- package/src/nfts/NftsInfoCarousel.tsx +344 -0
- package/src/nfts/NftsLoadError.test.tsx +37 -0
- package/src/nfts/NftsLoadError.tsx +111 -0
- package/src/nfts/saga.test.tsx +502 -0
- package/src/nfts/saga.ts +198 -0
- package/src/nfts/selectors.ts +13 -0
- package/src/nfts/slice.ts +45 -0
- package/src/nfts/types.ts +51 -0
- package/src/notifications/NotificationList.test.tsx +25 -0
- package/src/notifications/NotificationList.tsx +45 -0
- package/src/notifications/__snapshots__/NotificationList.test.tsx.snap +35 -0
- package/src/notifications/types.ts +31 -0
- package/src/onboarding/LanguageButton.tsx +26 -0
- package/src/onboarding/TopBarTextButtonOnboarding.test.tsx +22 -0
- package/src/onboarding/TopBarTextButtonOnboarding.tsx +17 -0
- package/src/onboarding/actions.ts +46 -0
- package/src/onboarding/registration/EnableBiometry.test.tsx +168 -0
- package/src/onboarding/registration/EnableBiometry.tsx +207 -0
- package/src/onboarding/registration/ImportSelect.test.tsx +54 -0
- package/src/onboarding/registration/ImportSelect.tsx +167 -0
- package/src/onboarding/registration/OnboardingRecoveryPhrase.test.tsx +83 -0
- package/src/onboarding/registration/OnboardingRecoveryPhrase.tsx +197 -0
- package/src/onboarding/registration/ProtectWallet.test.tsx +96 -0
- package/src/onboarding/registration/ProtectWallet.tsx +153 -0
- package/src/onboarding/registration/RegulatoryTerms.test.tsx +75 -0
- package/src/onboarding/registration/RegulatoryTerms.tsx +174 -0
- package/src/onboarding/registration/SelectCountry.test.tsx +51 -0
- package/src/onboarding/registration/SelectCountry.tsx +88 -0
- package/src/onboarding/registration/SelectCountryItem.tsx +59 -0
- package/src/onboarding/steps.test.ts +464 -0
- package/src/onboarding/steps.ts +303 -0
- package/src/onboarding/success/OnboardingSuccessScreen.tsx +64 -0
- package/src/onboarding/types.ts +14 -0
- package/src/onboarding/welcome/Welcome.test.tsx +234 -0
- package/src/onboarding/welcome/Welcome.tsx +182 -0
- package/src/pincode/PasswordCache.ts +71 -0
- package/src/pincode/Pincode.tsx +109 -0
- package/src/pincode/PincodeDisplay.tsx +92 -0
- package/src/pincode/PincodeEnter.test.tsx +85 -0
- package/src/pincode/PincodeEnter.tsx +103 -0
- package/src/pincode/PincodeLock.test.tsx +144 -0
- package/src/pincode/PincodeLock.tsx +121 -0
- package/src/pincode/PincodeSet.test.tsx +213 -0
- package/src/pincode/PincodeSet.tsx +263 -0
- package/src/pincode/authentication.test.ts +654 -0
- package/src/pincode/authentication.ts +425 -0
- package/src/points/ActivityCard.test.tsx +63 -0
- package/src/points/ActivityCard.tsx +101 -0
- package/src/points/ActivityCardSection.tsx +126 -0
- package/src/points/PointsDiscoverCard.test.tsx +106 -0
- package/src/points/PointsDiscoverCard.tsx +122 -0
- package/src/points/PointsHistoryBottomSheet.test.tsx +179 -0
- package/src/points/PointsHistoryBottomSheet.tsx +264 -0
- package/src/points/PointsHome.test.tsx +230 -0
- package/src/points/PointsHome.tsx +357 -0
- package/src/points/PointsIntro.test.tsx +67 -0
- package/src/points/PointsIntro.tsx +85 -0
- package/src/points/cardDefinitions.tsx +94 -0
- package/src/points/cardSort.test.ts +58 -0
- package/src/points/cardSort.ts +18 -0
- package/src/points/saga.test.ts +769 -0
- package/src/points/saga.ts +379 -0
- package/src/points/selectors.test.ts +73 -0
- package/src/points/selectors.ts +68 -0
- package/src/points/slice.test.ts +76 -0
- package/src/points/slice.ts +164 -0
- package/src/points/types.ts +94 -0
- package/src/positions/HooksPreviewModeBanner.test.tsx +56 -0
- package/src/positions/HooksPreviewModeBanner.tsx +69 -0
- package/src/positions/actions.ts +11 -0
- package/src/positions/getPositionBalanceUsd.ts +14 -0
- package/src/positions/saga.test.ts +468 -0
- package/src/positions/saga.ts +378 -0
- package/src/positions/selectors.test.ts +281 -0
- package/src/positions/selectors.ts +189 -0
- package/src/positions/slice.ts +219 -0
- package/src/positions/transactions.ts +21 -0
- package/src/positions/types.ts +137 -0
- package/src/priceHistory/PriceHistoryChart.test.tsx +200 -0
- package/src/priceHistory/PriceHistoryChart.tsx +345 -0
- package/src/priceHistory/__snapshots__/PriceHistoryChart.test.tsx.snap +419 -0
- package/src/priceHistory/saga.test.ts +120 -0
- package/src/priceHistory/saga.ts +62 -0
- package/src/priceHistory/selectors.test.ts +52 -0
- package/src/priceHistory/selectors.ts +17 -0
- package/src/priceHistory/slice.test.ts +94 -0
- package/src/priceHistory/slice.ts +68 -0
- package/src/public/components/Button.tsx +66 -0
- package/src/public/createApp.ts +67 -0
- package/src/public/getFees.test.ts +24 -0
- package/src/public/getFees.ts +8 -0
- package/src/public/getPublicClient.test.ts +19 -0
- package/src/public/getPublicClient.ts +25 -0
- package/src/public/getWalletClient.test.ts +30 -0
- package/src/public/getWalletClient.ts +32 -0
- package/src/public/hooks/toAsyncStatus.ts +19 -0
- package/src/public/hooks/usePrepareTransactions.test.ts +63 -0
- package/src/public/hooks/usePrepareTransactions.ts +15 -0
- package/src/public/hooks/usePublicClient.test.ts +24 -0
- package/src/public/hooks/usePublicClient.ts +7 -0
- package/src/public/hooks/useSendTransactions.test.ts +49 -0
- package/src/public/hooks/useSendTransactions.ts +15 -0
- package/src/public/hooks/useWallet.ts +52 -0
- package/src/public/hooks/useWalletClient.test.ts +35 -0
- package/src/public/hooks/useWalletClient.ts +24 -0
- package/src/public/index.ts +29 -0
- package/src/public/navigate.test.ts +168 -0
- package/src/public/navigate.ts +168 -0
- package/src/public/prepareTransactions.test.ts +76 -0
- package/src/public/prepareTransactions.ts +78 -0
- package/src/public/sendTransactions.test.ts +37 -0
- package/src/public/sendTransactions.ts +25 -0
- package/src/public/types.tsx +278 -0
- package/src/public/unlockAccount.test.ts +79 -0
- package/src/public/unlockAccount.ts +43 -0
- package/src/qrcode/NotAuthorizedView.test.tsx +11 -0
- package/src/qrcode/NotAuthorizedView.tsx +47 -0
- package/src/qrcode/QRCode.test.tsx +117 -0
- package/src/qrcode/QRCode.tsx +190 -0
- package/src/qrcode/QRScanner.tsx +249 -0
- package/src/qrcode/QRTabBar.tsx +137 -0
- package/src/qrcode/StyledQRCode.tsx +31 -0
- package/src/qrcode/StyledQRGen.tsx +26 -0
- package/src/qrcode/__snapshots__/NotAuthorizedView.test.tsx.snap +90 -0
- package/src/qrcode/schema.test.ts +121 -0
- package/src/qrcode/schema.ts +45 -0
- package/src/qrcode/utils.test.tsx +293 -0
- package/src/qrcode/utils.ts +230 -0
- package/src/recaptcha/RecaptchaService.ts +105 -0
- package/src/recaptcha/saga.ts +24 -0
- package/src/recipients/RecipientItemV2.test.tsx +153 -0
- package/src/recipients/RecipientItemV2.tsx +142 -0
- package/src/recipients/RecipientPickerV2.test.tsx +110 -0
- package/src/recipients/RecipientPickerV2.tsx +61 -0
- package/src/recipients/recipient.test.ts +113 -0
- package/src/recipients/recipient.ts +313 -0
- package/src/recipients/reducer.ts +107 -0
- package/src/recipients/resolve-id.ts +21 -0
- package/src/recipients/saga.ts +87 -0
- package/src/redux/apiReducersList.ts +11 -0
- package/src/redux/createMigrate.test.ts +113 -0
- package/src/redux/createMigrate.ts +46 -0
- package/src/redux/hooks.ts +7 -0
- package/src/redux/migrations.test.ts +1925 -0
- package/src/redux/migrations.ts +2069 -0
- package/src/redux/persist-helper.ts +14 -0
- package/src/redux/reducers.ts +29 -0
- package/src/redux/reducersForSchemaGeneration.ts +20 -0
- package/src/redux/reducersList.ts +57 -0
- package/src/redux/sagas-helpers.ts +29 -0
- package/src/redux/sagas.test.ts +19 -0
- package/src/redux/sagas.ts +155 -0
- package/src/redux/selectors.ts +3 -0
- package/src/redux/store.test.ts +391 -0
- package/src/redux/store.ts +151 -0
- package/src/send/EnterAmount.test.tsx +1030 -0
- package/src/send/EnterAmount.tsx +360 -0
- package/src/send/EnterAmountOptions.tsx +170 -0
- package/src/send/PasteAddressButton.tsx +81 -0
- package/src/send/SelectRecipientButtons.test.tsx +256 -0
- package/src/send/SelectRecipientButtons.tsx +202 -0
- package/src/send/SendConfirmation.test.tsx +233 -0
- package/src/send/SendConfirmation.tsx +317 -0
- package/src/send/SendEnterAmount.test.tsx +235 -0
- package/src/send/SendEnterAmount.tsx +123 -0
- package/src/send/SendSelectRecipient.test.tsx +765 -0
- package/src/send/SendSelectRecipient.tsx +504 -0
- package/src/send/SendSelectRecipientSearchInput.tsx +72 -0
- package/src/send/ValidateRecipientAccount.test.tsx +181 -0
- package/src/send/ValidateRecipientAccount.tsx +387 -0
- package/src/send/ValidateRecipientIntro.test.tsx +61 -0
- package/src/send/ValidateRecipientIntro.tsx +136 -0
- package/src/send/__snapshots__/ValidateRecipientAccount.test.tsx.snap +777 -0
- package/src/send/actions.ts +142 -0
- package/src/send/hooks.test.tsx +371 -0
- package/src/send/hooks.ts +445 -0
- package/src/send/reducers.ts +90 -0
- package/src/send/saga.test.ts +247 -0
- package/src/send/saga.ts +176 -0
- package/src/send/selectors.ts +22 -0
- package/src/send/types.ts +18 -0
- package/src/send/useFetchRecipientVerificationStatus.ts +67 -0
- package/src/send/usePrepareSendTransactions.test.ts +135 -0
- package/src/send/usePrepareSendTransactions.ts +69 -0
- package/src/send/utils.test.ts +361 -0
- package/src/send/utils.ts +116 -0
- package/src/sendCalls/constants.ts +11 -0
- package/src/sendCalls/saga.test.ts +31 -0
- package/src/sendCalls/saga.ts +15 -0
- package/src/sendCalls/selectors.test.ts +40 -0
- package/src/sendCalls/selectors.ts +8 -0
- package/src/sendCalls/slice.test.ts +85 -0
- package/src/sendCalls/slice.ts +72 -0
- package/src/sentry/Sentry.ts +75 -0
- package/src/sentry/SentrySpanHub.ts +27 -0
- package/src/sentry/SentrySpans.tsx +57 -0
- package/src/sentry/actions.ts +11 -0
- package/src/sentry/saga.ts +8 -0
- package/src/shared/DisconnectBanner.test.tsx +25 -0
- package/src/shared/DisconnectBanner.tsx +81 -0
- package/src/shared/__snapshots__/DisconnectBanner.test.tsx.snap +29 -0
- package/src/shared/conts.ts +16 -0
- package/src/statsig/client.test.ts +62 -0
- package/src/statsig/client.ts +97 -0
- package/src/statsig/constants.ts +177 -0
- package/src/statsig/index.test.ts +351 -0
- package/src/statsig/index.ts +186 -0
- package/src/statsig/selector.ts +17 -0
- package/src/statsig/types.ts +52 -0
- package/src/storage/keychain.tsx +92 -0
- package/src/styles/accessibility.ts +7 -0
- package/src/styles/appTheme.ts +13 -0
- package/src/styles/colors.tsx +78 -0
- package/src/styles/fonts.tsx +143 -0
- package/src/styles/hapticFeedback.ts +27 -0
- package/src/styles/progressDots.ts +23 -0
- package/src/styles/styles.ts +67 -0
- package/src/styles/variables.tsx +16 -0
- package/src/swap/SwapAmountInput.tsx +228 -0
- package/src/swap/SwapScreen.test.tsx +1927 -0
- package/src/swap/SwapScreen.tsx +1156 -0
- package/src/swap/SwapScreenV2.test.tsx +2180 -0
- package/src/swap/SwapScreenV2.tsx +1201 -0
- package/src/swap/SwapTransactionDetails.test.tsx +217 -0
- package/src/swap/SwapTransactionDetails.tsx +274 -0
- package/src/swap/UnfavorableRateBottomSheet.test.tsx +150 -0
- package/src/swap/UnfavorableRateBottomSheet.tsx +288 -0
- package/src/swap/getCrossChainFee.ts +64 -0
- package/src/swap/getSwapTxsAnalyticsProperties.tsx +49 -0
- package/src/swap/saga.test.ts +863 -0
- package/src/swap/saga.ts +324 -0
- package/src/swap/selectors.ts +5 -0
- package/src/swap/slice.test.ts +133 -0
- package/src/swap/slice.ts +93 -0
- package/src/swap/types.ts +98 -0
- package/src/swap/useFilterChips.ts +69 -0
- package/src/swap/useSwapQuote.ts +292 -0
- package/src/tokens/AssetList.test.tsx +270 -0
- package/src/tokens/AssetList.tsx +388 -0
- package/src/tokens/AssetTabBar.test.tsx +130 -0
- package/src/tokens/AssetTabBar.tsx +106 -0
- package/src/tokens/PasteButton.test.tsx +30 -0
- package/src/tokens/PasteButton.tsx +34 -0
- package/src/tokens/PositionIcon.tsx +22 -0
- package/src/tokens/PositionItem.test.tsx +132 -0
- package/src/tokens/PositionItem.tsx +131 -0
- package/src/tokens/TabWallet.test.tsx +386 -0
- package/src/tokens/TabWallet.tsx +237 -0
- package/src/tokens/TokenBalanceItem.test.tsx +119 -0
- package/src/tokens/TokenBalanceItem.tsx +143 -0
- package/src/tokens/TokenDetails.test.tsx +476 -0
- package/src/tokens/TokenDetails.tsx +391 -0
- package/src/tokens/TokenDetailsMoreActions.test.tsx +120 -0
- package/src/tokens/TokenDetailsMoreActions.tsx +87 -0
- package/src/tokens/TokenImport.test.tsx +376 -0
- package/src/tokens/TokenImport.tsx +381 -0
- package/src/tokens/hooks.test.tsx +419 -0
- package/src/tokens/hooks.ts +164 -0
- package/src/tokens/saga.test.ts +527 -0
- package/src/tokens/saga.ts +248 -0
- package/src/tokens/selectors.test.ts +888 -0
- package/src/tokens/selectors.ts +516 -0
- package/src/tokens/slice.ts +173 -0
- package/src/tokens/types.ts +29 -0
- package/src/tokens/utils.test.tsx +330 -0
- package/src/tokens/utils.ts +218 -0
- package/src/transactions/NoActivity.test.tsx +30 -0
- package/src/transactions/NoActivity.tsx +73 -0
- package/src/transactions/TransferAvatars.tsx +39 -0
- package/src/transactions/UserSection.tsx +133 -0
- package/src/transactions/api.ts +67 -0
- package/src/transactions/apiTestHelpers.ts +55 -0
- package/src/transactions/feed/ClaimRewardFeedItem.test.tsx +164 -0
- package/src/transactions/feed/ClaimRewardFeedItem.tsx +142 -0
- package/src/transactions/feed/DepositOrWithdrawFeedItem.test.tsx +138 -0
- package/src/transactions/feed/DepositOrWithdrawFeedItem.tsx +178 -0
- package/src/transactions/feed/EarnFeedItem.test.tsx +189 -0
- package/src/transactions/feed/EarnFeedItem.tsx +190 -0
- package/src/transactions/feed/NftFeedItem.test.tsx +102 -0
- package/src/transactions/feed/NftFeedItem.tsx +99 -0
- package/src/transactions/feed/SwapFeedItem.test.tsx +137 -0
- package/src/transactions/feed/SwapFeedItem.tsx +128 -0
- package/src/transactions/feed/TokenApprovalFeedItem.test.tsx +37 -0
- package/src/transactions/feed/TokenApprovalFeedItem.tsx +59 -0
- package/src/transactions/feed/TransactionDetails.tsx +160 -0
- package/src/transactions/feed/TransactionDetailsScreen.test.tsx +1228 -0
- package/src/transactions/feed/TransactionDetailsScreen.tsx +157 -0
- package/src/transactions/feed/TransactionFeed.test.tsx +474 -0
- package/src/transactions/feed/TransactionFeed.tsx +172 -0
- package/src/transactions/feed/TransactionFeedItemImage.test.tsx +66 -0
- package/src/transactions/feed/TransactionFeedItemImage.tsx +116 -0
- package/src/transactions/feed/TransactionFeedV2.test.tsx +576 -0
- package/src/transactions/feed/TransactionFeedV2.tsx +504 -0
- package/src/transactions/feed/TransactionPrimaryAction.test.tsx +62 -0
- package/src/transactions/feed/TransactionPrimaryAction.tsx +83 -0
- package/src/transactions/feed/TransactionStatusIndicator.test.tsx +15 -0
- package/src/transactions/feed/TransactionStatusIndicator.tsx +63 -0
- package/src/transactions/feed/TransferFeedItem.test.tsx +579 -0
- package/src/transactions/feed/TransferFeedItem.tsx +148 -0
- package/src/transactions/feed/detailContent/ClaimRewardContent.tsx +84 -0
- package/src/transactions/feed/detailContent/DepositOrWithdrawContent.tsx +169 -0
- package/src/transactions/feed/detailContent/EarnContent.tsx +259 -0
- package/src/transactions/feed/detailContent/FeeRowItem.tsx +90 -0
- package/src/transactions/feed/detailContent/RewardReceivedContent.tsx +46 -0
- package/src/transactions/feed/detailContent/SwapContent.tsx +127 -0
- package/src/transactions/feed/detailContent/TokenApprovalDetails.tsx +59 -0
- package/src/transactions/feed/detailContent/TransferReceivedContent.tsx +73 -0
- package/src/transactions/feed/detailContent/TransferSentContent.tsx +117 -0
- package/src/transactions/feed/queryHelper.test.ts +229 -0
- package/src/transactions/feed/queryHelper.ts +941 -0
- package/src/transactions/saga.test.ts +482 -0
- package/src/transactions/saga.ts +322 -0
- package/src/transactions/selectors.ts +120 -0
- package/src/transactions/send.test.ts +29 -0
- package/src/transactions/send.ts +51 -0
- package/src/transactions/slice.test.ts +372 -0
- package/src/transactions/slice.ts +262 -0
- package/src/transactions/transferFeedUtils.ts +225 -0
- package/src/transactions/types.ts +355 -0
- package/src/transactions/utils.test.ts +98 -0
- package/src/transactions/utils.ts +122 -0
- package/src/utils/AppRestart.ts +12 -0
- package/src/utils/Countries.test.ts +180 -0
- package/src/utils/Countries.ts +121 -0
- package/src/utils/IosVersionUtils.ts +6 -0
- package/src/utils/Logger.test.ts +113 -0
- package/src/utils/Logger.ts +304 -0
- package/src/utils/LoggerLevels.ts +6 -0
- package/src/utils/account.test.ts +390 -0
- package/src/utils/account.ts +497 -0
- package/src/utils/accountChecker.test.ts +75 -0
- package/src/utils/accountChecker.ts +77 -0
- package/src/utils/address.test.ts +62 -0
- package/src/utils/address.ts +34 -0
- package/src/utils/aes.test.ts +36 -0
- package/src/utils/aes.ts +46 -0
- package/src/utils/contacts.ts +78 -0
- package/src/utils/contentTranslations.ts +18 -0
- package/src/utils/country.json +257 -0
- package/src/utils/countryFeatures.ts +21 -0
- package/src/utils/currencies.ts +72 -0
- package/src/utils/displayFormatting.ts +11 -0
- package/src/utils/ensureError.test.ts +32 -0
- package/src/utils/ensureError.ts +13 -0
- package/src/utils/fetchWithTimeout.test.ts +55 -0
- package/src/utils/fetchWithTimeout.ts +15 -0
- package/src/utils/formatting.test.ts +93 -0
- package/src/utils/formatting.ts +107 -0
- package/src/utils/getCountryEmoji.ts +28 -0
- package/src/utils/getPhoneHash.ts +29 -0
- package/src/utils/gql.ts +8 -0
- package/src/utils/identifier.ts +81 -0
- package/src/utils/inputValidation.test.ts +53 -0
- package/src/utils/inputValidation.ts +76 -0
- package/src/utils/io.ts +39 -0
- package/src/utils/linking.ts +42 -0
- package/src/utils/moneyAmount.ts +16 -0
- package/src/utils/parsing.test.ts +30 -0
- package/src/utils/parsing.ts +20 -0
- package/src/utils/phoneNumber.test.ts +236 -0
- package/src/utils/phoneNumbers.ts +240 -0
- package/src/utils/random.test.ts +53 -0
- package/src/utils/random.ts +48 -0
- package/src/utils/safely.test.ts +101 -0
- package/src/utils/safely.ts +30 -0
- package/src/utils/sleep.ts +3 -0
- package/src/utils/string.ts +8 -0
- package/src/utils/stylize.ts +30 -0
- package/src/utils/time.test.ts +76 -0
- package/src/utils/time.ts +99 -0
- package/src/utils/typescript.ts +38 -0
- package/src/utils/useBackHandler.ts +10 -0
- package/src/utils/useClipboard.ts +56 -0
- package/src/utils/versionCheck.test.ts +47 -0
- package/src/utils/versionCheck.ts +35 -0
- package/src/verify/ResendButtonWithDelay.tsx +56 -0
- package/src/verify/VerificationCodeInput.test.tsx +87 -0
- package/src/verify/VerificationCodeInput.tsx +103 -0
- package/src/verify/VerificationCodeInputScreen.test.tsx +364 -0
- package/src/verify/VerificationCodeInputScreen.tsx +138 -0
- package/src/verify/VerificationStartScreen.test.tsx +218 -0
- package/src/verify/VerificationStartScreen.tsx +311 -0
- package/src/verify/hooks.test.tsx +85 -0
- package/src/verify/hooks.ts +261 -0
- package/src/viem/estimateFeesPerGas.test.ts +129 -0
- package/src/viem/estimateFeesPerGas.ts +70 -0
- package/src/viem/getLockableWallet.test.ts +263 -0
- package/src/viem/getLockableWallet.ts +120 -0
- package/src/viem/index.ts +86 -0
- package/src/viem/keychainAccountToAccount.test.ts +55 -0
- package/src/viem/keychainAccountToAccount.ts +58 -0
- package/src/viem/prepareTransactions.test.ts +1668 -0
- package/src/viem/prepareTransactions.ts +741 -0
- package/src/viem/preparedTransactionSerialization.test.ts +192 -0
- package/src/viem/preparedTransactionSerialization.ts +100 -0
- package/src/viem/saga.test.ts +227 -0
- package/src/viem/saga.ts +118 -0
- package/src/walletConnect/actions.test.ts +94 -0
- package/src/walletConnect/actions.ts +232 -0
- package/src/walletConnect/analytics.ts +58 -0
- package/src/walletConnect/capabilities.ts +175 -0
- package/src/walletConnect/constants.ts +157 -0
- package/src/walletConnect/reducer.ts +105 -0
- package/src/walletConnect/request.test.ts +698 -0
- package/src/walletConnect/request.ts +225 -0
- package/src/walletConnect/saga.test.ts +1875 -0
- package/src/walletConnect/saga.ts +1159 -0
- package/src/walletConnect/screens/ActionRequest.test.tsx +727 -0
- package/src/walletConnect/screens/ActionRequest.tsx +227 -0
- package/src/walletConnect/screens/ActionRequestPayload.tsx +84 -0
- package/src/walletConnect/screens/ConnectionTimedOut.tsx +34 -0
- package/src/walletConnect/screens/DappsDisclaimer.tsx +31 -0
- package/src/walletConnect/screens/EstimatedNetworkFee.test.tsx +88 -0
- package/src/walletConnect/screens/EstimatedNetworkFee.tsx +134 -0
- package/src/walletConnect/screens/Logos.tsx +89 -0
- package/src/walletConnect/screens/RequestContent.tsx +224 -0
- package/src/walletConnect/screens/SessionRequest.test.tsx +274 -0
- package/src/walletConnect/screens/SessionRequest.tsx +221 -0
- package/src/walletConnect/screens/Sessions.tsx +142 -0
- package/src/walletConnect/screens/WalletConnectRequest.tsx +63 -0
- package/src/walletConnect/screens/useIsDappListed.test.tsx +51 -0
- package/src/walletConnect/screens/useIsDappListed.ts +20 -0
- package/src/walletConnect/selectors.ts +25 -0
- package/src/walletConnect/types.ts +99 -0
- package/src/walletConnect/walletConnect.ts +87 -0
- package/src/web3/KeychainAccounts.test.ts +326 -0
- package/src/web3/KeychainAccounts.ts +309 -0
- package/src/web3/actions.ts +30 -0
- package/src/web3/consts.ts +8 -0
- package/src/web3/contracts.test.ts +115 -0
- package/src/web3/contracts.ts +74 -0
- package/src/web3/networkConfig.test.ts +18 -0
- package/src/web3/networkConfig.ts +621 -0
- package/src/web3/reducer.ts +39 -0
- package/src/web3/saga.test.ts +200 -0
- package/src/web3/saga.ts +229 -0
- package/src/web3/selectors.ts +47 -0
- package/src/web3/utils.test.ts +12 -0
- package/src/web3/utils.ts +11 -0
- package/src/webview/WebViewAndroidBottomSheet.test.tsx +58 -0
- package/src/webview/WebViewAndroidBottomSheet.tsx +83 -0
- package/src/webview/WebViewScreen.test.tsx +84 -0
- package/src/webview/WebViewScreen.tsx +296 -0
- package/src/webview/__snapshots__/WebViewAndroidBottomSheet.test.tsx.snap +249 -0
- package/tsconfig.base.json +5 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,741 @@
|
|
|
1
|
+
import { getReferralTag } from '@divvi/referral-sdk'
|
|
2
|
+
import BigNumber from 'bignumber.js'
|
|
3
|
+
import AppAnalytics from 'src/analytics/AppAnalytics'
|
|
4
|
+
import { TransactionEvents } from 'src/analytics/Events'
|
|
5
|
+
import { TransactionOrigin } from 'src/analytics/types'
|
|
6
|
+
import { getAppConfig } from 'src/appConfig'
|
|
7
|
+
import { STATIC_GAS_PADDING } from 'src/config'
|
|
8
|
+
import {
|
|
9
|
+
NativeTokenBalance,
|
|
10
|
+
TokenBalance,
|
|
11
|
+
TokenBalanceWithAddress,
|
|
12
|
+
TokenBalances,
|
|
13
|
+
} from 'src/tokens/slice'
|
|
14
|
+
import { getTokenId } from 'src/tokens/utils'
|
|
15
|
+
import { NetworkId } from 'src/transactions/types'
|
|
16
|
+
import Logger from 'src/utils/Logger'
|
|
17
|
+
import { appPublicClient, publicClient } from 'src/viem'
|
|
18
|
+
import { estimateFeesPerGas } from 'src/viem/estimateFeesPerGas'
|
|
19
|
+
import { networkIdToNetwork } from 'src/web3/networkConfig'
|
|
20
|
+
import {
|
|
21
|
+
Address,
|
|
22
|
+
Client,
|
|
23
|
+
ExecutionRevertedError,
|
|
24
|
+
Hex,
|
|
25
|
+
InvalidInputRpcError,
|
|
26
|
+
TransactionRequestEIP1559,
|
|
27
|
+
encodeFunctionData,
|
|
28
|
+
erc20Abi,
|
|
29
|
+
} from 'viem'
|
|
30
|
+
import { estimateGas } from 'viem/actions'
|
|
31
|
+
import { TransactionRequestCIP64 } from 'viem/chains'
|
|
32
|
+
|
|
33
|
+
const TAG = 'viem/prepareTransactions'
|
|
34
|
+
|
|
35
|
+
// Constants for ERC20 transfer data manipulation
|
|
36
|
+
const ERC20_TRANSFER_SELECTOR = '0xa9059cbb' as const
|
|
37
|
+
const SELECTOR_LENGTH = 10 // '0x' + 8 hex chars (function selector)
|
|
38
|
+
const ADDRESS_HEX_LENGTH = 64 // 32 bytes in hex
|
|
39
|
+
const AMOUNT_HEX_LENGTH = 64 // 32 bytes in hex
|
|
40
|
+
|
|
41
|
+
// Supported transaction types
|
|
42
|
+
export type TransactionRequest = (TransactionRequestCIP64 | TransactionRequestEIP1559) & {
|
|
43
|
+
// Custom fields needed for showing the user the estimated gas fee
|
|
44
|
+
// underscored to denote that they are not part of the TransactionRequest fields from viem
|
|
45
|
+
// and only intended for internal use
|
|
46
|
+
_estimatedGasUse?: bigint
|
|
47
|
+
_baseFeePerGas?: bigint
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface PreparedTransactionsPossible {
|
|
51
|
+
type: 'possible'
|
|
52
|
+
transactions: TransactionRequest[]
|
|
53
|
+
feeCurrency: TokenBalance
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface PreparedTransactionsNeedDecreaseSpendAmountForGas {
|
|
57
|
+
type: 'need-decrease-spend-amount-for-gas'
|
|
58
|
+
feeCurrency: TokenBalance
|
|
59
|
+
maxGasFeeInDecimal: BigNumber
|
|
60
|
+
estimatedGasFeeInDecimal: BigNumber
|
|
61
|
+
decreasedSpendAmount: BigNumber
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface PreparedTransactionsNotEnoughBalanceForGas {
|
|
65
|
+
type: 'not-enough-balance-for-gas'
|
|
66
|
+
feeCurrencies: TokenBalance[]
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export type PreparedTransactionsResult =
|
|
70
|
+
| PreparedTransactionsPossible
|
|
71
|
+
| PreparedTransactionsNeedDecreaseSpendAmountForGas
|
|
72
|
+
| PreparedTransactionsNotEnoughBalanceForGas
|
|
73
|
+
|
|
74
|
+
export function getMaxGasFee(txs: TransactionRequest[]): BigNumber {
|
|
75
|
+
let maxGasFee = BigInt(0)
|
|
76
|
+
for (const tx of txs) {
|
|
77
|
+
if (!tx.gas || !tx.maxFeePerGas) {
|
|
78
|
+
throw new Error('Missing gas or maxFeePerGas')
|
|
79
|
+
}
|
|
80
|
+
maxGasFee += BigInt(tx.gas) * BigInt(tx.maxFeePerGas)
|
|
81
|
+
}
|
|
82
|
+
return new BigNumber(maxGasFee.toString())
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function getEstimatedGasFee(txs: TransactionRequest[]): BigNumber {
|
|
86
|
+
let estimatedGasFee = BigInt(0)
|
|
87
|
+
for (const tx of txs) {
|
|
88
|
+
// Use _estimatedGasUse if available, otherwise use gas
|
|
89
|
+
const estimatedGas = tx._estimatedGasUse ?? tx.gas
|
|
90
|
+
if (!estimatedGas) {
|
|
91
|
+
throw new Error('Missing _estimatedGasUse or gas')
|
|
92
|
+
}
|
|
93
|
+
if (!tx._baseFeePerGas || !tx.maxFeePerGas) {
|
|
94
|
+
throw new Error('Missing _baseFeePerGas or maxFeePerGas')
|
|
95
|
+
}
|
|
96
|
+
const expectedFeePerGas = tx._baseFeePerGas + (tx.maxPriorityFeePerGas ?? BigInt(0))
|
|
97
|
+
estimatedGasFee +=
|
|
98
|
+
estimatedGas * (expectedFeePerGas < tx.maxFeePerGas ? expectedFeePerGas : tx.maxFeePerGas)
|
|
99
|
+
}
|
|
100
|
+
return new BigNumber(estimatedGasFee.toString())
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Checks if transaction data represents an ERC20 transfer call
|
|
105
|
+
*/
|
|
106
|
+
function isERC20Transfer(data: Hex | undefined): boolean {
|
|
107
|
+
return !!(data && data.startsWith(ERC20_TRANSFER_SELECTOR))
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Modifies the amount in an ERC20 transfer transaction data field
|
|
112
|
+
*
|
|
113
|
+
* @param originalData - The original transaction data (must be a valid ERC20 transfer)
|
|
114
|
+
* @param newAmount - The new amount to encode in the transfer
|
|
115
|
+
* @returns Modified transaction data with the new amount
|
|
116
|
+
* @throws If the data is not a valid ERC20 transfer
|
|
117
|
+
*/
|
|
118
|
+
function modifyERC20TransferAmount(originalData: Hex, newAmount: BigNumber): Hex {
|
|
119
|
+
if (!isERC20Transfer(originalData)) {
|
|
120
|
+
throw new Error('Data is not an ERC20 transfer')
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const expectedLength = SELECTOR_LENGTH + ADDRESS_HEX_LENGTH + AMOUNT_HEX_LENGTH
|
|
124
|
+
// If the data is less than the expected length, it's invalid
|
|
125
|
+
if (originalData.length < expectedLength) {
|
|
126
|
+
throw new Error(
|
|
127
|
+
`Invalid ERC20 transfer data length: expected ${expectedLength}, got ${originalData.length}`
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Extract the selector and recipient address (first 74 characters)
|
|
132
|
+
const recipientPart = originalData.slice(0, SELECTOR_LENGTH + ADDRESS_HEX_LENGTH)
|
|
133
|
+
// Encode the new amount as a 32-byte hex string
|
|
134
|
+
const newAmountHex = newAmount.toString(16).padStart(AMOUNT_HEX_LENGTH, '0')
|
|
135
|
+
|
|
136
|
+
// Return the modified data, appending the original data after the expected
|
|
137
|
+
// length (for any suffix like the divvi suffix)
|
|
138
|
+
return (recipientPart + newAmountHex + originalData.slice(expectedLength)) as Hex
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function getFeeCurrencyAddress(feeCurrency: TokenBalance): Address | undefined {
|
|
142
|
+
if (feeCurrency.isNative) {
|
|
143
|
+
// No address for native currency
|
|
144
|
+
return undefined
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Direct fee currency
|
|
148
|
+
if (feeCurrency.isFeeCurrency) {
|
|
149
|
+
if (!feeCurrency.address) {
|
|
150
|
+
// This should never happen
|
|
151
|
+
throw new Error(`Fee currency address is missing for fee currency ${feeCurrency.tokenId}`)
|
|
152
|
+
}
|
|
153
|
+
return feeCurrency.address as Address
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Fee currency adapter
|
|
157
|
+
if (feeCurrency.feeCurrencyAdapterAddress) {
|
|
158
|
+
return feeCurrency.feeCurrencyAdapterAddress
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// This should never happen
|
|
162
|
+
throw new Error(
|
|
163
|
+
`Unable to determine fee currency address for fee currency ${feeCurrency.tokenId}`
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Try estimating gas for a transaction
|
|
169
|
+
*
|
|
170
|
+
* Returns null if execution reverts due to insufficient funds or transfer value exceeds balance of sender. This means
|
|
171
|
+
* checks comparing the user's balance to send/swap amounts need to be done somewhere else to be able to give
|
|
172
|
+
* coherent error messages to the user when they lack the funds to perform a transaction.
|
|
173
|
+
*
|
|
174
|
+
* Throws other kinds of errors (e.g. if execution is reverted for some other reason)
|
|
175
|
+
*
|
|
176
|
+
* @param client
|
|
177
|
+
* @param baseTransaction
|
|
178
|
+
* @param maxFeePerGas
|
|
179
|
+
* @param feeCurrencySymbol
|
|
180
|
+
* @param feeCurrencyAddress
|
|
181
|
+
* @param maxPriorityFeePerGas
|
|
182
|
+
* @param spendToken - Optional: the token being spent in the transaction
|
|
183
|
+
* @param spendTokenAmount - Optional: the amount being spent (in smallest units)
|
|
184
|
+
* @param isGasSubsidized - Whether gas is subsidized (if true, skip same-token handling)
|
|
185
|
+
*/
|
|
186
|
+
export async function tryEstimateTransaction({
|
|
187
|
+
client,
|
|
188
|
+
baseTransaction,
|
|
189
|
+
maxFeePerGas,
|
|
190
|
+
maxPriorityFeePerGas,
|
|
191
|
+
baseFeePerGas,
|
|
192
|
+
feeCurrencySymbol,
|
|
193
|
+
feeCurrencyAddress,
|
|
194
|
+
spendToken,
|
|
195
|
+
spendTokenAmount,
|
|
196
|
+
isGasSubsidized = false,
|
|
197
|
+
}: {
|
|
198
|
+
client: Client
|
|
199
|
+
baseTransaction: TransactionRequest
|
|
200
|
+
maxFeePerGas: bigint
|
|
201
|
+
maxPriorityFeePerGas?: bigint
|
|
202
|
+
baseFeePerGas: bigint
|
|
203
|
+
feeCurrencySymbol: string
|
|
204
|
+
feeCurrencyAddress?: Address
|
|
205
|
+
spendToken?: TokenBalance
|
|
206
|
+
spendTokenAmount?: BigNumber
|
|
207
|
+
isGasSubsidized?: boolean
|
|
208
|
+
}) {
|
|
209
|
+
// When sending a token and paying fees in the same token, we need special handling
|
|
210
|
+
// because estimating gas with the full send amount will fail with "transfer amount exceeds balance"
|
|
211
|
+
const isSameToken =
|
|
212
|
+
spendToken && spendToken.tokenId === getTokenId(spendToken.networkId, feeCurrencyAddress)
|
|
213
|
+
const needsReducedAmountEstimation =
|
|
214
|
+
isSameToken &&
|
|
215
|
+
!isGasSubsidized &&
|
|
216
|
+
spendTokenAmount &&
|
|
217
|
+
spendTokenAmount.isGreaterThan(0) &&
|
|
218
|
+
isERC20Transfer(baseTransaction.data)
|
|
219
|
+
|
|
220
|
+
let txToEstimate = baseTransaction
|
|
221
|
+
if (needsReducedAmountEstimation && baseTransaction.data) {
|
|
222
|
+
// Estimate with the minimum amount (1) to ensure gas estimation succeeds while leaving
|
|
223
|
+
// sufficient balance to cover both the transfer and gas costs
|
|
224
|
+
// This is safe because the amount does not affect gas usage for ERC20 transfers
|
|
225
|
+
const reducedAmount = new BigNumber(1)
|
|
226
|
+
|
|
227
|
+
try {
|
|
228
|
+
txToEstimate = {
|
|
229
|
+
...baseTransaction,
|
|
230
|
+
data: modifyERC20TransferAmount(baseTransaction.data, reducedAmount),
|
|
231
|
+
}
|
|
232
|
+
} catch (error) {
|
|
233
|
+
Logger.warn(TAG, 'Failed to modify ERC20 transfer amount for gas estimation', error)
|
|
234
|
+
// Fall back to original transaction
|
|
235
|
+
txToEstimate = baseTransaction
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const tx = {
|
|
240
|
+
...txToEstimate,
|
|
241
|
+
maxFeePerGas,
|
|
242
|
+
maxPriorityFeePerGas,
|
|
243
|
+
// Don't include the feeCurrency field if not present.
|
|
244
|
+
// See https://github.com/wagmi-dev/viem/blob/e0149711da5894ac5f0719414b4ecc06ccaecb7b/src/chains/celo/serializers.ts#L164-L168
|
|
245
|
+
...(feeCurrencyAddress && { feeCurrency: feeCurrencyAddress }),
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// TODO maybe cache this? and add static padding when using non-native fee currency
|
|
249
|
+
try {
|
|
250
|
+
tx.gas = await estimateGas(client, {
|
|
251
|
+
...(tx as any), // TODO: fix type, probably related to the generic client type
|
|
252
|
+
account: tx.from,
|
|
253
|
+
})
|
|
254
|
+
tx._baseFeePerGas = baseFeePerGas
|
|
255
|
+
Logger.info(TAG, `estimateGas results`, {
|
|
256
|
+
feeCurrency: tx.feeCurrency,
|
|
257
|
+
gas: tx.gas,
|
|
258
|
+
maxFeePerGas,
|
|
259
|
+
maxPriorityFeePerGas,
|
|
260
|
+
baseFeePerGas,
|
|
261
|
+
})
|
|
262
|
+
} catch (e) {
|
|
263
|
+
// Checking for error types by `name` instead of instanceof, instanceof returns false incorrectly. Cause unknown, maybe due to having multiple instances of the viem module.
|
|
264
|
+
if (
|
|
265
|
+
e instanceof Error &&
|
|
266
|
+
e.name === 'EstimateGasExecutionError' &&
|
|
267
|
+
e.cause instanceof Error &&
|
|
268
|
+
(e.cause.name == 'InsufficientFundsError' ||
|
|
269
|
+
(e.cause.name === 'ExecutionRevertedError' && // viem does not reliably label node errors as InsufficientFundsError when the user has enough to pay for the transfer, but not for the transfer + gas
|
|
270
|
+
(/transfer value exceeded balance of sender/.test(
|
|
271
|
+
(e.cause as ExecutionRevertedError).details
|
|
272
|
+
) ||
|
|
273
|
+
/transfer amount exceeds balance/.test((e.cause as ExecutionRevertedError).details))) ||
|
|
274
|
+
(e.cause.name === 'InvalidInputRpcError' &&
|
|
275
|
+
/gas required exceeds allowance/.test((e.cause as InvalidInputRpcError).details)))
|
|
276
|
+
) {
|
|
277
|
+
// too much gas was needed
|
|
278
|
+
Logger.warn(TAG, `Couldn't estimate gas with feeCurrency ${feeCurrencySymbol}`, e)
|
|
279
|
+
return null
|
|
280
|
+
}
|
|
281
|
+
throw e
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// If we estimated with a reduced amount, restore the original transaction data
|
|
285
|
+
// while preserving the gas estimates we just calculated
|
|
286
|
+
if (needsReducedAmountEstimation) {
|
|
287
|
+
return {
|
|
288
|
+
...tx,
|
|
289
|
+
data: baseTransaction.data,
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return tx
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export async function tryEstimateTransactions(
|
|
297
|
+
baseTransactions: TransactionRequest[],
|
|
298
|
+
feeCurrency: TokenBalance,
|
|
299
|
+
useAppTransport: boolean = false,
|
|
300
|
+
spendToken?: TokenBalance,
|
|
301
|
+
spendTokenAmount?: BigNumber,
|
|
302
|
+
isGasSubsidized: boolean = false
|
|
303
|
+
) {
|
|
304
|
+
const transactions: TransactionRequest[] = []
|
|
305
|
+
|
|
306
|
+
const network = networkIdToNetwork[feeCurrency.networkId]
|
|
307
|
+
|
|
308
|
+
if (useAppTransport && !(network in appPublicClient)) {
|
|
309
|
+
throw new Error(`App transport not available for network ${network}`)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const client = useAppTransport
|
|
313
|
+
? appPublicClient[network as keyof typeof appPublicClient]
|
|
314
|
+
: publicClient[network]
|
|
315
|
+
const feeCurrencyAddress = getFeeCurrencyAddress(feeCurrency)
|
|
316
|
+
const { maxFeePerGas, maxPriorityFeePerGas, baseFeePerGas } = await estimateFeesPerGas(
|
|
317
|
+
client,
|
|
318
|
+
feeCurrencyAddress
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
for (const baseTx of baseTransactions) {
|
|
322
|
+
if (baseTx.gas) {
|
|
323
|
+
// We have an estimate of gas already and don't want to recalculate it
|
|
324
|
+
// e.g. if this is a swap transaction that depends on an approval transaction that hasn't been submitted yet, so simulation would fail
|
|
325
|
+
transactions.push({
|
|
326
|
+
...baseTx,
|
|
327
|
+
maxFeePerGas,
|
|
328
|
+
maxPriorityFeePerGas,
|
|
329
|
+
// Don't include the feeCurrency field if not present.
|
|
330
|
+
// See https://github.com/wagmi-dev/viem/blob/e0149711da5894ac5f0719414b4ecc06ccaecb7b/src/chains/celo/serializers.ts#L164-L168
|
|
331
|
+
...(feeCurrencyAddress && { feeCurrency: feeCurrencyAddress }),
|
|
332
|
+
// We assume the provided gas value is with the native fee currency
|
|
333
|
+
// If it's not, we add the static padding
|
|
334
|
+
gas: baseTx.gas + BigInt(feeCurrency.isNative ? 0 : STATIC_GAS_PADDING),
|
|
335
|
+
_estimatedGasUse: baseTx._estimatedGasUse
|
|
336
|
+
? baseTx._estimatedGasUse + BigInt(feeCurrency.isNative ? 0 : STATIC_GAS_PADDING)
|
|
337
|
+
: undefined,
|
|
338
|
+
_baseFeePerGas: baseFeePerGas,
|
|
339
|
+
})
|
|
340
|
+
} else {
|
|
341
|
+
const tx = await tryEstimateTransaction({
|
|
342
|
+
client,
|
|
343
|
+
baseTransaction: baseTx,
|
|
344
|
+
feeCurrencySymbol: feeCurrency.symbol,
|
|
345
|
+
feeCurrencyAddress,
|
|
346
|
+
maxFeePerGas,
|
|
347
|
+
maxPriorityFeePerGas,
|
|
348
|
+
baseFeePerGas,
|
|
349
|
+
spendToken,
|
|
350
|
+
spendTokenAmount,
|
|
351
|
+
isGasSubsidized,
|
|
352
|
+
})
|
|
353
|
+
if (!tx) {
|
|
354
|
+
return null
|
|
355
|
+
}
|
|
356
|
+
transactions.push(tx)
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return transactions
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export type PrepareTransactions = typeof prepareTransactions
|
|
364
|
+
/**
|
|
365
|
+
* Prepare transactions to submit to the blockchain.
|
|
366
|
+
*
|
|
367
|
+
* Adds "maxFeePerGas" and "maxPriorityFeePerGas" fields to base transactions. Adds "gas" field to base
|
|
368
|
+
* transactions if they do not already include them.
|
|
369
|
+
*
|
|
370
|
+
* NOTE: throws if spendTokenAmount exceeds the user's balance of that token, unless throwOnSpendTokenAmountExceedsBalance is false
|
|
371
|
+
*
|
|
372
|
+
* @param feeCurrencies
|
|
373
|
+
* @param spendToken
|
|
374
|
+
* @param spendTokenAmount BigNumber in smallest unit
|
|
375
|
+
* @param decreasedAmountGasFeeMultiplier
|
|
376
|
+
* @param baseTransactions
|
|
377
|
+
* @param throwOnSpendTokenAmountExceedsBalance
|
|
378
|
+
* @param isGasSubsidized
|
|
379
|
+
*/
|
|
380
|
+
export async function prepareTransactions({
|
|
381
|
+
feeCurrencies,
|
|
382
|
+
spendToken,
|
|
383
|
+
spendTokenAmount = new BigNumber(0),
|
|
384
|
+
decreasedAmountGasFeeMultiplier = 1,
|
|
385
|
+
baseTransactions,
|
|
386
|
+
throwOnSpendTokenAmountExceedsBalance = true,
|
|
387
|
+
isGasSubsidized = false,
|
|
388
|
+
origin,
|
|
389
|
+
}: {
|
|
390
|
+
feeCurrencies: TokenBalance[]
|
|
391
|
+
spendToken?: TokenBalance
|
|
392
|
+
spendTokenAmount?: BigNumber
|
|
393
|
+
decreasedAmountGasFeeMultiplier?: number
|
|
394
|
+
baseTransactions: (TransactionRequest & { gas?: bigint })[]
|
|
395
|
+
throwOnSpendTokenAmountExceedsBalance?: boolean
|
|
396
|
+
isGasSubsidized?: boolean
|
|
397
|
+
origin: TransactionOrigin
|
|
398
|
+
}): Promise<PreparedTransactionsResult> {
|
|
399
|
+
if (!spendToken && spendTokenAmount.isGreaterThan(0)) {
|
|
400
|
+
throw new Error(
|
|
401
|
+
`prepareTransactions requires a spendToken if spendTokenAmount is greater than 0. spendTokenAmount: ${spendTokenAmount.toString()}`
|
|
402
|
+
)
|
|
403
|
+
}
|
|
404
|
+
if (
|
|
405
|
+
throwOnSpendTokenAmountExceedsBalance &&
|
|
406
|
+
spendToken &&
|
|
407
|
+
spendTokenAmount.isGreaterThan(spendToken.balance.shiftedBy(spendToken.decimals))
|
|
408
|
+
) {
|
|
409
|
+
throw new Error(
|
|
410
|
+
`Cannot prepareTransactions for amount greater than balance. Amount: ${spendTokenAmount.toString()}, Balance: ${spendToken.balance.toString()}, Decimals: ${
|
|
411
|
+
spendToken.decimals
|
|
412
|
+
}`
|
|
413
|
+
)
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Attach divvi tag to all transactions if divvi is enabled
|
|
417
|
+
const config = getAppConfig()
|
|
418
|
+
if (config.divviProtocol) {
|
|
419
|
+
const walletAddress = baseTransactions[0].from
|
|
420
|
+
const referralTag =
|
|
421
|
+
walletAddress &&
|
|
422
|
+
getReferralTag({
|
|
423
|
+
consumer: config.divviProtocol.divviId,
|
|
424
|
+
user: walletAddress,
|
|
425
|
+
})
|
|
426
|
+
if (referralTag) {
|
|
427
|
+
baseTransactions.forEach((tx) => {
|
|
428
|
+
tx.data = tx.data && ((tx.data + referralTag) as Hex)
|
|
429
|
+
})
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
const gasFees: Array<{
|
|
434
|
+
feeCurrency: TokenBalance
|
|
435
|
+
maxGasFeeInDecimal: BigNumber
|
|
436
|
+
estimatedGasFeeInDecimal: BigNumber
|
|
437
|
+
}> = []
|
|
438
|
+
for (const feeCurrency of feeCurrencies) {
|
|
439
|
+
if (feeCurrency.balance.isLessThanOrEqualTo(0) && !isGasSubsidized) {
|
|
440
|
+
// No balance, try next fee currency
|
|
441
|
+
continue
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
const estimatedTransactions = await tryEstimateTransactions(
|
|
445
|
+
baseTransactions,
|
|
446
|
+
feeCurrency,
|
|
447
|
+
isGasSubsidized,
|
|
448
|
+
spendToken,
|
|
449
|
+
spendTokenAmount,
|
|
450
|
+
isGasSubsidized
|
|
451
|
+
)
|
|
452
|
+
if (!estimatedTransactions) {
|
|
453
|
+
// Not enough balance to pay for gas, try next fee currency
|
|
454
|
+
continue
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
const feeDecimals = getFeeDecimals(estimatedTransactions, feeCurrency)
|
|
458
|
+
const maxGasFee = getMaxGasFee(estimatedTransactions)
|
|
459
|
+
const maxGasFeeInDecimal = maxGasFee.shiftedBy(-feeDecimals)
|
|
460
|
+
const estimatedGasFee = getEstimatedGasFee(estimatedTransactions)
|
|
461
|
+
const estimatedGasFeeInDecimal = estimatedGasFee?.shiftedBy(-feeDecimals)
|
|
462
|
+
const spendAmountDecimal = spendTokenAmount.shiftedBy(-(spendToken?.decimals ?? 0))
|
|
463
|
+
gasFees.push({ feeCurrency, maxGasFeeInDecimal, estimatedGasFeeInDecimal })
|
|
464
|
+
if (maxGasFeeInDecimal.isGreaterThan(feeCurrency.balance) && !isGasSubsidized) {
|
|
465
|
+
// Not enough balance to pay for gas, try next fee currency
|
|
466
|
+
continue
|
|
467
|
+
}
|
|
468
|
+
if (
|
|
469
|
+
spendToken &&
|
|
470
|
+
spendToken.tokenId === feeCurrency.tokenId &&
|
|
471
|
+
spendAmountDecimal.plus(maxGasFeeInDecimal).isGreaterThan(spendToken.balance) &&
|
|
472
|
+
!isGasSubsidized
|
|
473
|
+
) {
|
|
474
|
+
// Not enough balance to pay for gas, try next fee currency
|
|
475
|
+
continue
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// This is the one we can use
|
|
479
|
+
return {
|
|
480
|
+
type: 'possible',
|
|
481
|
+
transactions: estimatedTransactions,
|
|
482
|
+
feeCurrency,
|
|
483
|
+
} satisfies PreparedTransactionsPossible
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
if (feeCurrencies.length > 0) {
|
|
487
|
+
// there should always be at least one fee currency, the if is just a safeguard
|
|
488
|
+
AppAnalytics.track(TransactionEvents.transaction_prepare_insufficient_gas, {
|
|
489
|
+
origin,
|
|
490
|
+
networkId: feeCurrencies[0].networkId,
|
|
491
|
+
})
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// So far not enough balance to pay for gas
|
|
495
|
+
// let's see if we can decrease the spend amount, if provided
|
|
496
|
+
// if no spend amount is provided, we conclude that the user does not have enough balance to pay for gas
|
|
497
|
+
const result = gasFees.find(({ feeCurrency }) => feeCurrency.tokenId === spendToken?.tokenId)
|
|
498
|
+
if (
|
|
499
|
+
!spendToken ||
|
|
500
|
+
!result ||
|
|
501
|
+
result.maxGasFeeInDecimal.isGreaterThan(result.feeCurrency.balance)
|
|
502
|
+
) {
|
|
503
|
+
// Can't decrease the spend amount
|
|
504
|
+
return {
|
|
505
|
+
type: 'not-enough-balance-for-gas',
|
|
506
|
+
feeCurrencies,
|
|
507
|
+
} satisfies PreparedTransactionsNotEnoughBalanceForGas
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// We can decrease the spend amount to pay for gas,
|
|
511
|
+
// We'll ask the user if they want to proceed
|
|
512
|
+
const adjustedMaxGasFee = result.maxGasFeeInDecimal.times(decreasedAmountGasFeeMultiplier)
|
|
513
|
+
const maxAmount = spendToken.balance.minus(adjustedMaxGasFee)
|
|
514
|
+
|
|
515
|
+
return {
|
|
516
|
+
type: 'need-decrease-spend-amount-for-gas',
|
|
517
|
+
feeCurrency: result.feeCurrency,
|
|
518
|
+
maxGasFeeInDecimal: adjustedMaxGasFee,
|
|
519
|
+
estimatedGasFeeInDecimal: result.estimatedGasFeeInDecimal,
|
|
520
|
+
decreasedSpendAmount: maxAmount,
|
|
521
|
+
} satisfies PreparedTransactionsNeedDecreaseSpendAmountForGas
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* Prepare a transaction for sending an ERC-20 token with the 'transfer' method.
|
|
526
|
+
*
|
|
527
|
+
* @param fromWalletAddress the address of the wallet sending the transaction
|
|
528
|
+
* @param toWalletAddress the address of the wallet receiving the token
|
|
529
|
+
* @param sendToken the token to send
|
|
530
|
+
* @param amount the amount of the token to send, denominated in the smallest units for that token
|
|
531
|
+
* @param feeCurrencies the balances of the currencies to consider using for paying the transaction fee
|
|
532
|
+
*
|
|
533
|
+
* @param prepareTxs a function that prepares the transactions (for unit testing-- should use default everywhere else)
|
|
534
|
+
*/
|
|
535
|
+
export async function prepareERC20TransferTransaction(
|
|
536
|
+
{
|
|
537
|
+
fromWalletAddress,
|
|
538
|
+
toWalletAddress,
|
|
539
|
+
sendToken,
|
|
540
|
+
amount,
|
|
541
|
+
feeCurrencies,
|
|
542
|
+
}: {
|
|
543
|
+
fromWalletAddress: string
|
|
544
|
+
toWalletAddress: string
|
|
545
|
+
sendToken: TokenBalanceWithAddress
|
|
546
|
+
amount: bigint
|
|
547
|
+
feeCurrencies: TokenBalance[]
|
|
548
|
+
},
|
|
549
|
+
prepareTxs = prepareTransactions // for unit testing
|
|
550
|
+
): Promise<PreparedTransactionsResult> {
|
|
551
|
+
const baseSendTx: TransactionRequest = {
|
|
552
|
+
from: fromWalletAddress as Address,
|
|
553
|
+
to: sendToken.address as Address,
|
|
554
|
+
data: encodeFunctionData({
|
|
555
|
+
abi: erc20Abi,
|
|
556
|
+
functionName: 'transfer',
|
|
557
|
+
args: [toWalletAddress as Address, amount],
|
|
558
|
+
}),
|
|
559
|
+
}
|
|
560
|
+
return prepareTxs({
|
|
561
|
+
feeCurrencies,
|
|
562
|
+
spendToken: sendToken,
|
|
563
|
+
spendTokenAmount: new BigNumber(amount.toString()),
|
|
564
|
+
decreasedAmountGasFeeMultiplier: 1,
|
|
565
|
+
baseTransactions: [baseSendTx],
|
|
566
|
+
origin: 'send',
|
|
567
|
+
})
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Prepare a transaction for sending native asset.
|
|
572
|
+
*
|
|
573
|
+
* @param fromWalletAddress - sender address
|
|
574
|
+
* @param toWalletAddress - recipient address
|
|
575
|
+
* @param amount the amount of the token to send, denominated in the smallest units for that token
|
|
576
|
+
* @param feeCurrencies - tokens to consider using for paying the transaction fee
|
|
577
|
+
* @param sendToken - native asset to send. MUST be native asset (e.g. sendable using the 'value' field of a transaction, like ETH or CELO)
|
|
578
|
+
*
|
|
579
|
+
* @param prepareTxs a function that prepares the transactions (for unit testing-- should use default everywhere else)
|
|
580
|
+
**/
|
|
581
|
+
export function prepareSendNativeAssetTransaction(
|
|
582
|
+
{
|
|
583
|
+
fromWalletAddress,
|
|
584
|
+
toWalletAddress,
|
|
585
|
+
amount,
|
|
586
|
+
feeCurrencies,
|
|
587
|
+
sendToken,
|
|
588
|
+
}: {
|
|
589
|
+
fromWalletAddress: string
|
|
590
|
+
toWalletAddress: string
|
|
591
|
+
amount: bigint
|
|
592
|
+
feeCurrencies: TokenBalance[]
|
|
593
|
+
sendToken: NativeTokenBalance
|
|
594
|
+
},
|
|
595
|
+
prepareTxs = prepareTransactions
|
|
596
|
+
): Promise<PreparedTransactionsResult> {
|
|
597
|
+
const baseSendTx: TransactionRequest = {
|
|
598
|
+
from: fromWalletAddress as Address,
|
|
599
|
+
to: toWalletAddress as Address,
|
|
600
|
+
value: amount,
|
|
601
|
+
}
|
|
602
|
+
return prepareTxs({
|
|
603
|
+
feeCurrencies,
|
|
604
|
+
spendToken: sendToken,
|
|
605
|
+
spendTokenAmount: new BigNumber(amount.toString()),
|
|
606
|
+
decreasedAmountGasFeeMultiplier: 1,
|
|
607
|
+
baseTransactions: [baseSendTx],
|
|
608
|
+
origin: 'send',
|
|
609
|
+
})
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
export type GetFeeCurrencyAndAmounts = typeof getFeeCurrencyAndAmounts
|
|
613
|
+
/**
|
|
614
|
+
* Given prepared transactions, get the fee currency and amounts in decimals
|
|
615
|
+
*
|
|
616
|
+
* @param prepareTransactionsResult
|
|
617
|
+
*/
|
|
618
|
+
export function getFeeCurrencyAndAmounts(
|
|
619
|
+
prepareTransactionsResult: PreparedTransactionsResult | undefined
|
|
620
|
+
): {
|
|
621
|
+
feeCurrency: TokenBalance | undefined
|
|
622
|
+
maxFeeAmount: BigNumber | undefined
|
|
623
|
+
estimatedFeeAmount: BigNumber | undefined
|
|
624
|
+
} {
|
|
625
|
+
let feeCurrency = undefined
|
|
626
|
+
let maxFeeAmount = undefined
|
|
627
|
+
let estimatedFeeAmount = undefined
|
|
628
|
+
if (prepareTransactionsResult?.type === 'possible') {
|
|
629
|
+
feeCurrency = prepareTransactionsResult.feeCurrency
|
|
630
|
+
const feeDecimals = getFeeDecimals(prepareTransactionsResult.transactions, feeCurrency)
|
|
631
|
+
maxFeeAmount = getMaxGasFee(prepareTransactionsResult.transactions).shiftedBy(-feeDecimals)
|
|
632
|
+
estimatedFeeAmount = getEstimatedGasFee(prepareTransactionsResult.transactions).shiftedBy(
|
|
633
|
+
-feeDecimals
|
|
634
|
+
)
|
|
635
|
+
} else if (prepareTransactionsResult?.type === 'need-decrease-spend-amount-for-gas') {
|
|
636
|
+
feeCurrency = prepareTransactionsResult.feeCurrency
|
|
637
|
+
maxFeeAmount = prepareTransactionsResult.maxGasFeeInDecimal
|
|
638
|
+
estimatedFeeAmount = prepareTransactionsResult.estimatedGasFeeInDecimal
|
|
639
|
+
}
|
|
640
|
+
return {
|
|
641
|
+
feeCurrency,
|
|
642
|
+
maxFeeAmount,
|
|
643
|
+
estimatedFeeAmount,
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Given prepared transaction(s), get the fee currency set.
|
|
649
|
+
* IMPORTANT: it can be a fee currency adapter address, not the actual fee currency address
|
|
650
|
+
*
|
|
651
|
+
* NOTE: throws if the fee currency is not the same for all transactions
|
|
652
|
+
*/
|
|
653
|
+
export function getFeeCurrency(preparedTransactions: TransactionRequest[]): Address | undefined
|
|
654
|
+
export function getFeeCurrency(preparedTransaction: TransactionRequest): Address | undefined
|
|
655
|
+
export function getFeeCurrency(x: TransactionRequest[] | TransactionRequest): Address | undefined {
|
|
656
|
+
const preparedTransactions = Array.isArray(x) ? x : [x]
|
|
657
|
+
|
|
658
|
+
const feeCurrencies = preparedTransactions.map(_getFeeCurrency)
|
|
659
|
+
// The prepared transactions should always use the same fee currency
|
|
660
|
+
// throw if that's not the case
|
|
661
|
+
if (
|
|
662
|
+
feeCurrencies.length > 1 &&
|
|
663
|
+
feeCurrencies.some((feeCurrency) => feeCurrency !== feeCurrencies[0])
|
|
664
|
+
) {
|
|
665
|
+
throw new Error('Unexpected usage of multiple fee currencies for prepared transactions')
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
return feeCurrencies[0]
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
function _getFeeCurrency(prepareTransaction: TransactionRequest): Address | undefined {
|
|
672
|
+
if ('feeCurrency' in prepareTransaction) {
|
|
673
|
+
return prepareTransaction.feeCurrency
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
return undefined
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
export function getFeeCurrencyToken(
|
|
680
|
+
preparedTransactions: TransactionRequest[],
|
|
681
|
+
networkId: NetworkId,
|
|
682
|
+
tokensById: TokenBalances
|
|
683
|
+
): TokenBalance | undefined {
|
|
684
|
+
const feeCurrencyAdapterOrAddress = getFeeCurrency(preparedTransactions)
|
|
685
|
+
|
|
686
|
+
// First try to find the fee currency token by its address (most common case)
|
|
687
|
+
const feeCurrencyToken = tokensById[getTokenId(networkId, feeCurrencyAdapterOrAddress)]
|
|
688
|
+
if (feeCurrencyToken) {
|
|
689
|
+
return feeCurrencyToken
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
// Then try finding the fee currency token by its fee currency adapter address
|
|
693
|
+
if (feeCurrencyAdapterOrAddress) {
|
|
694
|
+
return Object.values(tokensById).find(
|
|
695
|
+
(token) =>
|
|
696
|
+
token &&
|
|
697
|
+
token.networkId === networkId &&
|
|
698
|
+
token.feeCurrencyAdapterAddress === feeCurrencyAdapterOrAddress
|
|
699
|
+
)
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// This indicates we're missing some data
|
|
703
|
+
Logger.error(
|
|
704
|
+
TAG,
|
|
705
|
+
`Could not find fee currency token for prepared transactions with feeCurrency set to '${feeCurrencyAdapterOrAddress}' in network ${networkId}`
|
|
706
|
+
)
|
|
707
|
+
return undefined
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
export function getFeeDecimals(
|
|
711
|
+
preparedTransactions: TransactionRequest[],
|
|
712
|
+
feeCurrency: TokenBalance
|
|
713
|
+
): number {
|
|
714
|
+
const feeCurrencyAdapterOrAddress = getFeeCurrency(preparedTransactions)
|
|
715
|
+
if (!feeCurrencyAdapterOrAddress) {
|
|
716
|
+
if (!feeCurrency.isNative) {
|
|
717
|
+
// This should never happen
|
|
718
|
+
throw new Error(`Passed fee currency (${feeCurrency.tokenId}) must be native`)
|
|
719
|
+
}
|
|
720
|
+
return feeCurrency.decimals
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
if (feeCurrencyAdapterOrAddress === feeCurrency.feeCurrencyAdapterAddress) {
|
|
724
|
+
if (feeCurrency.feeCurrencyAdapterDecimals === undefined) {
|
|
725
|
+
// This should never happen
|
|
726
|
+
throw new Error(
|
|
727
|
+
`Passed fee currency (${feeCurrency.tokenId}) does not have 'feeCurrencyAdapterDecimals' set`
|
|
728
|
+
)
|
|
729
|
+
}
|
|
730
|
+
return feeCurrency.feeCurrencyAdapterDecimals
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
if (feeCurrencyAdapterOrAddress === feeCurrency.address) {
|
|
734
|
+
return feeCurrency.decimals
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// This should never happen
|
|
738
|
+
throw new Error(
|
|
739
|
+
`Passed fee currency (${feeCurrency.tokenId}) does not match the fee currency of the prepared transactions (${feeCurrencyAdapterOrAddress})`
|
|
740
|
+
)
|
|
741
|
+
}
|