CW-1368: Add Binance Smart Chain (#2836)

* feat: Add Binance Smart Chain support to wallet types and EVM chain registry

* feat: Add BSC node list and support in wallet type and chain ID mappings

* feat: Add BSC default tokens and update evm utility functions

* feat: Integrate BSC support in node settings and management

* feat: Add BSC support to config scripts and wallet type generation

* feat: Add BSC support to EVM chain ID and switcher

* feat: Extend BSC support in wallet utilities and chain type checks

* feat: Add BSC support to different wallet functions

* feat: Add BSCURI class and implement for uri handling

* feat: Update Android and iOS configurations to support BSC URL schemes

* feat: Add BSC support to different functionalities and settings

* refactor: Update wallet type name from'Binance Smart Chain' to BNB Smart Chain

* feat: Add switcher icon and updates token utils

* Review fixes

* More changes to BSC name, wallet listing and images

* Add more default tokens
This commit is contained in:
David Adegoke
2026-02-05 13:48:26 +01:00
committed by GitHub
parent d05a7a91d6
commit 308de0389d
103 changed files with 609 additions and 157 deletions
+1
View File
@@ -137,6 +137,7 @@ class DFXBuyProvider extends BuyProvider {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.tron:
return wallet.signMessage(message);
@@ -107,6 +107,7 @@ class RobinhoodBuyProvider extends BuyProvider {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.tron:
case WalletType.dogecoin:
+15
View File
@@ -116,6 +116,21 @@ class ArbitrumURI extends PaymentURI {
}
}
class BSCURI extends PaymentURI {
BSCURI({required super.amount, required super.address});
@override
String toString() {
var base = 'bsc:$address';
if (amount.isNotEmpty) {
base += '?amount=${amount.replaceAll(',', '.')}';
}
return base;
}
}
class BitcoinCashURI extends PaymentURI {
BitcoinCashURI({required super.amount, required super.address});
+1
View File
@@ -37,6 +37,7 @@ class SeedValidator extends Validator<MnemonicItem> {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return evm!.getEVMWordList(language);
case WalletType.bitcoinCash:
return getBitcoinWordList(language);
+1
View File
@@ -79,6 +79,7 @@ class WalletCreationService {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.tron:
case WalletType.dogecoin:
+1
View File
@@ -1202,6 +1202,7 @@ Future<void> setup({
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return evm!.createEVMWalletService(param1, SettingsStoreBase.walletPasswordDirectInput);
case WalletType.bitcoinCash:
return bitcoinCash!.createBitcoinCashWalletService(_unspentCoinsInfoSource, SettingsStoreBase.walletPasswordDirectInput);
@@ -51,6 +51,7 @@ const decredDefaultUri = "default-spv-nodes";
const dogecoinDefaultNodeUri = 'dogecoin.stackwallet.com:50022';
const baseDefaultNodeUri = 'base.nownodes.io';
const arbitrumDefaultNodeUri = 'arbitrum.nownodes.io';
const bscDefaultNodeUri = 'bsc-dataseed.bnbchain.org';
const zcashDefaultNodeUri = 'zec-node.cakewallet.com:443';
Future<void> defaultSettingsMigration(
@@ -572,6 +573,14 @@ Future<void> defaultSettingsMigration(
await sharedPreferences.setString(
PreferencesKey.syncStatusDisplayMode, SyncStatusDisplayMode.blocksRemaining.name);
break;
case 57:
await addWalletNodeList(nodes: nodes, type: WalletType.bsc);
await _changeDefaultNode(
nodes: nodes,
sharedPreferences: sharedPreferences,
type: WalletType.bsc,
currentNodePreferenceKey: PreferencesKey.currentBscNodeIdKey,
);
default:
break;
}
@@ -684,6 +693,8 @@ String _getDefaultNodeUri(WalletType type) {
return baseDefaultNodeUri;
case WalletType.arbitrum:
return arbitrumDefaultNodeUri;
case WalletType.bsc:
return bscDefaultNodeUri;
case WalletType.zcash:
return zcashDefaultNodeUri;
case WalletType.banano:
@@ -1095,6 +1106,7 @@ Future<void> checkCurrentNodes(
final currentPolygonNodeId = sharedPreferences.getInt(PreferencesKey.currentPolygonNodeIdKey);
final currentBaseNodeId = sharedPreferences.getInt(PreferencesKey.currentBaseNodeIdKey);
final currentArbitrumNodeId = sharedPreferences.getInt(PreferencesKey.currentArbitrumNodeIdKey);
final currentBscNodeId = sharedPreferences.getInt(PreferencesKey.currentBscNodeIdKey);
final currentNanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey);
final currentNanoPowNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoPowNodeIdKey);
final currentDecredNodeId = sharedPreferences.getInt(PreferencesKey.currentDecredNodeIdKey);
@@ -1123,6 +1135,8 @@ Future<void> checkCurrentNodes(
nodeSource.values.firstWhereOrNull((node) => node.key == currentBaseNodeId);
final currentArbitrumNodeServer =
nodeSource.values.firstWhereOrNull((node) => node.key == currentArbitrumNodeId);
final currentBscNodeServer =
nodeSource.values.firstWhereOrNull((node) => node.key == currentBscNodeId);
final currentNanoNodeServer =
nodeSource.values.firstWhereOrNull((node) => node.key == currentNanoNodeId);
final currentDecredNodeServer =
@@ -1228,6 +1242,12 @@ Future<void> checkCurrentNodes(
await sharedPreferences.setInt(PreferencesKey.currentArbitrumNodeIdKey, node.key as int);
}
if (currentBscNodeServer == null) {
final node = Node(uri: bscDefaultNodeUri, type: WalletType.bsc);
await nodeSource.add(node);
await sharedPreferences.setInt(PreferencesKey.currentBscNodeIdKey, node.key as int);
}
if (currentSolanaNodeServer == null) {
final node = Node(uri: solanaDefaultNodeUri, type: WalletType.solana);
await nodeSource.add(node);
+1
View File
@@ -38,6 +38,7 @@ class EnsRecord {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
default:
return (await ens.withName(name).getAddress()).hex;
}
+6 -1
View File
@@ -59,6 +59,9 @@ Future<List<Node>> loadDefaultNodes(WalletType type) async {
case WalletType.zcash:
path = 'assets/zcash_node_list.yml';
break;
case WalletType.bsc:
path = 'assets/bsc_node_list.yml';
break;
case WalletType.banano:
case WalletType.none:
path = '';
@@ -113,6 +116,7 @@ Future<void> resetToDefault(Box<Node> nodeSource) async {
final baseNodes = await loadDefaultNodes(WalletType.base);
final arbitrumNodes = await loadDefaultNodes(WalletType.arbitrum);
final zcashNodes = await loadDefaultNodes(WalletType.zcash);
final bscNodes = await loadDefaultNodes(WalletType.bsc);
final nodes = moneroNodes +
bitcoinElectrumServerList +
@@ -129,7 +133,8 @@ Future<void> resetToDefault(Box<Node> nodeSource) async {
dogecoinElectrumServerList +
baseNodes +
arbitrumNodes +
zcashNodes;
zcashNodes +
bscNodes;
await nodeSource.clear();
await nodeSource.addAll(nodes);
+3
View File
@@ -10,6 +10,7 @@ class PreferencesKey {
static const currentPolygonNodeIdKey = 'current_node_id_matic';
static const currentBaseNodeIdKey = 'current_node_id_base';
static const currentArbitrumNodeIdKey = 'current_node_id_arbitrum';
static const currentBscNodeIdKey = 'current_node_id_bsc';
static const currentNanoNodeIdKey = 'current_node_id_nano';
static const currentNanoPowNodeIdKey = 'current_node_id_nano_pow';
static const currentDecredNodeIdKey = 'current_node_id_decred';
@@ -56,6 +57,7 @@ class PreferencesKey {
static const ethereumTransactionPriority = 'current_fee_priority_ethereum';
static const polygonTransactionPriority = 'current_fee_priority_polygon';
static const baseTransactionPriority = 'current_fee_priority_base';
static const bscTransactionPriority = 'current_fee_priority_bsc';
static const bitcoinCashTransactionPriority = 'current_fee_priority_bitcoin_cash';
static const zanoTransactionPriority = 'current_fee_priority_zano';
static const wowneroTransactionPriority = 'current_fee_priority_wownero';
@@ -83,6 +85,7 @@ class PreferencesKey {
static const usePolygonScan = 'use_polygonscan';
static const useBaseScan = 'use_base_scan';
static const useArbiScan = 'use_arbitrum_scan';
static const useBscScan = 'use_bscscan';
static const useTronGrid = 'use_trongrid';
static const useMempoolFeeAPI = 'use_mempool_fee_api';
static const evmHiddenChainIds = 'evm_hidden_chain_ids';
@@ -23,6 +23,7 @@ List<TransactionPriority> priorityForWalletType(WalletType type) {
case WalletType.ethereum:
case WalletType.polygon:
case WalletType.base:
case WalletType.bsc:
return evm!.getTransactionPriorities();
case WalletType.bitcoinCash:
return bitcoinCash!.getTransactionPriorities();
+1 -1
View File
@@ -313,7 +313,7 @@ Future<void> initializeAppConfigs({bool loadWallet = true}) async {
payjoinSessionSource: payjoinSessionSource,
anonpayInvoiceInfo: anonpayInvoiceInfo,
havenSeedStore: havenSeedStore,
initialMigrationVersion: 56,
initialMigrationVersion: 57,
);
}
+6 -1
View File
@@ -11,6 +11,7 @@ bool isEVMCompatibleChain(WalletType walletType) {
case WalletType.ethereum:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return true;
default:
return false;
@@ -18,7 +19,6 @@ bool isEVMCompatibleChain(WalletType walletType) {
}
// Blink Protection is supported on Ethereum and Base chains
//TODO: Add BNB Smart Chain to this list when we integrate it
bool canSupportBlinkProtection(int? chainId) {
if (chainId == null) return false;
@@ -32,6 +32,7 @@ bool isNFTACtivatedChain(WalletType walletType, int? chainId) {
case 8453:
case 137:
case 42161:
case 56:
return true;
default:
return false;
@@ -53,6 +54,7 @@ bool isWalletConnectCompatibleChain(WalletType walletType) {
case WalletType.ethereum:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return true;
default:
return false;
@@ -73,6 +75,8 @@ String getChainNameSpaceAndIdBasedOnWalletType(WalletType walletType, {int? chai
return EVMChainId.base.chain();
case WalletType.arbitrum:
return EVMChainId.arbitrum.chain();
case WalletType.bsc:
return EVMChainId.bsc.chain();
case WalletType.solana:
return SolanaChainId.mainnet.chain();
default:
@@ -86,6 +90,7 @@ List<String> getChainSupportedMethodsOnWalletType(WalletType walletType) {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return EVMSupportedMethods.values.map((e) => e.name).toList();
case WalletType.solana:
return SolanaSupportedMethods.values.map((e) => e.name).toList();
+2
View File
@@ -6,6 +6,7 @@ bool isBIP39Wallet(WalletType walletType) {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.tron:
case WalletType.bitcoin:
@@ -46,6 +47,7 @@ bool hasTokens(WalletType walletType) {
case WalletType.zano:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return true;
default:
return false;
@@ -41,6 +41,7 @@ class _DesktopWalletSelectionDropDownState extends State<DesktopWalletSelectionD
final bitcoinCashIcon = Image.asset('assets/images/crypto/bitcoin-cash.webp', height: 24, width: 24);
final baseIcon = Image.asset('assets/images/crypto/base_icon.webp', height: 24, width: 24);
final arbitrumIcon = Image.asset('assets/images/crypto/arbitrum.webp', height: 24, width: 24);
final bscIcon = Image.asset('assets/images/crypto/BNB.webp', height: 24, width: 24);
final nanoIcon = Image.asset('assets/images/crypto/nano.webp', height: 24, width: 24);
final bananoIcon = Image.asset('assets/images/crypto/nano.webp', height: 24, width: 24);
final solanaIcon = Image.asset('assets/images/crypto/solana.webp', height: 24, width: 24);
@@ -192,6 +193,8 @@ class _DesktopWalletSelectionDropDownState extends State<DesktopWalletSelectionD
return baseIcon;
case WalletType.arbitrum:
return arbitrumIcon;
case WalletType.bsc:
return bscIcon;
case WalletType.zcash:
return zcashIcon;
case WalletType.none:
@@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:flutter_svg/svg.dart';
class MenuWidget extends StatefulWidget {
MenuWidget(this.dashboardViewModel, Key? key);
@@ -36,6 +35,7 @@ class MenuWidgetState extends State<MenuWidget> {
this.polygonIcon = Image.asset('assets/images/crypto/polygon.webp'),
this.baseIcon = Image.asset('assets/images/crypto/base_icon.webp'),
this.arbitrumIcon = Image.asset('assets/images/crypto/arbitrum.webp'),
this.bscIcon = Image.asset('assets/images/crypto/BNB.webp'),
this.solanaIcon = Image.asset('assets/images/crypto/solana.webp'),
this.tronIcon = Image.asset('assets/images/crypto/tron.webp'),
this.wowneroIcon = Image.asset('assets/images/crypto/wownero.webp'),
@@ -66,6 +66,7 @@ class MenuWidgetState extends State<MenuWidget> {
Image polygonIcon;
Image baseIcon;
Image arbitrumIcon;
Image bscIcon;
Image solanaIcon;
Image tronIcon;
Image wowneroIcon;
@@ -258,6 +259,8 @@ class MenuWidgetState extends State<MenuWidget> {
return baseIcon;
case WalletType.arbitrum:
return arbitrumIcon;
case WalletType.bsc:
return bscIcon;
case WalletType.tron:
return tronIcon;
case WalletType.wownero:
@@ -142,6 +142,14 @@ class PrivacyPage extends BasePage {
_privacySettingsViewModel.setUseArbiScan(value);
},
),
if (_privacySettingsViewModel.canUseBscScan)
SettingsSwitcherCell(
title: S.current.bscscan_history,
value: _privacySettingsViewModel.useBscScan,
onValueChange: (BuildContext _, bool value) {
_privacySettingsViewModel.setUseBscScan(value);
},
),
if (_privacySettingsViewModel.canUseTronGrid)
SettingsSwitcherCell(
title: S.current.trongrid_history,
@@ -5,6 +5,7 @@ enum EVMChainId {
polygon,
base,
arbitrum,
bsc,
}
extension EVMChainIdX on EVMChainId {
@@ -22,6 +23,7 @@ extension EVMChainIdX on EVMChainId {
EVMChainId.polygon => 137,
EVMChainId.base => 8453,
EVMChainId.arbitrum => 42161,
EVMChainId.bsc => 56,
};
}
@@ -22,6 +22,7 @@ class KeyServiceImpl implements WalletConnectKeyService {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return evm!.getPrivateKey(wallet);
case WalletType.solana:
return solana!.getPrivateKey(wallet);
@@ -36,6 +37,7 @@ class KeyServiceImpl implements WalletConnectKeyService {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return evm!.getPublicKey(wallet);
case WalletType.solana:
return solana!.getPublicKey(wallet);
+15 -41
View File
@@ -14,52 +14,26 @@ class EvmSwitcherDataItem {
required this.svgPath,
required this.chainId,
});
static const ethereum = EvmSwitcherDataItem(
name: 'Ethereum',
svgPath: 'assets/images/evm_switcher_icons/ethereum.svg',
chainId: 1,
);
static const polygon = EvmSwitcherDataItem(
name: 'Polygon',
svgPath: 'assets/images/evm_switcher_icons/polygon.svg',
chainId: 137,
);
static const arbitrum = EvmSwitcherDataItem(
name: 'Arbitrum',
svgPath: 'assets/images/evm_switcher_icons/arbitrum.svg',
chainId: 42161,
);
static const base = EvmSwitcherDataItem(
name: 'Base',
svgPath: 'assets/images/evm_switcher_icons/base.svg',
chainId: 8453,
);
static const items = [
ethereum,
polygon,
arbitrum,
base,
];
}
String _getSvgPathForChain(String chainName) {
final name = chainName.toLowerCase();
if (name.contains('ethereum')) {
return 'assets/images/evm_switcher_icons/ethereum.svg';
} else if (name.contains('polygon')) {
return 'assets/images/evm_switcher_icons/polygon.svg';
} else if (name.contains('arbitrum')) {
return 'assets/images/evm_switcher_icons/arbitrum.svg';
} else if (name.contains('base')) {
return 'assets/images/evm_switcher_icons/base.svg';
switch (name) {
case 'ethereum':
return 'assets/images/crypto/ethereum.webp';
case 'polygon':
return 'assets/images/crypto/polygon.webp';
case 'arbitrum':
return 'assets/images/crypto/arbitrum.webp';
case 'base':
return 'assets/images/crypto/base_icon.webp';
case 'bnb':
case 'bsc':
return 'assets/images/crypto/BNB.webp';
default:
return 'assets/images/crypto/ethereum.webp';
}
// Default to ethereum if unknown
return 'assets/images/evm_switcher_icons/ethereum.svg';
}
class EvmSwitcher extends StatefulWidget {
+13 -12
View File
@@ -1,7 +1,7 @@
import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
import 'package:cake_wallet/src/widgets/evm_switcher.dart';
import 'package:cake_wallet/src/widgets/standard_switch.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
class EvmSwitcherRow extends StatelessWidget {
const EvmSwitcherRow({
@@ -45,23 +45,24 @@ class EvmSwitcherRow extends StatelessWidget {
Row(
spacing: 8.0,
children: [
SvgPicture.asset(
data.svgPath,
CakeImageWidget(
imageUrl: data.svgPath,
width: 16,
height: 16,
colorFilter: ColorFilter.mode(
resolvedForegroundColor, BlendMode.srcIn),
),
Text(data.name,
style: TextStyle(
color: resolvedForegroundColor, fontSize: 14)),
Text(
data.name,
style: TextStyle(color: resolvedForegroundColor, fontSize: 14),
),
if (selected && !editMode)
SvgPicture.asset("assets/images/evm_switcher_checkmark.svg",
width: 18, height: 18),
CakeImageWidget(
imageUrl: "assets/images/evm_switcher_checkmark.svg",
width: 18,
height: 18,
),
],
),
if (editMode)
StandardSwitch(value: editSwitchValue, onTapped: onTap)
if (editMode) StandardSwitch(value: editSwitchValue, onTapped: onTap)
],
),
),
+45
View File
@@ -112,6 +112,7 @@ abstract class SettingsStoreBase with Store {
required this.useEtherscan,
required this.useBaseScan,
required this.useArbiScan,
required this.useBscScan,
required this.usePolygonScan,
required this.useTronGrid,
required this.useMempoolFeeAPI,
@@ -146,6 +147,7 @@ abstract class SettingsStoreBase with Store {
TransactionPriority? initialEVMTransactionPriority,
TransactionPriority? initialPolygonTransactionPriority,
TransactionPriority? initialBaseTransactionPriority,
TransactionPriority? initialBscTransactionPriority,
TransactionPriority? initialBitcoinCashTransactionPriority,
TransactionPriority? initialZanoTransactionPriority,
TransactionPriority? initialDecredTransactionPriority,
@@ -238,6 +240,10 @@ abstract class SettingsStoreBase with Store {
priority[WalletType.base] = initialBaseTransactionPriority;
}
if (initialBscTransactionPriority != null) {
priority[WalletType.bsc] = initialBscTransactionPriority;
}
if (initialBitcoinCashTransactionPriority != null) {
priority[WalletType.bitcoinCash] = initialBitcoinCashTransactionPriority;
}
@@ -305,6 +311,9 @@ abstract class SettingsStoreBase with Store {
case WalletType.base:
key = PreferencesKey.baseTransactionPriority;
break;
case WalletType.bsc:
key = PreferencesKey.bscTransactionPriority;
break;
case WalletType.zano:
key = PreferencesKey.zanoTransactionPriority;
break;
@@ -477,6 +486,9 @@ abstract class SettingsStoreBase with Store {
reaction((_) => useArbiScan,
(bool useArbiScan) => _sharedPreferences.setBool(PreferencesKey.useArbiScan, useArbiScan));
reaction((_) => useBscScan,
(bool useBscScan) => _sharedPreferences.setBool(PreferencesKey.useBscScan, useBscScan));
reaction((_) => useTronGrid,
(bool useTronGrid) => _sharedPreferences.setBool(PreferencesKey.useTronGrid, useTronGrid));
@@ -853,6 +865,9 @@ abstract class SettingsStoreBase with Store {
@observable
bool useArbiScan;
@observable
bool useBscScan;
@observable
bool useTronGrid;
@@ -981,6 +996,8 @@ abstract class SettingsStoreBase with Store {
return PreferencesKey.currentBaseNodeIdKey;
case 42161:
return PreferencesKey.currentArbitrumNodeIdKey;
case 56:
return PreferencesKey.currentBscNodeIdKey;
default:
// Default to Ethereum for unknown chainIds
return PreferencesKey.currentEthereumNodeIdKey;
@@ -1043,6 +1060,7 @@ abstract class SettingsStoreBase with Store {
TransactionPriority? evmTransactionPriority;
TransactionPriority? polygonTransactionPriority;
TransactionPriority? baseTransactionPriority;
TransactionPriority? bscTransactionPriority;
TransactionPriority? bitcoinCashTransactionPriority;
TransactionPriority? wowneroTransactionPriority;
TransactionPriority? zanoTransactionPriority;
@@ -1070,6 +1088,10 @@ abstract class SettingsStoreBase with Store {
baseTransactionPriority = evm?.deserializeEVMTransactionPriority(
sharedPreferences.getInt(PreferencesKey.baseTransactionPriority)!);
}
if (sharedPreferences.getInt(PreferencesKey.bscTransactionPriority) != null) {
bscTransactionPriority = evm?.deserializeEVMTransactionPriority(
sharedPreferences.getInt(PreferencesKey.bscTransactionPriority)!);
}
if (sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority) != null) {
bitcoinCashTransactionPriority = bitcoinCash?.deserializeBitcoinCashTransactionPriority(
sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority)!);
@@ -1098,6 +1120,7 @@ abstract class SettingsStoreBase with Store {
decredTransactionPriority ??= decred?.getDecredTransactionPriorityMedium();
polygonTransactionPriority ??= evm?.getDefaultTransactionPriority();
baseTransactionPriority ??= evm?.getDefaultTransactionPriority();
bscTransactionPriority ??= evm?.getDefaultTransactionPriority();
zanoTransactionPriority ??= zano?.getDefaultTransactionPriority();
final currentBalanceDisplayMode = BalanceDisplayMode.deserialize(
@@ -1148,6 +1171,7 @@ abstract class SettingsStoreBase with Store {
final usePolygonScan = sharedPreferences.getBool(PreferencesKey.usePolygonScan) ?? true;
final useBaseScan = sharedPreferences.getBool(PreferencesKey.useBaseScan) ?? true;
final useArbiScan = sharedPreferences.getBool(PreferencesKey.useArbiScan) ?? true;
final useBscScan = sharedPreferences.getBool(PreferencesKey.useBscScan) ?? true;
final useTronGrid = sharedPreferences.getBool(PreferencesKey.useTronGrid) ?? true;
final useMempoolFeeAPI = sharedPreferences.getBool(PreferencesKey.useMempoolFeeAPI) ?? true;
final useBlinkProtection = sharedPreferences.getBool(PreferencesKey.useBlinkProtection) ?? true;
@@ -1200,6 +1224,7 @@ abstract class SettingsStoreBase with Store {
final polygonNodeId = sharedPreferences.getInt(PreferencesKey.currentPolygonNodeIdKey);
final baseNodeId = sharedPreferences.getInt(PreferencesKey.currentBaseNodeIdKey);
final arbitrumNodeId = sharedPreferences.getInt(PreferencesKey.currentArbitrumNodeIdKey);
final bscNodeId = sharedPreferences.getInt(PreferencesKey.currentBscNodeIdKey);
final nanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey);
final nanoPowNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoPowNodeIdKey);
final solanaNodeId = sharedPreferences.getInt(PreferencesKey.currentSolanaNodeIdKey);
@@ -1225,6 +1250,8 @@ abstract class SettingsStoreBase with Store {
nodeSource.values.firstWhereOrNull((e) => e.uriRaw == baseDefaultNodeUri);
final arbitrumNode = nodeSource.get(arbitrumNodeId) ??
nodeSource.values.firstWhereOrNull((e) => e.uriRaw == arbitrumDefaultNodeUri);
final bscNode = nodeSource.get(bscNodeId) ??
nodeSource.values.firstWhereOrNull((e) => e.uriRaw == bscDefaultNodeUri);
final bitcoinCashElectrumServer = nodeSource.get(bitcoinCashElectrumServerId) ??
nodeSource.values.firstWhereOrNull((e) => e.uriRaw == cakeWalletBitcoinCashDefaultNodeUri);
final nanoNode = nodeSource.get(nanoNodeId) ??
@@ -1309,6 +1336,10 @@ abstract class SettingsStoreBase with Store {
nodes[WalletType.arbitrum] = arbitrumNode;
}
if (bscNode != null) {
nodes[WalletType.bsc] = bscNode;
}
if (bitcoinCashElectrumServer != null) {
nodes[WalletType.bitcoinCash] = bitcoinCashElectrumServer;
}
@@ -1502,6 +1533,7 @@ abstract class SettingsStoreBase with Store {
usePolygonScan: usePolygonScan,
useBaseScan: useBaseScan,
useArbiScan: useArbiScan,
useBscScan: useBscScan,
useTronGrid: useTronGrid,
useMempoolFeeAPI: useMempoolFeeAPI,
useBlinkProtection: useBlinkProtection,
@@ -1552,6 +1584,7 @@ abstract class SettingsStoreBase with Store {
initialEVMTransactionPriority: evmTransactionPriority,
initialPolygonTransactionPriority: polygonTransactionPriority,
initialBaseTransactionPriority: baseTransactionPriority,
initialBscTransactionPriority: bscTransactionPriority,
initialSyncMode: savedSyncMode,
initialSyncAll: savedSyncAll,
shouldShowYatPopup: shouldShowYatPopup,
@@ -1607,6 +1640,10 @@ abstract class SettingsStoreBase with Store {
priority[WalletType.base] = evm!.deserializeEVMTransactionPriority(
sharedPreferences.getInt(PreferencesKey.baseTransactionPriority)!);
}
if (evm != null && sharedPreferences.getInt(PreferencesKey.bscTransactionPriority) != null) {
priority[WalletType.bsc] = evm!.deserializeEVMTransactionPriority(
sharedPreferences.getInt(PreferencesKey.bscTransactionPriority)!);
}
if (bitcoinCash != null &&
sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority) != null) {
priority[WalletType.bitcoinCash] = bitcoinCash!.deserializeBitcoinCashTransactionPriority(
@@ -1706,6 +1743,7 @@ abstract class SettingsStoreBase with Store {
usePolygonScan = sharedPreferences.getBool(PreferencesKey.usePolygonScan) ?? true;
useBaseScan = sharedPreferences.getBool(PreferencesKey.useBaseScan) ?? true;
useArbiScan = sharedPreferences.getBool(PreferencesKey.useArbiScan) ?? true;
useBscScan = sharedPreferences.getBool(PreferencesKey.useBscScan) ?? true;
useTronGrid = sharedPreferences.getBool(PreferencesKey.useTronGrid) ?? true;
useMempoolFeeAPI = sharedPreferences.getBool(PreferencesKey.useMempoolFeeAPI) ?? true;
useBlinkProtection = sharedPreferences.getBool(PreferencesKey.useBlinkProtection) ?? true;
@@ -1744,6 +1782,7 @@ abstract class SettingsStoreBase with Store {
final polygonNodeId = sharedPreferences.getInt(PreferencesKey.currentPolygonNodeIdKey);
final baseNodeId = sharedPreferences.getInt(PreferencesKey.currentBaseNodeIdKey);
final arbitrumNodeId = sharedPreferences.getInt(PreferencesKey.currentArbitrumNodeIdKey);
final bscNodeId = sharedPreferences.getInt(PreferencesKey.currentBscNodeIdKey);
final nanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey);
final solanaNodeId = sharedPreferences.getInt(PreferencesKey.currentSolanaNodeIdKey);
final tronNodeId = sharedPreferences.getInt(PreferencesKey.currentTronNodeIdKey);
@@ -1760,6 +1799,7 @@ abstract class SettingsStoreBase with Store {
final polygonNode = nodeSource.get(polygonNodeId);
final baseNode = nodeSource.get(baseNodeId);
final arbitrumNode = nodeSource.get(arbitrumNodeId);
final bscNode = nodeSource.get(bscNodeId);
final bitcoinCashNode = nodeSource.get(bitcoinCashElectrumServerId);
final nanoNode = nodeSource.get(nanoNodeId);
final solanaNode = nodeSource.get(solanaNodeId);
@@ -1802,6 +1842,10 @@ abstract class SettingsStoreBase with Store {
nodes[WalletType.arbitrum] = arbitrumNode;
}
if (bscNode != null) {
nodes[WalletType.bsc] = bscNode;
}
if (bitcoinCashNode != null) {
nodes[WalletType.bitcoinCash] = bitcoinCashNode;
}
@@ -1956,6 +2000,7 @@ abstract class SettingsStoreBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
final chainId = evm!.getChainIdByWalletType(node.type);
final preferenceKey = _getEVMNodePreferenceKey(chainId);
await _sharedPreferences.setInt(preferenceKey, node.key as int);
+22 -37
View File
@@ -1,26 +1,19 @@
import 'package:cake_wallet/reactions/wallet_connect.dart';
import 'package:cw_core/wallet_type.dart';
String getQrImage(WalletType type, {int? selectedChainId}) {
if (isEVMCompatibleChain(type) && selectedChainId != null) {
switch (selectedChainId) {
case 1:
return 'assets/images/eth_chain_qr.svg';
case 137:
return 'assets/images/pol_chain_qr.svg';
case 8453:
return 'assets/images/base_chain_QR.svg';
case 42161:
return 'assets/images/arbitrum_chain_QR.svg';
default:
return 'assets/images/eth_chain_qr.svg';
}
}
String getQrImage(WalletType type) {
switch (type) {
case WalletType.solana:
return 'assets/images/sol_chain_qr.svg';
case WalletType.ethereum:
return 'assets/images/eth_chain_qr.svg';
case WalletType.polygon:
return 'assets/images/pol_chain_qr.svg';
case WalletType.base:
return 'assets/images/base_chain_QR.svg';
case WalletType.arbitrum:
return 'assets/images/arbitrum_chain_QR.svg';
case WalletType.bsc:
return 'assets/images/bnb_chain_QR.svg';
case WalletType.solana:
return 'assets/images/sol_chain_qr.svg';
case WalletType.tron:
return 'assets/images/trx_chain_qr.svg';
case WalletType.zano:
@@ -46,32 +39,24 @@ String getQrImage(WalletType type, {int? selectedChainId}) {
case WalletType.banano:
case WalletType.haven:
case WalletType.none:
default:
return 'assets/images/qr-cake.png';
}
}
String getChainMonoImage(WalletType type, {int? selectedChainId}) {
if (isEVMCompatibleChain(type) && selectedChainId != null) {
switch (selectedChainId) {
case 1:
return 'assets/images/eth_chain_mono.svg';
case 137:
return 'assets/images/pol_chain_mono.svg';
case 8453:
return 'assets/images/base_chain_mono.svg';
case 42161:
return 'assets/images/arbitrum_chain_mono.svg';
default:
return 'assets/images/eth_chain_mono.svg';
}
}
String getChainMonoImage(WalletType type) {
switch (type) {
case WalletType.solana:
return 'assets/images/sol_chain_mono.svg';
case WalletType.ethereum:
return 'assets/images/eth_chain_mono.svg';
case WalletType.polygon:
return 'assets/images/pol_chain_mono.svg';
case WalletType.base:
return 'assets/images/base_chain_mono.svg';
case WalletType.arbitrum:
return 'assets/images/arbitrum_chain_mono.svg';
case WalletType.bsc:
return 'assets/images/bnb_chain_mono.svg';
case WalletType.solana:
return 'assets/images/sol_chain_mono.svg';
case WalletType.tron:
return 'assets/images/trx_chain_mono.svg';
case WalletType.zano:
+4 -6
View File
@@ -89,6 +89,7 @@ class TokenUtilities {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
final tokens = await loadAllUniqueEvmTokens();
for (final t in tokens) {
if (t.contractAddress.toLowerCase() == lower) return t;
@@ -127,6 +128,7 @@ class TokenUtilities {
WalletType.polygon => '${walletKey}_${Erc20Token.polygonBoxName}',
WalletType.base => '${walletKey}_${Erc20Token.baseBoxName}',
WalletType.arbitrum => '${walletKey}_${Erc20Token.arbitrumBoxName}',
WalletType.bsc => '${walletKey}_${Erc20Token.bscBoxName}',
_ => '${walletKey}_${Erc20Token.ethereumBoxName}',
};
}
@@ -185,7 +187,8 @@ class TokenUtilities {
// Only check EVM registry for currencies that might be EVM-related
final isPotentialEVM = isNativeToken(currency) ||
(tag != null && (tag == 'ETH' || tag == 'POL' || tag == 'BASE' || tag == 'ARB'));
(tag != null &&
(tag == 'ETH' || tag == 'POL' || tag == 'BASE' || tag == 'ARB' || tag == 'BSC'));
if (isPotentialEVM) {
// Try by tag first if available (e.g., 'POL', 'BASE', 'ARB')
@@ -200,11 +203,6 @@ class TokenUtilities {
}
// Fallback to hardcoded values for chains not in registry yet
// BSC (Binance Smart Chain)
if (title == 'bsc' || title == 'bnb' || tag == 'BSC') {
return 56;
}
// Avalanche C-Chain
if (title == 'avalanche' || title == 'avax' || tag == 'AVALANCHE') {
return 43114;
@@ -55,6 +55,7 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.tron:
case WalletType.zcash:
@@ -98,6 +99,7 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
WalletType.polygon,
WalletType.base,
WalletType.arbitrum,
WalletType.bsc,
WalletType.tron,
WalletType.solana,
WalletType.monero,
@@ -5,7 +5,6 @@ import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/entities/fiat_currency.dart';
import 'package:cake_wallet/entities/preferences_key.dart';
import 'package:cake_wallet/utils/qr_util.dart';
import 'package:cw_core/currency_for_wallet_type.dart';
import 'package:cw_core/receive_page_option.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cw_core/crypto_currency.dart';
@@ -177,7 +176,7 @@ abstract class AnonInvoicePageViewModelBase with Store {
String get currentWalletName => _wallet.name;
@computed
String get qrImage => getQrImage(_wallet.type, selectedChainId: _wallet.chainId);
String get qrImage => getQrImage(_wallet.type);
@action
void reset() {
@@ -177,6 +177,7 @@ abstract class BalanceViewModelBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.tron:
return S.current.xmr_full_balance;
@@ -947,6 +947,7 @@ abstract class DashboardViewModelBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.nano:
case WalletType.banano:
@@ -211,6 +211,7 @@ abstract class HomeSettingsViewModelBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
defaultTokenAddresses = evm!.getDefaultTokenContractAddresses(_balanceViewModel.wallet);
break;
case WalletType.solana:
@@ -174,6 +174,7 @@ class TransactionListItem extends ActionListItem with Keyable {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
final asset = evm!.assetOfTransaction(balanceViewModel.wallet, transaction);
final price = balanceViewModel.fiatConvertationStore.prices[asset];
amount = calculateFiatAmountRaw(
@@ -365,6 +365,9 @@ abstract class ExchangeTradeViewModelBase with Store {
bool _isSplToken() =>
wallet.currency == CryptoCurrency.sol && tradeFrom?.tag == CryptoCurrency.sol.title;
bool _isBscToken() =>
wallet.currency == CryptoCurrency.bnb && tradeFrom?.tag == CryptoCurrency.bnb.tag;
return tradeFrom == wallet.currency ||
tradesStore.trade!.provider == ExchangeProviderDescription.xmrto ||
_isEthToken() ||
@@ -372,7 +375,8 @@ abstract class ExchangeTradeViewModelBase with Store {
_isSplToken() ||
_isTronToken() ||
_isBaseToken() ||
_isArbitrumToken();
_isArbitrumToken() ||
_isBscToken();
}
Future<void> registerSwapsXyzTransaction() async {
@@ -452,6 +456,8 @@ abstract class ExchangeTradeViewModelBase with Store {
return BaseURI(amount: amount, address: inputAddress);
case WalletType.arbitrum:
return ArbitrumURI(amount: amount, address: inputAddress);
case WalletType.bsc:
return BSCURI(amount: amount, address: inputAddress);
case WalletType.solana:
return SolanaURI(amount: amount, address: inputAddress);
case WalletType.tron:
@@ -503,5 +509,5 @@ abstract class ExchangeTradeViewModelBase with Store {
}
@computed
String get qrImage => getQrImage(wallet.type, selectedChainId: wallet.chainId);
String get qrImage => getQrImage(wallet.type);
}
@@ -904,6 +904,10 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
depositCurrency = CryptoCurrency.arbEth;
receiveCurrency = CryptoCurrency.xmr;
break;
case WalletType.bsc:
depositCurrency = CryptoCurrency.bnb;
receiveCurrency = CryptoCurrency.xmr;
break;
case WalletType.solana:
depositCurrency = CryptoCurrency.sol;
receiveCurrency = CryptoCurrency.xmr;
@@ -82,6 +82,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.banano:
case WalletType.nano:
@@ -33,6 +33,7 @@ class WalletRestoreFromQRCode {
'polygon-wallet': WalletType.polygon,
'base-wallet': WalletType.base,
'arbitrum-wallet': WalletType.arbitrum,
'bsc-wallet': WalletType.bsc,
'nano-wallet': WalletType.nano,
'nano_wallet': WalletType.nano,
'bitcoincash': WalletType.bitcoinCash,
+2
View File
@@ -90,6 +90,7 @@ abstract class FeesViewModelBase extends WalletChangeListenerViewModel with Stor
case WalletType.ethereum:
case WalletType.polygon:
case WalletType.base:
case WalletType.bsc:
return transactionPriority == evm!.getEVMTransactionPrioritySlow();
case WalletType.bitcoinCash:
return transactionPriority == bitcoinCash!.getBitcoinCashTransactionPrioritySlow();
@@ -199,6 +200,7 @@ abstract class FeesViewModelBase extends WalletChangeListenerViewModel with Stor
case WalletType.ethereum:
case WalletType.polygon:
case WalletType.base:
case WalletType.bsc:
_settingsStore.setPriority(
wallet.type,
evm!.getDefaultTransactionPriority(),
+4 -1
View File
@@ -117,6 +117,7 @@ abstract class OutputBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
_amount = evm!.formatterEVMParseAmount(_cryptoAmount);
break;
case WalletType.wownero:
@@ -218,10 +219,12 @@ abstract class OutputBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
final isNative = cryptoCurrencyHandler() == CryptoCurrency.eth ||
cryptoCurrencyHandler() == CryptoCurrency.maticpoly ||
cryptoCurrencyHandler() == CryptoCurrency.baseEth ||
cryptoCurrencyHandler() == CryptoCurrency.arbEth;
cryptoCurrencyHandler() == CryptoCurrency.arbEth ||
cryptoCurrencyHandler() == CryptoCurrency.bnb;
String? fee = isNative
? evm!.getEVMNativeEstimatedFee(_wallet)
: evm!.getEVMERC20EstimatedFee(_wallet);
@@ -61,10 +61,7 @@ abstract class SendTemplateViewModelBase with Store {
_wallet.type != WalletType.haven &&
_wallet.type != WalletType.solana &&
_wallet.type != WalletType.tron &&
_wallet.chainId != 1 &&
_wallet.chainId != 137 &&
_wallet.chainId != 8453 &&
_wallet.chainId != 42161;
!isEVMCompatibleChain(_wallet.type);
@computed
CryptoCurrency get cryptoCurrency => _wallet.currency;
+11 -3
View File
@@ -243,6 +243,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.tron:
case WalletType.solana:
return wallet.currency;
@@ -1005,6 +1006,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return evm!.createEVMTransactionCredentials(
outputs,
priority: priority,
@@ -1166,6 +1168,12 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
}
if (errorMessage.contains('insufficient funds')) {
final feeCurrency = switch (walletType) {
WalletType.bsc => "BNB",
WalletType.polygon => "POL",
_ => "ETH",
};
final parsedErrorMessageResult =
EVMTransactionErrorFeesHandler.parseEthereumFeesErrorMessage(
errorMessage,
@@ -1184,9 +1192,9 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
// Handle successfully parsed errors with specific values
return '''${S.current.insufficient_funds_for_tx} \n\n'''
'''${S.current.balance}: ${parsedErrorMessageResult.balanceEth} ${walletType == WalletType.polygon ? "POL" : "ETH"} (${parsedErrorMessageResult.balanceUsd} ${fiatFromSettings.name})\n\n'''
'''${S.current.transaction_cost}: ${parsedErrorMessageResult.txCostEth} ${walletType == WalletType.polygon ? "POL" : "ETH"} (${parsedErrorMessageResult.txCostUsd} ${fiatFromSettings.name})\n\n'''
'''${S.current.overshot}: ${parsedErrorMessageResult.overshotEth} ${walletType == WalletType.polygon ? "POL" : "ETH"} (${parsedErrorMessageResult.overshotUsd} ${fiatFromSettings.name})''';
'''${S.current.balance}: ${parsedErrorMessageResult.balanceEth} ${feeCurrency} (${parsedErrorMessageResult.balanceUsd} ${fiatFromSettings.name})\n\n'''
'''${S.current.transaction_cost}: ${parsedErrorMessageResult.txCostEth} ${feeCurrency} (${parsedErrorMessageResult.txCostUsd} ${fiatFromSettings.name})\n\n'''
'''${S.current.overshot}: ${parsedErrorMessageResult.overshotEth} ${feeCurrency} (${parsedErrorMessageResult.overshotUsd} ${fiatFromSettings.name})''';
}
if (errorMessage.contains('max fee per gas less than block base fee')) {
@@ -81,6 +81,9 @@ abstract class PrivacySettingsViewModelBase with Store {
@computed
bool get useArbiScan => _settingsStore.useArbiScan;
@computed
bool get useBscScan => _settingsStore.useBscScan;
@computed
bool get useTronGrid => _settingsStore.useTronGrid;
@@ -127,6 +130,8 @@ abstract class PrivacySettingsViewModelBase with Store {
bool get canUseArbiScan => _wallet.chainId == 42161;
bool get canUseBscScan => _wallet.chainId == 56;
bool get canUseTronGrid => _wallet.type == WalletType.tron;
bool get canUseMempoolFeeAPI => _wallet.type == WalletType.bitcoin;
@@ -210,6 +215,12 @@ abstract class PrivacySettingsViewModelBase with Store {
evm!.updateScanProviderUsageState(_wallet, value);
}
@action
void setUseBscScan(bool value) {
_settingsStore.useBscScan = value;
evm!.updateScanProviderUsageState(_wallet, value);
}
@action
void setUseMempoolFeeAPI(bool value) => _settingsStore.useMempoolFeeAPI = value;
@@ -5,7 +5,6 @@ import 'package:cw_core/utils/print_verbose.dart';
import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/transaction_info.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:cake_wallet/reactions/wallet_connect.dart';
import 'package:cake_wallet/evm/evm.dart';
import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
@@ -72,6 +71,7 @@ abstract class TransactionDetailsViewModelBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
_addEVMListItems(tx, dateFormat);
break;
case WalletType.nano:
@@ -195,6 +195,8 @@ abstract class TransactionDetailsViewModelBase with Store {
return 'https://basescan.org/tx/${txId}';
case WalletType.arbitrum:
return 'https://arbiscan.io/tx/${txId}';
case WalletType.bsc:
return 'https://bscscan.com/tx/${txId}';
case WalletType.polygon:
return 'https://polygonscan.com/tx/${txId}';
case WalletType.nano:
@@ -246,6 +248,8 @@ abstract class TransactionDetailsViewModelBase with Store {
return S.current.view_transaction_on + 'nanexplorer.com';
case WalletType.polygon:
return S.current.view_transaction_on + 'polygonscan.com';
case WalletType.bsc:
return S.current.view_transaction_on + 'bscscan.com';
case WalletType.solana:
return S.current.view_transaction_on + 'solscan.io';
case WalletType.tron:
@@ -126,6 +126,8 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
return BaseURI(amount: amount, address: address.address);
case 42161:
return ArbitrumURI(amount: amount, address: address.address);
case 56:
return BSCURI(amount: amount, address: address.address);
default:
return EthereumURI(amount: amount, address: address.address);
}
@@ -166,6 +168,8 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
return BaseURI(amount: amount, address: address.address);
case WalletType.arbitrum:
return ArbitrumURI(amount: amount, address: address.address);
case WalletType.bsc:
return BSCURI(amount: amount, address: address.address);
case WalletType.zcash:
return ZcashURI(amount: amount, address: address.address);
case WalletType.none:
@@ -436,7 +440,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
switch (chainId) {
case 1:
return [
'assets/images/eth_icon.svg',
'assets/images/crypto/ethereum.webp',
'assets/images/usdc_icon.svg',
'assets/images/usdt_wallet_icon.svg',
'assets/images/deuro_icon.svg',
@@ -444,7 +448,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
];
case 137:
return [
'assets/images/pol_icon.svg',
'assets/images/crypto/polygon.webp',
'assets/images/eth_pol_icon.svg',
'assets/images/usdc_icon.svg',
'assets/images/usdt_wallet_icon.svg',
@@ -452,7 +456,7 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
];
case 8453:
return [
'assets/images/eth_icon.svg',
'assets/images/crypto/ethereum.webp',
'assets/images/usdc_icon.svg',
'assets/images/more_tokens.svg',
];
@@ -462,9 +466,16 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
'assets/images/usdc_icon.svg',
'assets/images/more_tokens.svg',
];
case 56:
return [
'assets/images/crypto/BNB.webp',
'assets/images/usdc_icon.svg',
'assets/images/usdt_wallet_icon.svg',
'assets/images/more_tokens.svg',
];
default:
return [
'assets/images/eth_icon.svg',
'assets/images/crypto/ethereum.webp',
'assets/images/usdc_icon.svg',
'assets/images/usdt_wallet_icon.svg',
];
@@ -497,10 +508,10 @@ abstract class WalletAddressListViewModelBase extends WalletChangeListenerViewMo
}
@computed
String get qrImage => getQrImage(type, selectedChainId: selectedChainId);
String get qrImage => getQrImage(type);
@computed
String get monoImage => getChainMonoImage(type, selectedChainId: selectedChainId);
String get monoImage => getChainMonoImage(type);
@computed
bool get isBalanceAvailable => isElectrumWallet;
@@ -143,6 +143,7 @@ abstract class WalletKeysViewModelBase with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.solana:
case WalletType.zcash:
case WalletType.tron:
@@ -274,6 +275,8 @@ abstract class WalletKeysViewModelBase with Store {
return 'base-wallet';
case WalletType.arbitrum:
return 'arbitrum-wallet';
case WalletType.bsc:
return 'bsc-wallet';
case WalletType.solana:
return 'solana-wallet';
case WalletType.tron:
+1
View File
@@ -82,6 +82,7 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return evm!.createEVMNewWalletCredentials(
name: name,
password: walletPassword,
+10 -10
View File
@@ -53,6 +53,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.decred:
case WalletType.bitcoin:
case WalletType.litecoin:
@@ -82,18 +83,15 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
late final bool hasSeedLanguageSelector =
[WalletType.monero, WalletType.haven, WalletType.wownero].contains(type);
late final bool hasBlockchainHeightSelector = [
WalletType.monero,
WalletType.haven,
WalletType.wownero,
WalletType.zcash
].contains(type);
late final bool hasBlockchainHeightSelector =
[WalletType.monero, WalletType.haven, WalletType.wownero, WalletType.zcash].contains(type);
late final bool hasRestoreFromPrivateKey = [
WalletType.ethereum,
WalletType.polygon,
WalletType.base,
WalletType.arbitrum,
WalletType.bsc,
WalletType.nano,
WalletType.banano,
WalletType.solana,
@@ -171,6 +169,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return evm!.createEVMRestoreWalletFromSeedCredentials(
name: name,
mnemonic: seed,
@@ -209,9 +208,9 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
);
case WalletType.decred:
return decred!.createDecredRestoreWalletFromSeedCredentials(
name: name,
mnemonic: seed,
password: password,
name: name,
mnemonic: seed,
password: password,
);
case WalletType.zcash:
return zcash!.createZcashRestoreWalletFromSeedCredentials(
@@ -274,6 +273,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
case WalletType.polygon:
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
return evm!.createEVMRestoreWalletFromPrivateKey(
name: name,
password: password,