diff --git a/UnstoppableWallet/IntentExtension/Info.plist b/UnstoppableWallet/IntentExtension/Info.plist
index 0b06fe4163..5c80afc1c6 100644
--- a/UnstoppableWallet/IntentExtension/Info.plist
+++ b/UnstoppableWallet/IntentExtension/Info.plist
@@ -12,6 +12,7 @@
IntentsSupported
+ CoinPriceListIntent
SingleCoinPriceIntent
diff --git a/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj b/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj
index 00e788bef1..b09c9f6a40 100644
--- a/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj
+++ b/UnstoppableWallet/UnstoppableWallet.xcodeproj/project.pbxproj
@@ -73,6 +73,7 @@
11B350B3D287EE732007892B /* WalletCoinPriceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3508A42F804E2010C7BB3 /* WalletCoinPriceService.swift */; };
11B350B7D3DDBEE4F5B6E914 /* SendEvmTransactionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35785C46145F04D21302C /* SendEvmTransactionViewModel.swift */; };
11B350BFC559991F9BA7A63F /* CexAssetRecordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35AD211091A7C8619CEA2 /* CexAssetRecordStorage.swift */; };
+ 11B350C1B04946C9AA8B3430 /* ListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35AA43C4832521D428799 /* ListSection.swift */; };
11B350C214D423CE2DCD6853 /* CexAssetRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35195509787CD52A6873A /* CexAssetRecord.swift */; };
11B350C265D84964DCB0B317 /* CoinAuditsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35792F63B15682C00A3D9 /* CoinAuditsModule.swift */; };
11B350CA618DD7BBA452FC33 /* AppearanceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353955E2C534319A5EBE9 /* AppearanceViewModel.swift */; };
@@ -119,6 +120,7 @@
11B3512E20E90C3332EFCC1B /* RestoreSettingRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3546480B733000550BEB6 /* RestoreSettingRecord.swift */; };
11B3512E66B939A93AE62F37 /* EnabledWallet_v_0_10.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353A0B705D8EABC5B6827 /* EnabledWallet_v_0_10.swift */; };
11B35133B5C8937A33A0208C /* StorageMigrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35A1AE56A94BEB52AC4D1 /* StorageMigrator.swift */; };
+ 11B3513A8C5CFB4A4495D935 /* HorizontalDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D0EBAF33901578520E1 /* HorizontalDivider.swift */; };
11B3513AC9A4C945E6432475 /* EvmAddressViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35962622F74F89FD32D2B /* EvmAddressViewModel.swift */; };
11B3513C8E7B2C3651F00F8F /* AccountStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E87C15A3AE82F471007 /* AccountStorage.swift */; };
11B35146CA9BE897C858AB73 /* BinanceChainKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3525F8436F286491A241F /* BinanceChainKit.swift */; };
@@ -149,6 +151,7 @@
11B3518B594ECB199242C5CB /* InputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352E52084020190C21D8C /* InputView.swift */; };
11B3518BEA8865CADA5DA684 /* LaunchScreenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35BEEC0AB0B09C7E4209A /* LaunchScreenManager.swift */; };
11B3518C9B837CB6C740AABB /* CreatePasscodeModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352951AD68524C33022C0 /* CreatePasscodeModule.swift */; };
+ 11B3518F3962FEA97AE6C7CD /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357A5569EAC7D20CD40B2 /* ValueFormatter.swift */; };
11B351909FE0FA637B5B1EC5 /* CoinValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3513A7417C236F56E5383 /* CoinValue.swift */; };
11B35191E1A9626DF75D6A51 /* MarkdownViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B359B9C1E0BB4D32599695 /* MarkdownViewModel.swift */; };
11B35193A8E75B6D6117FBC7 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352978EC570F59F442BD5 /* View.swift */; };
@@ -210,7 +213,6 @@
11B3523E47942D2118DBC290 /* ManageAccountService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35DC48EEBE1160676B269 /* ManageAccountService.swift */; };
11B3523E8B466F259DB32E37 /* SecondaryCircleButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3584D2C3754A605975D6C /* SecondaryCircleButtonStyle.swift */; };
11B352407989CB29F849C0BA /* CexAsset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357EC69F650DCA696F48D /* CexAsset.swift */; };
- 11B3524397840BBE0CE092DB /* SingleCoinPriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35372356F0CEA4507CE18 /* SingleCoinPriceWidget.swift */; };
11B3524401E294D8A919186E /* EnabledWallet_v_0_20.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35577CFC2384E3A454329 /* EnabledWallet_v_0_20.swift */; };
11B35245BBF4B5F9F07676F4 /* CexWithdrawConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3517F84E9913C9030E749 /* CexWithdrawConfirmViewController.swift */; };
11B35245CD0D5B0E44E413F4 /* AppearanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357511F8F17D8221B64E2 /* AppearanceView.swift */; };
@@ -275,10 +277,12 @@
11B352EDBB48A02E732FA0A0 /* ReceiveService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E3DD6021EEB699A8EBF /* ReceiveService.swift */; };
11B352EF6AAB706DF2586AC7 /* SingleCoinPriceWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D51EAD45610A89FDFA3 /* SingleCoinPriceWidget.intentdefinition */; };
11B352F14D96C26D946E3877 /* EvmSyncSourceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D9C2409FD9060974F67 /* EvmSyncSourceManager.swift */; };
+ 11B352F16ADEABF640D2B9FD /* TopCoinsWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351E7E7B2593D31FB04FD /* TopCoinsWidget.swift */; };
11B352FA9E8AA06F3DB87C3E /* MarkdownHeader3Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B358A78367D108DD529C1B /* MarkdownHeader3Cell.swift */; };
11B352FC06650CD111076054 /* TextInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35968F5DE9FDA6EC26FCD /* TextInputCell.swift */; };
11B352FF1C3FA152E2EEFE67 /* EvmMethodLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E3F01D5A5CFE5A4E94B /* EvmMethodLabel.swift */; };
11B3530088E70831A648EC63 /* CexDepositNetworkRaw.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3502198C667A95C21DCF3 /* CexDepositNetworkRaw.swift */; };
+ 11B3530307FFDC0AF9D3A8F2 /* CoinPriceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B355D1DB2F95F1183FF2F8 /* CoinPriceListView.swift */; };
11B35307AE70D7996F483DAE /* InputStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353BA87FDCB1BCBA92E61 /* InputStackView.swift */; };
11B353096900F82EDF084F3B /* SetPasscodeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F99E093B7DDB24D39C9 /* SetPasscodeViewModel.swift */; };
11B35309CE9FBDA200067C4F /* ActiveAccount_v_0_36.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3528DDD55DDA1BAC2BADB /* ActiveAccount_v_0_36.swift */; };
@@ -326,6 +330,7 @@
11B3538CDAA5FE6682A661D0 /* EvmAccountManagerFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F980B34E005B9F02B8F /* EvmAccountManagerFactory.swift */; };
11B3538D0F8C037E40623A81 /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352972B14FA6EBEFD6904 /* Text.swift */; };
11B3538F09621AE16E30E26A /* BaseCurrencySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352034B036C9CB7A52724 /* BaseCurrencySettingsViewController.swift */; };
+ 11B3538FA5A4953A7C9AC9E6 /* SingleCoinPriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F5E57874D4517F67B7 /* SingleCoinPriceWidget.swift */; };
11B353917D2223D2B275429A /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B359D48FD6D82735C8969A /* Error.swift */; };
11B35394C8DD94B9C726B22B /* CexAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B359198B26152903D5CA14 /* CexAccount.swift */; };
11B353973C1ADD51D174AC74 /* CoinRankService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3513AC6560B9C37C342F3 /* CoinRankService.swift */; };
@@ -355,6 +360,7 @@
11B353F671EA70F8BE7F02F0 /* NftAssetTitleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353D752983424F341F2FC /* NftAssetTitleCell.swift */; };
11B353F6BB87F0F1933D63C2 /* AddEvmSyncSourceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F8A77664848396B7567 /* AddEvmSyncSourceService.swift */; };
11B353F6D6B1944AE9EADF3C /* CexCoinSelectViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B2E5AB093ABD8228769 /* CexCoinSelectViewModel.swift */; };
+ 11B353FCD118CAB48511CF12 /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531363949F235A210921 /* ApiProvider.swift */; };
11B353FCF929C0CF960C96FA /* WalletModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350B97B976126C34F9A5F /* WalletModule.swift */; };
11B353FD73E7731A9BC50C4E /* HighlightedTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35AC2D01DF06DC50EAC6A /* HighlightedTextView.swift */; };
11B3540028CD7F96521D674F /* WalletTokenListService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F0240E56EF4591D1C8F /* WalletTokenListService.swift */; };
@@ -379,7 +385,6 @@
11B3542A74C72C4CE03C727B /* CoinToggleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35A3B8FB90E561DE3F22B /* CoinToggleViewController.swift */; };
11B3542D112D915738AB1045 /* SimpleActivateModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35178643181B9CE1D6C8B /* SimpleActivateModule.swift */; };
11B35434C09F1E3818DC857B /* ReceiveDerivationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357EEC98939F9C7AA3271 /* ReceiveDerivationViewModel.swift */; };
- 11B35438D5201808E7476A41 /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */; };
11B3543A420A23064B056925 /* ReceiveAddressViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3532A1DC90E3D0E3403F8 /* ReceiveAddressViewModel.swift */; };
11B3543A7A9EB1E0E0E8753D /* DuressModeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F5B696CF0677865FA2C /* DuressModeViewModel.swift */; };
11B3543EF331DA9E5E33822A /* SingleCoinPriceEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E514EF2784402C7DC2A /* SingleCoinPriceEntry.swift */; };
@@ -422,6 +427,7 @@
11B354CBCCB0FFD2FDBEE757 /* MarketFilteredListService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35ADF9BC4D149F86F23E4 /* MarketFilteredListService.swift */; };
11B354CC5E68F04E22D633D9 /* TopPlatformHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357E05A8AF5608ECF5D5F /* TopPlatformHeaderCell.swift */; };
11B354CF393A2EAFDABE1C47 /* WalletTokenListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357D222B4819BE881E182 /* WalletTokenListViewController.swift */; };
+ 11B354D628AADF3AFD9123E1 /* SingleCoinPriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F5E57874D4517F67B7 /* SingleCoinPriceWidget.swift */; };
11B354D6DE193776FFACE1B5 /* AddEvmSyncSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F33517C6DDA1E7AF59 /* AddEvmSyncSourceViewController.swift */; };
11B354D754D2E2312223F9C0 /* ReceiveSelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3580D6EDF1BB135965CC5 /* ReceiveSelectorViewController.swift */; };
11B354D8DCBDAA82A6C51205 /* ManageAccountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B355949F6D268EF1977DC9 /* ManageAccountViewModel.swift */; };
@@ -454,6 +460,8 @@
11B3551F51D987A150C3BC26 /* TabButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351DBFA79DAF0A82A1925 /* TabButtonStyle.swift */; };
11B35521FDF21F9B1667AF72 /* Eip20Kit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3524B273DD5AB2FF5C7A6 /* Eip20Kit.swift */; };
11B35525C4BAEF22CF73F261 /* CreateAccountSimpleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351628BA5984C6EBB412E /* CreateAccountSimpleViewController.swift */; };
+ 11B35529AB46C98BC35C72E4 /* CoinPriceListProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35EE1C1F555F4160AC201 /* CoinPriceListProvider.swift */; };
+ 11B35530A9FC0972D8716C31 /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357A5569EAC7D20CD40B2 /* ValueFormatter.swift */; };
11B3553109794AE192BF7591 /* MarketCategoryModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350CAB1C54A2CAA4C76F6 /* MarketCategoryModule.swift */; };
11B35531B3F80D06EF040301 /* CoinType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357B2D07C69579BAEC997 /* CoinType.swift */; };
11B355342F86DF79AE7000B9 /* Cex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D6718A1DEB73A0CEC02 /* Cex.swift */; };
@@ -525,7 +533,6 @@
11B3561679C05C31F16EDC77 /* BaseUnlockViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F8A0A9EB045377C152 /* BaseUnlockViewModel.swift */; };
11B3561A469C906B67F24459 /* FeeRateProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B359BBFCD82C3C6DC06F96 /* FeeRateProvider.swift */; };
11B3561E7DF566A274210E01 /* EvmSyncSourceRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B56F5C8138085588EE5 /* EvmSyncSourceRecord.swift */; };
- 11B35622E46852AA38E42DF5 /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */; };
11B3562466F0ADD109244158 /* NftCollectionAssetsModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35100DD6E2DBF905FD19B /* NftCollectionAssetsModule.swift */; };
11B3562D78E70F5F14B81B3A /* CexWithdrawNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3572F134D41A670EE9244 /* CexWithdrawNetwork.swift */; };
11B3562EE896D758066FEECB /* CexDepositNetworkSelectService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35850DF16D11D45C44A60 /* CexDepositNetworkSelectService.swift */; };
@@ -557,6 +564,7 @@
11B35678A2523AEDBE824743 /* FormCautionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350F5D363E9B1D6C9120F /* FormCautionCell.swift */; };
11B35683BF79A4A5AECA616F /* CoinAuditsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3566146F353C8B6C919CA /* CoinAuditsViewController.swift */; };
11B3568483AFF7864F050E0F /* LockManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F57D462E2C9E9AEF67C /* LockManager.swift */; };
+ 11B35685AC079B7BC7D1A534 /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531363949F235A210921 /* ApiProvider.swift */; };
11B3568EFCE57D12D377F7E4 /* ManageAccountsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D805327837A9E81801C /* ManageAccountsViewController.swift */; };
11B35696E9CD808522BEFCD6 /* BlockchainSettingRecordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353FA8AE18587D516754B /* BlockchainSettingRecordStorage.swift */; };
11B356A19A721D3557D7213C /* CoinReportsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E767DA0B5D7C0DAF203 /* CoinReportsViewModel.swift */; };
@@ -603,6 +611,7 @@
11B3571EE86803DB473BA1F7 /* WatchEvmAddressService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350A8930819ED5C2729F6 /* WatchEvmAddressService.swift */; };
11B35720BCE41151CDDF9185 /* BitcoinCashCoinType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B176A5FDEBBE94D307E /* BitcoinCashCoinType.swift */; };
11B35721F1DA4DD77AD70637 /* NftKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35464B8D90CBE6E864B92 /* NftKey.swift */; };
+ 11B357229EFFA602F38D6C2C /* CoinPriceListEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357F2FAE27C9739CAE5C7 /* CoinPriceListEntry.swift */; };
11B35727A4950C1E066F2244 /* LogRecordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35822E26E7298100CD69D /* LogRecordStorage.swift */; };
11B35729848FDBC47F038553 /* AppVersionRecordStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35888BDB55DCFD0ECF655 /* AppVersionRecordStorage.swift */; };
11B3572C418CAD9739CAE3EC /* BlockchainTokensViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350B29B000CD809F81228 /* BlockchainTokensViewModel.swift */; };
@@ -639,6 +648,7 @@
11B3579C9B49D3B2F1DB389F /* TransactionsCoinSelectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352D7E1CB9D978EE1BC15 /* TransactionsCoinSelectViewController.swift */; };
11B357A607396E857705024F /* WalletTokenCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B64097CCFA552310E3D /* WalletTokenCell.swift */; };
11B357A9F8949912C12A17D7 /* NftCollectionOverviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351436E090F4C05243103 /* NftCollectionOverviewViewModel.swift */; };
+ 11B357AD2632BDF26DCB4BFC /* HorizontalDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D0EBAF33901578520E1 /* HorizontalDivider.swift */; };
11B357ADA154348A3C1A987B /* CoinTreasuriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351E253E310F1738EBE13 /* CoinTreasuriesViewController.swift */; };
11B357AE8B51E09D0EB60D87 /* NftPriceRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B451378835F7F060012 /* NftPriceRecord.swift */; };
11B357BA09F0FA21477F0A59 /* CoinOverviewViewModelNew.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35363A530051B79BFFFD0 /* CoinOverviewViewModelNew.swift */; };
@@ -702,6 +712,7 @@
11B35854327D3A8CC787E985 /* WatchModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531B7AC10796F8D26455 /* WatchModule.swift */; };
11B35854532EEA0AE6AC2010 /* RateAppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35FA360A91FDE3EB0B85C /* RateAppManager.swift */; };
11B3585461729AD144448426 /* NumPadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353E1284B381BE56AC663 /* NumPadView.swift */; };
+ 11B358587D9C3A1F10EC15A6 /* PriceChangeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357889F003A0B33D9DF27 /* PriceChangeType.swift */; };
11B35858954659DEE0C44618 /* TransactionsViewItemFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357D89546EBA13B01A1ED /* TransactionsViewItemFactory.swift */; };
11B3585AC6E5D92F98A71758 /* RestoreSettingRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3546480B733000550BEB6 /* RestoreSettingRecord.swift */; };
11B3585E88319E5BBBB9CD3F /* EvmPrivateKeyModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D652AE2C3D9E084AC0F /* EvmPrivateKeyModule.swift */; };
@@ -745,11 +756,13 @@
11B358B90E2D1A8832637F34 /* MarkdownBlockQuoteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3552D3F84BA594EFE964C /* MarkdownBlockQuoteCell.swift */; };
11B358B9159434442870D34E /* WatchEvmAddressService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350A8930819ED5C2729F6 /* WatchEvmAddressService.swift */; };
11B358C1D982EAC4F0A308ED /* MarkdownViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35DF08505C3A7CB1BBBB4 /* MarkdownViewController.swift */; };
+ 11B358C289DE4AE5EB5547BC /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531363949F235A210921 /* ApiProvider.swift */; };
11B358C3281DE0A34D192CF0 /* SwitchAccountModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351AEFE48529C069B892F /* SwitchAccountModule.swift */; };
11B358C72B4E7F70331084AA /* SendEvmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35113CB935A0E54504C1C /* SendEvmViewController.swift */; };
11B358CB129212E2A0E455E4 /* MarketAdvancedSearchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353A1CC274EDBF8A67DEA /* MarketAdvancedSearchResultViewController.swift */; };
11B358D1687049E5DACEBC96 /* AppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352884D47E0B23DCF2C2C /* AppManager.swift */; };
11B358D35D2270FD78C6EF82 /* AutoLockPeriod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E41142BD3D2FF59BAE7 /* AutoLockPeriod.swift */; };
+ 11B358D519ACFE88A7823C7E /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3531363949F235A210921 /* ApiProvider.swift */; };
11B358D913A404C1DA7D4E0E /* CoinInvestorsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35FF539B93A4C61AD1D00 /* CoinInvestorsViewModel.swift */; };
11B358DC6827FC6035BF3225 /* TokenQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353684493AFDF3711DF2B /* TokenQuery.swift */; };
11B358DC90F3372DB98BD4A5 /* CexDepositNetworkSelectViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35DDED1BC5B541DB6B4B3 /* CexDepositNetworkSelectViewModel.swift */; };
@@ -860,6 +873,7 @@
11B35A07ED63F869C0203244 /* CexDepositNetworkSelectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35C227EDC2D4ED188A0FC /* CexDepositNetworkSelectViewController.swift */; };
11B35A0F3111451717192084 /* NftCollectionAssetsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350CD0F79715E1A5EE8BF /* NftCollectionAssetsService.swift */; };
11B35A108457DC44DD870138 /* MainBadgeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35C13937F82D36C823205 /* MainBadgeService.swift */; };
+ 11B35A15391F470849534264 /* ListStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B356EF92FFD23F4385A991 /* ListStyle.swift */; };
11B35A17137E171D3496A99E /* MarkdownModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35609D3FA1729A7D80153 /* MarkdownModule.swift */; };
11B35A18AA61F8C06AB1C15B /* AppearanceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353955E2C534319A5EBE9 /* AppearanceViewModel.swift */; };
11B35A1BD3EA5E3547D0E3FF /* RestoreBinanceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B2F781F7EDA04E955BB /* RestoreBinanceViewModel.swift */; };
@@ -893,6 +907,7 @@
11B35A5DA8197D193B7CF8D9 /* AmountData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B617A9CE668EEF4978B /* AmountData.swift */; };
11B35A66D997F86423C2F5A0 /* DonutChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35FC207C703EBF63FD56A /* DonutChartView.swift */; };
11B35A6D6A552EF997ED09E9 /* ReceiveAddressViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B354F94192C3C8D9011983 /* ReceiveAddressViewController.swift */; };
+ 11B35A6F4E6931973277940A /* CoinPriceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B355D1DB2F95F1183FF2F8 /* CoinPriceListView.swift */; };
11B35A71C30FB6172C74D09D /* WalletConnectSendEthereumTransactionRequestService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35CA33956633E85EC5C16 /* WalletConnectSendEthereumTransactionRequestService.swift */; };
11B35A71D59757280B126587 /* ReceiveDerivationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357EEC98939F9C7AA3271 /* ReceiveDerivationViewModel.swift */; };
11B35A79476177D3BE7DE477 /* RestorePrivateKeyService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351EBA5DE11150CE2E3F9 /* RestorePrivateKeyService.swift */; };
@@ -969,6 +984,7 @@
11B35B507F2F843A5B3E4C7C /* EvmNetworkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351895EE2816DE7BBC767 /* EvmNetworkViewModel.swift */; };
11B35B5451BA0A3C825809A2 /* TabHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357D7156B86181DD0C6D4 /* TabHeaderView.swift */; };
11B35B5B8F3FEED445647E56 /* EvmCoinServiceFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35410733A35D1558E55B2 /* EvmCoinServiceFactory.swift */; };
+ 11B35B5EED35DD5F8F8B19A8 /* ListStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B356EF92FFD23F4385A991 /* ListStyle.swift */; };
11B35B5FA3177BC9ED21B929 /* SwapApproveConfirmationModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B356671FA76C7DEDA50B94 /* SwapApproveConfirmationModule.swift */; };
11B35B6586B14C6A9F35E39D /* MarketAdvancedSearchResultService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B358C7505D0DE60CD03B22 /* MarketAdvancedSearchResultService.swift */; };
11B35B664765E4EAA7E0E14F /* Faq.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35450456BE5E3EE8F7391 /* Faq.swift */; };
@@ -1072,6 +1088,7 @@
11B35CAD5A7E0C8709559FD2 /* WalletManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352D547F1BB38D2AD6AD5 /* WalletManager.swift */; };
11B35CADA5EE093B974C5A4A /* EvmLabelManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F13BAFE57D363B9684F /* EvmLabelManager.swift */; };
11B35CAE0540A2549BD4A960 /* ActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35EDE38851EC8658D8A99 /* ActivityView.swift */; };
+ 11B35CB0098E9628FE81AC39 /* TopCoinsWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351E7E7B2593D31FB04FD /* TopCoinsWidget.swift */; };
11B35CB0102019E63D7337D5 /* NftCollectionMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35690912F374FEE910193 /* NftCollectionMetadata.swift */; };
11B35CB50F9904708B827F9F /* CoinToggleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350CDE31673BA1673B620 /* CoinToggleViewModel.swift */; };
11B35CB5A90FCD0B53D59140 /* AlertViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357736B8C29DF38F5DCBA /* AlertViewController.swift */; };
@@ -1239,6 +1256,7 @@
11B35E83437BEB5CCE342ACB /* SyncerState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B354BDDCAF7AF5A0582CAA /* SyncerState.swift */; };
11B35E8777FC5A18BD07CF60 /* AccountRecord_v_0_10.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35BBC9FB99B388F1A388F /* AccountRecord_v_0_10.swift */; };
11B35E87DDBCD81A36436A13 /* ExternalContractCallTransactionRecord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F42A8CA942DF400A928 /* ExternalContractCallTransactionRecord.swift */; };
+ 11B35E88C40DC151A3BEC0B1 /* CoinPriceListProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35EE1C1F555F4160AC201 /* CoinPriceListProvider.swift */; };
11B35E8BF94FD52708DBB0E1 /* CoinRecord_v19.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B2C6C103AFF4CCC6E91 /* CoinRecord_v19.swift */; };
11B35E8D7BC94103A4ABD91C /* WalletHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E859456CF982321B46F /* WalletHeaderView.swift */; };
11B35E8DED55EE76CE1F943D /* ModuleUnlockViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B51E484CA62EC57790E /* ModuleUnlockViewModel.swift */; };
@@ -1283,6 +1301,7 @@
11B35EF9D9E8C1A814005CFD /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35747FAD8381F2AD48276 /* MainViewModel.swift */; };
11B35EFAFFA1E30F7765FEB2 /* MainService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B6D6FCA3745DE0750BD /* MainService.swift */; };
11B35F09A49A90BF058CA500 /* ReceiveSelectCoinViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B350575488360C1A598DF3 /* ReceiveSelectCoinViewModel.swift */; };
+ 11B35F0D313E455BCF24C42B /* PriceChangeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357889F003A0B33D9DF27 /* PriceChangeType.swift */; };
11B35F1152FB1004E554B922 /* MarketOverviewMetricsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35DCCC2D8CD00EF6A9A77 /* MarketOverviewMetricsCell.swift */; };
11B35F134E5EF8572BF330CB /* NavigationRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3578FB80AA013BD351A26 /* NavigationRow.swift */; };
11B35F1440C5946E9C3D94ED /* Auditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D8AF9D337A98530548D /* Auditor.swift */; };
@@ -1314,9 +1333,11 @@
11B35F663F7E12BFDDE3C88B /* AccountManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35872950C107E4810AB6B /* AccountManager.swift */; };
11B35F66D2561CD9555C8857 /* UnlinkModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3529D276325D741CAEEF5 /* UnlinkModule.swift */; };
11B35F6B92C2FB142E522828 /* BtcBlockchainSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B358830357DB1F87FCA006 /* BtcBlockchainSettingsViewModel.swift */; };
+ 11B35F6BC7EC8A90FDACD191 /* CoinPriceListEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B357F2FAE27C9739CAE5C7 /* CoinPriceListEntry.swift */; };
11B35F6CD2706B10781456E8 /* ExtendedKeyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F95A84DD0F232E5A9CD /* ExtendedKeyViewModel.swift */; };
11B35F6FDB8640381081A06C /* FormAmountInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B352A41EC99ADCC8F3E3E9 /* FormAmountInputView.swift */; };
11B35F7233A2FC778A8DE0AB /* CurrencyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BE8A0802ADE2FAB0012DE7F /* CurrencyManager.swift */; };
+ 11B35F728E5BE60FD7C87FA1 /* ListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35AA43C4832521D428799 /* ListSection.swift */; };
11B35F72D67DB96FA83C9004 /* AddEvmSyncSourceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351F33517C6DDA1E7AF59 /* AddEvmSyncSourceViewController.swift */; };
11B35F73153DEE805DD539CE /* EvmNetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35711A471C5A45DD87108 /* EvmNetworkViewController.swift */; };
11B35F78F82224BE17D612AB /* RecoveryPhraseService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B351A0B1AE5F612E6A5FEE /* RecoveryPhraseService.swift */; };
@@ -1326,7 +1347,6 @@
11B35F8649859802080BA580 /* NftViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D96B8963CDC30DC5643 /* NftViewModel.swift */; };
11B35F890BE41B1BFAC3D75E /* RestoreMnemonicService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D55DCC92BED4FA87CA0 /* RestoreMnemonicService.swift */; };
11B35F8BF4BD6481E6AF72AF /* TestNetManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35EE072CE5471B0DFF841 /* TestNetManager.swift */; };
- 11B35F8CD1F9BD5D9B865560 /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3529E8380BFCA6A1E4867 /* ValueFormatter.swift */; };
11B35F8FB24AB02560A1D018 /* MarketAdvancedSearchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B353A1CC274EDBF8A67DEA /* MarketAdvancedSearchResultViewController.swift */; };
11B35F91E53BA1F835DD4B4F /* HorizontalDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D0EBAF33901578520E1 /* HorizontalDivider.swift */; };
11B35F98393E6F3B76381ECF /* ModuleUnlockViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35B51E484CA62EC57790E /* ModuleUnlockViewModel.swift */; };
@@ -2781,10 +2801,7 @@
D3AF5A9129FFD87500C1399E /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = D3AF5A9029FFD87500C1399E /* RxRelay */; };
D3AF5A9329FFD87500C1399E /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = D3AF5A9229FFD87500C1399E /* RxSwift */; };
D3BA257F2ADFAD7C002B13EA /* AppWidgetBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3948EF62ADA846400FAE566 /* AppWidgetBundle.swift */; };
- D3BA25802ADFAD7C002B13EA /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */; };
D3BA25812ADFAD7C002B13EA /* SingleCoinPriceWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D51EAD45610A89FDFA3 /* SingleCoinPriceWidget.intentdefinition */; };
- D3BA25822ADFAD7C002B13EA /* SingleCoinPriceWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35372356F0CEA4507CE18 /* SingleCoinPriceWidget.swift */; };
- D3BA25832ADFAD7C002B13EA /* ValueFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3529E8380BFCA6A1E4867 /* ValueFormatter.swift */; };
D3BA25842ADFAD7C002B13EA /* SingleCoinPriceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35CFAA2B156E439EB18B3 /* SingleCoinPriceView.swift */; };
D3BA25852ADFAD7C002B13EA /* SingleCoinPriceEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35E514EF2784402C7DC2A /* SingleCoinPriceEntry.swift */; };
D3BA25862ADFAD7C002B13EA /* SingleCoinPriceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B35F0C950836EA4166CEC5 /* SingleCoinPriceProvider.swift */; };
@@ -2795,7 +2812,6 @@
D3BA258D2ADFAD7C002B13EA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D3948EFA2ADA846800FAE566 /* Assets.xcassets */; };
D3BA25932ADFAF1E002B13EA /* WidgetExtension Prod.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D3BA25912ADFAD7C002B13EA /* WidgetExtension Prod.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
D3BA259B2ADFAF23002B13EA /* IntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3948F1C2ADA88D900FAE566 /* IntentHandler.swift */; };
- D3BA259C2ADFAF23002B13EA /* ApiProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */; };
D3BA259D2ADFAF23002B13EA /* SingleCoinPriceWidget.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = 11B35D51EAD45610A89FDFA3 /* SingleCoinPriceWidget.intentdefinition */; };
D3BA259F2ADFAF23002B13EA /* HsToolKit in Frameworks */ = {isa = PBXBuildFile; productRef = D3BA25982ADFAF23002B13EA /* HsToolKit */; };
D3BA25A02ADFAF23002B13EA /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3948F092ADA887300FAE566 /* Intents.framework */; };
@@ -2973,10 +2989,12 @@
11B351E1107158B6A2BF2149 /* ActivateSubscriptionService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivateSubscriptionService.swift; sourceTree = ""; };
11B351E253E310F1738EBE13 /* CoinTreasuriesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinTreasuriesViewController.swift; sourceTree = ""; };
11B351E61AB3FB570A4F7C66 /* Wallet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = ""; };
+ 11B351E7E7B2593D31FB04FD /* TopCoinsWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TopCoinsWidget.swift; sourceTree = ""; };
11B351EBA5DE11150CE2E3F9 /* RestorePrivateKeyService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RestorePrivateKeyService.swift; sourceTree = ""; };
11B351EC6F1B4D72D52B4D16 /* NftActivityHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftActivityHeaderView.swift; sourceTree = ""; };
11B351F1248EDA20F7141AB8 /* ExtendedKeyModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtendedKeyModule.swift; sourceTree = ""; };
11B351F33517C6DDA1E7AF59 /* AddEvmSyncSourceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddEvmSyncSourceViewController.swift; sourceTree = ""; };
+ 11B351F5E57874D4517F67B7 /* SingleCoinPriceWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleCoinPriceWidget.swift; sourceTree = ""; };
11B351F8A0A9EB045377C152 /* BaseUnlockViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseUnlockViewModel.swift; sourceTree = ""; };
11B351FDDBEF227E161F6A0E /* PageDescription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PageDescription.swift; sourceTree = ""; };
11B352034B036C9CB7A52724 /* BaseCurrencySettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseCurrencySettingsViewController.swift; sourceTree = ""; };
@@ -3009,7 +3027,6 @@
11B3529CF33E51DA1C872106 /* EditPasscodeModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditPasscodeModule.swift; sourceTree = ""; };
11B3529D276325D741CAEEF5 /* UnlinkModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnlinkModule.swift; sourceTree = ""; };
11B3529DC8E74672659515B8 /* CoinPageViewModelNew.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinPageViewModelNew.swift; sourceTree = ""; };
- 11B3529E8380BFCA6A1E4867 /* ValueFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueFormatter.swift; sourceTree = ""; };
11B352A41EC99ADCC8F3E3E9 /* FormAmountInputView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormAmountInputView.swift; sourceTree = ""; };
11B352A8C9C3AA2AB1776F3C /* UnlinkViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnlinkViewController.swift; sourceTree = ""; };
11B352ABFDEAEEA84D3FDD8B /* AddEvmTokenBlockchainService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddEvmTokenBlockchainService.swift; sourceTree = ""; };
@@ -3036,6 +3053,7 @@
11B352FBA1B29357E0120055 /* BalanceHiddenManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalanceHiddenManager.swift; sourceTree = ""; };
11B353002DD782C5BEE9BFD4 /* MarkdownImageTitleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownImageTitleCell.swift; sourceTree = ""; };
11B353010933750F8F920E1E /* TermsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TermsViewModel.swift; sourceTree = ""; };
+ 11B3531363949F235A210921 /* ApiProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiProvider.swift; sourceTree = ""; };
11B3531B7AC10796F8D26455 /* WatchModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchModule.swift; sourceTree = ""; };
11B3531E4476F43B9C2BA5A0 /* ExperimentalFeaturesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExperimentalFeaturesView.swift; sourceTree = ""; };
11B353262E45560C91FD6B65 /* EvmPrivateKeyViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EvmPrivateKeyViewModel.swift; sourceTree = ""; };
@@ -3054,7 +3072,6 @@
11B35368FF9DD8600557BF07 /* TextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextCell.swift; sourceTree = ""; };
11B3536CE69BFC7513A9DFDF /* GuidesService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GuidesService.swift; sourceTree = ""; };
11B3536DB4D3D3D7771B3EA4 /* MarkdownTextCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownTextCell.swift; sourceTree = ""; };
- 11B35372356F0CEA4507CE18 /* SingleCoinPriceWidget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleCoinPriceWidget.swift; sourceTree = ""; };
11B3537769E4496D08EB0376 /* AppearanceModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppearanceModule.swift; sourceTree = ""; };
11B3538387B200C894A68ADF /* SendEvmConfirmationModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendEvmConfirmationModule.swift; sourceTree = ""; };
11B353885F7A93DF25F5023B /* EvmAddressViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EvmAddressViewController.swift; sourceTree = ""; };
@@ -3143,6 +3160,7 @@
11B355B70AB1BC7B6F8B5241 /* WatchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchViewController.swift; sourceTree = ""; };
11B355BEB95969D89B3F8876 /* MarketListViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarketListViewModel.swift; sourceTree = ""; };
11B355C1E3C922BAE804AAF9 /* WalletConnectSessionStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletConnectSessionStorage.swift; sourceTree = ""; };
+ 11B355D1DB2F95F1183FF2F8 /* CoinPriceListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinPriceListView.swift; sourceTree = ""; };
11B355D5EFD2B74DE15F0C2A /* FaqModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaqModule.swift; sourceTree = ""; };
11B355DBB08BD360380F7EAF /* WalletConnectRequestViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletConnectRequestViewController.swift; sourceTree = ""; };
11B355DF40EB498107EDAA4A /* BrandFooterCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrandFooterCell.swift; sourceTree = ""; };
@@ -3215,11 +3233,12 @@
11B35779E6353B98B298FF29 /* CurrentDateProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrentDateProvider.swift; sourceTree = ""; };
11B35785C46145F04D21302C /* SendEvmTransactionViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendEvmTransactionViewModel.swift; sourceTree = ""; };
11B35785DD2AF78CEBD800F5 /* BackupVerifyWordsModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackupVerifyWordsModule.swift; sourceTree = ""; };
+ 11B357889F003A0B33D9DF27 /* PriceChangeType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PriceChangeType.swift; sourceTree = ""; };
11B3578FB80AA013BD351A26 /* NavigationRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationRow.swift; sourceTree = ""; };
11B35792F63B15682C00A3D9 /* CoinAuditsModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinAuditsModule.swift; sourceTree = ""; };
11B35799B0DCCF655F0766BF /* CexDepositNetwork.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CexDepositNetwork.swift; sourceTree = ""; };
- 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiProvider.swift; sourceTree = ""; };
11B3579EDE4F5BC0170FB711 /* TransactionsTableViewDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionsTableViewDataSource.swift; sourceTree = ""; };
+ 11B357A5569EAC7D20CD40B2 /* ValueFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueFormatter.swift; sourceTree = ""; };
11B357B1854BAD99C7CFB3DE /* NftHeaderViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftHeaderViewModel.swift; sourceTree = ""; };
11B357B185E8FECB3924FDF2 /* BlockchainType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlockchainType.swift; sourceTree = ""; };
11B357B2D07C69579BAEC997 /* CoinType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinType.swift; sourceTree = ""; };
@@ -3237,6 +3256,7 @@
11B357EEC98939F9C7AA3271 /* ReceiveDerivationViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReceiveDerivationViewModel.swift; sourceTree = ""; };
11B357F0A42CE7144C82D634 /* BlockchainSettingsModule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlockchainSettingsModule.swift; sourceTree = ""; };
11B357F15913DDAE69C9B0E0 /* RestoreSettingsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RestoreSettingsManager.swift; sourceTree = ""; };
+ 11B357F2FAE27C9739CAE5C7 /* CoinPriceListEntry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinPriceListEntry.swift; sourceTree = ""; };
11B357F4747A6B256C31EC7C /* PoolGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PoolGroup.swift; sourceTree = ""; };
11B35801399EA004F5A2A1F7 /* MarkdownService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownService.swift; sourceTree = ""; };
11B3580953728946194D1187 /* NftCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NftCollectionViewController.swift; sourceTree = ""; };
@@ -3543,6 +3563,7 @@
11B35EDE31BA3EF80F78859A /* HsLabelProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HsLabelProvider.swift; sourceTree = ""; };
11B35EDE38851EC8658D8A99 /* ActivityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityView.swift; sourceTree = ""; };
11B35EE072CE5471B0DFF841 /* TestNetManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNetManager.swift; sourceTree = ""; };
+ 11B35EE1C1F555F4160AC201 /* CoinPriceListProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoinPriceListProvider.swift; sourceTree = ""; };
11B35EF3688D60C8E6823267 /* BottomSingleSelectorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BottomSingleSelectorViewController.swift; sourceTree = ""; };
11B35EFB45ECC2D403CA6C89 /* ValueFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueFormatter.swift; sourceTree = ""; };
11B35F007444A766AF8CD20D /* EvmLabelStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EvmLabelStorage.swift; sourceTree = ""; };
@@ -4493,7 +4514,6 @@
isa = PBXGroup;
children = (
11B35D51EAD45610A89FDFA3 /* SingleCoinPriceWidget.intentdefinition */,
- 11B35372356F0CEA4507CE18 /* SingleCoinPriceWidget.swift */,
11B35CFAA2B156E439EB18B3 /* SingleCoinPriceView.swift */,
11B35E514EF2784402C7DC2A /* SingleCoinPriceEntry.swift */,
11B35F0C950836EA4166CEC5 /* SingleCoinPriceProvider.swift */,
@@ -5249,6 +5269,16 @@
path = Views;
sourceTree = "";
};
+ 11B355D8E54BBC0EF3467F0A /* CoinPriceList */ = {
+ isa = PBXGroup;
+ children = (
+ 11B357F2FAE27C9739CAE5C7 /* CoinPriceListEntry.swift */,
+ 11B35EE1C1F555F4160AC201 /* CoinPriceListProvider.swift */,
+ 11B355D1DB2F95F1183FF2F8 /* CoinPriceListView.swift */,
+ );
+ path = CoinPriceList;
+ sourceTree = "";
+ };
11B355EAC554044B280B08AC /* Ethereum */ = {
isa = PBXGroup;
children = (
@@ -5398,6 +5428,16 @@
path = Passcode;
sourceTree = "";
};
+ 11B35693EA7B807D24C090E4 /* Misc */ = {
+ isa = PBXGroup;
+ children = (
+ 11B3531363949F235A210921 /* ApiProvider.swift */,
+ 11B357889F003A0B33D9DF27 /* PriceChangeType.swift */,
+ 11B357A5569EAC7D20CD40B2 /* ValueFormatter.swift */,
+ );
+ path = Misc;
+ sourceTree = "";
+ };
11B356A9BF5A101F8B2ABA7F /* Receive */ = {
isa = PBXGroup;
children = (
@@ -8128,9 +8168,11 @@
D3948EF62ADA846400FAE566 /* AppWidgetBundle.swift */,
D3948EFA2ADA846800FAE566 /* Assets.xcassets */,
D3948EFC2ADA846800FAE566 /* Info.plist */,
- 11B3579B7C22E93AA92F24D6 /* ApiProvider.swift */,
11B350F316B662F48ABE6CBC /* SingleCoinPrice */,
- 11B3529E8380BFCA6A1E4867 /* ValueFormatter.swift */,
+ 11B355D8E54BBC0EF3467F0A /* CoinPriceList */,
+ 11B351E7E7B2593D31FB04FD /* TopCoinsWidget.swift */,
+ 11B351F5E57874D4517F67B7 /* SingleCoinPriceWidget.swift */,
+ 11B35693EA7B807D24C090E4 /* Misc */,
);
path = Widget;
sourceTree = "";
@@ -11208,16 +11250,24 @@
buildActionMask = 2147483647;
files = (
D3948EF72ADA846400FAE566 /* AppWidgetBundle.swift in Sources */,
- 11B35622E46852AA38E42DF5 /* ApiProvider.swift in Sources */,
11B35127A0500D2C7DA92B96 /* SingleCoinPriceWidget.intentdefinition in Sources */,
- 11B3524397840BBE0CE092DB /* SingleCoinPriceWidget.swift in Sources */,
- 11B35F8CD1F9BD5D9B865560 /* ValueFormatter.swift in Sources */,
11B350F24818BABB6DB6512A /* SingleCoinPriceView.swift in Sources */,
11B3543EF331DA9E5E33822A /* SingleCoinPriceEntry.swift in Sources */,
11B3525BA3799B70B25CF2FC /* SingleCoinPriceProvider.swift in Sources */,
11B356509E6083B971F37E0F /* Currency.swift in Sources */,
11B35C4E01C2AF2707691B96 /* CurrencyManager.swift in Sources */,
11B35E4A30997DC0E1E2BA48 /* SharedLocalStorage.swift in Sources */,
+ 11B3513A8C5CFB4A4495D935 /* HorizontalDivider.swift in Sources */,
+ 11B350C1B04946C9AA8B3430 /* ListSection.swift in Sources */,
+ 11B35B5EED35DD5F8F8B19A8 /* ListStyle.swift in Sources */,
+ 11B357229EFFA602F38D6C2C /* CoinPriceListEntry.swift in Sources */,
+ 11B35E88C40DC151A3BEC0B1 /* CoinPriceListProvider.swift in Sources */,
+ 11B35A6F4E6931973277940A /* CoinPriceListView.swift in Sources */,
+ 11B35CB0098E9628FE81AC39 /* TopCoinsWidget.swift in Sources */,
+ 11B3538FA5A4953A7C9AC9E6 /* SingleCoinPriceWidget.swift in Sources */,
+ 11B358D519ACFE88A7823C7E /* ApiProvider.swift in Sources */,
+ 11B358587D9C3A1F10EC15A6 /* PriceChangeType.swift in Sources */,
+ 11B35530A9FC0972D8716C31 /* ValueFormatter.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -11226,8 +11276,8 @@
buildActionMask = 2147483647;
files = (
D3948F1D2ADA88D900FAE566 /* IntentHandler.swift in Sources */,
- 11B35438D5201808E7476A41 /* ApiProvider.swift in Sources */,
11B3589AA4B965989181F224 /* SingleCoinPriceWidget.intentdefinition in Sources */,
+ 11B358C289DE4AE5EB5547BC /* ApiProvider.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -11236,16 +11286,24 @@
buildActionMask = 2147483647;
files = (
D3BA257F2ADFAD7C002B13EA /* AppWidgetBundle.swift in Sources */,
- D3BA25802ADFAD7C002B13EA /* ApiProvider.swift in Sources */,
D3BA25812ADFAD7C002B13EA /* SingleCoinPriceWidget.intentdefinition in Sources */,
- D3BA25822ADFAD7C002B13EA /* SingleCoinPriceWidget.swift in Sources */,
- D3BA25832ADFAD7C002B13EA /* ValueFormatter.swift in Sources */,
D3BA25842ADFAD7C002B13EA /* SingleCoinPriceView.swift in Sources */,
D3BA25852ADFAD7C002B13EA /* SingleCoinPriceEntry.swift in Sources */,
D3BA25862ADFAD7C002B13EA /* SingleCoinPriceProvider.swift in Sources */,
11B35202BE66E6E764026D63 /* Currency.swift in Sources */,
11B35F7233A2FC778A8DE0AB /* CurrencyManager.swift in Sources */,
11B359A56AAFB4C4F6EF733C /* SharedLocalStorage.swift in Sources */,
+ 11B357AD2632BDF26DCB4BFC /* HorizontalDivider.swift in Sources */,
+ 11B35F728E5BE60FD7C87FA1 /* ListSection.swift in Sources */,
+ 11B35A15391F470849534264 /* ListStyle.swift in Sources */,
+ 11B35F6BC7EC8A90FDACD191 /* CoinPriceListEntry.swift in Sources */,
+ 11B35529AB46C98BC35C72E4 /* CoinPriceListProvider.swift in Sources */,
+ 11B3530307FFDC0AF9D3A8F2 /* CoinPriceListView.swift in Sources */,
+ 11B352F16ADEABF640D2B9FD /* TopCoinsWidget.swift in Sources */,
+ 11B354D628AADF3AFD9123E1 /* SingleCoinPriceWidget.swift in Sources */,
+ 11B353FCD118CAB48511CF12 /* ApiProvider.swift in Sources */,
+ 11B35F0D313E455BCF24C42B /* PriceChangeType.swift in Sources */,
+ 11B3518F3962FEA97AE6C7CD /* ValueFormatter.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -11254,8 +11312,8 @@
buildActionMask = 2147483647;
files = (
D3BA259B2ADFAF23002B13EA /* IntentHandler.swift in Sources */,
- D3BA259C2ADFAF23002B13EA /* ApiProvider.swift in Sources */,
D3BA259D2ADFAF23002B13EA /* SingleCoinPriceWidget.intentdefinition in Sources */,
+ 11B35685AC079B7BC7D1A534 /* ApiProvider.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/UnstoppableWallet/UnstoppableWallet/Info.plist b/UnstoppableWallet/UnstoppableWallet/Info.plist
index e1f7f069d1..49aca1bcaf 100644
--- a/UnstoppableWallet/UnstoppableWallet/Info.plist
+++ b/UnstoppableWallet/UnstoppableWallet/Info.plist
@@ -96,6 +96,7 @@
NSUserActivityTypes
+ CoinPriceListIntent
SingleCoinPriceIntent
OfficeMode
diff --git a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/HorizontalDivider.swift b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/HorizontalDivider.swift
index 71abc234f2..e03853a65c 100644
--- a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/HorizontalDivider.swift
+++ b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/HorizontalDivider.swift
@@ -1,4 +1,5 @@
import SwiftUI
+import ThemeKit
struct HorizontalDivider: View {
private let color: Color
diff --git a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListSection.swift b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListSection.swift
index e83bd90300..9c14134df9 100644
--- a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListSection.swift
+++ b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListSection.swift
@@ -10,9 +10,7 @@ struct ListSection: View {
_VariadicView.Tree(Layout()) {
content
}
- .background(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous).fill(listStyle.backgroundColor))
- .clipShape(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous))
- .overlay(RoundedRectangle(cornerRadius: .cornerRadius12).stroke(listStyle.borderColor, lineWidth: .heightOneDp))
+ .modifier(ListStyleModifier(listStyle: listStyle))
}
}
diff --git a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListStyle.swift b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListStyle.swift
index 113a9ecab3..a792d0e44b 100644
--- a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListStyle.swift
+++ b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/ListStyle.swift
@@ -3,18 +3,36 @@ import SwiftUI
enum ListStyle {
case lawrence
case bordered
+ case transparent
+}
+
+struct ListStyleModifier: ViewModifier {
+ let listStyle: ListStyle
- var backgroundColor: Color {
- switch self {
- case .lawrence: return .themeLawrence
- case .bordered: return .clear
+ func body(content: Content) -> some View {
+ switch listStyle {
+ case .lawrence:
+ content
+ .background(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous).fill(Color.themeLawrence))
+ .clipShape(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous))
+ case .bordered:
+ content
+ .clipShape(RoundedRectangle(cornerRadius: .cornerRadius12, style: .continuous))
+ .overlay(RoundedRectangle(cornerRadius: .cornerRadius12).stroke(Color.themeSteel20, lineWidth: .heightOneDp))
+ case .transparent:
+ content
}
}
+}
+
+struct ListStyleButtonModifier: ViewModifier {
+ let listStyle: ListStyle
+ let isPressed: Bool
- var borderColor: Color {
- switch self {
- case .lawrence: return .clear
- case .bordered: return .themeSteel20
+ func body(content: Content) -> some View {
+ switch listStyle {
+ case .lawrence: content.background(isPressed ? Color.themeLawrencePressed : Color.themeLawrence)
+ case .bordered, .transparent: content.background(isPressed ? Color.themeLawrencePressed : Color.clear)
}
}
}
diff --git a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/RowButtonStyle.swift b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/RowButtonStyle.swift
index 7e83f83c71..55c9d06231 100644
--- a/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/RowButtonStyle.swift
+++ b/UnstoppableWallet/UnstoppableWallet/UserInterface/SwiftUI/RowButtonStyle.swift
@@ -5,6 +5,6 @@ struct RowButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
- .background(configuration.isPressed ? Color.themeLawrencePressed : listStyle.backgroundColor)
+ .modifier(ListStyleButtonModifier(listStyle: listStyle, isPressed: configuration.isPressed))
}
}
diff --git a/UnstoppableWallet/Widget/AppWidgetBundle.swift b/UnstoppableWallet/Widget/AppWidgetBundle.swift
index dccc7d0608..48cad1217c 100644
--- a/UnstoppableWallet/Widget/AppWidgetBundle.swift
+++ b/UnstoppableWallet/Widget/AppWidgetBundle.swift
@@ -5,5 +5,6 @@ import WidgetKit
struct AppWidgetBundle: WidgetBundle {
var body: some Widget {
SingleCoinPriceWidget()
+ TopCoinsWidget()
}
}
diff --git a/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListEntry.swift b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListEntry.swift
new file mode 100644
index 0000000000..2501ddf929
--- /dev/null
+++ b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListEntry.swift
@@ -0,0 +1,20 @@
+import Foundation
+import SwiftUI
+import WidgetKit
+
+struct CoinPriceListEntry: TimelineEntry {
+ let date: Date
+ let title: String
+ let sortType: String
+ let items: [Item]
+
+ struct Item {
+ let uid: String
+ let icon: Image?
+ let code: String
+ let name: String
+ let price: String
+ let priceChange: String
+ let priceChangeType: PriceChangeType
+ }
+}
diff --git a/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListProvider.swift b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListProvider.swift
new file mode 100644
index 0000000000..3aa51faf61
--- /dev/null
+++ b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListProvider.swift
@@ -0,0 +1,107 @@
+import Foundation
+import SwiftUI
+import WidgetKit
+
+struct CoinPriceListProvider: IntentTimelineProvider {
+ func placeholder(in context: Context) -> CoinPriceListEntry {
+ let count: Int
+
+ switch context.family {
+ case .systemSmall, .systemMedium: count = 3
+ default: count = 6
+ }
+
+ return CoinPriceListEntry(
+ date: Date(),
+ title: "Top Coins",
+ sortType: "Highest Cap",
+ items: (1 ... count).map { index in
+ CoinPriceListEntry.Item(
+ uid: "coin\(index)",
+ icon: nil,
+ code: "COD\(index)",
+ name: "Coin Name \(index)",
+ price: "$1234",
+ priceChange: "1.23",
+ priceChangeType: .unknown
+ )
+ }
+ )
+ }
+
+ func getSnapshot(for _: CoinPriceListIntent, in context: Context, completion: @escaping (CoinPriceListEntry) -> Void) {
+ Task {
+ let entry = try await fetch(sortType: .highestCap, family: context.family)
+ completion(entry)
+ }
+ }
+
+ func getTimeline(for configuration: CoinPriceListIntent, in context: Context, completion: @escaping (Timeline) -> Void) {
+ Task {
+ let entry = try await fetch(sortType: configuration.sortBy, family: context.family)
+
+ if let nextUpdate = Calendar.current.date(byAdding: DateComponents(minute: 15), to: Date()) {
+ let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
+ completion(timeline)
+ }
+ }
+ }
+
+ private func fetch(sortType: SortType, family: WidgetFamily) async throws -> CoinPriceListEntry {
+ let currency = CurrencyManager(storage: SharedLocalStorage()).baseCurrency
+ let apiProvider = ApiProvider(baseUrl: "https://api-dev.blocksdecoded.com")
+
+ let listType: ApiProvider.ListType
+ let listOrder: ApiProvider.ListOrder
+ let limit: Int
+
+ switch sortType {
+ case .highestCap, .lowestCap, .unknown: listType = .mcap
+ case .highestVolume, .lowestVolume: listType = .volume
+ case .topGainers, .topLosers: listType = .price
+ }
+
+ switch sortType {
+ case .highestCap, .highestVolume, .topGainers, .unknown: listOrder = .desc
+ case .lowestCap, .lowestVolume, .topLosers: listOrder = .asc
+ }
+
+ switch family {
+ case .systemSmall, .systemMedium: limit = 3
+ default: limit = 6
+ }
+
+ let coins = try await apiProvider.listCoins(type: listType, order: listOrder, limit: limit, currencyCode: currency.code)
+
+ return CoinPriceListEntry(
+ date: Date(),
+ title: "Top Coins",
+ sortType: title(sortType: sortType),
+ items: coins.map { coin in
+ let iconUrl = "https://cdn.blocksdecoded.com/coin-icons/32px/\(coin.uid)@3x.png"
+ let coinIcon = URL(string: iconUrl).flatMap { try? Data(contentsOf: $0) }.flatMap { UIImage(data: $0) }.map { Image(uiImage: $0) }
+
+ return CoinPriceListEntry.Item(
+ uid: coin.uid,
+ icon: coinIcon,
+ code: coin.code,
+ name: coin.name,
+ price: coin.price.flatMap { ValueFormatter.format(currency: currency, value: $0) } ?? "n/a",
+ priceChange: coin.priceChange24h.flatMap { ValueFormatter.format(percentValue: $0) } ?? "n/a",
+ priceChangeType: coin.priceChange24h.map { $0 >= 0 ? .up : .down } ?? .unknown
+ )
+ }
+ )
+ }
+
+ private func title(sortType: SortType) -> String {
+ switch sortType {
+ case .highestCap, .unknown: return "Highest Cap"
+ case .lowestCap: return "Lowest Cap"
+ case .highestVolume: return "Highest Volume"
+ case .lowestVolume: return "Lowest Volume"
+ case .topGainers: return "Top Gainers"
+ case .topLosers: return "Top Losers"
+ }
+ }
+}
diff --git a/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListView.swift b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListView.swift
new file mode 100644
index 0000000000..f7144edbcc
--- /dev/null
+++ b/UnstoppableWallet/Widget/CoinPriceList/CoinPriceListView.swift
@@ -0,0 +1,128 @@
+import Charts
+import SwiftUI
+import WidgetKit
+
+struct CoinPriceListView: View {
+ var entry: CoinPriceListProvider.Entry
+
+ @Environment(\.widgetFamily) private var family
+
+ var body: some View {
+ switch family {
+ case .systemSmall: smallView()
+ case .systemMedium: mediumView()
+ default: largeView()
+ }
+ }
+
+ @ViewBuilder private func smallView() -> some View {
+ ListSection {
+ ForEach(entry.items, id: \.uid) { item in
+ HStack(spacing: .margin8) {
+ icon(image: item.icon)
+
+ VStack(spacing: 1) {
+ Text(item.price)
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .font(.themeSubhead1)
+ .foregroundColor(.themeLeah)
+ Text(item.priceChange)
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .font(.themeCaption)
+ .foregroundColor(item.priceChangeType.color)
+ }
+ }
+ .padding(.horizontal, .margin16)
+ .frame(maxHeight: .infinity)
+ }
+ }
+ .listStyle(.transparent)
+ .frame(maxHeight: .infinity)
+ .padding(.vertical, .margin4)
+ }
+
+ @ViewBuilder private func mediumView() -> some View {
+ ListSection {
+ ForEach(entry.items, id: \.uid) { item in
+ row(item: item)
+ }
+ }
+ .listStyle(.transparent)
+ .frame(maxHeight: .infinity)
+ .padding(.vertical, .margin4)
+ }
+
+ @ViewBuilder private func largeView() -> some View {
+ VStack(spacing: 0) {
+ HStack(spacing: .margin16) {
+ Text(entry.title)
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .font(.themeSubhead1)
+ .foregroundColor(.themeLeah)
+
+ Text(entry.sortType)
+ .frame(maxWidth: .infinity, alignment: .trailing)
+ .font(.themeSubhead2)
+ .foregroundColor(.themeGray)
+ }
+ .padding(.margin16)
+
+ HorizontalDivider()
+
+ ListSection {
+ ForEach(entry.items, id: \.uid) { item in
+ row(item: item)
+ }
+ }
+ .listStyle(.transparent)
+ .frame(maxHeight: .infinity)
+ }
+ .padding(.vertical, .margin4)
+ }
+
+ @ViewBuilder private func icon(image: Image?) -> some View {
+ if let image = image {
+ image
+ .resizable()
+ .scaledToFit()
+ .frame(width: .iconSize32, height: .iconSize32)
+ } else {
+ Circle()
+ .fill(Color.themeGray)
+ .frame(width: .iconSize32, height: .iconSize32)
+ }
+ }
+
+ @ViewBuilder private func row(item: CoinPriceListEntry.Item) -> some View {
+ HStack(spacing: .margin16) {
+ icon(image: item.icon)
+
+ VStack(spacing: 1) {
+ HStack(spacing: .margin16) {
+ Text(item.code.uppercased())
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .font(.themeSubhead1)
+ .foregroundColor(.themeLeah)
+
+ Text(item.price)
+ .frame(maxWidth: .infinity, alignment: .trailing)
+ .font(.themeSubhead1)
+ .foregroundColor(.themeLeah)
+ }
+
+ HStack(spacing: .margin16) {
+ Text(item.name)
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .font(.themeSubhead2)
+ .foregroundColor(.themeGray)
+
+ Text(item.priceChange)
+ .font(.themeSubhead2)
+ .foregroundColor(item.priceChangeType.color)
+ }
+ }
+ }
+ .padding(.horizontal, .margin16)
+ .frame(maxHeight: .infinity)
+ }
+}
diff --git a/UnstoppableWallet/Widget/ApiProvider.swift b/UnstoppableWallet/Widget/Misc/ApiProvider.swift
similarity index 73%
rename from UnstoppableWallet/Widget/ApiProvider.swift
rename to UnstoppableWallet/Widget/Misc/ApiProvider.swift
index afe6836f65..7d29e766af 100644
--- a/UnstoppableWallet/Widget/ApiProvider.swift
+++ b/UnstoppableWallet/Widget/Misc/ApiProvider.swift
@@ -36,17 +36,27 @@ class ApiProvider {
return try await networkManager.fetch(url: "\(baseUrl)/v1/coins", method: .get, parameters: parameters, headers: headers)
}
- func coinWithPrice(uid: String, currencyCode: String) async throws -> CoinWithPrice {
+ func listCoins(type: ListType, order: ListOrder, limit: Int, currencyCode: String) async throws -> [Coin] {
+ let parameters: Parameters = [
+ "order": order.rawValue,
+ "limit": limit,
+ "currency": currencyCode.lowercased(),
+ ]
+
+ return try await networkManager.fetch(url: "\(baseUrl)/v1/coins/top-movers-by/\(type.rawValue)", method: .get, parameters: parameters, headers: headers)
+ }
+
+ func coinWithPrice(uid: String, currencyCode: String) async throws -> Coin {
let parameters: Parameters = [
"uids": uid,
"fields": "uid,name,code,price,price_change_24h",
"currency": currencyCode.lowercased(),
]
- let coinsWithPrice: [CoinWithPrice] = try await networkManager.fetch(url: "\(baseUrl)/v1/coins", method: .get, parameters: parameters, headers: headers)
+ let coins: [Coin] = try await networkManager.fetch(url: "\(baseUrl)/v1/coins", method: .get, parameters: parameters, headers: headers)
- if let coinWithPrice = coinsWithPrice.first {
- return coinWithPrice
+ if let coin = coins.first {
+ return coin
} else {
throw ResponseError.coinNotFound
}
@@ -65,33 +75,32 @@ class ApiProvider {
enum ResponseError: Error {
case coinNotFound
}
-}
-struct Coin: ImmutableMappable {
- let uid: String
- let name: String
- let code: String
+ enum ListOrder: String {
+ case asc
+ case desc
+ }
- init(map: Map) throws {
- uid = try map.value("uid")
- name = try map.value("name")
- code = try map.value("code")
+ enum ListType: String {
+ case price
+ case volume
+ case mcap
}
}
-struct CoinWithPrice: ImmutableMappable {
+struct Coin: ImmutableMappable {
let uid: String
let name: String
let code: String
- let price: Decimal
- let priceChange24h: Decimal
+ let price: Decimal?
+ let priceChange24h: Decimal?
init(map: Map) throws {
uid = try map.value("uid")
name = try map.value("name")
code = try map.value("code")
- price = try map.value("price", using: Transform.stringToDecimalTransform)
- priceChange24h = try map.value("price_change_24h", using: Transform.stringToDecimalTransform)
+ price = try? map.value("price", using: Transform.stringToDecimalTransform)
+ priceChange24h = try? map.value("price_change_24h", using: Transform.stringToDecimalTransform)
}
}
diff --git a/UnstoppableWallet/Widget/Misc/PriceChangeType.swift b/UnstoppableWallet/Widget/Misc/PriceChangeType.swift
new file mode 100644
index 0000000000..5ae78da73d
--- /dev/null
+++ b/UnstoppableWallet/Widget/Misc/PriceChangeType.swift
@@ -0,0 +1,14 @@
+import SwiftUI
+import ThemeKit
+
+enum PriceChangeType {
+ case up, down, unknown
+
+ var color: Color {
+ switch self {
+ case .up: return .themeRemus
+ case .down: return .themeLucian
+ case .unknown: return .themeGray
+ }
+ }
+}
diff --git a/UnstoppableWallet/Widget/ValueFormatter.swift b/UnstoppableWallet/Widget/Misc/ValueFormatter.swift
similarity index 100%
rename from UnstoppableWallet/Widget/ValueFormatter.swift
rename to UnstoppableWallet/Widget/Misc/ValueFormatter.swift
diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceEntry.swift b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceEntry.swift
index 44708e61b7..de06d1dfa9 100644
--- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceEntry.swift
+++ b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceEntry.swift
@@ -7,9 +7,9 @@ struct SingleCoinPriceEntry: TimelineEntry {
let coinUid: String
let coinIcon: Image?
let coinCode: String
- let price: Decimal
- let currency: Currency
- let priceChange: Decimal
+ let price: String
+ let priceChange: String
+ let priceChangeType: PriceChangeType
let chartPoints: [ChartPoint]?
struct ChartPoint: Identifiable {
diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceProvider.swift b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceProvider.swift
index 416c9eb1c3..204b8c7e36 100644
--- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceProvider.swift
+++ b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceProvider.swift
@@ -11,9 +11,9 @@ struct SingleCoinPriceProvider: IntentTimelineProvider {
coinUid: fallbackCoinUid,
coinIcon: nil,
coinCode: "BTC",
- price: 30000,
- currency: Currency(code: "USD", symbol: "$", decimal: 2),
- priceChange: 2.45,
+ price: "$30000",
+ priceChange: "2.45",
+ priceChangeType: .unknown,
chartPoints: placeholderChartPoints()
)
}
@@ -39,17 +39,17 @@ struct SingleCoinPriceProvider: IntentTimelineProvider {
}
private func fetch(coinUid: String) async throws -> SingleCoinPriceEntry {
- let currencyManager = CurrencyManager(storage: SharedLocalStorage())
+ let currency = CurrencyManager(storage: SharedLocalStorage()).baseCurrency
let apiProvider = ApiProvider(baseUrl: "https://api-dev.blocksdecoded.com")
- let coin = try await apiProvider.coinWithPrice(uid: coinUid, currencyCode: currencyManager.baseCurrency.code)
+ let coin = try await apiProvider.coinWithPrice(uid: coinUid, currencyCode: currency.code)
let iconUrl = "https://cdn.blocksdecoded.com/coin-icons/32px/\(coin.uid)@3x.png"
let coinIcon = URL(string: iconUrl).flatMap { try? Data(contentsOf: $0) }.flatMap { UIImage(data: $0) }.map { Image(uiImage: $0) }
var chartPoints: [SingleCoinPriceEntry.ChartPoint]?
- if let points = try? await apiProvider.coinPriceChart(coinUid: coinUid, currencyCode: currencyManager.baseCurrency.code) {
+ if let points = try? await apiProvider.coinPriceChart(coinUid: coinUid, currencyCode: currency.code) {
chartPoints = points
.sorted { point, point2 in
point.timestamp < point2.timestamp
@@ -67,9 +67,9 @@ struct SingleCoinPriceProvider: IntentTimelineProvider {
coinUid: coin.uid,
coinIcon: coinIcon,
coinCode: coin.code,
- price: coin.price,
- currency: currencyManager.baseCurrency,
- priceChange: coin.priceChange24h,
+ price: coin.price.flatMap { ValueFormatter.format(currency: currency, value: $0) } ?? "n/a",
+ priceChange: coin.priceChange24h.flatMap { ValueFormatter.format(percentValue: $0) } ?? "n/a",
+ priceChangeType: coin.priceChange24h.map { $0 >= 0 ? .up : .down } ?? .unknown,
chartPoints: chartPoints
)
}
diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceView.swift b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceView.swift
index 96e94251c7..cadc50c2c7 100644
--- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceView.swift
+++ b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceView.swift
@@ -49,21 +49,18 @@ struct SingleCoinPriceView: View {
}
VStack(alignment: .leading, spacing: 1) {
- if let formattedValue = ValueFormatter.format(percentValue: entry.priceChange) {
- Text(formattedValue)
- .font(.themeSubhead2)
- .foregroundColor(entry.priceChange >= 0 ? .themeRemus : .themeLucian)
- }
+ Text(entry.priceChange)
+ .font(.themeSubhead2)
+ .foregroundColor(entry.priceChangeType.color)
- if let formattedValue = ValueFormatter.format(currency: entry.currency, value: entry.price) {
- Text(formattedValue)
- .frame(maxWidth: .infinity, alignment: .leading)
- .frame(height: 26)
- .minimumScaleFactor(0.5)
- .font(.themeHeadline1)
- .foregroundColor(.themeLeah)
- }
+ Text(entry.price)
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .frame(height: 26)
+ .minimumScaleFactor(0.5)
+ .font(.themeHeadline1)
+ .foregroundColor(.themeLeah)
}
}
+ .padding(.margin16)
}
}
diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.intentdefinition b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.intentdefinition
index 72c9ff2cf6..56bea18d0a 100644
--- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.intentdefinition
+++ b/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.intentdefinition
@@ -3,13 +3,97 @@
INEnums
-
+
+
+ INEnumDisplayName
+ Sort Type
+ INEnumDisplayNameID
+ ZBHf6A
+ INEnumGeneratesHeader
+
+ INEnumName
+ SortType
+ INEnumType
+ Regular
+ INEnumValues
+
+
+ INEnumValueDisplayName
+ unknown
+ INEnumValueDisplayNameID
+ XtJmIS
+ INEnumValueName
+ unknown
+
+
+ INEnumValueDisplayName
+ Highest Cap
+ INEnumValueDisplayNameID
+ qHGyuo
+ INEnumValueIndex
+ 1
+ INEnumValueName
+ highestCap
+
+
+ INEnumValueDisplayName
+ Lowest Cap
+ INEnumValueDisplayNameID
+ tVjZ7W
+ INEnumValueIndex
+ 2
+ INEnumValueName
+ lowestCap
+
+
+ INEnumValueDisplayName
+ Highest Volume
+ INEnumValueDisplayNameID
+ t6AKQ5
+ INEnumValueIndex
+ 3
+ INEnumValueName
+ highestVolume
+
+
+ INEnumValueDisplayName
+ Lowest Volume
+ INEnumValueDisplayNameID
+ C1LmDj
+ INEnumValueIndex
+ 4
+ INEnumValueName
+ lowestVolume
+
+
+ INEnumValueDisplayName
+ Top Gainers
+ INEnumValueDisplayNameID
+ Rl3a0T
+ INEnumValueIndex
+ 5
+ INEnumValueName
+ topGainers
+
+
+ INEnumValueDisplayName
+ Top Losers
+ INEnumValueDisplayNameID
+ x1kK4T
+ INEnumValueIndex
+ 6
+ INEnumValueName
+ topLosers
+
+
+
+
INIntentDefinitionModelVersion
1.2
INIntentDefinitionNamespace
5N3KPh
INIntentDefinitionSystemVersion
- 22G91
+ 23A344
INIntentDefinitionToolsBuildVersion
15A240d
INIntentDefinitionToolsVersion
@@ -47,6 +131,89 @@
INIntentParameterObjectTypeNamespace
5N3KPh
INIntentParameterPromptDialogs
+
+
+ INIntentParameterPromptDialogCustom
+
+ INIntentParameterPromptDialogType
+ Configuration
+
+
+ INIntentParameterPromptDialogCustom
+
+ INIntentParameterPromptDialogType
+ Primary
+
+
+ INIntentParameterSupportsDynamicEnumeration
+
+ INIntentParameterTag
+ 2
+ INIntentParameterType
+ Object
+
+
+ INIntentResponse
+
+ INIntentResponseCodes
+
+
+ INIntentResponseCodeName
+ success
+ INIntentResponseCodeSuccess
+
+
+
+ INIntentResponseCodeName
+ failure
+
+
+
+ INIntentTitle
+ Single Coin Price
+ INIntentTitleID
+ hrLfmt
+ INIntentType
+ Custom
+ INIntentVerb
+ Do
+
+
+ INIntentCategory
+ information
+ INIntentDescriptionID
+ rCV9fg
+ INIntentEligibleForWidgets
+
+ INIntentIneligibleForSuggestions
+
+ INIntentLastParameterTag
+ 3
+ INIntentName
+ CoinPriceList
+ INIntentParameters
+
+
+ INIntentParameterConfigurable
+
+ INIntentParameterDisplayName
+ Sort By
+ INIntentParameterDisplayNameID
+ 8vJheC
+ INIntentParameterDisplayPriority
+ 1
+ INIntentParameterEnumType
+ SortType
+ INIntentParameterEnumTypeNamespace
+ 5N3KPh
+ INIntentParameterMetadata
+
+ INIntentParameterMetadataDefaultValue
+ highestCap
+
+ INIntentParameterName
+ sortBy
+ INIntentParameterPromptDialogs
INIntentParameterPromptDialogCustom
@@ -64,9 +231,9 @@
INIntentParameterPromptDialogCustom
INIntentParameterPromptDialogFormatString
- There are ${count} options matching ‘${selectedCoin}’.
+ There are ${count} options matching ‘${sortBy}’.
INIntentParameterPromptDialogFormatStringID
- 2fP1jb
+ nj8Co9
INIntentParameterPromptDialogType
DisambiguationIntroduction
@@ -74,19 +241,17 @@
INIntentParameterPromptDialogCustom
INIntentParameterPromptDialogFormatString
- Just to confirm, you wanted ‘${selectedCoin}’?
+ Just to confirm, you wanted ‘${sortBy}’?
INIntentParameterPromptDialogFormatStringID
- jqvOcG
+ Iodq3O
INIntentParameterPromptDialogType
Confirmation
- INIntentParameterSupportsDynamicEnumeration
-
INIntentParameterTag
- 2
+ 3
INIntentParameterType
- Object
+ Integer
INIntentResponse
@@ -106,13 +271,13 @@
INIntentTitle
- Single Coin Price
+ Coin Price List
INIntentTitleID
- hrLfmt
+ 2puq80
INIntentType
Custom
INIntentVerb
- Do
+ View
INTypes
diff --git a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.swift b/UnstoppableWallet/Widget/SingleCoinPriceWidget.swift
similarity index 94%
rename from UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.swift
rename to UnstoppableWallet/Widget/SingleCoinPriceWidget.swift
index 4114867cd7..7394310eaf 100644
--- a/UnstoppableWallet/Widget/SingleCoinPrice/SingleCoinPriceWidget.swift
+++ b/UnstoppableWallet/Widget/SingleCoinPriceWidget.swift
@@ -1,6 +1,5 @@
import Foundation
import SwiftUI
-import ThemeKit
import WidgetKit
struct SingleCoinPriceWidget: Widget {
@@ -17,10 +16,10 @@ struct SingleCoinPriceWidget: Widget {
.containerBackground(.fill.tertiary, for: .widget)
} else {
SingleCoinPriceView(entry: entry)
- .padding()
.background()
}
}
+ .contentMarginsDisabled()
.configurationDisplayName("Coin Price")
.description("Displays price for certain coin.")
.supportedFamilies([
diff --git a/UnstoppableWallet/Widget/TopCoinsWidget.swift b/UnstoppableWallet/Widget/TopCoinsWidget.swift
new file mode 100644
index 0000000000..bb452e6003
--- /dev/null
+++ b/UnstoppableWallet/Widget/TopCoinsWidget.swift
@@ -0,0 +1,31 @@
+import Foundation
+import SwiftUI
+import WidgetKit
+
+struct TopCoinsWidget: Widget {
+ let kind: String = "io.horizontalsystems.unstoppable.TopCoinsWidget"
+
+ var body: some WidgetConfiguration {
+ IntentConfiguration(
+ kind: kind,
+ intent: CoinPriceListIntent.self,
+ provider: CoinPriceListProvider()
+ ) { entry in
+ if #available(iOS 17.0, *) {
+ CoinPriceListView(entry: entry)
+ .containerBackground(.fill.tertiary, for: .widget)
+ } else {
+ CoinPriceListView(entry: entry)
+ .background()
+ }
+ }
+ .contentMarginsDisabled()
+ .configurationDisplayName("Top Coins")
+ .description("Displays price for top coins.")
+ .supportedFamilies([
+ .systemSmall,
+ .systemMedium,
+ .systemLarge,
+ ])
+ }
+}