Esempio n. 1
0
        public async Task SaveWallet(WalletHandler walletHandler, bool makeDefault = false)
        {
            try
            {
                await persistenceService.SaveObject(walletHandler, Path.Combine(Constants.WalletFolder, walletHandler.Id.ToString(), Constants.WalletHandlerFile));

                if (walletHandler.Wallet == null)
                {
                    var pubKey         = walletHandler.MasterPrivKey.Neuter();
                    var walletCreation = new WalletCreation
                    {
                        Name     = walletHandler.Id.ToString(),
                        Network  = Constants.CurrentNetwork,
                        RootKeys = new[] { pubKey.ExtPubKey }
                    };
                    walletHandler.Wallet = new Wallet(walletCreation);
                }

                await persistenceService.SaveFromStream(
                    Path.Combine(Constants.WalletFolder, walletHandler.Id.ToString(), Constants.WalletFile),
                    walletHandler.Wallet.Save);

                if (makeDefault)
                {
                    _currentWalletHandler = walletHandler;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
        public async Task <WalletViewModel> CreateWallet()
        {
            WalletCreationViewModel walletCreationViewModel = new WalletCreationViewModel();

            walletCreationViewModel.Name = new Random().Next(1, 100).ToString();
            WalletCreation creation = walletCreationViewModel.CreateWalletCreation();
            Wallet         wallet   = await CreateWallet(creation);

            var walletVm = new WalletViewModel(wallet, walletCreationViewModel);


            //walletVm.Name;
            //walletVm.Wallet.Created;
            //walletVm.PrivateKeys;

            //ToDo Create Wallet repository
            WalletFileInfoViewModel walletFileInfoVm = walletVm.Save();

            if (_ConnectionParameters != null)
            {
                wallet.Configure(_ConnectionParameters);
                wallet.Connect();
            }

            return(walletVm);
        }
Esempio n. 3
0
        public SPVWallet(SPVSettings settings)
        {
            _logger = settings.Logger;

            _logger.Information("SPV Wallet starting");
            _settings = settings;
            _logger.Information("SPV Wallet init");

            if (!File.Exists(WalletFile()))
            {
                _logger.Information("Wallet Doesn't exist, creating new one");

                var walletCreation = new WalletCreation
                {
                    Name              = "DefaultWallet",
                    RootKeys          = new[] { (ExtPubKey)_settings.RootKey },
                    UseP2SH           = false,
                    Network           = _settings.Network,
                    SignatureRequired = 1
                };
                _wallet      = new Wallet(walletCreation, 1);
                _isNewWallet = true;
            }
            else
            {
                _logger.Information("Wallet already exist");
                _logger.Information("Loading SPV Wallet");
                LoadWallet();
            }

            _logger.Information("Start connecting");

            StartConnecting().Wait();
        }
Esempio n. 4
0
        private async void ExecuteCreateWallet()
        {
            if (string.IsNullOrWhiteSpace(NewName) && Pass.Length < MIN_PASS_LENGTH)
            {
                string title   = TextTools.RetrieveStringFromResource("CreateWallet_Dialog_Invalid_Title");
                string message = TextTools.RetrieveStringFromResource("CreateWallet_Dialog_Invalid_Message")
                                 .Replace("*NUM*", MIN_PASS_LENGTH.ToString());
                await _cwview.ShowMessageAsync(title, message, MessageDialogStyle.Affirmative);

                return;
            }
            else if (string.IsNullOrWhiteSpace(NewName))
            {
                string title   = TextTools.RetrieveStringFromResource("CreateWallet_Dialog_NameEmpty_Title");
                string message = TextTools.RetrieveStringFromResource("CreateWallet_Dialog_NameEmpty_Message");
                await _cwview.ShowMessageAsync(title, message, MessageDialogStyle.Affirmative);

                return;
            }
            else if (Pass.Length < MIN_PASS_LENGTH)
            {
                string title   = TextTools.RetrieveStringFromResource("CreateWallet_Dialog_Insufficient_Title");
                string message = TextTools.RetrieveStringFromResource("CreateWallet_Dialog_Insufficient_Message")
                                 .Replace("*NUM*", MIN_PASS_LENGTH.ToString());
                await _cwview.ShowMessageAsync(title, message, MessageDialogStyle.Affirmative);

                return;
            }

            string  recPhrase = Generators.GenerateRecPhrase();
            Network net       = this.GetNetworkChoice();
            // WalletModel inherits from NBitcoin.SPV.Wallet which
            // requires a WalletCreation Class as a parameter
            WalletCreation create = Generators.GenerateWalletCreation(NewName, net);

            ExtKey           masterKey = Generators.GenerateMasterKey();
            BitcoinExtPubKey rootKey   = Generators.GenerateRootKey(masterKey, net);
            string           id        = TextTools.Base58Encode(NewName);

            string walletFolder = Path.Combine(App.WalletsDir, id);

            Directory.CreateDirectory(walletFolder);

            var newWallet = new WalletModel(id, NewName, rootKey, DateTimeOffset.Now, Description);

            newWallet.SetWalletPassword(Pass);
            newWallet.SetRecoveryPhrase(recPhrase);
            newWallet.SetMasterKey(masterKey);



            if (FileTools.SaveNewWallet(newWallet))
            {
                Messenger.Default.Send <string>(recPhrase, "OpenRecoveryPhraseView");
                // If a wallet is already active, lets ask the user to close
                // current active wallet and use the newly created one
                this.NewWalletPrompt(newWallet.FileLocation);
            }
        }
Esempio n. 5
0
        public static WalletCreation GenerateWalletCreation(string name, Network net)
        {
            WalletCreation create = new WalletCreation();

            create.Name    = name;
            create.Network = net;
            return(create);
        }
Esempio n. 6
0
        private static WalletCreation GenerateWalletCreation(string name, Network networkChoice)
        {
            var walletSetup = new WalletCreation();

            walletSetup.Name                          = name;
            walletSetup.Network                       = networkChoice;
            walletSetup.SignatureRequired             = 1;
            walletSetup.UseP2SH                       = false;
            walletSetup.DerivationPath                = new KeyPath();
            walletSetup.PurgeConnectionOnFilterChange = false;
            return(walletSetup);
        }
Esempio n. 7
0
        public JetWalletModel(string id, string name, ExtKey masterKey, Network net, WalletCreation walletSetup, string description = "No Description Provided")
            : base(walletSetup)
        {
            _wconnect    = new JetWalletConnectModel(this);
            _id          = id;
            _name        = name;
            _description = description;
            _masterkey   = masterKey;
            _walletkeys  = new List <WalletKey>();
            _net         = net;

            WalletFileTools.CreateWalletFolder(Id);
            GenerateWalletKeys();
        }
Esempio n. 8
0
        static void Main(string[] args)
        {
            ExtKey         masterKey = new ExtKey();
            WalletCreation wc        = new WalletCreation
            {
                Network  = network,
                RootKeys = new [] { masterKey.Neuter() }
            };
            Wallet wallet = new Wallet(wc);

            wallet.Configure();

            NetworkAddress na = new NetworkAddress(IPAddress.Parse("127.0.0.1"), 18444);

            wallet.AddressManager.Add(na);
            wallet.Group.MaximumNodeConnection = 1;
            wallet.NewWalletTransaction       += (Wallet sender, WalletTransaction wtx) =>
            {
                WalletTransactionsCollection wtxc = wallet.GetTransactions();
                Console.WriteLine("wallet tx count => {0}", wtxc.Count);
                Console.WriteLine("immature => {0}", wtxc.Summary.Immature.Amount);
                Console.WriteLine("confirmed => {0}", wtxc.Summary.Confirmed.Amount);
                Console.WriteLine("unconfirmed => {0}", wtxc.Summary.UnConfirmed.Amount);
                Console.WriteLine("spendable => {0}", wtxc.Summary.Spendable.Amount);
            };
            wallet.Connect();

            BitcoinAddress addr = wallet.GetNextScriptPubKey().GetDestinationAddress(network);

            Console.WriteLine("receiver address => {0}", addr);

            Task.Run(() => {
                Console.WriteLine("wait a while before trigger tx ...");
                Thread.Sleep(2000);
                RPCClient client = new RPCClient("user:123456", "http://localhost:18443", network);
                uint256 txid     = client.SendToAddress(addr, Money.Coins(0.1m));
                Console.WriteLine("trigger txid => {0}", txid);
                client.Generate(1);
            });

            Console.ReadLine();
        }
Esempio n. 9
0
        internal void CreateWallet(KnoledgeWallet knoledgeWallet)
        {
            WalletCreation creation = knoledgeWallet.CreateWalletCreation();
            Wallet         wallet   = new Wallet(creation);

            knoledgeWallet.Set(wallet);

            _wallets.Add(knoledgeWallet);

            if (_wallet == null)
            {
                _wallet = knoledgeWallet;
            }

            knoledgeWallet.Save();

            if (_connectionParameters != null)
            {
                wallet.Connect(_connectionParameters);
            }
        }
Esempio n. 10
0
        internal async void CreateWallet(WalletCreationViewModel walletCreationViewModel)
        {
            WalletCreation creation = walletCreationViewModel.CreateWalletCreation();

            Message = "Creating wallet...";
            Wallet wallet = await CreateWallet(creation);

            Message = "Wallet created";
            var walletVm = new WalletViewModel(wallet, walletCreationViewModel);

            Wallets.Add(walletVm);
            if (SelectedWallet == null)
            {
                SelectedWallet = walletVm;
            }
            walletVm.Save();
            if (_ConnectionParameters != null)
            {
                wallet.Configure(_ConnectionParameters);
                wallet.Connect();
            }
        }
Esempio n. 11
0
        public WalletHandler CreateNew(string name, string passphrase = null)
        {
            var walletId       = Guid.NewGuid();
            var mnemonic       = new Mnemonic(Wordlist.English, WordCount.TwentyFour);
            var key            = mnemonic.DeriveExtKey(passphrase);
            var privKey        = key.GetWif(Constants.CurrentNetwork);
            var pubKey         = key.Neuter().GetWif(Constants.CurrentNetwork);
            var walletCreation = new WalletCreation
            {
                Name     = walletId.ToString(),
                Network  = Constants.CurrentNetwork,
                RootKeys = new[] { pubKey.ExtPubKey }
            };

            return(new WalletHandler
            {
                Id = walletId,
                Name = name,
                Created = DateTime.UtcNow,
                EncodedMnemonic = mnemonic.ToString(),
                Wallet = new Wallet(walletCreation),
                MasterPrivKeyBase58 = privKey.ToString()
            });
        }
Esempio n. 12
0
        public void CanSyncWalletCore(NodeBuilder builder, CoreNode walletNode, WalletCreation creation)
        {
            var        rpc = builder.Nodes[0].CreateRPCClient();
            var        notifiedTransactions = new List <WalletTransaction>();
            NodesGroup connected            = CreateGroup(new List <CoreNode>(new[] { walletNode }), 1);
            Wallet     wallet = new Wallet(creation, keyPoolSize: 11);

            wallet.NewWalletTransaction += (s, a) => notifiedTransactions.Add(a);
            Assert.True(wallet.State == WalletState.Created);
            wallet.Configure(connected);
            wallet.Connect();
            Assert.True(wallet.State == WalletState.Disconnected);
            TestUtils.Eventually(() => connected.ConnectedNodes.Count == 1);
            Assert.True(wallet.State == WalletState.Connected);

            TestUtils.Eventually(() => wallet.Chain.Height == rpc.GetBlockCount());
            for (int i = 0; i < 9; i++)
            {
                wallet.GetNextScriptPubKey();
            }
            wallet.GetNextScriptPubKey();             //Should provoke purge
            TestUtils.Eventually(() => wallet.State == WalletState.Disconnected && wallet.ConnectedNodes == 0);
            TestUtils.Eventually(() => wallet.ConnectedNodes == 1);

            var k = wallet.GetNextScriptPubKey();

            Assert.NotNull(wallet.GetKeyPath(k));
            if (creation.UseP2SH)
            {
                var p2sh = k.GetDestinationAddress(Network.TestNet) as BitcoinScriptAddress;
                Assert.NotNull(p2sh);
                var redeem = wallet.GetRedeemScript(p2sh);
                Assert.NotNull(redeem);
                Assert.Equal(redeem.Hash, p2sh.Hash);
            }

            Assert.Equal(creation.UseP2SH, k.GetDestinationAddress(Network.TestNet) is BitcoinScriptAddress);
            builder.Nodes[0].GiveMoney(k, Money.Coins(1.0m));
            TestUtils.Eventually(() => wallet.GetTransactions().Count == 1 &&
                                 notifiedTransactions.Count == 1);
            builder.Nodes[0].FindBlock();
            TestUtils.Eventually(() => wallet.GetTransactions().Where(t => t.BlockInformation != null).Count() == 1 &&
                                 notifiedTransactions.Count == 2);
            builder.Nodes[0].GiveMoney(k, Money.Coins(1.5m), false);
            builder.Nodes[0].FindBlock();
            TestUtils.Eventually(() => wallet.GetTransactions().Summary.Confirmed.TransactionCount == 2 &&
                                 notifiedTransactions.Count == 3);

            builder.Nodes[0].FindBlock(30);
            Assert.True(wallet.GetTransactions().Summary.Confirmed.TransactionCount == 2);
            builder.Nodes[0].GiveMoney(k, Money.Coins(0.001m), false);
            Assert.True(wallet.GetTransactions().Summary.Confirmed.TransactionCount == 2);
            builder.Nodes[0].FindBlock(1, false);
            Assert.True(wallet.GetTransactions().Summary.Confirmed.TransactionCount == 2);
            builder.Nodes[0].FindBlock();
            //Sync automatically
            TestUtils.Eventually(() => wallet.GetTransactions().Summary.Confirmed.TransactionCount == 3);

            //Save and restore wallet
            MemoryStream ms = new MemoryStream();

            wallet.Save(ms);
            ms.Position = 0;
            var wallet2 = Wallet.Load(ms);

            //////

            //Save and restore tracker
            ms = new MemoryStream();
            var tracker = connected.NodeConnectionParameters.TemplateBehaviors.Find <TrackerBehavior>();

            tracker.Tracker.Save(ms);
            ms.Position = 0;
            connected   = CreateGroup(new List <CoreNode>(new[] { walletNode }), 1);
            tracker     = new TrackerBehavior(Tracker.Load(ms), wallet.Chain);
            connected.NodeConnectionParameters.TemplateBehaviors.Add(tracker);
            //////

            wallet2.Configure(connected);
            wallet2.Connect();
            Assert.Equal(wallet.Created, wallet2.Created);
            Assert.Equal(wallet.GetNextScriptPubKey(), wallet2.GetNextScriptPubKey());
            Assert.True(wallet.GetKnownScripts().Length == wallet2.GetKnownScripts().Length);
            TestUtils.Eventually(() => wallet2.GetTransactions().Summary.Confirmed.TransactionCount == 3);

            //TestUtils.Eventually(() =>
            //{
            //    var fork = wallet.Chain.FindFork(wallet2._ScanLocation);
            //    return fork.Height == rpc.GetBlockCount();
            //});

            wallet2.Disconnect();
            wallet.Disconnect();
            connected.Disconnect();
        }
Esempio n. 13
0
        public void CanSyncWalletCore(WalletCreation creation)
        {
            using (NodeServerTester servers = new NodeServerTester(Network.TestNet))
            {
                var notifiedTransactions = new List <WalletTransaction>();
                var chainBuilder         = new BlockchainBuilder();
                SetupSPVBehavior(servers, chainBuilder);
                NodesGroup connected = CreateGroup(servers, 1);
                Wallet     wallet    = new Wallet(creation, keyPoolSize: 11);
                wallet.NewWalletTransaction += (s, a) => notifiedTransactions.Add(a);
                Assert.True(wallet.State == WalletState.Created);
                wallet.Configure(connected);
                wallet.Connect();
                Assert.True(wallet.State == WalletState.Disconnected);
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 1);
                Assert.True(wallet.State == WalletState.Connected);

                chainBuilder.FindBlock();
                TestUtils.Eventually(() => wallet.Chain.Height == 1);
                for (int i = 0; i < 9; i++)
                {
                    wallet.GetNextScriptPubKey();
                }
                wallet.GetNextScriptPubKey();                 //Should provoke purge
                TestUtils.Eventually(() => wallet.State == WalletState.Disconnected && wallet.ConnectedNodes == 0);
                TestUtils.Eventually(() => wallet.ConnectedNodes == 1);
                TestUtils.Eventually(() => servers.Server1.ConnectedNodes.Count == 1);
                var spv = servers.Server1.ConnectedNodes.First().Behaviors.Find <SPVBehavior>();
                TestUtils.Eventually(() => spv._Filter != null);
                var k = wallet.GetNextScriptPubKey();
                Assert.NotNull(wallet.GetKeyPath(k));
                if (creation.UseP2SH)
                {
                    var p2sh = k.GetDestinationAddress(Network.TestNet) as BitcoinScriptAddress;
                    Assert.NotNull(p2sh);
                    var redeem = wallet.GetRedeemScript(p2sh);
                    Assert.NotNull(redeem);
                    Assert.Equal(redeem.Hash, p2sh.Hash);
                }

                Assert.Equal(creation.UseP2SH, k.GetDestinationAddress(Network.TestNet) is BitcoinScriptAddress);
                chainBuilder.GiveMoney(k, Money.Coins(1.0m));
                TestUtils.Eventually(() => wallet.GetTransactions().Count == 1 &&
                                     notifiedTransactions.Count == 1);
                chainBuilder.FindBlock();
                TestUtils.Eventually(() => wallet.GetTransactions().Where(t => t.BlockInformation != null).Count() == 1 &&
                                     notifiedTransactions.Count == 2);
                chainBuilder.Broadcast = false;
                chainBuilder.GiveMoney(k, Money.Coins(1.5m));
                chainBuilder.Broadcast = true;
                chainBuilder.FindBlock();
                TestUtils.Eventually(() => wallet.GetTransactions().Summary.Confirmed.TransactionCount == 2 &&
                                     notifiedTransactions.Count == 3);

                chainBuilder.Broadcast = false;
                for (int i = 0; i < 30; i++)
                {
                    chainBuilder.FindBlock();
                }
                chainBuilder.GiveMoney(k, Money.Coins(0.001m));
                chainBuilder.FindBlock();
                chainBuilder.Broadcast = true;
                chainBuilder.FindBlock();
                //Sync automatically
                TestUtils.Eventually(() => wallet.GetTransactions().Summary.Confirmed.TransactionCount == 3);

                //Save and restore wallet
                MemoryStream ms = new MemoryStream();
                wallet.Save(ms);
                ms.Position = 0;
                var wallet2 = Wallet.Load(ms);
                //////

                //Save and restore tracker
                ms = new MemoryStream();
                var tracker = connected.NodeConnectionParameters.TemplateBehaviors.Find <TrackerBehavior>();
                connected.NodeConnectionParameters.TemplateBehaviors.Remove(tracker);
                tracker.Tracker.Save(ms);
                ms.Position = 0;
                tracker     = new TrackerBehavior(Tracker.Load(ms), wallet.Chain);
                connected.NodeConnectionParameters.TemplateBehaviors.Add(tracker);
                //////

                wallet2.Configure(connected);
                wallet2.Connect();
                Assert.Equal(wallet.Created, wallet2.Created);
                Assert.Equal(wallet.GetNextScriptPubKey(), wallet2.GetNextScriptPubKey());
                Assert.True(wallet.GetKnownScripts().Length == wallet2.GetKnownScripts().Length);
                TestUtils.Eventually(() => wallet2.GetTransactions().Summary.Confirmed.TransactionCount == 3);

                var fork = wallet.Chain.FindFork(wallet2._ScanLocation);
                Assert.True(fork.Height == chainBuilder.Chain.Height);
            }
        }
Esempio n. 14
0
        public void CanSyncWalletCore(WalletCreation creation)
        {
            using (NodeServerTester servers = new NodeServerTester(Network.TestNet))
            {
                var chainBuilder = new BlockchainBuilder();

                //Simulate SPV compatible server
                servers.Server1.InboundNodeConnectionParameters.Services = NodeServices.Network;
                servers.Server1.InboundNodeConnectionParameters.TemplateBehaviors.Add(new ChainBehavior(chainBuilder.Chain)
                {
                    AutoSync = false
                });
                servers.Server1.InboundNodeConnectionParameters.TemplateBehaviors.Add(new SPVBehavior(chainBuilder));
                /////////////

                //The SPV client does not verify the chain and keep one connection alive with Server1
                NodeConnectionParameters parameters = new NodeConnectionParameters();
                Wallet.ConfigureDefaultNodeConnectionParameters(parameters);
                parameters.IsTrusted = true;
                AddressManagerBehavior addrman = new AddressManagerBehavior(new AddressManager());
                addrman.AddressManager.Add(new NetworkAddress(servers.Server1.ExternalEndpoint), IPAddress.Parse("127.0.0.1"));
                parameters.TemplateBehaviors.Add(addrman);
                NodesGroup connected = new NodesGroup(Network.TestNet, parameters);
                connected.AllowSameGroup        = true;
                connected.MaximumNodeConnection = 1;
                /////////////

                Wallet wallet = new Wallet(creation, keyPoolSize: 11);
                Assert.True(wallet.State == WalletState.Created);
                wallet.Connect(connected);
                Assert.True(wallet.State == WalletState.Disconnected);
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 1);
                Assert.True(wallet.State == WalletState.Connected);

                chainBuilder.FindBlock();
                TestUtils.Eventually(() => wallet.Chain.Height == 1);
                for (int i = 0; i < 9; i++)
                {
                    wallet.GetNextScriptPubKey();
                }
                wallet.GetNextScriptPubKey();                 //Should provoke purge
                TestUtils.Eventually(() => wallet.State == WalletState.Disconnected && wallet.ConnectedNodes == 0);
                TestUtils.Eventually(() => wallet.ConnectedNodes == 1);
                TestUtils.Eventually(() => servers.Server1.ConnectedNodes.Count == 1);
                var spv = servers.Server1.ConnectedNodes.First().Behaviors.Find <SPVBehavior>();
                TestUtils.Eventually(() => spv._Filter != null);

                var k = wallet.GetNextScriptPubKey();
                Assert.Equal(creation.UseP2SH, k.GetDestinationAddress(Network.TestNet) is BitcoinScriptAddress);
                chainBuilder.GiveMoney(k, Money.Coins(1.0m));
                TestUtils.Eventually(() => wallet.GetTransactions().Count == 1);
                chainBuilder.FindBlock();
                TestUtils.Eventually(() => wallet.GetTransactions().Where(t => t.BlockInformation != null).Count() == 1);

                chainBuilder.Broadcast = false;
                chainBuilder.GiveMoney(k, Money.Coins(1.5m));
                chainBuilder.Broadcast = true;
                chainBuilder.FindBlock();
                TestUtils.Eventually(() => wallet.GetTransactions().Summary.Confirmed.TransactionCount == 2);

                chainBuilder.Broadcast = false;
                for (int i = 0; i < 30; i++)
                {
                    chainBuilder.FindBlock();
                }
                chainBuilder.GiveMoney(k, Money.Coins(0.001m));
                chainBuilder.FindBlock();
                chainBuilder.Broadcast = true;
                chainBuilder.FindBlock();
                //Sync automatically
                TestUtils.Eventually(() => wallet.GetTransactions().Summary.Confirmed.TransactionCount == 3);

                MemoryStream ms = new MemoryStream();
                wallet.Save(ms);
                ms.Position = 0;
                var wallet2 = Wallet.Load(ms);
                wallet2.Connect(connected);
                Assert.Equal(wallet.Created, wallet2.Created);
                Assert.Equal(wallet.GetNextScriptPubKey(), wallet2.GetNextScriptPubKey());
                Assert.True(wallet.GetKnownScripts().Length == wallet2.GetKnownScripts().Length);

                var fork = wallet.Chain.FindFork(wallet2._ScanLocation);
                Assert.True(fork.Height == chainBuilder.Chain.Height - 5);
            }
        }
Esempio n. 15
0
 private Task <Wallet> CreateWallet(WalletCreation creation)
 {
     return(Task.Factory.StartNew(() => new Wallet(creation)));
 }