Skip to content

Commit

Permalink
FEVM support (uplift to 1.50.x) (#17639)
Browse files Browse the repository at this point in the history
Merge pull request #17563 from brave/brave_28954_1

FEVM support

Co-authored-by: Jocelyn Liu <yrliou@gmail.com>
  • Loading branch information
cypt4 and yrliou committed Mar 24, 2023
1 parent 45188c8 commit 5361ffd
Show file tree
Hide file tree
Showing 14 changed files with 153 additions and 19 deletions.
9 changes: 6 additions & 3 deletions browser/brave_wallet/brave_wallet_prefs_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,8 @@ TEST_F(BraveWalletPrefsUnitTest, MigrateShowTestNetworksToggle) {
// Test networks are hidden by default.
EXPECT_THAT(GetHiddenNetworks(GetPrefs(), mojom::CoinType::ETH),
ElementsAreArray({mojom::kGoerliChainId, mojom::kSepoliaChainId,
mojom::kLocalhostChainId}));
mojom::kLocalhostChainId,
mojom::kFilecoinEthereumTestnetChainId}));
EXPECT_THAT(GetHiddenNetworks(GetPrefs(), mojom::CoinType::FIL),
ElementsAreArray({mojom::kFilecoinTestnet,
mojom::kLocalhostChainId, "0x123"}));
Expand All @@ -240,7 +241,8 @@ TEST_F(BraveWalletPrefsUnitTest, MigrateShowTestNetworksToggle) {
// Still same when nothing to migrate.
EXPECT_THAT(GetHiddenNetworks(GetPrefs(), mojom::CoinType::ETH),
ElementsAreArray({mojom::kGoerliChainId, mojom::kSepoliaChainId,
mojom::kLocalhostChainId}));
mojom::kLocalhostChainId,
mojom::kFilecoinEthereumTestnetChainId}));
EXPECT_THAT(GetHiddenNetworks(GetPrefs(), mojom::CoinType::FIL),
ElementsAreArray({mojom::kFilecoinTestnet,
mojom::kLocalhostChainId, "0x123"}));
Expand All @@ -254,7 +256,8 @@ TEST_F(BraveWalletPrefsUnitTest, MigrateShowTestNetworksToggle) {
// Still same when test networks toggle was explicitly off.
EXPECT_THAT(GetHiddenNetworks(GetPrefs(), mojom::CoinType::ETH),
ElementsAreArray({mojom::kGoerliChainId, mojom::kSepoliaChainId,
mojom::kLocalhostChainId}));
mojom::kLocalhostChainId,
mojom::kFilecoinEthereumTestnetChainId}));
EXPECT_THAT(GetHiddenNetworks(GetPrefs(), mojom::CoinType::FIL),
ElementsAreArray({mojom::kFilecoinTestnet,
mojom::kLocalhostChainId, "0x123"}));
Expand Down
24 changes: 24 additions & 0 deletions browser/brave_wallet/brave_wallet_service_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1682,6 +1682,30 @@ TEST_F(BraveWalletServiceUnitTest, MigrateUserAssetsAddIsNFT) {
EXPECT_TRUE(GetPrefs()->GetBoolean(kBraveWalletUserAssetsAddIsNFTMigrated));
}

TEST_F(BraveWalletServiceUnitTest, MigradeDefaultHiddenNetworks) {
ASSERT_EQ(GetPrefs()->GetInteger(kBraveWalletDefaultHiddenNetworksVersion),
0);
BraveWalletService::MigrateHiddenNetworks(GetPrefs());
{
auto* list =
GetPrefs()->GetDict(kBraveWalletHiddenNetworks).FindList("ethereum");
ASSERT_NE(std::find_if(list->begin(), list->end(),
[](const auto& v) { return v == "0x4cb2f"; }),
list->end());
}
ASSERT_EQ(GetPrefs()->GetInteger(kBraveWalletDefaultHiddenNetworksVersion),
1);
RemoveHiddenNetwork(GetPrefs(), mojom::CoinType::ETH, "0x4cb2f");
BraveWalletService::MigrateHiddenNetworks(GetPrefs());
{
auto* list =
GetPrefs()->GetDict(kBraveWalletHiddenNetworks).FindList("ethereum");
ASSERT_EQ(std::find_if(list->begin(), list->end(),
[](const auto& v) { return v == "0x4cb2f"; }),
list->end());
}
}

