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); }
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(); }
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); } }
public static WalletCreation GenerateWalletCreation(string name, Network net) { WalletCreation create = new WalletCreation(); create.Name = name; create.Network = net; return(create); }
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); }
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(); }
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(); }
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); } }
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(); } }
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() }); }
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(); }
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); } }
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); } }
private Task <Wallet> CreateWallet(WalletCreation creation) { return(Task.Factory.StartNew(() => new Wallet(creation))); }