Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions lib/bloc/app_bloc_root.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import 'package:web_dex/bloc/cex_market_data/profit_loss/profit_loss_bloc.dart';
import 'package:web_dex/bloc/cex_market_data/profit_loss/profit_loss_repository.dart';
import 'package:web_dex/bloc/coins_bloc/coins_bloc.dart';
import 'package:web_dex/bloc/coins_bloc/coins_repo.dart';
import 'package:web_dex/bloc/coins_manager/coins_manager_bloc.dart';
import 'package:web_dex/bloc/dex_repository.dart';
import 'package:web_dex/bloc/market_maker_bot/market_maker_bot/market_maker_bot_bloc.dart';
import 'package:web_dex/bloc/market_maker_bot/market_maker_bot/market_maker_bot_repository.dart';
Expand Down Expand Up @@ -125,7 +126,7 @@ class AppBlocRoot extends StatelessWidget {
demoDataGenerator: DemoDataCache.withDefaults(),
)
: */
TransactionHistoryRepo(sdk: komodoDefiSdk);
SdkTransactionHistoryRepository(sdk: komodoDefiSdk);

final profitLossRepo = ProfitLossRepository.withDefaults(
transactionHistoryRepo: transactionsRepo,
Expand All @@ -135,7 +136,6 @@ class AppBlocRoot extends StatelessWidget {
demoMode: performanceMode,
coinsRepository: coinsRepository,
mm2Api: mm2Api,
sdk: komodoDefiSdk,
);

final portfolioGrowthRepo = PortfolioGrowthRepository.withDefaults(
Expand All @@ -144,7 +144,6 @@ class AppBlocRoot extends StatelessWidget {
demoMode: performanceMode,
coinsRepository: coinsRepository,
mm2Api: mm2Api,
sdk: komodoDefiSdk,
);

_clearCachesIfPerformanceModeChanged(
Expand Down Expand Up @@ -303,6 +302,12 @@ class AppBlocRoot extends StatelessWidget {
coinsRepository: coinsRepository,
),
),
BlocProvider<CoinsManagerBloc>(
create: (context) => CoinsManagerBloc(
coinsRepo: coinsRepository,
sdk: komodoDefiSdk,
),
),
],
child: _MyAppView(),
),
Expand Down
4 changes: 2 additions & 2 deletions lib/bloc/assets_overview/bloc/asset_overview_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {

try {
final profitLosses = await profitLossRepository.getProfitLoss(
event.coin.abbr,
event.coin.id,
'USDT',
event.walletId,
);
Expand Down Expand Up @@ -96,7 +96,7 @@ class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {
// affect the total investment calculation.
try {
return await profitLossRepository.getProfitLoss(
coin.abbr,
coin.id,
'USDT',
event.walletId,
);
Expand Down
3 changes: 1 addition & 2 deletions lib/bloc/assets_overview/investment_repository.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:web_dex/bloc/cex_market_data/profit_loss/models/fiat_value.dart';
import 'package:web_dex/bloc/cex_market_data/profit_loss/profit_loss_repository.dart';
import 'package:web_dex/model/coin.dart';

import 'package:web_dex/shared/utils/utils.dart' as logger;

class InvestmentRepository {
Expand Down Expand Up @@ -29,7 +28,7 @@ class InvestmentRepository {
// affect the total investment calculation.
try {
final profitLoss = await _profitLossRepository.getProfitLoss(
coin.abbr,
coin.id,
'USDT',
walletId,
);
Expand Down
79 changes: 48 additions & 31 deletions lib/bloc/cex_market_data/mockup/generate_demo_data.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'dart:math';

import 'package:decimal/decimal.dart';
import 'package:komodo_cex_market_data/komodo_cex_market_data.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:uuid/uuid.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart';
import 'package:web_dex/mm2/mm2_api/rpc/my_tx_history/transaction.dart';
import 'package:web_dex/model/withdraw_details/fee_details.dart';

// similar to generator implementation to allow for const constructor
final _ohlcvCache = <CexCoinPair, List<Ohlc>>{};
Expand Down Expand Up @@ -110,7 +110,7 @@ class DemoDataGenerator {
transactions.add(transaction);
}

totalBalance += double.parse(transaction.myBalanceChange);
totalBalance += transaction.balanceChanges.netChange.toDouble();
if (totalBalance <= 0) {
totalBalance = targetFinalBalance;
break;
Expand All @@ -131,22 +131,34 @@ class DemoDataGenerator {
double totalBalance,
List<Transaction> transactions,
) {
double adjustmentFactor = targetFinalBalance / totalBalance;
final Decimal adjustmentFactor =
Decimal.parse((targetFinalBalance / totalBalance).toString());
final adjustedTransactions = <Transaction>[];
for (var transaction in transactions) {
final netChange = transaction.balanceChanges.netChange;
final received = transaction.balanceChanges.receivedByMe;
final spent = transaction.balanceChanges.spentByMe;
final totalAmount = transaction.balanceChanges.totalAmount;

adjustedTransactions.add(
transaction.copyWith(
myBalanceChange:
(double.parse(transaction.myBalanceChange) * adjustmentFactor)
.toString(),
receivedByMe:
(double.parse(transaction.receivedByMe) * adjustmentFactor)
.toString(),
spentByMe: (double.parse(transaction.spentByMe) * adjustmentFactor)
.toString(),
totalAmount:
(double.parse(transaction.totalAmount) * adjustmentFactor)
.toString(),
Transaction(
id: transaction.id,
timestamp: transaction.timestamp,
assetId: transaction.assetId,
blockHeight: transaction.blockHeight,
from: transaction.from,
internalId: transaction.internalId,
confirmations: transaction.confirmations,
to: transaction.to,
txHash: transaction.txHash,
fee: transaction.fee,
memo: transaction.memo,
balanceChanges: BalanceChanges(
netChange: netChange * adjustmentFactor,
receivedByMe: received * adjustmentFactor,
spentByMe: spent * adjustmentFactor,
totalAmount: totalAmount * adjustmentFactor,
),
),
);
}
Expand Down Expand Up @@ -193,25 +205,30 @@ Transaction fromTradeAmount(
final random = Random(42);

return Transaction(
id: uuid.v4(),
blockHeight: random.nextInt(100000) + 100000,
coin: coinId,
confirmations: random.nextInt(3) + 1,
feeDetails: FeeDetails(
type: "fixed",
coin: "USDT",
amount: "1.0",
totalFee: "1.0",
assetId: AssetId(
chainId: AssetChainId(chainId: 0),
derivationPath: '',
id: coinId,
name: coinId,
subClass: CoinSubClass.smartChain,
symbol: AssetSymbol(assetConfigId: coinId),
),
from: ["address1"],
confirmations: random.nextInt(3) + 1,
from: const ["address1"],
internalId: uuid.v4(),
myBalanceChange: isBuy ? tradeAmount.toString() : (-tradeAmount).toString(),
receivedByMe: !isBuy ? tradeAmount.toString() : '0',
spentByMe: isBuy ? tradeAmount.toString() : '0',
timestamp: closeTimestamp ~/ 1000,
to: ["address2"],
totalAmount: tradeAmount.toString(),
balanceChanges: BalanceChanges(
netChange: Decimal.parse(
isBuy ? tradeAmount.toString() : (-tradeAmount).toString(),
),
receivedByMe: Decimal.parse(!isBuy ? tradeAmount.toString() : '0'),
spentByMe: Decimal.parse(isBuy ? tradeAmount.toString() : '0'),
totalAmount: Decimal.parse(tradeAmount.toString()),
),
timestamp: DateTime.fromMillisecondsSinceEpoch(closeTimestamp),
to: const ["address2"],
txHash: uuid.v4(),
txHex: "hexstring",
memo: "memo",
);
}
2 changes: 1 addition & 1 deletion lib/bloc/cex_market_data/mockup/generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import 'dart:convert';

import 'package:flutter/services.dart';
import 'package:komodo_cex_market_data/komodo_cex_market_data.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/generate_demo_data.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart';
import 'package:web_dex/mm2/mm2_api/rpc/my_tx_history/transaction.dart';

final _supportedCoinsCache = <String, List<String>>{};
final _transactionsCache = <String, Map<PerformanceMode, List<Transaction>>>{};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:http/http.dart';
import 'package:komodo_cex_market_data/komodo_cex_market_data.dart';
import 'package:komodo_defi_sdk/komodo_defi_sdk.dart';
import 'package:komodo_persistence_layer/komodo_persistence_layer.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/generator.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/mock_transaction_history_repository.dart';
Expand All @@ -26,7 +25,6 @@ class MockPortfolioGrowthRepository extends PortfolioGrowthRepository {
required this.performanceMode,
required CoinsRepo coinsRepository,
required Mm2Api mm2Api,
required KomodoDefiSdk sdk,
}) : super(
cexRepository: BinanceRepository(
binanceProvider: const BinanceProvider(),
Expand All @@ -36,7 +34,6 @@ class MockPortfolioGrowthRepository extends PortfolioGrowthRepository {
client: Client(),
performanceMode: performanceMode,
demoDataGenerator: DemoDataCache.withDefaults(),
sdk: sdk,
),
cacheProvider: HiveLazyBoxProvider<String, GraphCache>(
name: GraphType.balanceGrowth.tableName,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import 'package:http/http.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/generator.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart';
import 'package:web_dex/bloc/transaction_history/transaction_history_repo.dart';
import 'package:web_dex/mm2/mm2_api/mm2_api.dart';
import 'package:web_dex/mm2/mm2_api/rpc/my_tx_history/transaction.dart';
import 'package:web_dex/model/coin.dart';

class MockTransactionHistoryRepo extends TransactionHistoryRepo {
class MockTransactionHistoryRepo implements TransactionHistoryRepo {
final PerformanceMode performanceMode;
final DemoDataCache demoDataGenerator;

Expand All @@ -15,14 +14,17 @@ class MockTransactionHistoryRepo extends TransactionHistoryRepo {
required Client client,
required this.performanceMode,
required this.demoDataGenerator,
required super.sdk,
});

// TODO: SDK Port needed, not sure about this part
Future<List<Transaction>> fetchTransactions(Coin coin) async {
@override
Future<List<Transaction>> fetch(AssetId assetId) {
return demoDataGenerator.loadTransactionsDemoData(
performanceMode,
coin.abbr,
assetId.id,
);
}

@override
Future<List<Transaction>> fetchCompletedTransactions(AssetId assetId) {
return fetch(assetId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ class PortfolioGrowthBloc
final List<Coin> coins = List.from(event.coins);
for (final coin in event.coins) {
final isCoinSupported = await portfolioGrowthRepository
.isCoinChartSupported(coin.abbr, event.fiatCoinId);
.isCoinChartSupported(coin.id, event.fiatCoinId);
if (!isCoinSupported) {
coins.remove(coin);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'dart:math';
import 'package:hive/hive.dart';
import 'package:komodo_cex_market_data/komodo_cex_market_data.dart' as cex;
import 'package:komodo_cex_market_data/komodo_cex_market_data.dart';
import 'package:komodo_defi_sdk/komodo_defi_sdk.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:komodo_persistence_layer/komodo_persistence_layer.dart';
import 'package:web_dex/bloc/cex_market_data/charts.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/mock_portfolio_growth_repository.dart';
Expand All @@ -13,7 +13,6 @@ import 'package:web_dex/bloc/cex_market_data/models/models.dart';
import 'package:web_dex/bloc/coins_bloc/coins_repo.dart';
import 'package:web_dex/bloc/transaction_history/transaction_history_repo.dart';
import 'package:web_dex/mm2/mm2_api/mm2_api.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:web_dex/model/coin.dart';

/// A repository for fetching the growth chart for the portfolio and coins.
Expand All @@ -37,15 +36,13 @@ class PortfolioGrowthRepository {
required cex.CexRepository cexRepository,
required CoinsRepo coinsRepository,
required Mm2Api mm2Api,
required KomodoDefiSdk sdk,
PerformanceMode? demoMode,
}) {
if (demoMode != null) {
return MockPortfolioGrowthRepository.withDefaults(
performanceMode: demoMode,
coinsRepository: coinsRepository,
mm2Api: mm2Api,
sdk: sdk,
);
}

Expand Down Expand Up @@ -96,7 +93,7 @@ class PortfolioGrowthRepository {
///
/// Returns the growth [ChartData] for the coin ([List] of [Point]).
Future<ChartData> getCoinGrowthChart(
String coinId, {
AssetId coinId, {
// avoid the possibility of accidentally swapping the order of these
// required parameters by using named parameters
required String fiatCoinId,
Expand All @@ -108,7 +105,7 @@ class PortfolioGrowthRepository {
}) async {
if (useCache) {
final String compoundKey = GraphCache.getPrimaryKey(
coinId,
coinId.id,
fiatCoinId,
GraphType.balanceGrowth,
walletId,
Expand All @@ -124,9 +121,9 @@ class PortfolioGrowthRepository {

// TODO: Refactor referenced coinsBloc method to a repository.
// NB: Even though the class is called [CoinsBloc], it is not a Bloc.
final Coin coin = _coinsRepository.getCoin(coinId)!;
final Coin coin = _coinsRepository.getCoinFromId(coinId)!;
final List<Transaction> transactions = await _transactionHistoryRepository
.fetchCompletedTransactions(coin)
.fetchCompletedTransactions(coin.id)
.then((value) => value.toList())
.catchError((Object e) {
if (ignoreTransactionFetchErrors) {
Expand All @@ -142,7 +139,7 @@ class PortfolioGrowthRepository {
// called later with useCache set to false to fetch the transactions again
await _graphCache.insert(
GraphCache(
coinId: coinId,
coinId: coinId.id,
fiatCoinId: fiatCoinId,
lastUpdated: DateTime.now(),
graph: List.empty(),
Expand Down Expand Up @@ -235,7 +232,7 @@ class PortfolioGrowthRepository {
final chartDataFutures = coins.map((coin) async {
try {
return await getCoinGrowthChart(
coin.abbr,
coin.id,
fiatCoinId: fiatCoinId,
useCache: useCache,
walletId: walletId,
Expand Down Expand Up @@ -313,11 +310,11 @@ class PortfolioGrowthRepository {
/// Returns `true` if the coin is supported by the CEX API for charting.
/// Returns `false` if the coin is not supported by the CEX API for charting.
Future<bool> isCoinChartSupported(
String coinId,
AssetId coinId,
String fiatCoinId, {
bool allowFiatAsBase = true,
}) async {
final Coin coin = _coinsRepository.getCoin(coinId)!;
final Coin coin = _coinsRepository.getCoinFromId(coinId)!;

final supportedCoins = await _cexRepository.getCoinList();
final coinTicker = coin.abbr.split('-').firstOrNull?.toUpperCase() ?? '';
Expand Down
2 changes: 1 addition & 1 deletion lib/bloc/cex_market_data/price_chart/price_chart_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class PriceChartBloc extends Bloc<PriceChartEvent, PriceChartState> {
// (e.g. Binance), some of which are not in our known/available
// assets/coins list. This filter ensures that we only attempt to
// fetch and display data for supported coins
.where((coin) => sdk.assets.assetsFromTicker(coin.id).length >= 1)
.where((coin) => sdk.assets.assetsFromTicker(coin.id).isNotEmpty)
.map((coin) async {
double? dayChangePercent = coinPrices[coin.symbol]?.change24h;

Expand Down
Loading