Merge branch 'dev' into cw-1440-new-buy-sell-flow

This commit is contained in:
malik1004x
2026-08-20 16:26:13 +02:00
committed by GitHub
220 changed files with 11956 additions and 9280 deletions
-2
View File
@@ -22,8 +22,6 @@ migrate_working_dir/
#.vscode/
# Flutter/Dart/Pub related
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
/pubspec.lock
**/doc/api/
.dart_tool/
.packages
+5
View File
@@ -0,0 +1,5 @@
targets:
$default:
sources:
exclude:
- "**/.secrets.g.dart"
+39 -37
View File
@@ -2,7 +2,6 @@ import 'dart:async';
import 'dart:convert';
import 'package:cw_core/amount/money.dart';
import 'package:cw_core/cake_hive.dart';
import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/encryption_file_utils.dart';
import 'package:cw_core/node.dart';
@@ -28,7 +27,6 @@ import 'package:cw_solana/solana_transaction_model.dart';
import 'package:cw_solana/solana_wallet_addresses.dart';
import 'package:cw_core/spl_token.dart';
import 'package:hex/hex.dart';
import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:on_chain/solana/solana.dart' hide Store;
@@ -67,10 +65,6 @@ abstract class SolanaWalletBase
encryptionFileUtils: encryptionFileUtils,
);
if (!CakeHive.isAdapterRegistered(SPLToken.typeId)) {
CakeHive.registerAdapter(SPLTokenAdapter());
}
_sharedPrefs.complete(SharedPreferences.getInstance());
}
@@ -90,7 +84,7 @@ abstract class SolanaWalletBase
Future<void>? _currentRefresh;
late final Box<SPLToken> splTokensBox;
List<SPLToken> _splTokens = [];
@override
WalletAddresses walletAddresses;
@@ -133,9 +127,7 @@ abstract class SolanaWalletBase
);
Future<void> init() async {
final boxName = "${walletInfo.name.replaceAll(" ", "_")}_${SPLToken.boxName}";
splTokensBox = await CakeHive.openBox<SPLToken>(boxName);
_splTokens = await SPLToken.getAllForWallet(walletInfo.name);
await _checkForExistingScamTokens();
@@ -160,8 +152,6 @@ abstract class SolanaWalletBase
String get _scamCheckDoneKey => 'solana_scam_check_v2_done_${walletInfo.name}';
Future<void> _checkForExistingScamTokens() async {
if (!splTokensBox.isOpen) return;
final prefs = await _sharedPrefs.future;
if (prefs.getBool(_scamCheckDoneKey) == true) return;
@@ -169,7 +159,7 @@ abstract class SolanaWalletBase
final defaultSymbolsUpper =
DefaultSPLTokens().initialSPLTokens.map((t) => t.symbol.toUpperCase()).toSet();
for (final token in splTokensBox.values) {
for (final token in _splTokens) {
final suspicious = isTokenPropertiesSuspicious(
token,
cachedDefaultMints: defaultMints,
@@ -421,7 +411,7 @@ abstract class SolanaWalletBase
}
Future<void> updateSPLTokenTransactions({List<String>? specificMints}) async {
final allTokens = splTokensBox.values.where((t) => t.enabled).toList(growable: false);
final allTokens = _splTokens.where((t) => t.enabled).toList(growable: false);
// Filter to specific mints if provided
final tokens = specificMints != null
@@ -618,11 +608,11 @@ abstract class SolanaWalletBase
List<String>? tokenMints,
}) async {
// Remove disabled tokens first to keep state clean
for (var token in splTokensBox.values.where((t) => !t.enabled)) {
for (var token in _splTokens.where((t) => !t.enabled)) {
balance.remove(token);
}
final enabledTokens = splTokensBox.values.where((t) => t.enabled).toList(growable: false);
final enabledTokens = _splTokens.where((t) => t.enabled).toList(growable: false);
if (enabledTokens.isEmpty) return;
final tokens = tokenMints == null || tokenMints.isEmpty
@@ -677,35 +667,48 @@ abstract class SolanaWalletBase
}
}
List<SPLToken> get splTokenCurrencies => splTokensBox.values.toList();
List<SPLToken> get splTokenCurrencies => _splTokens.toList();
SPLToken? splTokenBySymbol(String symbol) {
for (final token in splTokensBox.values) {
for (final token in _splTokens) {
if (token.symbol == symbol) return token;
}
return null;
}
void addInitialTokens() {
SPLToken? _findCachedToken(String mintAddress) {
for (final token in _splTokens) {
if (token.mintAddress == mintAddress) return token;
}
return null;
}
void _upsertCachedToken(SPLToken token) {
_splTokens.removeWhere((t) => t.mintAddress == token.mintAddress);
_splTokens.add(token);
}
Future<void> addInitialTokens() async {
final initialSPLTokens = DefaultSPLTokens().initialSPLTokens;
for (var token in initialSPLTokens) {
if (!splTokensBox.containsKey(token.mintAddress)) {
splTokensBox.put(token.mintAddress, token);
} else {
// update existing token
final existingToken = splTokensBox.get(token.mintAddress);
splTokensBox.put(
token.mintAddress, SPLToken.copyWith(token, enabled: existingToken!.enabled));
}
final existingToken = _findCachedToken(token.mintAddress);
final newToken = SPLToken.copyWith(
token,
enabled: existingToken?.enabled ?? token.enabled,
walletName: walletInfo.name,
);
await newToken.save();
_upsertCachedToken(newToken);
}
}
Future<SolanaMoralisDiscoveryResult> discoverTokensFromMoralis() async {
try {
if (!splTokensBox.isOpen) return SolanaMoralisDiscoveryResult.empty;
final address = walletAddresses.address;
if (address.isEmpty) return SolanaMoralisDiscoveryResult.empty;
@@ -713,7 +716,7 @@ abstract class SolanaWalletBase
if (walletTokens.isEmpty) return SolanaMoralisDiscoveryResult.empty;
final existingMints = {
for (final token in splTokensBox.values) token.mintAddress: token,
for (final token in _splTokens) token.mintAddress: token,
};
final defaultMints = DefaultSPLTokens().initialSPLTokens.map((t) => t.mintAddress).toSet();
@@ -849,7 +852,9 @@ abstract class SolanaWalletBase
final isSuspicious = isTokenPropertiesSuspicious(token);
token.isPotentialScam = token.isPotentialScam || isSuspicious;
await splTokensBox.put(token.mintAddress, token);
token.walletName = walletInfo.name;
await token.save();
_upsertCachedToken(token);
if (token.enabled) {
final tokenBalance = await _client.getSplTokenBalance(token, solanaAddress) ??
@@ -869,13 +874,10 @@ abstract class SolanaWalletBase
sources.add(_nativeSource);
}
if (splTokensBox.isOpen) {
sources.addAll(splTokensBox.values
.where((t) => t.symbol == token.symbol)
.map((t) => t.mintAddress));
sources.addAll(_splTokens.where((t) => t.symbol == token.symbol).map((t) => t.mintAddress));
await splTokensBox.delete(token.mintAddress);
}
await SPLToken.deleteForWallet(walletInfo.name, token.mintAddress);
_splTokens.removeWhere((t) => t.mintAddress == token.mintAddress);
balance.remove(token);
await _removeTokenTransactionsInHistory(token);
+11 -5
View File
@@ -4,6 +4,7 @@ import 'package:bip39/bip39.dart' as bip39;
import 'package:cw_core/encryption_file_utils.dart';
import 'package:cw_core/balance.dart';
import 'package:cw_core/pathForWallet.dart';
import 'package:cw_core/spl_token.dart';
import 'package:cw_core/transaction_history.dart';
import 'package:cw_core/transaction_info.dart';
import 'package:cw_core/wallet_base.dart';
@@ -40,7 +41,7 @@ class SolanaWalletService extends WalletService<
);
await wallet.init();
wallet.addInitialTokens();
await wallet.addInitialTokens();
await wallet.save();
return wallet;
}
@@ -68,7 +69,7 @@ class SolanaWalletService extends WalletService<
);
await wallet.init();
wallet.addInitialTokens();
await wallet.addInitialTokens();
await wallet.save();
saveBackup(name);
return wallet;
@@ -83,7 +84,7 @@ class SolanaWalletService extends WalletService<
);
await wallet.init();
wallet.addInitialTokens();
await wallet.addInitialTokens();
await wallet.save();
return wallet;
}
@@ -97,6 +98,11 @@ class SolanaWalletService extends WalletService<
throw Exception('Wallet not found');
}
await WalletInfo.delete(walletInfo);
final nameStillUsed = await WalletInfo.get(wallet, getType()) != null;
if (!nameStillUsed) {
await SPLToken.deleteAllForWallet(wallet);
}
final prefs = await SharedPreferences.getInstance();
for (final key in prefs.getKeys().where(
(k) => k.startsWith('solana_last_synced_signature_${wallet}_'))) {
@@ -116,7 +122,7 @@ class SolanaWalletService extends WalletService<
);
await wallet.init();
wallet.addInitialTokens();
await wallet.addInitialTokens();
await wallet.save();
return wallet;
@@ -139,7 +145,7 @@ class SolanaWalletService extends WalletService<
);
await wallet.init();
wallet.addInitialTokens();
await wallet.addInitialTokens();
await wallet.save();
return wallet;
+1 -1
View File
@@ -27,7 +27,7 @@ dependencies:
blockchain_utils:
git:
url: https://github.com/cake-tech/blockchain_utils
ref: cake-update-v2
ref: 59fdf29d72068e0522a96a8953ed7272833a9f57
dev_dependencies:
flutter_test:
+1
View File
@@ -0,0 +1 @@
../pubspec_overrides.yaml