diff --git a/packages/komodo_defi_rpc_methods/lib/src/rpc_methods/utility/rpc_task_shepherd.dart b/packages/komodo_defi_rpc_methods/lib/src/rpc_methods/utility/rpc_task_shepherd.dart index 35dca19b0..96008bba4 100644 --- a/packages/komodo_defi_rpc_methods/lib/src/rpc_methods/utility/rpc_task_shepherd.dart +++ b/packages/komodo_defi_rpc_methods/lib/src/rpc_methods/utility/rpc_task_shepherd.dart @@ -33,6 +33,7 @@ class TaskShepherd { required bool Function(T) checkTaskStatus, Future Function(int taskId)? cancelTask, Duration pollingInterval = const Duration(seconds: 1), + Duration Function(T status)? pollingIntervalForStatus, }) { final controller = StreamController(); var taskCompletedNaturally = false; @@ -79,7 +80,9 @@ class TaskShepherd { return; } - await Future.delayed(pollingInterval); + final nextDelay = + pollingIntervalForStatus != null ? pollingIntervalForStatus(status) : null; + await Future.delayed(nextDelay ?? pollingInterval); } } catch (e, stackTrace) { controller.addError(e, stackTrace); @@ -97,6 +100,7 @@ extension TaskRpcBuddy on NewTaskResponse { required bool Function(T) isTaskComplete, Future Function(int taskId)? cancelTask, Duration pollingInterval = const Duration(seconds: 1), + Duration Function(T status)? pollingIntervalForStatus, }) { return TaskShepherd.executeTask( initTask: () async => this, @@ -104,6 +108,7 @@ extension TaskRpcBuddy on NewTaskResponse { checkTaskStatus: isTaskComplete, cancelTask: cancelTask, pollingInterval: pollingInterval, + pollingIntervalForStatus: pollingIntervalForStatus, ); } } @@ -114,6 +119,7 @@ extension TaskRpcBuddyFuture on Future { required bool Function(T) isTaskComplete, Future Function(int taskId)? cancelTask, Duration pollingInterval = const Duration(seconds: 1), + Duration Function(T status)? pollingIntervalForStatus, }) { return TaskShepherd.executeTask( initTask: () async => this, @@ -121,6 +127,7 @@ extension TaskRpcBuddyFuture on Future { checkTaskStatus: isTaskComplete, cancelTask: cancelTask, pollingInterval: pollingInterval, + pollingIntervalForStatus: pollingIntervalForStatus, ); } } 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 f6fb25bbc..9b6090f0b 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 @@ -128,6 +128,13 @@ class ZhtlcActivationStrategy extends ProtocolActivationStrategy { isTaskComplete: (TaskStatusResponse s) => s.status == 'Ok' || s.status == 'Error', pollingInterval: effectivePollingInterval, + pollingIntervalForStatus: (TaskStatusResponse s) { + final parsed = progressEstimator.parse(s.details); + // Back off to 5s until requesting balance; then use the effective (fast) interval. + return parsed.phase == ZhtlcActivationPhase.requestingWalletBalance + ? effectivePollingInterval + : const Duration(seconds: 5); + }, // cancelTask intentionally omitted, as it is not used in this // context and leaving it enabled lead to uncaught exceptions // when taskId was already finished.