├── .github └── dependabot.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Jenkinsfile ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── debug │ ├── google-services.json │ └── res │ │ ├── drawable │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ └── values │ │ └── strings.xml │ ├── develop │ ├── google-services.json │ └── res │ │ └── values │ │ └── strings.xml │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── jp │ │ │ └── co │ │ │ └── soramitsu │ │ │ └── app │ │ │ ├── App.kt │ │ │ ├── di │ │ │ └── app │ │ │ │ ├── AppModule.kt │ │ │ │ └── NavigationModule.kt │ │ │ └── root │ │ │ ├── di │ │ │ └── RootFeatureModule.kt │ │ │ ├── domain │ │ │ ├── AppInitializer.kt │ │ │ └── RootInteractor.kt │ │ │ ├── navigation │ │ │ └── Navigator.kt │ │ │ └── presentation │ │ │ ├── AlertFragment.kt │ │ │ ├── RootActivity.kt │ │ │ ├── RootRouter.kt │ │ │ ├── RootViewModel.kt │ │ │ ├── WebViewerFragment.kt │ │ │ ├── di │ │ │ └── RootActivityModule.kt │ │ │ ├── main │ │ │ ├── MainFragment.kt │ │ │ └── MainViewModel.kt │ │ │ └── stories │ │ │ ├── StoryFragment.kt │ │ │ ├── StoryViewModel.kt │ │ │ └── di │ │ │ └── StoryModule.kt │ └── res │ │ ├── layout │ │ ├── activity_root.xml │ │ ├── fragment_main.xml │ │ └── fragment_story.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── navigation │ │ ├── bottom_nav_graph.xml │ │ ├── main_nav_graph.xml │ │ ├── onboarding_nav_graph.xml │ │ └── root_nav_graph.xml │ │ ├── values │ │ └── strings.xml │ │ └── xml │ │ ├── network_security_config.xml │ │ └── provider_paths.xml │ ├── pr │ ├── google-services.json │ └── res │ │ └── values │ │ └── strings.xml │ ├── release │ ├── google-services.json │ └── res │ │ ├── drawable │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.xml │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ └── mipmap-xxxhdpi │ │ └── ic_launcher.png │ └── staging │ ├── google-services.json │ └── res │ └── values │ └── strings.xml ├── build.gradle ├── buildSrc ├── build.gradle.kts ├── settings.gradle.kts └── src │ └── main │ └── kotlin │ └── detekt-setup.gradle.kts ├── common ├── .gitignore ├── build.gradle └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── jp │ │ │ └── co │ │ │ └── soramitsu │ │ │ └── common │ │ │ ├── AlertViewState.kt │ │ │ ├── PlayMarketUris.kt │ │ │ ├── address │ │ │ ├── AddressChooserBottomSheetDialog.kt │ │ │ ├── AddressIconGenerator.kt │ │ │ └── AddressModel.kt │ │ │ ├── base │ │ │ ├── BaseActivity.kt │ │ │ ├── BaseBottomSheetDialogFragment.kt │ │ │ ├── BaseComposeBottomSheetDialogFragment.kt │ │ │ ├── BaseComposeFragment.kt │ │ │ ├── BaseException.kt │ │ │ ├── BaseFragment.kt │ │ │ ├── BaseViewModel.kt │ │ │ ├── errors │ │ │ │ ├── FearlessException.kt │ │ │ │ ├── TitledException.kt │ │ │ │ └── ValidationException.kt │ │ │ └── models │ │ │ │ └── ErrorDialogState.kt │ │ │ ├── compose │ │ │ ├── bottomnavbar │ │ │ │ └── NavigationItem.kt │ │ │ ├── component │ │ │ │ ├── AccountInfo.kt │ │ │ │ ├── ActionBar.kt │ │ │ │ ├── ActionCell.kt │ │ │ │ ├── Address.kt │ │ │ │ ├── AddressDisplay.kt │ │ │ │ ├── AddressInput.kt │ │ │ │ ├── AddressInputWithScore.kt │ │ │ │ ├── AdvancedExpandableText.kt │ │ │ │ ├── AlertSheet.kt │ │ │ │ ├── AmountInput.kt │ │ │ │ ├── AssetBalance.kt │ │ │ │ ├── AssetChainsBadge.kt │ │ │ │ ├── AssetListItem.kt │ │ │ │ ├── AssetSelector.kt │ │ │ │ ├── AttentionMessage.kt │ │ │ │ ├── BackIconButton.kt │ │ │ │ ├── BackgroundCornered.kt │ │ │ │ ├── BannerBackup.kt │ │ │ │ ├── BannerBuyXorScreen.kt │ │ │ │ ├── BannerCreateOrImport.kt │ │ │ │ ├── BannerDemeter.kt │ │ │ │ ├── BannerGetSoraCard.kt │ │ │ │ ├── BannerLiquidityPools.kt │ │ │ │ ├── BannerPageIndicator.kt │ │ │ │ ├── BottomNavigationBar.kt │ │ │ │ ├── BottomSheetScreen.kt │ │ │ │ ├── Button.kt │ │ │ │ ├── ChainSelector.kt │ │ │ │ ├── ChangeBalance.kt │ │ │ │ ├── CollapsibleView.kt │ │ │ │ ├── ConfirmScreen.kt │ │ │ │ ├── CorneredInput.kt │ │ │ │ ├── DisabledTextInput.kt │ │ │ │ ├── DoubleGradientIcon.kt │ │ │ │ ├── DropDown.kt │ │ │ │ ├── EmptyMessage.kt │ │ │ │ ├── EnterAmountScreen.kt │ │ │ │ ├── ExpandableText.kt │ │ │ │ ├── FearlessCorneredShape.kt │ │ │ │ ├── FearlessProgress.kt │ │ │ │ ├── FearlessRadioButton.kt │ │ │ │ ├── FeeInfo.kt │ │ │ │ ├── FullScreenLoading.kt │ │ │ │ ├── GifImage.kt │ │ │ │ ├── GradientIconState.kt │ │ │ │ ├── HaloIcon.kt │ │ │ │ ├── HiddenAssetsItem.kt │ │ │ │ ├── InfoItem.kt │ │ │ │ ├── InfoItemSet.kt │ │ │ │ ├── InfoTable.kt │ │ │ │ ├── InfoTableItem.kt │ │ │ │ ├── InfoTableItemAsset.kt │ │ │ │ ├── InputWithHint.kt │ │ │ │ ├── ListDialog.kt │ │ │ │ ├── MnemonicWords.kt │ │ │ │ ├── MultiToggleButton.kt │ │ │ │ ├── NetworkIssuesBadge.kt │ │ │ │ ├── NftStub.kt │ │ │ │ ├── Notification.kt │ │ │ │ ├── NumberInput.kt │ │ │ │ ├── ProgressDialog.kt │ │ │ │ ├── QuickInput.kt │ │ │ │ ├── ScoreStar.kt │ │ │ │ ├── SelectValidatorsVariantPanel.kt │ │ │ │ ├── SelectorWithBorder.kt │ │ │ │ ├── SettingsItem.kt │ │ │ │ ├── Shimmers.kt │ │ │ │ ├── Slider.kt │ │ │ │ ├── SoraCardFiatCard.kt │ │ │ │ ├── Spacers.kt │ │ │ │ ├── SwapHeader.kt │ │ │ │ ├── SwipeBox.kt │ │ │ │ ├── Text.kt │ │ │ │ ├── TextFieldHint.kt │ │ │ │ ├── TextInput.kt │ │ │ │ ├── TextSelectableItem.kt │ │ │ │ ├── Timer.kt │ │ │ │ ├── TitleValue.kt │ │ │ │ ├── Toolbar.kt │ │ │ │ ├── ToolbarBottomSheet.kt │ │ │ │ ├── Utils.kt │ │ │ │ ├── WalletItem.kt │ │ │ │ ├── WalletNameItem.kt │ │ │ │ ├── WalletSelectorModal.kt │ │ │ │ └── WarningInfo.kt │ │ │ ├── models │ │ │ │ ├── ImageModel.kt │ │ │ │ ├── Loadable.kt │ │ │ │ ├── LoadableListPage.kt │ │ │ │ ├── ScreenLayout.kt │ │ │ │ └── TextModel.kt │ │ │ ├── theme │ │ │ │ ├── Color.kt │ │ │ │ ├── CustomColors.kt │ │ │ │ ├── CustomTypographyFlw.kt │ │ │ │ ├── FearlessMaterialColors.kt │ │ │ │ ├── Font.kt │ │ │ │ ├── SoraTextStyle.kt │ │ │ │ ├── Theme.kt │ │ │ │ └── tokens │ │ │ │ │ ├── BorderRadius.kt │ │ │ │ │ ├── Colors.kt │ │ │ │ │ ├── DayThemeColors.kt │ │ │ │ │ ├── FontFamilies.kt │ │ │ │ │ ├── FontWeights.kt │ │ │ │ │ ├── NightThemeColors.kt │ │ │ │ │ └── TextStyles.kt │ │ │ ├── utils │ │ │ │ └── PageScrollingExt.kt │ │ │ └── viewstate │ │ │ │ ├── AssetListItemShimmerViewState.kt │ │ │ │ └── AssetListItemViewState.kt │ │ │ ├── data │ │ │ ├── FileProviderImpl.kt │ │ │ ├── Keypair.kt │ │ │ ├── holders │ │ │ │ ├── ChainIdHolder.kt │ │ │ │ └── RuntimeHolder.kt │ │ │ ├── memory │ │ │ │ └── ComputationalCache.kt │ │ │ ├── model │ │ │ │ └── CursorPage.kt │ │ │ ├── network │ │ │ │ ├── AndroidLogger.kt │ │ │ │ ├── AppLinksProvider.kt │ │ │ │ ├── BlockExplorerUrlBuilder.kt │ │ │ │ ├── HttpExceptionHandler.kt │ │ │ │ ├── NetworkApiCreator.kt │ │ │ │ ├── OptionsProvider.kt │ │ │ │ ├── StorageSubscriptionBuilder.kt │ │ │ │ ├── coingecko │ │ │ │ │ ├── CoingeckoApi.kt │ │ │ │ │ └── FiatCurrency.kt │ │ │ │ ├── config │ │ │ │ │ ├── AppConfigRemote.kt │ │ │ │ │ └── RemoteConfigFetcher.kt │ │ │ │ ├── nomis │ │ │ │ │ ├── NomisApi.kt │ │ │ │ │ └── NomisResponse.kt │ │ │ │ ├── rpc │ │ │ │ │ ├── BulkRetriever.kt │ │ │ │ │ ├── ChildStateKey.kt │ │ │ │ │ ├── RetrieveAllValues.kt │ │ │ │ │ └── SocketSingleRequestExecutor.kt │ │ │ │ ├── runtime │ │ │ │ │ └── binding │ │ │ │ │ │ ├── AccountInfo.kt │ │ │ │ │ │ ├── BalanceOf.kt │ │ │ │ │ │ ├── BindAccountId.kt │ │ │ │ │ │ ├── BindActiveEraIndex.kt │ │ │ │ │ │ ├── BindingHelpers.kt │ │ │ │ │ │ ├── Block.kt │ │ │ │ │ │ ├── Constants.kt │ │ │ │ │ │ ├── Events.kt │ │ │ │ │ │ ├── ExtrinsicStatusEvent.kt │ │ │ │ │ │ ├── MultiAddress.kt │ │ │ │ │ │ └── Primitive.kt │ │ │ │ ├── subquery │ │ │ │ │ ├── EraValidatorInfoQueryResponse.kt │ │ │ │ │ ├── GiantsquidResponse.kt │ │ │ │ │ ├── GiantsquidRewardAmountResponse.kt │ │ │ │ │ ├── ReefStakingRewardsResponse.kt │ │ │ │ │ ├── SoraEraInfoValidatorResponse.kt │ │ │ │ │ ├── StakingCollatorsApyResponse.kt │ │ │ │ │ ├── StakingHistoryRemote.kt │ │ │ │ │ ├── StakingLastRoundId.kt │ │ │ │ │ ├── SubQueryResponse.kt │ │ │ │ │ ├── SubsquidCollatorsApyResponse.kt │ │ │ │ │ ├── SubsquidLastRoundId.kt │ │ │ │ │ ├── SubsquidResponse.kt │ │ │ │ │ ├── SubsquidRewardAmountResponse.kt │ │ │ │ │ ├── SubsquidRewardResponse.kt │ │ │ │ │ └── TransactionHistoryRemote.kt │ │ │ │ └── ton │ │ │ │ │ ├── AccountEvent.kt │ │ │ │ │ ├── DappConfigRemote.kt │ │ │ │ │ ├── EmulateMessageToWalletRequestParamsInner.kt │ │ │ │ │ ├── JettonBalance.kt │ │ │ │ │ ├── JettonTransferPayload.kt │ │ │ │ │ ├── JettonTransferPayloadRemote.kt │ │ │ │ │ ├── MessageConsequences.kt │ │ │ │ │ ├── RatesResponse.kt │ │ │ │ │ ├── SendBlockchainMessageRequest.kt │ │ │ │ │ ├── Seqno.kt │ │ │ │ │ ├── TonAccountData.kt │ │ │ │ │ ├── TonApi.kt │ │ │ │ │ ├── TonAppManifest.kt │ │ │ │ │ └── Transaction.kt │ │ │ ├── secrets │ │ │ │ ├── v1 │ │ │ │ │ ├── Keypair.kt │ │ │ │ │ ├── SecretStoreV1.kt │ │ │ │ │ └── SourceInternal.kt │ │ │ │ ├── v2 │ │ │ │ │ ├── MetaAccountSecrets.kt │ │ │ │ │ └── SecretStoreV2.kt │ │ │ │ └── v3 │ │ │ │ │ ├── EthereumSecretStore.kt │ │ │ │ │ ├── SecretStore.kt │ │ │ │ │ ├── SubstrateSecretStore.kt │ │ │ │ │ └── TonSecretStore.kt │ │ │ └── storage │ │ │ │ ├── Preferences.kt │ │ │ │ ├── PreferencesImpl.kt │ │ │ │ └── encrypt │ │ │ │ ├── EncryptedPreferences.kt │ │ │ │ ├── EncryptedPreferencesImpl.kt │ │ │ │ └── EncryptionUtil.kt │ │ │ ├── di │ │ │ ├── modules │ │ │ │ ├── CommonModule.kt │ │ │ │ └── NetworkModule.kt │ │ │ └── viewmodel │ │ │ │ ├── ViewModelModule.kt │ │ │ │ └── ViewModelProviderFactory.kt │ │ │ ├── domain │ │ │ ├── AppVersion.kt │ │ │ ├── GetAvailableFiatCurrencies.kt │ │ │ ├── NetworkStateService.kt │ │ │ ├── SelectedFiat.kt │ │ │ └── model │ │ │ │ ├── AppConfig.kt │ │ │ │ ├── NetworkIssueType.kt │ │ │ │ └── StoryGroup.kt │ │ │ ├── interfaces │ │ │ └── FileProvider.kt │ │ │ ├── io │ │ │ ├── MainThreadExecutor.kt │ │ │ └── NetworkStateManager.kt │ │ │ ├── list │ │ │ ├── GroupedList.kt │ │ │ ├── GroupedListAdapter.kt │ │ │ ├── PayloadGenerator.kt │ │ │ └── headers │ │ │ │ └── TextHeader.kt │ │ │ ├── mixin │ │ │ ├── api │ │ │ │ ├── Browserable.kt │ │ │ │ ├── Retriable.kt │ │ │ │ └── Validatable.kt │ │ │ └── impl │ │ │ │ ├── ObserveBrowserEvents.kt │ │ │ │ ├── ObserveRetries.kt │ │ │ │ └── ObserveValidations.kt │ │ │ ├── model │ │ │ ├── AssetBooleanState.kt │ │ │ ├── AssetKey.kt │ │ │ └── WalletEcosystem.kt │ │ │ ├── navigation │ │ │ ├── PendingNavigationAction.kt │ │ │ ├── SecureRouter.kt │ │ │ └── payload │ │ │ │ └── WalletSelectorPayload.kt │ │ │ ├── presentation │ │ │ ├── ErrorDialog.kt │ │ │ ├── FiatCurrenciesChooserBottomSheetDialog.kt │ │ │ ├── InfoDialog.kt │ │ │ ├── LoadingState.kt │ │ │ ├── PermissionExt.kt │ │ │ └── StakingStoryModel.kt │ │ │ ├── qrScanner │ │ │ └── QrScannerActivity.kt │ │ │ ├── resources │ │ │ ├── ClipboardManager.kt │ │ │ ├── ContextManager.kt │ │ │ ├── LanguagesHolder.kt │ │ │ ├── ResourceManager.kt │ │ │ └── ResourceManagerImpl.kt │ │ │ ├── scan │ │ │ ├── ScanTextContract.kt │ │ │ ├── ScannerActivity.kt │ │ │ ├── ScannerActivityModule.kt │ │ │ └── ScannerViewModel.kt │ │ │ ├── utils │ │ │ ├── Base58Ext.kt │ │ │ ├── BigDecimal.kt │ │ │ ├── ComponentHolder.kt │ │ │ ├── ComposeExt.kt │ │ │ ├── ContextExt.kt │ │ │ ├── CryptoUtils.kt │ │ │ ├── Delegates.kt │ │ │ ├── DoubleClickPreventUtils.kt │ │ │ ├── DragAndDropDelegate.kt │ │ │ ├── DragAndDropTouchHelperCallback.kt │ │ │ ├── EmailValidator.kt │ │ │ ├── Event.kt │ │ │ ├── Ext.kt │ │ │ ├── FearlessLibExt.kt │ │ │ ├── Filters.kt │ │ │ ├── FlowExt.kt │ │ │ ├── IgnoredOnEquals.kt │ │ │ ├── InputFilter.kt │ │ │ ├── KoltinExt.kt │ │ │ ├── LiveDatExt.kt │ │ │ ├── Map.kt │ │ │ ├── MultipleEventsCutter.kt │ │ │ ├── NewLimitedThreadPoolExecutor.kt │ │ │ ├── NumberFormatters.kt │ │ │ ├── OnDestroy.kt │ │ │ ├── Punycode.kt │ │ │ ├── QrBitmapDecoder.kt │ │ │ ├── QrCodeGenerator.kt │ │ │ ├── RetryUntilDone.kt │ │ │ ├── SingletonHolder.kt │ │ │ ├── SpannableDSL.kt │ │ │ ├── StateMachines.kt │ │ │ ├── SuffixTransformer.kt │ │ │ ├── TonUtils.kt │ │ │ ├── ViewExt.kt │ │ │ ├── Write.kt │ │ │ └── formatting │ │ │ │ ├── AddressExt.kt │ │ │ │ ├── CompoundNumberFormatter.kt │ │ │ │ ├── DynamicPrecisionFormatter.kt │ │ │ │ ├── FiatFormatter.kt │ │ │ │ ├── FixedPrecisionFormatter.kt │ │ │ │ ├── FullPrecisionFormatter.kt │ │ │ │ ├── HashExt.kt │ │ │ │ ├── NumberAbbreviation.kt │ │ │ │ └── NumberFormatter.kt │ │ │ ├── validation │ │ │ ├── Exceptions.kt │ │ │ ├── Validation.kt │ │ │ └── ValidationExecutor.kt │ │ │ ├── vibration │ │ │ └── DeviceVibrator.kt │ │ │ └── view │ │ │ ├── AccountInfoView.kt │ │ │ ├── AmountView.kt │ │ │ ├── BottomNavigationViewWithFAB.kt │ │ │ ├── BottomNavigationWithFABTopEdgeTreatment.kt │ │ │ ├── Extensions.kt │ │ │ ├── GoNextView.kt │ │ │ ├── InputField.kt │ │ │ ├── LabeledTextView.kt │ │ │ ├── PrimaryButton.kt │ │ │ ├── ProfileOptionItemView.kt │ │ │ ├── SegmentedButtonView.kt │ │ │ ├── TableCellView.kt │ │ │ ├── Toolbar.kt │ │ │ ├── ViewBinding.kt │ │ │ ├── bottomSheet │ │ │ ├── AlertBottomSheet.kt │ │ │ ├── LockBottomSheetBehavior.kt │ │ │ └── list │ │ │ │ ├── dynamic │ │ │ │ ├── DynamicListBottomSheet.kt │ │ │ │ └── DynamicListSheetAdapter.kt │ │ │ │ └── fixed │ │ │ │ └── FixedListBottomSheet.kt │ │ │ ├── dialog │ │ │ └── DialogDecorators.kt │ │ │ ├── recyclerview │ │ │ └── LinearLayoutManagerFixed.kt │ │ │ └── shape │ │ │ ├── CutCornersShape.kt │ │ │ ├── CutLeftBottomCornerShape.kt │ │ │ └── ShapeProvider.kt │ └── res │ │ ├── anim │ │ └── progress_rotate.xml │ │ ├── color │ │ ├── actions_color.xml │ │ ├── button_text_colors.xml │ │ ├── group_title_text_colors.xml │ │ └── tint_radio_button.xml │ │ ├── drawable-hdpi │ │ ├── ic_buy_xor.png │ │ ├── ic_get_sora_card_banner.png │ │ └── ic_sora_card_fiat_right.png │ │ ├── drawable-mdpi │ │ ├── ic_buy_xor.png │ │ ├── ic_get_sora_card_banner.png │ │ └── ic_sora_card_fiat_right.png │ │ ├── drawable-ru │ │ └── background_story_chain_accounts.png │ │ ├── drawable-xhdpi │ │ ├── ic_buy_xor.png │ │ ├── ic_get_sora_card_banner.png │ │ └── ic_sora_card_fiat_right.png │ │ ├── drawable-xxhdpi │ │ ├── ic_buy_xor.png │ │ ├── ic_get_sora_card_banner.png │ │ └── ic_sora_card_fiat_right.png │ │ ├── drawable-xxxhdpi │ │ ├── about_top_background.png │ │ ├── about_top_bg_gradient.png │ │ ├── bg_corners.9.png │ │ ├── drawable_soramitsu_brand.png │ │ ├── ic_buy_xor.png │ │ ├── ic_get_sora_card_banner.png │ │ ├── ic_sora_card_fiat_right.png │ │ ├── ic_wallet.png │ │ └── noise.png │ │ ├── drawable │ │ ├── animated_bird.gif │ │ ├── background_banner_substrate.png │ │ ├── background_banner_ton.png │ │ ├── background_story_chain_accounts.png │ │ ├── background_story_ecosystem.png │ │ ├── background_story_networks.png │ │ ├── background_story_networks_2.png │ │ ├── background_story_wallet.png │ │ ├── bg_asset_badge.xml │ │ ├── bg_big_input_shape.xml │ │ ├── bg_big_input_shape_focused.xml │ │ ├── bg_big_input_shape_selector.xml │ │ ├── bg_button_outline.xml │ │ ├── bg_button_outline_selector.xml │ │ ├── bg_button_primary.xml │ │ ├── bg_button_primary_disabled.xml │ │ ├── bg_button_primary_selector.xml │ │ ├── bg_corner_white_overlay.xml │ │ ├── bg_primary_list_item.xml │ │ ├── bg_puller.xml │ │ ├── bg_rect_rounded_gray_4.xml │ │ ├── bg_rounded_button.xml │ │ ├── bg_shimmer_rounded.xml │ │ ├── bg_splash.xml │ │ ├── bottom_navigation_tint_color_selector.xml │ │ ├── defi_wallet_title.xml │ │ ├── demeter_banner_image.png │ │ ├── divider_decoration.xml │ │ ├── divider_drawable.xml │ │ ├── drawable_background_image.png │ │ ├── drawable_fearless_bird.webp │ │ ├── drawable_fearless_logo.xml │ │ ├── fearless_bird_glossy.webp │ │ ├── ic_about_announcements.xml │ │ ├── ic_about_email.xml │ │ ├── ic_about_github.xml │ │ ├── ic_about_instagram.xml │ │ ├── ic_about_medium.xml │ │ ├── ic_about_support.xml │ │ ├── ic_about_telegram.xml │ │ ├── ic_about_twitter.xml │ │ ├── ic_about_wiki.xml │ │ ├── ic_about_youtube.xml │ │ ├── ic_add_recipient.xml │ │ ├── ic_address_placeholder.xml │ │ ├── ic_alert.xml │ │ ├── ic_alert_16.xml │ │ ├── ic_alert_24.xml │ │ ├── ic_alert_triangle_yellow_24.xml │ │ ├── ic_all_chains.xml │ │ ├── ic_arrow_back_24dp.xml │ │ ├── ic_arrow_down.xml │ │ ├── ic_arrow_left_24.xml │ │ ├── ic_arrow_right_24.xml │ │ ├── ic_arrow_right_24_square.xml │ │ ├── ic_arrow_top_right_white_16.xml │ │ ├── ic_arrow_up_rectangle_24.xml │ │ ├── ic_arrows_circle_arrow_right_24.xml │ │ ├── ic_basic_layers_24.xml │ │ ├── ic_basic_options_24.xml │ │ ├── ic_basic_search_24.xml │ │ ├── ic_beacon.xml │ │ ├── ic_bokolocash.xml │ │ ├── ic_bonus_star_24.xml │ │ ├── ic_book.xml │ │ ├── ic_camera_white_24.xml │ │ ├── ic_card.xml │ │ ├── ic_cells.xml │ │ ├── ic_change_account.xml │ │ ├── ic_chart.xml │ │ ├── ic_check_small.xml │ │ ├── ic_checkmark_white_24.xml │ │ ├── ic_chevron_dawn.xml │ │ ├── ic_chevron_down_white.xml │ │ ├── ic_chevron_right.xml │ │ ├── ic_chevron_right_rounded_24.xml │ │ ├── ic_chevron_up_white.xml │ │ ├── ic_close.xml │ │ ├── ic_close_16_circle.xml │ │ ├── ic_close_16_white_circle.xml │ │ ├── ic_common_buy.xml │ │ ├── ic_common_cross_chain.xml │ │ ├── ic_common_hide.xml │ │ ├── ic_common_receive.xml │ │ ├── ic_common_send.xml │ │ ├── ic_copy_16.xml │ │ ├── ic_copy_24.xml │ │ ├── ic_copy_filled_24.xml │ │ ├── ic_cross_32.xml │ │ ├── ic_cross_small.xml │ │ ├── ic_dapp_connection.xml │ │ ├── ic_delete_symbol.xml │ │ ├── ic_dollar_circle.xml │ │ ├── ic_dots_horizontal_24.xml │ │ ├── ic_dotted_list_24.xml │ │ ├── ic_drag.xml │ │ ├── ic_edit_20.xml │ │ ├── ic_elected_validator.xml │ │ ├── ic_exchange.xml │ │ ├── ic_exclamation.xml │ │ ├── ic_experiments.xml │ │ ├── ic_eye_disabled.xml │ │ ├── ic_eye_enabled.xml │ │ ├── ic_favorite_filled.xml │ │ ├── ic_fearless.xml │ │ ├── ic_fearless_bird.xml │ │ ├── ic_fearless_logo.xml │ │ ├── ic_file_upload.xml │ │ ├── ic_filter_list_24.xml │ │ ├── ic_finance_wallet_24.xml │ │ ├── ic_gift.xml │ │ ├── ic_github_blue_24.xml │ │ ├── ic_globe_24.xml │ │ ├── ic_globe_placeholder.xml │ │ ├── ic_google_24.xml │ │ ├── ic_google_30.xml │ │ ├── ic_governance_24.xml │ │ ├── ic_history_16.xml │ │ ├── ic_info_14.xml │ │ ├── ic_info_16.xml │ │ ├── ic_info_24.xml │ │ ├── ic_info_primary_24.xml │ │ ├── ic_info_white_24.xml │ │ ├── ic_key.xml │ │ ├── ic_key_24.xml │ │ ├── ic_language.xml │ │ ├── ic_lightning_24.xml │ │ ├── ic_list.xml │ │ ├── ic_loading.xml │ │ ├── ic_mail_blue_24.xml │ │ ├── ic_maps_compas_24.xml │ │ ├── ic_marked.xml │ │ ├── ic_minus_24.xml │ │ ├── ic_money.xml │ │ ├── ic_monitor_blue_24.xml │ │ ├── ic_more_vertical.xml │ │ ├── ic_nav_crowdloans.xml │ │ ├── ic_nav_dapp.xml │ │ ├── ic_nav_governance.xml │ │ ├── ic_nav_settings.xml │ │ ├── ic_nav_staking.xml │ │ ├── ic_nav_wallet.xml │ │ ├── ic_networks_24.xml │ │ ├── ic_no_reward_24.xml │ │ ├── ic_no_search_results.xml │ │ ├── ic_pass_phrase_24.xml │ │ ├── ic_paypass.xml │ │ ├── ic_pending_reward.xml │ │ ├── ic_pin_24.xml │ │ ├── ic_pin_white_24.xml │ │ ├── ic_placeholder.xml │ │ ├── ic_plus_circle.xml │ │ ├── ic_plus_white_24.xml │ │ ├── ic_polkaswap_fab.xml │ │ ├── ic_polkaswap_logo.xml │ │ ├── ic_popular_chains.xml │ │ ├── ic_profile_24.xml │ │ ├── ic_qr_code_logo.xml │ │ ├── ic_red_cross.xml │ │ ├── ic_refresh_white_24.xml │ │ ├── ic_reward_24.xml │ │ ├── ic_right_arrow_24_align_right.xml │ │ ├── ic_save_type_json.xml │ │ ├── ic_save_type_mnemonic.xml │ │ ├── ic_save_type_seed.xml │ │ ├── ic_scan.xml │ │ ├── ic_score_star_empty.xml │ │ ├── ic_score_star_full.xml │ │ ├── ic_score_star_full_24_pink.xml │ │ ├── ic_score_star_half.xml │ │ ├── ic_screen_warning.xml │ │ ├── ic_search.xml │ │ ├── ic_search_field.xml │ │ ├── ic_security_shield_ok_24.xml │ │ ├── ic_security_unlock_24.xml │ │ ├── ic_selected.xml │ │ ├── ic_selected_not.xml │ │ ├── ic_send_outlined.xml │ │ ├── ic_settings.xml │ │ ├── ic_settings_24.xml │ │ ├── ic_settings_swap.xml │ │ ├── ic_settings_wallets.xml │ │ ├── ic_share_arrow_white_24.xml │ │ ├── ic_sign_out_24.xml │ │ ├── ic_sora_logo.xml │ │ ├── ic_sort.xml │ │ ├── ic_stacking_24.xml │ │ ├── ic_staking.xml │ │ ├── ic_status_error_16.xml │ │ ├── ic_status_indicator.xml │ │ ├── ic_status_success_16.xml │ │ ├── ic_status_warning_16.xml │ │ ├── ic_swap_history.xml │ │ ├── ic_terms_conditions_24.xml │ │ ├── ic_tg_blue_24.xml │ │ ├── ic_time_24.xml │ │ ├── ic_token_testnet.xml │ │ ├── ic_token_undefined.xml │ │ ├── ic_transaction_completed.xml │ │ ├── ic_transaction_pending.xml │ │ ├── ic_unstake_24.xml │ │ ├── ic_user_24.xml │ │ ├── ic_validator_waiting.xml │ │ ├── ic_various_rocket.xml │ │ ├── ic_vector.xml │ │ ├── ic_wallet_24.xml │ │ ├── ic_wallet_connect.xml │ │ ├── ic_wallet_view_24.xml │ │ ├── ic_warning_filled.xml │ │ ├── ic_withdrawal.xml │ │ ├── logo_mc.xml │ │ ├── logo_polkaswap_big.xml │ │ ├── logo_soracard_text.xml │ │ ├── primary_chip_background.xml │ │ ├── secondary_chip_background.xml │ │ ├── segmented_button_background.xml │ │ └── segmented_button_selected_background.xml │ │ ├── font │ │ ├── fonts.xml │ │ ├── inter_bold.ttf │ │ ├── inter_extrabold.ttf │ │ ├── inter_extralight.ttf │ │ ├── inter_light.ttf │ │ ├── inter_regular.ttf │ │ ├── inter_semibold.ttf │ │ ├── inter_thin.ttf │ │ ├── sora_bold.otf │ │ ├── sora_extrabold.otf │ │ ├── sora_extralight.otf │ │ ├── sora_light.otf │ │ ├── sora_regular.otf │ │ ├── sora_semibold.otf │ │ └── sora_thin.otf │ │ ├── layout │ │ ├── activity_qr_scanner.xml │ │ ├── activity_scanner.xml │ │ ├── bottom_sheeet_fixed_list.xml │ │ ├── bottom_sheet_alert.xml │ │ ├── bottom_sheet_dynamic_list.xml │ │ ├── item_address_chooser.xml │ │ ├── item_fiat_chooser.xml │ │ ├── item_sheet_iconic_label.xml │ │ ├── item_sheet_label.xml │ │ ├── item_text_header.xml │ │ ├── view_account_info.xml │ │ ├── view_go_next.xml │ │ ├── view_input_field.xml │ │ ├── view_labeled_text.xml │ │ ├── view_profile_option_item.xml │ │ ├── view_segmented_button.xml │ │ ├── view_staking_amount.xml │ │ ├── view_table_cell.xml │ │ └── view_toolbar.xml │ │ ├── menu │ │ ├── bottom_navigations.xml │ │ └── bottom_navigations_fab.xml │ │ ├── raw │ │ └── webview_ext.js │ │ ├── values-in │ │ └── strings.xml │ │ ├── values-ja │ │ └── strings.xml │ │ ├── values-pt │ │ └── strings.xml │ │ ├── values-ru │ │ └── strings.xml │ │ ├── values-tr │ │ └── strings.xml │ │ ├── values-vi │ │ └── strings.xml │ │ ├── values-zh │ │ └── strings.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── themes.xml │ └── test │ └── java │ └── jp │ └── co │ └── soramitsu │ └── common │ ├── data │ └── secrets │ │ └── v2 │ │ └── SecretStoreV2Test.kt │ └── utils │ ├── CryptoUtilsKtTest.kt │ ├── FlowExtKtTest.kt │ ├── KotlinExtTest.kt │ └── formatting │ ├── Common.kt │ ├── CryptoDetailsAbbreviatedFormatterTest.kt │ ├── CryptoListAbbreviatedFormatterTest.kt │ ├── DynamicPrecisionFormatterTest.kt │ ├── FiatFormatterTest.kt │ ├── FixedPrecisionFormatterTest.kt │ └── FullPrecisionFormatterTest.kt ├── core-api ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── core │ ├── model │ ├── Language.kt │ ├── RuntimeConfiguration.kt │ ├── SecuritySource.kt │ ├── StorageChange.kt │ └── StorageEntry.kt │ ├── storage │ └── StorageCache.kt │ └── updater │ ├── SubscriptionBuilder.kt │ └── Updater.kt ├── core-db ├── .gitignore ├── build.gradle ├── schemas │ └── jp.co.soramitsu.core_db.AppDatabase │ │ ├── 26.json │ │ ├── 27.json │ │ └── 28.json └── src │ ├── androidTest │ └── java │ │ └── jp │ │ └── co │ │ └── soramitsu │ │ └── coredb │ │ ├── dao │ │ ├── ChainDaoTest.kt │ │ ├── DaoTest.kt │ │ ├── Helpers.kt │ │ └── MetaAccountDaoTest.kt │ │ └── migrations │ │ └── V2MigrationTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── jp │ │ └── co │ │ └── soramitsu │ │ └── coredb │ │ ├── AppDatabase.kt │ │ ├── converters │ │ ├── CryptoTypeConverters.kt │ │ ├── LongMathConverters.kt │ │ └── OperationConverters.kt │ │ ├── dao │ │ ├── AccountStakingDao.kt │ │ ├── AddressBookDao.kt │ │ ├── AssetDao.kt │ │ ├── ChainDao.kt │ │ ├── MetaAccountDao.kt │ │ ├── NomisScoresDao.kt │ │ ├── OperationDao.kt │ │ ├── PhishingDao.kt │ │ ├── PoolDao.kt │ │ ├── SoraCardDao.kt │ │ ├── StakingTotalRewardDao.kt │ │ ├── StorageDao.kt │ │ ├── TokenPriceDao.kt │ │ └── TonConnectDao.kt │ │ ├── di │ │ └── DbModule.kt │ │ ├── migrations │ │ ├── AssetsOrderMigration.kt │ │ ├── EthereumDerivationPathMigration.kt │ │ ├── Migrations.kt │ │ ├── TonMigration.kt │ │ └── V2Migration.kt │ │ └── model │ │ ├── AccountStakingLocal.kt │ │ ├── AddressBookContact.kt │ │ ├── AssetLocal.kt │ │ ├── AssetWithToken.kt │ │ ├── MetaAccountLocal.kt │ │ ├── NodeLocal.kt │ │ ├── NomisWalletScoreLocal.kt │ │ ├── OperationLocal.kt │ │ ├── PhishingLocal.kt │ │ ├── PoolLocal.kt │ │ ├── PoolLocalJoined.kt │ │ ├── SoraCardInfoLocal.kt │ │ ├── StorageEntryLocal.kt │ │ ├── TokenPriceLocal.kt │ │ ├── TonConnectionLocal.kt │ │ ├── TotalRewardLocal.kt │ │ └── chain │ │ ├── ChainAssetLocal.kt │ │ ├── ChainExplorerLocal.kt │ │ ├── ChainLocal.kt │ │ ├── ChainNodeLocal.kt │ │ ├── ChainRuntimeInfoLocal.kt │ │ ├── ChainTypesLocal.kt │ │ ├── FavoriteChainLocal.kt │ │ └── JoinedChainInfo.kt │ └── test │ └── java │ └── jp │ └── co │ └── soramitsu │ └── coredb │ └── prepopulate │ └── runtime │ └── PredifinedRuntimeUpdater.kt ├── debug-keystore.jks ├── detekt └── detekt.yml ├── docs └── fearlesswallet_promo.png ├── feature-account-api ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── jp │ │ └── co │ │ └── soramitsu │ │ └── account │ │ └── api │ │ ├── domain │ │ ├── PendulumPreInstalledAccountsScenario.kt │ │ ├── interfaces │ │ │ ├── AccountInteractor.kt │ │ │ ├── AccountRepository.kt │ │ │ ├── AssetBalanceUseCase.kt │ │ │ ├── AssetNotNeedAccountUseCase.kt │ │ │ ├── NodesSettingsScenario.kt │ │ │ ├── NomisScoreInteractor.kt │ │ │ ├── SignWithAccount.kt │ │ │ └── TotalBalanceUseCase.kt │ │ ├── model │ │ │ ├── Account.kt │ │ │ ├── AccountType.kt │ │ │ ├── AddAccountPayload.kt │ │ │ ├── AssetBalance.kt │ │ │ ├── AuthType.kt │ │ │ ├── ImportJsonData.kt │ │ │ ├── ImportMode.kt │ │ │ ├── MetaAccount.kt │ │ │ ├── NomisScoreData.kt │ │ │ └── TotalBalance.kt │ │ └── updaters │ │ │ └── AccountUpdateScope.kt │ │ └── presentation │ │ ├── account │ │ ├── AddressDisplayUseCase.kt │ │ └── create │ │ │ └── ChainAccountCreatePayload.kt │ │ ├── accountSource │ │ ├── AccountSource.kt │ │ └── SourceTypeChooserBottomSheetDialog.kt │ │ ├── actions │ │ ├── AddAccountPayload.kt │ │ ├── ExternalAccountActions.kt │ │ ├── ExternalAccountActionsProvider.kt │ │ ├── ExternalActionsSheet.kt │ │ └── ExternalActionsUi.kt │ │ ├── create_backup_password │ │ └── SaveBackupPayload.kt │ │ └── exporting │ │ ├── ExportExt.kt │ │ ├── ExportSource.kt │ │ └── ExportSourceChooserPayload.kt │ └── res │ └── layout │ └── item_source.xml ├── feature-account-impl ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── jp │ │ └── co │ │ └── soramitsu │ │ └── account │ │ └── impl │ │ ├── data │ │ ├── mappers │ │ │ └── Mappers.kt │ │ └── repository │ │ │ ├── AccountRepositoryDelegate.kt │ │ │ ├── AccountRepositoryImpl.kt │ │ │ ├── KeyPairRepository.kt │ │ │ └── datasource │ │ │ ├── AccountDataSource.kt │ │ │ └── AccountDataSourceImpl.kt │ │ ├── di │ │ └── AccountFeatureModule.kt │ │ ├── domain │ │ ├── AccountInteractorImpl.kt │ │ ├── AssetBalanceUseCaseImpl.kt │ │ ├── AssetNotNeedAccountUseCaseImpl.kt │ │ ├── BalancesUtils.kt │ │ ├── BeaconConnectedUseCase.kt │ │ ├── NodeHostValidator.kt │ │ ├── NodesSettingsScenarioImpl.kt │ │ ├── NomisScoreInteractorImpl.kt │ │ ├── TotalBalanceUseCaseImpl.kt │ │ ├── WalletSyncService.kt │ │ ├── account │ │ │ └── details │ │ │ │ ├── AccountDetailsInteractor.kt │ │ │ │ └── AccountInChain.kt │ │ └── errors │ │ │ ├── NodeAlreadyExistsException.kt │ │ │ └── UnsupportedNetworkException.kt │ │ └── presentation │ │ ├── AccountRouter.kt │ │ ├── about │ │ ├── AboutBackground.kt │ │ ├── AboutFragment.kt │ │ ├── AboutScreen.kt │ │ ├── AboutScreenItem.kt │ │ ├── AboutScreenSectionItem.kt │ │ ├── AboutState.kt │ │ ├── AboutViewModel.kt │ │ └── model │ │ │ ├── AboutItemListModel.kt │ │ │ ├── AboutItemModel.kt │ │ │ └── AboutSectionModel.kt │ │ ├── account │ │ ├── chainaccounts │ │ │ ├── AccountInChainUi.kt │ │ │ ├── ChainAccountsAdapter.kt │ │ │ ├── ChainAccountsContent.kt │ │ │ ├── ChainAccountsFragment.kt │ │ │ └── ChainAccountsViewModel.kt │ │ ├── create │ │ │ ├── CreateAccountDialog.kt │ │ │ ├── CreateAccountDialogContent.kt │ │ │ ├── CreateAccountFragment.kt │ │ │ ├── CreateAccountScreenKeys.kt │ │ │ └── CreateAccountViewModel.kt │ │ ├── details │ │ │ ├── AccountDetailsContent.kt │ │ │ ├── AccountDetailsFragment.kt │ │ │ ├── AccountDetailsViewModel.kt │ │ │ └── WalletAccountActionsSheet.kt │ │ ├── mixin │ │ │ ├── api │ │ │ │ └── AccountListingMixin.kt │ │ │ └── impl │ │ │ │ └── AccountListingProvider.kt │ │ ├── model │ │ │ ├── ConnectedAccountsInfoItem.kt │ │ │ ├── Format.kt │ │ │ └── LightMetaAccountUi.kt │ │ └── rename │ │ │ ├── RenameAccountDialog.kt │ │ │ ├── RenameAccountDialogContent.kt │ │ │ └── RenameAccountViewModel.kt │ │ ├── backup_wallet │ │ ├── BackupWalletContent.kt │ │ ├── BackupWalletDialog.kt │ │ └── BackupWalletViewModel.kt │ │ ├── common │ │ └── mixin │ │ │ ├── api │ │ │ └── CryptoTypeChooserMixin.kt │ │ │ └── impl │ │ │ └── CryptoTypeChooser.kt │ │ ├── create_backup_password │ │ ├── CreateBackupPasswordContent.kt │ │ ├── CreateBackupPasswordDialog.kt │ │ └── CreateBackupPasswordViewModel.kt │ │ ├── experimental │ │ ├── ExperimentalFragment.kt │ │ ├── ExperimentalViewModel.kt │ │ ├── SuccessfulFragment.kt │ │ └── di │ │ │ ├── ExperimentalComponent.kt │ │ │ └── ExperimentalModule.kt │ │ ├── exporting │ │ ├── ExportFragment.kt │ │ ├── ExportViewModel.kt │ │ ├── SecurityWarningDialog.kt │ │ ├── json │ │ │ ├── confirm │ │ │ │ ├── ExportJsonConfirmFragment.kt │ │ │ │ ├── ExportJsonConfirmPayload.kt │ │ │ │ ├── ExportJsonConfirmViewModel.kt │ │ │ │ └── JsonExportTypeSheet.kt │ │ │ └── password │ │ │ │ ├── ExportJsonPasswordFragment.kt │ │ │ │ ├── ExportJsonPasswordPayload.kt │ │ │ │ └── ExportJsonPasswordViewModel.kt │ │ ├── mnemonic │ │ │ ├── ExportMnemonicFragment.kt │ │ │ ├── ExportMnemonicPayload.kt │ │ │ └── ExportMnemonicViewModel.kt │ │ └── seed │ │ │ ├── ExportSeedFragment.kt │ │ │ ├── ExportSeedPayload.kt │ │ │ └── ExportSeedViewModel.kt │ │ ├── importing │ │ ├── FileReader.kt │ │ ├── ImportAccountFragment.kt │ │ ├── ImportAccountViewModel.kt │ │ ├── di │ │ │ └── ImportAccountModule.kt │ │ ├── remote_backup │ │ │ ├── ImportRemoteWalletContent.kt │ │ │ ├── ImportRemoteWalletDialog.kt │ │ │ ├── ImportRemoteWalletStep.kt │ │ │ ├── ImportRemoteWalletViewModel.kt │ │ │ ├── model │ │ │ │ └── WrappedBackupAccountMeta.kt │ │ │ ├── screens │ │ │ │ ├── EnterBackupPasswordScreen.kt │ │ │ │ ├── RemoteWalletListScreen.kt │ │ │ │ └── WalletImportedScreen.kt │ │ │ └── views │ │ │ │ └── CompactWalletItem.kt │ │ └── source │ │ │ ├── model │ │ │ ├── Features.kt │ │ │ └── ImportSourceModel.kt │ │ │ └── view │ │ │ ├── ImportSourceView.kt │ │ │ ├── JsonImportView.kt │ │ │ ├── JsonPasteOptionsSheet.kt │ │ │ ├── MnemonicImportView.kt │ │ │ └── SeedImportView.kt │ │ ├── language │ │ ├── LanguagesAdapter.kt │ │ ├── LanguagesFragment.kt │ │ ├── LanguagesViewModel.kt │ │ ├── mapper │ │ │ └── MapLanguageToLanguageModel.kt │ │ └── model │ │ │ └── LanguageModel.kt │ │ ├── mnemonic │ │ ├── backup │ │ │ ├── BackupMnemonicContent.kt │ │ │ ├── BackupMnemonicDialog.kt │ │ │ ├── BackupMnemonicFragment.kt │ │ │ ├── BackupMnemonicPayload.kt │ │ │ ├── BackupMnemonicScreenKeys.kt │ │ │ ├── BackupMnemonicViewModel.kt │ │ │ ├── EthereumDerivationPathTransformer.kt │ │ │ └── exceptions │ │ │ │ └── NotValidDerivationPath.kt │ │ └── confirm │ │ │ ├── ConfirmMnemonicFragment.kt │ │ │ ├── ConfirmMnemonicPayload.kt │ │ │ ├── ConfirmMnemonicViewModel.kt │ │ │ └── view │ │ │ ├── MnemonicContainerView.kt │ │ │ └── MnemonicWordView.kt │ │ ├── mnemonic_agreements │ │ ├── MnemonicAgreementsContent.kt │ │ ├── MnemonicAgreementsDialog.kt │ │ └── MnemonicAgreementsViewModel.kt │ │ ├── node │ │ ├── NodeDetailsRootViewModel.kt │ │ ├── add │ │ │ ├── AddNodeFragment.kt │ │ │ ├── AddNodeViewModel.kt │ │ │ └── LabeledButtonState.kt │ │ ├── details │ │ │ ├── NodeDetailsFragment.kt │ │ │ ├── NodeDetailsPayload.kt │ │ │ └── NodeDetailsViewModel.kt │ │ ├── list │ │ │ ├── NodesAdapter.kt │ │ │ ├── NodesFragment.kt │ │ │ ├── NodesViewModel.kt │ │ │ └── di │ │ │ │ └── NodesModule.kt │ │ ├── mixin │ │ │ ├── api │ │ │ │ └── NodeListingMixin.kt │ │ │ └── impl │ │ │ │ └── NodeListingProvider.kt │ │ └── model │ │ │ ├── NodeHeaderModel.kt │ │ │ └── NodeModel.kt │ │ ├── nomis_scoring │ │ ├── ScoreDetailsFragment.kt │ │ ├── ScoreDetailsScreen.kt │ │ └── ScoreDetailsViewModel.kt │ │ ├── options_ecosystem_accounts │ │ ├── OptionsEcosystemAccountsContent.kt │ │ ├── OptionsEcosystemAccountsFragment.kt │ │ └── OptionsEcosystemAccountsViewModel.kt │ │ ├── options_switch_node │ │ ├── OptionsSwitchNodeContent.kt │ │ ├── OptionsSwitchNodeFragment.kt │ │ └── OptionsSwitchNodeViewModel.kt │ │ ├── optionsaddaccount │ │ ├── OptionsAddAccountContent.kt │ │ ├── OptionsAddAccountFragment.kt │ │ └── OptionsAddAccountViewModel.kt │ │ ├── pincode │ │ ├── PinCodeAction.kt │ │ ├── PinCodeViewModel.kt │ │ ├── PincodeFragment.kt │ │ ├── fingerprint │ │ │ ├── FingerprintCallback.kt │ │ │ └── FingerprintWrapper.kt │ │ └── view │ │ │ ├── DotsProgressView.kt │ │ │ └── PinCodeView.kt │ │ ├── profile │ │ ├── ProfileActionsSheet.kt │ │ ├── ProfileFragment.kt │ │ ├── ProfileScreen.kt │ │ ├── ProfileViewModel.kt │ │ └── di │ │ │ └── ProfileModule.kt │ │ └── view │ │ ├── advanced │ │ ├── AdvancedBlockView.kt │ │ └── encryption │ │ │ ├── EncryptionTypeChooserBottomSheetDialog.kt │ │ │ └── model │ │ │ └── CryptoTypeModel.kt │ │ └── mnemonic │ │ ├── MnemonicViewer.kt │ │ └── MnemonicWordsAdapter.kt │ └── res │ ├── anim │ └── shake.xml │ ├── drawable │ ├── bg_add_account.xml │ ├── bg_mnemonic_container.xml │ ├── bg_mnemonic_word_dark.xml │ ├── bg_mnemonic_word_light.xml │ ├── ic_delete.xml │ ├── ic_fingerprint.xml │ ├── ic_pincode_indicator_empty.xml │ └── ic_pincode_indicator_filled.xml │ ├── layout │ ├── fragment_backup_mnemonic.xml │ ├── fragment_confirm_mnemonic.xml │ ├── fragment_create_account.xml │ ├── fragment_experimental.xml │ ├── fragment_export_json_confirm.xml │ ├── fragment_export_json_password.xml │ ├── fragment_export_mnemonic.xml │ ├── fragment_export_seed.xml │ ├── fragment_import_account.xml │ ├── fragment_languages.xml │ ├── fragment_node_add.xml │ ├── fragment_node_details.xml │ ├── fragment_nodes.xml │ ├── fragment_pincode.xml │ ├── fragment_succesful.xml │ ├── import_source_json.xml │ ├── import_source_mnemonic.xml │ ├── import_source_seed.xml │ ├── item_chain_acount.xml │ ├── item_encryption_type.xml │ ├── item_language.xml │ ├── item_mnemonic_word.xml │ ├── item_node.xml │ ├── item_node_group.xml │ ├── pincode_view.xml │ ├── view_advanced_block.xml │ ├── view_mnemonic.xml │ ├── view_mnemonic_container.xml │ └── view_mnemonic_word.xml │ └── values │ ├── attrs.xml │ ├── dimens.xml │ └── styles.xml ├── feature-crowdloan-api ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── crowdloan │ └── api │ ├── data │ ├── network │ │ └── blockhain │ │ │ └── binding │ │ │ ├── Contribution.kt │ │ │ ├── FundIndex.kt │ │ │ ├── FundInfo.kt │ │ │ ├── LeaseEntry.kt │ │ │ └── ParaId.kt │ └── repository │ │ ├── CrowdloanRepository.kt │ │ └── CrowdloanRepositoryExt.kt │ └── di │ ├── Crowdloan.kt │ └── CrowdloanFeatureApi.kt ├── feature-crowdloan-impl ├── .gitignore ├── build.gradle └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── jp │ │ │ └── co │ │ │ └── soramitsu │ │ │ └── crowdloan │ │ │ └── impl │ │ │ ├── data │ │ │ ├── CrowdloanSharedState.kt │ │ │ ├── network │ │ │ │ ├── api │ │ │ │ │ ├── acala │ │ │ │ │ │ ├── AcalaApi.kt │ │ │ │ │ │ ├── AcalaContributeRequest.kt │ │ │ │ │ │ ├── AcalaContributeResponse.kt │ │ │ │ │ │ ├── AcalaReferralCheck.kt │ │ │ │ │ │ ├── AcalaStatement.kt │ │ │ │ │ │ └── AcalaTransferRequest.kt │ │ │ │ │ ├── bifrost │ │ │ │ │ │ ├── BifrostApi.kt │ │ │ │ │ │ ├── BifrostReferralCheckRequest.kt │ │ │ │ │ │ └── GetAccountByReferralCodeResponse.kt │ │ │ │ │ ├── karura │ │ │ │ │ │ ├── KaruraApi.kt │ │ │ │ │ │ ├── KaruraStatement.kt │ │ │ │ │ │ ├── ReferralCheck.kt │ │ │ │ │ │ └── VerifyKaruraParticipationRequest.kt │ │ │ │ │ ├── moonbeam │ │ │ │ │ │ ├── MoonbeamApi.kt │ │ │ │ │ │ ├── RemarkStoreRequest.kt │ │ │ │ │ │ ├── RemarkStoreResponse.kt │ │ │ │ │ │ ├── RemarkVerifyRequest.kt │ │ │ │ │ │ ├── RemarkVerifyResponse.kt │ │ │ │ │ │ ├── SignatureRequest.kt │ │ │ │ │ │ ├── SignatureResponse.kt │ │ │ │ │ │ └── VerifyCheckResponse.kt │ │ │ │ │ └── parachain │ │ │ │ │ │ ├── ParachainMetadata.kt │ │ │ │ │ │ ├── ParachainMetadataApi.kt │ │ │ │ │ │ └── ParachainMetadataRemote.kt │ │ │ │ └── blockhain │ │ │ │ │ └── extrinsic │ │ │ │ │ └── ExtrinsicBuilderExt.kt │ │ │ └── repository │ │ │ │ └── CrowdloanRepositoryImpl.kt │ │ │ ├── di │ │ │ ├── CrowdloanFeatureModule.kt │ │ │ ├── CrowdloanUpdatersModule.kt │ │ │ ├── customCrowdloan │ │ │ │ ├── CustomContributeFactory.kt │ │ │ │ ├── CustomContributeManager.kt │ │ │ │ ├── CustomContributeModule.kt │ │ │ │ ├── acala │ │ │ │ │ ├── AcalaContributeFactory.kt │ │ │ │ │ └── AcalaContributionModule.kt │ │ │ │ ├── astar │ │ │ │ │ ├── AstarContributeFactory.kt │ │ │ │ │ └── AstarContributionModule.kt │ │ │ │ ├── bifrost │ │ │ │ │ ├── BifrostContributeFactory.kt │ │ │ │ │ └── BifrostContributionModule.kt │ │ │ │ ├── interlay │ │ │ │ │ ├── InterlayContributeFactory.kt │ │ │ │ │ └── InterlayContributionModule.kt │ │ │ │ ├── karura │ │ │ │ │ ├── KaruraContributeFactory.kt │ │ │ │ │ └── KaruraContributionModule.kt │ │ │ │ └── moonbeam │ │ │ │ │ ├── MoonbeamContributeFactory.kt │ │ │ │ │ └── MoonbeamContributionModule.kt │ │ │ └── validations │ │ │ │ ├── ContributeValidationsModule.kt │ │ │ │ └── CrowdloansValidationsModule.kt │ │ │ ├── domain │ │ │ ├── common │ │ │ │ └── LeaseIndexFromBlock.kt │ │ │ ├── contribute │ │ │ │ ├── CrowdloanContributeInteractor.kt │ │ │ │ ├── MapFundInfoToCrowdloan.kt │ │ │ │ ├── custom │ │ │ │ │ ├── acala │ │ │ │ │ │ └── AcalaContributeInteractor.kt │ │ │ │ │ ├── astar │ │ │ │ │ │ └── AstarContributeInteractor.kt │ │ │ │ │ ├── bifrost │ │ │ │ │ │ └── BifrostContributeInteractor.kt │ │ │ │ │ ├── interlay │ │ │ │ │ │ └── InterlayContributeInteractor.kt │ │ │ │ │ ├── karura │ │ │ │ │ │ └── KaruraContributeInteractor.kt │ │ │ │ │ └── moonbeam │ │ │ │ │ │ └── MoonbeamContributeInteractor.kt │ │ │ │ └── validations │ │ │ │ │ ├── CapExceededValidation.kt │ │ │ │ │ ├── ContributeValidationFailure.kt │ │ │ │ │ ├── ContributeValidationPayload.kt │ │ │ │ │ ├── CrowdloanNotEndedValidation.kt │ │ │ │ │ ├── Definitions.kt │ │ │ │ │ ├── MinContributionValidation.kt │ │ │ │ │ └── PublicCrowdloanValidation.kt │ │ │ └── main │ │ │ │ └── CrowdloanInteractor.kt │ │ │ ├── presentation │ │ │ ├── CrowdloanRouter.kt │ │ │ ├── contribute │ │ │ │ ├── AdditionalOnChainSubmission.kt │ │ │ │ ├── ContributeValidationFailure.kt │ │ │ │ ├── confirm │ │ │ │ │ ├── ConfirmContributeFragment.kt │ │ │ │ │ ├── ConfirmContributeViewModel.kt │ │ │ │ │ ├── model │ │ │ │ │ │ └── LeasePeriodModel.kt │ │ │ │ │ └── parcel │ │ │ │ │ │ └── ConfirmContributePayload.kt │ │ │ │ ├── custom │ │ │ │ │ ├── CustomContribute.kt │ │ │ │ │ ├── CustomContributeFragment.kt │ │ │ │ │ ├── CustomContributeViewModel.kt │ │ │ │ │ ├── acala │ │ │ │ │ │ ├── AcalaBonusPayload.kt │ │ │ │ │ │ ├── AcalaContributeSubmitter.kt │ │ │ │ │ │ ├── AcalaContributeView.kt │ │ │ │ │ │ └── AcalaContributeViewState.kt │ │ │ │ │ ├── astar │ │ │ │ │ │ ├── AstarBonusPayload.kt │ │ │ │ │ │ ├── AstarContributeSubmitter.kt │ │ │ │ │ │ ├── AstarContributeView.kt │ │ │ │ │ │ └── AstarContributeViewState.kt │ │ │ │ │ ├── bifrost │ │ │ │ │ │ ├── BifrostBonusPayload.kt │ │ │ │ │ │ ├── BifrostContributeSubmitter.kt │ │ │ │ │ │ └── BifrostContributeViewState.kt │ │ │ │ │ ├── interlay │ │ │ │ │ │ ├── InterlayBonusPayload.kt │ │ │ │ │ │ ├── InterlayContributeSubmitter.kt │ │ │ │ │ │ ├── InterlayContributeView.kt │ │ │ │ │ │ └── InterlayContributeViewState.kt │ │ │ │ │ ├── karura │ │ │ │ │ │ ├── KaruraBonusPayload.kt │ │ │ │ │ │ ├── KaruraContributeSubmitter.kt │ │ │ │ │ │ └── KaruraContributeViewState.kt │ │ │ │ │ ├── model │ │ │ │ │ │ └── CustomContributePayload.kt │ │ │ │ │ ├── moonbeam │ │ │ │ │ │ ├── MoonbeamBonusPayload.kt │ │ │ │ │ │ ├── MoonbeamContributeSubmitter.kt │ │ │ │ │ │ ├── MoonbeamContributeViewState.kt │ │ │ │ │ │ ├── MoonbeamStep1Terms.kt │ │ │ │ │ │ ├── MoonbeamStep2Registration.kt │ │ │ │ │ │ ├── MoonbeamStep3Signed.kt │ │ │ │ │ │ └── MoonbeamStep4Contribute.kt │ │ │ │ │ └── referral │ │ │ │ │ │ ├── ReferralCodePayload.kt │ │ │ │ │ │ ├── ReferralContributeView.kt │ │ │ │ │ │ └── ReferralContributeViewState.kt │ │ │ │ └── select │ │ │ │ │ ├── CrowdloanContributeFragment.kt │ │ │ │ │ ├── CrowdloanContributeViewModel.kt │ │ │ │ │ ├── model │ │ │ │ │ ├── CrowdloanDetailsModel.kt │ │ │ │ │ └── LearnMoreModel.kt │ │ │ │ │ └── parcel │ │ │ │ │ ├── ContributePayload.kt │ │ │ │ │ └── ParachainMetadataParcelModel.kt │ │ │ └── main │ │ │ │ ├── CrowdloanAdapter.kt │ │ │ │ ├── CrowdloanFragment.kt │ │ │ │ ├── CrowdloanReferralActionsSheet.kt │ │ │ │ ├── CrowdloanViewModel.kt │ │ │ │ └── model │ │ │ │ └── CrowdloanModel.kt │ │ │ └── storage │ │ │ └── CrowdloanStorage.kt │ └── res │ │ └── layout │ │ ├── acala_referral_flow.xml │ │ ├── astar_referral_flow.xml │ │ ├── fragment_contribute.xml │ │ ├── fragment_contribute_confirm.xml │ │ ├── fragment_crowdloans.xml │ │ ├── fragment_custom_contribute.xml │ │ ├── interlay_referral_flow.xml │ │ ├── item_crowdloan.xml │ │ ├── item_crowdloan_group.xml │ │ ├── view_moonbeam_step1.xml │ │ ├── view_moonbeam_step2.xml │ │ ├── view_moonbeam_step3.xml │ │ ├── view_moonbeam_step4.xml │ │ └── view_referral_flow.xml │ └── test │ └── java │ └── jp │ └── co │ └── soramitsu │ └── crowdloan │ └── ExampleUnitTest.kt ├── feature-liquiditypools-api ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── liquiditypools │ ├── blockexplorer │ └── BlockExplorerManager.kt │ ├── data │ ├── DemeterFarmingRepository.kt │ ├── LiquidityData.kt │ ├── PoolDataDto.kt │ └── PoolsRepository.kt │ ├── domain │ ├── DemeterFarmingPool.kt │ ├── interfaces │ │ ├── DemeterFarmingInteractor.kt │ │ └── PoolsInteractor.kt │ └── model │ │ ├── BasicPoolData.kt │ │ └── UserPoolData.kt │ └── navigation │ ├── InternalPoolsRouter.kt │ ├── LiquidityPoolsNavGraphRoute.kt │ ├── LiquidityPoolsRouter.kt │ └── NavAction.kt ├── feature-liquiditypools-impl ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── liquiditypools │ └── impl │ ├── data │ ├── DemeterFarmingRepositoryImpl.kt │ ├── DemeterStorage.kt │ ├── PoolsRepositoryImpl.kt │ └── network │ │ └── Extrinsic.kt │ ├── di │ └── PoolsModule.kt │ ├── domain │ ├── DemeterFarmingInteractorImpl.kt │ └── PoolsInteractorImpl.kt │ ├── navigation │ └── InternalPoolsRouterImpl.kt │ ├── presentation │ ├── CoroutinesStore.kt │ ├── PoolsFlowFragment.kt │ ├── PoolsFlowViewModel.kt │ ├── allpools │ │ ├── AllPoolsPresenter.kt │ │ ├── AllPoolsScreen.kt │ │ └── BasicPoolListItem.kt │ ├── liquidityadd │ │ ├── LiquidityAddPresenter.kt │ │ └── LiquidityAddScreen.kt │ ├── liquidityaddconfirm │ │ ├── LiquidityAddConfirmPresenter.kt │ │ └── LiquidityAddConfirmScreen.kt │ ├── liquidityremove │ │ ├── LiquidityRemovePresenter.kt │ │ └── LiquidityRemoveScreen.kt │ ├── liquidityremoveconfirm │ │ ├── LiquidityRemoveConfirmPresenter.kt │ │ └── LiquidityRemoveConfirmScreen.kt │ ├── pooldetails │ │ ├── PoolDetailsPresenter.kt │ │ └── PoolDetailsScreen.kt │ └── poollist │ │ ├── PoolListPresenter.kt │ │ └── PoolListScreen.kt │ ├── usecase │ ├── ValidateAddLiquidityUseCase.kt │ └── ValidateRemoveLiquidityUseCase.kt │ └── util │ └── PolkaswapFormulas.kt ├── feature-nft-api ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── nft │ ├── data │ ├── NFTRepository.kt │ ├── models │ │ ├── Contract.kt │ │ ├── ContractInfo.kt │ │ ├── TokenId.kt │ │ ├── TokenInfo.kt │ │ └── wrappers │ │ │ └── NFTResponse.kt │ └── pagination │ │ ├── PageBackStack.kt │ │ ├── PagedResponse.kt │ │ └── PaginationRequest.kt │ ├── domain │ ├── NFTInteractor.kt │ ├── NFTTransferInteractor.kt │ └── models │ │ ├── NFT.kt │ │ ├── NFTCollection.kt │ │ └── NFTFilter.kt │ └── navigation │ ├── NFTNavGraphRoute.kt │ └── NFTRouter.kt ├── feature-nft-impl ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── nft │ └── impl │ ├── data │ ├── NFTRepositoryImpl.kt │ ├── domain │ │ ├── PageBackStackImpl.kt │ │ ├── PageCachingDecorator.kt │ │ └── PagingRequestMediator.kt │ ├── model │ │ ├── request │ │ │ └── NFTRequest.kt │ │ └── utils │ │ │ └── DeserializtionExt.kt │ └── remote │ │ └── AlchemyNftApi.kt │ ├── di │ └── NFTModule.kt │ ├── domain │ ├── NFTInteractorImpl.kt │ ├── NFTTransferInteractorImpl.kt │ ├── models │ │ ├── nft │ │ │ ├── CollectionImpl.kt │ │ │ ├── CollectionWithTokensImpl.kt │ │ │ └── NFTImpl.kt │ │ └── transfer │ │ │ ├── EIP1559Call.kt │ │ │ ├── EthCall.kt │ │ │ └── NFTCall.kt │ ├── usecase │ │ ├── collections │ │ │ ├── CollectionsFetchingUseCase.kt │ │ │ └── CollectionsMappingAdapter.kt │ │ ├── eth │ │ │ ├── CreateRawEthTransaction.kt │ │ │ ├── EstimateEthTransactionGas.kt │ │ │ ├── ExecuteEthFunction.kt │ │ │ ├── SendRawEthTransaction.kt │ │ │ └── estimateEthTransactionNetworkFee.kt │ │ ├── tokensbycontract │ │ │ ├── RequestSwitchingMediator.kt │ │ │ ├── TokensFetchingUseCase.kt │ │ │ ├── TokensMappingAdapter.kt │ │ │ └── TokensTrimmingMediator.kt │ │ └── transfer │ │ │ ├── NFTAccountBalanceAdapter.kt │ │ │ ├── NFTTransferAdapter.kt │ │ │ └── ValidateNFTTransferUseCase.kt │ └── utils │ │ ├── NFTExt.kt │ │ └── Web3AdapterExt.kt │ ├── navigation │ ├── InternalNFTRouter.kt │ ├── InternalNFTRouterImpl.kt │ └── NavAction.kt │ └── presentation │ ├── CoroutinesStore.kt │ ├── NFTFlowFragment.kt │ ├── NFTFlowViewModel.kt │ ├── chooserecipient │ ├── ChooseNFTRecipientPresenter.kt │ ├── ChooseNFTRecipientScreen.kt │ └── contract │ │ └── ChooseNFTRecipientContract.kt │ ├── collection │ ├── CollectionNFTsPresenter.kt │ ├── CollectionNFTsScreen.kt │ └── models │ │ ├── NFTsScreenView.kt │ │ └── NFTsScreenViewImpl.kt │ ├── confirmsend │ ├── ConfirmNFTSendPresenter.kt │ ├── ConfirmNFTSendScreen.kt │ └── contract │ │ └── ConfirmNFTSendContract.kt │ └── details │ ├── DetailsScreen.kt │ └── NftDetailsPresenter.kt ├── feature-onboarding-api ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── onboarding │ └── api │ ├── data │ ├── OnboardingFlow.kt │ └── OnboardingRepository.kt │ └── domain │ └── OnboardingInteractor.kt ├── feature-onboarding-impl ├── .gitignore ├── build.gradle └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── jp │ │ │ └── co │ │ │ └── soramitsu │ │ │ └── onboarding │ │ │ └── impl │ │ │ ├── OnboardingRouter.kt │ │ │ ├── data │ │ │ ├── DeserializationExt.kt │ │ │ ├── OnboardingConfigApi.kt │ │ │ └── OnboardingRepositoryImpl.kt │ │ │ ├── di │ │ │ └── OnboardingFeatureModule.kt │ │ │ ├── domain │ │ │ └── OnboardingInteractorImpl.kt │ │ │ └── welcome │ │ │ ├── OnboardingScreen.kt │ │ │ ├── OnboardingSplashScreen.kt │ │ │ ├── PagerIndicator.kt │ │ │ ├── SelectEcosystemScreen.kt │ │ │ ├── WelcomeEvent.kt │ │ │ ├── WelcomeFragment.kt │ │ │ ├── WelcomeFragmentPayload.kt │ │ │ ├── WelcomeScreen.kt │ │ │ ├── WelcomeViewModel.kt │ │ │ └── select_import_mode │ │ │ ├── SelectImportModeContent.kt │ │ │ ├── SelectImportModeDialog.kt │ │ │ └── SelectImportModeViewModel.kt │ └── res │ │ └── layout │ │ ├── fragment_privacy.xml │ │ └── fragment_terms.xml │ └── test │ └── java │ └── jp │ └── co │ └── soramitsu │ └── onboarding │ └── ExampleUnitTest.kt ├── feature-polkaswap-api ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── kotlin │ └── jp │ └── co │ └── soramitsu │ └── polkaswap │ └── api │ ├── data │ └── PolkaswapRepository.kt │ ├── domain │ ├── PathUnavailableException.kt │ ├── PolkaswapInteractor.kt │ └── models │ │ └── SwapDetails.kt │ ├── models │ ├── Market.kt │ └── WithDesired.kt │ └── presentation │ ├── PolkaswapRouter.kt │ └── models │ ├── SwapDetailsParcelModel.kt │ ├── SwapDetailsViewState.kt │ └── TransactionSettingsModel.kt ├── feature-polkaswap-impl ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── kotlin │ └── jp │ └── co │ └── soramitsu │ └── polkaswap │ └── impl │ ├── data │ ├── PolkaswapRepositoryImpl.kt │ └── network │ │ └── blockchain │ │ ├── Extrinsic.kt │ │ └── bindings │ │ └── Polkaswap.kt │ ├── di │ └── PolkaswapFeatureBindModule.kt │ ├── domain │ └── PolkaswapInteractorImpl.kt │ └── presentation │ ├── disclaimer │ ├── PolkaswapDisclaimerFragment.kt │ ├── PolkaswapDisclaimerScreen.kt │ └── PolkaswapDisclaimerViewModel.kt │ ├── select_market │ ├── SelectMarketContent.kt │ ├── SelectMarketFragment.kt │ └── SelectMarketViewModel.kt │ ├── swap_preview │ ├── SwapPreviewContent.kt │ ├── SwapPreviewFragment.kt │ └── SwapPreviewViewModel.kt │ ├── swap_tokens │ ├── SwapTokensContent.kt │ ├── SwapTokensFragment.kt │ └── SwapTokensViewModel.kt │ └── transaction_settings │ ├── TransactionSettingsContent.kt │ ├── TransactionSettingsFragment.kt │ └── TransactionSettingsViewModel.kt ├── feature-soracard-api ├── .gitignore ├── build.gradle └── src │ └── main │ └── kotlin │ └── jp │ └── co │ └── soramitsu │ └── soracard │ └── api │ ├── domain │ ├── SoraCardAvailabilityInfo.kt │ └── SoraCardInteractor.kt │ ├── presentation │ └── SoraCardRouter.kt │ └── util │ ├── SoraCardContractUtil.kt │ └── SoraCardOptions.kt ├── feature-soracard-impl ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── kotlin │ └── jp │ └── co │ └── soramitsu │ └── soracard │ └── impl │ ├── di │ └── SoraCardFeatureBindModule.kt │ ├── domain │ ├── SoraCardClientProxy.kt │ ├── SoraCardInteractorImpl.kt │ └── SoraCardNetworkClient.kt │ └── presentation │ ├── buycrypto │ ├── BuyCryptoFragment.kt │ ├── BuyCryptoScreen.kt │ ├── BuyCryptoState.kt │ └── BuyCryptoViewModel.kt │ ├── details │ ├── SoraCardDetailsFragment.kt │ ├── SoraCardDetailsScreen.kt │ └── SoraCardDetailsViewModel.kt │ └── get │ ├── GetSoraCardFragment.kt │ ├── GetSoraCardScreen.kt │ └── GetSoraCardViewModel.kt ├── feature-splash ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── jp │ │ └── co │ │ └── soramitsu │ │ └── splash │ │ ├── SplashRouter.kt │ │ └── presentation │ │ ├── SplashFragment.kt │ │ └── SplashViewModel.kt │ └── res │ └── layout │ └── fragment_splash.xml ├── feature-staking-api ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── staking │ └── api │ ├── data │ └── StakingSharedState.kt │ ├── di │ ├── Staking.kt │ └── StakingFeatureApi.kt │ └── domain │ ├── api │ ├── AccountIdMap.kt │ ├── IdentityRepository.kt │ └── StakingRepository.kt │ └── model │ ├── AtStake.kt │ ├── BlockNumber.kt │ ├── CandidateInfo.kt │ ├── Collator.kt │ ├── DelegationScheduledRequest.kt │ ├── DelegatorState.kt │ ├── EraIndex.kt │ ├── Exposure.kt │ ├── NominatedValidator.kt │ ├── Nominations.kt │ ├── PoolMember.kt │ ├── RewardDestination.kt │ ├── Round.kt │ ├── SlashingSpans.kt │ ├── StakingAccount.kt │ ├── StakingLedger.kt │ ├── StakingState.kt │ └── Validator.kt ├── feature-staking-impl ├── .gitignore ├── build.gradle └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── jp │ │ │ └── co │ │ │ └── soramitsu │ │ │ └── staking │ │ │ └── impl │ │ │ ├── data │ │ │ ├── mappers │ │ │ │ ├── HistoryConverters.kt │ │ │ │ ├── MapAccountToStakingAccount.kt │ │ │ │ ├── MapRewardDestinationModelToRewardDestination.kt │ │ │ │ └── StakingReward.kt │ │ │ ├── model │ │ │ │ ├── BondedPool.kt │ │ │ │ ├── Payout.kt │ │ │ │ ├── PoolMember.kt │ │ │ │ ├── PoolRewards.kt │ │ │ │ └── PoolUnbonding.kt │ │ │ ├── network │ │ │ │ ├── blockhain │ │ │ │ │ ├── bindings │ │ │ │ │ │ ├── BindAtStakeOfCollator.kt │ │ │ │ │ │ ├── BindBlockNumber.kt │ │ │ │ │ │ ├── BindCandidateInfo.kt │ │ │ │ │ │ ├── BindDelegatorState.kt │ │ │ │ │ │ ├── BindHistoryDepth.kt │ │ │ │ │ │ ├── BindNominations.kt │ │ │ │ │ │ ├── BindRewardDestination.kt │ │ │ │ │ │ ├── BindSlashingSpans.kt │ │ │ │ │ │ ├── BindStaked.kt │ │ │ │ │ │ ├── BindTotalIssuance.kt │ │ │ │ │ │ ├── BindTotalValidatorEraReward.kt │ │ │ │ │ │ ├── Constants.kt │ │ │ │ │ │ ├── Data.kt │ │ │ │ │ │ ├── Era.kt │ │ │ │ │ │ ├── EraRewardPoints.kt │ │ │ │ │ │ ├── Exposure.kt │ │ │ │ │ │ ├── Identity.kt │ │ │ │ │ │ ├── NominationPools.kt │ │ │ │ │ │ ├── StakingLedger.kt │ │ │ │ │ │ ├── StakingMinMaxStorages.kt │ │ │ │ │ │ └── ValidatorPrefs.kt │ │ │ │ │ ├── calls │ │ │ │ │ │ └── ExtrinsicBuilderExt.kt │ │ │ │ │ └── updaters │ │ │ │ │ │ ├── AccountNominationsUpdater.kt │ │ │ │ │ │ ├── AccountRewardDestinationUpdater.kt │ │ │ │ │ │ ├── ActiveEraUpdater.kt │ │ │ │ │ │ ├── Common.kt │ │ │ │ │ │ ├── CounterForNominatorsUpdater.kt │ │ │ │ │ │ ├── CurrentEraUpdater.kt │ │ │ │ │ │ ├── DelegatorStateUpdater.kt │ │ │ │ │ │ ├── HistoryDepthUpdater.kt │ │ │ │ │ │ ├── MaxNominatorsUpdater.kt │ │ │ │ │ │ ├── MinBondUpdater.kt │ │ │ │ │ │ ├── NominatorsUpdater.kt │ │ │ │ │ │ ├── StakingLedgerUpdater.kt │ │ │ │ │ │ ├── TotalIssuanceUpdater.kt │ │ │ │ │ │ ├── ValidatorExposureUpdater.kt │ │ │ │ │ │ ├── ValidatorPrefsUpdater.kt │ │ │ │ │ │ ├── base │ │ │ │ │ │ └── StakingUpdater.kt │ │ │ │ │ │ ├── controller │ │ │ │ │ │ └── AccountControllerBalanceUpdater.kt │ │ │ │ │ │ ├── historical │ │ │ │ │ │ ├── HistoricalTotalValidatorRewardUpdater.kt │ │ │ │ │ │ ├── HistoricalUpdateMediator.kt │ │ │ │ │ │ └── HistoricalValidatorRewardPointsUpdater.kt │ │ │ │ │ │ └── scope │ │ │ │ │ │ └── AccountStakingScope.kt │ │ │ │ └── subquery │ │ │ │ │ ├── StakingApi.kt │ │ │ │ │ ├── SubQueryDelegationHistoryFetcher.kt │ │ │ │ │ ├── SubQueryValidatorSetFetcher.kt │ │ │ │ │ └── request │ │ │ │ │ ├── GiantsquidRewardAmountRequest.kt │ │ │ │ │ ├── ReefStakingRewardsRequest.kt │ │ │ │ │ ├── StakingAllCollatorsApyRequest.kt │ │ │ │ │ ├── StakingCollatorsApyRequest.kt │ │ │ │ │ ├── StakingDelegatorHistoryRequest.kt │ │ │ │ │ ├── StakingEraValidatorInfosRequest.kt │ │ │ │ │ ├── StakingLastRoundIdRequest.kt │ │ │ │ │ ├── StakingSumRewardRequest.kt │ │ │ │ │ ├── SubsquidCollatorsApyRequest.kt │ │ │ │ │ ├── SubsquidDelegatorHistoryRequest.kt │ │ │ │ │ ├── SubsquidEthRewardAmountRequest.kt │ │ │ │ │ └── SubsquidLastRoundIdRequest.kt │ │ │ └── repository │ │ │ │ ├── AccountMapStorageKeys.kt │ │ │ │ ├── IdentityRepositoryImpl.kt │ │ │ │ ├── PayoutRepository.kt │ │ │ │ ├── StakingConstantsRepository.kt │ │ │ │ ├── StakingPoolApi.kt │ │ │ │ ├── StakingPoolDataSource.kt │ │ │ │ ├── StakingRepositoryImpl.kt │ │ │ │ ├── StakingRewardsRepository.kt │ │ │ │ └── datasource │ │ │ │ ├── ParachainStakingStoriesDataSourceImpl.kt │ │ │ │ ├── StakingRewardsDataSource.kt │ │ │ │ ├── StakingStoriesDataSource.kt │ │ │ │ ├── StakingStoriesDataSourceImpl.kt │ │ │ │ └── SubqueryStakingRewardsDataSource.kt │ │ │ ├── di │ │ │ ├── StakingFeatureModule.kt │ │ │ ├── StakingScenarioModule.kt │ │ │ ├── StakingUpdatersModule.kt │ │ │ ├── StakingValidationModule.kt │ │ │ └── validations │ │ │ │ ├── BondMoreValidationsModule.kt │ │ │ │ ├── MakePayoutValidationsModule.kt │ │ │ │ ├── RebondValidationsModule.kt │ │ │ │ ├── RedeemValidationsModule.kt │ │ │ │ ├── RewardDestinationValidationsModule.kt │ │ │ │ ├── SetControllerValidationsModule.kt │ │ │ │ ├── StakingBalanceValidationsModule.kt │ │ │ │ └── UnbondValidationsModule.kt │ │ │ ├── domain │ │ │ ├── EraCalculatorFactory.kt │ │ │ ├── GetIdentitiesUseCase.kt │ │ │ ├── StakingInteractor.kt │ │ │ ├── StakingInteractorExt.kt │ │ │ ├── alerts │ │ │ │ ├── Alert.kt │ │ │ │ └── AlertsInteractor.kt │ │ │ ├── common │ │ │ │ └── IsWaiting.kt │ │ │ ├── error │ │ │ │ └── AccountIdNotFound.kt │ │ │ ├── model │ │ │ │ ├── NetworkInfo.kt │ │ │ │ ├── PendingPayoutsStatistics.kt │ │ │ │ ├── StakeSummary.kt │ │ │ │ ├── StakingReward.kt │ │ │ │ ├── TotalReward.kt │ │ │ │ └── Unbonding.kt │ │ │ ├── payout │ │ │ │ └── PayoutInteractor.kt │ │ │ ├── recommendations │ │ │ │ ├── BlockCreatorRecommendator.kt │ │ │ │ ├── BlockCreatorsRecommendatorFactory.kt │ │ │ │ ├── CollatorRecommendator.kt │ │ │ │ ├── CollatorRecommendatorFactory.kt │ │ │ │ ├── ValidatorRecommendator.kt │ │ │ │ ├── ValidatorRecommendatorFactory.kt │ │ │ │ └── settings │ │ │ │ │ ├── Error.kt │ │ │ │ │ ├── RecommendationSettings.kt │ │ │ │ │ ├── RecommendationSettingsProvider.kt │ │ │ │ │ ├── RecommendationSettingsProviderFactory.kt │ │ │ │ │ ├── SettingsStorage.kt │ │ │ │ │ ├── filters │ │ │ │ │ └── Filters.kt │ │ │ │ │ ├── postprocessors │ │ │ │ │ └── RemoveClusteringPostprocessor.kt │ │ │ │ │ └── sortings │ │ │ │ │ └── BlockProducersSorting.kt │ │ │ ├── rewards │ │ │ │ ├── ManualRewardCalculator.kt │ │ │ │ ├── ReefRewardCalculator.kt │ │ │ │ ├── RewardCalculationTarget.kt │ │ │ │ ├── RewardCalculator.kt │ │ │ │ ├── RewardCalculatorFactory.kt │ │ │ │ ├── SoraRewardCalculator.kt │ │ │ │ ├── SoraStakingRewardsScenario.kt │ │ │ │ ├── SubqueryRewardCalculator.kt │ │ │ │ └── TernoaRewardCalculator.kt │ │ │ ├── setup │ │ │ │ └── SetupStakingInteractor.kt │ │ │ ├── staking │ │ │ │ ├── bond │ │ │ │ │ └── BondMoreInteractor.kt │ │ │ │ ├── controller │ │ │ │ │ └── ControllerInteractor.kt │ │ │ │ ├── rebond │ │ │ │ │ └── RebondInteractor.kt │ │ │ │ ├── redeem │ │ │ │ │ ├── RedeemConsequences.kt │ │ │ │ │ └── RedeemInteractor.kt │ │ │ │ ├── rewardDestination │ │ │ │ │ └── ChangeRewardDestinationInteractor.kt │ │ │ │ └── unbond │ │ │ │ │ └── UnbondInteractor.kt │ │ │ ├── validations │ │ │ │ ├── AccountIsNotControllerValidation.kt │ │ │ │ ├── AccountRequiredValidation.kt │ │ │ │ ├── MaxNominatorsReachedValidation.kt │ │ │ │ ├── NotZeroAmountValidation.kt │ │ │ │ ├── NotZeroBalanceValidation.kt │ │ │ │ ├── UnbondingRequestsLimitValidation.kt │ │ │ │ ├── balance │ │ │ │ │ ├── ManageStakingValidationFailure.kt │ │ │ │ │ ├── ManageStakingValidationPayload.kt │ │ │ │ │ ├── Reused.kt │ │ │ │ │ └── ValidationSystems.kt │ │ │ │ ├── bond │ │ │ │ │ ├── BondMoreValidationFailure.kt │ │ │ │ │ ├── BondMoreValidationPayload.kt │ │ │ │ │ └── Declarations.kt │ │ │ │ ├── controller │ │ │ │ │ ├── Declarations.kt │ │ │ │ │ ├── SetControllerValidationFailure.kt │ │ │ │ │ └── SetControllerValidationPayload.kt │ │ │ │ ├── payout │ │ │ │ │ ├── MakePayoutPayload.kt │ │ │ │ │ ├── PayoutFeeValidation.kt │ │ │ │ │ ├── PayoutValidationFailure.kt │ │ │ │ │ └── ProfitablePayoutValidation.kt │ │ │ │ ├── rebond │ │ │ │ │ ├── Declarations.kt │ │ │ │ │ ├── EnoughToRebondValidation.kt │ │ │ │ │ ├── RebondValidationFailure.kt │ │ │ │ │ └── RebondValidationPayload.kt │ │ │ │ ├── reedeem │ │ │ │ │ ├── Declarations.kt │ │ │ │ │ ├── RedeemValidationFailure.kt │ │ │ │ │ └── RedeemValidationPayload.kt │ │ │ │ ├── rewardDestination │ │ │ │ │ ├── Declarations.kt │ │ │ │ │ ├── RewardDestinationValidationFailure.kt │ │ │ │ │ └── RewardDestinationValidationPayload.kt │ │ │ │ ├── setup │ │ │ │ │ ├── Declarations.kt │ │ │ │ │ ├── MinimumAmountValidation.kt │ │ │ │ │ ├── SetupStakingPayload.kt │ │ │ │ │ └── SetupStakingValidationFailure.kt │ │ │ │ ├── unbond │ │ │ │ │ ├── ControllerCanPayFeeValidation.kt │ │ │ │ │ ├── CrossExistentialValidation.kt │ │ │ │ │ ├── Declarations.kt │ │ │ │ │ ├── EnoughToUnbondValidation.kt │ │ │ │ │ ├── UnbondValidationFailure.kt │ │ │ │ │ └── UnbondValidationPayload.kt │ │ │ │ └── welcome │ │ │ │ │ ├── Declarations.kt │ │ │ │ │ ├── WelcomeStakingValidationFailure.kt │ │ │ │ │ └── WelcomeStakingValidationPayload.kt │ │ │ └── validators │ │ │ │ ├── CollatorProvider.kt │ │ │ │ ├── ValidatorProvider.kt │ │ │ │ └── current │ │ │ │ ├── CurrentValidatorsInteractor.kt │ │ │ │ └── search │ │ │ │ └── SearchCustomBlockProducerInteractor.kt │ │ │ ├── presentation │ │ │ ├── StakingConfirmViewModel.kt │ │ │ ├── StakingRouter.kt │ │ │ ├── collators │ │ │ │ └── change │ │ │ │ │ └── custom │ │ │ │ │ └── select │ │ │ │ │ ├── SelectCustomCollatorsFragment.kt │ │ │ │ │ └── SelectCustomCollatorsViewModel.kt │ │ │ ├── common │ │ │ │ ├── SetupStakingSharedState.kt │ │ │ │ ├── StakingAssetSelector.kt │ │ │ │ ├── StakingPoolSharedState.kt │ │ │ │ ├── StakingPoolSharedStateProvider.kt │ │ │ │ ├── filters │ │ │ │ │ ├── ValidatorsSettingsFragment.kt │ │ │ │ │ ├── ValidatorsSettingsScreen.kt │ │ │ │ │ └── ValidatorsSettingsViewModel.kt │ │ │ │ ├── rewardDestination │ │ │ │ │ ├── ObserveRewardDestinationChooser.kt │ │ │ │ │ ├── RewardDestinationEstimations.kt │ │ │ │ │ ├── RewardDestinationMixin.kt │ │ │ │ │ ├── RewardDestinationModel.kt │ │ │ │ │ └── RewardDestinationProvider.kt │ │ │ │ └── validation │ │ │ │ │ └── StakingValidationFailure.kt │ │ │ ├── confirm │ │ │ │ ├── ConfirmStakingFragment.kt │ │ │ │ ├── ConfirmStakingViewModel.kt │ │ │ │ ├── nominations │ │ │ │ │ ├── ConfirmNominationsFragment.kt │ │ │ │ │ └── ConfirmNominationsViewModel.kt │ │ │ │ └── pool │ │ │ │ │ ├── create │ │ │ │ │ ├── ConfirmCreatePoolFragment.kt │ │ │ │ │ └── ConfirmCreatePoolViewModel.kt │ │ │ │ │ └── join │ │ │ │ │ ├── ConfirmJoinPoolFragment.kt │ │ │ │ │ ├── ConfirmJoinPoolScreen.kt │ │ │ │ │ └── ConfirmJoinPoolViewModel.kt │ │ │ ├── mappers │ │ │ │ ├── Collator.kt │ │ │ │ ├── Identity.kt │ │ │ │ ├── MapNominatorToNominatorParcelModel.kt │ │ │ │ ├── Reward.kt │ │ │ │ └── Validator.kt │ │ │ ├── payouts │ │ │ │ ├── confirm │ │ │ │ │ ├── ConfirmPayoutFragment.kt │ │ │ │ │ ├── ConfirmPayoutViewModel.kt │ │ │ │ │ └── model │ │ │ │ │ │ └── ConfirmPayoutPayload.kt │ │ │ │ ├── detail │ │ │ │ │ ├── PayoutDetailsFragment.kt │ │ │ │ │ ├── PayoutDetailsModel.kt │ │ │ │ │ └── PayoutDetailsViewModel.kt │ │ │ │ ├── list │ │ │ │ │ ├── PayoutAdapter.kt │ │ │ │ │ ├── PayoutsListFragment.kt │ │ │ │ │ ├── PayoutsListViewModel.kt │ │ │ │ │ └── model │ │ │ │ │ │ └── PendingPayoutModel.kt │ │ │ │ └── model │ │ │ │ │ └── PendingPayoutParcelable.kt │ │ │ ├── pools │ │ │ │ ├── PoolInfoFragment.kt │ │ │ │ ├── PoolInfoOptionsFragment.kt │ │ │ │ ├── PoolInfoOptionsViewModel.kt │ │ │ │ ├── PoolInfoViewModel.kt │ │ │ │ ├── SelectPoolFragment.kt │ │ │ │ ├── SelectPoolViewModel.kt │ │ │ │ ├── compose │ │ │ │ │ ├── PoolInfoOptionsScreen.kt │ │ │ │ │ ├── PoolInfoScreen.kt │ │ │ │ │ ├── SelectPoolScreen.kt │ │ │ │ │ └── SelectableListItem.kt │ │ │ │ └── edit │ │ │ │ │ ├── EditPoolConfirmFragment.kt │ │ │ │ │ ├── EditPoolConfirmViewModel.kt │ │ │ │ │ ├── EditPoolFragment.kt │ │ │ │ │ ├── EditPoolScreen.kt │ │ │ │ │ └── EditPoolViewModel.kt │ │ │ ├── setup │ │ │ │ ├── SetupStakingFragment.kt │ │ │ │ ├── SetupStakingViewModel.kt │ │ │ │ └── pool │ │ │ │ │ ├── StartStakingPoolFragment.kt │ │ │ │ │ ├── StartStakingPoolScreen.kt │ │ │ │ │ ├── StartStakingPoolViewModel.kt │ │ │ │ │ ├── create │ │ │ │ │ ├── CreatePoolSetupFragment.kt │ │ │ │ │ ├── CreatePoolSetupScreen.kt │ │ │ │ │ └── CreatePoolSetupViewModel.kt │ │ │ │ │ └── join │ │ │ │ │ ├── SetupStakingPoolFragment.kt │ │ │ │ │ ├── SetupStakingPoolViewModel.kt │ │ │ │ │ └── SetupStakingScreen.kt │ │ │ ├── staking │ │ │ │ ├── alerts │ │ │ │ │ ├── AlertsAdapter.kt │ │ │ │ │ └── model │ │ │ │ │ │ └── AlertModel.kt │ │ │ │ ├── balance │ │ │ │ │ ├── ManagePoolStakeFragment.kt │ │ │ │ │ ├── ManagePoolStakeViewModel.kt │ │ │ │ │ ├── ManageStakingActionValidationFailure.kt │ │ │ │ │ ├── StakingBalanceFragment.kt │ │ │ │ │ ├── StakingBalanceViewModel.kt │ │ │ │ │ ├── UnbondingsAdapter.kt │ │ │ │ │ ├── compose │ │ │ │ │ │ └── ManagePoolStakeScreen.kt │ │ │ │ │ ├── model │ │ │ │ │ │ ├── StakingBalanceModel.kt │ │ │ │ │ │ └── UnbondingModel.kt │ │ │ │ │ ├── rebond │ │ │ │ │ │ ├── ChooseRebondKindBottomSheet.kt │ │ │ │ │ │ └── RebondKind.kt │ │ │ │ │ └── view │ │ │ │ │ │ ├── StakingBalanceActions.kt │ │ │ │ │ │ ├── StakingBalanceItemView.kt │ │ │ │ │ │ ├── StakingBalanceView.kt │ │ │ │ │ │ └── UnbondingsView.kt │ │ │ │ ├── bond │ │ │ │ │ ├── BondMoreValidationFailure.kt │ │ │ │ │ ├── confirm │ │ │ │ │ │ ├── ConfirmBondMoreFragment.kt │ │ │ │ │ │ ├── ConfirmBondMorePayload.kt │ │ │ │ │ │ ├── ConfirmBondMoreViewModel.kt │ │ │ │ │ │ ├── ConfirmPoolBondMoreFragment.kt │ │ │ │ │ │ └── ConfirmPoolBondMoreViewModel.kt │ │ │ │ │ └── select │ │ │ │ │ │ ├── PoolBondMoreFragment.kt │ │ │ │ │ │ ├── PoolBondMoreViewModel.kt │ │ │ │ │ │ ├── SelectBondMoreFragment.kt │ │ │ │ │ │ ├── SelectBondMorePayload.kt │ │ │ │ │ │ └── SelectBondMoreViewModel.kt │ │ │ │ ├── claim │ │ │ │ │ ├── ConfirmPoolClaimFragment.kt │ │ │ │ │ ├── ConfirmPoolClaimViewModel.kt │ │ │ │ │ ├── PoolClaimFragment.kt │ │ │ │ │ └── PoolClaimViewModel.kt │ │ │ │ ├── controller │ │ │ │ │ ├── confirm │ │ │ │ │ │ ├── ConfirmSetControllerFragment.kt │ │ │ │ │ │ ├── ConfirmSetControllerPayload.kt │ │ │ │ │ │ └── ConfirmSetControllerViewModel.kt │ │ │ │ │ └── set │ │ │ │ │ │ ├── BondSetControllerValidationFailure.kt │ │ │ │ │ │ ├── SetControllerFragment.kt │ │ │ │ │ │ └── SetControllerViewModel.kt │ │ │ │ ├── main │ │ │ │ │ ├── ManageStakingBottomSheet.kt │ │ │ │ │ ├── StakingAssetSelectorBottomSheet.kt │ │ │ │ │ ├── StakingFragment.kt │ │ │ │ │ ├── StakingRewardEstimationBottomSheet.kt │ │ │ │ │ ├── StakingStoriesAdapter.kt │ │ │ │ │ ├── StakingViewModel.kt │ │ │ │ │ ├── StakingViewStateOld.kt │ │ │ │ │ ├── WelcomeStakingValidationFailure.kt │ │ │ │ │ ├── compose │ │ │ │ │ │ ├── EstimatedEarnings.kt │ │ │ │ │ │ ├── StakeInfoViewState.kt │ │ │ │ │ │ ├── StakeStatus.kt │ │ │ │ │ │ ├── StakingAssetInfo.kt │ │ │ │ │ │ ├── StakingAssetInfoViewState.kt │ │ │ │ │ │ └── StakingInfoItem.kt │ │ │ │ │ ├── di │ │ │ │ │ │ ├── StakingModule.kt │ │ │ │ │ │ └── StakingViewStateFactory.kt │ │ │ │ │ ├── model │ │ │ │ │ │ ├── RewardEstimation.kt │ │ │ │ │ │ └── StakingNetworkInfoModel.kt │ │ │ │ │ ├── scenarios │ │ │ │ │ │ ├── StakingParachainScenarioViewModel.kt │ │ │ │ │ │ ├── StakingPoolViewModel.kt │ │ │ │ │ │ ├── StakingRelaychainScenarioViewModel.kt │ │ │ │ │ │ ├── StakingScenario.kt │ │ │ │ │ │ ├── StakingScenarioRepository.kt │ │ │ │ │ │ └── StakingScenarioViewModel.kt │ │ │ │ │ └── view │ │ │ │ │ │ ├── EstimateEarningView.kt │ │ │ │ │ │ ├── NetworkInfoView.kt │ │ │ │ │ │ ├── ParachainNetworkInfoView.kt │ │ │ │ │ │ ├── RelayChainNetworkInfoView.kt │ │ │ │ │ │ └── StakingInfoView.kt │ │ │ │ ├── rebond │ │ │ │ │ ├── RebondValidationFailure.kt │ │ │ │ │ ├── confirm │ │ │ │ │ │ ├── ConfirmRebondFragment.kt │ │ │ │ │ │ ├── ConfirmRebondPayload.kt │ │ │ │ │ │ └── ConfirmRebondViewModel.kt │ │ │ │ │ └── custom │ │ │ │ │ │ ├── CustomRebondFragment.kt │ │ │ │ │ │ └── CustomRebondViewModel.kt │ │ │ │ ├── redeem │ │ │ │ │ ├── ConfirmPoolRedeemFragment.kt │ │ │ │ │ ├── ConfirmPoolRedeemViewModel.kt │ │ │ │ │ ├── PoolRedeemFragment.kt │ │ │ │ │ ├── PoolRedeemViewModel.kt │ │ │ │ │ ├── RedeemFragment.kt │ │ │ │ │ ├── RedeemPayload.kt │ │ │ │ │ ├── RedeemValidationFailure.kt │ │ │ │ │ └── RedeemViewModel.kt │ │ │ │ ├── rewardDestination │ │ │ │ │ ├── confirm │ │ │ │ │ │ ├── ConfirmRewardDestinationFragment.kt │ │ │ │ │ │ ├── ConfirmRewardDestinationViewModel.kt │ │ │ │ │ │ └── parcel │ │ │ │ │ │ │ ├── ConfirmRewardDestinationPayload.kt │ │ │ │ │ │ │ └── RewardDestinationParcelModel.kt │ │ │ │ │ └── select │ │ │ │ │ │ ├── RewardDestinationValidationFailure.kt │ │ │ │ │ │ ├── SelectRewardDestinationFragment.kt │ │ │ │ │ │ └── SelectRewardDestinationViewModel.kt │ │ │ │ └── unbond │ │ │ │ │ ├── PoolFullUnstakeDepositorAlertFragment.kt │ │ │ │ │ ├── PoolUnstakeFragment.kt │ │ │ │ │ ├── PoolUnstakeViewModel.kt │ │ │ │ │ ├── ValidationFailure.kt │ │ │ │ │ ├── confirm │ │ │ │ │ ├── ConfirmPoolUnbondFragment.kt │ │ │ │ │ ├── ConfirmPoolUnbondViewModel.kt │ │ │ │ │ ├── ConfirmUnbondFragment.kt │ │ │ │ │ ├── ConfirmUnbondPayload.kt │ │ │ │ │ └── ConfirmUnbondViewModel.kt │ │ │ │ │ └── select │ │ │ │ │ ├── SelectUnbondFragment.kt │ │ │ │ │ ├── SelectUnbondPayload.kt │ │ │ │ │ └── SelectUnbondViewModel.kt │ │ │ ├── validators │ │ │ │ ├── CollatorsAdapter.kt │ │ │ │ ├── FindSelectedValidator.kt │ │ │ │ ├── ValidarosMapper.kt │ │ │ │ ├── ValidatorsAdapter.kt │ │ │ │ ├── change │ │ │ │ │ ├── CollatorModel.kt │ │ │ │ │ ├── StateTransitions.kt │ │ │ │ │ ├── ValidatorModel.kt │ │ │ │ │ ├── custom │ │ │ │ │ │ ├── review │ │ │ │ │ │ │ ├── ReviewCustomValidatorsFragment.kt │ │ │ │ │ │ │ ├── ReviewCustomValidatorsViewModel.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ └── ValidatorsSelectionState.kt │ │ │ │ │ │ ├── search │ │ │ │ │ │ │ ├── CustomBlockProducersAdapter.kt │ │ │ │ │ │ │ ├── SearchBlockProducerModel.kt │ │ │ │ │ │ │ ├── SearchCustomValidatorsFragment.kt │ │ │ │ │ │ │ └── SearchCustomValidatorsViewModel.kt │ │ │ │ │ │ ├── select │ │ │ │ │ │ │ ├── SelectCustomValidatorsFragment.kt │ │ │ │ │ │ │ ├── SelectCustomValidatorsViewModel.kt │ │ │ │ │ │ │ ├── compose │ │ │ │ │ │ │ │ ├── SelectCustomValidatorsFragment.kt │ │ │ │ │ │ │ │ └── SelectCustomValidatorsViewModel.kt │ │ │ │ │ │ │ └── model │ │ │ │ │ │ │ │ └── ContinueButtonState.kt │ │ │ │ │ │ └── settings │ │ │ │ │ │ │ ├── CustomValidatorsSettingsFragment.kt │ │ │ │ │ │ │ ├── CustomValidatorsSettingsViewModel.kt │ │ │ │ │ │ │ ├── SettingsFiltersAdapter.kt │ │ │ │ │ │ │ ├── SettingsSchema.kt │ │ │ │ │ │ │ └── SettingsSortingAdapter.kt │ │ │ │ │ ├── recommended │ │ │ │ │ │ ├── RecommendedCollatorsFragment.kt │ │ │ │ │ │ ├── RecommendedCollatorsViewModel.kt │ │ │ │ │ │ ├── RecommendedValidatorsFragment.kt │ │ │ │ │ │ └── RecommendedValidatorsViewModel.kt │ │ │ │ │ └── start │ │ │ │ │ │ ├── StartChangeCollatorsFragment.kt │ │ │ │ │ │ ├── StartChangeCollatorsViewModel.kt │ │ │ │ │ │ ├── StartChangeValidatorsFragment.kt │ │ │ │ │ │ └── StartChangeValidatorsViewModel.kt │ │ │ │ ├── compose │ │ │ │ │ ├── ConfirmSelectValidatorsFragment.kt │ │ │ │ │ ├── ConfirmSelectValidatorsViewModel.kt │ │ │ │ │ ├── SelectValidatorsFragment.kt │ │ │ │ │ ├── SelectValidatorsScreen.kt │ │ │ │ │ ├── SelectValidatorsViewModel.kt │ │ │ │ │ ├── SelectedValidatorsFragment.kt │ │ │ │ │ ├── SelectedValidatorsScreen.kt │ │ │ │ │ ├── SelectedValidatorsViewModel.kt │ │ │ │ │ ├── StartSelectValidatorsFragment.kt │ │ │ │ │ ├── StartSelectValidatorsScreen.kt │ │ │ │ │ └── StartSelectValidatorsViewModel.kt │ │ │ │ ├── current │ │ │ │ │ ├── CurrentValidatorsAdapter.kt │ │ │ │ │ ├── CurrentValidatorsFragment.kt │ │ │ │ │ ├── CurrentValidatorsViewModel.kt │ │ │ │ │ └── model │ │ │ │ │ │ └── NominatedValidatorStatusModel.kt │ │ │ │ ├── details │ │ │ │ │ ├── CollatorDetailsFragment.kt │ │ │ │ │ ├── CollatorDetailsViewModel.kt │ │ │ │ │ ├── ValidatorDetailsFragment.kt │ │ │ │ │ ├── ValidatorDetailsViewModel.kt │ │ │ │ │ ├── ValidatorStakeBottomSheet.kt │ │ │ │ │ ├── di │ │ │ │ │ │ └── ValidatorDetailsModule.kt │ │ │ │ │ ├── model │ │ │ │ │ │ ├── IdentityModel.kt │ │ │ │ │ │ ├── NominatorModel.kt │ │ │ │ │ │ ├── ValidatorDetailsModel.kt │ │ │ │ │ │ └── ValidatorStakeModel.kt │ │ │ │ │ └── view │ │ │ │ │ │ ├── CollatorInfoView.kt │ │ │ │ │ │ ├── ValidatorIdentityView.kt │ │ │ │ │ │ ├── ValidatorInfoBlockView.kt │ │ │ │ │ │ ├── ValidatorInfoItemView.kt │ │ │ │ │ │ └── ValidatorInfoView.kt │ │ │ │ └── parcel │ │ │ │ │ ├── IdentityParcelModel.kt │ │ │ │ │ ├── NominatorParcelModel.kt │ │ │ │ │ ├── ValidatorDetailsParcelModel.kt │ │ │ │ │ ├── ValidatorPrefsParcelModel.kt │ │ │ │ │ └── ValidatorStakeParcelModel.kt │ │ │ └── view │ │ │ │ ├── AlertsView.kt │ │ │ │ ├── DelegationOptionsBottomSheet.kt │ │ │ │ ├── DelegationRecyclerViewAdapter.kt │ │ │ │ ├── PayoutViewerView.kt │ │ │ │ ├── RewardDestinationChooserView.kt │ │ │ │ ├── RewardDestinationView.kt │ │ │ │ ├── RewardDestinationViewer.kt │ │ │ │ └── StakeSummaryView.kt │ │ │ └── scenarios │ │ │ ├── BlockProducer.kt │ │ │ ├── StakingPoolInteractor.kt │ │ │ ├── StakingScenarioInteractor.kt │ │ │ ├── parachain │ │ │ ├── StakingParachainScenarioInteractor.kt │ │ │ └── StakingParachainScenarioRepository.kt │ │ │ └── relaychain │ │ │ ├── StakingRelayChainScenarioInteractor.kt │ │ │ └── StakingRelayChainScenarioRepository.kt │ └── res │ │ ├── drawable │ │ ├── bg_grey_border_rounded.xml │ │ ├── bg_grey_solid_rounded.xml │ │ ├── ic_basic_filterlist_24.xml │ │ └── ic_validator_not_elected.xml │ │ ├── layout │ │ ├── fragment_bond_more.xml │ │ ├── fragment_collator_details.xml │ │ ├── fragment_confirm_bond_more.xml │ │ ├── fragment_confirm_nominations.xml │ │ ├── fragment_confirm_payout.xml │ │ ├── fragment_confirm_rebond.xml │ │ ├── fragment_confirm_reward_destination.xml │ │ ├── fragment_confirm_set_controller.xml │ │ ├── fragment_confirm_stake.xml │ │ ├── fragment_confirm_unbond.xml │ │ ├── fragment_current_validators.xml │ │ ├── fragment_custom_validators_settings.xml │ │ ├── fragment_payout_details.xml │ │ ├── fragment_payouts_list.xml │ │ ├── fragment_rebond_custom.xml │ │ ├── fragment_recommended_validators.xml │ │ ├── fragment_redeem.xml │ │ ├── fragment_review_custom_validators.xml │ │ ├── fragment_search_custom_validators.xml │ │ ├── fragment_select_custom_validators.xml │ │ ├── fragment_select_reward_destination.xml │ │ ├── fragment_select_unbond.xml │ │ ├── fragment_set_controller_account.xml │ │ ├── fragment_setup_staking.xml │ │ ├── fragment_staking.xml │ │ ├── fragment_staking_balance.xml │ │ ├── fragment_start_change_collators.xml │ │ ├── fragment_start_change_validators.xml │ │ ├── fragment_validator_details.xml │ │ ├── item_alert.xml │ │ ├── item_algorithm_criteria.xml │ │ ├── item_block_producer_search.xml │ │ ├── item_collator_delegation.xml │ │ ├── item_current_validator.xml │ │ ├── item_current_validator_group.xml │ │ ├── item_list_default.xml │ │ ├── item_settings_filter.xml │ │ ├── item_settings_sorting.xml │ │ ├── item_sheet_staking_action.xml │ │ ├── item_sheet_staking_reward_estimation.xml │ │ ├── item_staking_story.xml │ │ ├── item_validator.xml │ │ ├── view_alerts.xml │ │ ├── view_collator_info.xml │ │ ├── view_estimate_earning.xml │ │ ├── view_network_info.xml │ │ ├── view_parachain_network_info.xml │ │ ├── view_payout_target.xml │ │ ├── view_payout_viewer.xml │ │ ├── view_reward_destination_chooser.xml │ │ ├── view_reward_destination_viewer.xml │ │ ├── view_stake_summary.xml │ │ ├── view_staking_balance.xml │ │ ├── view_staking_balance_actions.xml │ │ ├── view_staking_balance_item.xml │ │ ├── view_staking_balance_layout.xml │ │ ├── view_staking_info.xml │ │ ├── view_unbondings.xml │ │ ├── view_validator_identity.xml │ │ ├── view_validator_info.xml │ │ ├── view_validator_info_block.xml │ │ ├── view_validator_info_empty_state.xml │ │ └── view_validator_info_item.xml │ │ └── values │ │ └── attrs.xml │ └── test │ └── java │ └── jp │ └── co │ └── soramitsu │ └── staking │ └── impl │ ├── data │ └── StakingSharedStateTest.kt │ └── domain │ └── StakingInteractorExtKtTest.kt ├── feature-success-api ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── kotlin │ └── jp │ └── co │ └── soramitsu │ └── success │ └── presentation │ └── SuccessRouter.kt ├── feature-success-impl ├── .gitignore ├── build.gradle.kts └── src │ └── main │ └── kotlin │ └── jp │ └── co │ └── soramitsu │ └── success │ └── presentation │ ├── SuccessContent.kt │ ├── SuccessFragment.kt │ └── SuccessViewModel.kt ├── feature-tonconnect-api ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── tonconnect │ └── api │ ├── domain │ ├── TonConnectInteractor.kt │ ├── TonConnectRepository.kt │ └── TonConnectRouter.kt │ └── model │ ├── AppEntity.kt │ ├── Base64.kt │ ├── BridgeEvent.kt │ ├── ConnectRequest.kt │ ├── DappConfig.kt │ ├── JSONArray.kt │ ├── JSONObject.kt │ ├── JsonBuilder.kt │ ├── Number.kt │ ├── OkHttpClient.kt │ ├── PackageInfo.kt │ ├── SSEvent.kt │ ├── Security.kt │ ├── TONProof.kt │ ├── TlbObject.kt │ ├── TonConnectException.kt │ ├── TonConnectRawMessage.kt │ ├── TonConnectSignRequest.kt │ └── TonDappConnection.kt ├── feature-tonconnect-impl ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── tonconnect │ └── impl │ ├── data │ └── TonConnectRepositoryImpl.kt │ ├── di │ └── TonConnectModule.kt │ ├── domain │ └── TonConnectInteractorImpl.kt │ └── presentation │ ├── connectioninfo │ ├── TonConnectionInfoContent.kt │ ├── TonConnectionInfoFragment.kt │ └── TonConnectionInfoViewModel.kt │ ├── connections │ ├── TonConnectionsContent.kt │ ├── TonConnectionsFragment.kt │ └── TonConnectionsViewModel.kt │ ├── dappscreen │ ├── BridgeMessage.kt │ ├── BridgeWebView.kt │ ├── Cell.kt │ ├── DAppBridge.kt │ ├── DappScreenFragment.kt │ ├── DappScreenViewModel.kt │ ├── FunctionInvokeBridgeMessage.kt │ ├── FunctionResponseBridgeMessage.kt │ ├── JsBridge.kt │ └── WebViewFixed.kt │ ├── discoverdapp │ ├── BannerDApp.kt │ ├── DappListType.kt │ ├── DiscoverDappFragment.kt │ ├── DiscoverDappScreen.kt │ ├── DiscoverDappState.kt │ ├── DiscoverDappViewModel.kt │ └── SeeAllDappsScreen.kt │ ├── tonconnectiondetails │ ├── TonConnectionDetailsContent.kt │ ├── TonConnectionDetailsFragment.kt │ └── TonConnectionDetailsViewModel.kt │ └── tonsignrequest │ ├── TonSignPreviewContent.kt │ ├── TonSignRequestContent.kt │ ├── TonSignRequestFragment.kt │ └── TonSignRequestViewModel.kt ├── feature-wallet-api ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── jp │ │ └── co │ │ └── soramitsu │ │ └── wallet │ │ ├── api │ │ ├── data │ │ │ ├── BalanceLoader.kt │ │ │ ├── cache │ │ │ │ ├── AssetCache.kt │ │ │ │ └── AssetCacheExt.kt │ │ │ └── mappers │ │ │ │ ├── MapAssetToAssetModel.kt │ │ │ │ └── MapFeeToFeeModel.kt │ │ ├── di │ │ │ ├── Wallet.kt │ │ │ └── WalletFeatureApi.kt │ │ ├── domain │ │ │ ├── AssetUseCase.kt │ │ │ ├── ExistentialDepositUseCase.kt │ │ │ ├── ValidateTransferUseCase.kt │ │ │ └── model │ │ │ │ └── XcmChainType.kt │ │ └── presentation │ │ │ ├── BaseConfirmViewModel.kt │ │ │ ├── BaseEnterAmountViewModel.kt │ │ │ ├── WalletRouter.kt │ │ │ ├── formatters │ │ │ └── Formatters.kt │ │ │ ├── mixin │ │ │ ├── TransferValidityChecks.kt │ │ │ ├── assetSelector │ │ │ │ ├── AssetSelectorFactory.kt │ │ │ │ ├── AssetSelectorMixin.kt │ │ │ │ └── AssetSelectorUi.kt │ │ │ └── fee │ │ │ │ ├── FeeLoaderMixin.kt │ │ │ │ ├── FeeLoaderProvider.kt │ │ │ │ └── FeeUI.kt │ │ │ ├── model │ │ │ ├── AmountModel.kt │ │ │ ├── AssetModel.kt │ │ │ └── FeeModel.kt │ │ │ └── view │ │ │ ├── AssetSelectorBottomSheet.kt │ │ │ ├── AssetSelectorView.kt │ │ │ └── FeeView.kt │ │ └── impl │ │ ├── domain │ │ ├── CurrentAccountAddressUseCase.kt │ │ ├── TokenUseCase.kt │ │ ├── implementations │ │ │ ├── AssetUseCaseImpl.kt │ │ │ ├── ExistentialDepositUseCaseImpl.kt │ │ │ └── TokenUseCaseImpl.kt │ │ ├── interfaces │ │ │ ├── AddressBookRepository.kt │ │ │ ├── QuickInputsUseCase.kt │ │ │ ├── TokenRepository.kt │ │ │ ├── TransactionFilter.kt │ │ │ ├── WalletConstants.kt │ │ │ ├── WalletInteractor.kt │ │ │ └── WalletRepository.kt │ │ ├── model │ │ │ ├── Asset.kt │ │ │ ├── AssetWithStatus.kt │ │ │ ├── BuyTokenRegistry.kt │ │ │ ├── ControllerDeprecationWarning.kt │ │ │ ├── CrossChainTransfer.kt │ │ │ ├── Fee.kt │ │ │ ├── Operation.kt │ │ │ ├── OperationsPageChange.kt │ │ │ ├── PhishingModel.kt │ │ │ ├── QrContentCBDC.kt │ │ │ ├── QrContentSora.kt │ │ │ ├── RecipientSearchResult.kt │ │ │ ├── Token.kt │ │ │ ├── Transfer.kt │ │ │ ├── TransferValidityLevel.kt │ │ │ └── WalletAccount.kt │ │ └── validation │ │ │ ├── EnoughToPayFeesValidation.kt │ │ │ ├── ExistentialDepositValidation.kt │ │ │ └── Producers.kt │ │ └── presentation │ │ └── model │ │ └── ControllerDeprecationWarningModel.kt │ └── res │ ├── layout │ ├── item_asset_selector.xml │ └── view_asset_selector.xml │ └── values │ └── attrs.xml ├── feature-wallet-impl ├── .gitignore ├── build.gradle ├── libs │ └── pushpayment-core-sdk-2.0.6.jar └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── jp │ │ │ └── co │ │ │ └── soramitsu │ │ │ └── wallet │ │ │ └── impl │ │ │ ├── data │ │ │ ├── buyToken │ │ │ │ ├── CoinbaseProvider.kt │ │ │ │ ├── ExternalProvider.kt │ │ │ │ ├── MoonPayProvider.kt │ │ │ │ └── RampProvider.kt │ │ │ ├── historySource │ │ │ │ ├── AtletaHistorySource.kt │ │ │ │ ├── BlockscoutHistorySource.kt │ │ │ │ ├── EtherscanHistorySource.kt │ │ │ │ ├── FireHistorySource.kt │ │ │ │ ├── GiantsquidHistorySource.kt │ │ │ │ ├── HistorySource.kt │ │ │ │ ├── HistorySourceProvider.kt │ │ │ │ ├── KlaytnHistorySource.kt │ │ │ │ ├── OkLinkHistorySource.kt │ │ │ │ ├── ReefHistorySource.kt │ │ │ │ ├── SoraHistorySource.kt │ │ │ │ ├── SubqueryHistorySource.kt │ │ │ │ ├── SubsquidHistorySource.kt │ │ │ │ ├── TonHistorySource.kt │ │ │ │ ├── VicscanHistorySource.kt │ │ │ │ └── ZchainsHistorySource.kt │ │ │ ├── mappers │ │ │ │ ├── AssetMappers.kt │ │ │ │ └── OperationMappers.kt │ │ │ ├── network │ │ │ │ ├── blockchain │ │ │ │ │ ├── EthereumRemoteSource.kt │ │ │ │ │ ├── EthereumTransactionBuilder.kt │ │ │ │ │ ├── SubstrateRemoteSource.kt │ │ │ │ │ ├── WssSubstrateSource.kt │ │ │ │ │ ├── balance │ │ │ │ │ │ ├── BalanceLoaderProvider.kt │ │ │ │ │ │ ├── EquilibriumBalanceLoader.kt │ │ │ │ │ │ ├── EthereumBalanceLoader.kt │ │ │ │ │ │ ├── SubstrateBalanceLoader.kt │ │ │ │ │ │ └── TonBalanceLoader.kt │ │ │ │ │ ├── bindings │ │ │ │ │ │ └── TransferExtrinsic.kt │ │ │ │ │ ├── extrinsic │ │ │ │ │ │ └── ExtrinsicBuilderExt.kt │ │ │ │ │ └── updaters │ │ │ │ │ │ ├── BalanceUpdateTrigger.kt │ │ │ │ │ │ ├── BalancesUpdateSystem.kt │ │ │ │ │ │ └── PaymentUpdater.kt │ │ │ │ ├── model │ │ │ │ │ ├── EvmTransfer.kt │ │ │ │ │ ├── request │ │ │ │ │ │ ├── GiantsquidHistoryRequest.kt │ │ │ │ │ │ ├── ReefHistoryRequest.kt │ │ │ │ │ │ ├── SubqueryExpressions.kt │ │ │ │ │ │ ├── SubqueryHistoryRequest.kt │ │ │ │ │ │ └── SubsquidHistoryRequest.kt │ │ │ │ │ └── response │ │ │ │ │ │ ├── AtletaHistoryResponse.kt │ │ │ │ │ │ ├── EtherscanHistoryResponse.kt │ │ │ │ │ │ ├── FireHistoryResponse.kt │ │ │ │ │ │ ├── GiantsquidHistoryResponse.kt │ │ │ │ │ │ ├── KlaytnHistoryResponse.kt │ │ │ │ │ │ ├── NewHeadsNotificationExtended.kt │ │ │ │ │ │ ├── OkLinkHistoryResponse.kt │ │ │ │ │ │ ├── ReefHistoryResponse.kt │ │ │ │ │ │ ├── SubqueryHistoryElementResponse.kt │ │ │ │ │ │ ├── SubsquidHistoryResponse.kt │ │ │ │ │ │ ├── VicscanHistoryResponse.kt │ │ │ │ │ │ ├── ZchainHistoryResponse.kt │ │ │ │ │ │ └── ZetaHistoryResponse.kt │ │ │ │ ├── phishing │ │ │ │ │ └── PhishingApi.kt │ │ │ │ └── subquery │ │ │ │ │ ├── HistoryNotSupportedException.kt │ │ │ │ │ └── OperationsHistoryApi.kt │ │ │ ├── repository │ │ │ │ ├── AddressBookRepositoryImpl.kt │ │ │ │ ├── HistoryRepository.kt │ │ │ │ ├── PricesSyncService.kt │ │ │ │ ├── RuntimeWalletConstants.kt │ │ │ │ ├── TokenRepositoryImpl.kt │ │ │ │ ├── WalletExtensions.kt │ │ │ │ ├── WalletRepositoryImpl.kt │ │ │ │ └── tranfser │ │ │ │ │ ├── TonTransferService.kt │ │ │ │ │ └── TransferService.kt │ │ │ └── storage │ │ │ │ └── TransferCursorStorage.kt │ │ │ ├── di │ │ │ └── WalletFeatureModule.kt │ │ │ ├── domain │ │ │ ├── ChainInteractor.kt │ │ │ ├── QuickInputsUseCaseImpl.kt │ │ │ ├── WalletInteractorImpl.kt │ │ │ ├── XcmInteractor.kt │ │ │ ├── beacon │ │ │ │ ├── BeaconInteractor.kt │ │ │ │ ├── BeaconSharedState.kt │ │ │ │ ├── SignStatus.kt │ │ │ │ └── SignableOperation.kt │ │ │ └── validation │ │ │ │ ├── EthereumValidationChecksProvider.kt │ │ │ │ ├── SubstrateValidationChecksProvider.kt │ │ │ │ ├── TonValidationChecksProvider.kt │ │ │ │ ├── ValidateTransferUseCaseImpl.kt │ │ │ │ └── ValidationChecksProvider.kt │ │ │ └── presentation │ │ │ ├── AssetListHelper.kt │ │ │ ├── AssetPayload.kt │ │ │ ├── WalletRouter.kt │ │ │ ├── addressbook │ │ │ ├── CreateContactContent.kt │ │ │ ├── CreateContactFragment.kt │ │ │ └── CreateContactViewModel.kt │ │ │ ├── balance │ │ │ ├── assetActions │ │ │ │ └── buy │ │ │ │ │ ├── BuyMixin.kt │ │ │ │ │ ├── BuyMixinProvider.kt │ │ │ │ │ └── BuyProviderChooserBottomSheet.kt │ │ │ ├── assetDetails │ │ │ │ ├── AssetDetailsContract.kt │ │ │ │ ├── AssetDetailsFragment.kt │ │ │ │ ├── AssetDetailsScreen.kt │ │ │ │ ├── AssetDetailsViewModel.kt │ │ │ │ └── sort │ │ │ │ │ ├── AssetDetailsSortContract.kt │ │ │ │ │ ├── AssetDetailsSortFragment.kt │ │ │ │ │ ├── AssetDetailsSortScreen.kt │ │ │ │ │ └── AssetDetailsSortViewModel.kt │ │ │ ├── assetselector │ │ │ │ ├── AssetSelectContent.kt │ │ │ │ ├── AssetSelectFragment.kt │ │ │ │ └── AssetSelectViewModel.kt │ │ │ ├── chainselector │ │ │ │ ├── ChainSelectContent.kt │ │ │ │ ├── ChainSelectFragment.kt │ │ │ │ ├── ChainSelectScreenContract.kt │ │ │ │ └── ChainSelectViewModel.kt │ │ │ ├── detail │ │ │ │ ├── AccountOptionsPayload.kt │ │ │ │ ├── BalanceDetailFragment.kt │ │ │ │ ├── BalanceDetailOptionsBottomSheet.kt │ │ │ │ ├── BalanceDetailViewModel.kt │ │ │ │ ├── BalanceDetailsScreen.kt │ │ │ │ ├── TransactionDetailsBottomSheet.kt │ │ │ │ ├── TransactionItem.kt │ │ │ │ ├── claimreward │ │ │ │ │ ├── ClaimRewardsContent.kt │ │ │ │ │ ├── ClaimRewardsFragment.kt │ │ │ │ │ └── ClaimRewardsViewModel.kt │ │ │ │ └── frozen │ │ │ │ │ ├── ExpandableLazyListNestedScrollConnection.kt │ │ │ │ │ ├── FrozenAssetPayload.kt │ │ │ │ │ ├── FrozenTokensContent.kt │ │ │ │ │ ├── FrozenTokensFragment.kt │ │ │ │ │ └── FrozenTokensViewModel.kt │ │ │ ├── list │ │ │ │ ├── AssetsLoadingState.kt │ │ │ │ ├── BalanceListFragment.kt │ │ │ │ ├── BalanceListViewModel.kt │ │ │ │ ├── PullRefreshBox.kt │ │ │ │ ├── ServiceFragment.kt │ │ │ │ ├── WalletScreen.kt │ │ │ │ ├── WalletState.kt │ │ │ │ └── model │ │ │ │ │ ├── AssetType.kt │ │ │ │ │ └── BalanceListItemModel.kt │ │ │ ├── nft │ │ │ │ ├── filters │ │ │ │ │ ├── FiltersContent.kt │ │ │ │ │ └── NftFiltersFragment.kt │ │ │ │ └── list │ │ │ │ │ ├── NftList.kt │ │ │ │ │ ├── NftSettingsBar.kt │ │ │ │ │ └── models │ │ │ │ │ ├── NFTCollectionsScreenView.kt │ │ │ │ │ └── NFTCollectionsScreenViewImpl.kt │ │ │ ├── optionswallet │ │ │ │ ├── OptionsWalletContent.kt │ │ │ │ ├── OptionsWalletFragment.kt │ │ │ │ └── OptionsWalletViewModel.kt │ │ │ ├── searchAssets │ │ │ │ ├── SearchAssetState.kt │ │ │ │ ├── SearchAssetsFragment.kt │ │ │ │ ├── SearchAssetsScreen.kt │ │ │ │ └── SearchAssetsViewModel.kt │ │ │ └── walletselector │ │ │ │ ├── SelectWalletContent.kt │ │ │ │ ├── SelectWalletFragment.kt │ │ │ │ ├── SelectWalletViewModel.kt │ │ │ │ └── light │ │ │ │ ├── WalletSelectionMode.kt │ │ │ │ ├── WalletSelectorFragment.kt │ │ │ │ └── WalletSelectorViewModel.kt │ │ │ ├── beacon │ │ │ ├── main │ │ │ │ ├── BeaconFragment.kt │ │ │ │ ├── BeaconStateMachine.kt │ │ │ │ ├── BeaconViewModel.kt │ │ │ │ └── di │ │ │ │ │ ├── BeaconComponent.kt │ │ │ │ │ └── BeaconModule.kt │ │ │ └── sign │ │ │ │ ├── SignBeaconTransactionFragment.kt │ │ │ │ ├── SignBeaconTransactionViewModel.kt │ │ │ │ └── TransactionRawDataFragment.kt │ │ │ ├── common │ │ │ ├── AssetListState.kt │ │ │ ├── AssetsList.kt │ │ │ ├── CurrencyItem.kt │ │ │ ├── NetworkIssue.kt │ │ │ └── SwipeableAssetListItem.kt │ │ │ ├── contacts │ │ │ ├── ContactsContent.kt │ │ │ ├── ContactsFragment.kt │ │ │ └── ContactsViewModel.kt │ │ │ ├── cross_chain │ │ │ ├── CrossChainTransferDraft.kt │ │ │ ├── confirm │ │ │ │ ├── CrossChainConfirmContent.kt │ │ │ │ ├── CrossChainConfirmFragment.kt │ │ │ │ └── CrossChainConfirmViewModel.kt │ │ │ └── setup │ │ │ │ ├── ChainAssetsManager.kt │ │ │ │ ├── ChainType.kt │ │ │ │ ├── CrossChainSetupContent.kt │ │ │ │ ├── CrossChainSetupFragment.kt │ │ │ │ └── CrossChainSetupViewModel.kt │ │ │ ├── history │ │ │ ├── AddressHistoryContent.kt │ │ │ ├── AddressHistoryFragment.kt │ │ │ └── AddressHistoryViewModel.kt │ │ │ ├── manageassets │ │ │ ├── ManageAssetsContent.kt │ │ │ ├── ManageAssetsFragment.kt │ │ │ └── ManageAssetsViewModel.kt │ │ │ ├── model │ │ │ ├── AssetModel.kt │ │ │ ├── AssetWithStateModel.kt │ │ │ ├── OperationModel.kt │ │ │ ├── OperationParcelizeModel.kt │ │ │ ├── OperationStatusAppearance.kt │ │ │ └── TokenModel.kt │ │ │ ├── receive │ │ │ ├── ReceiveFragment.kt │ │ │ ├── ReceiveScreen.kt │ │ │ ├── ReceiveViewModel.kt │ │ │ └── model │ │ │ │ ├── QrSharingPayload.kt │ │ │ │ └── ReceiveToggleType.kt │ │ │ ├── send │ │ │ ├── SendSharedState.kt │ │ │ ├── TransferDraft.kt │ │ │ ├── confirm │ │ │ │ ├── ConfirmSendContent.kt │ │ │ │ ├── ConfirmSendFragment.kt │ │ │ │ └── ConfirmSendViewModel.kt │ │ │ ├── setup │ │ │ │ ├── SendSetupContent.kt │ │ │ │ ├── SendSetupFragment.kt │ │ │ │ └── SendSetupViewModel.kt │ │ │ └── setupcbdc │ │ │ │ ├── CBDCSendSetupContent.kt │ │ │ │ ├── CBDCSendSetupFragment.kt │ │ │ │ └── CBDCSendSetupViewModel.kt │ │ │ └── transaction │ │ │ ├── detail │ │ │ ├── TransactionDetailsState.kt │ │ │ ├── extrinsic │ │ │ │ ├── ExtrinsicDetailFragment.kt │ │ │ │ ├── ExtrinsicDetailViewModel.kt │ │ │ │ └── ExtrinsicDetailsPayload.kt │ │ │ ├── reward │ │ │ │ ├── RewardDetailFragment.kt │ │ │ │ ├── RewardDetailViewModel.kt │ │ │ │ └── RewardDetailsPayload.kt │ │ │ ├── swap │ │ │ │ ├── SwapDetailContent.kt │ │ │ │ ├── SwapDetailFragment.kt │ │ │ │ └── SwapDetailViewModel.kt │ │ │ └── transfer │ │ │ │ ├── TransactionDetailViewModel.kt │ │ │ │ ├── TransferDetailFragment.kt │ │ │ │ └── TransferDetailsScreen.kt │ │ │ ├── filter │ │ │ ├── HistoryFiltersProvider.kt │ │ │ ├── TransactionHistoryFilterFragment.kt │ │ │ └── TransactionHistoryFilterViewModel.kt │ │ │ └── history │ │ │ ├── mixin │ │ │ ├── TransactionHistoryMixin.kt │ │ │ └── TransactionHistoryProvider.kt │ │ │ └── model │ │ │ └── DayHeader.kt │ └── res │ │ ├── drawable │ │ ├── bg_asset_left.xml │ │ ├── bg_asset_right.xml │ │ ├── ic_coinbase.xml │ │ ├── ic_moonpay.xml │ │ ├── ic_ramp.xml │ │ └── ic_send_white.xml │ │ ├── layout │ │ ├── fragment_beacon.xml │ │ ├── fragment_extrinsic_details.xml │ │ ├── fragment_raw_data.xml │ │ ├── fragment_reward_slash_details.xml │ │ ├── fragment_sign_beacon_transaction.xml │ │ ├── fragment_transactions_filter.xml │ │ ├── fragment_transfer_details.xml │ │ ├── item_manage_asset.xml │ │ ├── item_sheet_buy_provider.xml │ │ └── item_sheet_currency.xml │ │ └── values │ │ └── dimens.xml │ └── test │ └── java │ └── jp │ └── co │ └── soramitsu │ └── wallet │ └── impl │ ├── data │ └── network │ │ └── integration │ │ └── Common.kt │ ├── domain │ └── model │ │ ├── TransferTest.kt │ │ └── WalletStateTest.kt │ └── viewmodels │ └── BalanceListViewModelTests.kt ├── feature-walletconnect-api ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── co │ └── jp │ └── soramitsu │ └── walletconnect │ ├── domain │ ├── WalletConnectInteractor.kt │ └── WalletConnectRouter.kt │ └── model │ └── ChainChooseState.kt ├── feature-walletconnect-impl ├── .gitignore ├── build.gradle.kts └── src │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── jp │ │ └── co │ │ └── soramitsu │ │ └── walletconnect │ │ └── impl │ │ ├── di │ │ └── WalletConnectModule.kt │ │ └── presentation │ │ ├── WCDelegate.kt │ │ ├── WCExt.kt │ │ ├── WalletConnectInteractorImpl.kt │ │ ├── WalletConnectMethod.kt │ │ ├── chainschooser │ │ ├── ChainChooseContent.kt │ │ ├── ChainChooseFragment.kt │ │ └── ChainChooseViewModel.kt │ │ ├── connectioninfo │ │ ├── ConnectionInfoContent.kt │ │ ├── ConnectionInfoFragment.kt │ │ └── ConnectionInfoViewModel.kt │ │ ├── connections │ │ ├── ConnectionsContent.kt │ │ ├── ConnectionsFragment.kt │ │ └── ConnectionsViewModel.kt │ │ ├── requestpreview │ │ ├── RequestPreviewContent.kt │ │ ├── RequestPreviewFragment.kt │ │ └── RequestPreviewViewModel.kt │ │ ├── sessionproposal │ │ ├── SessionProposalContent.kt │ │ ├── SessionProposalFragment.kt │ │ └── SessionProposalViewModel.kt │ │ ├── sessionrequest │ │ ├── SessionRequestContent.kt │ │ ├── WalletConnectSignMessageFragment.kt │ │ └── WalletConnectSignMessageViewModel.kt │ │ └── transactionrawdata │ │ ├── RawDataContent.kt │ │ ├── RawDataFragment.kt │ │ └── RawDataViewModel.kt │ └── test │ └── kotlin │ └── jp │ └── co │ └── soramitsu │ └── sign │ └── SignTest.kt ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── jacoco.gradle ├── key └── fake.json ├── runtime-permission ├── .gitignore ├── build.gradle └── src │ └── main │ └── java │ └── jp │ └── co │ └── soramitsu │ └── runtime_permission │ ├── core │ ├── PermissionFragment.java │ ├── PermissionManifestFinder.java │ ├── PermissionResult.java │ ├── RuntimePermission.java │ └── callbacks │ │ ├── AcceptedCallback.java │ │ ├── DeniedCallback.java │ │ ├── ForeverDeniedCallback.java │ │ ├── PermissionListener.java │ │ └── ResponseCallback.java │ └── kotlin │ ├── NoActivityException.kt │ ├── PermissionException.kt │ ├── coroutines │ └── experimental │ │ └── kotlin-runtimepermissions-coroutines.kt │ └── kotlin-runtimepermissions.kt ├── runtime ├── .gitignore ├── build.gradle └── src │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── local_chains.json │ │ ├── metadata │ │ │ ├── kusama │ │ │ ├── polkadot │ │ │ ├── polkatrain │ │ │ ├── rococo │ │ │ └── westend │ │ └── types │ │ │ ├── default.json │ │ │ ├── kusama.json │ │ │ ├── polkadot.json │ │ │ ├── polkatrain.json │ │ │ ├── rococo.json │ │ │ └── westend.json │ └── java │ │ └── jp │ │ └── co │ │ └── soramitsu │ │ └── runtime │ │ ├── di │ │ ├── ChainRegistryModule.kt │ │ └── RuntimeModule.kt │ │ ├── ext │ │ └── ChainExt.kt │ │ ├── multiNetwork │ │ ├── ChainRegistry.kt │ │ ├── ChainsTracker.kt │ │ ├── chain │ │ │ ├── ChainSyncService.kt │ │ │ ├── ChainsRepository.kt │ │ │ ├── Mappers.kt │ │ │ ├── RemoteAssetsInitializer.kt │ │ │ ├── RemoteAssetsSyncService.kt │ │ │ ├── TonSyncDataRepository.kt │ │ │ ├── model │ │ │ │ ├── Chain.kt │ │ │ │ ├── ChainTypesInfo.kt │ │ │ │ └── NodeId.kt │ │ │ ├── remote │ │ │ │ ├── ChainFetcher.kt │ │ │ │ ├── TonRemoteSource.kt │ │ │ │ └── model │ │ │ │ │ ├── ChainAssetRemote.kt │ │ │ │ │ ├── ChainExternalApiRemote.kt │ │ │ │ │ ├── ChainNodeRemote.kt │ │ │ │ │ └── ChainRemote.kt │ │ │ └── ton │ │ │ │ ├── CommentEncryption.kt │ │ │ │ ├── Extensions.kt │ │ │ │ ├── TonWalletContract.kt │ │ │ │ ├── V4R2WalletContract.kt │ │ │ │ └── model │ │ │ │ └── JettonTransferPayload.kt │ │ ├── configurator │ │ │ ├── ChainEnvironmentConfigurator.kt │ │ │ ├── EthereumEnvironmentConfigurator.kt │ │ │ ├── SubstrateEnvironmentConfigurator.kt │ │ │ └── TonEnvironmentConfigurator.kt │ │ ├── connection │ │ │ ├── ConnectionPool.kt │ │ │ ├── EthereumConnectionPool.kt │ │ │ └── NodeSwitchRelay.kt │ │ └── runtime │ │ │ ├── ChainInfoNotInCacheException.kt │ │ │ ├── FileHash.kt │ │ │ ├── RuntimeFilesCache.kt │ │ │ ├── RuntimeProvider.kt │ │ │ ├── RuntimeProviderPool.kt │ │ │ ├── RuntimeSubscriptionPool.kt │ │ │ ├── RuntimeSyncService.kt │ │ │ ├── RuntimeVersionSubscription.kt │ │ │ └── types │ │ │ └── TypesFetcher.kt │ │ ├── network │ │ ├── SocketServiceExtensions.kt │ │ └── updaters │ │ │ ├── BlockNumberUpdater.kt │ │ │ ├── SingleChainUpdateSystem.kt │ │ │ └── SingleStorageKeyUpdater.kt │ │ ├── repository │ │ └── ChainStateRepository.kt │ │ ├── state │ │ └── SingleAssetSharedState.kt │ │ └── storage │ │ ├── DbStorageCache.kt │ │ ├── NodesSettingsStorage.kt │ │ └── source │ │ ├── BaseStorageSource.kt │ │ ├── LocalStorageSource.kt │ │ ├── RemoteStorageSource.kt │ │ └── StorageDataSource.kt │ └── test │ └── java │ └── jp │ └── co │ └── soramitsu │ └── runtime │ └── multiNetwork │ ├── chain │ └── ChainSyncServiceTest.kt │ ├── connection │ └── NodeSwitchRelayTest.kt │ └── runtime │ ├── Mocks.kt │ ├── RuntimeProviderTest.kt │ └── RuntimeSyncServiceTest.kt ├── scripts ├── secrets.gradle └── versions.gradle ├── settings.gradle ├── test-shared ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── jp │ └── co │ └── soramitsu │ └── testshared │ ├── CreateTestSocket.kt │ ├── HashMapEncryptedPreferences.kt │ ├── LoggerHelpers.kt │ ├── MockitoHelpers.kt │ └── TestData.kt └── tests.gradle /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "gradle" 4 | directory: "/" 5 | schedule: 6 | interval: "weekly" 7 | day: "sunday" 8 | open-pull-requests-limit: 0 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .DS_Store 5 | /build 6 | /captures 7 | .externalNativeBuild 8 | app/src/main/aidl/ 9 | app/*.apk 10 | /.idea/ 11 | 12 | # ignore jacoco coverage reports 13 | /coverage 14 | 15 | fearless.jks 16 | /buildSrc/build -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/src/debug/res/drawable/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/debug/res/drawable/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | [Debug] Fearless 4 | -------------------------------------------------------------------------------- /app/src/develop/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | [Dev] Fearless 4 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Fearless 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /app/src/pr/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | [Dev] Fearless 4 | -------------------------------------------------------------------------------- /app/src/release/res/drawable/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/release/res/drawable/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/release/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/release/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/release/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/release/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/release/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/release/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/release/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/release/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/release/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/release/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/app/src/release/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/staging/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | [Staging] Fearless 4 | -------------------------------------------------------------------------------- /buildSrc/settings.gradle.kts: -------------------------------------------------------------------------------- 1 | enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") 2 | 3 | rootProject.name = "fearless-Android" 4 | 5 | dependencyResolutionManagement { 6 | versionCatalogs { 7 | create("libs") { 8 | from(files("../gradle/libs.versions.toml")) 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /common/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /common/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/AlertViewState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common 2 | 3 | import android.os.Parcelable 4 | import androidx.annotation.DrawableRes 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AlertViewState( 9 | val title: String, 10 | val message: String, 11 | val buttonText: String, 12 | val textSize: Int = 16, 13 | @DrawableRes val iconRes: Int 14 | ) : Parcelable 15 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/PlayMarketUris.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common 2 | 3 | const val APP_PACKAGE = "jp.co.soramitsu.fearless" 4 | const val PLAY_MARKET_APP_URI = "market://details?id=$APP_PACKAGE" 5 | const val PLAY_MARKET_BROWSER_URI = "https://play.google.com/store/apps/details?id=$APP_PACKAGE" 6 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/address/AddressModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.address 2 | 3 | import android.graphics.drawable.PictureDrawable 4 | 5 | class AddressModel( 6 | val address: String, 7 | val image: PictureDrawable, 8 | val name: String? = null 9 | ) { 10 | val nameOrAddress = name ?: address 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/base/errors/TitledException.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.base.errors 2 | 3 | open class TitledException(val title: String, message: String) : Exception(message) 4 | 5 | class RewardsNotSupportedWarning : TitledException("Warning", "Pending rewards for this network is not supported yet") 6 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/compose/theme/FearlessMaterialColors.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.compose.theme 2 | 3 | import androidx.compose.material.darkColors 4 | import androidx.compose.ui.graphics.Color 5 | 6 | val fearlessMaterialColors = darkColors( 7 | primary = colorPrimary, 8 | background = transparent, 9 | surface = Color.Transparent, 10 | error = errorRed 11 | ) 12 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/compose/theme/tokens/BorderRadius.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.compose.theme.tokens 2 | 3 | import androidx.compose.ui.unit.Dp 4 | import androidx.compose.ui.unit.dp 5 | 6 | object BorderRadius { 7 | val XS: Dp 8 | get() = 12.dp 9 | 10 | val M: Dp 11 | get() = 24.dp 12 | 13 | val ML: Dp 14 | get() = 28.dp 15 | 16 | val L: Dp 17 | get() = 32.dp 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/compose/theme/tokens/FontFamilies.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.compose.theme.tokens 2 | 3 | import androidx.compose.ui.text.font.FontFamily 4 | import jp.co.soramitsu.common.compose.theme.Inter 5 | import jp.co.soramitsu.common.compose.theme.Sora 6 | 7 | internal enum class FontFamilies(val value: FontFamily) { 8 | HEADLINE(Sora), 9 | TEXT(Inter) 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/compose/theme/tokens/FontWeights.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.compose.theme.tokens 2 | 3 | import androidx.compose.ui.text.font.FontWeight 4 | import androidx.compose.ui.text.font.FontWeight.Companion.Bold 5 | import androidx.compose.ui.text.font.FontWeight.Companion.Normal 6 | 7 | internal enum class FontWeights(val value: FontWeight) { 8 | ZERO(Normal), 9 | ONE(Bold) 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/compose/viewstate/AssetListItemShimmerViewState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.compose.viewstate 2 | 3 | data class AssetListItemShimmerViewState( 4 | val assetIconUrl: String, 5 | val assetChainUrls: List = emptyList() 6 | ) 7 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/holders/ChainIdHolder.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.holders 2 | 3 | interface ChainIdHolder { 4 | 5 | suspend fun chainId(): String 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/holders/RuntimeHolder.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.holders 2 | 3 | import jp.co.soramitsu.shared_utils.runtime.RuntimeSnapshot 4 | 5 | interface RuntimeHolder { 6 | 7 | suspend fun runtime(): RuntimeSnapshot 8 | } 9 | 10 | suspend inline fun RuntimeHolder.useRuntime(block: (RuntimeSnapshot) -> T) = block(runtime()) 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/model/CursorPage.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.model 2 | 3 | data class CursorPage( 4 | val nextCursor: String?, 5 | val items: List 6 | ) : List by items 7 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/AppLinksProvider.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network 2 | 3 | class AppLinksProvider( 4 | val termsUrl: String, 5 | val privacyUrl: String, 6 | val payoutsLearnMore: String, 7 | val twitterAccountTemplate: String, 8 | val setControllerLearnMore: String, 9 | val moonbeamStakingLearnMore: String 10 | ) { 11 | 12 | fun getTwitterAccountUrl( 13 | accountName: String 14 | ): String = twitterAccountTemplate.format(accountName) 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/OptionsProvider.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network 2 | 3 | object OptionsProvider { 4 | var CURRENT_VERSION_CODE: Long = 0 5 | var CURRENT_VERSION_NAME: String = "" 6 | var APPLICATION_ID: String = "" 7 | var CURRENT_BUILD_TYPE: String = "" 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/coingecko/FiatCurrency.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.coingecko 2 | 3 | import jp.co.soramitsu.common.utils.Event 4 | import jp.co.soramitsu.common.view.bottomSheet.list.dynamic.DynamicListBottomSheet 5 | 6 | typealias FiatChooserEvent = Event> 7 | 8 | data class FiatCurrency(val id: String, val symbol: String, val name: String, val icon: String) 9 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/nomis/NomisApi.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.nomis 2 | 3 | import retrofit2.http.GET 4 | import retrofit2.http.Path 5 | 6 | interface NomisApi { 7 | @GET("wallet/{address}/score/") 8 | suspend fun getNomisScore( 9 | @Path("address") address: String 10 | ): NomisResponse 11 | } -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/rpc/RetrieveAllValues.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.rpc 2 | 3 | import jp.co.soramitsu.shared_utils.wsrpc.SocketService 4 | 5 | suspend fun BulkRetriever.retrieveAllValues(socketService: SocketService, keyPrefix: String): Map { 6 | val allKeys = retrieveAllKeys(socketService, keyPrefix) 7 | 8 | return queryKeys(socketService, allKeys) 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/runtime/binding/BalanceOf.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.runtime.binding 2 | 3 | import java.math.BigInteger 4 | 5 | typealias BalanceOf = BigInteger 6 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/runtime/binding/BindAccountId.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.runtime.binding 2 | 3 | import jp.co.soramitsu.shared_utils.runtime.AccountId 4 | 5 | @HelperBinding 6 | fun bindAccountId(dynamicInstance: Any?) = dynamicInstance.cast() 7 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/runtime/binding/Primitive.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.runtime.binding 2 | 3 | import java.math.BigInteger 4 | import jp.co.soramitsu.common.utils.orZero 5 | 6 | @HelperBinding 7 | fun bindNumber(dynamicInstance: Any?): BigInteger = runCatching { dynamicInstance.cast() }.getOrNull().orZero() 8 | 9 | @HelperBinding 10 | fun bindString(dynamicInstance: Any?): String = dynamicInstance.cast().decodeToString() 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/GiantsquidResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | class GiantsquidResponse( 4 | val data: T 5 | ) 6 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/GiantsquidRewardAmountResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | import java.math.BigInteger 4 | 5 | class GiantsquidRewardAmountResponse(val stakingRewards: List) { 6 | class StakingReward( 7 | val amount: BigInteger 8 | ) 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/SoraEraInfoValidatorResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | data class SoraEraInfoValidatorResponse(val stakingEraNominators: List) { 4 | data class Nominator(val nominations: List) { 5 | data class Nomination(val validator: Validator) { 6 | data class Validator(val id: String? = null) 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/StakingCollatorsApyResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | import java.math.BigDecimal 4 | 5 | class StakingCollatorsApyResponse(val collatorRounds: SubQueryNodes) { 6 | class CollatorApyElement( 7 | val collatorId: String?, 8 | val apr: BigDecimal? 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/StakingLastRoundId.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | class StakingLastRoundId(val rounds: SubQueryNodes) { 4 | class RoundIdElement( 5 | val id: String? 6 | ) 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/SubQueryResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | class SubQueryResponse( 4 | val data: T 5 | ) 6 | 7 | class SubQueryNodes(val nodes: List) 8 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/SubsquidCollatorsApyResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | import java.math.BigDecimal 4 | 5 | class SubsquidCollatorsApyResponse(val stakers: List) { 6 | class CollatorApyElement( 7 | val stashId: String?, 8 | val apr24h: BigDecimal? 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/SubsquidLastRoundId.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | class SubsquidLastRoundId(val rounds: List) { 4 | class RoundIdElement( 5 | val id: String? 6 | ) 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/SubsquidResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | class SubsquidResponse( 4 | val data: T 5 | ) 6 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/SubsquidRewardResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | import java.math.BigInteger 4 | 5 | class SubsquidRewardResponse(val rewards: List) { 6 | class Reward( 7 | val id: String, 8 | val amount: BigInteger?, 9 | val blockNumber: Int?, 10 | val round: Int?, 11 | val timestamp: String?, 12 | val extrinsicHash: String? 13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/subquery/TransactionHistoryRemote.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.subquery 2 | 3 | import java.math.BigInteger 4 | 5 | class TransactionHistoryRemote(val historyElements: SubQueryNodes) { 6 | class HistoryElement(val reward: Reward) { 7 | class Reward(val amount: BigInteger) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/ton/JettonTransferPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.ton 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class JettonTransferPayload ( 6 | 7 | /* hex-encoded BoC */ 8 | @SerializedName("custom_payload") 9 | val customPayload: String? = null, 10 | 11 | /* hex-encoded BoC */ 12 | @SerializedName("state_init") 13 | val stateInit: String? = null 14 | 15 | ) 16 | 17 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/ton/JettonTransferPayloadRemote.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.ton 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class JettonTransferPayloadRemote ( 6 | 7 | /* hex-encoded BoC */ 8 | @SerializedName("custom_payload") 9 | val customPayload: String? = null, 10 | 11 | /* hex-encoded BoC */ 12 | @SerializedName("state_init") 13 | val stateInit: String? = null 14 | ) 15 | 16 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/ton/SendBlockchainMessageRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.ton 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class SendBlockchainMessageRequest ( 6 | 7 | @SerializedName("boc") 8 | val boc: String? = null, 9 | 10 | @SerializedName("batch") 11 | val batch: List? = null 12 | 13 | ) -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/network/ton/Seqno.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.network.ton 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Seqno ( 6 | val seqno: Int 7 | ) 8 | 9 | data class RawTime( 10 | val time: Int 11 | ) 12 | 13 | data class PublicKeyResponse( 14 | @SerializedName("public_key") 15 | val publicKey: String 16 | ) -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/secrets/v3/SecretStore.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.secrets.v3 2 | 3 | import jp.co.soramitsu.shared_utils.scale.EncodableStruct 4 | import jp.co.soramitsu.shared_utils.scale.Schema 5 | 6 | 7 | interface SecretStore> { 8 | fun put(metaId: Long, secrets: EncodableStruct) 9 | fun get(metaId: Long): EncodableStruct? 10 | } 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/data/storage/encrypt/EncryptedPreferences.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.data.storage.encrypt 2 | 3 | interface EncryptedPreferences { 4 | 5 | fun putEncryptedString(field: String, value: String) 6 | 7 | fun getDecryptedString(field: String): String? 8 | 9 | fun hasKey(field: String): Boolean 10 | 11 | fun removeKey(field: String) 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/di/viewmodel/ViewModelModule.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.di.viewmodel 2 | 3 | import androidx.lifecycle.ViewModelProvider 4 | import dagger.Binds 5 | import dagger.Module 6 | import dagger.hilt.InstallIn 7 | import dagger.hilt.components.SingletonComponent 8 | 9 | @InstallIn(SingletonComponent::class) 10 | @Module 11 | abstract class ViewModelModule { 12 | 13 | @Binds 14 | abstract fun bindViewModelFactory(factory: ViewModelProviderFactory): ViewModelProvider.Factory 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/domain/model/NetworkIssueType.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.domain.model 2 | 3 | enum class NetworkIssueType { 4 | Node, Network, Account 5 | } -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/interfaces/FileProvider.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.interfaces 2 | 3 | import java.io.File 4 | 5 | interface FileProvider { 6 | 7 | suspend fun getFileInExternalCacheStorage(fileName: String): File 8 | 9 | suspend fun getFileInInternalCacheStorage(fileName: String): File 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/io/MainThreadExecutor.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.io 2 | 3 | import android.os.Handler 4 | import android.os.Looper 5 | import java.util.concurrent.Executor 6 | 7 | class MainThreadExecutor : Executor { 8 | 9 | private val mainThreadHandler = Handler(Looper.getMainLooper()) 10 | 11 | override fun execute(command: Runnable) { 12 | mainThreadHandler.post(command) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/list/GroupedList.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.list 2 | 3 | typealias GroupedList = Map> 4 | 5 | fun emptyGroupedList() = emptyMap() 6 | 7 | fun GroupedList.toListWithHeaders(): List = map { (groupKey, values) -> 8 | groupKey?.let { listOf(groupKey) }.orEmpty() + values 9 | }.flatten() 10 | 11 | fun GroupedList.toValueList(): List = map { (_, values) -> values }.flatten() 12 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/mixin/api/Browserable.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.mixin.api 2 | 3 | import androidx.lifecycle.LiveData 4 | import jp.co.soramitsu.common.utils.Event 5 | 6 | interface Browserable { 7 | val openBrowserEvent: LiveData> 8 | 9 | interface Presentation { 10 | fun showBrowser(url: String) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/mixin/api/Retriable.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.mixin.api 2 | 3 | import androidx.lifecycle.LiveData 4 | import jp.co.soramitsu.common.utils.Event 5 | 6 | typealias Action = () -> Unit 7 | 8 | class RetryPayload( 9 | val title: String, 10 | val message: String, 11 | val onRetry: Action, 12 | val onCancel: Action? = null 13 | ) 14 | 15 | interface Retriable { 16 | 17 | val retryEvent: LiveData> 18 | } 19 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/mixin/api/Validatable.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.mixin.api 2 | 3 | import androidx.lifecycle.LiveData 4 | import jp.co.soramitsu.common.utils.Event 5 | import jp.co.soramitsu.common.validation.ValidationStatus 6 | 7 | class DefaultFailure( 8 | val level: ValidationStatus.NotValid.Level, 9 | val title: String, 10 | val message: String, 11 | val confirmWarning: Action 12 | ) 13 | 14 | interface Validatable { 15 | val validationFailureEvent: LiveData> 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/model/AssetBooleanState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.model 2 | 3 | import jp.co.soramitsu.core.models.ChainId 4 | 5 | data class AssetBooleanState( 6 | val chainId: ChainId, 7 | val assetId: String, 8 | val value: Boolean 9 | ) -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/model/WalletEcosystem.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.model 2 | 3 | import jp.co.soramitsu.core.models.Ecosystem 4 | 5 | enum class WalletEcosystem { 6 | Substrate, Ethereum, Ton 7 | } 8 | 9 | fun Ecosystem.toAccountType() = when (this) { 10 | Ecosystem.Substrate -> WalletEcosystem.Substrate 11 | Ecosystem.Ton -> WalletEcosystem.Ton 12 | Ecosystem.EthereumBased, 13 | Ecosystem.Ethereum -> WalletEcosystem.Ethereum 14 | } -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/navigation/PendingNavigationAction.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.navigation 2 | 3 | typealias PendingNavigationAction = (ROUTER) -> Unit 4 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/navigation/payload/WalletSelectorPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.navigation.payload 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class WalletSelectorPayload(val tag: String, val selectedWalletId: Long) : Parcelable 8 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/Base58Ext.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | import jp.co.soramitsu.shared_utils.encrypt.Base58 4 | 5 | object Base58Ext { 6 | 7 | // TODO make Base58 static in fearless utils 8 | private val base58 = Base58() 9 | 10 | fun String.fromBase58Check() = base58.decodeChecked(this) 11 | } 12 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/BigDecimal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | import java.math.BigDecimal 4 | 5 | fun BigDecimal?.moreThanZero(): Boolean { 6 | return (this ?: BigDecimal.ZERO) > BigDecimal.ZERO 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/ComponentHolder.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | @Suppress("UNCHECKED_CAST") 4 | class ComponentHolder(val values: List<*>) { 5 | operator fun component1() = values.first() as T 6 | operator fun component2() = values[1] as T 7 | operator fun component3() = values[2] as T 8 | operator fun component4() = values[3] as T 9 | operator fun component5() = values[4] as T 10 | } 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/Filters.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | interface Filter { 4 | fun shouldInclude(model: T): Boolean 5 | } 6 | 7 | fun List.applyFilters(filters: List>): List { 8 | return filter { item -> filters.all { filter -> filter.shouldInclude(item) } } 9 | } 10 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/IgnoredOnEquals.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | class IgnoredOnEquals(val value: T) { 4 | 5 | override fun equals(other: Any?): Boolean { 6 | return true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/InputFilter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | import android.text.InputFilter 4 | 5 | class ByteSizeFilter(maxSizeInBytes: Int) : InputFilter.LengthFilter(maxSizeInBytes / Char.SIZE_BYTES) 6 | 7 | private const val NAME_BYTE_LIMIT = 32 8 | 9 | fun nameInputFilters() = arrayOf(ByteSizeFilter(NAME_BYTE_LIMIT)) 10 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/Map.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | import android.database.Cursor 4 | 5 | inline fun Cursor.map(iteration: Cursor.() -> T): List { 6 | val result = mutableListOf() 7 | 8 | while (moveToNext()) { 9 | result.add(iteration()) 10 | } 11 | 12 | return result 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/MultipleEventsCutter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | class MultipleEventsCutter { 4 | private val now: Long 5 | get() = System.currentTimeMillis() 6 | 7 | private var lastEventTimeMs: Long = 0 8 | 9 | fun processEvent(event: () -> Unit) { 10 | if (now - lastEventTimeMs >= 600L) { 11 | event.invoke() 12 | } 13 | lastEventTimeMs = now 14 | } 15 | } -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/OnDestroy.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils 2 | 3 | import androidx.lifecycle.DefaultLifecycleObserver 4 | import androidx.lifecycle.Lifecycle 5 | import androidx.lifecycle.LifecycleOwner 6 | 7 | fun Lifecycle.onDestroy(action: () -> Unit) { 8 | addObserver(object : DefaultLifecycleObserver { 9 | override fun onDestroy(owner: LifecycleOwner) { 10 | action() 11 | 12 | removeObserver(this) 13 | } 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/formatting/AddressExt.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils.formatting 2 | 3 | fun String.shortenAddress(symbolsCount: Int = 8): String { 4 | return when { 5 | length <= symbolsCount * 2 + 1 -> this 6 | else -> "${take(symbolsCount)}...${takeLast(symbolsCount)}" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/formatting/FixedPrecisionFormatter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils.formatting 2 | 3 | import jp.co.soramitsu.common.utils.decimalFormatterFor 4 | import jp.co.soramitsu.common.utils.patternWith 5 | import java.math.BigDecimal 6 | 7 | class FixedPrecisionFormatter( 8 | private val precision: Int 9 | ) : NumberFormatter { 10 | 11 | override fun format(number: BigDecimal): String { 12 | return decimalFormatterFor(patternWith(precision)).format(number) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/formatting/HashExt.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils.formatting 2 | 3 | fun String.shortenHash() = "${take(5)}...${takeLast(5)}" 4 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/formatting/NumberAbbreviation.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils.formatting 2 | 3 | import java.math.BigDecimal 4 | 5 | class NumberAbbreviation( 6 | val threshold: BigDecimal, 7 | val divisor: BigDecimal, 8 | val suffix: String, 9 | val formatter: NumberFormatter 10 | ) 11 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/utils/formatting/NumberFormatter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils.formatting 2 | 3 | import java.math.BigDecimal 4 | 5 | interface NumberFormatter { 6 | 7 | fun format(number: BigDecimal): String 8 | } 9 | -------------------------------------------------------------------------------- /common/src/main/java/jp/co/soramitsu/common/vibration/DeviceVibrator.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.vibration 2 | 3 | import android.os.Vibrator 4 | 5 | class DeviceVibrator( 6 | private val vibrator: Vibrator 7 | ) { 8 | 9 | companion object { 10 | private const val SHORT_VIBRATION_DURATION = 200L 11 | } 12 | 13 | fun makeShortVibration() { 14 | vibrator.vibrate(SHORT_VIBRATION_DURATION) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/res/anim/progress_rotate.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /common/src/main/res/color/actions_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /common/src/main/res/color/button_text_colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /common/src/main/res/color/group_title_text_colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /common/src/main/res/color/tint_radio_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /common/src/main/res/drawable-hdpi/ic_buy_xor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-hdpi/ic_buy_xor.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-hdpi/ic_get_sora_card_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-hdpi/ic_get_sora_card_banner.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-hdpi/ic_sora_card_fiat_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-hdpi/ic_sora_card_fiat_right.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-mdpi/ic_buy_xor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-mdpi/ic_buy_xor.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-mdpi/ic_get_sora_card_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-mdpi/ic_get_sora_card_banner.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-mdpi/ic_sora_card_fiat_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-mdpi/ic_sora_card_fiat_right.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-ru/background_story_chain_accounts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-ru/background_story_chain_accounts.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xhdpi/ic_buy_xor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xhdpi/ic_buy_xor.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xhdpi/ic_get_sora_card_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xhdpi/ic_get_sora_card_banner.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xhdpi/ic_sora_card_fiat_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xhdpi/ic_sora_card_fiat_right.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxhdpi/ic_buy_xor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxhdpi/ic_buy_xor.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxhdpi/ic_get_sora_card_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxhdpi/ic_get_sora_card_banner.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxhdpi/ic_sora_card_fiat_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxhdpi/ic_sora_card_fiat_right.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/about_top_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/about_top_background.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/about_top_bg_gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/about_top_bg_gradient.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/bg_corners.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/bg_corners.9.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/drawable_soramitsu_brand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/drawable_soramitsu_brand.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/ic_buy_xor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/ic_buy_xor.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/ic_get_sora_card_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/ic_get_sora_card_banner.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/ic_sora_card_fiat_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/ic_sora_card_fiat_right.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/ic_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/ic_wallet.png -------------------------------------------------------------------------------- /common/src/main/res/drawable-xxxhdpi/noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable-xxxhdpi/noise.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/animated_bird.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/animated_bird.gif -------------------------------------------------------------------------------- /common/src/main/res/drawable/background_banner_substrate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/background_banner_substrate.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/background_banner_ton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/background_banner_ton.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/background_story_chain_accounts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/background_story_chain_accounts.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/background_story_ecosystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/background_story_ecosystem.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/background_story_networks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/background_story_networks.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/background_story_networks_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/background_story_networks_2.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/background_story_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/background_story_wallet.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_asset_badge.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_big_input_shape.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_big_input_shape_focused.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_big_input_shape_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_button_outline_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_button_primary_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_corner_white_overlay.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_primary_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_puller.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_rect_rounded_gray_4.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_rounded_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bg_shimmer_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/bottom_navigation_tint_color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/demeter_banner_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/demeter_banner_image.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/divider_decoration.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/divider_drawable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/drawable_background_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/drawable_background_image.png -------------------------------------------------------------------------------- /common/src/main/res/drawable/drawable_fearless_bird.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/drawable_fearless_bird.webp -------------------------------------------------------------------------------- /common/src/main/res/drawable/fearless_bird_glossy.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/drawable/fearless_bird_glossy.webp -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_arrow_back_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_arrow_down.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_arrow_right_24_square.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_arrow_top_right_white_16.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_chevron_dawn.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_chevron_right.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_filter_list_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_lightning_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_minus_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_monitor_blue_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_plus_white_24.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_right_arrow_24_align_right.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_search_field.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_sort.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_status_indicator.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/ic_validator_waiting.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/segmented_button_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /common/src/main/res/drawable/segmented_button_selected_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /common/src/main/res/font/inter_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/inter_bold.ttf -------------------------------------------------------------------------------- /common/src/main/res/font/inter_extrabold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/inter_extrabold.ttf -------------------------------------------------------------------------------- /common/src/main/res/font/inter_extralight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/inter_extralight.ttf -------------------------------------------------------------------------------- /common/src/main/res/font/inter_light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/inter_light.ttf -------------------------------------------------------------------------------- /common/src/main/res/font/inter_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/inter_regular.ttf -------------------------------------------------------------------------------- /common/src/main/res/font/inter_semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/inter_semibold.ttf -------------------------------------------------------------------------------- /common/src/main/res/font/inter_thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/inter_thin.ttf -------------------------------------------------------------------------------- /common/src/main/res/font/sora_bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/sora_bold.otf -------------------------------------------------------------------------------- /common/src/main/res/font/sora_extrabold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/sora_extrabold.otf -------------------------------------------------------------------------------- /common/src/main/res/font/sora_extralight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/sora_extralight.otf -------------------------------------------------------------------------------- /common/src/main/res/font/sora_light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/sora_light.otf -------------------------------------------------------------------------------- /common/src/main/res/font/sora_regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/sora_regular.otf -------------------------------------------------------------------------------- /common/src/main/res/font/sora_semibold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/sora_semibold.otf -------------------------------------------------------------------------------- /common/src/main/res/font/sora_thin.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/common/src/main/res/font/sora_thin.otf -------------------------------------------------------------------------------- /common/src/main/res/layout/activity_qr_scanner.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /common/src/test/java/jp/co/soramitsu/common/utils/formatting/Common.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.common.utils.formatting 2 | 3 | import org.junit.Assert 4 | import java.math.BigDecimal 5 | 6 | fun testFormatter(formatter: NumberFormatter, expected: String, unformattedValue: String) { 7 | Assert.assertEquals(expected, formatter.format(BigDecimal(unformattedValue))) 8 | } 9 | -------------------------------------------------------------------------------- /core-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /core-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core-api/src/main/java/jp/co/soramitsu/core/model/Language.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.core.model 2 | 3 | data class Language( 4 | val iso: String 5 | ) 6 | -------------------------------------------------------------------------------- /core-api/src/main/java/jp/co/soramitsu/core/model/RuntimeConfiguration.kt: -------------------------------------------------------------------------------- 1 | @file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_UNSIGNED_LITERALS") 2 | 3 | package jp.co.soramitsu.core.model 4 | 5 | class RuntimeConfiguration( 6 | val genesisHash: String, 7 | val addressByte: Short 8 | ) 9 | -------------------------------------------------------------------------------- /core-api/src/main/java/jp/co/soramitsu/core/model/StorageChange.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.core.model 2 | 3 | data class StorageChange(val block: String, val key: String, val value: String?) 4 | -------------------------------------------------------------------------------- /core-api/src/main/java/jp/co/soramitsu/core/model/StorageEntry.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.core.model 2 | 3 | data class StorageEntry( 4 | val storageKey: String, 5 | val content: String? 6 | ) 7 | -------------------------------------------------------------------------------- /core-api/src/main/java/jp/co/soramitsu/core/updater/SubscriptionBuilder.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.core.updater 2 | 3 | import jp.co.soramitsu.core.model.StorageChange 4 | import jp.co.soramitsu.shared_utils.wsrpc.SocketService 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | interface SubscriptionBuilder { 8 | 9 | val socketService: SocketService 10 | 11 | fun subscribe(key: String): Flow 12 | } 13 | -------------------------------------------------------------------------------- /core-db/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core-db/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/converters/CryptoTypeConverters.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.converters 2 | 3 | import androidx.room.TypeConverter 4 | import jp.co.soramitsu.core.models.CryptoType 5 | 6 | class CryptoTypeConverters { 7 | 8 | @TypeConverter 9 | fun from(cryptoType: CryptoType?): String? = cryptoType?.name 10 | 11 | @TypeConverter 12 | fun to(name: String?): CryptoType? = kotlin.runCatching { name?.let { enumValueOf(it) } }.getOrNull() 13 | } 14 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/AssetWithToken.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model 2 | 3 | import androidx.room.Embedded 4 | 5 | class AssetWithToken( 6 | @Embedded 7 | val asset: AssetLocal, 8 | 9 | @Embedded 10 | val token: TokenPriceLocal? 11 | ) 12 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/NodeLocal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity(tableName = "nodes") 7 | data class NodeLocal( 8 | val name: String, 9 | val link: String, 10 | val networkType: Int, 11 | val isDefault: Boolean, 12 | val isActive: Boolean = false 13 | ) { 14 | @PrimaryKey(autoGenerate = true) 15 | var id: Int = 0 16 | } 17 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/PhishingLocal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model 2 | 3 | import androidx.room.Entity 4 | 5 | @Entity( 6 | tableName = "phishing", 7 | primaryKeys = ["address", "type"] 8 | ) 9 | data class PhishingLocal( 10 | val address: String, 11 | val name: String?, 12 | val type: String, 13 | val subtype: String? 14 | ) 15 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/PoolLocalJoined.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model 2 | 3 | import androidx.room.Embedded 4 | import androidx.room.Relation 5 | 6 | data class UserPoolJoinedLocal( 7 | @Embedded 8 | val userPoolLocal: UserPoolLocal, 9 | @Embedded 10 | val basicPoolLocal: BasicPoolLocal, 11 | ) 12 | 13 | data class UserPoolJoinedLocalNullable( 14 | @Embedded 15 | val userPoolLocal: UserPoolLocal?, 16 | @Embedded 17 | val basicPoolLocal: BasicPoolLocal, 18 | ) 19 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/SoraCardInfoLocal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity( 7 | tableName = "sora_card" 8 | ) 9 | data class SoraCardInfoLocal( 10 | @PrimaryKey val id: String, 11 | val accessToken: String, 12 | val refreshToken: String, 13 | val accessTokenExpirationTime: Long, 14 | val kycStatus: String 15 | ) 16 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/StorageEntryLocal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model 2 | 3 | import androidx.room.Entity 4 | 5 | @Entity( 6 | tableName = "storage", 7 | primaryKeys = ["chainId", "storageKey"] 8 | ) 9 | class StorageEntryLocal( 10 | val storageKey: String, 11 | val content: String?, 12 | val chainId: String 13 | ) 14 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/TokenPriceLocal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import java.math.BigDecimal 6 | 7 | @Entity(tableName = "token_price", primaryKeys = ["priceId"]) 8 | data class TokenPriceLocal( 9 | val priceId: String, 10 | val fiatSymbol: String, 11 | val fiatRate: BigDecimal?, 12 | val recentRateChange: BigDecimal? 13 | ) -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/TotalRewardLocal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import java.math.BigInteger 6 | 7 | @Entity(tableName = "total_reward") 8 | data class TotalRewardLocal( 9 | @PrimaryKey 10 | val accountAddress: String, 11 | val totalReward: BigInteger 12 | ) 13 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/chain/ChainRuntimeInfoLocal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model.chain 2 | 3 | import androidx.room.Entity 4 | import androidx.room.Index 5 | 6 | @Entity( 7 | tableName = "chain_runtimes", 8 | primaryKeys = ["chainId"], 9 | indices = [ 10 | Index(value = ["chainId"]) 11 | ] 12 | ) 13 | class ChainRuntimeInfoLocal( 14 | val chainId: String, 15 | val syncedVersion: Int, 16 | val remoteVersion: Int 17 | ) 18 | -------------------------------------------------------------------------------- /core-db/src/main/java/jp/co/soramitsu/coredb/model/chain/ChainTypesLocal.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.coredb.model.chain 2 | 3 | import androidx.room.Entity 4 | 5 | @Entity( 6 | tableName = "chain_types", 7 | primaryKeys = ["chainId"] 8 | ) 9 | data class ChainTypesLocal( 10 | val chainId: String, 11 | val typesConfig: String 12 | ) 13 | -------------------------------------------------------------------------------- /debug-keystore.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/debug-keystore.jks -------------------------------------------------------------------------------- /docs/fearlesswallet_promo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/docs/fearlesswallet_promo.png -------------------------------------------------------------------------------- /feature-account-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /feature-account-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/domain/interfaces/AssetBalanceUseCase.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.domain.interfaces 2 | 3 | import jp.co.soramitsu.account.api.domain.model.AssetBalance 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface AssetBalanceUseCase { 7 | 8 | suspend operator fun invoke(accountMetaId: Long, assetId: String): AssetBalance 9 | 10 | fun observe(accountMetaId: Long, assetId: String): Flow 11 | 12 | } -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/domain/model/Account.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.domain.model 2 | 3 | import jp.co.soramitsu.core.models.CryptoType 4 | import jp.co.soramitsu.shared_utils.extensions.fromHex 5 | 6 | data class 7 | 8 | Account( 9 | val address: String, 10 | val name: String?, 11 | val accountIdHex: String, 12 | val cryptoType: CryptoType, // TODO make optional 13 | val position: Int 14 | ) { 15 | 16 | val accountId = accountIdHex.fromHex() 17 | } 18 | -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/domain/model/AccountType.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.domain.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | enum class AccountType: Parcelable { 8 | SubstrateOrEvm, Ton 9 | } -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/domain/model/AuthType.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.domain.model 2 | 3 | enum class AuthType { 4 | PINCODE, 5 | BIOMETRY 6 | } 7 | -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/domain/model/ImportJsonData.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.domain.model 2 | 3 | import jp.co.soramitsu.core.models.CryptoType 4 | 5 | class ImportJsonData( 6 | val name: String?, 7 | val encryptionType: CryptoType 8 | ) 9 | -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/domain/model/ImportMode.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.domain.model 2 | 3 | enum class ImportMode { 4 | MnemonicPhrase, 5 | RawSeed, 6 | Json, 7 | Google, 8 | Preinstalled 9 | } 10 | -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/presentation/account/create/ChainAccountCreatePayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.presentation.account.create 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class ChainAccountCreatePayload( 9 | val chainId: ChainId, 10 | val metaId: Long, 11 | val isImport: Boolean 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/presentation/accountSource/AccountSource.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.presentation.accountSource 2 | 3 | import androidx.annotation.DrawableRes 4 | import androidx.annotation.StringRes 5 | 6 | abstract class AccountSource( 7 | @StringRes val nameRes: Int, 8 | @StringRes val hintRes: Int, 9 | @DrawableRes val iconRes: Int, 10 | val isExport: Boolean 11 | ) 12 | -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/presentation/actions/AddAccountPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.presentation.actions 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AddAccountPayload( 9 | val metaId: Long, 10 | val chainId: ChainId, 11 | val chainName: String, 12 | val assetId: String, 13 | val markedAsNotNeed: Boolean 14 | ) : Parcelable -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/presentation/create_backup_password/SaveBackupPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.presentation.create_backup_password 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.account.api.domain.model.AddAccountPayload 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class SaveBackupPayload( 9 | val walletId: Long?, 10 | val addAccountPayload: AddAccountPayload? 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /feature-account-api/src/main/java/jp/co/soramitsu/account/api/presentation/exporting/ExportSourceChooserPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.api.presentation.exporting 2 | 3 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 4 | 5 | data class ExportSourceChooserPayload( 6 | val chainId: ChainId, 7 | val sources: Set 8 | ) 9 | -------------------------------------------------------------------------------- /feature-account-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/domain/BeaconConnectedUseCase.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.domain 2 | 3 | import jp.co.soramitsu.common.data.storage.Preferences 4 | 5 | class BeaconConnectedUseCase(private val preferences: Preferences) { 6 | 7 | private val beaconConnectedKey = "IS_BEACON_CONNECTED" 8 | 9 | operator fun invoke() = preferences.getBoolean(beaconConnectedKey, false) 10 | } 11 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/domain/errors/NodeAlreadyExistsException.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.domain.errors 2 | 3 | class NodeAlreadyExistsException : RuntimeException() 4 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/domain/errors/UnsupportedNetworkException.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.domain.errors 2 | 3 | class UnsupportedNetworkException : RuntimeException() 4 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/about/AboutState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.about 2 | 3 | import jp.co.soramitsu.account.impl.presentation.about.model.AboutItemListModel 4 | 5 | data class AboutState( 6 | val items: List 7 | ) 8 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/about/model/AboutItemListModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.about.model 2 | 3 | abstract class AboutItemListModel 4 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/about/model/AboutItemModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.about.model 2 | 3 | import androidx.annotation.DrawableRes 4 | import androidx.annotation.StringRes 5 | 6 | data class AboutItemModel( 7 | @DrawableRes val iconResId: Int, 8 | @StringRes val titleResId: Int, 9 | val text: String? = null, 10 | val showDivider: Boolean = true, 11 | val onClick: () -> Unit = {} 12 | ) : AboutItemListModel() 13 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/about/model/AboutSectionModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.about.model 2 | 3 | import androidx.annotation.StringRes 4 | 5 | data class AboutSectionModel( 6 | @StringRes val titleResId: Int 7 | ) : AboutItemListModel() 8 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/account/create/CreateAccountScreenKeys.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.account.create 2 | 3 | object CreateAccountScreenKeys { 4 | const val IS_FROM_GOOGLE_BACKUP_KEY = "IS_FROM_GOOGLE_BACKUP_KEY" 5 | const val ACCOUNT_TYPE_KEY = "ACCOUNT_TYPE_KEY" 6 | } 7 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/account/model/ConnectedAccountsInfoItem.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.account.model 2 | 3 | import jp.co.soramitsu.common.model.WalletEcosystem 4 | 5 | class ConnectedAccountsInfoItem( 6 | val accountType: WalletEcosystem, 7 | val title: String, 8 | val amount: Int, 9 | ) -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/account/model/Format.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.account.model 2 | 3 | import jp.co.soramitsu.account.api.domain.model.TotalBalance 4 | import jp.co.soramitsu.common.utils.formatFiat 5 | 6 | fun TotalBalance.format(): String { 7 | return balance.formatFiat(fiatSymbol) 8 | } 9 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/account/model/LightMetaAccountUi.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.account.model 2 | 3 | import android.graphics.drawable.Drawable 4 | import jp.co.soramitsu.common.utils.IgnoredOnEquals 5 | 6 | data class LightMetaAccountUi( 7 | val id: Long, 8 | val name: String, 9 | val isSelected: Boolean, 10 | val picture: IgnoredOnEquals 11 | ) 12 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/experimental/di/ExperimentalComponent.kt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/experimental/di/ExperimentalComponent.kt -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/experimental/di/ExperimentalModule.kt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/experimental/di/ExperimentalModule.kt -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/exporting/json/password/ExportJsonPasswordPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.exporting.json.password 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class ExportJsonPasswordPayload( 9 | val metaId: Long, 10 | val chainId: ChainId, 11 | val isExportWallet: Boolean 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/exporting/mnemonic/ExportMnemonicPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.exporting.mnemonic 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class ExportMnemonicPayload( 9 | val metaId: Long, 10 | val chainId: ChainId, 11 | val isExportWallet: Boolean 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/exporting/seed/ExportSeedPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.exporting.seed 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class ExportSeedPayload( 9 | val metaId: Long, 10 | val chainId: ChainId, 11 | val isExportWallet: Boolean = false 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/importing/remote_backup/ImportRemoteWalletStep.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.importing.remote_backup 2 | 3 | enum class ImportRemoteWalletStep { 4 | WalletList, 5 | EnterBackupPassword, 6 | WalletImported 7 | } 8 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/importing/remote_backup/model/WrappedBackupAccountMeta.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.importing.remote_backup.model 2 | 3 | import jp.co.soramitsu.backup.domain.models.BackupAccountMeta 4 | 5 | enum class BackupOrigin { 6 | WEB, APP 7 | } 8 | 9 | class WrappedBackupAccountMeta( 10 | val backupMeta: BackupAccountMeta, 11 | val origin: BackupOrigin = BackupOrigin.APP 12 | ) 13 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/importing/source/model/Features.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.importing.source.model 2 | 3 | import android.net.Uri 4 | import androidx.lifecycle.LiveData 5 | import jp.co.soramitsu.common.utils.Event 6 | 7 | typealias RequestCode = Int 8 | 9 | interface FileRequester { 10 | val chooseJsonFileEvent: LiveData> 11 | 12 | fun fileChosen(uri: Uri) 13 | } 14 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/language/model/LanguageModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.language.model 2 | 3 | data class LanguageModel( 4 | val iso: String, 5 | val displayName: String, 6 | val nativeDisplayName: String 7 | ) 8 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/mnemonic/backup/BackupMnemonicPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.mnemonic.backup 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.common.model.WalletEcosystem 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class BackupMnemonicPayload( 9 | val isFromGoogleBackup: Boolean, 10 | val accountName: String, 11 | val walletId: Long?, 12 | val accountTypes: List 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/mnemonic/backup/BackupMnemonicScreenKeys.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.mnemonic.backup 2 | 3 | object BackupMnemonicScreenKeys { 4 | const val PAYLOAD_KEY = "PAYLOAD_KEY" 5 | } 6 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/node/add/LabeledButtonState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.node.add 2 | 3 | import jp.co.soramitsu.common.view.ButtonState 4 | 5 | class LabeledButtonState(val state: ButtonState, val label: String? = null) 6 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/node/details/NodeDetailsPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.node.details 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class NodeDetailsPayload(val chainId: String, val nodeUrl: String) : Parcelable 8 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/node/mixin/api/NodeListingMixin.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.node.mixin.api 2 | 3 | import androidx.lifecycle.LiveData 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | 6 | interface NodeListingMixin { 7 | 8 | fun groupedNodeModelsLiveData(chainId: ChainId): LiveData> 9 | } 10 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/node/model/NodeHeaderModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.node.model 2 | 3 | data class NodeHeaderModel( 4 | val title: String 5 | ) 6 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/node/model/NodeModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.node.model 2 | 3 | data class NodeModel( 4 | val name: String, 5 | val link: String, 6 | val isDefault: Boolean, 7 | val isActive: Boolean 8 | ) 9 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/java/jp/co/soramitsu/account/impl/presentation/view/advanced/encryption/model/CryptoTypeModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.account.impl.presentation.view.advanced.encryption.model 2 | 3 | import jp.co.soramitsu.core.models.CryptoType 4 | 5 | data class CryptoTypeModel( 6 | val name: String, 7 | val cryptoType: CryptoType 8 | ) 9 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/anim/shake.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/drawable/bg_add_account.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/drawable/bg_mnemonic_container.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/drawable/bg_mnemonic_word_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/drawable/bg_mnemonic_word_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/drawable/ic_pincode_indicator_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/drawable/ic_pincode_indicator_filled.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/layout/view_mnemonic_container.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /feature-account-impl/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 14dp 4 | 12dp 5 | 14dp 6 | 2dp 7 | 25sp 8 | 2dp 9 | 24dp 10 | -------------------------------------------------------------------------------- /feature-crowdloan-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-crowdloan-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-crowdloan-api/src/main/java/jp/co/soramitsu/crowdloan/api/data/network/blockhain/binding/FundIndex.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.api.data.network.blockhain.binding 2 | 3 | import java.math.BigInteger 4 | 5 | typealias FundIndex = BigInteger 6 | -------------------------------------------------------------------------------- /feature-crowdloan-api/src/main/java/jp/co/soramitsu/crowdloan/api/data/network/blockhain/binding/ParaId.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.api.data.network.blockhain.binding 2 | 3 | import java.math.BigInteger 4 | 5 | typealias ParaId = BigInteger 6 | -------------------------------------------------------------------------------- /feature-crowdloan-api/src/main/java/jp/co/soramitsu/crowdloan/api/di/Crowdloan.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.api.di 2 | 3 | import javax.inject.Qualifier 4 | 5 | @Qualifier 6 | @Retention(AnnotationRetention.BINARY) 7 | annotation class Crowdloan 8 | -------------------------------------------------------------------------------- /feature-crowdloan-api/src/main/java/jp/co/soramitsu/crowdloan/api/di/CrowdloanFeatureApi.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.api.di 2 | 3 | import jp.co.soramitsu.crowdloan.api.data.repository.CrowdloanRepository 4 | 5 | interface CrowdloanFeatureApi { 6 | 7 | fun repository(): CrowdloanRepository 8 | } 9 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /coverage -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/acala/AcalaContributeRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.acala 2 | 3 | import java.math.BigInteger 4 | 5 | class AcalaContributeRequest( 6 | val address: String, 7 | val amount: BigInteger, 8 | val signature: String, 9 | val referral: String?, 10 | val email: String?, 11 | val receiveEmail: Boolean? 12 | ) 13 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/acala/AcalaContributeResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.acala 2 | 3 | import java.math.BigInteger 4 | 5 | class AcalaContributeResponse( 6 | val result: Boolean, 7 | val address: String, 8 | val email: String?, 9 | val referral: String?, 10 | val amount: BigInteger 11 | ) 12 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/acala/AcalaReferralCheck.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.acala 2 | 3 | class AcalaReferralCheck( 4 | val referral: String, 5 | val result: Boolean 6 | ) 7 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/acala/AcalaStatement.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.acala 2 | 3 | import jp.co.soramitsu.crowdloan.api.data.network.blockhain.binding.ParaId 4 | 5 | class AcalaStatement( 6 | val paraId: ParaId, 7 | val statementMsgHash: String, 8 | val statement: String, 9 | val proxyAddress: String 10 | ) 11 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/acala/AcalaTransferRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.acala 2 | 3 | import java.math.BigInteger 4 | 5 | class AcalaTransferRequest( 6 | val address: String, 7 | val amount: BigInteger, 8 | val referral: String?, 9 | val email: String?, 10 | val receiveEmail: Boolean? 11 | ) 12 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/bifrost/BifrostReferralCheckRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.bifrost 2 | 3 | class BifrostReferralCheckRequest(code: String) { 4 | val query = """ 5 | { 6 | getAccountByInvitationCode(code: "$code") { 7 | account 8 | } 9 | } 10 | """.trimIndent() 11 | } 12 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/bifrost/GetAccountByReferralCodeResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.bifrost 2 | 3 | class GetAccountByReferralCodeResponse( 4 | val getAccountByInvitationCode: GetAccountByReferralCode 5 | ) { 6 | 7 | class GetAccountByReferralCode(val account: String?) 8 | } 9 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/karura/KaruraStatement.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.karura 2 | 3 | class KaruraStatement( 4 | val statement: String 5 | ) 6 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/karura/ReferralCheck.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.karura 2 | 3 | class ReferralCheck( 4 | val result: Boolean 5 | ) 6 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/karura/VerifyKaruraParticipationRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.karura 2 | 3 | import java.math.BigInteger 4 | 5 | class VerifyKaruraParticipationRequest( 6 | val address: String, 7 | val amount: BigInteger, 8 | val referral: String, 9 | val signature: String 10 | ) 11 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/moonbeam/RemarkStoreRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.moonbeam 2 | 3 | class RemarkStoreRequest( 4 | val address: String, 5 | val signedMessage: String 6 | ) 7 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/moonbeam/RemarkStoreResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.moonbeam 2 | 3 | class RemarkStoreResponse( 4 | val address: String, 5 | val signedMessage: String, 6 | val remark: String 7 | ) 8 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/moonbeam/RemarkVerifyRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.moonbeam 2 | 3 | class RemarkVerifyRequest( 4 | val address: String, 5 | val blockHash: String, 6 | val extrinsicHash: String 7 | ) 8 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/moonbeam/RemarkVerifyResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.moonbeam 2 | 3 | class RemarkVerifyResponse( 4 | val address: String, 5 | val blockHash: String, 6 | val extrinsicHash: String, 7 | val verified: Boolean 8 | ) 9 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/moonbeam/SignatureRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.moonbeam 2 | 3 | class SignatureRequest( 4 | val address: String, 5 | val contribution: String, 6 | val previousTotalContribution: String, 7 | val guid: String 8 | ) 9 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/moonbeam/SignatureResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.moonbeam 2 | 3 | class SignatureResponse( 4 | val address: String, 5 | val contribution: String, 6 | val previousTotalContribution: String, 7 | val signature: String, 8 | val timeStamp: String, 9 | val guid: String 10 | ) 11 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/moonbeam/VerifyCheckResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.moonbeam 2 | 3 | class VerifyCheckResponse( 4 | val verified: Boolean 5 | ) 6 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/data/network/api/parachain/ParachainMetadataApi.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.data.network.api.parachain 2 | 3 | import retrofit2.http.GET 4 | import retrofit2.http.Url 5 | 6 | interface ParachainMetadataApi { 7 | 8 | @GET 9 | suspend fun getParachainMetadata( 10 | @Url url: String 11 | ): List 12 | } 13 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/di/validations/CrowdloansValidationsModule.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.di.validations 2 | 3 | import dagger.Module 4 | import dagger.hilt.InstallIn 5 | import dagger.hilt.components.SingletonComponent 6 | 7 | @InstallIn(SingletonComponent::class) 8 | @Module( 9 | includes = [ 10 | ContributeValidationsModule::class 11 | ] 12 | ) 13 | class CrowdloansValidationsModule 14 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/domain/common/LeaseIndexFromBlock.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.domain.common 2 | 3 | import java.math.BigInteger 4 | 5 | fun leaseIndexFromBlock(block: BigInteger, blocksPerLeasePeriod: BigInteger, leaseOffset: BigInteger) = (block - leaseOffset) / blocksPerLeasePeriod 6 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/presentation/contribute/confirm/model/LeasePeriodModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.presentation.contribute.confirm.model 2 | 3 | class LeasePeriodModel( 4 | val leasePeriod: String, 5 | val leasedUntil: String 6 | ) 7 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/presentation/contribute/custom/referral/ReferralCodePayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.presentation.contribute.custom.referral 2 | 3 | import jp.co.soramitsu.crowdloan.impl.presentation.contribute.custom.BonusPayload 4 | 5 | interface ReferralCodePayload : BonusPayload { 6 | 7 | val referralCode: String 8 | } 9 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/presentation/contribute/select/model/CrowdloanDetailsModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.presentation.contribute.select.model 2 | 3 | class CrowdloanDetailsModel( 4 | val leasePeriod: String, 5 | val leasedUntil: String, 6 | val raised: String, 7 | val raisedPercentage: String, 8 | val timeLeft: String 9 | ) 10 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/main/java/jp/co/soramitsu/crowdloan/impl/presentation/contribute/select/model/LearnMoreModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan.impl.presentation.contribute.select.model 2 | 3 | class LearnMoreModel( 4 | val iconLink: String, 5 | val text: String 6 | ) 7 | -------------------------------------------------------------------------------- /feature-crowdloan-impl/src/test/java/jp/co/soramitsu/crowdloan/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.crowdloan 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /feature-liquiditypools-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-liquiditypools-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-liquiditypools-api/src/main/java/jp/co/soramitsu/liquiditypools/data/DemeterFarmingRepository.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.liquiditypools.data 2 | 3 | import jp.co.soramitsu.liquiditypools.domain.DemeterFarmingPool 4 | 5 | interface DemeterFarmingRepository { 6 | suspend fun getFarmedPools(chainId: String): List? 7 | } 8 | -------------------------------------------------------------------------------- /feature-liquiditypools-api/src/main/java/jp/co/soramitsu/liquiditypools/data/LiquidityData.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.liquiditypools.data 2 | 3 | import java.math.BigDecimal 4 | 5 | data class LiquidityData( 6 | val firstReserves: BigDecimal = BigDecimal.ZERO, 7 | val secondReserves: BigDecimal = BigDecimal.ZERO, 8 | val firstPooled: BigDecimal = BigDecimal.ZERO, 9 | val secondPooled: BigDecimal = BigDecimal.ZERO, 10 | val sbApy: Double? = null, 11 | ) 12 | -------------------------------------------------------------------------------- /feature-liquiditypools-api/src/main/java/jp/co/soramitsu/liquiditypools/data/PoolDataDto.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.liquiditypools.data 2 | 3 | import java.math.BigInteger 4 | 5 | data class PoolDataDto( 6 | val baseAssetId: String, 7 | val assetId: String, 8 | val reservesFirst: BigInteger, 9 | val reservesSecond: BigInteger, 10 | val totalIssuance: BigInteger, 11 | val poolProvidersBalance: BigInteger, 12 | val reservesAccount: String, 13 | ) 14 | -------------------------------------------------------------------------------- /feature-liquiditypools-api/src/main/java/jp/co/soramitsu/liquiditypools/domain/interfaces/DemeterFarmingInteractor.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.liquiditypools.domain.interfaces 2 | 3 | import jp.co.soramitsu.liquiditypools.domain.DemeterFarmingPool 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | 6 | interface DemeterFarmingInteractor { 7 | suspend fun getFarmedPools(chainId: ChainId): List? 8 | } 9 | -------------------------------------------------------------------------------- /feature-liquiditypools-api/src/main/java/jp/co/soramitsu/liquiditypools/navigation/LiquidityPoolsRouter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.liquiditypools.navigation 2 | 3 | interface LiquidityPoolsRouter { 4 | 5 | fun back() 6 | } 7 | -------------------------------------------------------------------------------- /feature-liquiditypools-api/src/main/java/jp/co/soramitsu/liquiditypools/navigation/NavAction.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.liquiditypools.navigation 2 | 3 | sealed interface NavAction { 4 | data object BackPressed : NavAction 5 | 6 | class ShowError( 7 | val errorTitle: String?, 8 | val errorText: String 9 | ) : NavAction 10 | 11 | class ShowInfo( 12 | val title: String, 13 | val message: String 14 | ) : NavAction 15 | 16 | data object SupplyLiquidityCompleted : NavAction 17 | } 18 | -------------------------------------------------------------------------------- /feature-liquiditypools-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-liquiditypools-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /feature-nft-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-nft-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-nft-api/src/main/java/jp/co/soramitsu/nft/data/models/Contract.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.nft.data.models 2 | 3 | class Contract( 4 | val address: String?, 5 | ) { 6 | companion object; 7 | } 8 | -------------------------------------------------------------------------------- /feature-nft-api/src/main/java/jp/co/soramitsu/nft/data/models/TokenId.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.nft.data.models 2 | 3 | class TokenId( 4 | val tokenId: String?, 5 | val tokenMetadata: TokenMetadata? 6 | ) { 7 | companion object; 8 | 9 | class TokenMetadata( 10 | val tokenType: String?, 11 | ) { 12 | companion object; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /feature-nft-api/src/main/java/jp/co/soramitsu/nft/data/pagination/PagedResponse.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.nft.data.pagination 2 | 3 | class PagedResponse( 4 | val tag: Any, 5 | val request: PageBackStack.Request, 6 | val result: Result> 7 | ) { 8 | fun updateResult(result: Result>): PagedResponse = 9 | PagedResponse(tag, request, result) 10 | } 11 | -------------------------------------------------------------------------------- /feature-nft-api/src/main/java/jp/co/soramitsu/nft/data/pagination/PaginationRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.nft.data.pagination 2 | 3 | sealed interface PaginationRequest { 4 | 5 | @JvmInline 6 | value class Start(val pageLimit: Int) : PaginationRequest 7 | 8 | object ProceedFromLastPage : PaginationRequest 9 | 10 | object Prev : PaginationRequest 11 | 12 | @JvmInline 13 | value class Next(val pageLimit: Int) : PaginationRequest 14 | } 15 | -------------------------------------------------------------------------------- /feature-nft-api/src/main/java/jp/co/soramitsu/nft/domain/models/NFTFilter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.nft.domain.models 2 | 3 | enum class NFTFilter { 4 | AirDrops 5 | } 6 | -------------------------------------------------------------------------------- /feature-nft-api/src/main/java/jp/co/soramitsu/nft/navigation/NFTRouter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.nft.navigation 2 | 3 | interface NFTRouter { 4 | 5 | fun back() 6 | } 7 | -------------------------------------------------------------------------------- /feature-nft-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-nft-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /feature-onboarding-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-onboarding-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-onboarding-api/src/main/java/jp/co/soramitsu/onboarding/api/data/OnboardingRepository.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.onboarding.api.data 2 | 3 | interface OnboardingRepository { 4 | 5 | suspend fun getConfig(): Result 6 | 7 | } -------------------------------------------------------------------------------- /feature-onboarding-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /coverage -------------------------------------------------------------------------------- /feature-onboarding-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /feature-onboarding-impl/src/main/java/jp/co/soramitsu/onboarding/impl/data/OnboardingConfigApi.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.onboarding.impl.data 2 | 3 | import jp.co.soramitsu.feature_onboarding_impl.BuildConfig 4 | import jp.co.soramitsu.onboarding.api.data.OnboardingConfig 5 | import retrofit2.http.GET 6 | 7 | interface OnboardingConfigApi { 8 | 9 | @GET(BuildConfig.ONBOARDING_CONFIG) 10 | suspend fun getConfig(): OnboardingConfig 11 | 12 | } -------------------------------------------------------------------------------- /feature-onboarding-impl/src/main/java/jp/co/soramitsu/onboarding/impl/welcome/WelcomeFragmentPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.onboarding.impl.welcome 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.account.api.presentation.account.create.ChainAccountCreatePayload 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class WelcomeFragmentPayload( 9 | val displayBack: Boolean, 10 | val createChainAccount: ChainAccountCreatePayload?, 11 | val route: String? = null 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /feature-onboarding-impl/src/test/java/jp/co/soramitsu/onboarding/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.onboarding 2 | 3 | import org.junit.Assert.assertEquals 4 | import org.junit.Test 5 | 6 | /** 7 | * Example local unit test, which will execute on the development machine (host). 8 | * 9 | * See [testing documentation](http://d.android.com/tools/testing). 10 | */ 11 | class ExampleUnitTest { 12 | @Test 13 | fun addition_isCorrect() { 14 | assertEquals(4, 2 + 2) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /feature-polkaswap-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-polkaswap-api/src/main/kotlin/jp/co/soramitsu/polkaswap/api/domain/PathUnavailableException.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.polkaswap.api.domain 2 | 3 | class PathUnavailableException : Exception() 4 | class InsufficientLiquidityException : Exception() 5 | -------------------------------------------------------------------------------- /feature-polkaswap-api/src/main/kotlin/jp/co/soramitsu/polkaswap/api/domain/models/SwapDetails.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.polkaswap.api.domain.models 2 | 3 | import java.math.BigDecimal 4 | import jp.co.soramitsu.wallet.impl.domain.model.Asset 5 | 6 | data class SwapDetails( 7 | val amount: BigDecimal, 8 | val minMax: BigDecimal, 9 | val fromTokenOnToToken: BigDecimal, 10 | val toTokenOnFromToken: BigDecimal, 11 | val feeAsset: Asset, 12 | val bestDexId: Int, 13 | val route: String? 14 | ) 15 | -------------------------------------------------------------------------------- /feature-polkaswap-api/src/main/kotlin/jp/co/soramitsu/polkaswap/api/models/WithDesired.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.polkaswap.api.models 2 | 3 | /* 4 | If user inputs amount into "from" field - we use the "INPUT" one 5 | If user inputs amount into "to" field - we use the "OUTPUT" one 6 | backString used in the rpc call liquidityProxy_quote SwapVariant parameter 7 | */ 8 | enum class WithDesired(val backString: String) { 9 | INPUT("WithDesiredInput"), 10 | OUTPUT("WithDesiredOutput") 11 | } 12 | -------------------------------------------------------------------------------- /feature-polkaswap-api/src/main/kotlin/jp/co/soramitsu/polkaswap/api/presentation/models/TransactionSettingsModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.polkaswap.api.presentation.models 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.polkaswap.api.models.Market 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class TransactionSettingsModel(val market: Market, val slippageTolerance: Double) : Parcelable 9 | -------------------------------------------------------------------------------- /feature-polkaswap-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-soracard-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-soracard-api/src/main/kotlin/jp/co/soramitsu/soracard/api/presentation/SoraCardRouter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.soracard.api.presentation 2 | 3 | interface SoraCardRouter { 4 | fun back() 5 | 6 | fun openSwapTokensScreen(chainId: String?, assetIdFrom: String?, assetIdTo: String?) 7 | 8 | fun showBuyCrypto() 9 | 10 | fun openWebViewer(title: String, url: String) 11 | } 12 | -------------------------------------------------------------------------------- /feature-soracard-api/src/main/kotlin/jp/co/soramitsu/soracard/api/util/SoraCardOptions.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.soracard.api.util 2 | 3 | object SoraCardOptions { 4 | const val euroSign = '€' 5 | const val soracard = "2.2.4" 6 | const val soracardFiatPackageTest = "com.soracard.wallet.iban.test" 7 | const val soracardFiatPackageProd = "com.soracard.wallet.iban" 8 | } 9 | -------------------------------------------------------------------------------- /feature-soracard-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-soracard-impl/src/main/kotlin/jp/co/soramitsu/soracard/impl/presentation/buycrypto/BuyCryptoState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.soracard.impl.presentation.buycrypto 2 | 3 | data class BuyCryptoState( 4 | val loading: Boolean = true, 5 | val script: String = "" 6 | ) 7 | -------------------------------------------------------------------------------- /feature-splash/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /feature-splash/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /feature-splash/src/main/java/jp/co/soramitsu/splash/SplashRouter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.splash 2 | 3 | import jp.co.soramitsu.common.navigation.SecureRouter 4 | 5 | interface SplashRouter : SecureRouter { 6 | 7 | fun openOnboarding() 8 | } 9 | -------------------------------------------------------------------------------- /feature-splash/src/main/res/layout/fragment_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /feature-staking-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-staking-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/di/Staking.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.di 2 | 3 | import javax.inject.Qualifier 4 | 5 | @Qualifier 6 | @Retention(AnnotationRetention.BINARY) 7 | annotation class Staking 8 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/di/StakingFeatureApi.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.di 2 | 3 | import jp.co.soramitsu.staking.api.domain.api.StakingRepository 4 | 5 | interface StakingFeatureApi { 6 | 7 | fun repository(): StakingRepository 8 | } 9 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/api/AccountIdMap.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.api 2 | 3 | typealias AccountIdMap = Map 4 | typealias AccountAddressMap = Map 5 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/model/AtStake.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.model 2 | 3 | import java.math.BigInteger 4 | 5 | class AtStake( 6 | val bond: BigInteger, 7 | val total: BigInteger, 8 | val delegations: List> 9 | ) 10 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/model/BlockNumber.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.model 2 | 3 | import java.math.BigInteger 4 | 5 | typealias BlockNumber = BigInteger 6 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/model/EraIndex.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.model 2 | 3 | import java.math.BigInteger 4 | 5 | typealias EraIndex = BigInteger 6 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/model/Nominations.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.model 2 | 3 | import jp.co.soramitsu.shared_utils.runtime.AccountId 4 | 5 | class Nominations( 6 | val targets: List, 7 | val submittedInEra: EraIndex, 8 | val suppressed: Boolean 9 | ) 10 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/model/RewardDestination.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.model 2 | 3 | import jp.co.soramitsu.shared_utils.runtime.AccountId 4 | 5 | sealed class RewardDestination { 6 | 7 | object Restake : RewardDestination() 8 | 9 | class Payout(val targetAccountId: AccountId) : RewardDestination() 10 | } 11 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/model/Round.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.model 2 | 3 | import java.math.BigInteger 4 | 5 | data class Round( 6 | val current: BigInteger, 7 | val first: BigInteger, 8 | val length: BigInteger 9 | ) 10 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/model/SlashingSpans.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.model 2 | 3 | class SlashingSpans( 4 | val lastNonZeroSlash: EraIndex, 5 | val prior: List 6 | ) 7 | -------------------------------------------------------------------------------- /feature-staking-api/src/main/java/jp/co/soramitsu/staking/api/domain/model/StakingAccount.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.api.domain.model 2 | 3 | class StakingAccount( 4 | val address: String, 5 | val name: String?, 6 | val isEthereumBased: Boolean 7 | ) 8 | -------------------------------------------------------------------------------- /feature-staking-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /coverage -------------------------------------------------------------------------------- /feature-staking-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/model/Payout.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.model 2 | 3 | import java.math.BigInteger 4 | 5 | data class Payout( 6 | val validatorAddress: String, 7 | val era: BigInteger, 8 | val amount: BigInteger 9 | ) 10 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/model/PoolMember.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.model 2 | 3 | import java.math.BigInteger 4 | 5 | data class PoolMember( 6 | val poolId: BigInteger, 7 | // bonded amount 8 | val points: BigInteger, 9 | val lastRecordedRewardCounter: BigInteger, 10 | val unbondingEras: List 11 | ) 12 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/model/PoolRewards.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.model 2 | 3 | import java.math.BigInteger 4 | 5 | data class PoolRewards( 6 | val lastRecordedRewardCounter: BigInteger, 7 | val lastRecordedTotalPayouts: BigInteger, 8 | val totalRewardsClaimed: BigInteger 9 | ) 10 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/model/PoolUnbonding.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.model 2 | 3 | import java.math.BigInteger 4 | 5 | data class PoolUnbonding( 6 | val era: BigInteger, 7 | val amount: BigInteger 8 | ) 9 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/network/blockhain/bindings/BindBlockNumber.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.network.blockhain.bindings 2 | 3 | import jp.co.soramitsu.common.data.network.runtime.binding.HelperBinding 4 | import jp.co.soramitsu.common.data.network.runtime.binding.cast 5 | import jp.co.soramitsu.staking.api.domain.model.BlockNumber 6 | 7 | @HelperBinding 8 | fun bindBlockNumber(dynamicInstance: Any?): BlockNumber { 9 | return dynamicInstance.cast() 10 | } 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/network/subquery/request/GiantsquidRewardAmountRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.network.subquery.request 2 | 3 | class GiantsquidRewardAmountRequest(accountId: String) { 4 | val query = """ 5 | query MyQuery { 6 | stakingRewards(where: {account: {publicKey_eq: "$accountId"}}) { 7 | amount 8 | validatorId 9 | account { 10 | id 11 | publicKey 12 | } 13 | } 14 | } 15 | """.trimIndent() 16 | } 17 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/network/subquery/request/StakingLastRoundIdRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.network.subquery.request 2 | 3 | class StakingLastRoundIdRequest { 4 | val query = """ 5 | query { 6 | rounds(last: 1) { 7 | nodes { 8 | id 9 | } 10 | } 11 | } 12 | """.trimIndent() 13 | } 14 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/network/subquery/request/SubsquidCollatorsApyRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.network.subquery.request 2 | 3 | class SubsquidCollatorsApyRequest { 4 | val query = """ 5 | query MyQuery { 6 | stakers(where: {role_eq: "collator"}) { 7 | stashId 8 | apr24h 9 | } 10 | } 11 | """.trimIndent() 12 | } 13 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/network/subquery/request/SubsquidLastRoundIdRequest.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.network.subquery.request 2 | 3 | class SubsquidLastRoundIdRequest { 4 | val query = """ 5 | query MyQuery { 6 | rounds(orderBy: index_DESC, limit: 1) { 7 | id 8 | } 9 | } 10 | """.trimIndent() 11 | } 12 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/data/repository/datasource/StakingStoriesDataSource.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.data.repository.datasource 2 | 3 | import jp.co.soramitsu.common.domain.model.StoryGroup 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface StakingStoriesDataSource { 7 | 8 | fun getStoriesFlow(): Flow> 9 | } 10 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/common/IsWaiting.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.common 2 | 3 | import java.math.BigInteger 4 | import jp.co.soramitsu.staking.api.domain.model.Nominations 5 | 6 | fun Nominations.isWaiting(activeEraIndex: BigInteger): Boolean { 7 | return submittedInEra >= activeEraIndex 8 | } 9 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/error/AccountIdNotFound.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.error 2 | 3 | fun accountIdNotFound(accountIdHex: String): Nothing = error("Target with account id $accountIdHex was not found") 4 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/model/TotalReward.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.model 2 | 3 | import java.math.BigInteger 4 | 5 | typealias TotalReward = BigInteger 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/recommendations/BlockCreatorRecommendator.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.recommendations 2 | 3 | import jp.co.soramitsu.staking.impl.domain.recommendations.settings.RecommendationSettings 4 | 5 | interface BlockCreatorRecommendator { 6 | suspend fun recommendations(settings: RecommendationSettings): List 7 | } 8 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/recommendations/BlockCreatorsRecommendatorFactory.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.recommendations 2 | 3 | import androidx.lifecycle.Lifecycle 4 | 5 | interface BlockCreatorsRecommendatorFactory { 6 | suspend fun awaitBlockCreatorsLoading(lifecycle: Lifecycle) 7 | suspend fun create(lifecycle: Lifecycle): BlockCreatorRecommendator 8 | } 9 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/recommendations/settings/Error.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.recommendations.settings 2 | 3 | fun noValidatorPrefs(accountIdHex: String): Nothing = throw IllegalStateException("Sorting/Filtering validator $accountIdHex with no prefs") 4 | 5 | fun notElected(accountIdHex: String): Nothing = throw IllegalStateException("Sorting/Filtering not elected validator $accountIdHex") 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/rewards/RewardCalculationTarget.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.rewards 2 | 3 | import java.math.BigDecimal 4 | import java.math.BigInteger 5 | import jp.co.soramitsu.staking.api.domain.model.IndividualExposure 6 | 7 | class RewardCalculationTarget( 8 | val accountIdHex: String, 9 | val totalStake: BigInteger, 10 | val ownStake: BigInteger, 11 | val nominatorStakes: List, 12 | val commission: BigDecimal 13 | ) 14 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/staking/redeem/RedeemConsequences.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.staking.redeem 2 | 3 | class RedeemConsequences( 4 | val willKillStash: Boolean, 5 | val hash: String 6 | ) 7 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/balance/ManageStakingValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.balance 2 | 3 | sealed class ManageStakingValidationFailure { 4 | 5 | class UnbondingRequestLimitReached(val limit: Int) : ManageStakingValidationFailure() 6 | 7 | class ControllerRequired(val controllerAddress: String) : ManageStakingValidationFailure() 8 | 9 | class StashRequired(val stashAddress: String) : ManageStakingValidationFailure() 10 | } 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/balance/ManageStakingValidationPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.balance 2 | 3 | import jp.co.soramitsu.staking.api.domain.model.StakingState 4 | 5 | class ManageStakingValidationPayload( 6 | val stashState: StakingState.Stash? 7 | ) 8 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/bond/BondMoreValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.bond 2 | 3 | enum class BondMoreValidationFailure { 4 | NOT_ENOUGH_TO_PAY_FEES, ZERO_BOND 5 | } 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/bond/BondMoreValidationPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.bond 2 | 3 | import jp.co.soramitsu.core.models.Asset 4 | import java.math.BigDecimal 5 | 6 | class BondMoreValidationPayload( 7 | val stashAddress: String, 8 | val fee: BigDecimal, 9 | val amount: BigDecimal, 10 | val chainAsset: Asset 11 | ) 12 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/controller/SetControllerValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.controller 2 | 3 | enum class SetControllerValidationFailure { 4 | NOT_ENOUGH_TO_PAY_FEES, ALREADY_CONTROLLER, ZERO_CONTROLLER_BALANCE 5 | } 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/controller/SetControllerValidationPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.controller 2 | 3 | import java.math.BigDecimal 4 | 5 | class SetControllerValidationPayload( 6 | val stashAddress: String, 7 | val controllerAddress: String, 8 | val fee: BigDecimal, 9 | val transferable: BigDecimal 10 | ) 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/payout/PayoutFeeValidation.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.payout 2 | 3 | import jp.co.soramitsu.wallet.impl.domain.validation.EnoughToPayFeesValidation 4 | 5 | typealias PayoutFeeValidation = EnoughToPayFeesValidation 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/payout/PayoutValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.payout 2 | 3 | sealed class PayoutValidationFailure { 4 | object CannotPayFee : PayoutValidationFailure() 5 | 6 | object UnprofitablePayout : PayoutValidationFailure() 7 | } 8 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/rebond/RebondValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.rebond 2 | 3 | enum class RebondValidationFailure { 4 | NOT_ENOUGH_UNBONDINGS, CANNOT_PAY_FEE, ZERO_AMOUNT 5 | } 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/rebond/RebondValidationPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.rebond 2 | 3 | import jp.co.soramitsu.wallet.impl.domain.model.Asset 4 | import java.math.BigDecimal 5 | 6 | class RebondValidationPayload( 7 | val controllerAsset: Asset, 8 | val fee: BigDecimal, 9 | val rebondAmount: BigDecimal 10 | ) 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/reedeem/Declarations.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.reedeem 2 | 3 | import jp.co.soramitsu.common.validation.ValidationSystem 4 | import jp.co.soramitsu.wallet.impl.domain.validation.EnoughToPayFeesValidation 5 | 6 | typealias RedeemFeeValidation = EnoughToPayFeesValidation 7 | 8 | typealias RedeemValidationSystem = ValidationSystem 9 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/reedeem/RedeemValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.reedeem 2 | 3 | enum class RedeemValidationFailure { 4 | CANNOT_PAY_FEES 5 | } 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/reedeem/RedeemValidationPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.reedeem 2 | 3 | import jp.co.soramitsu.wallet.impl.domain.model.Asset 4 | import java.math.BigDecimal 5 | 6 | class RedeemValidationPayload( 7 | val fee: BigDecimal, 8 | val asset: Asset, 9 | val collatorAddress: String? = null 10 | ) 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/rewardDestination/RewardDestinationValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.rewardDestination 2 | 3 | sealed class RewardDestinationValidationFailure { 4 | object CannotPayFees : RewardDestinationValidationFailure() 5 | 6 | class MissingController(val controllerAddress: String) : RewardDestinationValidationFailure() 7 | } 8 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/rewardDestination/RewardDestinationValidationPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.rewardDestination 2 | 3 | import jp.co.soramitsu.staking.api.domain.model.StakingState 4 | import java.math.BigDecimal 5 | 6 | class RewardDestinationValidationPayload( 7 | val availableControllerBalance: BigDecimal, 8 | val fee: BigDecimal, 9 | val stashState: StakingState.Stash 10 | ) 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/setup/SetupStakingPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.setup 2 | 3 | import jp.co.soramitsu.wallet.impl.domain.model.Asset 4 | import java.math.BigDecimal 5 | 6 | class SetupStakingPayload( 7 | val bondAmount: BigDecimal?, 8 | val maxFee: BigDecimal, 9 | val asset: Asset, 10 | val controllerAddress: String, 11 | val isAlreadyNominating: Boolean 12 | ) 13 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/setup/SetupStakingValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.setup 2 | 3 | import java.math.BigDecimal 4 | 5 | sealed class SetupStakingValidationFailure { 6 | object CannotPayFee : SetupStakingValidationFailure() 7 | 8 | class TooSmallAmount(val threshold: BigDecimal) : SetupStakingValidationFailure() 9 | 10 | object MaxNominatorsReached : SetupStakingValidationFailure() 11 | } 12 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/welcome/WelcomeStakingValidationFailure.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.welcome 2 | 3 | enum class WelcomeStakingValidationFailure { 4 | MAX_NOMINATORS_REACHED 5 | } 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/domain/validations/welcome/WelcomeStakingValidationPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.domain.validations.welcome 2 | 3 | class WelcomeStakingValidationPayload 4 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/common/rewardDestination/RewardDestinationEstimations.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.common.rewardDestination 2 | 3 | import jp.co.soramitsu.staking.impl.presentation.staking.main.model.RewardEstimation 4 | 5 | class RewardDestinationEstimations( 6 | val restake: RewardEstimation, 7 | val payout: RewardEstimation 8 | ) 9 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/mappers/MapNominatorToNominatorParcelModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.mappers 2 | 3 | import jp.co.soramitsu.staking.api.domain.model.IndividualExposure 4 | import jp.co.soramitsu.staking.impl.presentation.validators.parcel.NominatorParcelModel 5 | 6 | fun mapNominatorToNominatorParcelModel(nominator: IndividualExposure): NominatorParcelModel { 7 | return with(nominator) { 8 | NominatorParcelModel(who, value) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/payouts/detail/PayoutDetailsModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.payouts.detail 2 | 3 | import jp.co.soramitsu.common.address.AddressModel 4 | 5 | class PayoutDetailsModel( 6 | val validatorAddressModel: AddressModel, 7 | val createdAt: Long, 8 | val eraDisplay: String, 9 | val reward: String, 10 | val rewardFiat: String? 11 | ) 12 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/staking/alerts/model/AlertModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.staking.alerts.model 2 | 3 | import androidx.annotation.DrawableRes 4 | 5 | class AlertModel( 6 | @DrawableRes val icon: Int, 7 | val title: String, 8 | val extraMessage: String, 9 | val type: Type 10 | ) { 11 | sealed class Type { 12 | object Info : Type() 13 | 14 | class CallToAction(val action: () -> Unit) : Type() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/staking/balance/model/StakingBalanceModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.staking.balance.model 2 | 3 | import jp.co.soramitsu.wallet.api.presentation.model.AmountModel 4 | 5 | class StakingBalanceModel( 6 | val staked: AmountModel, 7 | val unstaking: AmountModel, 8 | val redeemable: AmountModel 9 | ) 10 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/staking/balance/rebond/RebondKind.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.staking.balance.rebond 2 | 3 | enum class RebondKind { 4 | ALL, LAST, CUSTOM 5 | } 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/staking/main/model/RewardEstimation.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.staking.main.model 2 | 3 | data class RewardEstimation( 4 | val amount: String, 5 | val fiatAmount: String?, 6 | val gain: String 7 | ) 8 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/staking/rebond/confirm/ConfirmRebondPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.staking.rebond.confirm 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | import java.math.BigDecimal 6 | 7 | @Parcelize 8 | class ConfirmRebondPayload( 9 | val amount: BigDecimal, 10 | val collatorAddress: String? 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/staking/rewardDestination/confirm/parcel/ConfirmRewardDestinationPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.staking.rewardDestination.confirm.parcel 2 | 3 | import android.os.Parcelable 4 | import java.math.BigDecimal 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class ConfirmRewardDestinationPayload( 9 | val fee: BigDecimal, 10 | val rewardDestination: RewardDestinationParcelModel 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/staking/unbond/confirm/ConfirmUnbondPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.staking.unbond.confirm 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | import java.math.BigDecimal 6 | 7 | @Parcelize 8 | class ConfirmUnbondPayload( 9 | val amount: BigDecimal, 10 | val fee: BigDecimal, 11 | val collatorAddress: String? 12 | ) : Parcelable 13 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/staking/unbond/select/SelectUnbondPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.staking.unbond.select 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | class SelectUnbondPayload( 8 | val collatorAddress: String?, 9 | val oneScreenConfirmation: Boolean = false 10 | ) : Parcelable 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/FindSelectedValidator.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.validators 2 | 3 | import jp.co.soramitsu.staking.api.domain.model.Validator 4 | import kotlinx.coroutines.Dispatchers 5 | import kotlinx.coroutines.withContext 6 | 7 | suspend fun List.findSelectedValidator(accountIdHex: String) = withContext(Dispatchers.Default) { 8 | firstOrNull { it.accountIdHex == accountIdHex } 9 | } 10 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/change/custom/review/model/ValidatorsSelectionState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.validators.change.custom.review.model 2 | 3 | import jp.co.soramitsu.common.view.ButtonState 4 | 5 | class ValidatorsSelectionState( 6 | val selectedHeaderText: String, 7 | val nextButtonText: String, 8 | val isOverflow: Boolean, 9 | val buttonState: ButtonState 10 | ) 11 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/change/custom/search/SearchBlockProducerModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.validators.change.custom.search 2 | 3 | import android.graphics.drawable.PictureDrawable 4 | 5 | data class SearchBlockProducerModel(val name: String, val address: String, val selected: Boolean, val rewardsPercent: String, val image: PictureDrawable) 6 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/change/custom/select/model/ContinueButtonState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.validators.change.custom.select.model 2 | 3 | class ContinueButtonState( 4 | val enabled: Boolean, 5 | val text: String 6 | ) 7 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/details/di/ValidatorDetailsModule.kt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/details/di/ValidatorDetailsModule.kt -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/details/model/NominatorModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.validators.details.model 2 | 3 | import java.math.BigInteger 4 | 5 | class NominatorModel( 6 | val who: ByteArray, 7 | val value: BigInteger 8 | ) 9 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/parcel/NominatorParcelModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.validators.parcel 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | import java.math.BigInteger 6 | 7 | @Parcelize 8 | class NominatorParcelModel( 9 | val who: ByteArray, 10 | val value: BigInteger 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/java/jp/co/soramitsu/staking/impl/presentation/validators/parcel/ValidatorPrefsParcelModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.staking.impl.presentation.validators.parcel 2 | 3 | import android.os.Parcelable 4 | import java.math.BigDecimal 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | class ValidatorPrefsParcelModel( 9 | val commission: BigDecimal, 10 | val isBlocked: Boolean 11 | ) : Parcelable -------------------------------------------------------------------------------- /feature-staking-impl/src/main/res/drawable/bg_grey_border_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/res/drawable/bg_grey_solid_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /feature-staking-impl/src/main/res/drawable/ic_basic_filterlist_24.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /feature-success-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-success-api/src/main/kotlin/jp/co/soramitsu/success/presentation/SuccessRouter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.success.presentation 2 | 3 | interface SuccessRouter { 4 | fun back() 5 | } 6 | -------------------------------------------------------------------------------- /feature-success-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-tonconnect-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-tonconnect-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-tonconnect-api/src/main/java/jp/co/soramitsu/tonconnect/api/model/AppEntity.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.tonconnect.api.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | data class AppEntity( 8 | val url: String, 9 | val name: String, 10 | val iconUrl: String, 11 | val termsOfUseUrl: String?, 12 | val privacyPolicyUrl: String? 13 | ) : Parcelable 14 | -------------------------------------------------------------------------------- /feature-tonconnect-api/src/main/java/jp/co/soramitsu/tonconnect/api/model/Base64.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.tonconnect.api.model 2 | 3 | import android.util.Base64 4 | import io.ktor.util.decodeBase64Bytes 5 | 6 | val String.base64: ByteArray 7 | get() = Base64.decode(this, Base64.DEFAULT) 8 | 9 | fun String.fixedBase64(): String { 10 | return this.trim().replace(" ", "+") 11 | } 12 | 13 | fun String.base64(): ByteArray { 14 | return fixedBase64().decodeBase64Bytes() 15 | } 16 | -------------------------------------------------------------------------------- /feature-tonconnect-api/src/main/java/jp/co/soramitsu/tonconnect/api/model/SSEvent.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.tonconnect.api.model 2 | 3 | import org.json.JSONObject 4 | 5 | data class SSEvent( 6 | val id: String?, 7 | val type: String?, 8 | val data: String 9 | ) { 10 | 11 | @Suppress("SwallowedException") 12 | val json: JSONObject by lazy { 13 | try { 14 | JSONObject(data) 15 | } catch (e: Throwable) { 16 | JSONObject() 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /feature-tonconnect-api/src/main/java/jp/co/soramitsu/tonconnect/api/model/TlbObject.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.tonconnect.api.model 2 | 3 | import jp.co.soramitsu.common.utils.safeParseCell 4 | import org.ton.tlb.TlbCodec 5 | import org.ton.tlb.TlbObject 6 | import org.ton.tlb.loadTlb 7 | 8 | inline fun String.toTlb(): T? { 9 | val boc = safeParseCell() ?: return null 10 | return boc.parse { loadTlb(T::class.java.getMethod("tlbCodec").invoke(null) as TlbCodec) } 11 | } 12 | -------------------------------------------------------------------------------- /feature-tonconnect-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-tonconnect-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-tonconnect-impl/src/main/java/jp/co/soramitsu/tonconnect/impl/presentation/dappscreen/BridgeMessage.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.tonconnect.impl.presentation.dappscreen 2 | 3 | import org.json.JSONObject 4 | 5 | abstract class BridgeMessage( 6 | val type: Type 7 | ) { 8 | 9 | enum class Type(val value: String) { 10 | InvokeRnFunc("invokeRnFunc"), 11 | FunctionResponse("functionResponse"), 12 | Event("event"), 13 | } 14 | 15 | abstract fun createJSON(): JSONObject 16 | } 17 | -------------------------------------------------------------------------------- /feature-tonconnect-impl/src/main/java/jp/co/soramitsu/tonconnect/impl/presentation/dappscreen/Cell.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.tonconnect.impl.presentation.dappscreen 2 | 3 | import io.ktor.util.encodeBase64 4 | import org.ton.boc.BagOfCells 5 | import org.ton.cell.Cell 6 | 7 | fun Cell.toByteArray(): ByteArray { 8 | return BagOfCells(this).toByteArray() 9 | } 10 | 11 | fun Cell.base64(): String { 12 | return toByteArray().encodeBase64() 13 | } 14 | -------------------------------------------------------------------------------- /feature-tonconnect-impl/src/main/java/jp/co/soramitsu/tonconnect/impl/presentation/discoverdapp/DappListType.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.tonconnect.impl.presentation.discoverdapp 2 | 3 | import androidx.annotation.StringRes 4 | import jp.co.soramitsu.common.compose.component.MultiToggleItem 5 | import jp.co.soramitsu.feature_wallet_impl.R 6 | 7 | enum class DappListType(@StringRes override val titleResId: Int) : MultiToggleItem { 8 | Discover(R.string.tc_discover_dapp), 9 | Connected(R.string.tc_connected_dapp) 10 | } 11 | -------------------------------------------------------------------------------- /feature-wallet-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-wallet-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/api/di/Wallet.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.api.di 2 | 3 | import javax.inject.Qualifier 4 | 5 | @Qualifier 6 | @Retention(AnnotationRetention.BINARY) 7 | annotation class Wallet 8 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/api/domain/AssetUseCase.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.api.domain 2 | 3 | import jp.co.soramitsu.wallet.impl.domain.model.Asset 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface AssetUseCase { 7 | 8 | fun currentAssetFlow(): Flow 9 | 10 | suspend fun availableAssetsToSelect(): List 11 | } 12 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/api/domain/ExistentialDepositUseCase.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.api.domain 2 | 3 | import jp.co.soramitsu.core.models.Asset 4 | import java.math.BigInteger 5 | 6 | interface ExistentialDepositUseCase { 7 | suspend operator fun invoke(chainAsset: Asset): BigInteger 8 | } 9 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/api/domain/model/XcmChainType.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.api.domain.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.parcelize.Parcelize 5 | 6 | @Parcelize 7 | enum class XcmChainType : Parcelable { 8 | Origin, Destination 9 | } 10 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/api/presentation/model/FeeModel.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.api.presentation.model 2 | 3 | import java.math.BigDecimal 4 | 5 | class FeeModel( 6 | val fee: BigDecimal, 7 | val displayToken: String, 8 | val displayFiat: String? 9 | ) 10 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/TokenUseCase.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain 2 | 3 | import jp.co.soramitsu.wallet.impl.domain.model.Token 4 | import kotlinx.coroutines.flow.Flow 5 | 6 | interface TokenUseCase { 7 | 8 | suspend fun currentToken(): Token 9 | 10 | fun currentTokenFlow(): Flow 11 | } 12 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/interfaces/AddressBookRepository.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.interfaces 2 | 3 | import jp.co.soramitsu.coredb.model.AddressBookContact 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | interface AddressBookRepository { 8 | 9 | suspend fun saveAddress(name: String, address: String, chainId: String) 10 | 11 | fun observeAddressBook(chainId: ChainId): Flow> 12 | } 13 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/interfaces/TokenRepository.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.interfaces 2 | 3 | import jp.co.soramitsu.core.models.Asset 4 | import jp.co.soramitsu.wallet.impl.domain.model.Token 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | interface TokenRepository { 8 | 9 | suspend fun getToken(chainAsset: Asset): Token 10 | 11 | fun observeToken(chainAsset: Asset): Flow 12 | } 13 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/interfaces/TransactionFilter.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.interfaces 2 | 3 | enum class TransactionFilter { 4 | EXTRINSIC, REWARD, TRANSFER 5 | } 6 | 7 | fun Set.allFiltersIncluded(): Boolean { 8 | return size == TransactionFilter.entries.size 9 | } 10 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/interfaces/WalletConstants.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.interfaces 2 | 3 | import jp.co.soramitsu.core.models.Asset 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | import java.math.BigInteger 6 | 7 | interface WalletConstants { 8 | 9 | suspend fun existentialDeposit(chainAsset: Asset): BigInteger? 10 | 11 | suspend fun tip(chainId: ChainId): BigInteger? 12 | } 13 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/model/AssetWithStatus.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.model 2 | 3 | data class AssetWithStatus( 4 | val asset: Asset, 5 | val hasAccount: Boolean, 6 | val hasChainAccount: Boolean 7 | ) 8 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/model/Fee.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.model 2 | 3 | import java.math.BigDecimal 4 | 5 | class Fee( 6 | val transferAmount: BigDecimal, 7 | val feeAmount: BigDecimal 8 | ) 9 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/model/OperationsPageChange.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.model 2 | 3 | import jp.co.soramitsu.common.data.model.CursorPage 4 | 5 | data class OperationsPageChange( 6 | val cursorPage: CursorPage, 7 | val accountChanged: Boolean 8 | ) 9 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/model/QrContentCBDC.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.model 2 | 3 | import android.os.Parcelable 4 | import java.math.BigDecimal 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class QrContentCBDC( 9 | val transactionAmount: BigDecimal, 10 | val transactionCurrencyCode: String, 11 | val description: String?, 12 | val name: String, 13 | val billNumber: String?, 14 | val recipientId: String 15 | ) : Parcelable 16 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/model/QrContentSora.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.model 2 | 3 | data class QrContentSora( 4 | //substrate:[user address]:[user public key]:[user name]:[token id]: 5 | val address: String, 6 | val publicKey: String, 7 | val userName: String, 8 | val tokenId: String, 9 | val amount: String? 10 | ) -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/model/RecipientSearchResult.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.model 2 | 3 | class RecipientSearchResult( 4 | val myAccounts: List, 5 | val contacts: List 6 | ) 7 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/model/WalletAccount.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.model 2 | 3 | class WalletAccount( 4 | val address: String, 5 | val name: String? 6 | ) 7 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/java/jp/co/soramitsu/wallet/impl/domain/validation/Producers.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.validation 2 | 3 | import jp.co.soramitsu.wallet.impl.domain.model.Token 4 | import java.math.BigDecimal 5 | 6 | typealias AmountProducer

= suspend (P) -> BigDecimal 7 | 8 | typealias TokenProducer

= suspend (P) -> Token 9 | -------------------------------------------------------------------------------- /feature-wallet-api/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /feature-wallet-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /coverage -------------------------------------------------------------------------------- /feature-wallet-impl/libs/pushpayment-core-sdk-2.0.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/feature-wallet-impl/libs/pushpayment-core-sdk-2.0.6.jar -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/data/buyToken/ExternalProvider.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.data.buyToken 2 | 3 | import android.content.Context 4 | import jp.co.soramitsu.wallet.impl.domain.model.BuyTokenRegistry 5 | 6 | interface ExternalProvider : BuyTokenRegistry.Provider> { 7 | 8 | companion object { 9 | const val REDIRECT_URL_BASE = "fearless://buy-success" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/data/network/blockchain/extrinsic/ExtrinsicBuilderExt.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.data.network.blockchain.extrinsic 2 | 3 | import jp.co.soramitsu.shared_utils.runtime.extrinsic.ExtrinsicBuilder 4 | 5 | 6 | fun ExtrinsicBuilder.remark(remark: String): ExtrinsicBuilder = call( 7 | moduleName = "System", 8 | callName = "remark", 9 | arguments = mapOf( 10 | "remark" to remark.toByteArray() 11 | ) 12 | ) -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/data/network/blockchain/updaters/PaymentUpdater.kt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/data/network/blockchain/updaters/PaymentUpdater.kt -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/data/network/phishing/PhishingApi.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.data.network.phishing 2 | 3 | import jp.co.soramitsu.feature_wallet_impl.BuildConfig 4 | import okhttp3.ResponseBody 5 | import retrofit2.http.GET 6 | import retrofit2.http.Streaming 7 | 8 | interface PhishingApi { 9 | 10 | @Streaming 11 | @GET(BuildConfig.SCAM_DETECTION_CONFIG) 12 | suspend fun getPhishingAddresses(): ResponseBody 13 | } 14 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/data/network/subquery/HistoryNotSupportedException.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.data.network.subquery 2 | 3 | class HistoryNotSupportedException : Exception() 4 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/domain/beacon/SignStatus.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.domain.beacon 2 | 3 | enum class SignStatus { 4 | APPROVED, DECLINED 5 | } 6 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/AssetPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation 2 | 3 | import android.os.Parcelable 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.ChainId 5 | import kotlinx.parcelize.Parcelize 6 | 7 | @Parcelize 8 | data class AssetPayload( 9 | val chainId: ChainId, 10 | val chainAssetId: String 11 | ) : Parcelable 12 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/balance/detail/AccountOptionsPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.balance.detail 2 | 3 | data class AccountOptionsPayload( 4 | val address: String, 5 | val supportClaim: Boolean, 6 | val isEthereum: Boolean 7 | ) -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/balance/list/model/AssetType.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.balance.list.model 2 | 3 | import androidx.annotation.StringRes 4 | import jp.co.soramitsu.common.compose.component.MultiToggleItem 5 | import jp.co.soramitsu.feature_wallet_impl.R 6 | 7 | enum class AssetType(@StringRes override val titleResId: Int) : MultiToggleItem { 8 | Currencies(R.string.currencies_stub_text), 9 | NFTs(R.string.nfts_stub) 10 | } 11 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/balance/searchAssets/SearchAssetState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.balance.searchAssets 2 | 3 | import jp.co.soramitsu.wallet.impl.presentation.balance.list.AssetsLoadingState 4 | import jp.co.soramitsu.wallet.impl.presentation.common.AssetListState 5 | 6 | data class SearchAssetState( 7 | override val assets: AssetsLoadingState = AssetsLoadingState.Loading(), 8 | val searchQuery: String = "" 9 | ) : AssetListState(assets) 10 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/balance/walletselector/light/WalletSelectionMode.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.balance.walletselector.light 2 | 3 | enum class WalletSelectionMode { 4 | CurrentWallet, 5 | ExternalSelectedWallet 6 | } 7 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/beacon/main/di/BeaconComponent.kt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/beacon/main/di/BeaconComponent.kt -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/beacon/main/di/BeaconModule.kt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/beacon/main/di/BeaconModule.kt -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/common/AssetListState.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.common 2 | 3 | import jp.co.soramitsu.wallet.impl.presentation.balance.list.AssetsLoadingState 4 | 5 | abstract class AssetListState( 6 | open val assets: AssetsLoadingState 7 | ) 8 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/cross_chain/setup/ChainType.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.cross_chain.setup 2 | 3 | enum class ChainType { 4 | Origin, Destination 5 | } 6 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/receive/model/QrSharingPayload.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.receive.model 2 | 3 | import java.io.File 4 | 5 | data class QrSharingPayload( 6 | val qrFile: File, 7 | val shareMessage: String 8 | ) 9 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/receive/model/ReceiveToggleType.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.receive.model 2 | 3 | import androidx.annotation.StringRes 4 | import jp.co.soramitsu.common.compose.component.MultiToggleItem 5 | import jp.co.soramitsu.feature_wallet_impl.R 6 | 7 | enum class ReceiveToggleType(@StringRes override val titleResId: Int) : MultiToggleItem { 8 | Receive(R.string.common_action_receive), 9 | Request(R.string.common_request) 10 | } 11 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/java/jp/co/soramitsu/wallet/impl/presentation/transaction/history/model/DayHeader.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.wallet.impl.presentation.transaction.history.model 2 | 3 | data class DayHeader(val daysSinceEpoch: Long) 4 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/res/drawable/bg_asset_left.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/res/drawable/bg_asset_right.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /feature-wallet-impl/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 64dp 4 | 80dp 5 | -------------------------------------------------------------------------------- /feature-walletconnect-api/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /build -------------------------------------------------------------------------------- /feature-walletconnect-api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /feature-walletconnect-api/src/main/java/co/jp/soramitsu/walletconnect/model/ChainChooseState.kt: -------------------------------------------------------------------------------- 1 | package co.jp.soramitsu.walletconnect.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.android.parcel.Parcelize 5 | 6 | @Parcelize 7 | data class ChainChooseState( 8 | val items: List, 9 | val selected: List, 10 | val isViewMode: Boolean = false 11 | ) : Parcelable 12 | 13 | @Parcelize 14 | data class ChainChooseResult( 15 | val selectedChainIds: Set 16 | ) : Parcelable 17 | -------------------------------------------------------------------------------- /feature-walletconnect-impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /feature-walletconnect-impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/soramitsu/fearless-Android/d92f6f73709ba31c9f5e55fa431dbddf2b787c5a/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Aug 13 16:04:52 GMT+07:00 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /runtime-permission/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /runtime-permission/src/main/java/jp/co/soramitsu/runtime_permission/core/callbacks/AcceptedCallback.java: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime_permission.core.callbacks; 2 | 3 | import jp.co.soramitsu.runtime_permission.core.PermissionResult; 4 | 5 | public interface AcceptedCallback { 6 | void onAccepted(PermissionResult result); 7 | } 8 | -------------------------------------------------------------------------------- /runtime-permission/src/main/java/jp/co/soramitsu/runtime_permission/core/callbacks/DeniedCallback.java: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime_permission.core.callbacks; 2 | 3 | import jp.co.soramitsu.runtime_permission.core.PermissionResult; 4 | 5 | public interface DeniedCallback { 6 | void onDenied(PermissionResult result); 7 | } 8 | -------------------------------------------------------------------------------- /runtime-permission/src/main/java/jp/co/soramitsu/runtime_permission/core/callbacks/ForeverDeniedCallback.java: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime_permission.core.callbacks; 2 | 3 | import jp.co.soramitsu.runtime_permission.core.PermissionResult; 4 | 5 | public interface ForeverDeniedCallback { 6 | void onForeverDenied(PermissionResult result); 7 | } 8 | -------------------------------------------------------------------------------- /runtime-permission/src/main/java/jp/co/soramitsu/runtime_permission/core/callbacks/PermissionListener.java: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime_permission.core.callbacks; 2 | 3 | import jp.co.soramitsu.runtime_permission.core.PermissionResult; 4 | 5 | import java.util.List; 6 | 7 | public interface PermissionListener { 8 | void onAccepted(PermissionResult permissionResult, List accepted); 9 | void onDenied(PermissionResult permissionResult, List denied, List foreverDenied); 10 | } 11 | -------------------------------------------------------------------------------- /runtime-permission/src/main/java/jp/co/soramitsu/runtime_permission/core/callbacks/ResponseCallback.java: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime_permission.core.callbacks; 2 | 3 | import jp.co.soramitsu.runtime_permission.core.PermissionResult; 4 | 5 | public interface ResponseCallback { 6 | void onResponse(PermissionResult result); 7 | } 8 | -------------------------------------------------------------------------------- /runtime-permission/src/main/java/jp/co/soramitsu/runtime_permission/kotlin/NoActivityException.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime_permission.kotlin 2 | 3 | import java.lang.Exception 4 | 5 | class NoActivityException : Exception() 6 | -------------------------------------------------------------------------------- /runtime/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /runtime/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /runtime/src/main/assets/types/kusama.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtime_id": 9122, 3 | "types": { }, 4 | "versioning": [ 5 | { 6 | "runtime_range": [ 7 | 0, 8 | null 9 | ], 10 | "types": { 11 | "Balance": "u128", 12 | "Index": "u32", 13 | "Phase": "142", 14 | "Address": "195", 15 | "ExtrinsicSignature": "501", 16 | "ParaId": "88", 17 | "20": "GenericEvent", 18 | "300": "GenericCall" 19 | } 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /runtime/src/main/assets/types/polkadot.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtime_id": 9110, 3 | "types": { }, 4 | "versioning": [ 5 | { 6 | "runtime_range": [ 7 | 0, 8 | null 9 | ], 10 | "types": { 11 | "Balance": "u128", 12 | "Index": "u32", 13 | "Phase": "103", 14 | "Address": "147", 15 | "ExtrinsicSignature": "355", 16 | "ParaId": "84", 17 | "20": "GenericEvent", 18 | "130": "GenericCall" 19 | } 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /runtime/src/main/assets/types/polkatrain.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtime_id": 9113, 3 | "types": { }, 4 | "versioning": [ 5 | { 6 | "runtime_range": [ 7 | 0, 8 | null 9 | ], 10 | "types": { 11 | "Balance": "u128", 12 | "Index": "u32", 13 | "Phase": "104", 14 | "Address": "148", 15 | "ExtrinsicSignature": "356", 16 | "ParaId": "84", 17 | "20": "GenericEvent", 18 | "131": "GenericCall" 19 | } 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /runtime/src/main/assets/types/westend.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtime_id": 1, 3 | "types": {}, 4 | "versioning": [ 5 | { 6 | "runtime_range": [ 7 | 0, 8 | null 9 | ], 10 | "types": { 11 | "Balance": "u128", 12 | "Index": "u32", 13 | "Phase": "127", 14 | "Address": "180", 15 | "ExtrinsicSignature": "438", 16 | "ParaId": "72", 17 | "20": "GenericEvent", 18 | "269": "GenericCall" 19 | } 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/chain/model/ChainTypesInfo.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.chain.model 2 | 3 | import android.net.Uri 4 | 5 | class ChainTypesInfo( 6 | val url: String 7 | ) { 8 | // because of using ios/v3 chains.json but store android types in /android folder 9 | val androidUrl: String 10 | get() { 11 | val filename = Uri.parse(url).lastPathSegment 12 | return url.replace("/$filename", "/android/$filename") 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/chain/model/NodeId.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.chain.model 2 | 3 | @JvmInline 4 | value class NodeId(private val pair: Pair) { 5 | 6 | val chainId: String 7 | get() = pair.first 8 | 9 | val nodeUrl: String 10 | get() = pair.second 11 | } 12 | -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/chain/remote/ChainFetcher.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.chain.remote 2 | 3 | import jp.co.soramitsu.runtime.BuildConfig 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.remote.model.ChainRemote 5 | import retrofit2.http.GET 6 | 7 | interface ChainFetcher { 8 | 9 | @GET(BuildConfig.CHAINS_URL) 10 | suspend fun getChains(): List 11 | } 12 | -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/chain/remote/model/ChainExternalApiRemote.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.chain.remote.model 2 | 3 | class ChainExternalApiRemote( 4 | val staking: Section?, 5 | val history: Section?, 6 | val crowdloans: Section?, 7 | val explorers: List? 8 | ) { 9 | 10 | class Section(val type: String, val url: String) 11 | 12 | class Explorer(val type: String, val types: List, val url: String) 13 | } 14 | -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/chain/remote/model/ChainNodeRemote.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.chain.remote.model 2 | 3 | class ChainNodeRemote( 4 | val url: String, 5 | val name: String 6 | ) 7 | -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/configurator/TonEnvironmentConfigurator.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.configurator 2 | 3 | import jp.co.soramitsu.core.models.Ecosystem 4 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.Chain 5 | 6 | class TonEnvironmentConfigurator() : ChainEnvironmentConfigurator { 7 | override suspend fun configure(chain: Chain) { 8 | require(chain.ecosystem == Ecosystem.Ton) 9 | 10 | } 11 | } -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/runtime/ChainInfoNotInCacheException.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.runtime 2 | 3 | object ChainInfoNotInCacheException : Exception() 4 | -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/runtime/FileHash.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.runtime 2 | 3 | typealias FileHash = String 4 | -------------------------------------------------------------------------------- /runtime/src/main/java/jp/co/soramitsu/runtime/multiNetwork/runtime/types/TypesFetcher.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.runtime.types 2 | 3 | import retrofit2.http.GET 4 | import retrofit2.http.Url 5 | 6 | interface TypesFetcher { 7 | @GET 8 | suspend fun getTypes(@Url url: String): String 9 | } 10 | -------------------------------------------------------------------------------- /runtime/src/test/java/jp/co/soramitsu/runtime/multiNetwork/runtime/Mocks.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.runtime.multiNetwork.runtime 2 | 3 | import jp.co.soramitsu.runtime.multiNetwork.chain.model.Chain 4 | import jp.co.soramitsu.testshared.whenever 5 | import org.mockito.Mockito 6 | 7 | object Mocks { 8 | fun chain(id: String) : Chain { 9 | val chain = Mockito.mock(Chain::class.java) 10 | 11 | whenever(chain.id).thenReturn(id) 12 | 13 | return chain 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /test-shared/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /test-shared/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test-shared/src/main/java/jp/co/soramitsu/testshared/CreateTestSocket.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.testshared 2 | 3 | import com.google.gson.Gson 4 | import com.neovisionaries.ws.client.WebSocketFactory 5 | import jp.co.soramitsu.shared_utils.wsrpc.SocketService 6 | import jp.co.soramitsu.shared_utils.wsrpc.recovery.Reconnector 7 | import jp.co.soramitsu.shared_utils.wsrpc.request.CoroutinesRequestExecutor 8 | 9 | fun createTestSocket() = SocketService(Gson(), NoOpLogger, WebSocketFactory(), Reconnector(), CoroutinesRequestExecutor()) 10 | -------------------------------------------------------------------------------- /test-shared/src/main/java/jp/co/soramitsu/testshared/TestData.kt: -------------------------------------------------------------------------------- 1 | package jp.co.soramitsu.testshared 2 | 3 | object TestData 4 | -------------------------------------------------------------------------------- /tests.gradle: -------------------------------------------------------------------------------- 1 | apply from: '../jacoco.gradle' 2 | 3 | afterEvaluate { 4 | task runModuleTests { 5 | Task runTestsTask 6 | if (project.tasks.findByName('testDevelopDebugUnitTest')) { 7 | runTestsTask = project.tasks.findByName('testDevelopDebugUnitTest') 8 | } else { 9 | runTestsTask = project.tasks.findByName('testDebugUnitTest') 10 | } 11 | 12 | dependsOn runTestsTask 13 | 14 | group "Verification" 15 | } 16 | } --------------------------------------------------------------------------------