aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/app.js12
-rw-r--r--src/features/sync.js89
-rw-r--r--src/i18n.js11
-rw-r--r--src/locales/ar.json7
-rw-r--r--src/locales/bn.json7
-rw-r--r--src/locales/de.json7
-rw-r--r--src/locales/es.json7
-rw-r--r--src/locales/fr.json7
-rw-r--r--src/locales/hi.json7
-rw-r--r--src/locales/id.json7
-rw-r--r--src/locales/ja.json7
-rw-r--r--src/locales/ko.json7
-rw-r--r--src/locales/mr.json7
-rw-r--r--src/locales/pt.json7
-rw-r--r--src/locales/ru.json7
-rw-r--r--src/locales/sw.json7
-rw-r--r--src/locales/ta.json7
-rw-r--r--src/locales/te.json7
-rw-r--r--src/locales/tr.json7
-rw-r--r--src/locales/ur.json7
-rw-r--r--src/locales/vi.json7
-rw-r--r--src/locales/zh.json7
-rw-r--r--src/nostr.js25
23 files changed, 43 insertions, 227 deletions
diff --git a/src/app.js b/src/app.js
index 29bea21..8c70f89 100644
--- a/src/app.js
+++ b/src/app.js
@@ -77,7 +77,6 @@ const ui = {
pubkeyShown: false, // account public key revealed in Settings
giftMode: false, // gift sub-view active on the Send page
giftAmount: '', // gift-create amount input
- giftClaimCode: null, // the one-time claim code DM'd to the recipient (fallback)
viewGift: null, // re-viewing a previously created gift's link/QR { code, locked, amount, claimCode }
claimChoose: null, // opening a gift with existing wallets present: { code } — pick a target
giftCode: null, // last-created gift PSBT code
@@ -1861,16 +1860,6 @@ function pubkeyCard(a) {
);
}
-// Nostr address — share it so others can send you locked gifts.
-function nostrNpubCard(a) {
- if (a.id !== activeId || !wallet.nostrNpub || !wallet.nostrNpub()) return null;
- return h('div', { class: 'card col' },
- h('h3', {}, t('nostrKeyTitle')),
- h('p', { class: 'small muted', style: 'margin:0' }, t('nostrKeyDesc')),
- h('div', { class: 'addr-box break', style: 'font-size:12px' }, wallet.nostrNpub()),
- copyBtn(wallet.nostrNpub(), t('copyKey')));
-}
-
function autolockCard(a) {
return h('div', { class: 'card col' },
h('h3', {}, t('autolockTitle')),
@@ -1892,7 +1881,6 @@ function accountSettingsScreen() {
walletNameCard(a),
pubkeyCard(a),
recoveryCard(a),
- nostrNpubCard(a),
autolockCard(a),
h('button', { class: 'btn-ghost btn-block', onClick: () => { ui.editLabel = null; ui.revealShown = false; ui.pubkeyShown = false; ui.loadSeed = null; goBack(() => { ui.screen = 'accounts'; }); } }, t('back'))
);
diff --git a/src/features/sync.js b/src/features/sync.js
index 96616c9..481dda9 100644
--- a/src/features/sync.js
+++ b/src/features/sync.js
@@ -6,7 +6,8 @@
import {
NostrSync, getSyncConfig, setSyncConfig, npubOf, syncDtag, deviceDtag,
domainDtag, isOurDtag, isCoreDtag, isOwnDeviceDtag,
- fetchNostrProfile, PROFILE_RELAYS,
+ fetchNostrProfile, PROFILE_RELAYS, DEFAULT_SYNC_RELAYS, queryOn, publishOn,
+ finalizeEvent,
} from '../nostr.js';
import { t } from '../i18n.js';
@@ -62,9 +63,6 @@ export function installSyncWallet(wallet) {
nostrNpub() { const pk = this.nostrPubkey(); return pk ? npubOf(pk) : null; },
// Send a nostr DM (e.g. a locked gift's claim code) to a recipient pubkey.
- async sendNostrDM(recipientPkHex, text) {
- return this.nostr && this.nostr.sk ? this.nostr.sendDM(recipientPkHex, text) : false;
- },
// Generic event publish/fetch on the configured sync relays — the seam
// other features (ark zaps) use to speak their own kinds. No-ops when
@@ -154,7 +152,44 @@ export function installSyncWallet(wallet) {
if (wallet.mnemonic) wallet.nostr.load(wallet.mnemonic, wallet.passphrase);
else wallet.nostr.unload();
wallet._syncPubSeen = {}; // a new identity has published nothing yet
+ adoptSyncRelays().catch(() => {});
});
+
+ // Sync rides the user's own relays: their NIP-65 (kind 10002) write set —
+ // the login npub's first, else the wallet key's — falling back to the
+ // coinos relay. A wallet key with no NIP-65 gets one published (default
+ // relay, signed silently) so other clients can find this identity's events.
+ async function adoptSyncRelays() {
+ if (wallet.offline || !wallet.nostr.pk) return;
+ const pks = [];
+ try {
+ const login = wallet.loadFeatureState('nostrlogin', {});
+ if (login && /^[0-9a-f]{64}$/.test(login.pubkey || '')) pks.push(login.pubkey);
+ } catch {}
+ pks.push(wallet.nostr.pk);
+ const evs = await queryOn([...new Set([...PROFILE_RELAYS, ...DEFAULT_SYNC_RELAYS])], { kinds: [10002], authors: pks }, 3500);
+ const newestFor = (pk) => evs.filter((e) => e.pubkey === pk).sort((a, b) => b.created_at - a.created_at)[0];
+ const writeRelays = (e) => e.tags
+ .filter((x) => x[0] === 'r' && x[1] && (!x[2] || x[2] === 'write'))
+ .map((x) => x[1].trim()).filter((r) => /^wss?:\/\//.test(r)).slice(0, 4);
+ for (const pk of pks) {
+ const e = newestFor(pk);
+ const relays = e && writeRelays(e);
+ if (relays && relays.length) {
+ setSyncConfig({ enabled: true, relays: [...new Set([...relays, ...DEFAULT_SYNC_RELAYS])].slice(0, 5) });
+ break;
+ }
+ }
+ // a brand-new wallet identity: announce its relays (NIP-65)
+ if (wallet.nostr.sk && !newestFor(wallet.nostr.pk)) {
+ const evt = finalizeEvent({
+ kind: 10002, content: '',
+ tags: DEFAULT_SYNC_RELAYS.map((r) => ['r', r]),
+ created_at: Math.floor(Date.now() / 1000),
+ }, wallet.nostr.sk);
+ publishOn([...new Set([...PROFILE_RELAYS, ...DEFAULT_SYNC_RELAYS])], evt);
+ }
+ }
// Live cross-device state: subscribe to ALL our devices' slots so a save on
// another device merges here within seconds. Merge-safe extension state (ark
// vtxos union) applies live; full snapshots stay a load-time affair. With
@@ -207,53 +242,7 @@ export function syncFeature(ctx) {
const { h, ui, render, wallet } = ctx;
installSyncWallet(wallet);
- // Cross-device sync settings: toggle + editable relay list (default coinos).
- function syncCard() {
- const cfg = getSyncConfig();
- const setEnabled = (enabled) => {
- if (enabled === cfg.enabled) return;
- setSyncConfig({ enabled, relays: cfg.relays });
- render();
- // On enable, pull anything newer from the relays, then push our copy up.
- if (enabled && !wallet.offline) {
- wallet.syncFromNostr().catch(() => {}).finally(() => wallet.saveCache());
- }
- };
- return h(
- 'div',
- { class: 'card col' },
- h('h3', {}, t('deviceSync')),
- h('p', { class: 'small muted', style: 'margin:0' }, t('deviceSyncDesc')),
- h('div', { class: 'row between' },
- h('span', { class: 'lab', style: 'margin:0' }, t('syncAcross')),
- h('div', { class: 'seg' },
- h('button', { type: 'button', class: cfg.enabled ? 'active' : '', onClick: () => setEnabled(true) }, t('syncOn')),
- h('button', { type: 'button', class: !cfg.enabled ? 'active' : '', onClick: () => setEnabled(false) }, t('syncOff'))
- )
- ),
- cfg.enabled
- ? h('label', { class: 'field' },
- h('span', { class: 'lab' }, t('relaysLabel')),
- h('textarea', {
- placeholder: 'wss://relay.example.com',
- autocapitalize: 'none', autocomplete: 'off', spellcheck: 'false',
- style: 'min-height:64px',
- value: cfg.relays.join('\n'),
- onInput: (e) => {
- const relays = e.target.value.split('\n').map((s) => s.trim()).filter(Boolean);
- setSyncConfig({ enabled: true, relays });
- },
- }),
- h('div', { class: 'small faint' }, t('relaysHint'))
- )
- : null
- );
- }
-
return {
id: 'sync',
- nostrSettingsCards() {
- return wallet.watchOnly || !wallet.mnemonic ? [] : [syncCard()];
- },
};
}
diff --git a/src/i18n.js b/src/i18n.js
index 5582493..550a231 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -131,7 +131,7 @@ const STR = {
hiwLn1: 'Your money sits in two places, like a savings account and the cash in your pocket. Savings is ordinary Bitcoin on the blockchain — safest for money you’re keeping, but each move costs a mining fee and waits for a confirmation. Spending sends and arrives instantly and free, and is still only yours: it runs on Ark, a newer layer on top of Bitcoin where every coin stays locked to your key, and it speaks Lightning, so you can pay and be paid by any bitcoin app or shop.',
hiwLn2: 'Move money either way under your balance — a small fee each direction, free inside Spending. The wallet handles all the upkeep on its own (just open the app now and then), and every coin in Spending carries a pre-signed escape route: even if the coinos server vanished, you could pull your money back on-chain yourself.',
hiwGiftsTitle: 'Gifts',
- hiwGifts1: 'You can gift bitcoin with a link: whoever opens it claims the coins into their own wallet — no app, no signup. On-chain gifts lock the coins until claimed and can be cancelled or reclaimed; Ark gifts claim instantly and free, even into a brand-new empty wallet. A gift can also be locked to a specific nostr account so only they can claim it.',
+ hiwGifts1: 'You can gift bitcoin with a link: whoever opens it claims the coins into their own wallet — no app, no signup. On-chain gifts lock the coins until claimed and can be cancelled or reclaimed; Ark gifts claim instantly and free, even into a brand-new empty wallet.',
moveMoney: 'Move money',
moveToSpending: 'Into Spending',
moveToSpendingDesc: 'Make money instantly spendable, with no fees to send it.',
@@ -306,8 +306,6 @@ const STR = {
giftConsolidateExplain: 'This gift would bundle {count} coins, making it costly for the recipient to claim. Splitting one coin first (~{fee}) gives them a clean single-input gift.',
giftConsolidateFirst: 'Split into one coin first',
giftUseManyCoins: 'Use {count} coins anyway',
- nostrKeyTitle: 'Nostr address',
- nostrKeyDesc: 'Share this so others can lock a gift to you — the claim code is sent here as a nostr DM.',
giftSplitExplain: 'This gift would lock {lock} until it’s claimed ({change} of it comes back to you then). You can split a right-sized coin first for about {fee} so only the gift amount stays locked.',
giftSplitFirst: 'Split a coin first',
giftLockWhole: 'Lock the whole coin ({n})',
@@ -582,13 +580,6 @@ const STR = {
lnZapHintPlain: 'Sent over Lightning (this address doesn’t support zap receipts).',
lnZapSentBody: 'Your zap is on its way — the swap provider pays it once the on-chain lockup confirms.',
lnZapFailed: 'Couldn’t complete the zap.',
- deviceSync: 'Device sync',
- deviceSyncDesc: 'Keep this wallet in sync across your devices by storing an encrypted copy on a Nostr relay — only a device with your seed can read it. Turn it off to keep everything on this device.',
- syncAcross: 'Sync across devices',
- syncOn: 'On',
- syncOff: 'Off',
- relaysLabel: 'Relays',
- relaysHint: 'One wss:// URL per line.',
language: 'Language',
darkMode: 'Dark mode',
lightMode: 'Light mode',
diff --git a/src/locales/ar.json b/src/locales/ar.json
index 2c8f1bb..3afc857 100644
--- a/src/locales/ar.json
+++ b/src/locales/ar.json
@@ -17,13 +17,6 @@
"explorerDesc": "الخادم الذي تستعلم منه هذه المحفظة عن الأرصدة والسجل. وجّهه إلى عقدتك الخاصة لأقصى قدر من الخصوصية.",
"explorerUrl": "عنوان الخادم",
"explorerUrlHint": "قاعدة REST لـ Esplora / electrs، مثلاً https://mempool.space/api",
- "deviceSync": "مزامنة الأجهزة",
- "deviceSyncDesc": "حافظ على تزامن هذه المحفظة عبر أجهزتك بتخزين نسخة مشفّرة على مُرحّل Nostr — لا يمكن قراءتها إلا لجهاز يملك بذرتك. أوقفها لإبقاء كل شيء على هذا الجهاز.",
- "syncAcross": "المزامنة عبر الأجهزة",
- "syncOn": "مفعّل",
- "syncOff": "متوقف",
- "relaysLabel": "المُرحّلات",
- "relaysHint": "عنوان wss:// واحد لكل سطر.",
"home": "الرئيسية",
"logout": "تسجيل الخروج",
"createNew": "إنشاء جديدة",
diff --git a/src/locales/bn.json b/src/locales/bn.json
index 39f4ffe..35a5249 100644
--- a/src/locales/bn.json
+++ b/src/locales/bn.json
@@ -17,13 +17,6 @@
"explorerDesc": "এই ওয়ালেট ব্যালেন্স ও ইতিহাসের জন্য যে সার্ভারে অনুসন্ধান করে। সর্বোচ্চ গোপনীয়তার জন্য এটি আপনার নিজের নোডে নির্দেশ করুন।",
"explorerUrl": "সার্ভার URL",
"explorerUrlHint": "Esplora / electrs REST বেস, যেমন https://mempool.space/api",
- "deviceSync": "ডিভাইস সিঙ্ক",
- "deviceSyncDesc": "একটি Nostr রিলেতে একটি এনক্রিপ্ট করা কপি সংরক্ষণ করে এই ওয়ালেটটি আপনার সব ডিভাইসে সিঙ্ক রাখুন — কেবল আপনার সিড আছে এমন একটি ডিভাইসই এটি পড়তে পারে। সবকিছু এই ডিভাইসে রাখতে এটি বন্ধ করে দিন।",
- "syncAcross": "ডিভাইসজুড়ে সিঙ্ক করুন",
- "syncOn": "চালু",
- "syncOff": "বন্ধ",
- "relaysLabel": "রিলে",
- "relaysHint": "প্রতি লাইনে একটি wss:// URL।",
"home": "হোম",
"logout": "লগ আউট",
"createNew": "নতুন তৈরি",
diff --git a/src/locales/de.json b/src/locales/de.json
index 59765b6..d3dac1b 100644
--- a/src/locales/de.json
+++ b/src/locales/de.json
@@ -17,13 +17,6 @@
"explorerDesc": "Der Server, den diese Wallet für Kontostände und Verlauf abfragt. Richte ihn auf deinen eigenen Node aus, um maximale Privatsphäre zu erreichen.",
"explorerUrl": "Server-URL",
"explorerUrlHint": "Esplora-/electrs-REST-Basis, z. B. https://mempool.space/api",
- "deviceSync": "Geräteabgleich",
- "deviceSyncDesc": "Halte diese Wallet über deine Geräte hinweg synchron, indem du eine verschlüsselte Kopie auf einem Nostr-Relay speicherst — nur ein Gerät mit deinem Seed kann sie lesen. Schalte ihn aus, um alles auf diesem Gerät zu behalten.",
- "syncAcross": "Über Geräte synchronisieren",
- "syncOn": "An",
- "syncOff": "Aus",
- "relaysLabel": "Relays",
- "relaysHint": "Eine wss://-URL pro Zeile.",
"home": "Start",
"logout": "Abmelden",
"createNew": "Neu erstellen",
diff --git a/src/locales/es.json b/src/locales/es.json
index f650b11..c0e8ade 100644
--- a/src/locales/es.json
+++ b/src/locales/es.json
@@ -32,13 +32,6 @@
"explorerDesc": "El servidor que esta billetera consulta para saldos e historial. Apúntalo a tu propio nodo para máxima privacidad.",
"explorerUrl": "URL del servidor",
"explorerUrlHint": "Base REST de Esplora / electrs, p. ej. https://mempool.space/api",
- "deviceSync": "Sincronización de dispositivos",
- "deviceSyncDesc": "Mantén esta billetera sincronizada entre tus dispositivos guardando una copia cifrada en un relay de Nostr — solo un dispositivo con tu semilla puede leerla. Desactívala para mantener todo en este dispositivo.",
- "syncAcross": "Sincronizar entre dispositivos",
- "syncOn": "Activado",
- "syncOff": "Desactivado",
- "relaysLabel": "Relays",
- "relaysHint": "Una URL wss:// por línea.",
"home": "Inicio",
"logout": "Cerrar sesión",
"createNew": "Crear nuevo",
diff --git a/src/locales/fr.json b/src/locales/fr.json
index fdaed31..2cd8a73 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -17,13 +17,6 @@
"explorerDesc": "Le serveur que ce portefeuille interroge pour les soldes et l’historique. Pointez-le vers votre propre nœud pour une confidentialité maximale.",
"explorerUrl": "URL du serveur",
"explorerUrlHint": "Base REST Esplora / electrs, par ex. https://mempool.space/api",
- "deviceSync": "Synchronisation des appareils",
- "deviceSyncDesc": "Gardez ce portefeuille synchronisé entre vos appareils en stockant une copie chiffrée sur un relais Nostr — seul un appareil possédant votre seed peut la lire. Désactivez l’option pour tout conserver sur cet appareil.",
- "syncAcross": "Synchroniser entre les appareils",
- "syncOn": "Activé",
- "syncOff": "Désactivé",
- "relaysLabel": "Relais",
- "relaysHint": "Une URL wss:// par ligne.",
"home": "Accueil",
"logout": "Déconnexion",
"createNew": "Créer",
diff --git a/src/locales/hi.json b/src/locales/hi.json
index 3d3a5a2..5c58a46 100644
--- a/src/locales/hi.json
+++ b/src/locales/hi.json
@@ -17,13 +17,6 @@
"explorerDesc": "वह सर्वर जिससे यह वॉलेट बैलेंस और इतिहास के लिए पूछताछ करता है। अधिकतम गोपनीयता के लिए इसे अपने अपने नोड पर इंगित करें।",
"explorerUrl": "सर्वर URL",
"explorerUrlHint": "Esplora / electrs REST आधार, उदा. https://mempool.space/api",
- "deviceSync": "डिवाइस सिंक",
- "deviceSyncDesc": "एक Nostr रिले पर एक एन्क्रिप्टेड प्रति संग्रहीत करके इस वॉलेट को अपने सभी डिवाइस में सिंक रखें — केवल आपके सीड वाला डिवाइस ही इसे पढ़ सकता है। सब कुछ इसी डिवाइस पर रखने के लिए इसे बंद कर दें।",
- "syncAcross": "डिवाइस में सिंक करें",
- "syncOn": "चालू",
- "syncOff": "बंद",
- "relaysLabel": "रिले",
- "relaysHint": "प्रति पंक्ति एक wss:// URL।",
"home": "होम",
"logout": "लॉग आउट",
"createNew": "नया बनाएँ",
diff --git a/src/locales/id.json b/src/locales/id.json
index 989036b..07f7b30 100644
--- a/src/locales/id.json
+++ b/src/locales/id.json
@@ -17,13 +17,6 @@
"explorerDesc": "Server yang ditanyai dompet ini untuk saldo dan riwayat. Arahkan ke node Anda sendiri untuk privasi maksimal.",
"explorerUrl": "URL server",
"explorerUrlHint": "Basis REST Esplora / electrs, mis. https://mempool.space/api",
- "deviceSync": "Sinkronisasi perangkat",
- "deviceSyncDesc": "Jaga dompet ini tetap tersinkron di seluruh perangkat Anda dengan menyimpan salinan terenkripsi di relay Nostr — hanya perangkat dengan seed Anda yang bisa membacanya. Matikan untuk menyimpan semuanya di perangkat ini.",
- "syncAcross": "Sinkronkan antar perangkat",
- "syncOn": "Aktif",
- "syncOff": "Nonaktif",
- "relaysLabel": "Relay",
- "relaysHint": "Satu URL wss:// per baris.",
"home": "Beranda",
"logout": "Keluar",
"createNew": "Buat baru",
diff --git a/src/locales/ja.json b/src/locales/ja.json
index d6cbb0b..3398145 100644
--- a/src/locales/ja.json
+++ b/src/locales/ja.json
@@ -17,13 +17,6 @@
"explorerDesc": "このウォレットが残高と履歴を照会するサーバーです。プライバシーを最大限に高めるには、ご自身のノードを指定してください。",
"explorerUrl": "サーバーURL",
"explorerUrlHint": "Esplora / electrs REST のベース。例: https://mempool.space/api",
- "deviceSync": "デバイス同期",
- "deviceSyncDesc": "暗号化したコピーを Nostr リレーに保存することで、このウォレットを複数のデバイス間で同期し続けます — シードを持つデバイスだけが読み取れます。すべてをこのデバイス内に留めておくにはオフにしてください。",
- "syncAcross": "デバイス間で同期",
- "syncOn": "オン",
- "syncOff": "オフ",
- "relaysLabel": "リレー",
- "relaysHint": "1行につき wss:// URL を1つ。",
"home": "ホーム",
"logout": "ログアウト",
"createNew": "新規作成",
diff --git a/src/locales/ko.json b/src/locales/ko.json
index c549532..df12c45 100644
--- a/src/locales/ko.json
+++ b/src/locales/ko.json
@@ -17,13 +17,6 @@
"explorerDesc": "이 지갑이 잔액과 내역을 조회하는 서버입니다. 최대한의 프라이버시를 위해 본인의 노드를 지정하세요.",
"explorerUrl": "서버 URL",
"explorerUrlHint": "Esplora / electrs REST 기본 주소, 예: https://mempool.space/api",
- "deviceSync": "기기 동기화",
- "deviceSyncDesc": "암호화된 사본을 Nostr 릴레이에 저장해 여러 기기에서 이 지갑을 동기화하세요 — 시드를 가진 기기만 읽을 수 있습니다. 모든 것을 이 기기에만 보관하려면 끄세요.",
- "syncAcross": "기기 간 동기화",
- "syncOn": "켜짐",
- "syncOff": "꺼짐",
- "relaysLabel": "릴레이",
- "relaysHint": "한 줄에 하나의 wss:// URL을 입력하세요.",
"home": "홈",
"logout": "로그아웃",
"createNew": "새로 만들기",
diff --git a/src/locales/mr.json b/src/locales/mr.json
index df7bd3c..0b4f2ed 100644
--- a/src/locales/mr.json
+++ b/src/locales/mr.json
@@ -17,13 +17,6 @@
"explorerDesc": "हे वॉलेट शिल्लक आणि इतिहासासाठी ज्या सर्व्हरला विचारणा करते. कमाल गोपनीयतेसाठी ते तुमच्या स्वतःच्या नोडकडे रोखा.",
"explorerUrl": "सर्व्हर URL",
"explorerUrlHint": "Esplora / electrs REST बेस, उदा. https://mempool.space/api",
- "deviceSync": "डिव्हाइस सिंक",
- "deviceSyncDesc": "Nostr रिलेवर एन्क्रिप्टेड प्रत साठवून हे वॉलेट तुमच्या सर्व डिव्हाइसवर सिंक ठेवा — फक्त तुमचा सीड असलेले डिव्हाइसच ते वाचू शकते. सर्व काही या डिव्हाइसवरच ठेवण्यासाठी ते बंद करा.",
- "syncAcross": "डिव्हाइसदरम्यान सिंक करा",
- "syncOn": "चालू",
- "syncOff": "बंद",
- "relaysLabel": "रिले",
- "relaysHint": "प्रति ओळ एक wss:// URL.",
"home": "मुख्यपृष्ठ",
"logout": "बाहेर पडा",
"createNew": "नवीन तयार करा",
diff --git a/src/locales/pt.json b/src/locales/pt.json
index 2da555f..69f83cb 100644
--- a/src/locales/pt.json
+++ b/src/locales/pt.json
@@ -17,13 +17,6 @@
"explorerDesc": "O servidor que esta carteira consulta para saldos e histórico. Aponte-o para seu próprio nó para máxima privacidade.",
"explorerUrl": "URL do servidor",
"explorerUrlHint": "Base REST do Esplora / electrs, por exemplo https://mempool.space/api",
- "deviceSync": "Sincronização de dispositivos",
- "deviceSyncDesc": "Mantenha esta carteira sincronizada entre seus dispositivos armazenando uma cópia criptografada em um relay Nostr — somente um dispositivo com sua seed pode lê-la. Desative para manter tudo neste dispositivo.",
- "syncAcross": "Sincronizar entre dispositivos",
- "syncOn": "Ativado",
- "syncOff": "Desativado",
- "relaysLabel": "Relays",
- "relaysHint": "Um URL wss:// por linha.",
"home": "Início",
"logout": "Sair",
"createNew": "Criar nova",
diff --git a/src/locales/ru.json b/src/locales/ru.json
index 5ec0a51..0c8c5ea 100644
--- a/src/locales/ru.json
+++ b/src/locales/ru.json
@@ -17,13 +17,6 @@
"explorerDesc": "Сервер, к которому этот кошелёк обращается за балансами и историей. Укажите свой собственный узел для максимальной приватности.",
"explorerUrl": "URL сервера",
"explorerUrlHint": "Базовый REST-адрес Esplora / electrs, например https://mempool.space/api",
- "deviceSync": "Синхронизация устройств",
- "deviceSyncDesc": "Держите этот кошелёк синхронизированным между вашими устройствами, храня зашифрованную копию на релее Nostr — прочитать её может только устройство с вашим сидом. Отключите, чтобы хранить всё на этом устройстве.",
- "syncAcross": "Синхронизация между устройствами",
- "syncOn": "Вкл",
- "syncOff": "Выкл",
- "relaysLabel": "Релеи",
- "relaysHint": "Один URL wss:// на строку.",
"home": "Главная",
"logout": "Выйти",
"createNew": "Создать",
diff --git a/src/locales/sw.json b/src/locales/sw.json
index 503c546..32ae663 100644
--- a/src/locales/sw.json
+++ b/src/locales/sw.json
@@ -17,13 +17,6 @@
"explorerDesc": "Seva ambayo pochi hii huuliza kuhusu salio na historia. Ielekeze kwenye nodi yako mwenyewe kwa faragha ya juu zaidi.",
"explorerUrl": "URL ya seva",
"explorerUrlHint": "Msingi wa REST wa Esplora / electrs, k.m. https://mempool.space/api",
- "deviceSync": "Usawazishaji wa vifaa",
- "deviceSyncDesc": "Weka pochi hii ikiwa imesawazishwa katika vifaa vyako kwa kuhifadhi nakala iliyosimbwa kwa njia fiche kwenye relay ya Nostr — kifaa chenye mbegu yako pekee ndicho kinaweza kuisoma. Izime ili kuweka kila kitu kwenye kifaa hiki.",
- "syncAcross": "Sawazisha katika vifaa",
- "syncOn": "Imewashwa",
- "syncOff": "Imezimwa",
- "relaysLabel": "Relay",
- "relaysHint": "URL moja ya wss:// kwa kila mstari.",
"home": "Mwanzo",
"logout": "Toka",
"createNew": "Tengeneza mpya",
diff --git a/src/locales/ta.json b/src/locales/ta.json
index 4912ce8..671d5fe 100644
--- a/src/locales/ta.json
+++ b/src/locales/ta.json
@@ -17,13 +17,6 @@
"explorerDesc": "இருப்புகளுக்கும் வரலாற்றுக்கும் இந்த வாலெட் வினவும் சேவையகம். அதிகபட்ச தனியுரிமைக்கு உங்கள் சொந்த நோடை நோக்கி அமைக்கவும்.",
"explorerUrl": "சேவையக URL",
"explorerUrlHint": "Esplora / electrs REST அடிப்படை, எ.கா. https://mempool.space/api",
- "deviceSync": "சாதன ஒத்திசைவு",
- "deviceSyncDesc": "Nostr ரிலேயில் மறையாக்கப்பட்ட நகலைச் சேமிப்பதன் மூலம் உங்கள் சாதனங்களில் இந்த வாலெட்டை ஒத்திசைவாக வைத்திருங்கள் — உங்கள் சீட் உள்ள சாதனம் மட்டுமே அதைப் படிக்க முடியும். எல்லாவற்றையும் இந்தச் சாதனத்தில் மட்டும் வைக்க அதை அணைக்கவும்.",
- "syncAcross": "சாதனங்களில் ஒத்திசை",
- "syncOn": "இயக்கு",
- "syncOff": "அணை",
- "relaysLabel": "ரிலேக்கள்",
- "relaysHint": "ஒரு வரிக்கு ஒரு wss:// URL.",
"home": "முகப்பு",
"logout": "வெளியேறு",
"createNew": "புதிது உருவாக்கு",
diff --git a/src/locales/te.json b/src/locales/te.json
index 9dc92eb..f9b7154 100644
--- a/src/locales/te.json
+++ b/src/locales/te.json
@@ -17,13 +17,6 @@
"explorerDesc": "నిల్వలు, చరిత్ర కోసం ఈ వాలెట్ ప్రశ్నించే సర్వర్. గరిష్ట గోప్యత కోసం దీన్ని మీ స్వంత నోడ్‌కు గురిపెట్టండి.",
"explorerUrl": "సర్వర్ URL",
"explorerUrlHint": "Esplora / electrs REST బేస్, ఉదా. https://mempool.space/api",
- "deviceSync": "పరికర సమకాలీకరణ",
- "deviceSyncDesc": "ఎన్‌క్రిప్ట్ చేసిన కాపీని Nostr రిలేపై నిల్వ చేయడం ద్వారా ఈ వాలెట్‌ను మీ పరికరాల అంతటా సమకాలీకరించండి — మీ సీడ్ ఉన్న పరికరం మాత్రమే దాన్ని చదవగలదు. ప్రతిదీ ఈ పరికరంలోనే ఉంచడానికి దీన్ని ఆఫ్ చేయండి.",
- "syncAcross": "పరికరాల అంతటా సమకాలీకరించండి",
- "syncOn": "ఆన్",
- "syncOff": "ఆఫ్",
- "relaysLabel": "రిలేలు",
- "relaysHint": "ఒక్కో లైన్‌కు ఒక wss:// URL.",
"home": "హోమ్",
"logout": "లాగౌట్",
"createNew": "కొత్తది సృష్టించు",
diff --git a/src/locales/tr.json b/src/locales/tr.json
index 2d42812..2f90938 100644
--- a/src/locales/tr.json
+++ b/src/locales/tr.json
@@ -17,13 +17,6 @@
"explorerDesc": "Bu cüzdanın bakiyeler ve geçmiş için sorguladığı sunucu. Maksimum gizlilik için kendi düğümünüze yönlendirin.",
"explorerUrl": "Sunucu URL'si",
"explorerUrlHint": "Esplora / electrs REST tabanı, örn. https://mempool.space/api",
- "deviceSync": "Cihaz senkronizasyonu",
- "deviceSyncDesc": "Bir Nostr aktarıcısında şifrelenmiş bir kopya saklayarak bu cüzdanı cihazlarınız arasında senkronize tutun — yalnızca tohumunuza sahip bir cihaz onu okuyabilir. Her şeyi bu cihazda tutmak için kapatın.",
- "syncAcross": "Cihazlar arasında senkronize et",
- "syncOn": "Açık",
- "syncOff": "Kapalı",
- "relaysLabel": "Aktarıcılar",
- "relaysHint": "Satır başına bir wss:// URL'si.",
"home": "Ana sayfa",
"logout": "Çıkış",
"createNew": "Yeni oluştur",
diff --git a/src/locales/ur.json b/src/locales/ur.json
index ca79721..dfd9efe 100644
--- a/src/locales/ur.json
+++ b/src/locales/ur.json
@@ -17,13 +17,6 @@
"explorerDesc": "وہ سرور جس سے یہ والیٹ بیلنس اور تاریخ کے لیے استفسار کرتا ہے۔ زیادہ سے زیادہ پرائیویسی کے لیے اسے اپنے نوڈ کی طرف مقرر کریں۔",
"explorerUrl": "سرور URL",
"explorerUrlHint": "Esplora / electrs REST بنیاد، مثلاً https://mempool.space/api",
- "deviceSync": "ڈیوائس سنک",
- "deviceSyncDesc": "اس والیٹ کو اپنی ڈیوائسز پر سنک رکھیں، اس کے لیے ایک Nostr ریلے پر ایک خفیہ کردہ نقل محفوظ کریں — صرف آپ کے سیڈ والی ڈیوائس ہی اسے پڑھ سکتی ہے۔ سب کچھ اسی ڈیوائس پر رکھنے کے لیے اسے بند کر دیں۔",
- "syncAcross": "ڈیوائسز پر سنک کریں",
- "syncOn": "آن",
- "syncOff": "آف",
- "relaysLabel": "ریلے",
- "relaysHint": "ہر سطر پر ایک wss:// URL۔",
"home": "ہوم",
"logout": "لاگ آؤٹ",
"createNew": "نیا بنائیں",
diff --git a/src/locales/vi.json b/src/locales/vi.json
index f335cb3..45d9a85 100644
--- a/src/locales/vi.json
+++ b/src/locales/vi.json
@@ -17,13 +17,6 @@
"explorerDesc": "Máy chủ mà ví này truy vấn để lấy số dư và lịch sử. Hãy trỏ nó tới node của riêng bạn để có quyền riêng tư tối đa.",
"explorerUrl": "URL máy chủ",
"explorerUrlHint": "Cơ sở REST của Esplora / electrs, ví dụ https://mempool.space/api",
- "deviceSync": "Đồng bộ thiết bị",
- "deviceSyncDesc": "Giữ ví này đồng bộ trên các thiết bị của bạn bằng cách lưu một bản sao đã mã hóa trên relay Nostr — chỉ thiết bị có seed của bạn mới đọc được. Hãy tắt nó để giữ mọi thứ trên thiết bị này.",
- "syncAcross": "Đồng bộ trên các thiết bị",
- "syncOn": "Bật",
- "syncOff": "Tắt",
- "relaysLabel": "Relay",
- "relaysHint": "Mỗi URL wss:// trên một dòng.",
"home": "Trang chủ",
"logout": "Đăng xuất",
"createNew": "Tạo mới",
diff --git a/src/locales/zh.json b/src/locales/zh.json
index 3b733e1..a826356 100644
--- a/src/locales/zh.json
+++ b/src/locales/zh.json
@@ -17,13 +17,6 @@
"explorerDesc": "本钱包用于查询余额和历史记录的服务器。将其指向你自己的节点以获得最高的隐私性。",
"explorerUrl": "服务器 URL",
"explorerUrlHint": "Esplora / electrs REST 基础地址,例如 https://mempool.space/api",
- "deviceSync": "设备同步",
- "deviceSyncDesc": "通过在 Nostr 中继上存储加密副本,让此钱包在你的各设备间保持同步——只有拥有你种子的设备才能读取它。关闭它可将所有内容仅保留在本设备上。",
- "syncAcross": "跨设备同步",
- "syncOn": "开",
- "syncOff": "关",
- "relaysLabel": "中继",
- "relaysHint": "每行一个 wss:// URL。",
"home": "首页",
"logout": "退出",
"createNew": "新建",
diff --git a/src/nostr.js b/src/nostr.js
index 1a4a0c5..c644ef5 100644
--- a/src/nostr.js
+++ b/src/nostr.js
@@ -12,7 +12,6 @@
import * as nip06 from 'nostr-tools/nip06';
import * as nip44 from 'nostr-tools/nip44';
import * as nip04 from 'nostr-tools/nip04';
-import { wrapEvent as nip17WrapEvent } from 'nostr-tools/nip17';
import { getPublicKey, finalizeEvent, generateSecretKey } from 'nostr-tools/pure';
import { decode as nip19decode, npubEncode } from 'nostr-tools/nip19';
import { SimplePool } from 'nostr-tools/pool';
@@ -164,10 +163,9 @@ export function getSyncConfig() {
if (raw) {
const c = JSON.parse(raw);
const relays = Array.isArray(c.relays) ? c.relays : [];
- return {
- enabled: c.enabled !== false,
- relays: relays.length ? relays : DEFAULT_SYNC_RELAYS,
- };
+ // Always on — the toggle is gone; relays follow the user's NIP-65
+ // (adoptSyncRelays in the sync feature), coinos relay as the default.
+ return { enabled: true, relays: relays.length ? relays : DEFAULT_SYNC_RELAYS };
}
} catch {}
return { enabled: true, relays: DEFAULT_SYNC_RELAYS }; // default: on, coinos relay
@@ -223,23 +221,6 @@ export class NostrSync {
return results.some((r) => r.status === 'fulfilled');
}
- // Deliver an encrypted DM (a locked gift's claim code) as a NIP-17 gift wrap
- // (kind 1059) — the modern standard every current client supports. Goes to the
- // recipient's published inbox relays (NIP-17/65) plus a broad fallback. Returns
- // true if ≥1 relay accepted it.
- async sendDM(recipientPkHex, text, relays = null) {
- if (!this.sk) return false;
- let evt;
- try { evt = nip17WrapEvent(this.sk, { publicKey: recipientPkHex }, text); } catch { return false; }
- let targets = relays;
- if (!targets) {
- const inbox = await fetchInboxRelays(recipientPkHex);
- targets = [...new Set([...inbox, ...PROFILE_RELAYS])].slice(0, 8); // recipient's inbox + safety net
- }
- const res = await Promise.allSettled(pool.publish(targets, evt));
- return res.some((x) => x.status === 'fulfilled');
- }
-
// Publish an arbitrary event (finalized here with our key) to the relays.
// Used by features that speak their own event kinds (e.g. ark zaps).
async publishEvent(partial) {