TEST_F(BraveWalletServiceUnitTest, RecordWalletNoUse) {
EXPECT_EQ(GetLocalState()->GetTime(kBraveWalletP3ALastReportTime),
base::Time::Now());
Expand Down
7 changes: 7 additions & 0 deletions components/brave_wallet/browser/brave_wallet_prefs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ base::Value::Dict GetDefaultHiddenNetworks() {
eth_hidden.Append(mojom::kGoerliChainId);
eth_hidden.Append(mojom::kSepoliaChainId);
eth_hidden.Append(mojom::kLocalhostChainId);
eth_hidden.Append(mojom::kFilecoinEthereumTestnetChainId);
hidden_networks.Set(kEthereumPrefKey, std::move(eth_hidden));

base::Value::List fil_hidden;
Expand Down Expand Up @@ -170,6 +171,9 @@ void RegisterProfilePrefsForMigration(

// Added 12/2022
registry->RegisterBooleanPref(kShowWalletTestNetworksDeprecated, false);

// Added 03/2023
registry->RegisterIntegerPref(kBraveWalletDefaultHiddenNetworksVersion, 0);
}

void ClearJsonRpcServiceProfilePrefs(PrefService* prefs) {
Expand Down Expand Up @@ -215,6 +219,9 @@ void MigrateObsoleteProfilePrefs(PrefService* prefs) {
// Added 10/22 to have is_nft set for existing ERC721 tokens.
BraveWalletService::MigrateUserAssetsAddIsNFT(prefs);

// Added 03/23 to add filecoin evm support.
BraveWalletService::MigrateHiddenNetworks(prefs);

JsonRpcService::MigrateMultichainNetworks(prefs);

if (prefs->HasPrefPath(kBraveWalletWeb3ProviderDeprecated)) {
Expand Down
32 changes: 32 additions & 0 deletions components/brave_wallet/browser/brave_wallet_service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -825,6 +825,16 @@ void BraveWalletService::MigrateUserAssetsAddPreloadingNetworks(
}

prefs->SetBoolean(kBraveWalletUserAssetsAddPreloadingNetworksMigrated, true);
if (prefs->HasPrefPath(
kBraveWalletUserAssetsAddPreloadingNetworksMigratedDeprecated)) {
prefs->ClearPref(
kBraveWalletUserAssetsAddPreloadingNetworksMigratedDeprecated);
}
if (prefs->HasPrefPath(
kBraveWalletUserAssetsAddPreloadingNetworksMigratedDeprecated2)) {
prefs->ClearPref(
kBraveWalletUserAssetsAddPreloadingNetworksMigratedDeprecated2);
}
}

// static
Expand Down Expand Up @@ -864,6 +874,28 @@ void BraveWalletService::MigrateUserAssetsAddIsNFT(PrefService* prefs) {
prefs->SetBoolean(kBraveWalletUserAssetsAddIsNFTMigrated, true);
}

// static
void BraveWalletService::MigrateHiddenNetworks(PrefService* prefs) {
auto previous_version_code =
prefs->GetInteger(kBraveWalletDefaultHiddenNetworksVersion);
if (previous_version_code >= 1) {
return;
}
// Default hidden networks
ScopedDictPrefUpdate update(prefs, kBraveWalletHiddenNetworks);
auto& hidden_networks_pref = update.Get();
base::Value::List* hidden_eth_networks =
hidden_networks_pref.FindList(kEthereumPrefKey);
auto value = base::Value(mojom::kFilecoinEthereumTestnetChainId);
if (std::find_if(hidden_eth_networks->begin(), hidden_eth_networks->end(),
[&value](auto& v) { return value == v; }) ==
hidden_eth_networks->end()) {
hidden_eth_networks->Append(std::move(value));
}

prefs->SetInteger(kBraveWalletDefaultHiddenNetworksVersion, 1);
}

// static
base::Value::Dict BraveWalletService::GetDefaultEthereumAssets() {
base::Value::Dict user_assets;
Expand Down
1 change: 1 addition & 0 deletions components/brave_wallet/browser/brave_wallet_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ class BraveWalletService : public KeyedService,
static void MigrateUserAssetsAddPreloadingNetworks(
PrefService* profile_prefs);
static void MigrateUserAssetsAddIsNFT(PrefService* profile_prefs);
static void MigrateHiddenNetworks(PrefService* profile_prefs);

static bool AddUserAsset(mojom::BlockchainTokenPtr token,
PrefService* profile_prefs);
Expand Down
34 changes: 34 additions & 0 deletions components/brave_wallet/browser/brave_wallet_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,38 @@ const mojom::NetworkInfo* GetEthLocalhost() {
return network_info.get();
}

const mojom::NetworkInfo* GetFilecoinEthereumMainnet() {
static base::NoDestructor<mojom::NetworkInfo> network_info(
{brave_wallet::mojom::kFilecoinEthereumMainnetChainId,
"Filecoin EVM Mainnet",
{"https://filfox.info/en/message"},
{},
0,
{GURL("https://api.node.glif.io/rpc/v1")},
"FIL",
"Filecoin",
18,
brave_wallet::mojom::CoinType::ETH,
true});
return network_info.get();
}

const mojom::NetworkInfo* GetFilecoinEthereumTestnet() {
static base::NoDestructor<mojom::NetworkInfo> network_info(
{brave_wallet::mojom::kFilecoinEthereumTestnetChainId,
"Filecoin EVM Testnet",
{"https://calibration.filfox.info/en/message"},
{},
0,
{GURL("https://api.calibration.node.glif.io/rpc/v1")},
"FIL",
"Filecoin",
18,
brave_wallet::mojom::CoinType::ETH,
true});
return network_info.get();
}

// Precompiled networks available in native wallet.
const std::vector<const mojom::NetworkInfo*>& GetKnownEthNetworks() {
static base::NoDestructor<std::vector<const mojom::NetworkInfo*>> networks({
Expand All @@ -272,6 +304,8 @@ const std::vector<const mojom::NetworkInfo*>& GetKnownEthNetworks() {
GetGoerliTestNetwork(),
GetSepoliaTestNetwork(),
GetEthLocalhost(),
GetFilecoinEthereumMainnet(),
GetFilecoinEthereumTestnet()
// clang-format on
});
return *networks.get();
Expand Down
14 changes: 8 additions & 6 deletions components/brave_wallet/browser/brave_wallet_utils_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,7 @@ TEST(BraveWalletUtilsUnitTest, KnownChainExists) {
UpdateCustomNetworks(&prefs, std::move(values), mojom::CoinType::ETH);

auto known_chains = GetAllKnownChains(&prefs, mojom::CoinType::ETH);
EXPECT_EQ(known_chains.size(), 11u);
EXPECT_EQ(known_chains.size(), 13u);
for (auto& known_chain : known_chains) {
EXPECT_TRUE(KnownChainExists(known_chain->chain_id, mojom::CoinType::ETH));
// Test that uppercase chain ID works too
Expand Down Expand Up @@ -842,7 +842,8 @@ TEST(BraveWalletUtilsUnitTest, GetAllKnownEthNetworkIds) {
mojom::kBinanceSmartChainMainnetChainId, mojom::kCeloMainnetChainId,
mojom::kAvalancheMainnetChainId, mojom::kFantomMainnetChainId,
mojom::kOptimismMainnetChainId, "goerli", "sepolia",
"http://localhost:7545/"});
"http://localhost:7545/", mojom::kFilecoinEthereumMainnetChainId,
mojom::kFilecoinEthereumTestnetChainId});
ASSERT_EQ(GetAllKnownNetworksForTesting().size(),
expected_network_ids.size());
EXPECT_EQ(GetAllKnownEthNetworkIds(), expected_network_ids);
Expand Down Expand Up @@ -1058,10 +1059,11 @@ TEST(BraveWalletUtilsUnitTest, HiddenNetworks) {
sync_preferences::TestingPrefServiceSyncable prefs;
RegisterProfilePrefs(prefs.registry());

EXPECT_THAT(GetHiddenNetworks(&prefs, mojom::CoinType::ETH),
ElementsAreArray<std::string>({mojom::kGoerliChainId,
mojom::kSepoliaChainId,
mojom::kLocalhostChainId}));
EXPECT_THAT(
GetHiddenNetworks(&prefs, mojom::CoinType::ETH),
ElementsAreArray<std::string>(
{mojom::kGoerliChainId, mojom::kSepoliaChainId,
mojom::kLocalhostChainId, mojom::kFilecoinEthereumTestnetChainId}));
EXPECT_THAT(GetHiddenNetworks(&prefs, mojom::CoinType::FIL),
ElementsAreArray<std::string>(
{mojom::kFilecoinTestnet, mojom::kLocalhostChainId}));
Expand Down
1 change: 1 addition & 0 deletions components/brave_wallet/browser/json_rpc_service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@ void JsonRpcService::MigrateShowTestNetworksToggle(PrefService* prefs) {
eth_list->EraseValue(base::Value(mojom::kGoerliChainId));
eth_list->EraseValue(base::Value(mojom::kSepoliaChainId));
eth_list->EraseValue(base::Value(mojom::kLocalhostChainId));
eth_list->EraseValue(base::Value(mojom::kFilecoinEthereumTestnetChainId));

auto* fil_list = dict.EnsureList(kFilecoinPrefKey);
fil_list->EraseValue(base::Value(mojom::kFilecoinTestnet));
Expand Down
27 changes: 19 additions & 8 deletions components/brave_wallet/browser/json_rpc_service_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1697,7 +1697,7 @@ TEST_F(JsonRpcServiceUnitTest, GetKnownNetworks) {
EXPECT_CALL(callback,
Run(ElementsAreArray({"0x1", "0x4e454152", "0x89", "0x38",
"0xa4ec", "0xa86a", "0xfa", "0xa", "0x5",
"0xaa36a7", "0x539"})));
"0xaa36a7", "0x539", "0x13a", "0x4cb2f"})));
json_rpc_service_->GetKnownNetworks(mojom::CoinType::ETH, callback.Get());
testing::Mock::VerifyAndClearExpectations(&callback);
}
Expand All @@ -1709,39 +1709,50 @@ TEST_F(JsonRpcServiceUnitTest, GetHiddenNetworks) {
// kLocalhostChainId is active so not listed as hidden.
EXPECT_CALL(
callback,
Run(ElementsAreArray({mojom::kGoerliChainId, mojom::kSepoliaChainId})));
Run(ElementsAreArray({mojom::kGoerliChainId, mojom::kSepoliaChainId,
mojom::kFilecoinEthereumTestnetChainId})));
json_rpc_service_->GetHiddenNetworks(mojom::CoinType::ETH, callback.Get());
testing::Mock::VerifyAndClearExpectations(&callback);

// Remove network hidden by default.
RemoveHiddenNetwork(prefs(), mojom::CoinType::ETH, mojom::kGoerliChainId);
EXPECT_CALL(callback, Run(ElementsAreArray({mojom::kSepoliaChainId})));
EXPECT_CALL(callback,
Run(ElementsAreArray({mojom::kSepoliaChainId,
mojom::kFilecoinEthereumTestnetChainId})));
json_rpc_service_->GetHiddenNetworks(mojom::CoinType::ETH, callback.Get());
testing::Mock::VerifyAndClearExpectations(&callback);

// Making custom network hidden.
AddHiddenNetwork(prefs(), mojom::CoinType::ETH, "0x123");
EXPECT_CALL(callback,
Run(ElementsAreArray({mojom::kSepoliaChainId, "0x123"})));
EXPECT_CALL(
callback,
Run(ElementsAreArray({mojom::kSepoliaChainId,
mojom::kFilecoinEthereumTestnetChainId, "0x123"})));
json_rpc_service_->GetHiddenNetworks(mojom::CoinType::ETH, callback.Get());
testing::Mock::VerifyAndClearExpectations(&callback);

// Making custom network visible.
RemoveHiddenNetwork(prefs(), mojom::CoinType::ETH, "0x123");
EXPECT_CALL(callback, Run(ElementsAreArray({mojom::kSepoliaChainId})));
EXPECT_CALL(callback,
Run(ElementsAreArray({mojom::kSepoliaChainId,
mojom::kFilecoinEthereumTestnetChainId})));
json_rpc_service_->GetHiddenNetworks(mojom::CoinType::ETH, callback.Get());
testing::Mock::VerifyAndClearExpectations(&callback);

// Change active network so kLocalhostChainId becomes hidden.
SetNetwork(mojom::kMainnetChainId, mojom::CoinType::ETH);
EXPECT_CALL(callback, Run(ElementsAreArray({mojom::kSepoliaChainId,
mojom::kLocalhostChainId})));
EXPECT_CALL(
callback,
Run(ElementsAreArray({mojom::kSepoliaChainId, mojom::kLocalhostChainId,
mojom::kFilecoinEthereumTestnetChainId})));
json_rpc_service_->GetHiddenNetworks(mojom::CoinType::ETH, callback.Get());
testing::Mock::VerifyAndClearExpectations(&callback);

// Remove all hidden networks.
RemoveHiddenNetwork(prefs(), mojom::CoinType::ETH, mojom::kSepoliaChainId);
RemoveHiddenNetwork(prefs(), mojom::CoinType::ETH, mojom::kLocalhostChainId);
RemoveHiddenNetwork(prefs(), mojom::CoinType::ETH,
mojom::kFilecoinEthereumTestnetChainId);
EXPECT_CALL(callback, Run(ElementsAreArray<std::string>({})));
json_rpc_service_->GetHiddenNetworks(mojom::CoinType::ETH, callback.Get());
testing::Mock::VerifyAndClearExpectations(&callback);
Expand Down
6 changes: 5 additions & 1 deletion components/brave_wallet/browser/pref_names.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,11 @@ const char kBraveWalletUserAssets[] = "brave.wallet.wallet_user_assets";
const char kBraveWalletUserAssetEthContractAddressMigrated[] =
"brave.wallet.user.asset.eth_contract_address_migrated";
const char kBraveWalletUserAssetsAddPreloadingNetworksMigrated[] =
"brave.wallet.user.assets.add_preloading_networks_migrated_2";
"brave.wallet.user.assets.add_preloading_networks_migrated_3";
const char kBraveWalletUserAssetsAddIsNFTMigrated[] =
"brave.wallet.user.assets.add_is_nft_migrated";
const char kBraveWalletDefaultHiddenNetworksVersion[] =
"brave.wallet.user.assets.default_hidden_networks_version";
const char kBraveWalletDeprecateEthereumTestNetworksMigrated[] =
"brave.wallet.deprecated_ethereum_test_networks_migrated";
const char kBraveWalletAutoLockMinutes[] = "brave.wallet.auto_lock_minutes";
Expand Down Expand Up @@ -72,5 +74,7 @@ const char kBraveWalletCurrentChainId[] =
const char kBraveWalletUserAssetsDeprecated[] = "brave.wallet.user_assets";
const char kBraveWalletUserAssetsAddPreloadingNetworksMigratedDeprecated[] =
"brave.wallet.user.assets.add_preloading_networks_migrated";
const char kBraveWalletUserAssetsAddPreloadingNetworksMigratedDeprecated2[] =
"brave.wallet.user.assets.add_preloading_networks_migrated_2";
const char kPinnedNFTAssets[] = "brave.wallet.user_pin_data";
const char kAutoPinEnabled[] = "brave.wallet.auto_pin_enabled";
4 changes: 4 additions & 0 deletions components/brave_wallet/browser/pref_names.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ extern const char kBraveWalletUserAssetEthContractAddressMigrated[];
extern const char kBraveWalletUserAssetsAddPreloadingNetworksMigrated[];
// Added 10/2022 to set is_nft = true for existing ERC721 tokens.
extern const char kBraveWalletUserAssetsAddIsNFTMigrated[];
// Added 03/2023 to add networks hidden by default
extern const char kBraveWalletDefaultHiddenNetworksVersion[];
// Added 10/2022 to replace ETH selected network with mainnet if selected
// network is one of the Ethereum testnets deprecated on 10/5/2022.
extern const char kBraveWalletDeprecateEthereumTestNetworksMigrated[];
Expand Down Expand Up @@ -59,6 +61,8 @@ extern const char kBraveWalletCurrentChainId[];
extern const char kBraveWalletUserAssetsDeprecated[];
extern const char
kBraveWalletUserAssetsAddPreloadingNetworksMigratedDeprecated[];
extern const char
kBraveWalletUserAssetsAddPreloadingNetworksMigratedDeprecated2[];
extern const char kPinnedNFTAssets[];
extern const char kAutoPinEnabled[];

Expand Down
2 changes: 2 additions & 0 deletions components/brave_wallet/common/brave_wallet.mojom
Original file line number Diff line number Diff line change
Expand Up @@ -936,6 +936,8 @@ const string kCeloMainnetChainId = "0xa4ec";
const string kOptimismMainnetChainId = "0xa";
const string kAuroraMainnetChainId = "0x4e454152";
const string kArbitrumMainnetChainId = "0xa4b1";
const string kFilecoinEthereumMainnetChainId = "0x13a"; // Filecoin eth mainnet
const string kFilecoinEthereumTestnetChainId = "0x4cb2f"; // Filecoin eth calibration
const string kSolanaMainnet = "0x65";
const string kSolanaTestnet = "0x66";
const string kSolanaDevnet = "0x67";
Expand Down
3 changes: 2 additions & 1 deletion components/brave_wallet_ui/constants/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -884,7 +884,8 @@ export const SupportedTestNetworks = [
BraveWallet.LOCALHOST_CHAIN_ID,
BraveWallet.SOLANA_DEVNET,
BraveWallet.SOLANA_TESTNET,
BraveWallet.FILECOIN_TESTNET
BraveWallet.FILECOIN_TESTNET,
BraveWallet.FILECOIN_ETHEREUM_TESTNET_CHAIN_ID
]

export enum CoinTypesMap {
Expand Down
8 changes: 8 additions & 0 deletions components/brave_wallet_ui/utils/block-explorer-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ export const buildExplorerUrl = (
network.chainId === BraveWallet.FILECOIN_TESTNET ||
network.chainId === BraveWallet.FILECOIN_MAINNET

const isFileCoinEvmNet =
network.chainId === BraveWallet.FILECOIN_ETHEREUM_MAINNET_CHAIN_ID ||
network.chainId === BraveWallet.FILECOIN_ETHEREUM_TESTNET_CHAIN_ID

const isSolanaMainNet = network.chainId === BraveWallet.SOLANA_MAINNET

const isSolanaDevOrTestNet =
Expand All @@ -44,6 +48,10 @@ export const buildExplorerUrl = (
return `${explorerURL}?cid=${value}`
}

if (isFileCoinEvmNet) {
return `${explorerURL}/${value}`
}

if (isSolanaMainNet && type === 'token') {
return `${explorerURL}/address/${value}`
}
Expand Down

0 comments on commit 5361ffd

Please sign in to comment.