Skip to content

Commit

Permalink
Create default solana acc when create\restore the wallet
Browse files Browse the repository at this point in the history
Resolves brave/brave-browser#25432

Review fix
  • Loading branch information
cypt4 committed Sep 19, 2022
1 parent 826bdff commit 46f709f
Show file tree
Hide file tree
Showing 10 changed files with 165 additions and 17 deletions.
12 changes: 12 additions & 0 deletions browser/brave_wallet/brave_wallet_p3a_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
#include "brave/browser/brave_wallet/brave_wallet_service_factory.h"
#include "brave/browser/brave_wallet/keyring_service_factory.h"
#include "brave/components/brave_wallet/browser/brave_wallet_service.h"
#include "brave/components/brave_wallet/browser/brave_wallet_utils.h"
#include "brave/components/brave_wallet/browser/keyring_service.h"
#include "brave/components/brave_wallet/common/brave_wallet.mojom.h"
#include "brave/components/brave_wallet/common/features.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gtest/include/gtest/gtest.h"
Expand Down Expand Up @@ -105,6 +107,16 @@ TEST_F(BraveWalletP3AUnitTest, DefaultSolanaWalletSetting) {
}

TEST_F(BraveWalletP3AUnitTest, KeyringCreated) {
base::test::ScopedFeatureList feature_list;
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams> enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);

feature_list.InitWithFeaturesAndParameters(enabled_features, {});

histogram_tester_->ExpectBucketCount("Brave.Wallet.KeyringCreated", 0, 1);
keyring_service_->CreateWallet("testing123", base::DoNothing());
WaitForResponse();
Expand Down
103 changes: 93 additions & 10 deletions browser/brave_wallet/keyring_service_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1260,6 +1260,7 @@ TEST_F(KeyringServiceUnitTest, LockAndUnlock) {
{brave_wallet::features::kBraveWalletFilecoinFeature,
brave_wallet::features::kBraveWalletSolanaFeature},
{});

