public void CreateWallet(WalletCreateRequest walletCreateRequest) { string walletName = walletCreateRequest.WalletName; string filePath = walletName.GetX1WalletFilepath(C.Network, this.nodeServices.DataFolder); string passphrase = walletCreateRequest.Passphrase; if (File.Exists(filePath)) { throw new InvalidOperationException( $"A wallet with the name {walletName} already exists at {filePath}!"); } if (string.IsNullOrWhiteSpace(passphrase)) { throw new InvalidOperationException("A passphrase is required."); } DateTime now = DateTime.UtcNow; var x1WalletFile = new X1WalletFile { WalletGuid = Guid.NewGuid(), WalletName = walletName, CoinTicker = C.Network.CoinTicker, CoinType = C.Network.Consensus.CoinType, CreatedUtc = now.ToUnixTime(), ModifiedUtc = now.ToUnixTime(), LastBackupUtc = null, Comment = "Your notes here!", Version = C.WalletKeyFileVersion, PassphraseChallenge = KeyHelper.GenerateRandomKeyMaterial(passphrase, 32) .EncryptedPrivateKey, CurrentPath = filePath }; byte[] mnemonicBytes = KeyHelper.GetRandom(32); string bip39Passphrase = walletCreateRequest.Bip39Passphrase?.Trim() ?? ""; Wordlist wl = Wordlist.English; var mnemonic = new Mnemonic(wl, mnemonicBytes); byte[] hdSeed = mnemonic.DeriveSeed(bip39Passphrase); x1WalletFile.HdSeed = VCL.EncryptWithPassphrase(passphrase, hdSeed); x1WalletFile.HdSeedHasBip39Passphrase = !string.IsNullOrWhiteSpace(bip39Passphrase); // Create one receive addresses, so that GetUsedReceiveAddresses returns at least one address, even if it is not used in this case. AddressService.CreateAndInsertNewReceiveAddress("Default address", passphrase, x1WalletFile); AddressService.CreateAndInsertNewChangeAddresses(passphrase, C.UnusedChangeAddressBuffer, x1WalletFile); ColdStakingAddressService.EnsureDefaultColdStakingAddress(passphrase, x1WalletFile); MultiSigAddressService.EnsureDefaultMultisigAddress(passphrase, x1WalletFile); AddressService.TryUpdateLookAhead(passphrase, x1WalletFile); x1WalletFile.SaveX1WalletFile(filePath); X1WalletMetadataFile x1WalletMetadataFile = x1WalletFile.CreateX1WalletMetadataFile(C.Network.GenesisHash); string x1WalletMetadataFilename = walletName.GetX1WalletMetaDataFilepath(C.Network, this.nodeServices.DataFolder); x1WalletMetadataFile.SaveX1WalletMetadataFile(x1WalletMetadataFilename); }
protected void SetStakingPassphrase(string passphrase) { this.stakingPassphrase = passphrase; AddressService.TryUpdateLookAhead(passphrase, this.x1WalletFile); ColdStakingAddressService.EnsureDefaultColdStakingAddress(passphrase, this.x1WalletFile); }