예제 #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);
        }
예제 #2
0
        public async Task <ECCModel> ExecuteAsync([FromBody] RequestObject request)
        {
            if (AuthKey == null)
            {
                this.Response.StatusCode = 403;
                return(null);
            }

            try
            {
                if (IsRequestForPublicKey(request))
                {
                    return(CreatePublicKey());
                }

                DecryptedRequest decryptedRequest = DecryptRequest(request, this.walletController);
                CheckPermissions(decryptedRequest, this.secureApiSettings);

                switch (decryptedRequest.Command)
                {
                case "createWallet":
                {
                    WalletCreateRequest walletCreateRequest = Deserialize <WalletCreateRequest>(decryptedRequest.Payload);
                    this.walletController.CreateWallet(walletCreateRequest);
                    return(CreateOk(request));
                }

                case "loadWallet":
                {
                    LoadWalletResponse loadWalletResponse = this.walletController.LoadWallet();
                    return(CreateOk(loadWalletResponse, request));
                }

                case "daemonInfo":     // one-time information about the running daemon, includes list of wallet files
                {
                    DaemonInfo daemonStatus = this.walletController.GetDaemonInfo();
                    return(CreateOk(daemonStatus, request));
                }

                case "walletInfo":     // does not depend on weather a wallet is loaded, but if a wallet is loaded, it includes all wallet info, including balance and staking info when enabled
                {
                    WalletInfo walletInfo = this.walletController.GetWalletInfo();
                    return(CreateOk(walletInfo, request));
                }

                case "historyInfo":
                {
                    var         historyRequest = Deserialize <HistoryRequest>(decryptedRequest.Payload);
                    HistoryInfo historyInfo    = this.walletController.GetHistoryInfo(historyRequest);
                    return(CreateOk(historyInfo, request));
                }

                case "getReceiveAddresses":
                {
                    var getAddressesRequest = Deserialize <GetAddressesRequest>(decryptedRequest.Payload);
                    GetAddressesResponse getAddressesResponse = this.walletController.GetUsedReceiveAddresses(getAddressesRequest);
                    return(CreateOk(getAddressesResponse, request));
                }

                case "createReceiveAddress":
                {
                    var createReceiveAddressRequest             = Deserialize <CreateReceiveAddressRequest>(decryptedRequest.Payload);
                    CreateReceiveAddressResponse addressesModel = this.walletController.CreateReceiveAddress(createReceiveAddressRequest);
                    return(CreateOk(addressesModel, request));
                }

                case "estimateFee":
                {
                    var  txFeeEstimateRequest = Deserialize <TransactionRequest>(decryptedRequest.Payload);
                    long fee = this.walletController.EstimateFee(txFeeEstimateRequest);
                    return(CreateOk(fee, request));
                }

                case "buildTransaction":
                {
                    var buildTransactionRequest             = Deserialize <TransactionRequest>(decryptedRequest.Payload);
                    TransactionResponse transactionResponse = this.walletController.BuildTransaction(buildTransactionRequest);
                    return(CreateOk(transactionResponse, request));
                }

                case "repair":
                {
                    var walletSyncFromDateRequest = Deserialize <RepairRequest>(decryptedRequest.Payload);
                    this.walletController.Repair(walletSyncFromDateRequest);
                    return(CreateOk(request));
                }

                case "importKeys":
                {
                    var importKeysRequest  = Deserialize <ImportKeysRequest>(decryptedRequest.Payload);
                    var importKeysResponse = this.walletController.ImportKeys(importKeysRequest);
                    return(CreateOk(importKeysResponse, request));
                }

                case "exportKeys":
                {
                    var exportKeysRequest  = Deserialize <ExportKeysRequest>(decryptedRequest.Payload);
                    var exportKeysResponse = this.walletController.ExportKeys(exportKeysRequest);
                    return(CreateOk(exportKeysResponse, request));
                }

                case "startStaking":
                {
                    var startStakingRequest = Deserialize <StartStakingRequest>(decryptedRequest.Payload);
                    this.walletController.StartStaking(startStakingRequest);
                    return(CreateOk(request));
                }

                case "stopStaking":
                {
                    this.walletController.StopStaking();
                    return(CreateOk(request));
                }

                default:
                    throw new NotSupportedException($"The command '{decryptedRequest.Command}' is not supported.");
                }
            }
            catch (Exception e)
            {
                return(CreateError(e, request));
            }
        }
예제 #3
0
 public void CreateWallet(WalletCreateRequest walletCreateRequest)
 {
     this.walletManagerFactory.CreateWallet(walletCreateRequest);
 }