diff --git a/common/ui/src/main/java/com/tangem/common/ui/account/CryptoPortfolioIconExt.kt b/common/ui/src/main/java/com/tangem/common/ui/account/CryptoPortfolioIconExt.kt
new file mode 100644
index 0000000000..96cc19fb44
--- /dev/null
+++ b/common/ui/src/main/java/com/tangem/common/ui/account/CryptoPortfolioIconExt.kt
@@ -0,0 +1,49 @@
+package com.tangem.common.ui.account
+
+import androidx.annotation.DrawableRes
+import androidx.compose.ui.graphics.Color
+import com.tangem.core.ui.R
+import com.tangem.domain.models.account.CryptoPortfolioIcon
+
+/** Extension function to get the UI color associated with an [CryptoPortfolioIcon.Color] */
+fun CryptoPortfolioIcon.Color.getUiColor(): Color {
+ return when (this) {
+ CryptoPortfolioIcon.Color.Azure -> Color(color = 0xFF007FFF)
+ CryptoPortfolioIcon.Color.CaribbeanBlue -> Color(color = 0xFF0FBED6)
+ CryptoPortfolioIcon.Color.DullLavender -> Color(color = 0xFFA28BF2)
+ CryptoPortfolioIcon.Color.CandyGrapeFizz -> Color(color = 0xFF704AF1)
+ CryptoPortfolioIcon.Color.SweetDesire -> Color(color = 0xFFAF34E3)
+ CryptoPortfolioIcon.Color.PalatinateBlue -> Color(color = 0xFF2D30EE)
+ CryptoPortfolioIcon.Color.FuchsiaNebula -> Color(color = 0xFF7E28A3)
+ CryptoPortfolioIcon.Color.Pelati -> Color(color = 0xFFFF2E32)
+ CryptoPortfolioIcon.Color.Pattypan -> Color(color = 0xFFF0B90B)
+ CryptoPortfolioIcon.Color.UFOGreen -> Color(color = 0xFF32CB77)
+ CryptoPortfolioIcon.Color.SweetHoney -> Color(color = 0xFFD1A657)
+ }
+}
+
+/** Extension function to get the drawable resource ID associated with an [CryptoPortfolioIcon.Icon] */
+@Suppress("CyclomaticComplexMethod")
+@DrawableRes
+fun CryptoPortfolioIcon.Icon.getResId(): Int {
+ return when (this) {
+ CryptoPortfolioIcon.Icon.Letter -> R.drawable.ic_letter_24
+ CryptoPortfolioIcon.Icon.Star -> R.drawable.ic_rounded_star_24
+ CryptoPortfolioIcon.Icon.User -> R.drawable.ic_user_24
+ CryptoPortfolioIcon.Icon.Family -> R.drawable.ic_family_24
+ CryptoPortfolioIcon.Icon.Wallet -> R.drawable.ic_wallet_24
+ CryptoPortfolioIcon.Icon.Money -> R.drawable.ic_money_24
+ CryptoPortfolioIcon.Icon.Home -> R.drawable.ic_home_24
+ CryptoPortfolioIcon.Icon.Safe -> R.drawable.ic_safe_24
+ CryptoPortfolioIcon.Icon.Beach -> R.drawable.ic_beach_24
+ CryptoPortfolioIcon.Icon.AirplaneMode -> R.drawable.ic_airplane_mode_24
+ CryptoPortfolioIcon.Icon.Shirt -> R.drawable.ic_shirt_24
+ CryptoPortfolioIcon.Icon.ShoppingBasket -> R.drawable.ic_shopping_basket_24
+ CryptoPortfolioIcon.Icon.Favourite -> R.drawable.ic_favourite_24
+ CryptoPortfolioIcon.Icon.Bookmark -> R.drawable.ic_bookmark_24
+ CryptoPortfolioIcon.Icon.StartUp -> R.drawable.ic_start_up_24
+ CryptoPortfolioIcon.Icon.Clock -> R.drawable.ic_circle_clock_24
+ CryptoPortfolioIcon.Icon.Package -> R.drawable.ic_package_24
+ CryptoPortfolioIcon.Icon.Gift -> R.drawable.ic_gift_24
+ }
+}
\ No newline at end of file
diff --git a/core/ui/src/main/res/drawable/ic_airplane_mode_24.xml b/core/ui/src/main/res/drawable/ic_airplane_mode_24.xml
new file mode 100644
index 0000000000..1675380665
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_airplane_mode_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_beach_24.xml b/core/ui/src/main/res/drawable/ic_beach_24.xml
new file mode 100644
index 0000000000..1924d45f03
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_beach_24.xml
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_bookmark_24.xml b/core/ui/src/main/res/drawable/ic_bookmark_24.xml
new file mode 100644
index 0000000000..71339a6d61
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_bookmark_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_circle_clock_24.xml b/core/ui/src/main/res/drawable/ic_circle_clock_24.xml
new file mode 100644
index 0000000000..e9ffc5829c
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_circle_clock_24.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_family_24.xml b/core/ui/src/main/res/drawable/ic_family_24.xml
new file mode 100644
index 0000000000..237d6fe900
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_family_24.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_favourite_24.xml b/core/ui/src/main/res/drawable/ic_favourite_24.xml
new file mode 100644
index 0000000000..141b953ff5
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_favourite_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_gift_24.xml b/core/ui/src/main/res/drawable/ic_gift_24.xml
new file mode 100644
index 0000000000..f65dfa8e45
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_gift_24.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_home_24.xml b/core/ui/src/main/res/drawable/ic_home_24.xml
new file mode 100644
index 0000000000..dc1b6183b9
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_home_24.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_letter_24.xml b/core/ui/src/main/res/drawable/ic_letter_24.xml
new file mode 100644
index 0000000000..5533166467
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_letter_24.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_money_24.xml b/core/ui/src/main/res/drawable/ic_money_24.xml
new file mode 100644
index 0000000000..ab5e464707
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_money_24.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_package_24.xml b/core/ui/src/main/res/drawable/ic_package_24.xml
new file mode 100644
index 0000000000..cdd65a9d87
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_package_24.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_rounded_star_24.xml b/core/ui/src/main/res/drawable/ic_rounded_star_24.xml
new file mode 100644
index 0000000000..7ac40b791d
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_rounded_star_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_safe_24.xml b/core/ui/src/main/res/drawable/ic_safe_24.xml
new file mode 100644
index 0000000000..b5ad950fa4
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_safe_24.xml
@@ -0,0 +1,15 @@
+
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_shirt_24.xml b/core/ui/src/main/res/drawable/ic_shirt_24.xml
new file mode 100644
index 0000000000..23d594ab98
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_shirt_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_shopping_basket_24.xml b/core/ui/src/main/res/drawable/ic_shopping_basket_24.xml
new file mode 100644
index 0000000000..a127e763a4
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_shopping_basket_24.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_start_up_24.xml b/core/ui/src/main/res/drawable/ic_start_up_24.xml
new file mode 100644
index 0000000000..1cbfb12392
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_start_up_24.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_user_24.xml b/core/ui/src/main/res/drawable/ic_user_24.xml
new file mode 100644
index 0000000000..f2ba2b493a
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_user_24.xml
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/core/ui/src/main/res/drawable/ic_wallet_24.xml b/core/ui/src/main/res/drawable/ic_wallet_24.xml
new file mode 100644
index 0000000000..3eda593712
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_wallet_24.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/domain/models/src/main/kotlin/com/tangem/domain/models/account/CryptoPortfolioIcon.kt b/domain/models/src/main/kotlin/com/tangem/domain/models/account/CryptoPortfolioIcon.kt
new file mode 100644
index 0000000000..cb96240154
--- /dev/null
+++ b/domain/models/src/main/kotlin/com/tangem/domain/models/account/CryptoPortfolioIcon.kt
@@ -0,0 +1,148 @@
+package com.tangem.domain.models.account
+
+import com.tangem.domain.models.account.CryptoPortfolioIcon.Companion.ofCustomAccount
+import com.tangem.domain.models.account.CryptoPortfolioIcon.Companion.ofMainAccount
+import kotlinx.serialization.Serializable
+
+/**
+ * Represents an icon for an [Account.CryptoPortfolio] account
+ *
+ * @property type the type of the account icon
+ * @property color the color of the account icon
+ *
+ * @constructor [ofMainAccount], [ofCustomAccount]
+ *
+[REDACTED_AUTHOR]
+ */
+@Serializable
+data class CryptoPortfolioIcon private constructor(
+ val type: Type,
+ val color: Color,
+) {
+
+ /**
+ * Represents the type of an account icon. Can either be a specific [Icon] or a [Symbol]
+ */
+ @Serializable
+ sealed interface Type {
+
+ /**
+ * Represents a specific predefined icon type
+ *
+ * @property value the predefined [Icon] of the icon
+ */
+ @Serializable
+ data class Icon(val value: CryptoPortfolioIcon.Icon) : Type
+
+ /**
+ * Represents an icon with a letter
+ *
+ * @property value the letter used as the icon
+ */
+ @Serializable
+ data class Symbol(val value: Char) : Type
+ }
+
+ /**
+ * Enum class representing the icons of accounts
+ */
+ @Serializable
+ enum class Icon {
+ Letter,
+ Star,
+ User,
+ Family,
+ Wallet,
+ Money,
+ Home,
+ Safe,
+ Beach,
+ AirplaneMode,
+ Shirt,
+ ShoppingBasket,
+ Favourite,
+ Bookmark,
+ StartUp,
+ Clock,
+ Package,
+ Gift,
+ ;
+ }
+
+ /**
+ * Enum class representing the colors of account icons
+ */
+ @Serializable
+ enum class Color {
+ Azure,
+ CaribbeanBlue,
+ DullLavender,
+ CandyGrapeFizz,
+ SweetDesire,
+ PalatinateBlue,
+ FuchsiaNebula,
+ Pelati,
+ Pattypan,
+ UFOGreen,
+ SweetHoney,
+ ;
+ }
+
+ companion object {
+
+ private val defaultMainAccountType: Icon = Icon.Star
+ private val defaultMainAccountColor: Color = Color.Azure
+
+ /**
+ * Creates an [CryptoPortfolioIcon] for the Main account, ensuring the color is not in the excluded set.
+ *
+ * @param exclude excluded colors that are already used for main accounts
+ */
+ fun ofMainAccount(exclude: Set): CryptoPortfolioIcon {
+ val isDefaultColorBusy = defaultMainAccountColor in exclude
+
+ val color = if (isDefaultColorBusy) {
+ val colorsWithExcluded = Color.entries - exclude
+
+ val availableColors = if (colorsWithExcluded.isNotEmpty()) {
+ colorsWithExcluded
+ } else {
+ Color.entries
+ }
+
+ availableColors.random()
+ } else {
+ defaultMainAccountColor
+ }
+
+ return CryptoPortfolioIcon(
+ type = Type.Icon(value = defaultMainAccountType),
+ color = color,
+ )
+ }
+
+ /**
+ * Creates an [CryptoPortfolioIcon] for a user account based on the account name
+ *
+ * @param accountName the name of the account, used to determine the letter for the icon
+ */
+ fun ofCustomAccount(accountName: String): CryptoPortfolioIcon {
+ val color = Color.entries.random()
+
+ return CryptoPortfolioIcon(
+ type = Type.Symbol(value = accountName.first()),
+ color = color,
+ )
+ }
+
+ /**
+ * Creates a [CryptoPortfolioIcon] for a user account with a specific type and color
+ *
+ * @param type the type of the account icon
+ * @param color the color of the account icon
+ */
+ fun ofCustomAccount(type: Type, color: Color): CryptoPortfolioIcon {
+ return CryptoPortfolioIcon(type = type, color = color)
+ }
+ }
+}
\ No newline at end of file