aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-11-28 15:43:30 -0800
committerAdam Soltys <[email protected]>2023-11-28 15:43:30 -0800
commit60735521a3549089f639fdefb921030c23a4d74b (patch)
tree753032f11e0faed78902dcdc77cd17f3b4b617a7 /src
parenteee8f9327d2eb5926d9017792e2b45d96e74e417 (diff)
downloadcoinos-ui-60735521a3549089f639fdefb921030c23a4d74b.tar.gz
coinos-ui-60735521a3549089f639fdefb921030c23a4d74b.zip
nostr key reveal
Diffstat (limited to 'src')
-rw-r--r--src/lib/nostr.js6
-rw-r--r--src/locales/en.json7
-rw-r--r--src/routes/(app)/[username]/settings/[...tab]/_security.svelte53
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>