diff options
| author | Adam Soltys <[email protected]> | 2023-11-28 15:43:30 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-11-28 15:43:30 -0800 |
| commit | 60735521a3549089f639fdefb921030c23a4d74b (patch) | |
| tree | 753032f11e0faed78902dcdc77cd17f3b4b617a7 /src | |
| parent | eee8f9327d2eb5926d9017792e2b45d96e74e417 (diff) | |
| download | coinos-ui-60735521a3549089f639fdefb921030c23a4d74b.tar.gz coinos-ui-60735521a3549089f639fdefb921030c23a4d74b.zip | |
nostr key reveal
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/nostr.js | 6 | ||||
| -rw-r--r-- | src/locales/en.json | 7 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/settings/[...tab]/_security.svelte | 53 |
3 files changed, 61 insertions, 5 deletions
diff --git a/src/lib/nostr.js b/src/lib/nostr.js index 28dbe50f..c2634c83 100644 --- a/src/lib/nostr.js +++ b/src/lib/nostr.js @@ -3,7 +3,7 @@ import { Buffer } from 'buffer'; import { fail, wait, post, stretch } from '$lib/utils'; import { decrypted, password as pw, passwordPrompt, pin, loginRedirect } from '$lib/store'; import { goto, invalidate } from '$app/navigation'; -import { getPublicKey, signEvent, getEventHash, nip04, nip06 } from 'nostr-tools'; +import { getPublicKey, signEvent, getEventHash, nip04, nip06, nip19 } from 'nostr-tools'; import { mnemonicToEntropy, entropyToMnemonic } from '@scure/bip39'; import wordlist from '$lib/english'; import { bech32m } from '@scure/base'; @@ -92,6 +92,10 @@ let getPrivateKey = async (user) => { return privateKeyFromSeedWords(await getMnemonic(user)); }; +export let getNsec = async (user) => { + return nip19.nsecEncode(await getPrivateKey(user)); +}; + export let sign = async ({ event, user }) => { event.id = getEventHash(event); event.sig = signEvent(event, await getPrivateKey(user)); diff --git a/src/locales/en.json b/src/locales/en.json index 2e7b2079..608668a9 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -197,6 +197,13 @@ "placeholder": "Paste a bitcoin address, lightning invoice or coinos username" }, "settings": { + "seedPhrase": "Seed phrase", + "nostrKeys": "Nostr key", + "nostrDescription": "Your nostr key is used to sign and decrypt messages, keep it safe or someone may be able to impersonate you.", + "seedDescription": "This 12 word seed phrase is used to derive your nostr private key and your self-custodial wallet keys which determine your auto-withdrawal addresses. Back it up and don't let anyone see it.", + "emailDescription": "For password resets and notifications", + "hideNsec": "Hide nostr secret key", + "revealNsec": "Reveal nostr secret key", "hideSeed": "Hide seed phrase", "revealSeed": "Reveal seed phrase", "saveSettings": "Save Settings", diff --git a/src/routes/(app)/[username]/settings/[...tab]/_security.svelte b/src/routes/(app)/[username]/settings/[...tab]/_security.svelte index 170df744..113f7d7e 100644 --- a/src/routes/(app)/[username]/settings/[...tab]/_security.svelte +++ b/src/routes/(app)/[username]/settings/[...tab]/_security.svelte @@ -1,5 +1,5 @@ <script> - import { getMnemonic } from '$lib/nostr'; + import { getMnemonic, getNsec } from '$lib/nostr'; import { tick } from 'svelte'; import { t } from '$lib/translations'; import { Pin, Icon, Qr } from '$comp'; @@ -14,21 +14,36 @@ disabling2fa, locked, mnemonic, + nsec, old, otp, password, pin, revealPassword, revealSeed, + revealNsec, token = '', setting2fa, settingPin, verify; + let toggleNsec = async () => { + try { + nsec = await getNsec(user); + revealNsec = !revealNsec; + } catch (e) { + console.log(e); + } + }; + let togglePassword = () => (revealPassword = !revealPassword); let toggleSeed = async () => { - mnemonic = await getMnemonic(user); - revealSeed = !revealSeed; + try { + mnemonic = await getMnemonic(user); + revealSeed = !revealSeed; + } catch (e) { + console.log(e); + } }; $: verifying = pin?.length > 5; @@ -223,7 +238,13 @@ </select> </div> -<div class="space-y-5"> +<div> + <label for="seedphrase" class="font-bold">{$t('user.settings.seedPhrase')}</label> + + <p class="text-secondary mb-1"> + {$t('user.settings.seedDescription')} + </p> + <button type="button" class="primary" on:click={toggleSeed}> <Icon icon="warning" style="mr-1 w-6 my-auto" /> {revealSeed ? $t('user.settings.hideSeed') : $t('user.settings.revealSeed')} @@ -240,3 +261,27 @@ </button> {/if} </div> + +<div> + <label for="seedphrase" class="font-bold">{$t('user.settings.nostrKeys')}</label> + + <p class="text-secondary mb-1"> + {$t('user.settings.nostrDescription')} + </p> + + <button type="button" class="primary" on:click={toggleNsec}> + <Icon icon="warning" style="mr-1 w-6 my-auto" /> + {revealNsec ? $t('user.settings.hideNsec') : $t('user.settings.revealNsec')} + </button> + + {#if revealNsec} + <div class="text-lg break-all"> + {nsec} + </div> + + <button type="button" class="primary" on:click={() => copy(nsec)}> + <Icon icon="copy" style="mr-1 w-6 my-auto" /> + Copy + </button> + {/if} +</div> |
