restore swaps xyz tx registration (#3205)

Serhii committed May 8, 2026 at 21:30 UTC 758cb8d8e5dfea501814ac782f2bcae82c632272
4 files changed +59 -53
lib/exchange/provider/swapsxyz_exchange_provider.dart
+3 -2
@@ -382,7 +382,8 @@ class SwapsXyzExchangeProvider extends ExchangeProvider {
382 final reqAmountRaw = reqAmountStr.replaceAll('n', '');
383
384 final needToRegisterInSwapXyz =
385 - vmId == 'alt-vm' || bridgeIds.contains('alt-vm');
385 + vmId == 'alt-vm' || bridgeIds.contains('alt-vm')
386 + || chainId == 'solana' || bridgeIds.contains('solana');
387
388 final trade = Trade(
389 id: txId,
@@ -417,7 +418,7 @@ class SwapsXyzExchangeProvider extends ExchangeProvider {
418 }
419
420 /// Register a broadcasted tx with Swaps.xyz (required for alt-vm).
420 - Future<bool> registerAltVmTx({
421 + static Future<bool> registerAltVmTx({
422 required String txId,
423 required String txHash,
424 required int chainId,
lib/src/screens/exchange_trade/exchange_trade_page.dart
-1
@@ -340,7 +340,6 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
340 if (bottomSheetContext.mounted && Navigator.canPop(bottomSheetContext)) Navigator.of(bottomSheetContext).pop(true);
341
342 sendVM.commitTransaction(context);
343 - widget.exchangeTradeViewModel.registerSwapsXyzTransaction();
343 },
344 amountParsingProxy: sendVM.amountParsingProxy,
345 );
lib/view_model/exchange/exchange_trade_view_model.dart
-50
@@ -406,56 +406,6 @@ abstract class ExchangeTradeViewModelBase with Store {
406 return true;
407 }
408
409 - Future<void> registerSwapsXyzTransaction() async {
410 - try {
411 - if (!(_provider is SwapsXyzExchangeProvider)) return;
412 - final swaps = _provider as SwapsXyzExchangeProvider;
413 -
414 - // register only for vmId is alt-vm or bridgeId is alt-vm (trade.needToRegisterInSwapXyz)
415 - final needToRegister = trade.needToRegisterInSwapXyz ?? false;
416 - if (!needToRegister) return;
417 -
418 - final vmId = (trade.providerId ?? '').toLowerCase();
419 - if (vmId.isEmpty) {
420 - printV('SwapsXyz: transaction register: skipped (vmId empty)');
421 - return;
422 - }
423 -
424 - final txHash = sendViewModel.pendingTransaction?.evmTxHashFromRawHex ??
425 - sendViewModel.pendingTransaction?.id ??
426 - '';
427 -
428 - if (txHash.isEmpty) {
429 - printV('SwapsXyz: transaction register: skipped (txHash empty)');
430 - return;
431 - }
432 -
433 - final chainId = int.tryParse(trade.router ?? '') ?? 0;
434 - if (chainId <= 0) {
435 - printV('SwapsXyz: transaction register: skipped (invalid chainId)');
436 - return;
437 - }
438 -
439 - printV(
440 - 'SwapsXyz: attempting to register transaction: tradeId = ${trade.id}, txHash = $txHash, chainId = $chainId, vmId = $vmId');
441 -
442 - final registered = await swaps.registerAltVmTx(
443 - txId: trade.id,
444 - txHash: txHash,
445 - chainId: chainId,
446 - vmId: vmId,
447 - );
448 -
449 - if (!registered) {
450 - printV('SwapsXyz: transaction register: failed');
451 - } else {
452 - printV('SwapsXyz: transaction register: success');
453 - }
454 - } catch (e) {
455 - printV('registerSwapsXyzTransaction error: $e');
456 - }
457 - }
458 -
409 PaymentURI? get paymentUri {
410 final inputAddress = trade.inputAddress;
411 final amount = trade.amount;
lib/view_model/send/send_view_model.dart
+56
@@ -22,6 +22,7 @@ import 'package:cake_wallet/entities/template.dart';
22 import 'package:cake_wallet/entities/transaction_description.dart';
23 import 'package:cake_wallet/entities/wallet_contact.dart';
24 import 'package:cake_wallet/evm/evm.dart';
25 +import 'package:cake_wallet/exchange/exchange_provider_description.dart';
26 import 'package:cake_wallet/exchange/provider/exchange_provider.dart';
27 import 'package:cake_wallet/exchange/provider/jupiter_exchange_provider.dart';
28 import 'package:cake_wallet/exchange/provider/near_Intents_exchange_provider.dart';
@@ -982,6 +983,13 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
983
984 state = TransactionCommitted();
985
986 + if (_currentTrade != null) {
987 + final provider = _currentTrade!.provider;
988 + if (provider == ExchangeProviderDescription.swapsXyz) {
989 + registerSwapsXyzTransaction(_currentTrade!);
990 + }
991 + }
992 +
993 await _updateSolanaTrade(signature: pendingTransaction!.id, isSuccess: true);
994
995 if (walletType == WalletType.solana) {
@@ -1559,6 +1567,54 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
1567 return false;
1568 }
1569
1570 + Future<void> registerSwapsXyzTransaction(Trade trade) async {
1571 + try {
1572 +
1573 + // register only for vmId is alt-vm or bridgeId is alt-vm (trade.needToRegisterInSwapXyz)
1574 + final needToRegister = trade.needToRegisterInSwapXyz ?? false;
1575 + if (!needToRegister) return;
1576 +
1577 + final vmId = (trade.providerId ?? '').toLowerCase();
1578 + if (vmId.isEmpty) {
1579 + printV('SwapsXyz: transaction register: skipped (vmId empty)');
1580 + return;
1581 + }
1582 +
1583 + final txHash = pendingTransaction?.evmTxHashFromRawHex
1584 + ?? pendingTransaction?.id
1585 + ?? '';
1586 +
1587 + if (txHash.isEmpty) {
1588 + printV('SwapsXyz: transaction register: skipped (txHash empty)');
1589 + return;
1590 + }
1591 +
1592 + final chainId = int.tryParse(trade.router ?? '') ?? 0;
1593 + if (chainId <= 0) {
1594 + printV('SwapsXyz: transaction register: skipped (invalid chainId)');
1595 + return;
1596 + }
1597 +
1598 + printV(
1599 + 'SwapsXyz: attempting to register transaction: tradeId = ${trade.id}, txHash = $txHash, chainId = $chainId, vmId = $vmId');
1600 +
1601 + final registered = await SwapsXyzExchangeProvider.registerAltVmTx(
1602 + txId: trade.id,
1603 + txHash: txHash,
1604 + chainId: chainId,
1605 + vmId: vmId,
1606 + );
1607 +
1608 + if (!registered) {
1609 + printV('SwapsXyz: transaction register: failed');
1610 + } else {
1611 + printV('SwapsXyz: transaction register: success');
1612 + }
1613 + } catch (e) {
1614 + printV('registerSwapsXyzTransaction error: $e');
1615 + }
1616 + }
1617 +
1618 @computed
1619 bool get usePayjoin => _settingsStore.usePayjoin;
1620