Handle restore from phrase
This commit is contained in:
@@ -11,4 +11,4 @@ crate-type = ["staticlib"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
libc = "0.2.58"
|
libc = "0.2.58"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
zecwalletlitelib = { path = "../../lightwallet/lightwalletclient/lib/" }
|
zecwalletlitelib = { git = "https://github.com/adityapk00/zecwallet-light-cli", rev = "6dc22e4d74e9cec458d279d793477dea3bfe27e5" }
|
||||||
|
|||||||
@@ -72,6 +72,53 @@ pub extern fn litelib_initialize_new(dangerous: bool, server: *const c_char) ->
|
|||||||
return s_str.into_raw();
|
return s_str.into_raw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Restore a wallet from the seed phrase
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern fn litelib_initialize_new_from_phrase(dangerous: bool, server: *const c_char,
|
||||||
|
seed: *const c_char, birthday: u64) -> *mut c_char {
|
||||||
|
let server_str = unsafe {
|
||||||
|
assert!(!server.is_null());
|
||||||
|
|
||||||
|
CStr::from_ptr(server).to_string_lossy().into_owned()
|
||||||
|
};
|
||||||
|
|
||||||
|
let seed_str = unsafe {
|
||||||
|
assert!(!seed.is_null());
|
||||||
|
|
||||||
|
CStr::from_ptr(seed).to_string_lossy().into_owned()
|
||||||
|
};
|
||||||
|
|
||||||
|
let server = LightClientConfig::get_server_or_default(Some(server_str));
|
||||||
|
let (config, _latest_block_height) = match LightClientConfig::create(server, dangerous) {
|
||||||
|
Ok((c, h)) => (c, h),
|
||||||
|
Err(e) => {
|
||||||
|
let e_str = CString::new(format!("Error: {}", e)).unwrap();
|
||||||
|
return e_str.into_raw();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let lightclient = match LightClient::new_from_phrase(seed_str, &config, birthday) {
|
||||||
|
Ok(l) => l,
|
||||||
|
Err(e) => {
|
||||||
|
let e_str = CString::new(format!("Error: {}", e)).unwrap();
|
||||||
|
return e_str.into_raw();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let seed = match lightclient.do_seed_phrase() {
|
||||||
|
Ok(s) => s.dump(),
|
||||||
|
Err(e) => {
|
||||||
|
let e_str = CString::new(format!("Error: {}", e)).unwrap();
|
||||||
|
return e_str.into_raw();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
LIGHTCLIENT.lock().unwrap().replace(Some(lightclient));
|
||||||
|
|
||||||
|
let c_str = CString::new("OK").unwrap();
|
||||||
|
return c_str.into_raw();
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize a new lightclient and store its value
|
// Initialize a new lightclient and store its value
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn litelib_initialize_existing(dangerous: bool, server: *const c_char) -> *mut c_char {
|
pub extern fn litelib_initialize_existing(dangerous: bool, server: *const c_char) -> *mut c_char {
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ extern "C" {
|
|||||||
|
|
||||||
extern bool litelib_wallet_exists (const char* chain_name);
|
extern bool litelib_wallet_exists (const char* chain_name);
|
||||||
extern char * litelib_initialize_new (bool dangerous, const char* server);
|
extern char * litelib_initialize_new (bool dangerous, const char* server);
|
||||||
|
extern char * litelib_initialize_new_from_phrase
|
||||||
|
(bool dangerous, const char* server, const char* seed,
|
||||||
|
unsigned long long birthday);
|
||||||
extern char * litelib_initialize_existing (bool dangerous, const char* server);
|
extern char * litelib_initialize_existing (bool dangerous, const char* server);
|
||||||
extern char * litelib_execute (const char* s, const char* args);
|
extern char * litelib_execute (const char* s, const char* args);
|
||||||
extern void litelib_rust_free_string (char* s);
|
extern void litelib_rust_free_string (char* s);
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ bool NewSeedPage::validatePage() {
|
|||||||
auto parsed = json::parse(reply.toStdString().c_str(), nullptr, false);
|
auto parsed = json::parse(reply.toStdString().c_str(), nullptr, false);
|
||||||
if (parsed.is_discarded() || parsed.is_null() || parsed.find("result") == parsed.end()) {
|
if (parsed.is_discarded() || parsed.is_null() || parsed.find("result") == parsed.end()) {
|
||||||
QMessageBox::warning(this, tr("Failed to save wallet"),
|
QMessageBox::warning(this, tr("Failed to save wallet"),
|
||||||
tr("Couldn't save the wallet. Error") + "\n" + reply,
|
tr("Couldn't save the wallet") + "\n" + reply,
|
||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
@@ -112,6 +112,8 @@ bool NewSeedPage::validatePage() {
|
|||||||
|
|
||||||
|
|
||||||
RestoreSeedPage::RestoreSeedPage(FirstTimeWizard *parent) : QWizardPage(parent) {
|
RestoreSeedPage::RestoreSeedPage(FirstTimeWizard *parent) : QWizardPage(parent) {
|
||||||
|
this->parent = parent;
|
||||||
|
|
||||||
setTitle("Restore wallet from seed");
|
setTitle("Restore wallet from seed");
|
||||||
|
|
||||||
QWidget* pageWidget = new QWidget();
|
QWidget* pageWidget = new QWidget();
|
||||||
@@ -125,11 +127,25 @@ RestoreSeedPage::RestoreSeedPage(FirstTimeWizard *parent) : QWizardPage(parent)
|
|||||||
|
|
||||||
bool RestoreSeedPage::validatePage() {
|
bool RestoreSeedPage::validatePage() {
|
||||||
// 1. Validate that we do have 24 words
|
// 1. Validate that we do have 24 words
|
||||||
QString seed = form.txtSeed->toPlainText();
|
QString seed = form.txtSeed->toPlainText().replace(QRegExp("[ \n\r]+"), " ");
|
||||||
if (seed.trimmed().split(QRegExp("[ \n\r]+")).length() != 24) {
|
if (seed.trimmed().split(" ").length() != 24) {
|
||||||
QMessageBox::warning(this, tr("Failed to restore wallet"),
|
QMessageBox::warning(this, tr("Failed to restore wallet"),
|
||||||
tr("Zecwallet needs 24 words to restore wallet"),
|
tr("Zecwallet needs 24 words to restore wallet"),
|
||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 2. Attempt to restore wallet with the seed phrase
|
||||||
|
char* resp = litelib_initialize_new_from_phrase(parent->dangerous, parent->server.toStdString().c_str(),
|
||||||
|
seed.toStdString().c_str(), 0);
|
||||||
|
QString reply = litelib_process_response(resp);
|
||||||
|
|
||||||
|
if (reply.toUpper().trimmed() != "OK") {
|
||||||
|
QMessageBox::warning(this, tr("Failed to restore wallet"),
|
||||||
|
tr("Couldn't restore the wallet") + "\n" + reply,
|
||||||
|
QMessageBox::Ok);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -52,9 +52,12 @@ private:
|
|||||||
class RestoreSeedPage: public QWizardPage {
|
class RestoreSeedPage: public QWizardPage {
|
||||||
public:
|
public:
|
||||||
RestoreSeedPage(FirstTimeWizard* parent);
|
RestoreSeedPage(FirstTimeWizard* parent);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool validatePage();
|
bool validatePage();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
FirstTimeWizard* parent;
|
||||||
Ui_RestoreSeedForm form;
|
Ui_RestoreSeedForm form;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user