6 KiB
Domain Models
Core business models used across the application. Models are defined in domain/models/ and domain/account/.
StatusSource
Location: domain/models — com.tangem.domain.models.StatusSource
Enum representing data loading/refresh status. Used across all status models (NetworkStatus, QuoteStatus, YieldBalance, CryptoCurrencyStatus.Sources):
CACHE— initial status, data loaded from cacheACTUAL— terminal status, data successfully fetched from serverONLY_CACHE— terminal status, data could not be refreshed (only cached data available)
CryptoCurrency
Location: domain/models — com.tangem.domain.models.currency.CryptoCurrency
Sealed class representing a cryptocurrency — either a native coin (Coin) or a token (Token). Used throughout the application: portfolio, token search, swaps, buy/sell, staking, etc.
CryptoCurrencyStatus
Location: domain/models — com.tangem.domain.models.currency.CryptoCurrencyStatus
Model representing a currency with its balance state. Primarily used to display user's coin balance in the portfolio. Wraps CryptoCurrency with a Value sealed interface:
| Value subtype | Description |
|---|---|
Loading |
First-time fetch; once data is loaded, subsequent updates use cache via StatusSource, bypassing Loading |
Loaded |
Full data available |
Custom |
Custom token in portfolio; some data may be missing (e.g., no balance if backend has no quotes for it) |
NoQuote |
Balance known, no price data |
NoAccount |
Account not created (e.g., Solana reserve) |
Unreachable |
Network error |
NoAmount |
Coin is added to portfolio but no blockchain data available for it |
MissedDerivation |
Coin has no derivations — failed to obtain a blockchain network address |
All Value subtypes carry sources: Sources tracking data freshness per dimension: networkSource, quoteSource, stakingBalanceSource, and aggregated total.
Network
Location: domain/models — com.tangem.domain.models.network.Network
Represents a blockchain network (e.g., Ethereum, Bitcoin). Contains network metadata: ID, name, currency symbol, derivation path, standard type (ERC20, TRC20, BEP20, etc.), and capabilities (token support, transaction extras, name resolving).
NetworkStatus
Location: domain/models — com.tangem.domain.models.network.NetworkStatus
Blockchain balances for all tokens of a network at a specific address. Only Verified and NoAccount are cached.
| Value subtype | Description |
|---|---|
Verified |
Successful response from blockchain |
Unreachable |
Failed response from blockchain |
NoAccount |
Blockchain-specific status for chains that require a deposit to an address before it can be used |
MissedDerivation |
Derivation failed — no blockchain network address |
QuoteStatus
Location: domain/models — com.tangem.domain.models.quote.QuoteStatus
Exchange rate between the app's selected fiat currency and a coin's currency.
YieldBalance
Location: domain/models — com.tangem.domain.models.staking.YieldBalance
Staking yield balance for a specific StakingID (integrationId + address).
TotalFiatBalance
Location: domain/models — com.tangem.domain.models.TotalFiatBalance
Aggregate fiat balance across all tokens. Sealed interface with three states: Loading, Failed, Loaded(amount, source).
TokenList
Location: domain/models — com.tangem.domain.models.tokenlist.TokenList
List of cryptocurrency tokens for display in portfolio. Sealed interface with subtypes:
GroupedByNetwork— tokens grouped byNetwork, each group contains a list ofCryptoCurrencyStatusUngrouped— flat list ofCryptoCurrencyStatusEmpty— no tokens
All subtypes carry totalFiatBalance: TotalFiatBalance and sortedBy: TokensSortType.
Account
Location: domain/models — com.tangem.domain.models.account.Account
Model representing a user account. Subtypes:
Account.CryptoPortfolio— crypto portfolio with coins. All tokens in the account share the account's derivation (main account is an exception). Has aDerivationIndex:0for main account,1..19for secondaryAccount.Payment— account for Visa card integration
AccountStatus
Location: domain/models — com.tangem.domain.models.account.AccountStatus
Model representing an account with balances. Has a similar structure to Account: CryptoPortfolio and Payment subtypes.
AccountList
Location: domain/account — com.tangem.domain.account.models.AccountList
List of all accounts for a user wallet (UserWallet).
Business rules (enforced by factory returning Either<Error, AccountList>):
- Accounts list cannot be empty
- Exactly 1 main account
- Max 20 active accounts (
MAX_ACCOUNTS_COUNT), max 1000 archived - No duplicate AccountIds or custom AccountNames
totalAccounts >= activeAccounts
AccountStatusList
Location: domain/account — com.tangem.domain.account.models.AccountStatusList
Same as AccountList but with balances (wraps AccountStatus instead of Account).
UserWallet
Location: domain/models — com.tangem.domain.models.wallet.UserWallet
Top-level model representing a user's wallet stored in the app. Subtypes:
Cold— wallet backed by a physical Tangem card (NFC). ContainsScanResponse, card info, backup stateHot— software (hot) wallet without a physical card
Model Hierarchy
UserWallet
└─ AccountList / AccountStatusList
└─ Account.CryptoPortfolio / AccountStatus.CryptoPortfolio
├─ CryptoCurrency (Coin | Token)
│ └─ CryptoCurrencyStatus (currency + Value state)
│ ├─ built from NetworkStatus (per network)
│ ├─ built from QuoteStatus (per rawCurrencyId)
│ └─ built from YieldBalance (per stakingId)
├─ AccountId (SHA-256 hash)
├─ DerivationIndex (0 = main)
└─ CryptoPortfolioIcon (icon + color)