Ejemplo n.º 1
0
        private void ValidateWalletName(IValidationErrors errors, WalletManager walletManager, string walletName)
        {
            string walletFilePath = Path.Combine(walletManager.WalletDirectories.WalletsDir, $"{walletName}.json");

            if (string.IsNullOrEmpty(walletName))
            {
                return;
            }

            if (walletName.IsTrimmable())
            {
                errors.Add(ErrorSeverity.Error, "Leading and trailing white spaces are not allowed!");
                return;
            }

            if (File.Exists(walletFilePath))
            {
                errors.Add(ErrorSeverity.Error,
                           $"A wallet named {walletName} already exists. Please try a different name.");
                return;
            }

            if (!WalletGenerator.ValidateWalletName(walletName))
            {
                errors.Add(ErrorSeverity.Error, "Selected Wallet is not valid. Please try a different name.");
            }
        }
Ejemplo n.º 2
0
        public object CreateWallet(string walletName, string password)
        {
            var walletGenerator = new WalletGenerator(Global.WalletsDir, Global.Network);

            walletGenerator.TipHeight = Global.BitcoinStore.SmartHeaderChain.TipHeight;
            var(keyManager, mnemonic) = walletGenerator.GenerateWallet(walletName, password);
            keyManager.ToFile();
            return(mnemonic.ToString());
        }
Ejemplo n.º 3
0
        public void Init()
        {
            _wallet = WalletGenerator.GenerateMockWallet();


            // for encryption and decryption tests
            _key          = "238085A3C30982B6DBE1F6F5CEFA4584";
            _path         = WalletFileTools.GetWalletFilePath(_wallet.Id);
            _recoverypath = WalletFileTools.GetWalletRecoveryFilePath(_wallet.Id);
        }
Ejemplo n.º 4
0
        public void GenerateNewWallet()
        {
            IWallet result = WalletGenerator.GenerateNewWallet(_wallet.Id, _wallet.Name, _wallet.MasterKeyWIF, _wallet.NetworkChoice, _wallet.Description);

            Assert.AreEqual(_wallet.Id, result.Id);
            Assert.AreEqual(_wallet.Name, result.Name);
            Assert.AreEqual(_wallet.Description, result.Description);
            Assert.AreEqual(_wallet.MasterKeyWIF, result.MasterKeyWIF);
            Assert.AreEqual(_wallet.NetworkChoice, result.NetworkChoice);
        }
Ejemplo n.º 5
0
        public AddWalletPageViewModel(
            LegalDocuments legalDocuments,
            WalletManager walletManager,
            BitcoinStore store,
            Network network)
        {
            Title           = "Add Wallet";
            SelectionMode   = NavBarItemSelectionMode.Button;
            _legalDocuments = legalDocuments;

            this.WhenAnyValue(x => x.WalletName)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Select(x => !string.IsNullOrWhiteSpace(x))
            .Subscribe(x => OptionsEnabled = x && !Validations.Any);

            RecoverWalletCommand = ReactiveCommand.Create(
                () => { Navigate().To(new RecoverWalletViewModel(WalletName, network, walletManager)); });

            ImportWalletCommand = ReactiveCommand.Create(() => new ImportWalletViewModel(WalletName, walletManager));

            ConnectHardwareWalletCommand = ReactiveCommand.Create(() =>
            {
                Navigate().To(new ConnectHardwareWalletViewModel(WalletName, network, walletManager));
            });

            CreateWalletCommand = ReactiveCommand.CreateFromTask(
                async() =>
            {
                var result = await NavigateDialog(
                    new EnterPasswordViewModel("Type the password of the wallet and click Continue."));

                if (result is { } password)
                {
                    IsBusy = true;

                    var(km, mnemonic) = await Task.Run(
                        () =>
                    {
                        var walletGenerator = new WalletGenerator(
                            walletManager.WalletDirectories.WalletsDir,
                            network)
                        {
                            TipHeight = store.SmartHeaderChain.TipHeight
                        };
                        return(walletGenerator.GenerateWallet(WalletName, password));
                    });

                    Navigate().To(new RecoveryWordsViewModel(km, mnemonic, walletManager), NavigationMode.Clear);

                    IsBusy = false;
                }
            });

            this.ValidateProperty(x => x.WalletName, errors => ValidateWalletName(errors, walletManager, WalletName));
        }
