diff --git a/packages/komodo_defi_sdk/lib/src/activation/activation_manager.dart b/packages/komodo_defi_sdk/lib/src/activation/activation_manager.dart index 3132dbf1..3aae19af 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/activation_manager.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/activation_manager.dart @@ -87,7 +87,7 @@ class ActivationManager { yield ActivationProgress( status: 'Starting activation for ${group.primary.id.name}...', progressDetails: ActivationProgressDetails( - currentStep: 'group_start', + currentStep: ActivationStep.groupStart, stepCount: 1, additionalInfo: { 'primaryAsset': group.primary.id.name, @@ -155,7 +155,7 @@ class ActivationManager { return const ActivationProgress( status: 'Needs activation', progressDetails: ActivationProgressDetails( - currentStep: 'init', + currentStep: ActivationStep.init, stepCount: 1, ), ); diff --git a/packages/komodo_defi_sdk/lib/src/activation/base_strategies/activation_strategy_base.dart b/packages/komodo_defi_sdk/lib/src/activation/base_strategies/activation_strategy_base.dart index 8271415f..817fc0f4 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/base_strategies/activation_strategy_base.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/base_strategies/activation_strategy_base.dart @@ -45,7 +45,7 @@ class SmartAssetActivator extends BatchCapableActivator { yield ActivationProgress( status: 'Planning activation strategy...', progressDetails: ActivationProgressDetails( - currentStep: 'planning', + currentStep: ActivationStep.planning, stepCount: 1, additionalInfo: { 'parentActivated': parentActivated, @@ -117,7 +117,7 @@ class CompositeAssetActivator extends BatchCapableActivator { yield ActivationProgress( status: 'Finding appropriate activation strategy...', progressDetails: ActivationProgressDetails( - currentStep: 'strategy_selection', + currentStep: ActivationStep.strategySelection, stepCount: 1, additionalInfo: {'assetId': asset.id.id}, ), @@ -144,4 +144,4 @@ abstract class ProtocolActivationStrategy extends BatchCapableActivator { supportedProtocols.contains(asset.protocol.subClass); Set get supportedProtocols; -} +} \ No newline at end of file diff --git a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/bch_activation_strategy.dart b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/bch_activation_strategy.dart index 0a2dcd0b..2901b58c 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/bch_activation_strategy.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/bch_activation_strategy.dart @@ -45,7 +45,7 @@ class BchActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress( status: 'Starting BCH/SLP activation...', progressDetails: ActivationProgressDetails( - currentStep: 'initialization', + currentStep: ActivationStep.initialization, stepCount: 4, additionalInfo: { 'assetType': isBch ? 'BCH' : 'SLP', @@ -62,7 +62,7 @@ class BchActivationStrategy extends ProtocolActivationStrategy { status: 'Configuring BCH platform...', progressPercentage: 25, progressDetails: ActivationProgressDetails( - currentStep: 'platform_setup', + currentStep: ActivationStep.platformSetup, stepCount: 4, additionalInfo: { 'electrumServers': protocol.requiredServers.toJsonRequest(), @@ -77,7 +77,7 @@ class BchActivationStrategy extends ProtocolActivationStrategy { status: 'Activating BCH with SLP support...', progressPercentage: 50, progressDetails: ActivationProgressDetails( - currentStep: 'activation', + currentStep: ActivationStep.activation, stepCount: 4, ), ); @@ -98,7 +98,7 @@ class BchActivationStrategy extends ProtocolActivationStrategy { status: 'Verifying activation...', progressPercentage: 75, progressDetails: ActivationProgressDetails( - currentStep: 'verification', + currentStep: ActivationStep.verification, stepCount: 4, additionalInfo: { 'currentBlock': response.currentBlock, @@ -109,7 +109,7 @@ class BchActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress.success( details: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 4, additionalInfo: { 'activatedChain': 'BCH', @@ -124,7 +124,7 @@ class BchActivationStrategy extends ProtocolActivationStrategy { status: 'Activating SLP token...', progressPercentage: 50, progressDetails: ActivationProgressDetails( - currentStep: 'token_activation', + currentStep: ActivationStep.tokenActivation, stepCount: 2, ), ); @@ -136,7 +136,7 @@ class BchActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress.success( details: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 2, additionalInfo: { 'activatedToken': asset.id.name, @@ -151,7 +151,7 @@ class BchActivationStrategy extends ProtocolActivationStrategy { errorMessage: e.toString(), isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 4, errorCode: isBch ? 'BCH_ACTIVATION_ERROR' : 'SLP_ACTIVATION_ERROR', errorDetails: e.toString(), diff --git a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/custom_erc20_activation_strategy.dart b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/custom_erc20_activation_strategy.dart index f4241ca9..d8fcf3a7 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/custom_erc20_activation_strategy.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/custom_erc20_activation_strategy.dart @@ -41,7 +41,7 @@ class CustomErc20ActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress( status: 'Activating ${asset.id.name}...', progressDetails: ActivationProgressDetails( - currentStep: 'initialization', + currentStep: ActivationStep.initialization, stepCount: 2, additionalInfo: { 'assetType': 'token', @@ -70,7 +70,7 @@ class CustomErc20ActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress.success( details: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 2, additionalInfo: { 'activatedChain': asset.id.name, @@ -85,7 +85,7 @@ class CustomErc20ActivationStrategy extends ProtocolActivationStrategy { errorMessage: e.toString(), isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 2, errorCode: 'ERC20_ACTIVATION_ERROR', errorDetails: e.toString(), @@ -94,4 +94,4 @@ class CustomErc20ActivationStrategy extends ProtocolActivationStrategy { ); } } -} +} \ No newline at end of file diff --git a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/erc20_activation_strategy.dart b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/erc20_activation_strategy.dart index 7354319e..73b358a5 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/erc20_activation_strategy.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/erc20_activation_strategy.dart @@ -40,7 +40,7 @@ class Erc20ActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress( status: 'Activating ${asset.id.name}...', progressDetails: ActivationProgressDetails( - currentStep: 'initialization', + currentStep: ActivationStep.initialization, stepCount: 2, additionalInfo: { 'assetType': isPlatformAsset ? 'platform' : 'token', @@ -72,7 +72,7 @@ class Erc20ActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress.success( details: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 2, additionalInfo: { 'activatedChain': asset.id.name, @@ -87,7 +87,7 @@ class Erc20ActivationStrategy extends ProtocolActivationStrategy { errorMessage: e.toString(), isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 2, errorCode: 'ERC20_ACTIVATION_ERROR', errorDetails: e.toString(), @@ -96,4 +96,4 @@ class Erc20ActivationStrategy extends ProtocolActivationStrategy { ); } } -} +} \ No newline at end of file diff --git a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/qtum_activation_strategy.dart b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/qtum_activation_strategy.dart index 0c56f16d..a9340fbd 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/qtum_activation_strategy.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/qtum_activation_strategy.dart @@ -22,7 +22,7 @@ class QtumActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress( status: 'Starting QTUM activation...', progressDetails: ActivationProgressDetails( - currentStep: 'initialization', + currentStep: ActivationStep.initialization, stepCount: 4, additionalInfo: { 'protocol': 'QTUM', @@ -47,7 +47,7 @@ class QtumActivationStrategy extends ProtocolActivationStrategy { if (status.status == 'Ok') { yield ActivationProgress.success( details: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 4, additionalInfo: { 'activatedChain': asset.id.name, @@ -61,7 +61,7 @@ class QtumActivationStrategy extends ProtocolActivationStrategy { errorMessage: status.details, isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 4, errorCode: 'QTUM_ACTIVATION_ERROR', errorDetails: status.details, @@ -89,7 +89,7 @@ class QtumActivationStrategy extends ProtocolActivationStrategy { errorMessage: e.toString(), isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 4, errorCode: 'QTUM_ACTIVATION_ERROR', errorDetails: e.toString(), @@ -99,35 +99,35 @@ class QtumActivationStrategy extends ProtocolActivationStrategy { } } - ({String status, double percentage, String step, Map info}) + ({String status, double percentage, ActivationStep step, Map info}) _parseQtumStatus(String status) { switch (status) { case 'ConnectingNodes': return ( status: 'Connecting to QTUM nodes...', percentage: 25, - step: 'connection', + step: ActivationStep.connection, info: {'status': status}, ); case 'ValidatingConfig': return ( status: 'Validating configuration...', percentage: 50, - step: 'validation', + step: ActivationStep.validation, info: {'status': status}, ); case 'LoadingContracts': return ( status: 'Loading smart contracts...', percentage: 75, - step: 'contracts', + step: ActivationStep.contracts, info: {'status': status}, ); default: return ( status: 'Processing activation...', percentage: 85, - step: 'processing', + step: ActivationStep.processing, info: {'status': status}, ); } diff --git a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/slp_activation_strategy.dart b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/slp_activation_strategy.dart index a29dcb05..a627360b 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/slp_activation_strategy.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/slp_activation_strategy.dart @@ -26,7 +26,7 @@ class SlpActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress( status: 'Starting BCH/SLP activation...', progressDetails: ActivationProgressDetails( - currentStep: 'initialization', + currentStep: ActivationStep.initialization, stepCount: 3, additionalInfo: { 'assetType': isPlatformAsset ? 'platform' : 'token', @@ -43,7 +43,7 @@ class SlpActivationStrategy extends ProtocolActivationStrategy { status: 'Configuring BCH platform...', progressPercentage: 33, progressDetails: ActivationProgressDetails( - currentStep: 'platform_setup', + currentStep: ActivationStep.platformSetup, stepCount: 3, additionalInfo: { 'bchdServers': protocol.bchdUrls.length, @@ -67,7 +67,7 @@ class SlpActivationStrategy extends ProtocolActivationStrategy { status: 'Activating SLP token...', progressPercentage: 66, progressDetails: ActivationProgressDetails( - currentStep: 'token_activation', + currentStep: ActivationStep.tokenActivation, stepCount: 3, ), ); @@ -79,7 +79,7 @@ class SlpActivationStrategy extends ProtocolActivationStrategy { } yield ActivationProgress.success( details: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 3, additionalInfo: { 'activatedChain': asset.id.name, @@ -93,7 +93,7 @@ class SlpActivationStrategy extends ProtocolActivationStrategy { errorMessage: e.toString(), isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 3, errorCode: 'SLP_ACTIVATION_ERROR', errorDetails: e.toString(), diff --git a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/tendermint_activation_strategy.dart b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/tendermint_activation_strategy.dart index 90b89475..7cb9aa41 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/tendermint_activation_strategy.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/tendermint_activation_strategy.dart @@ -27,7 +27,7 @@ class TendermintActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress( status: 'Starting Tendermint activation...', progressDetails: ActivationProgressDetails( - currentStep: 'initialization', + currentStep: ActivationStep.initialization, stepCount: 4, additionalInfo: { 'assetType': isPlatformAsset ? 'platform' : 'token', @@ -43,7 +43,7 @@ class TendermintActivationStrategy extends ProtocolActivationStrategy { status: 'Validating RPC endpoints...', progressPercentage: 25, progressDetails: ActivationProgressDetails( - currentStep: 'validation', + currentStep: ActivationStep.validation, stepCount: 4, additionalInfo: { 'rpcEndpoints': protocol.rpcUrlsMap.length, @@ -57,7 +57,7 @@ class TendermintActivationStrategy extends ProtocolActivationStrategy { status: 'Activating platform chain...', progressPercentage: 50, progressDetails: ActivationProgressDetails( - currentStep: 'platform_activation', + currentStep: ActivationStep.platformActivation, stepCount: 4, ), ); @@ -80,7 +80,7 @@ class TendermintActivationStrategy extends ProtocolActivationStrategy { status: 'Activating Tendermint token...', progressPercentage: 75, progressDetails: ActivationProgressDetails( - currentStep: 'token_activation', + currentStep: ActivationStep.tokenActivation, stepCount: 4, ), ); @@ -93,7 +93,7 @@ class TendermintActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress.success( details: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 4, additionalInfo: { 'activatedChain': asset.id.name, @@ -109,7 +109,7 @@ class TendermintActivationStrategy extends ProtocolActivationStrategy { errorMessage: e.toString(), isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 4, errorCode: 'TENDERMINT_ACTIVATION_ERROR', errorDetails: e.toString(), diff --git a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/utxo_activation_strategy.dart b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/utxo_activation_strategy.dart index a3fe2c7f..37f5160b 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/utxo_activation_strategy.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/utxo_activation_strategy.dart @@ -28,7 +28,7 @@ class UtxoActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress( status: 'Starting ${asset.id.name} activation...', progressDetails: ActivationProgressDetails( - currentStep: 'initialization', + currentStep: ActivationStep.initialization, stepCount: 5, additionalInfo: { 'chainType': protocol.subClass.formatted, @@ -44,7 +44,7 @@ class UtxoActivationStrategy extends ProtocolActivationStrategy { status: 'Validating protocol configuration...', progressPercentage: 20, progressDetails: ActivationProgressDetails( - currentStep: 'validation', + currentStep: ActivationStep.validation, stepCount: 5, ), ); @@ -58,7 +58,7 @@ class UtxoActivationStrategy extends ProtocolActivationStrategy { status: 'Establishing network connections...', progressPercentage: 40, progressDetails: ActivationProgressDetails( - currentStep: 'connection', + currentStep: ActivationStep.connection, stepCount: 5, additionalInfo: { 'electrumServers': protocol.requiredServers.toJsonRequest(), @@ -76,7 +76,7 @@ class UtxoActivationStrategy extends ProtocolActivationStrategy { if (status.status == 'Ok') { yield ActivationProgress.success( details: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 5, additionalInfo: { 'activatedChain': asset.id.name, @@ -92,7 +92,7 @@ class UtxoActivationStrategy extends ProtocolActivationStrategy { errorMessage: status.details, isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 5, errorCode: 'UTXO_ACTIVATION_ERROR', errorDetails: status.details, @@ -120,7 +120,7 @@ class UtxoActivationStrategy extends ProtocolActivationStrategy { errorMessage: e.toString(), isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 5, errorCode: 'UTXO_ACTIVATION_ERROR', errorDetails: e.toString(), @@ -130,35 +130,35 @@ class UtxoActivationStrategy extends ProtocolActivationStrategy { } } - ({String status, double percentage, String step, Map info}) + ({String status, double percentage, ActivationStep step, Map info}) _parseUtxoStatus(String status) { switch (status) { case 'ConnectingElectrum': return ( status: 'Connecting to Electrum servers...', percentage: 60, - step: 'electrum_connection', + step: ActivationStep.electrumConnection, info: {'connectionType': 'Electrum'}, ); case 'LoadingBlockchain': return ( status: 'Loading blockchain data...', percentage: 80, - step: 'blockchain_sync', + step: ActivationStep.blockchainSync, info: {'dataType': 'blockchain'}, ); case 'ScanningTransactions': return ( status: 'Scanning transaction history...', percentage: 90, - step: 'tx_scan', + step: ActivationStep.txScan, info: {'dataType': 'transactions'}, ); default: return ( status: 'Processing activation...', percentage: 95, - step: 'processing', + step: ActivationStep.processing, info: {'status': status}, ); } diff --git a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/zhtlc_activation_strategy.dart b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/zhtlc_activation_strategy.dart index cab580ca..0af2e52f 100644 --- a/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/zhtlc_activation_strategy.dart +++ b/packages/komodo_defi_sdk/lib/src/activation/protocol_strategies/zhtlc_activation_strategy.dart @@ -28,7 +28,7 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { yield ActivationProgress( status: 'Starting ZHTLC activation...', progressDetails: ActivationProgressDetails( - currentStep: 'initialization', + currentStep: ActivationStep.initialization, stepCount: 6, additionalInfo: { 'protocol': 'ZHTLC', @@ -53,7 +53,7 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { status: 'Validating ZHTLC parameters...', progressPercentage: 20, progressDetails: ActivationProgressDetails( - currentStep: 'validation', + currentStep: ActivationStep.validation, stepCount: 6, additionalInfo: { 'electrumServers': protocol.requiredServers.toJsonRequest(), @@ -62,24 +62,30 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { ), ); - // Initialize task - final taskResponse = await client.rpc.task.execute( - TaskEnableZhtlcInit( - params: params, - ticker: asset.id.id, - ), - ); + // Initialize task and watch via TaskShepherd + final stream = client.rpc.zhtlc + .enableZhtlcInit( + ticker: asset.id.id, + params: params, + ) + .watch( + getTaskStatus: (int taskId) => client.rpc.zhtlc + .enableZhtlcStatus(taskId, forgetIfFinished: false), + isTaskComplete: (TaskStatusResponse s) => + s.status == 'Ok' || s.status == 'Error', + cancelTask: (int taskId) async { + await client.rpc.zhtlc.enableZhtlcCancel(taskId: taskId); + }, + pollingInterval: const Duration(milliseconds: 500), + ); - var isComplete = false; var buildingWalletDb = false; var scanningBlocks = false; var currentBlock = 0; + TaskStatusResponse? lastStatus; - while (!isComplete) { - final status = await client.rpc.task.execute( - TaskEnableZhtlcStatus(taskId: taskResponse.taskId), - ); - + await for (final status in stream) { + lastStatus = status; switch (status.details) { case 'BuildingWalletDb': if (!buildingWalletDb) { @@ -88,35 +94,36 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { status: 'Building wallet database...', progressPercentage: 40, progressDetails: ActivationProgressDetails( - currentStep: 'database', + currentStep: ActivationStep.database, stepCount: 6, additionalInfo: {'dbStatus': 'building'}, ), ); } + break; case 'WaitingLightwalletd': yield const ActivationProgress( status: 'Connecting to Lightwalletd server...', progressPercentage: 60, progressDetails: ActivationProgressDetails( - currentStep: 'connection', + currentStep: ActivationStep.connection, stepCount: 6, additionalInfo: {'connectionStatus': 'connecting'}, ), ); + break; case 'ScanningBlocks': if (!scanningBlocks) { scanningBlocks = true; - currentBlock = await _getCurrentBlock(); + currentBlock = await _getCurrentBlock(asset.id.id); } - yield ActivationProgress( status: 'Scanning blockchain...', progressPercentage: 80, progressDetails: ActivationProgressDetails( - currentStep: 'scanning', + currentStep: ActivationStep.scanning, stepCount: 6, additionalInfo: { 'currentBlock': currentBlock, @@ -124,6 +131,7 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { }, ), ); + break; case 'Error': yield ActivationProgress( @@ -131,33 +139,21 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { errorMessage: status.details, isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 6, errorCode: 'ZHTLC_ACTIVATION_ERROR', errorDetails: status.details, ), ); - isComplete = true; + return; - case 'Success': - yield ActivationProgress.success( - details: ActivationProgressDetails( - currentStep: 'complete', - stepCount: 6, - additionalInfo: { - 'activatedChain': asset.id.name, - 'activationTime': DateTime.now().toIso8601String(), - 'finalBlock': currentBlock, - }, - ), - ); - isComplete = true; + // For any other progress states, fall through to default handler default: yield ActivationProgress( status: status.details, progressDetails: ActivationProgressDetails( - currentStep: 'processing', + currentStep: ActivationStep.processing, stepCount: 6, additionalInfo: { 'status': status.details, @@ -165,19 +161,46 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { }, ), ); + break; } - if (!isComplete) { - await Future.delayed(const Duration(milliseconds: 500)); + if (status.status == 'Ok') { + yield ActivationProgress.success( + details: ActivationProgressDetails( + currentStep: ActivationStep.complete, + stepCount: 6, + additionalInfo: { + 'activatedChain': asset.id.name, + 'activationTime': DateTime.now().toIso8601String(), + 'finalBlock': currentBlock, + }, + ), + ); } } + + // If the task ended with an error status but without emitting a specific + // error detail case, emit a failure result now. + if (lastStatus != null && lastStatus!.status == 'Error') { + yield ActivationProgress( + status: 'Activation failed', + errorMessage: lastStatus!.details, + isComplete: true, + progressDetails: ActivationProgressDetails( + currentStep: ActivationStep.error, + stepCount: 6, + errorCode: 'ZHTLC_ACTIVATION_ERROR', + errorDetails: lastStatus!.details, + ), + ); + } } catch (e, stack) { yield ActivationProgress( status: 'Activation failed', errorMessage: e.toString(), isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 6, errorCode: 'ZHTLC_ACTIVATION_ERROR', errorDetails: e.toString(), @@ -191,7 +214,11 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { } } - Future _getCurrentBlock() async { - throw UnimplementedError(); + Future _getCurrentBlock(String coin) async { + final resp = await client.rpc.transactionHistory.zCoinTxHistory( + coin: coin, + limit: 1, + ); + return resp.currentBlock; } } diff --git a/packages/komodo_defi_types/lib/src/activation/activation_progress.dart b/packages/komodo_defi_types/lib/src/activation/activation_progress.dart index d027b7ec..994a7175 100644 --- a/packages/komodo_defi_types/lib/src/activation/activation_progress.dart +++ b/packages/komodo_defi_types/lib/src/activation/activation_progress.dart @@ -3,6 +3,58 @@ import 'package:komodo_defi_types/komodo_defi_type_utils.dart'; import 'package:komodo_defi_types/komodo_defi_types.dart'; import 'package:meta/meta.dart'; +/// Canonical activation steps used across strategies +enum ActivationStep { + planning, + strategySelection, + initialization, + validation, + platformSetup, + platformActivation, + tokenActivation, + activation, + verification, + database, + connection, + electrumConnection, + blockchainSync, + txScan, + contracts, + scanning, + processing, + error, + complete, + init, + groupStart, + unknown, +} + +extension ActivationStepSerialization on ActivationStep { + String get serializedName { + switch (this) { + case ActivationStep.platformSetup: + return 'platform_setup'; + case ActivationStep.platformActivation: + return 'platform_activation'; + case ActivationStep.tokenActivation: + return 'token_activation'; + case ActivationStep.electrumConnection: + return 'electrum_connection'; + case ActivationStep.blockchainSync: + return 'blockchain_sync'; + case ActivationStep.txScan: + return 'tx_scan'; + case ActivationStep.strategySelection: + return 'strategy_selection'; + case ActivationStep.groupStart: + return 'group_start'; + default: + // For other enums, the enum name matches the desired string + return name; + } + } +} + /// Represents the current state and progress of an activation operation @immutable class ActivationProgress extends Equatable { @@ -21,7 +73,7 @@ class ActivationProgress extends Equatable { progressPercentage: 100, isComplete: true, progressDetails: details?.copyWith( - currentStep: 'complete', + currentStep: ActivationStep.complete, completedAt: DateTime.now(), ), ); @@ -36,7 +88,7 @@ class ActivationProgress extends Equatable { progressPercentage: 100, isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'complete', + currentStep: ActivationStep.complete, stepCount: 1, additionalInfo: { 'primaryAsset': assetName, @@ -60,7 +112,7 @@ class ActivationProgress extends Equatable { errorMessage: message, isComplete: true, progressDetails: ActivationProgressDetails( - currentStep: 'error', + currentStep: ActivationStep.error, stepCount: 1, errorCode: errorCode, errorDetails: details, @@ -139,7 +191,7 @@ class ActivationProgressDetails extends Equatable { this.completedAt, }); - final String currentStep; + final ActivationStep currentStep; final int stepCount; final JsonMap additionalInfo; final String? errorCode; @@ -154,7 +206,7 @@ class ActivationProgressDetails extends Equatable { } ActivationProgressDetails copyWith({ - String? currentStep, + ActivationStep? currentStep, int? stepCount, JsonMap? additionalInfo, String? errorCode, @@ -188,7 +240,7 @@ class ActivationProgressDetails extends Equatable { ]; JsonMap toJson() => { - 'currentStep': currentStep, + 'currentStep': currentStep.serializedName, 'stepCount': stepCount, 'additionalInfo': additionalInfo, if (errorCode != null) 'errorCode': errorCode, @@ -217,7 +269,7 @@ class BatchActivationProgress { startedAt: _startTimes[asset.id], ) ?? ActivationProgressDetails( - currentStep: 'unknown', + currentStep: ActivationStep.unknown, stepCount: 1, startedAt: _startTimes[asset.id], );