Beispiel #1
0
        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);
        }
Beispiel #2
0
 protected MultiSigAddress[] GetAllMultiSigAddressesCore(int skip, int?take)
 {
     return(MultiSigAddressService.GetAllMultiSigAddresses(skip, take, this.x1WalletFile));
 }