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
6 changes: 4 additions & 2 deletions miner-app/lib/features/miner/miner_balance_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:quantus_miner/src/config/miner_config.dart';
import 'package:quantus_miner/src/services/log_stream_processor.dart';
import 'package:quantus_miner/src/services/miner_settings_service.dart';
import 'package:quantus_miner/src/services/miner_wallet_service.dart';
import 'package:quantus_miner/src/services/mining_orchestrator.dart';
import 'package:quantus_miner/src/shared/extensions/snackbar_extensions.dart';
Expand All @@ -24,7 +25,7 @@ class MinerBalanceCard extends StatefulWidget {

class _MinerBalanceCardState extends State<MinerBalanceCard> {
final _walletService = MinerWalletService();
final _utxoService = WormholeUtxoService();
final _settingsService = MinerSettingsService();
String? _address;
BigInt? _balance;
bool _loading = true;
Expand Down Expand Up @@ -112,7 +113,8 @@ class _MinerBalanceCardState extends State<MinerBalanceCard> {
setState(() => _balanceLoading = true);
_log.i('Fetching unspent balance for $address ...');
try {
final balance = await _utxoService.getUnspentBalance(wormholeAddress: address, secretHex: secretHex);
final utxoService = await _settingsService.utxoService();
final balance = await utxoService.getUnspentBalance(wormholeAddress: address, secretHex: secretHex);
_log.i('Unspent balance: $balance token units (${_formatter.formatBalance(balance, addSymbol: true)})');
if (!mounted) return;
setState(() {
Expand Down
8 changes: 5 additions & 3 deletions miner-app/lib/features/withdrawal/claim_rewards_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ enum _Screen { input, confirm, progress }

class _ClaimRewardsDialogState extends State<_ClaimRewardsDialog> {
final _addressController = TextEditingController();
final _wormholeSendService = WormholeSendService();
WormholeSendService? _wormholeSendService;
final _walletService = MinerWalletService();
final _settingsService = MinerSettingsService();

Expand Down Expand Up @@ -118,7 +118,9 @@ class _ClaimRewardsDialogState extends State<_ClaimRewardsDialog> {
final rpcUrl = chainConfig.rpcUrl;
_log.i('Starting claim for ${keyPair.address} to ${_addressController.text.trim()}');

final result = await _wormholeSendService.claimRewards(
final sendService = WormholeSendService(utxoService: await _settingsService.utxoService());
_wormholeSendService = sendService;
final result = await sendService.claimRewards(
wormholeAddress: keyPair.address,
secretHex: keyPair.secretHex,
destinationAddress: _addressController.text.trim(),
Expand Down Expand Up @@ -163,7 +165,7 @@ class _ClaimRewardsDialogState extends State<_ClaimRewardsDialog> {
}

void _cancelClaim() {
_wormholeSendService.cancel();
_wormholeSendService?.cancel();
}

@override
Expand Down
7 changes: 4 additions & 3 deletions miner-app/lib/features/withdrawal/withdrawal_screen.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:quantus_miner/src/services/miner_settings_service.dart';
import 'package:quantus_miner/src/services/miner_wallet_service.dart';
import 'package:quantus_miner/src/shared/extensions/snackbar_extensions.dart';
import 'package:quantus_sdk/quantus_sdk.dart';

import 'claim_rewards_dialog.dart';

Expand All @@ -17,7 +17,7 @@ class WithdrawalScreen extends StatefulWidget {

class _WithdrawalScreenState extends State<WithdrawalScreen> {
final _walletService = MinerWalletService();
final _utxoService = WormholeUtxoService();
final _settingsService = MinerSettingsService();
BigInt? _balance;
bool _loading = true;
bool _canWithdraw = false;
Expand All @@ -34,7 +34,8 @@ class _WithdrawalScreenState extends State<WithdrawalScreen> {
BigInt? balance;
if (keyPair != null && keyPair.secretHex.isNotEmpty) {
try {
balance = await _utxoService.getUnspentBalance(wormholeAddress: keyPair.address, secretHex: keyPair.secretHex);
final utxoService = await _settingsService.utxoService();
balance = await utxoService.getUnspentBalance(wormholeAddress: keyPair.address, secretHex: keyPair.secretHex);
} catch (_) {}
}
if (!mounted) return;
Expand Down
14 changes: 11 additions & 3 deletions miner-app/lib/src/config/miner_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,15 @@ class MinerConfig {
displayName: 'Planck Testnet',
description: 'Planck testnet',
rpcUrl: 'https://a1-planck.quantus.cat',
subsquidUrl: 'http://127.0.0.1:4000/graphql', // Local Subsquid for testing
subsquidUrl: 'https://sub2.quantus.com/v1/graphql',
isDefault: false,
),
ChainConfig(
id: 'mainnet',
displayName: 'Mainnet',
description: 'Quantus mainnet',
rpcUrl: 'https://rpc1-mainnet.quantus.com',
subsquidUrl: 'https://subsquid-mainnet-app-1.quantus.com/v1/graphql',
isDefault: true,
),
];
Expand Down Expand Up @@ -207,15 +215,15 @@ class ChainConfig {
final String displayName;
final String description;
final String rpcUrl;
final String? subsquidUrl;
final String subsquidUrl;
final bool isDefault;

const ChainConfig({
required this.id,
required this.displayName,
required this.description,
required this.rpcUrl,
this.subsquidUrl,
required this.subsquidUrl,
this.isDefault = false,
});

Expand Down
37 changes: 10 additions & 27 deletions miner-app/lib/src/services/miner_settings_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,34 +42,9 @@ class MinerSettingsService {
return prefs.getInt(_keyGpuDevices);
}

/// Save the selected chain ID and configure endpoints accordingly.
Future<void> saveChainId(String chainId) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_keyChainId, chainId);
// Update GraphQL endpoint for the selected chain
_configureEndpointsForChain(chainId);
}

/// Configure RPC and GraphQL endpoints based on chain ID.
void _configureEndpointsForChain(String chainId) {
final chain = MinerConfig.getChainById(chainId);
_log.i('Configuring endpoints for chain $chainId:');
_log.i(' RPC: ${chain.rpcUrl}');
_log.i(' GraphQL: ${chain.subsquidUrl ?? 'not configured'}');

// Configure RPC endpoint for SubstrateService
final rpcService = RpcEndpointService();
_log.i(' RPC endpoints before: ${rpcService.endpoints.length}');
// rpcService.setEndpoints([chain.rpcUrl]);
// _log.i(' RPC endpoints after: ${rpcService.endpoints.length}');
// _log.i(' Best RPC endpoint: ${rpcService.bestEndpointUrl}');

// Configure GraphQL endpoint (for any remaining Subsquid usage)
// if (chain.subsquidUrl != null) {
// GraphQlEndpointService().setEndpoints([chain.subsquidUrl!]);
// } else {
// GraphQlEndpointService().setEndpoints([]);
// }
}

/// Get the saved chain ID, returns default if not set.
Expand All @@ -89,8 +64,6 @@ class MinerSettingsService {
chainId = savedChainId;
}
}
// Configure endpoints for this chain
_configureEndpointsForChain(chainId);
return chainId;
}

Expand All @@ -100,6 +73,16 @@ class MinerSettingsService {
return MinerConfig.getChainById(chainId);
}

/// UTXO discovery bound to the selected chain, so balances, claims and proofs
/// all talk to the same network instead of the SDK's app-wide endpoints.
Future<WormholeUtxoService> utxoService() async {
final chain = await getChainConfig();
return WormholeUtxoService(
graphQl: GraphQlEndpointService.forUrls([chain.subsquidUrl]),
rpc: RpcEndpointService.forUrls([chain.rpcUrl]),
);
}

Future<void> logout() async {
_log.i('Starting app logout/reset...');

Expand Down
Loading
Loading