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
@@ -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)
],
),
),