From 680cf22a98b12dfadb770531a4c1b3e64ec1e4ff Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Thu, 26 Mar 2026 16:36:46 +0100 Subject: [PATCH] feat: Add Tether Gold (XAUT0) token support to Solana wallet and add migration for existing wallets (#3136) --- assets/images/xau_sol.png | Bin 0 -> 6389 bytes cw_solana/lib/default_spl_tokens.dart | 9 ++++ lib/entities/default_settings_migration.dart | 40 ++++++++++++++++++ lib/main.dart | 2 +- .../assets_history/asset_details_modal.dart | 2 +- .../coins_page/assets_history/asset_tile.dart | 2 +- 6 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 assets/images/xau_sol.png diff --git a/assets/images/xau_sol.png b/assets/images/xau_sol.png new file mode 100644 index 0000000000000000000000000000000000000000..955d600b42a24f7c2bf70d921eb0e1276de8b2ed GIT binary patch literal 6389 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 defaultSettingsMigration( enabled: false, ); break; + case 63: + await _addXaut0TokenToExistingSolanaWallets(); + break; default: break; } @@ -1489,3 +1493,39 @@ Future _addXautTokenToExistingEthereumWallets() async { printV('Error in XAUT migration: $e'); } } +Future _addXaut0TokenToExistingSolanaWallets() async { + try { + final xaut0Token = SPLToken( + name: "Tether Gold", + symbol: "XAUT0", + mintAddress: "AymATz4TCL9sWNEEV9Kvyz45CHVhDZ6kUgjTJPzLpU9P", + decimal: 6, + mint: 'xaut0', + enabled: false, + iconPath: "assets/images/xau_sol.png", + ); + + final allWallets = await WalletInfo.getAll(); + + final solanaWallets = allWallets.where((wallet) => wallet.type == WalletType.solana).toList(); + + for (final walletInfo in solanaWallets) { + final sanitizedName = walletInfo.name.replaceAll(' ', '_'); + final boxName = '${sanitizedName}_${SPLToken.boxName}'; + + Box tokenBox; + if (CakeHive.isBoxOpen(boxName)) { + tokenBox = CakeHive.box(boxName); + } else { + tokenBox = await CakeHive.openBox(boxName); + } + + final xaut0Address = xaut0Token.mintAddress; + if (!tokenBox.containsKey(xaut0Address)) { + await tokenBox.put(xaut0Address, xaut0Token); + } + } + } catch (e) { + printV('Error in XAUT0 migration: $e'); + } +} diff --git a/lib/main.dart b/lib/main.dart index 56f0d02e2..3d4493a36 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -324,7 +324,7 @@ Future initializeAppConfigs({bool loadWallet = true}) async { payjoinSessionSource: payjoinSessionSource, anonpayInvoiceInfo: anonpayInvoiceInfo, havenSeedStore: havenSeedStore, - initialMigrationVersion: 62, + initialMigrationVersion: 63, ); } diff --git a/lib/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart b/lib/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart index e555ae564..8bdf7571c 100644 --- a/lib/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart +++ b/lib/new-ui/widgets/coins_page/assets_history/asset_details_modal.dart @@ -74,7 +74,7 @@ class AssetDetailsModal extends StatelessWidget { child: Stack( children: [ if (iconPath.isNotEmpty) - Image.asset(iconPath, width: 75, height: 75) + CakeImageWidget(imageUrl: iconPath, width: 75, height: 75) else Container( width: 75, diff --git a/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart b/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart index 380588e15..9eb4d7539 100644 --- a/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart +++ b/lib/new-ui/widgets/coins_page/assets_history/asset_tile.dart @@ -92,7 +92,7 @@ class AssetTile extends StatelessWidget { child: Stack( children: [ if((iconPath).isNotEmpty) - Image.asset(iconPath) + CakeImageWidget(imageUrl: iconPath) else Container( width: 45,