Ejemplo n.º 6
0
        public void GenerateWalletFail()
        {
            string    badMasterKeyWIF = "5KRYM46bcstckRxtdDdBZTshjxtpWtTNBDXKcNWC7yjiGhnuBzV";
            Hashtable walletData      = new Hashtable();

            walletData.Add("id", _wallet.Id);
            walletData.Add("name", _wallet.Name);
            walletData.Add("description", _wallet.Description);
            walletData.Add("masterkey", badMasterKeyWIF);
            walletData.Add("network", _wallet.NetworkChoice.ToString());

            Assert.Throws <FormatException>(() => WalletGenerator.GenerateWalletFromFile(walletData));
        }
 private void DoNextCommand()
 {
     try
     {
         var walletGenerator = new WalletGenerator(Global.WalletManager.WalletDirectories.WalletsDir, Global.Network);
         walletGenerator.TipHeight = Global.BitcoinStore.SmartHeaderChain.TipHeight;
         var(km, mnemonic)         = walletGenerator.GenerateWallet(WalletName, Password);
         Owner.CurrentView         = new GenerateWalletSuccessViewModel(Owner, km, mnemonic);
     }
     catch (Exception ex)
     {
         Logger.LogError(ex);
         NotificationHelpers.Error(ex.ToUserFriendlyString());
     }
 }
        public void CanGenerateValidPrivateKey()
        {
            var network = Network.Main;

            var generator = new WalletGenerator(network);

            var generatedWallet = generator.Generate();

            var key            = Key.Parse(generatedWallet.PrivateKey, network);
            var addressFromKey = key.PubKey.WitHash.ScriptPubKey.Hash.GetAddress(network).ToString();

            Assert.True(generatedWallet.Address == addressFromKey);
            Assert.True(generatedWallet.PubKey == key.PubKey.ToHex());
            Assert.True(generatedWallet.PrivateKey == key.ToString(network));
        }
Ejemplo n.º 9
0
        public void GenerateWallet()
        {
            Hashtable walletData = new Hashtable();

            walletData.Add("id", _wallet.Id);
            walletData.Add("name", _wallet.Name);
            walletData.Add("description", _wallet.Description);
            walletData.Add("masterkey", _wallet.MasterKeyWIF);
            walletData.Add("network", _wallet.NetworkChoice.ToString());
            IWallet result = WalletGenerator.GenerateWalletFromFile(walletData);

            Assert.AreEqual(result.Id, _wallet.Id);
            Assert.AreEqual(result.Name, _wallet.Name);
            Assert.AreEqual(result.Description, _wallet.Description);
            Assert.AreEqual(result.MasterKeyWIF, _wallet.MasterKeyWIF);
            Assert.AreEqual(result.NetworkChoice, _wallet.NetworkChoice);
        }
        public override Task <int> InvokeAsync(IEnumerable <string> args)
        {
            var error = false;

            try
            {
                var extra = Options.Parse(args);
                if (ShowHelp)
                {
                    Options.WriteOptionDescriptions(CommandSet.Out);
                }
                else if (string.IsNullOrWhiteSpace(WalletName) && string.IsNullOrWhiteSpace(EncryptedSecret))
                {
                    Console.WriteLine("Missing required argument `--wallet=WalletName`.");
                    Console.WriteLine("Use `findpassword --help` for details.");
                    error = true;
                }
                else if (!PasswordFinder.Charsets.ContainsKey(Language))
                {
                    Console.WriteLine($"`{Language}` is not available language try with `en, es, pt, it or fr`.");
                    Console.WriteLine("Use `findpassword --help` for details.");
                    error = true;
                }
                else if (!string.IsNullOrWhiteSpace(WalletName))
                {
                    KeyManager km = WalletGenerator.TryGetKeymanagerFromWalletName(WalletName);
                    if (km is null)
                    {
                        error = true;
                    }
                    PasswordFinder.Find(km.EncryptedSecret.ToWif(), Language, UseNumbers, UseSymbols);
                }
                else if (!string.IsNullOrWhiteSpace(EncryptedSecret))
                {
                    PasswordFinder.Find(EncryptedSecret, Language, UseNumbers, UseSymbols);
                }
            }
            catch (Exception)
            {
                Console.WriteLine($"There was a problem interpreting the command, please review it.");
                error = true;
            }
            Environment.Exit(error ? 1 : 0);
            return(Task.FromResult(0));
        }
