From 2ce6a80fba431c8ad57497c7dbf77d2b0c3b3883 Mon Sep 17 00:00:00 2001 From: tobtoht Date: Sun, 5 Sep 2021 15:22:06 +0200 Subject: [PATCH] Support all seed languages for 25 word seeds --- src/WindowManager.cpp | 2 +- src/WindowManager.h | 2 +- src/assets.qrc | 1 - src/assets/mnemonic_25_english.txt | 1626 -------------------------- src/wizard/PageWalletRestoreSeed.cpp | 45 +- src/wizard/PageWalletRestoreSeed.h | 7 +- src/wizard/PageWalletRestoreSeed.ui | 12 + src/wizard/WalletWizard.cpp | 2 +- src/wizard/WalletWizard.h | 4 +- 9 files changed, 55 insertions(+), 1646 deletions(-) delete mode 100644 src/assets/mnemonic_25_english.txt diff --git a/src/WindowManager.cpp b/src/WindowManager.cpp index 70e34fb..c4c6025 100644 --- a/src/WindowManager.cpp +++ b/src/WindowManager.cpp @@ -212,7 +212,7 @@ bool WindowManager::autoOpenWallet() { // ######################## WALLET CREATION ######################## -void WindowManager::tryCreateWallet(FeatherSeed seed, const QString &path, const QString &password, +void WindowManager::tryCreateWallet(FeatherSeed seed, const QString &path, const QString &password, const QString &seedLanguage, const QString &seedOffset) { if(Utils::fileExists(path)) { auto err = QString("Failed to write wallet to path: \"%1\"; file already exists.").arg(path); diff --git a/src/WindowManager.h b/src/WindowManager.h index bcba0a6..0fea535 100644 --- a/src/WindowManager.h +++ b/src/WindowManager.h @@ -45,7 +45,7 @@ private slots: void onWalletPassphraseNeeded(bool on_device); private: - void tryCreateWallet(FeatherSeed seed, const QString &path, const QString &password, const QString &seedOffset); + void tryCreateWallet(FeatherSeed seed, const QString &path, const QString &password, const QString &seedLanguage, const QString &seedOffset); void tryCreateWalletFromDevice(const QString &path, const QString &password, const QString &deviceName, int restoreHeight); void tryCreateWalletFromKeys(const QString &path, const QString &password, const QString &address, const QString &viewkey, const QString &spendkey, quint64 restoreHeight); diff --git a/src/assets.qrc b/src/assets.qrc index 4e81320..c251240 100644 --- a/src/assets.qrc +++ b/src/assets.qrc @@ -119,7 +119,6 @@ assets/images/xmrig.ico assets/images/xmrig.svg assets/images/zoom.png - assets/mnemonic_25_english.txt assets/restore_heights_monero_mainnet.txt assets/restore_heights_monero_stagenet.txt diff --git a/src/assets/mnemonic_25_english.txt b/src/assets/mnemonic_25_english.txt deleted file mode 100644 index 9b92e93..0000000 --- a/src/assets/mnemonic_25_english.txt +++ /dev/null @@ -1,1626 +0,0 @@ -abbey -abducts -ability -ablaze -abnormal -abort -abrasive -absorb -abyss -academy -aces -aching -acidic -acoustic -acquire -across -actress -acumen -adapt -addicted -adept -adhesive -adjust -adopt -adrenalin -adult -adventure -aerial -afar -affair -afield -afloat -afoot -afraid -after -against -agenda -aggravate -agile -aglow -agnostic -agony -agreed -ahead -aided -ailments -aimless -airport -aisle -ajar -akin -alarms -album -alchemy -alerts -algebra -alkaline -alley -almost -aloof -alpine -already -also -altitude -alumni -always -amaze -ambush -amended -amidst -ammo -amnesty -among -amply -amused -anchor -android -anecdote -angled -ankle -annoyed -answers -antics -anvil -anxiety -anybody -apart -apex -aphid -aplomb -apology -apply -apricot -aptitude -aquarium -arbitrary -archer -ardent -arena -argue -arises -army -around -arrow -arsenic -artistic -ascend -ashtray -aside -asked -asleep -aspire -assorted -asylum -athlete -atlas -atom -atrium -attire -auburn -auctions -audio -august -aunt -austere -autumn -avatar -avidly -avoid -awakened -awesome -awful -awkward -awning -awoken -axes -axis -axle -aztec -azure -baby -bacon -badge -baffles -bagpipe -bailed -bakery -balding -bamboo -banjo -baptism -basin -batch -bawled -bays -because -beer -befit -begun -behind -being -below -bemused -benches -berries -bested -betting -bevel -beware -beyond -bias -bicycle -bids -bifocals -biggest -bikini -bimonthly -binocular -biology -biplane -birth -biscuit -bite -biweekly -blender -blip -bluntly -boat -bobsled -bodies -bogeys -boil -boldly -bomb -border -boss -both -bounced -bovine -bowling -boxes -boyfriend -broken -brunt -bubble -buckets -budget -buffet -bugs -building -bulb -bumper -bunch -business -butter -buying -buzzer -bygones -byline -bypass -cabin -cactus -cadets -cafe -cage -cajun -cake -calamity -camp -candy -casket -catch -cause -cavernous -cease -cedar -ceiling -cell -cement -cent -certain -chlorine -chrome -cider -cigar -cinema -circle -cistern -citadel -civilian -claim -click -clue -coal -cobra -cocoa -code -coexist -coffee -cogs -cohesive -coils -colony -comb -cool -copy -corrode -costume -cottage -cousin -cowl -criminal -cube -cucumber -cuddled -cuffs -cuisine -cunning -cupcake -custom -cycling -cylinder -cynical -dabbing -dads -daft -dagger -daily -damp -dangerous -dapper -darted -dash -dating -dauntless -dawn -daytime -dazed -debut -decay -dedicated -deepest -deftly -degrees -dehydrate -deity -dejected -delayed -demonstrate -dented -deodorant -depth -desk -devoid -dewdrop -dexterity -dialect -dice -diet -different -digit -dilute -dime -dinner -diode -diplomat -directed -distance -ditch -divers -dizzy -doctor -dodge -does -dogs -doing -dolphin -domestic -donuts -doorway -dormant -dosage -dotted -double -dove -down -dozen -dreams -drinks -drowning -drunk -drying -dual -dubbed -duckling -dude -duets -duke -dullness -dummy -dunes -duplex -duration -dusted -duties -dwarf -dwelt -dwindling -dying -dynamite -dyslexic -each -eagle -earth -easy -eating -eavesdrop -eccentric -echo -eclipse -economics -ecstatic -eden -edgy -edited -educated -eels -efficient -eggs -egotistic -eight -either -eject -elapse -elbow -eldest -eleven -elite -elope -else -eluded -emails -ember -emerge -emit -emotion -empty -emulate -energy -enforce -enhanced -enigma -enjoy -enlist -enmity -enough -enraged -ensign -entrance -envy -epoxy -equip -erase -erected -erosion -error -eskimos -espionage -essential -estate -etched -eternal -ethics -etiquette -evaluate -evenings -evicted -evolved -examine -excess -exhale -exit -exotic -exquisite -extra -exult -fabrics -factual -fading -fainted -faked -fall -family -fancy -farming -fatal -faulty -fawns -faxed -fazed -feast -february -federal -feel -feline -females -fences -ferry -festival -fetches -fever -fewest -fiat -fibula -fictional -fidget -fierce -fifteen -fight -films -firm -fishing -fitting -five -fixate -fizzle -fleet -flippant -flying -foamy -focus -foes -foggy -foiled -folding -fonts -foolish -fossil -fountain -fowls -foxes -foyer -framed -friendly -frown -fruit -frying -fudge -fuel -fugitive -fully -fuming -fungal -furnished -fuselage -future -fuzzy -gables -gadget -gags -gained -galaxy -gambit -gang -gasp -gather -gauze -gave -gawk -gaze -gearbox -gecko -geek -gels -gemstone -general -geometry -germs -gesture -getting -geyser -ghetto -ghost -giant -giddy -gifts -gigantic -gills -gimmick -ginger -girth -giving -glass -gleeful -glide -gnaw -gnome -goat -goblet -godfather -goes -goggles -going -goldfish -gone -goodbye -gopher -gorilla -gossip -gotten -gourmet -governing -gown -greater -grunt -guarded -guest -guide -gulp -gumball -guru -gusts -gutter -guys -gymnast -gypsy -gyrate -habitat -hacksaw -haggled -hairy -hamburger -happens -hashing -hatchet -haunted -having -hawk -haystack -hazard -hectare -hedgehog -heels -hefty -height -hemlock -hence -heron -hesitate -hexagon -hickory -hiding -highway -hijack -hiker -hills -himself -hinder -hippo -hire -history -hitched -hive -hoax -hobby -hockey -hoisting -hold -honked -hookup -hope -hornet -hospital -hotel -hounded -hover -howls -hubcaps -huddle -huge -hull -humid -hunter -hurried -husband -huts -hybrid -hydrogen -hyper -iceberg -icing -icon -identity -idiom -idled -idols -igloo -ignore -iguana -illness -imagine -imbalance -imitate -impel -inactive -inbound -incur -industrial -inexact -inflamed -ingested -initiate -injury -inkling -inline -inmate -innocent -inorganic -input -inquest -inroads -insult -intended -inundate -invoke -inwardly -ionic -irate -iris -irony -irritate -island -isolated -issued -italics -itches -items -itinerary -itself -ivory -jabbed -jackets -jaded -jagged -jailed -jamming -january -jargon -jaunt -javelin -jaws -jazz -jeans -jeers -jellyfish -jeopardy -jerseys -jester -jetting -jewels -jigsaw -jingle -jittery -jive -jobs -jockey -jogger -joining -joking -jolted -jostle -journal -joyous -jubilee -judge -juggled -juicy -jukebox -july -jump -junk -jury -justice -juvenile -kangaroo -karate -keep -kennel -kept -kernels -kettle -keyboard -kickoff -kidneys -king -kiosk -kisses -kitchens -kiwi -knapsack -knee -knife -knowledge -knuckle -koala -laboratory -ladder -lagoon -lair -lakes -lamb -language -laptop -large -last -later -launching -lava -lawsuit -layout -lazy -lectures -ledge -leech -left -legion -leisure -lemon -lending -leopard -lesson -lettuce -lexicon -liar -library -licks -lids -lied -lifestyle -light -likewise -lilac -limits -linen -lion -lipstick -liquid -listen -lively -loaded -lobster -locker -lodge -lofty -logic -loincloth -long -looking -lopped -lordship -losing -lottery -loudly -love -lower -loyal -lucky -luggage -lukewarm -lullaby -lumber -lunar -lurk -lush -luxury -lymph -lynx -lyrics -macro -madness -magically -mailed -major -makeup -malady -mammal -maps -masterful -match -maul -maverick -maximum -mayor -maze -meant -mechanic -medicate -meeting -megabyte -melting -memoir -menu -merger -mesh -metro -mews -mice -midst -mighty -mime -mirror -misery -mittens -mixture -moat -mobile -mocked -mohawk -moisture -molten -moment -money -moon -mops -morsel -mostly -motherly -mouth -movement -mowing -much -muddy -muffin -mugged -mullet -mumble -mundane -muppet -mural -musical -muzzle -myriad -mystery -myth -nabbing -nagged -nail -names -nanny -napkin -narrate -nasty -natural -nautical -navy -nearby -necklace -needed -negative -neither -neon -nephew -nerves -nestle -network -neutral -never -newt -nexus -nibs -niche -niece -nifty -nightly -nimbly -nineteen -nirvana -nitrogen -nobody -nocturnal -nodes -noises -nomad -noodles -northern -nostril -noted -nouns -novelty -nowhere -nozzle -nuance -nucleus -nudged -nugget -nuisance -null -number -nuns -nurse -nutshell -nylon -oaks -oars -oasis -oatmeal -obedient -object -obliged -obnoxious -observant -obtains -obvious -occur -ocean -october -odds -odometer -offend -often -oilfield -ointment -okay -older -olive -olympics -omega -omission -omnibus -onboard -oncoming -oneself -ongoing -onion -online -onslaught -onto -onward -oozed -opacity -opened -opposite -optical -opus -orange -orbit -orchid -orders -organs -origin -ornament -orphans -oscar -ostrich -otherwise -otter -ouch -ought -ounce -ourselves -oust -outbreak -oval -oven -owed -owls -owner -oxidant -oxygen -oyster -ozone -pact -paddles -pager -pairing -palace -pamphlet -pancakes -paper -paradise -pastry -patio -pause -pavements -pawnshop -payment -peaches -pebbles -peculiar -pedantic -peeled -pegs -pelican -pencil -people -pepper -perfect -pests -petals -phase -pheasants -phone -phrases -physics -piano -picked -pierce -pigment -piloted -pimple -pinched -pioneer -pipeline -pirate -pistons -pitched -pivot -pixels -pizza -playful -pledge -pliers -plotting -plus -plywood -poaching -pockets -podcast -poetry -point -poker -polar -ponies -pool -popular -portents -possible -potato -pouch -poverty -powder -pram -present -pride -problems -pruned -prying -psychic -public -puck -puddle -puffin -pulp -pumpkins -punch -puppy -purged -push -putty -puzzled -pylons -pyramid -python -queen -quick -quote -rabbits -racetrack -radar -rafts -rage -railway -raking -rally -ramped -randomly -rapid -rarest -rash -rated -ravine -rays -razor -react -rebel -recipe -reduce -reef -refer -regular -reheat -reinvest -rejoices -rekindle -relic -remedy -renting -reorder -repent -request -reruns -rest -return -reunion -revamp -rewind -rhino -rhythm -ribbon -richly -ridges -rift -rigid -rims -ringing -riots -ripped -rising -ritual -river -roared -robot -rockets -rodent -rogue -roles -romance -roomy -roped -roster -rotate -rounded -rover -rowboat -royal -ruby -rudely -ruffled -rugged -ruined -ruling -rumble -runway -rural -rustled -ruthless -sabotage -sack -sadness -safety -saga -sailor -sake -salads -sample -sanity -sapling -sarcasm -sash -satin -saucepan -saved -sawmill -saxophone -sayings -scamper -scenic -school -science -scoop -scrub -scuba -seasons -second -sedan -seeded -segments -seismic -selfish -semifinal -sensible -september -sequence -serving -session -setup -seventh -sewage -shackles -shelter -shipped -shocking -shrugged -shuffled -shyness -siblings -sickness -sidekick -sieve -sifting -sighting -silk -simplest -sincerely -sipped -siren -situated -sixteen -sizes -skater -skew -skirting -skulls -skydive -slackens -sleepless -slid -slower -slug -smash -smelting -smidgen -smog -smuggled -snake -sneeze -sniff -snout -snug -soapy -sober -soccer -soda -software -soggy -soil -solved -somewhere -sonic -soothe -soprano -sorry -southern -sovereign -sowed -soya -space -speedy -sphere -spiders -splendid -spout -sprig -spud -spying -square -stacking -stellar -stick -stockpile -strained -stunning -stylishly -subtly -succeed -suddenly -suede -suffice -sugar -suitcase -sulking -summon -sunken -superior -surfer -sushi -suture -swagger -swept -swiftly -sword -swung -syllabus -symptoms -syndrome -syringe -system -taboo -tacit -tadpoles -tagged -tail -taken -talent -tamper -tanks -tapestry -tarnished -tasked -tattoo -taunts -tavern -tawny -taxi -teardrop -technical -tedious -teeming -tell -template -tender -tepid -tequila -terminal -testing -tether -textbook -thaw -theatrics -thirsty -thorn -threaten -thumbs -thwart -ticket -tidy -tiers -tiger -tilt -timber -tinted -tipsy -tirade -tissue -titans -toaster -tobacco -today -toenail -toffee -together -toilet -token -tolerant -tomorrow -tonic -toolbox -topic -torch -tossed -total -touchy -towel -toxic -toyed -trash -trendy -tribal -trolling -truth -trying -tsunami -tubes -tucks -tudor -tuesday -tufts -tugs -tuition -tulips -tumbling -tunnel -turnip -tusks -tutor -tuxedo -twang -tweezers -twice -twofold -tycoon -typist -tyrant -ugly -ulcers -ultimate -umbrella -umpire -unafraid -unbending -uncle -under -uneven -unfit -ungainly -unhappy -union -unjustly -unknown -unlikely -unmask -unnoticed -unopened -unplugs -unquoted -unrest -unsafe -until -unusual -unveil -unwind -unzip -upbeat -upcoming -update -upgrade -uphill -upkeep -upload -upon -upper -upright -upstairs -uptight -upwards -urban -urchins -urgent -usage -useful -usher -using -usual -utensils -utility -utmost -utopia -uttered -vacation -vague -vain -value -vampire -vane -vapidly -vary -vastness -vats -vaults -vector -veered -vegan -vehicle -vein -velvet -venomous -verification -vessel -veteran -vexed -vials -vibrate -victim -video -viewpoint -vigilant -viking -village -vinegar -violin -vipers -virtual -visited -vitals -vivid -vixen -vocal -vogue -voice -volcano -vortex -voted -voucher -vowels -voyage -vulture -wade -waffle -wagtail -waist -waking -wallets -wanted -warped -washing -water -waveform -waxing -wayside -weavers -website -wedge -weekday -weird -welders -went -wept -were -western -wetsuit -whale -when -whipped -whole -wickets -width -wield -wife -wiggle -wildly -winter -wipeout -wiring -wise -withdrawn -wives -wizard -wobbly -woes -woken -wolf -womanly -wonders -woozy -worry -wounded -woven -wrap -wrist -wrong -yacht -yahoo -yanks -yard -yawning -yearbook -yellow -yesterday -yeti -yields -yodel -yoga -younger -yoyo -zapped -zeal -zebra -zero -zesty -zigzags -zinger -zippers -zodiac -zombie -zones -zoom \ No newline at end of file diff --git a/src/wizard/PageWalletRestoreSeed.cpp b/src/wizard/PageWalletRestoreSeed.cpp index f912856..db94b3f 100644 --- a/src/wizard/PageWalletRestoreSeed.cpp +++ b/src/wizard/PageWalletRestoreSeed.cpp @@ -12,13 +12,27 @@ #include "utils/FeatherSeed.h" #include "constants.h" +#include + PageWalletRestoreSeed::PageWalletRestoreSeed(WizardFields *fields, QWidget *parent) : QWizardPage(parent) , ui(new Ui::PageWalletRestoreSeed) , m_fields(fields) { ui->setupUi(this); - ui->label_errorString->hide(); + + std::vector wordlists = crypto::ElectrumWords::get_language_list(); + for (const auto& wordlist: wordlists) { + QStringList words_qt; + std::vector words_std = wordlist->get_word_list(); + for (const auto& word: words_std) { + words_qt += QString::fromStdString(word); + } + + QString language = QString::fromStdString(wordlist->get_english_language_name()); + ui->combo_seedLanguage->addItem(language); + m_wordlists[language] = words_qt; + } QStringList bip39English; for (int i = 0; i != 2048; i++) @@ -27,26 +41,18 @@ PageWalletRestoreSeed::PageWalletRestoreSeed(WizardFields *fields, QWidget *pare // (illegible word with a known location). This can be tested by replacing a word with xxxx bip39English << "xxxx"; - QByteArray data = Utils::fileOpen(":/assets/mnemonic_25_english.txt"); - QStringList moneroEnglish; - for (const auto &seed_word: data.split('\n')) - moneroEnglish << seed_word; - m_tevador.length = 14; m_tevador.setWords(bip39English); m_legacy.length = 25; - m_legacy.setWords(moneroEnglish); + m_legacy.setWords(m_wordlists["English"]); + ui->combo_seedLanguage->setCurrentText("English"); ui->seedEdit->setAcceptRichText(false); ui->seedEdit->setMaximumHeight(150); -#ifndef QT_NO_CURSOR - QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - QGuiApplication::restoreOverrideCursor(); -#endif - connect(ui->seedBtnGroup, QOverload::of(&QButtonGroup::buttonClicked), this, &PageWalletRestoreSeed::onSeedTypeToggled); + connect(ui->combo_seedLanguage, &QComboBox::currentTextChanged, this, &PageWalletRestoreSeed::onSeedLanguageChanged); this->onSeedTypeToggled(); } @@ -56,11 +62,13 @@ void PageWalletRestoreSeed::onSeedTypeToggled() { m_mode = &m_tevador; m_fields->seedType = SeedType::TEVADOR; ui->seedEdit->setPlaceholderText("Enter 14 word seed.."); + ui->group_seedLanguage->hide(); } else if (ui->radio25->isChecked()) { m_mode = &m_legacy; m_fields->seedType = SeedType::MONERO; ui->seedEdit->setPlaceholderText("Enter 25 word seed.."); + ui->group_seedLanguage->show(); } ui->label_errorString->hide(); @@ -69,6 +77,11 @@ void PageWalletRestoreSeed::onSeedTypeToggled() { ui->seedEdit->setText(""); } +void PageWalletRestoreSeed::onSeedLanguageChanged(const QString &language) { + m_legacy.setWords(m_wordlists[language]); + m_fields->seedLanguage = language; +} + int PageWalletRestoreSeed::nextId() const { if (m_mode == &m_legacy) { return WalletWizard::Page_SetRestoreHeight; @@ -100,8 +113,14 @@ bool PageWalletRestoreSeed::validatePage() { return false; } + // libwallet will accept e.g. "brötchen" or "BRÖTCHEN" instead of "Brötchen" + QStringList lowercaseWords; + for (const auto &word : m_mode->words) { + lowercaseWords << word.toLower(); + } + for (const auto &word : seedSplit) { - if (!m_mode->words.contains(word)) { + if (!lowercaseWords.contains(word.toLower())) { ui->label_errorString->show(); ui->label_errorString->setText(QString("Mnemonic seed contains an unknown word: %1").arg(word)); ui->seedEdit->setStyleSheet(errStyle); diff --git a/src/wizard/PageWalletRestoreSeed.h b/src/wizard/PageWalletRestoreSeed.h index f2d8971..2c0ebe4 100644 --- a/src/wizard/PageWalletRestoreSeed.h +++ b/src/wizard/PageWalletRestoreSeed.h @@ -32,8 +32,8 @@ private: seedType() { completer.setModel(&completerModel); - completer.setModelSorting(QCompleter::CaseInsensitivelySortedModel); - completer.setCaseSensitivity(Qt::CaseInsensitive); + completer.setModelSorting(QCompleter::CaseSensitivelySortedModel); + completer.setCaseSensitivity(Qt::CaseSensitive); completer.setWrapAround(false); } @@ -49,6 +49,7 @@ private: }; void onSeedTypeToggled(); + void onSeedLanguageChanged(const QString &language); Ui::PageWalletRestoreSeed *ui; WizardFields *m_fields; @@ -57,6 +58,8 @@ private: seedType m_legacy; seedType *m_mode; + + QMap m_wordlists; }; #endif diff --git a/src/wizard/PageWalletRestoreSeed.ui b/src/wizard/PageWalletRestoreSeed.ui index 7f3f5c5..3e62d38 100644 --- a/src/wizard/PageWalletRestoreSeed.ui +++ b/src/wizard/PageWalletRestoreSeed.ui @@ -46,6 +46,18 @@ + + + + Select seed language: + + + + + + + + diff --git a/src/wizard/WalletWizard.cpp b/src/wizard/WalletWizard.cpp index 2529ed2..2478230 100644 --- a/src/wizard/WalletWizard.cpp +++ b/src/wizard/WalletWizard.cpp @@ -127,5 +127,5 @@ void WalletWizard::onCreateWallet() { if (m_wizardFields.mode == WizardMode::RestoreFromSeed && m_wizardFields.seedType == SeedType::MONERO) seed.setRestoreHeight(m_wizardFields.restoreHeight); - emit createWallet(seed, walletPath, m_wizardFields.password, m_wizardFields.seedOffsetPassphrase); + emit createWallet(seed, walletPath, m_wizardFields.password, m_wizardFields.seedLanguage, m_wizardFields.seedOffsetPassphrase); } diff --git a/src/wizard/WalletWizard.h b/src/wizard/WalletWizard.h index 377ea38..d353a6e 100644 --- a/src/wizard/WalletWizard.h +++ b/src/wizard/WalletWizard.h @@ -12,6 +12,7 @@ #include "model/WalletKeysFilesModel.h" #include "utils/RestoreHeightLookup.h" #include "utils/config.h" +#include "constants.h" enum WizardMode { CreateWallet = 0, @@ -32,6 +33,7 @@ struct WizardFields { QString walletDir; QString seed; QString seedOffsetPassphrase; + QString seedLanguage = constants::seedLanguage; QString password; QString modeText; QString address; @@ -72,7 +74,7 @@ signals: void createWalletFromDevice(const QString &path, const QString &password, const QString &deviceName, int restoreHeight); void createWalletFromKeys(const QString &path, const QString &password, const QString &address, const QString &viewkey, const QString &spendkey, quint64 restoreHeight, bool deterministic = false); - void createWallet(FeatherSeed seed, const QString &path, const QString &password, const QString &seedOffset = ""); + void createWallet(FeatherSeed seed, const QString &path, const QString &password, const QString &seedLanguage, const QString &seedOffset = ""); private slots: void onCreateWallet();