const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/bitcoin-signers-impl-Dls3Pe3U.js","assets/esm-CRVqHnq2.js","assets/rolldown-runtime-QTnfLwEv.js","assets/sha256-Cx9u8cje.js","assets/bitcoin-CZvT_Ikr.js","assets/bitcoinMoney-BhQyBHpS.js","assets/esplora-CScU9uce.js","assets/silentPaymentsCore-DNoThJua.js"])))=>i.map(i=>d[i]); import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{cn as t,ki as n}from"./lucide-icons-BjbcRgLk.js";import{t as r}from"./jsx-runtime-By8HlURe.js";import{t as i}from"./preload-helper-CZgWQFsJ.js";import{F as a,_ as o,i as s,l as c,r as l,t as u,u as d,v as f}from"./dist-DPmmj29U.js";import{u as p,w as m}from"./esm-CRVqHnq2.js";import{i as h,t as g}from"./sha256-Cx9u8cje.js";import{h as _,t as ee}from"./useQuery-CQCUTxAw.js";import{o as te,t as ne}from"./dist-DQ_zK-Nr.js";var v=e(n(),1),y=(0,v.createContext)(null);function b(){let e=(0,v.useContext)(y);if(!e)throw Error(`useNostrStorage must be used within a NostrProvider`);return{store:e}}function x(e){let{queryKey:t,filter:n,toData:r,getEvent:i}=e,a=_(),{store:o}=b();(0,v.useEffect)(()=>{if(!t)return;let e=!1;return(async()=>{let[s]=await o.query([n]);if(e||!s)return;let c=a.getQueryData(t),l=c?i(c):void 0;l&&l.created_at>=s.created_at||a.setQueryData(t,r(s))})(),()=>{e=!0}},[t?JSON.stringify(t):``,o,a])}var re=5;function ie(e){let t=new Set;for(let[n,r,i]of e.tags)if(!(n!==`r`||i===`read`||!r))try{let e=new URL(r);e.protocol===`wss:`&&t.add(e.href)}catch{}return[...t]}async function S(e,t,n){try{let r=AbortSignal.timeout(5e3),i=n?AbortSignal.any([n,r]):r,[a]=await e.query([{kinds:[10002],authors:[t],limit:1}],{signal:i});return a?ie(a).slice(0,re):[]}catch{return[]}}async function C(e,t,n,r){if(t.length===0)return[];try{return await e.group(t).query(n,{signal:r})}catch{return[]}}function w(e){try{return{metadata:f.json().pipe(f.metadata()).parse(e.content),event:e}}catch{return{event:e}}}function T(e){let{nostr:t}=u(),n=_(),{store:r}=b();return x({queryKey:e?[`author`,e]:void 0,filter:{kinds:[0],authors:e?[e]:[]},toData:w,getEvent:e=>e.event}),ee({queryKey:[`author`,e??``],queryFn:async({signal:i})=>{if(!e)return{};let[a]=await t.query([{kinds:[0],authors:[e],limit:1}],{signal:i});if(!a){let a=await n.fetchQuery({queryKey:[`author-write-relays`,e],queryFn:({signal:n})=>S(t,e,n),staleTime:600*1e3,gcTime:1800*1e3}),o=AbortSignal.any([i,AbortSignal.timeout(6e3)]),[s]=await C(t,a,[{kinds:[0],authors:[e],limit:1}],o);if(s)return r.event(s),w(s);let c=n.getQueryData([`author`,e]);if(c?.event)return c;let[l]=await r.query([{kinds:[0],authors:[e]}]);return l?w(l):{}}let o=n.getQueryData([`author`,e]),[s]=await r.query([{kinds:[0],authors:[e]}]),c=a;return o?.event&&o.event.created_at>c.created_at&&(c=o.event),s&&s.created_at>c.created_at&&(c=s),r.event(a),w(c)},enabled:!!e,staleTime:300*1e3,gcTime:600*1e3,retry:1})}var ae=1,oe=1e6,E=0;function se(){return E=(E+1)%(2**53-1),E.toString()}var D=new Map,O=e=>{if(D.has(e))return;let t=setTimeout(()=>{D.delete(e),M({type:`REMOVE_TOAST`,toastId:e})},oe);D.set(e,t)},k=(e,t)=>{switch(t.type){case`ADD_TOAST`:return{...e,toasts:[t.toast,...e.toasts].slice(0,ae)};case`UPDATE_TOAST`:return{...e,toasts:e.toasts.map(e=>e.id===t.toast.id?{...e,...t.toast}:e)};case`DISMISS_TOAST`:{let{toastId:n}=t;return n?O(n):e.toasts.forEach(e=>{O(e.id)}),{...e,toasts:e.toasts.map(e=>e.id===n||n===void 0?{...e,open:!1}:e)}}case`REMOVE_TOAST`:return t.toastId===void 0?{...e,toasts:[]}:{...e,toasts:e.toasts.filter(e=>e.id!==t.toastId)}}},A=[],j={toasts:[]};function M(e){j=k(j,e),A.forEach(e=>{e(j)})}function N({...e}){let t=se(),n=e=>M({type:`UPDATE_TOAST`,toast:{...e,id:t}}),r=()=>M({type:`DISMISS_TOAST`,toastId:t});return M({type:`ADD_TOAST`,toast:{...e,id:t,open:!0,onOpenChange:e=>{e||r()}}}),{id:t,dismiss:r,update:n}}function ce(){let[e,t]=v.useState(j);return v.useEffect(()=>(A.push(t),()=>{let e=A.indexOf(t);e>-1&&A.splice(e,1)}),[e]),{...e,toast:N,dismiss:e=>M({type:`DISMISS_TOAST`,toastId:e})}}var P=r();function le({description:e,android:t,relayOk:n,onCancel:r}){return(0,P.jsxs)(`span`,{children:[(0,P.jsx)(`span`,{className:`block text-sm opacity-80`,children:e}),t&&n?(0,P.jsx)(ue,{onCancel:r}):(0,P.jsx)(`span`,{className:`block mt-1.5`,children:(0,P.jsx)(F,{onClick:r})})]})}function ue({onCancel:e}){let[n,r]=(0,v.useState)(!1);return(0,P.jsxs)(`span`,{className:`flex items-center gap-3 mt-2`,children:[n?(0,P.jsxs)(`span`,{className:`text-sm opacity-80 inline-flex items-center gap-1.5`,children:[(0,P.jsx)(t,{className:`size-4 animate-spin`}),`Waiting for signer...`]}):(0,P.jsx)(`a`,{href:`nostrsigner:`,className:`text-sm font-semibold border border-current rounded px-3 py-1.5 no-underline inline-flex items-center gap-1.5 min-h-[44px]`,onClick:()=>{r(!0)},children:`Approve in signer`}),n?(0,P.jsx)(`button`,{type:`button`,onClick:e,className:`text-sm font-semibold border border-current rounded px-3 py-1.5 min-h-[44px]`,children:`Cancel`}):(0,P.jsx)(F,{onClick:e})]})}function F({onClick:e}){return(0,P.jsx)(`button`,{type:`button`,onClick:e,className:`text-sm bg-transparent border-none p-0 cursor-pointer opacity-80 underline underline-offset-2 min-h-[44px] inline-flex items-center`,children:`Skip`})}function I(e){return typeof e.signPsbt==`function`}var de=class extends c{#e;constructor(e){super(e),this.#e=new Uint8Array(e)}async signPsbt(e){let{signNsecPsbt:t}=await i(async()=>{let{signNsecPsbt:e}=await import(`./bitcoin-signers-impl-Dls3Pe3U.js`);return{signNsecPsbt:e}},__vite__mapDeps([0,1,2,3,4,5,6,7]));return t(e,this.#e)}},fe=class extends a{constructor(e){super(e)}async signPsbt(e){let t=await this.awaitNostr();if(typeof t.signPsbt!=`function`)throw Error(`Your browser extension doesn't support sending Bitcoin. Try a different extension, or log in with your secret key.`);let n=t.signPsbt;return n(e)}},pe=[/unknown\s+(method|command)/i,/not\s+(implemented|supported|found)/i,/unsupported\s+method/i,/method\s+not\s+found/i,/invalid\s+method/i,/no\s+such\s+method/i];function L(e){return pe.some(t=>t.test(e))}var R=class extends o{constructor(e){super(e)}async signPsbt(e){let t=this.cmd;try{return await t.call(this,`sign_psbt`,[e])}catch(e){let t=e instanceof Error?e.message:String(e);throw L(t)?Error(`Your remote signer doesn't support sending Bitcoin. Update your signer, or log in with your secret key. (${t})`):e}}},z={0:`Profile`,1:`Short text note`,2:`Recommend relay`,3:`Follows`,4:`Encrypted message`,5:`Deletion`,6:`Repost`,7:`Reaction`,8:`Badge award`,9:`Chat message`,10:`Group chat threaded reply`,11:`Thread`,12:`Group thread reply`,13:`Seal`,14:`Direct message`,15:`File message`,16:`Generic repost`,17:`Reaction to a website`,20:`Photo`,21:`Video`,22:`Short video`,24:`Public message`,30:`Internal reference`,31:`External web reference`,32:`Hardcopy reference`,33:`Prompt reference`,40:`Channel creation`,41:`Channel metadata`,42:`Channel message`,43:`Channel hide message`,44:`Channel mute user`,62:`Request to vanish`,64:`Chess (PGN)`,443:`KeyPackage`,444:`Welcome message`,445:`Group event`,818:`Merge request`,1018:`Poll vote`,1021:`Bid`,1022:`Bid confirmation`,1040:`OpenTimestamps`,1059:`Gift wrap`,1063:`File metadata`,1068:`Poll`,1111:`Comment`,1222:`Voice message`,1244:`Voice message comment`,1311:`Live chat message`,1337:`Code snippet`,1617:`Patch`,1618:`Pull request`,1619:`Pull request update`,1621:`Issue`,1622:`Git reply`,1630:`Git status (open)`,1631:`Git status (applied)`,1632:`Git status (closed)`,1633:`Git status (draft)`,1971:`Problem tracker`,1984:`Report`,1985:`Label`,1986:`Relay review`,1987:`AI embeddings`,2003:`Torrent`,2004:`Torrent comment`,2022:`Coinjoin pool`,2473:`Bird detection`,3063:`Zapstore asset`,3367:`Color moment`,4550:`Community post approval`,5e3:`Job request`,6e3:`Job result`,7e3:`Job feedback`,7374:`Reserved Cashu wallet tokens`,7375:`Cashu wallet tokens`,7376:`Cashu wallet history`,7516:`Found log`,7517:`Geocache proof of find`,7849:`Quiz result`,8e3:`Add user`,8001:`Remove user`,8211:`Letter`,9e3:`Group control event`,9041:`Zap goal`,9321:`Nutzap`,9467:`Tidal login`,9734:`Zap request`,9735:`Zap`,8333:`Zap`,9802:`Highlight`,1e4:`Mute list`,10001:`Pin list`,10002:`Relay list`,10003:`Bookmark list`,10004:`Communities list`,10005:`Public chats list`,10006:`Blocked relays list`,10007:`Search relays list`,10008:`Profile badges`,10009:`User groups`,10011:`External identities`,10012:`Favorite relays list`,10013:`Private event relay list`,10015:`Interests list`,10019:`Nutzap mint recommendation`,10020:`Media follows`,10030:`Emoji list`,10050:`DM relay list`,10051:`KeyPackage relays list`,10063:`Blossom server list`,10096:`File storage server list`,10166:`Relay monitor announcement`,10312:`Room presence`,10377:`Proxy announcement`,11111:`Transport method announcement`,10073:`Read books`,10074:`Currently reading`,10075:`To be read`,11125:`Blobbonaut profile`,12473:`Birdex`,13194:`Wallet info`,13534:`Membership lists`,14388:`User sound effect lists`,14919:`Blobbi interaction`,14920:`Blobbi breeding`,14921:`Blobbi record`,5128:`Nsite snapshot`,15128:`Nsite`,15683:`Love list`,16158:`Weather station`,16767:`Active profile theme`,16769:`Profile tabs`,17375:`Cashu wallet event`,21e3:`Lightning Pub RPC`,22242:`Client authentication`,23194:`Wallet request`,23195:`Wallet response`,24133:`Nostr Connect`,24242:`Blob stored on mediaserver`,27235:`HTTP auth`,28934:`Join request`,28935:`Invite request`,28936:`Leave request`,4932:`Webxdc sync`,20932:`Webxdc sync`,3e4:`Follow set`,30001:`Generic list`,30002:`Relay set`,30003:`Bookmark set`,30004:`Curation set`,30005:`Video set`,30006:`Picture set`,30007:`Kind mute set`,30008:`Badge set`,30009:`Badge definition`,30015:`Interest set`,30017:`Stall`,30018:`Product`,30019:`Marketplace UI/UX`,30020:`Auction product`,30023:`Article`,30024:`Draft long-form content`,30030:`Emoji set`,30040:`Curated publication index`,30041:`Curated publication content`,30063:`Zapstore release`,30078:`App settings`,30166:`Relay discovery`,30267:`App curation set`,30311:`Live event`,30312:`Interactive room`,30313:`Conference event`,30315:`User status`,30382:`User trusted assertion`,30383:`Event trusted assertion`,30384:`Addressable event trusted assertion`,30388:`Slide set`,30402:`Classified listing`,30403:`Draft classified listing`,30054:`Podcast episode`,30055:`Podcast trailer`,30617:`Repository`,30618:`Repository state`,30621:`Constellation`,30818:`Wiki article`,30819:`Wiki redirect`,30817:`Custom NIP`,31234:`Draft event`,31388:`Link set`,31871:`Attestation`,31890:`Feed`,31922:`Date calendar event`,31923:`Time calendar event`,31924:`Calendar`,31925:`Calendar event RSVP`,31989:`App recommendation`,31990:`App`,31985:`Book review`,31124:`Blobbi`,32267:`Zapstore app`,32388:`User room favorites`,33388:`High scores`,33863:`Fundraiser`,33953:`Ebook`,34609:`Magazine`,39731:`Magazine issue`,34235:`Addressable video`,34236:`Addressable short video`,34388:`Sound effects`,34139:`Music playlist`,34550:`Community definition`,34128:`Nsite (legacy)`,35128:`Nsite`,36767:`Theme definition`,36787:`Music track`,37381:`Magic deck`,37516:`Geocache listing`,37849:`Quiz`,38172:`Cashu mint announcement`,38173:`Fedimint announcement`,38383:`Peer-to-peer order`,39089:`Follow pack`,39092:`Media follow pack`,39701:`Web bookmark`};function B(e,t){return z[e]??t??`Kind ${e}`}var me=4e3,he=45e3;function V(){return typeof navigator<`u`&&/Android/i.test(navigator.userAgent)}var H={0:`profile update`,1:`post`,3:`contact list update`,11:`post`,8333:`Bitcoin zap`,4932:`webxdc sync`,1e4:`mute list update`,10001:`pinned notes update`,10002:`relay list update`,10003:`bookmarks update`,10015:`interests update`,10030:`emoji list update`,20932:`webxdc sync`,24242:`file upload auth`,3e4:`user list update`,30078:`app settings`,30315:`status update`,31925:`event RSVP`,39089:`follow pack update`};function ge(e,t){if(e!==void 0){if(H[e])return H[e];let t=B(e,``);if(t)return t.toLowerCase()}return t===`encrypt`?`encryption`:t===`decrypt`?`decryption`:`signing`}var U=Symbol(`cancel`),W=Symbol(`timeout`),G=0,_e=8e3;function ve(e){let{kind:t,opType:n,isBunkerConnected:r,onCancel:i}=e,a=V(),o=r?r():!0,s=ge(t,n),c=Date.now();if(c-G<_e)return{dismiss:()=>{}};G=c;let l,u;o?a?(l=`Approve ${s}`,u=`Set to auto-approve for a smoother experience.`):(l=`Approve ${s}`,u=`Approve the request in your signer app.`):(l=`Signer relay unreachable`,u=`Check your connection and try again.`);let d={fn:void 0},f=(0,v.createElement)(le,{description:u,android:a,relayOk:o,onCancel:()=>{d.fn?.(),i()}}),{dismiss:p}=N({title:l,description:f,duration:12e4});return d.fn=p,{dismiss:p}}function ye(e){N({title:`${e===`encrypt`?`Encryption`:e===`decrypt`?`Decryption`:`Signing`} approved`,duration:3e3,variant:`success`})}function K(){let e;return{promise:new Promise(t=>{e=t}),resolve:e}}async function be(e,t){let{kind:n,opType:r,isBunkerConnected:i}=t,a=!1,o=K(),s=K(),c,l=setTimeout(()=>{a=!0,c=ve({kind:n,opType:r,isBunkerConnected:i,onCancel:()=>o.resolve(U)}).dismiss},me),u=setTimeout(()=>s.resolve(W),he);function d(){clearTimeout(l),clearTimeout(u),c?.()}let f=e().then(e=>({tag:`value`,value:e}),e=>({tag:`error`,error:e})),p=Promise.race([o.promise,s.promise]).then(e=>({tag:`signal`,signal:e})),m=await Promise.race([f,p]);if(d(),m.tag===`value`)return a&&ye(r),{value:m.value,nudgeFired:a};if(m.tag===`error`)throw m.error;switch(m.signal){case U:throw Error(`Signing cancelled by user`);case W:throw Error(`Signer timed out`)}}function xe(e,t){function n(e,n,r){return be(e,{kind:n,opType:r,isBunkerConnected:t}).then(e=>e.value)}let r={getPublicKey:()=>n(()=>e.getPublicKey(),void 0,`sign`),signEvent:t=>n(()=>e.signEvent(t),t.kind,`sign`)};if(e.getRelays){let t=e.getRelays.bind(e);r.getRelays=()=>n(()=>t(),void 0,`sign`)}function i(e){return{encrypt:(t,n)=>e.encrypt(t,n),decrypt:(t,n)=>e.decrypt(t,n)}}if(e.nip04&&(r.nip04=i(e.nip04)),e.nip44&&(r.nip44=i(e.nip44)),I(e)){let t=r,i=e;t.signPsbt=e=>n(()=>i.signPsbt(e),void 0,`sign`)}return r}var q=Symbol(`verified`),Se=e=>e instanceof Object;function Ce(e){if(!Se(e)||typeof e.kind!=`number`||typeof e.content!=`string`||typeof e.created_at!=`number`||typeof e.pubkey!=`string`||!e.pubkey.match(/^[a-f0-9]{64}$/)||!Array.isArray(e.tags))return!1;for(let t=0;t{if(ne.getPlatform()!==`android`){let e=Error(`nostr-capacitor is Android-only. Use a NIP-07 provider on Web/iOS.`);throw e.code=Oe,e}},ke=e=>JSON.stringify(e??[]);function Ae(e){if(e!=null)return typeof e==`string`?e:ke(e)}var Q={async setPackageName(e){if(Z(),!e)throw Error(`MISSING_PARAMS: packageName`);await X.setPackageName({packageName:e})},async isExternalSignerInstalled(e){return Z(),X.isExternalSignerInstalled({packageName:e})},async getInstalledSignerApps(){return Z(),X.getInstalledSignerApps()},async getPublicKey(e,t){Z();let n=Ae(t);return X.getPublicKey({packageName:e,permissions:n})},async signEvent(e,t,n,r){if(Z(),!t||!n||!r)throw Error(`MISSING_PARAMS: eventJson,id,pubkey`);return X.signEvent({packageName:e,eventJson:t,eventId:n,pubkey:r})},async nip04Encrypt(e,t,n,r,i){if(Z(),!t||!r||!i)throw Error(`MISSING_PARAMS: plainText,pubKey,pubkey`);return X.nip04Encrypt({packageName:e,plainText:t,pubKey:r,pubkey:i,id:n})},async nip04Decrypt(e,t,n,r,i){if(Z(),!t||!r||!i)throw Error(`MISSING_PARAMS: encryptedText,pubKey,pubkey`);return X.nip04Decrypt({packageName:e,encryptedText:t,pubKey:r,pubkey:i,id:n})},async nip44Encrypt(e,t,n,r,i){if(Z(),!t||!r||!i)throw Error(`MISSING_PARAMS: plainText,pubKey,pubkey`);return X.nip44Encrypt({packageName:e,plainText:t,pubKey:r,pubkey:i,id:n})},async nip44Decrypt(e,t,n,r,i){if(Z(),!t||!r||!i)throw Error(`MISSING_PARAMS: encryptedText,pubKey,pubkey`);return X.nip44Decrypt({packageName:e,encryptedText:t,pubKey:r,pubkey:i,id:n})},async decryptZapEvent(e,t,n,r){if(Z(),!t||!r)throw Error(`MISSING_PARAMS: eventJson,pubkey`);return X.decryptZapEvent({packageName:e,eventJson:t,pubkey:r,id:n})},async signPsbt(e,t,n,r){if(Z(),!t||!r)throw Error(`MISSING_PARAMS: psbtHex,pubkey`);return X.signPsbt({packageName:e,psbtHex:t,pubkey:r,id:n})}},$=class{packageName;pubkey;connected=!1;nip04;nip44;constructor(e,t){this.packageName=e,this.pubkey=t??null,this.nip04={encrypt:this.nip04Encrypt.bind(this),decrypt:this.nip04Decrypt.bind(this)},this.nip44={encrypt:this.nip44Encrypt.bind(this),decrypt:this.nip44Decrypt.bind(this)}}static async getSignerApps(){let{apps:e}=await Q.getInstalledSignerApps();return e}async setup(){if(this.connected&&this.pubkey)return this.pubkey;if(await Q.setPackageName(this.packageName),!this.pubkey){let e=await Q.getPublicKey();this.pubkey=e.pubkey}return this.connected=!0,this.pubkey}async getPublicKey(){return await this.setup()}async signEvent(e){let t=await this.getPublicKey(),n={...e,pubkey:t},r=J(n),i=JSON.stringify({...n,id:r,sig:``}),a=await Q.signEvent(this.packageName,i,r,t),o=JSON.parse(a.event);if(!De(o))throw Error(`Android signer returned an invalid signature`);return o}async signPsbt(e){let t=await this.getPublicKey(),{result:n}=await Q.signPsbt(this.packageName,e,crypto.randomUUID(),t);return n}async nip04Encrypt(e,t){let n=await this.getPublicKey(),{result:r}=await Q.nip04Encrypt(this.packageName,t,crypto.randomUUID(),e,n);return r}async nip04Decrypt(e,t){let n=await this.getPublicKey(),{result:r}=await Q.nip04Decrypt(this.packageName,t,crypto.randomUUID(),e,n);return r}async nip44Encrypt(e,t){let n=await this.getPublicKey(),{result:r}=await Q.nip44Encrypt(this.packageName,t,crypto.randomUUID(),e,n);return r}async nip44Decrypt(e,t){let n=await this.getPublicKey(),{result:r}=await Q.nip44Decrypt(this.packageName,t,crypto.randomUUID(),e,n);return r}};function je(){let{nostr:e}=u(),{logins:t}=l(),n=(0,v.useCallback)(t=>{let n,r;switch(t.type){case`nsec`:{let e=p.decode(t.data.nsec);n=new s(t.type,t.pubkey,new de(e.data));break}case`bunker`:{let i=new c(p.decode(t.data.clientNsec).data),a=t.data.relays;n=new s(t.type,t.pubkey,new R({relay:e.group(a),pubkey:t.data.bunkerPubkey,signer:i,timeout:6e4})),r=()=>a.some(t=>{let n=e.relay(t);return n instanceof d&&n.socket.readyState===WebSocket.OPEN});break}case`extension`:n=new s(t.type,t.pubkey,new fe);break;case`x-android-signer`:{let{packageName:e}=t.data;n=new s(t.type,t.pubkey,new $(e,t.pubkey));break}default:throw Error(`Unsupported login type: ${t.type}`)}return new s(n.method,n.pubkey,xe(n.signer,r))},[e]),r=(0,v.useMemo)(()=>{let e=[];for(let r of t)try{let t=n(r);e.push(t)}catch(e){console.warn(`Skipped invalid login`,r.id,e)}return e},[t,n]),i=r[0],a=T(i?.pubkey);return{user:i,users:r,...a.data,isLoading:a.isLoading}}export{I as a,w as c,C as d,x as f,B as i,T as l,y as m,$ as n,N as o,b as p,z as r,ce as s,je as t,S as u};