Ejemplo n.º 11
0
        public AddWalletPageViewModel(NavigationStateViewModel navigationState, WalletManager walletManager,
                                      BitcoinStore store, Network network) : base(navigationState, NavigationTarget.DialogScreen)
        {
            Title = "Add Wallet";

            this.WhenAnyValue(x => x.WalletName)
            .Select(x => !string.IsNullOrWhiteSpace(x))
            .Subscribe(x => OptionsEnabled = x && !Validations.Any);

            RecoverWalletCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                NavigateTo(new RecoverWalletViewModel(navigationState, WalletName, network, walletManager), NavigationTarget.DialogScreen);
            });

            CreateWalletCommand = ReactiveCommand.CreateFromTask(
                async() =>
            {
                var enterPassword = new EnterPasswordViewModel(
                    navigationState,
                    NavigationTarget.DialogScreen,
                    "Type the password of the wallet and click Continue.");

                NavigateTo(enterPassword, NavigationTarget.DialogScreen);

                var result = await enterPassword.GetDialogResultAsync();

                if (result is { } password)
                {
                    var(km, mnemonic) = await Task.Run(
                        () =>
                    {
                        var walletGenerator = new WalletGenerator(
                            walletManager.WalletDirectories.WalletsDir,
                            network)
                        {
                            TipHeight = store.SmartHeaderChain.TipHeight
                        };
                        return(walletGenerator.GenerateWallet(WalletName, password));
                    });

                    NavigateTo(new RecoveryWordsViewModel(navigationState, km, mnemonic, walletManager), NavigationTarget.DialogScreen, true);
                }
Ejemplo n.º 12
0
        public void CanGenerateValidPrivateKey()
        {
            PrepareNetworks.EnsureLiteCoinPrepared();

            var network = Network.TestNet;

            var generator = new WalletGenerator(network);

            var generatedWallet = generator.Generate();

            var key            = Key.Parse(generatedWallet.PrivateKey, network);
            var addressFromKey = key.PubKey.GetAddress(network).ToString();


            var btcAddress = BitcoinAddress.Create(generatedWallet.Address, network);

            Assert.True(generatedWallet.Address == addressFromKey);
            Assert.True(generatedWallet.Address == btcAddress.ToString());
            Assert.True(generatedWallet.PrivateKey == key.ToString(network));
        }
Ejemplo n.º 13
0
        private async Task OnCreateWallet(WalletManager walletManager, BitcoinStore store, Network network)
        {
            var dialogResult = await NavigateDialog(
                new CreatePasswordDialogViewModel("Type the password of the wallet and click Continue."));

            if (dialogResult.Result is { } password)
            {
                var(km, mnemonic) = await Task.Run(
                    () =>
                {
                    var walletGenerator = new WalletGenerator(
                        walletManager.WalletDirectories.WalletsDir,
                        network)
                    {
                        TipHeight = store.SmartHeaderChain.TipHeight
                    };
                    return(walletGenerator.GenerateWallet(WalletName, password));
                });

                Navigate().To(new RecoveryWordsViewModel(km, mnemonic, walletManager));
            }
        }
        private async Task OnCreateWalletAsync(string walletName)
        {
            var dialogResult = await NavigateDialogAsync(
                new CreatePasswordDialogViewModel("Type the password of the wallet and click Continue.", enableEmpty : true, enableCancel : Services.WalletManager.HasWallet()));

            if (dialogResult.Result is { } password)
            {
                var(km, mnemonic) = await Task.Run(
                    () =>
                {
                    var walletGenerator = new WalletGenerator(
                        Services.WalletManager.WalletDirectories.WalletsDir,
                        Services.WalletManager.Network)
                    {
                        TipHeight = Services.BitcoinStore.SmartHeaderChain.TipHeight
                    };
                    return(walletGenerator.GenerateWallet(walletName, password));
                });

                Navigate().To(new RecoveryWordsViewModel(km, mnemonic));
            }
        }
        public AddWalletPageViewModel(IScreen screen, WalletManager walletManager, BitcoinStore store, Network network) : base(screen)
        {
            Title = "Add Wallet";

            this.WhenAnyValue(x => x.WalletName)
            .Select(x => !string.IsNullOrWhiteSpace(x))
            .Subscribe(x => OptionsEnabled = x);

            RecoverWalletCommand = ReactiveCommand.Create(() => screen.Router.Navigate.Execute(new RecoveryPageViewModel(screen)));

            CreateWalletCommand = ReactiveCommand.CreateFromTask(
                async() =>
            {
                var result = await PasswordInteraction.Handle("").ToTask();

                if (result is { } password)
                {
                    var(km, mnemonic) = await Task.Run(
                        () =>
                    {
                        var walletGenerator = new WalletGenerator(walletManager.WalletDirectories.WalletsDir, network)
                        {
                            TipHeight = store.SmartHeaderChain.TipHeight
                        };
                        return(walletGenerator.GenerateWallet(WalletName, password));
                    });

                    await screen.Router.Navigate.Execute(
                        new RecoveryWordsViewModel(screen, km, mnemonic, walletManager));
                }
            });

            PasswordInteraction = new Interaction <string, string?>();
            PasswordInteraction.RegisterHandler(
                async interaction => interaction.SetOutput(await new EnterPasswordViewModel().ShowDialogAsync()));
        }
Ejemplo n.º 16
0
        public AddWalletPageViewModel(
            WalletManagerViewModel walletManagerViewModel,
            BitcoinStore store)
        {
            Title         = "Add Wallet";
            SelectionMode = NavBarItemSelectionMode.Button;
            var walletManager = walletManagerViewModel.Model;
            var network       = walletManager.Network;

            var enableBack = default(IDisposable);

            this.WhenAnyValue(x => x.CurrentTarget)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Subscribe(x =>
            {
                enableBack?.Dispose();
                enableBack = Navigate()
                             .WhenAnyValue(y => y.CanNavigateBack)
                             .Subscribe(y => EnableBack = y);
            });

            this.WhenAnyValue(x => x.WalletName)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Select(x => !string.IsNullOrWhiteSpace(x))
            .Subscribe(x => OptionsEnabled = x && !Validations.Any);

            RecoverWalletCommand = ReactiveCommand.Create(
                () => Navigate().To(new RecoverWalletViewModel(WalletName, walletManagerViewModel)));

            ImportWalletCommand = ReactiveCommand.CreateFromTask(async() =>
            {
                try
                {
                    var filePath = await FileDialogHelper.ShowOpenFileDialogAsync("Import wallet file", new[] { "json" });

                    if (filePath is null)
                    {
                        return;
                    }

                    var keyManager = await ImportWalletHelper.ImportWalletAsync(walletManager, WalletName, filePath);

                    // TODO: get the type from the wallet file
                    Navigate().To(new AddedWalletPageViewModel(walletManager, keyManager));
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex);
                    await ShowErrorAsync(ex.ToUserFriendlyString(), "The wallet file was not valid or compatible with Wasabi.");
                }
            });

            ConnectHardwareWalletCommand = ReactiveCommand.Create(() => Navigate().To(new ConnectHardwareWalletViewModel(WalletName, walletManagerViewModel)));

            CreateWalletCommand = ReactiveCommand.CreateFromTask(
                async() =>
            {
                var dialogResult = await NavigateDialog(
                    new EnterPasswordViewModel("Type the password of the wallet and click Continue."));

                if (dialogResult.Result is { } password)
                {
                    var(km, mnemonic) = await Task.Run(
                        () =>
                    {
                        var walletGenerator = new WalletGenerator(
                            walletManager.WalletDirectories.WalletsDir,
                            network)
                        {
                            TipHeight = store.SmartHeaderChain.TipHeight
                        };
                        return(walletGenerator.GenerateWallet(WalletName, password));
                    });

                    Navigate().To(new RecoveryWordsViewModel(km, mnemonic, walletManager));
                }
            });

            this.ValidateProperty(x => x.WalletName, errors => ValidateWalletName(errors, walletManager, WalletName));

            EnableAutoBusyOn(CreateWalletCommand);
        }
Ejemplo n.º 17
0
 public void Init()
 {
     _wallet = WalletGenerator.GenerateMockWallet();
     _wallet.Initialize();
 }
Ejemplo n.º 18
0
        public void GenerateNewWalletFail()
        {
            string badMasterKeyWIF = "5KRYM46bcstckRxtdDdBZTshjxtpWtTNBDXKcNWC7yjiGhnuBzV";

            Assert.Throws <FormatException>(() => WalletGenerator.GenerateNewWallet(_wallet.Id, _wallet.Name, badMasterKeyWIF, _wallet.NetworkChoice, _wallet.Description));
        }
Ejemplo n.º 19
0
        public void Init()
        {
            var masterKeyWIF = _masterKey.GetWif(_networkChoice).ToString();

            _wallet = WalletGenerator.GenerateNewWallet(_id, _name, masterKeyWIF, _networkChoice, _description);
        }