{
KeyringService service(json_rpc_service(), GetPrefs());
// No encryptor
Expand Down Expand Up @@ -1445,6 +1446,16 @@ TEST_F(KeyringServiceUnitTest, AccountMetasForKeyring) {
}

TEST_F(KeyringServiceUnitTest, CreateAndRestoreWallet) {
base::test::ScopedFeatureList feature_list;
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams> enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);

feature_list.InitWithFeaturesAndParameters(enabled_features, {});

KeyringService service(json_rpc_service(), GetPrefs());

TestKeyringServiceObserver observer;
Expand Down Expand Up @@ -1538,6 +1549,28 @@ TEST_F(KeyringServiceUnitTest, CreateAndRestoreWallet) {
EXPECT_FALSE(observer.IsKeyringRestored(mojom::kSolanaKeyringId));
}

TEST_F(KeyringServiceUnitTest, DefaultSolanaAccountCreated) {
KeyringService service(json_rpc_service(), GetPrefs());
ASSERT_NE(CreateWallet(&service, "brave"), absl::nullopt);

std::vector<mojom::AccountInfoPtr> account_infos =
service.GetAccountInfosForKeyring(mojom::kSolanaKeyringId);
EXPECT_EQ(account_infos.size(), 1u);
EXPECT_FALSE(account_infos[0]->address.empty());
EXPECT_EQ(account_infos[0]->name, "Solana Account 1");
}

TEST_F(KeyringServiceUnitTest, DefaultSolanaAccountRestored) {
KeyringService service(json_rpc_service(), GetPrefs());
ASSERT_TRUE(RestoreWallet(&service, kMnemonic1, "brave", false));

std::vector<mojom::AccountInfoPtr> account_infos =
service.GetAccountInfosForKeyring(mojom::kSolanaKeyringId);
EXPECT_EQ(account_infos.size(), 1u);
EXPECT_FALSE(account_infos[0]->address.empty());
EXPECT_EQ(account_infos[0]->name, "Solana Account 1");
}

TEST_F(KeyringServiceUnitTest, AddAccount) {
KeyringService service(json_rpc_service(), GetPrefs());
ASSERT_NE(CreateWallet(&service, "brave"), absl::nullopt);
Expand Down Expand Up @@ -1825,8 +1858,15 @@ TEST_F(KeyringServiceUnitTest, ImportedAccountFromJson) {

TEST_F(KeyringServiceUnitTest, GetPrivateKeyForKeyringAccount) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(
brave_wallet::features::kBraveWalletSolanaFeature);
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams> enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);

feature_list.InitWithFeaturesAndParameters(enabled_features, {});

KeyringService service(json_rpc_service(), GetPrefs());
ASSERT_TRUE(RestoreWallet(&service, kMnemonic1, "brave", false));

Expand Down Expand Up @@ -2398,6 +2438,16 @@ TEST_F(KeyringServiceUnitTest, NotifyUserInteraction) {
}

TEST_F(KeyringServiceUnitTest, SelectAddedAccount) {
base::test::ScopedFeatureList feature_list;
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams> enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);

feature_list.InitWithFeaturesAndParameters(enabled_features, {});

KeyringService service(json_rpc_service(), GetPrefs());
ASSERT_TRUE(CreateWallet(&service, "brave"));

Expand Down Expand Up @@ -3358,6 +3408,16 @@ TEST_F(KeyringServiceUnitTest, ImportFilecoinAccounts) {
}

TEST_F(KeyringServiceUnitTest, PreCreateEncryptors) {
base::test::ScopedFeatureList feature_list;
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams> enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);

feature_list.InitWithFeaturesAndParameters(enabled_features, {});

{
// Create default wallet with disabled filecoin feature.
// Solana feature is enabled on desktop and disabled on Android.
Expand Down Expand Up @@ -3429,10 +3489,19 @@ TEST_F(KeyringServiceUnitTest, PreCreateEncryptors) {
#endif

base::test::ScopedFeatureList feature_list;
feature_list.InitWithFeatures(
{brave_wallet::features::kBraveWalletFilecoinFeature,
brave_wallet::features::kBraveWalletSolanaFeature},
{});
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams>
enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletFilecoinFeature,
base::FieldTrialParams());

feature_list.InitWithFeaturesAndParameters(enabled_features, {});

service.Reset();
ASSERT_TRUE(
RestoreWallet(&service, *mnemonic_to_be_restored, "brave", false));
Expand All @@ -3453,8 +3522,15 @@ TEST_F(KeyringServiceUnitTest, PreCreateEncryptors) {

TEST_F(KeyringServiceUnitTest, SolanaKeyring) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(
brave_wallet::features::kBraveWalletSolanaFeature);
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams> enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);

feature_list.InitWithFeaturesAndParameters(enabled_features, {});

{
KeyringService service(json_rpc_service(), GetPrefs());
TestKeyringServiceObserver observer;
Expand Down Expand Up @@ -3622,8 +3698,15 @@ TEST_F(KeyringServiceUnitTest, SolanaKeyring) {

TEST_F(KeyringServiceUnitTest, SignMessage) {
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(
brave_wallet::features::kBraveWalletSolanaFeature);
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams> enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);

feature_list.InitWithFeaturesAndParameters(enabled_features, {});

KeyringService service(json_rpc_service(), GetPrefs());
ASSERT_TRUE(RestoreWallet(&service, kMnemonic1, "brave", false));
base::RunLoop().RunUntilIdle();
Expand Down
15 changes: 11 additions & 4 deletions browser/brave_wallet/solana_provider_browsertest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -215,10 +215,17 @@ class SolanaProviderTest : public InProcessBrowserTest {
SolanaProviderTest()
: https_server_for_files_(net::EmbeddedTestServer::TYPE_HTTPS),
https_server_for_rpc_(net::EmbeddedTestServer::TYPE_HTTPS) {
feature_list_.InitWithFeatures(
{brave_wallet::features::kBraveWalletSolanaFeature,
brave_wallet::features::kBraveWalletSolanaProviderFeature},
{});
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";

std::vector<base::test::ScopedFeatureList::FeatureAndParams>
enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaProviderFeature,
base::FieldTrialParams());
feature_list_.InitWithFeaturesAndParameters(enabled_features, {});
}

~SolanaProviderTest() override = default;
Expand Down
6 changes: 6 additions & 0 deletions components/brave_wallet/browser/brave_wallet_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "base/environment.h"
#include "base/feature_list.h"
#include "base/logging.h"
#include "base/metrics/field_trial_params.h"
#include "base/no_destructor.h"
#include "base/notreached.h"
#include "base/strings/strcat.h"
Expand Down Expand Up @@ -699,6 +700,11 @@ bool IsSolanaEnabled() {
brave_wallet::features::kBraveWalletSolanaFeature);
}

bool ShouldCreateDefaultSolanaAccount() {
return IsSolanaEnabled() &&
brave_wallet::features::kCreateDefaultSolanaAccount.Get();
}

std::vector<brave_wallet::mojom::NetworkInfoPtr>
GetAllKnownNetworksForTesting() {
std::vector<brave_wallet::mojom::NetworkInfoPtr> result;
Expand Down
1 change: 1 addition & 0 deletions components/brave_wallet/browser/brave_wallet_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace brave_wallet {
bool IsNativeWalletEnabled();
bool IsFilecoinEnabled();
bool IsSolanaEnabled();
bool ShouldCreateDefaultSolanaAccount();
bool IsDappsSupportEnabled();

// Generate mnemonic from random entropy following BIP39.
Expand Down
13 changes: 13 additions & 0 deletions components/brave_wallet/browser/eth_tx_manager_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
#include "base/callback_helpers.h"
#include "base/json/json_reader.h"
#include "base/test/bind.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "brave/components/brave_wallet/browser/brave_wallet_constants.h"
#include "brave/components/brave_wallet/browser/brave_wallet_prefs.h"
#include "brave/components/brave_wallet/browser/brave_wallet_utils.h"
#include "brave/components/brave_wallet/browser/eip1559_transaction.h"
#include "brave/components/brave_wallet/browser/eth_data_parser.h"
#include "brave/components/brave_wallet/browser/eth_nonce_tracker.h"
Expand All @@ -29,6 +31,7 @@
#include "brave/components/brave_wallet/browser/pref_names.h"
#include "brave/components/brave_wallet/browser/tx_service.h"
#include "brave/components/brave_wallet/common/brave_wallet.mojom.h"
#include "brave/components/brave_wallet/common/features.h"
#include "brave/components/brave_wallet/common/hex_utils.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
Expand Down Expand Up @@ -176,6 +179,15 @@ class EthTxManagerUnitTest : public testing::Test {
&url_loader_factory_)) {}

void SetUp() override {
base::FieldTrialParams parameters;
parameters[features::kCreateDefaultSolanaAccount.name] = "false";
std::vector<base::test::ScopedFeatureList::FeatureAndParams>
enabled_features;
enabled_features.emplace_back(
brave_wallet::features::kBraveWalletSolanaFeature, parameters);

feature_list_.InitWithFeaturesAndParameters(enabled_features, {});

url_loader_factory_.SetInterceptor(base::BindLambdaForTesting(
[&](const network::ResourceRequest& request) {
url_loader_factory_.ClearResponses();
Expand Down Expand Up @@ -449,6 +461,7 @@ class EthTxManagerUnitTest : public testing::Test {
}

protected:
base::test::ScopedFeatureList feature_list_;
base::test::TaskEnvironment task_environment_;
sync_preferences::TestingPrefServiceSyncable prefs_;
network::TestURLLoaderFactory url_loader_factory_;
Expand Down
20 changes: 20 additions & 0 deletions components/brave_wallet/browser/keyring_service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -688,6 +688,23 @@ void KeyringService::GetMnemonicForDefaultKeyring(
std::move(callback).Run(GetMnemonicForKeyringImpl(mojom::kDefaultKeyringId));
}

void KeyringService::MaybeCreateDefaultSolanaAccount() {
if (ShouldCreateDefaultSolanaAccount() &&
LazilyCreateKeyring(mojom::kSolanaKeyringId)) {
auto address = AddAccountForKeyring(mojom::kSolanaKeyringId,
"Solana " + GetAccountName(1));
if (address) {
SetPrefForKeyring(prefs_, kSelectedAccount, base::Value(*address),
mojom::kSolanaKeyringId);
SetSelectedCoin(prefs_, mojom::CoinType::SOL);
// This is needed for Android to select default coin, because they listen
// to network change events.
json_rpc_service_->SetNetwork(brave_wallet::mojom::kSolanaMainnet,
mojom::CoinType::SOL, false);
}
}
}

void KeyringService::CreateWallet(const std::string& password,
CreateWalletCallback callback) {
prefs_->SetBoolean(kBraveWalletKeyringEncryptionKeysMigrated, true);
Expand Down Expand Up @@ -717,6 +734,7 @@ void KeyringService::CreateWallet(const std::string& password,
if (!CreateEncryptorForKeyring(password, mojom::kSolanaKeyringId)) {
VLOG(1) << "Unable to create solana encryptor";
}
MaybeCreateDefaultSolanaAccount();
}

std::move(callback).Run(GetMnemonicForKeyringImpl(mojom::kDefaultKeyringId));
Expand Down Expand Up @@ -775,6 +793,8 @@ void KeyringService::RestoreWallet(const std::string& mnemonic,
SetPrefForKeyring(prefs_, kSelectedAccount, base::Value(*address),
mojom::kSolanaKeyringId);
}
} else {
MaybeCreateDefaultSolanaAccount();
}
}

Expand Down
4 changes: 4 additions & 0 deletions components/brave_wallet/browser/keyring_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ class KeyringService : public KeyedService, public mojom::KeyringService {
// Must unlock before using this API otherwise it will return empty string
void GetMnemonicForDefaultKeyring(
GetMnemonicForDefaultKeyringCallback callback) override;
void MaybeCreateDefaultSolanaAccount();
void CreateWallet(const std::string& password,
CreateWalletCallback callback) override;
void RestoreWallet(const std::string& mnemonic,
Expand Down Expand Up @@ -288,6 +289,9 @@ class KeyringService : public KeyedService, public mojom::KeyringService {
FRIEND_TEST_ALL_PREFIXES(KeyringServiceUnitTest, ImportFilecoinAccounts);
FRIEND_TEST_ALL_PREFIXES(KeyringServiceUnitTest, PreCreateEncryptors);
FRIEND_TEST_ALL_PREFIXES(KeyringServiceUnitTest, HardwareAccounts);
FRIEND_TEST_ALL_PREFIXES(KeyringServiceUnitTest, DefaultSolanaAccountCreated);
FRIEND_TEST_ALL_PREFIXES(KeyringServiceUnitTest,
DefaultSolanaAccountRestored);

FRIEND_TEST_ALL_PREFIXES(KeyringServiceAccountDiscoveryUnitTest,
AccountDiscovery);
Expand Down
2 changes: 2 additions & 0 deletions components/brave_wallet/common/features.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ const base::Feature kBraveWalletFilecoinFeature{

const base::Feature kBraveWalletSolanaFeature{"BraveWalletSolana",
base::FEATURE_ENABLED_BY_DEFAULT};
const base::FeatureParam<bool> kCreateDefaultSolanaAccount{
&kBraveWalletSolanaFeature, "create_default_solana_account", true};

const base::Feature kBraveWalletSolanaProviderFeature{
#if BUILDFLAG(IS_ANDROID)
Expand Down
6 changes: 3 additions & 3 deletions components/brave_wallet/common/features.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@
#ifndef BRAVE_COMPONENTS_BRAVE_WALLET_COMMON_FEATURES_H_
#define BRAVE_COMPONENTS_BRAVE_WALLET_COMMON_FEATURES_H_

namespace base {
struct Feature;
} // namespace base
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"

namespace brave_wallet {
namespace features {

extern const base::Feature kNativeBraveWalletFeature;
extern const base::Feature kBraveWalletFilecoinFeature;
extern const base::Feature kBraveWalletSolanaFeature;
extern const base::FeatureParam<bool> kCreateDefaultSolanaAccount;
extern const base::Feature kBraveWalletSolanaProviderFeature;
extern const base::Feature kBraveWalletDappsSupportFeature;

Expand Down

0 comments on commit 46f709f

Please sign in to comment.