NewWallet(string filename, string password,
                  PrivateKey privateViewKey, string address)
        {
            if (!KeyOps.IsValidKey(privateViewKey))
            {
                return(Either.Left <Error, WalletBackend>(
                           Error.InvalidPrivateKey()
                           ));
            }

            if (File.Exists(filename))
            {
                return(Either.Left <Error, WalletBackend>(
                           Error.FileAlreadyExists()
                           ));
            }

            /* If we can get the keys from the address, make a new view wallet,
             * save it, and return it. Else, return the error */
            return(Addresses.KeysFromAddress(address).Fmap(
                       publicKeys => {
                WalletBackend wallet = new WalletBackend(
                    filename, password, privateViewKey, publicKeys
                    );

                wallet.Save();

                return Either.Right <Error, WalletBackend>(wallet);
            }
                       ));
        }
        NewWallet(string filename, string password,
                  PrivateKeys privateKeys)
        {
            if (!KeyOps.IsValidKey(privateKeys.spendKey) ||
                !KeyOps.IsValidKey(privateKeys.viewKey))
            {
                return(Either.Left <Error, WalletBackend>(
                           Error.InvalidPrivateKey()
                           ));
            }

            if (File.Exists(filename))
            {
                return(Either.Left <Error, WalletBackend>(
                           Error.FileAlreadyExists()
                           ));
            }

            /* Create the wallet instance */
            WalletBackend wallet = new WalletBackend(
                filename, password, privateKeys
                );

            /* Save it */
            wallet.Save();

            /* Return it */
            return(Either.Right <Error, WalletBackend>(wallet));
        }