Add Robinhood Chain (#3398)

* fix android CI

* feat: Add Robinhood Chain, all major flows done. minor issue now is our providers don't support it yet as its still pretty early, two weeks from launch

* feat: Add Robinhood Chain, all major flows done. minor issue now is our providers don't support it yet as its still pretty early, two weeks from launch

* Cleanup

* auto-reformat

* fix ui issue and contact listing for tokens

* fix: missing icons and crash for fee priority in settings

* chore: cleanup

* fixes from feedbacks

* fix: review issues and sync to latest dev
feat: switch history api to etherscan, add history toggle to privacy settings, exclude robETH from exchange pickers, skip tokens discovery for chains that moralis hasn't indexed, add tests

* fix: address Robinhood review comments

* fix: show Solana token icons in history

* fix: address review comments and default Robinhood to PublicNode

* fix:  revert filter and refuse unmapped networks in provider

---------

Co-authored-by: Robert Malikowski <malikowskirobert@gmail.com>
This commit is contained in:
David Adegoke
2026-10-04 13:22:05 +02:00
committed by GitHub
co-authored by Robert Malikowski
parent 77e4b946eb
commit 046e57c598
143 changed files with 1214 additions and 159 deletions
@@ -388,9 +388,12 @@ class _ContactListBodyState extends State<ContactListBody> {
}
Widget generateContactRaw(BuildContext context, ContactRecord contact, bool isLast) {
final image = contact.type == CryptoCurrency.baseEth
? 'assets/new-ui/crypto_full_icons/base.svg'
: contact.type.iconPath;
const l2NativeChainIcons = {
CryptoCurrency.baseEth: "assets/new-ui/crypto_full_icons/base.svg",
CryptoCurrency.arbEth: "assets/new-ui/crypto_full_icons/arbitrum.svg",
CryptoCurrency.robEth: "assets/new-ui/crypto_full_icons/robinhood.svg",
};
final image = l2NativeChainIcons[contact.type] ?? contact.type.iconPath;
final currencyIcon = (image != null && image.isNotEmpty)
? CakeImageWidget(imageUrl: image, height: 24, width: 24)
: const SizedBox(height: 24, width: 24);
@@ -2,6 +2,7 @@ import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/widgets/setting_action_button.dart';
import 'package:cake_wallet/src/widgets/setting_actions.dart';
import 'package:flutter/material.dart';
import "package:flutter_svg/svg.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';
@@ -36,6 +37,7 @@ class MenuWidgetState extends State<MenuWidget> {
this.baseIcon = Image.asset('assets/new-ui/crypto_full_icons/base.svg'),
this.arbitrumIcon = Image.asset('assets/new-ui/crypto_full_icons/arbitrum.svg'),
this.bscIcon = Image.asset('assets/new-ui/crypto_full_icons/bnb.svg'),
this.robinhoodIcon = SvgPicture.asset("assets/new-ui/crypto_full_icons/robinhood.svg"),
this.solanaIcon = Image.asset('assets/new-ui/crypto_full_icons/solana.svg'),
this.tronIcon = Image.asset('assets/new-ui/crypto_full_icons/tron.svg'),
this.wowneroIcon = Image.asset('assets/new-ui/crypto_full_icons/wownero.svg'),
@@ -67,6 +69,7 @@ class MenuWidgetState extends State<MenuWidget> {
Image baseIcon;
Image arbitrumIcon;
Image bscIcon;
Widget robinhoodIcon;
Image solanaIcon;
Image tronIcon;
Image wowneroIcon;
@@ -261,6 +264,8 @@ class MenuWidgetState extends State<MenuWidget> {
return arbitrumIcon;
case WalletType.bsc:
return bscIcon;
case WalletType.robinhood:
return robinhoodIcon;
case WalletType.tron:
return tronIcon;
case WalletType.wownero:
@@ -93,6 +93,14 @@ class ConnectionSyncPage extends BasePage {
onChanged: (val) {
_connectionSyncViewModel.setUseBaseScan(val);
}),
if (_connectionSyncViewModel.canUseRobinhoodScan)
ListItemToggle(
keyValue: "can_use_robinhoodscan",
label: S.of(context).robinhoodscan_history,
value: _connectionSyncViewModel.useRobinhoodScan,
onChanged: (val) {
_connectionSyncViewModel.setUseRobinhoodScan(val);
}),
if (_connectionSyncViewModel.canUseArbiScan)
ListItemToggle(
keyValue: "can_use_arbiscan",
@@ -6,6 +6,7 @@ enum EVMChainId {
base,
arbitrum,
bsc,
robinhood,
}
extension EVMChainIdX on EVMChainId {
@@ -24,6 +25,7 @@ extension EVMChainIdX on EVMChainId {
EVMChainId.base => 8453,
EVMChainId.arbitrum => 42161,
EVMChainId.bsc => 56,
EVMChainId.robinhood => 4663,
};
}
@@ -18,6 +18,7 @@ class KeyServiceImpl implements WalletConnectKeyService {
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.robinhood:
return evm!.getPrivateKey(wallet);
case WalletType.solana:
return solana!.getPrivateKey(wallet);
@@ -33,6 +34,7 @@ class KeyServiceImpl implements WalletConnectKeyService {
case WalletType.base:
case WalletType.arbitrum:
case WalletType.bsc:
case WalletType.robinhood:
return evm!.getPublicKey(wallet);
case WalletType.solana:
return solana!.getPublicKey(wallet);
@@ -52,6 +54,7 @@ class KeyServiceImpl implements WalletConnectKeyService {
'eip155:137',
'eip155:8453',
'eip155:42161',
"eip155:4663",
],
privateKey: _getPrivateKeyForWallet(wallet),
publicKey: _getPublicKeyForWallet(wallet),