mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-28 06:28:41 +01:00
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:
@@ -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:
|
||||
|
||||
@@ -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});
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -313,7 +313,7 @@ Future<void> initializeAppConfigs({bool loadWallet = true}) async {
|
||||
payjoinSessionSource: payjoinSessionSource,
|
||||
anonpayInvoiceInfo: anonpayInvoiceInfo,
|
||||
havenSeedStore: havenSeedStore,
|
||||
initialMigrationVersion: 56,
|
||||
initialMigrationVersion: 57,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user