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
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:komodo_defi_rpc_methods/komodo_defi_rpc_methods.dart';
import 'package:komodo_defi_sdk/src/activation/_activation.dart';
import 'package:komodo_defi_sdk/src/transaction_history/strategies/etherscan_transaction_history_strategy.dart'
show EtherscanProtocolHelper;
import 'package:komodo_defi_types/komodo_defi_types.dart';

class EthTaskActivationStrategy extends ProtocolActivationStrategy {
Expand Down Expand Up @@ -76,7 +78,8 @@ class EthTaskActivationStrategy extends ProtocolActivationStrategy {
erc20Tokens:
children?.map((e) => TokensRequest(ticker: e.id.id)).toList() ??
[],
txHistory: true,
txHistory: const EtherscanProtocolHelper()
.shouldEnableTransactionHistory(asset),
privKeyPolicy: privKeyPolicy,
),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:komodo_defi_rpc_methods/komodo_defi_rpc_methods.dart';
import 'package:komodo_defi_sdk/src/activation/_activation.dart';
import 'package:komodo_defi_sdk/src/transaction_history/strategies/etherscan_transaction_history_strategy.dart'
show EtherscanProtocolHelper;
import 'package:komodo_defi_types/komodo_defi_types.dart';

class EthWithTokensActivationStrategy extends ProtocolActivationStrategy {
Expand Down Expand Up @@ -95,7 +97,8 @@ class EthWithTokensActivationStrategy extends ProtocolActivationStrategy {
erc20Tokens:
children?.map((e) => TokensRequest(ticker: e.id.id)).toList() ??
[],
txHistory: true,
txHistory: const EtherscanProtocolHelper()
.shouldEnableTransactionHistory(asset),
privKeyPolicy: privKeyPolicy,
),
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:komodo_defi_rpc_methods/komodo_defi_rpc_methods.dart';
import 'package:komodo_defi_sdk/src/activation/_activation.dart';
import 'package:komodo_defi_sdk/src/transaction_history/strategies/etherscan_transaction_history_strategy.dart'
show EtherscanProtocolHelper;
import 'package:komodo_defi_types/komodo_defi_types.dart';

class TendermintActivationStrategy extends ProtocolActivationStrategy {
Expand Down Expand Up @@ -73,7 +75,8 @@ class TendermintActivationStrategy extends ProtocolActivationStrategy {
.toList() ??
[],
getBalances: true,
txHistory: true,
txHistory: const EtherscanProtocolHelper()
.shouldEnableTransactionHistory(asset),
privKeyPolicy: privKeyPolicy,
),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {
required this.pubkeyManager,
http.Client? httpClient,
String? baseUrl,
}) : _client = httpClient ?? http.Client(),
_protocolHelper = EtherscanProtocolHelper(baseUrl: baseUrl);
}) : _client = httpClient ?? http.Client(),
_protocolHelper = EtherscanProtocolHelper(baseUrl: baseUrl);

final http.Client _client;
final EtherscanProtocolHelper _protocolHelper;
Expand All @@ -23,9 +23,9 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {

@override
Set<Type> get supportedPaginationModes => {
PagePagination,
TransactionBasedPagination,
};
PagePagination,
TransactionBasedPagination,
};

@override
bool supportsAsset(Asset asset) => _protocolHelper.supportsProtocol(asset);
Expand All @@ -49,7 +49,8 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {

validatePagination(pagination);

final url = _protocolHelper.getApiUrlForAsset(asset) ??
final url =
_protocolHelper.getApiUrlForAsset(asset) ??
(throw UnsupportedError(
'No API URL found for asset ${asset.id.toJson()}',
));
Expand Down Expand Up @@ -78,16 +79,17 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {
// Apply pagination based on type
final paginatedResults = switch (pagination) {
final PagePagination p => _applyPagePagination(
allTransactions,
p.pageNumber,
p.itemsPerPage,
),
allTransactions,
p.pageNumber,
p.itemsPerPage,
),
final TransactionBasedPagination t => _applyTransactionPagination(
allTransactions,
t.fromId,
t.itemCount,
),
_ => throw UnsupportedError(
allTransactions,
t.fromId,
t.itemCount,
),
_ =>
throw UnsupportedError(
'Unsupported pagination type: ${pagination.runtimeType}',
),
};
Expand All @@ -110,9 +112,7 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {
transactions: paginatedResults.transactions,
);
} catch (e) {
throw HttpException(
'Error fetching transaction history: $e',
);
throw HttpException('Error fetching transaction history: $e');
}
}

Expand Down Expand Up @@ -152,12 +152,13 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {
blockHeight: tx.value<int>('block_height'),
confirmations: tx.value<int>('confirmations'),
timestamp: tx.value<int>('timestamp'),
feeDetails: tx.valueOrNull<JsonMap>('fee_details') != null
? FeeInfo.fromJson(
tx.value<JsonMap>('fee_details')
..setIfAbsentOrEmpty('type', 'Eth'),
)
: null,
feeDetails:
tx.valueOrNull<JsonMap>('fee_details') != null
? FeeInfo.fromJson(
tx.value<JsonMap>('fee_details')
..setIfAbsentOrEmpty('type', 'Eth'),
)
: null,
coin: coinId,
internalId: tx.value<String>('internal_id'),
memo: tx.valueOrNull<String>('memo'),
Expand All @@ -166,11 +167,8 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {
.toList();
}

({
List<TransactionInfo> transactions,
int skipped,
int pageSize,
}) _applyPagePagination(
({List<TransactionInfo> transactions, int skipped, int pageSize})
_applyPagePagination(
List<TransactionInfo> transactions,
int pageNumber,
int itemsPerPage,
Expand All @@ -183,11 +181,8 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {
);
}

({
List<TransactionInfo> transactions,
int skipped,
int pageSize,
}) _applyTransactionPagination(
({List<TransactionInfo> transactions, int skipped, int pageSize})
_applyTransactionPagination(
List<TransactionInfo> transactions,
String fromId,
int itemCount,
Expand All @@ -211,9 +206,8 @@ class EtherscanTransactionStrategy extends TransactionHistoryStrategy {

/// Helper class for managing Etherscan protocol endpoints and URL construction
class EtherscanProtocolHelper {
const EtherscanProtocolHelper({
String? baseUrl,
}) : _baseUrl = baseUrl ?? 'https://etherscan-proxy-v2.komodo.earth/api';
const EtherscanProtocolHelper({String? baseUrl})
: _baseUrl = baseUrl ?? 'https://etherscan-proxy-v2.komodo.earth/api';

final String _baseUrl;

Expand All @@ -222,6 +216,12 @@ class EtherscanProtocolHelper {
return asset.protocol is Erc20Protocol && getApiUrlForAsset(asset) != null;
}

/// Whether transaction history should also be fetched via mm2.
///
/// When Etherscan does not support the provided [asset], transaction history
/// must fall back to mm2 RPC calls.
bool shouldEnableTransactionHistory(Asset asset) => !supportsProtocol(asset);

/// Constructs the appropriate API URL for a given asset
Uri? getApiUrlForAsset(Asset asset) {
if (asset.protocol is! Erc20Protocol) return null;
Expand Down
Loading