@konemono/nostr-login 1.9.8 → 1.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/unpkg.js
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
const _0n$4=BigInt(0),_1n$4=BigInt(1),_2n$2=BigInt(2),u8a$2=e=>e instanceof Uint8Array,hexes$2=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function bytesToHex$2(e){if(!u8a$2(e))throw new Error("Uint8Array expected");let t="";for(let n=0;n<e.length;n++)t+=hexes$2[e[n]];return t}function numberToHexUnpadded(e){const t=e.toString(16);return 1&t.length?`0${t}`:t}function hexToNumber(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);return BigInt(""===e?"0":`0x${e}`)}function hexToBytes$2(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const n=new Uint8Array(t/2);for(let t=0;t<n.length;t++){const r=2*t,o=e.slice(r,r+2),i=Number.parseInt(o,16);if(Number.isNaN(i)||i<0)throw new Error("Invalid byte sequence");n[t]=i}return n}function bytesToNumberBE(e){return hexToNumber(bytesToHex$2(e))}function bytesToNumberLE(e){if(!u8a$2(e))throw new Error("Uint8Array expected");return hexToNumber(bytesToHex$2(Uint8Array.from(e).reverse()))}function numberToBytesBE(e,t){return hexToBytes$2(e.toString(16).padStart(2*t,"0"))}function numberToBytesLE(e,t){return numberToBytesBE(e,t).reverse()}function numberToVarBytesBE(e){return hexToBytes$2(numberToHexUnpadded(e))}function ensureBytes$1(e,t,n){let r;if("string"==typeof t)try{r=hexToBytes$2(t)}catch(n){throw new Error(`${e} must be valid hex string, got "${t}". Cause: ${n}`)}else{if(!u8a$2(t))throw new Error(`${e} must be hex string or Uint8Array`);r=Uint8Array.from(t)}const o=r.length;if("number"==typeof n&&o!==n)throw new Error(`${e} expected ${n} bytes, got ${o}`);return r}function concatBytes$2(...e){const t=new Uint8Array(e.reduce(((e,t)=>e+t.length),0));let n=0;return e.forEach((e=>{if(!u8a$2(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}function equalBytes$1(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function utf8ToBytes$3(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function bitLen(e){let t;for(t=0;e>_0n$4;e>>=_1n$4,t+=1);return t}function bitGet(e,t){return e>>BigInt(t)&_1n$4}const bitSet=(e,t,n)=>e|(n?_1n$4:_0n$4)<<BigInt(t),bitMask=e=>(_2n$2<<BigInt(e-1))-_1n$4,u8n=e=>new Uint8Array(e),u8fr=e=>Uint8Array.from(e);function createHmacDrbg(e,t,n){if("number"!=typeof e||e<2)throw new Error("hashLen must be a number");if("number"!=typeof t||t<2)throw new Error("qByteLen must be a number");if("function"!=typeof n)throw new Error("hmacFn must be a function");let r=u8n(e),o=u8n(e),i=0;const s=()=>{r.fill(1),o.fill(0),i=0},a=(...e)=>n(o,r,...e),l=(e=u8n())=>{o=a(u8fr([0]),e),r=a(),0!==e.length&&(o=a(u8fr([1]),e),r=a())},c=()=>{if(i++>=1e3)throw new Error("drbg: tried 1000 values");let e=0;const n=[];for(;e<t;){r=a();const t=r.slice();n.push(t),e+=r.length}return concatBytes$2(...n)};return(e,t)=>{let n;for(s(),l(e);!(n=t(c()));)l();return s(),n}}const validatorFns={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function validateObject(e,t,n={}){const r=(t,n,r)=>{const o=validatorFns[n];if("function"!=typeof o)throw new Error(`Invalid validator "${n}", expected function`);const i=e[t];if(!(r&&void 0===i||o(i,e)))throw new Error(`Invalid param ${String(t)}=${i} (${typeof i}), expected ${n}`)};for(const[e,n]of Object.entries(t))r(e,n,!1);for(const[e,t]of Object.entries(n))r(e,t,!0);return e}var ut=Object.freeze({__proto__:null,bitGet:bitGet,bitLen:bitLen,bitMask:bitMask,bitSet:bitSet,bytesToHex:bytesToHex$2,bytesToNumberBE:bytesToNumberBE,bytesToNumberLE:bytesToNumberLE,concatBytes:concatBytes$2,createHmacDrbg:createHmacDrbg,ensureBytes:ensureBytes$1,equalBytes:equalBytes$1,hexToBytes:hexToBytes$2,hexToNumber:hexToNumber,numberToBytesBE:numberToBytesBE,numberToBytesLE:numberToBytesLE,numberToHexUnpadded:numberToHexUnpadded,numberToVarBytesBE:numberToVarBytesBE,utf8ToBytes:utf8ToBytes$3,validateObject:validateObject});
|
|
4
4
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const _0n$3=BigInt(0),_1n$3=BigInt(1),_2n$1=BigInt(2),_3n$1=BigInt(3),_4n=BigInt(4),_5n=BigInt(5),_8n=BigInt(8);function mod(e,t){const n=e%t;return n>=_0n$3?n:t+n}function pow(e,t,n){if(n<=_0n$3||t<_0n$3)throw new Error("Expected power/modulo > 0");if(n===_1n$3)return _0n$3;let r=_1n$3;for(;t>_0n$3;)t&_1n$3&&(r=r*e%n),e=e*e%n,t>>=_1n$3;return r}function pow2(e,t,n){let r=e;for(;t-- >_0n$3;)r*=r,r%=n;return r}function invert(e,t){if(e===_0n$3||t<=_0n$3)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=mod(e,t),r=t,o=_0n$3,i=_1n$3;for(;n!==_0n$3;){const e=r%n,t=o-i*(r/n);r=n,n=e,o=i,i=t}if(r!==_1n$3)throw new Error("invert: does not exist");return mod(o,t)}function tonelliShanks(e){const t=(e-_1n$3)/_2n$1;let n,r,o;for(n=e-_1n$3,r=0;n%_2n$1===_0n$3;n/=_2n$1,r++);for(o=_2n$1;o<e&&pow(o,t,e)!==e-_1n$3;o++);if(1===r){const t=(e+_1n$3)/_4n;return function(e,n){const r=e.pow(n,t);if(!e.eql(e.sqr(r),n))throw new Error("Cannot find square root");return r}}const i=(n+_1n$3)/_2n$1;return function(e,s){if(e.pow(s,t)===e.neg(e.ONE))throw new Error("Cannot find square root");let a=r,l=e.pow(e.mul(e.ONE,o),n),c=e.pow(s,i),d=e.pow(s,n);for(;!e.eql(d,e.ONE);){if(e.eql(d,e.ZERO))return e.ZERO;let t=1;for(let n=e.sqr(d);t<a&&!e.eql(n,e.ONE);t++)n=e.sqr(n);const n=e.pow(l,_1n$3<<BigInt(a-t-1));l=e.sqr(n),c=e.mul(c,n),d=e.mul(d,l),a=t}return c}}function FpSqrt(e){if(e%_4n===_3n$1){const t=(e+_1n$3)/_4n;return function(e,n){const r=e.pow(n,t);if(!e.eql(e.sqr(r),n))throw new Error("Cannot find square root");return r}}if(e%_8n===_5n){const t=(e-_5n)/_8n;return function(e,n){const r=e.mul(n,_2n$1),o=e.pow(r,t),i=e.mul(n,o),s=e.mul(e.mul(i,_2n$1),o),a=e.mul(i,e.sub(s,e.ONE));if(!e.eql(e.sqr(a),n))throw new Error("Cannot find square root");return a}}return tonelliShanks(e)}BigInt(9),BigInt(16);const FIELD_FIELDS=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function validateField(e){const t=FIELD_FIELDS.reduce(((e,t)=>(e[t]="function",e)),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"});return validateObject(e,t)}function FpPow(e,t,n){if(n<_0n$3)throw new Error("Expected power > 0");if(n===_0n$3)return e.ONE;if(n===_1n$3)return t;let r=e.ONE,o=t;for(;n>_0n$3;)n&_1n$3&&(r=e.mul(r,o)),o=e.sqr(o),n>>=_1n$3;return r}function FpInvertBatch(e,t){const n=new Array(t.length),r=t.reduce(((t,r,o)=>e.is0(r)?t:(n[o]=t,e.mul(t,r))),e.ONE),o=e.inv(r);return t.reduceRight(((t,r,o)=>e.is0(r)?t:(n[o]=e.mul(t,n[o]),e.mul(t,r))),o),n}function nLength(e,t){const n=void 0!==t?t:e.toString(2).length;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}function Field(e,t,n=!1,r={}){if(e<=_0n$3)throw new Error(`Expected Fp ORDER > 0, got ${e}`);const{nBitLength:o,nByteLength:i}=nLength(e,t);if(i>2048)throw new Error("Field lengths over 2048 bytes are not supported");const s=FpSqrt(e),a=Object.freeze({ORDER:e,BITS:o,BYTES:i,MASK:bitMask(o),ZERO:_0n$3,ONE:_1n$3,create:t=>mod(t,e),isValid:t=>{if("bigint"!=typeof t)throw new Error("Invalid field element: expected bigint, got "+typeof t);return _0n$3<=t&&t<e},is0:e=>e===_0n$3,isOdd:e=>(e&_1n$3)===_1n$3,neg:t=>mod(-t,e),eql:(e,t)=>e===t,sqr:t=>mod(t*t,e),add:(t,n)=>mod(t+n,e),sub:(t,n)=>mod(t-n,e),mul:(t,n)=>mod(t*n,e),pow:(e,t)=>FpPow(a,e,t),div:(t,n)=>mod(t*invert(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>invert(t,e),sqrt:r.sqrt||(e=>s(a,e)),invertBatch:e=>FpInvertBatch(a,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?numberToBytesLE(e,i):numberToBytesBE(e,i),fromBytes:e=>{if(e.length!==i)throw new Error(`Fp.fromBytes: expected ${i}, got ${e.length}`);return n?bytesToNumberLE(e):bytesToNumberBE(e)}});return Object.freeze(a)}function hashToPrivateScalar(e,t,n=!1){const r=(e=ensureBytes$1("privateHash",e)).length,o=nLength(t).nByteLength+8;if(o<24||r<o||r>1024)throw new Error(`hashToPrivateScalar: expected ${o}-1024 bytes of input, got ${r}`);return mod(n?bytesToNumberLE(e):bytesToNumberBE(e),t-_1n$3)+_1n$3}
|
|
5
5
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const _0n$2=BigInt(0),_1n$2=BigInt(1);function wNAF(e,t){const n=(e,t)=>{const n=t.negate();return e?n:t},r=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate:n,unsafeLadder(t,n){let r=e.ZERO,o=t;for(;n>_0n$2;)n&_1n$2&&(r=r.add(o)),o=o.double(),n>>=_1n$2;return r},precomputeWindow(e,t){const{windows:n,windowSize:o}=r(t),i=[];let s=e,a=s;for(let e=0;e<n;e++){a=s,i.push(a);for(let e=1;e<o;e++)a=a.add(s),i.push(a);s=a.double()}return i},wNAF(t,o,i){const{windows:s,windowSize:a}=r(t);let l=e.ZERO,c=e.BASE;const d=BigInt(2**t-1),h=2**t,u=BigInt(t);for(let e=0;e<s;e++){const t=e*a;let r=Number(i&d);i>>=u,r>a&&(r-=h,i+=_1n$2);const s=t,p=t+Math.abs(r)-1,f=e%2!=0,g=r<0;0===r?c=c.add(n(f,o[s])):l=l.add(n(g,o[p]))}return{p:l,f:c}},wNAFCached(e,t,n,r){const o=e._WINDOW_SIZE||1;let i=t.get(e);return i||(i=this.precomputeWindow(e,o),1!==o&&t.set(e,r(i))),this.wNAF(o,i,n)}}}function validateBasic(e){return validateField(e.Fp),validateObject(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...nLength(e.n,e.nBitLength),...e,p:e.Fp.ORDER})}
|
|
6
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function validatePointOpts(e){const t=validateBasic(e);validateObject(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:r,a:o}=t;if(n){if(!r.eql(o,r.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}const{bytesToNumberBE:b2n,hexToBytes:h2b}=ut,DER={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=DER;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],r=e.subarray(2,n+2);if(!n||r.length!==n)throw new t("Invalid signature integer: wrong length");if(128&r[0])throw new t("Invalid signature integer: negative");if(0===r[0]&&!(128&r[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:b2n(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=DER,n="string"==typeof e?h2b(e):e;if(!(n instanceof Uint8Array))throw new Error("ui8a expected");let r=n.length;if(r<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==r-2)throw new t("Invalid signature: incorrect length");const{d:o,l:i}=DER._parseInt(n.subarray(2)),{d:s,l:a}=DER._parseInt(i);if(a.length)throw new t("Invalid signature: left bytes after parsing");return{r:o,s:s}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},r=t(n(e.s)),o=t(n(e.r)),i=r.length/2,s=o.length/2,a=n(i),l=n(s);return`30${n(s+i+4)}02${l}${o}02${a}${r}`}},_0n$1=BigInt(0),_1n$1=BigInt(1);BigInt(2);const _3n=BigInt(3);function weierstrassPoints(e){const t=validatePointOpts(e),{Fp:n}=t,r=t.toBytes||((e,t,r)=>{const o=t.toAffine();return concatBytes$2(Uint8Array.from([4]),n.toBytes(o.x),n.toBytes(o.y))}),o=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function i(e){const{a:r,b:o}=t,i=n.sqr(e),s=n.mul(i,e);return n.add(n.add(s,n.mul(e,r)),o)}if(!n.eql(n.sqr(t.Gy),i(t.Gx)))throw new Error("bad generator point: equation left != right");function s(e){return"bigint"==typeof e&&_0n$1<e&&e<t.n}function a(e){if(!s(e))throw new Error("Expected valid bigint: 0 < bigint < curve.n")}function l(e){const{allowedPrivateKeyLengths:n,nByteLength:r,wrapPrivateKey:o,n:i}=t;if(n&&"bigint"!=typeof e){if(e instanceof Uint8Array&&(e=bytesToHex$2(e)),"string"!=typeof e||!n.includes(e.length))throw new Error("Invalid key");e=e.padStart(2*r,"0")}let s;try{s="bigint"==typeof e?e:bytesToNumberBE(ensureBytes$1("private key",e,r))}catch(t){throw new Error(`private key must be ${r} bytes, hex or bigint, not ${typeof e}`)}return o&&(s=mod(s,i)),a(s),s}const c=new Map;function d(e){if(!(e instanceof h))throw new Error("ProjectivePoint expected")}class h{constructor(e,t,r){if(this.px=e,this.py=t,this.pz=r,null==e||!n.isValid(e))throw new Error("x required");if(null==t||!n.isValid(t))throw new Error("y required");if(null==r||!n.isValid(r))throw new Error("z required")}static fromAffine(e){const{x:t,y:r}=e||{};if(!e||!n.isValid(t)||!n.isValid(r))throw new Error("invalid affine point");if(e instanceof h)throw new Error("projective point not allowed");const o=e=>n.eql(e,n.ZERO);return o(t)&&o(r)?h.ZERO:new h(t,r,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}static fromHex(e){const t=h.fromAffine(o(ensureBytes$1("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return h.BASE.multiply(l(e))}_setWindowSize(e){this._WINDOW_SIZE=e,c.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint)return;throw new Error("bad point: ZERO")}const{x:e,y:r}=this.toAffine();if(!n.isValid(e)||!n.isValid(r))throw new Error("bad point: x or y not FE");const o=n.sqr(r),s=i(e);if(!n.eql(o,s))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){d(e);const{px:t,py:r,pz:o}=this,{px:i,py:s,pz:a}=e,l=n.eql(n.mul(t,a),n.mul(i,o)),c=n.eql(n.mul(r,a),n.mul(s,o));return l&&c}negate(){return new h(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:r}=t,o=n.mul(r,_3n),{px:i,py:s,pz:a}=this;let l=n.ZERO,c=n.ZERO,d=n.ZERO,u=n.mul(i,i),p=n.mul(s,s),f=n.mul(a,a),g=n.mul(i,s);return g=n.add(g,g),d=n.mul(i,a),d=n.add(d,d),l=n.mul(e,d),c=n.mul(o,f),c=n.add(l,c),l=n.sub(p,c),c=n.add(p,c),c=n.mul(l,c),l=n.mul(g,l),d=n.mul(o,d),f=n.mul(e,f),g=n.sub(u,f),g=n.mul(e,g),g=n.add(g,d),d=n.add(u,u),u=n.add(d,u),u=n.add(u,f),u=n.mul(u,g),c=n.add(c,u),f=n.mul(s,a),f=n.add(f,f),u=n.mul(f,g),l=n.sub(l,u),d=n.mul(f,p),d=n.add(d,d),d=n.add(d,d),new h(l,c,d)}add(e){d(e);const{px:r,py:o,pz:i}=this,{px:s,py:a,pz:l}=e;let c=n.ZERO,u=n.ZERO,p=n.ZERO;const f=t.a,g=n.mul(t.b,_3n);let m=n.mul(r,s),b=n.mul(o,a),y=n.mul(i,l),w=n.add(r,o),v=n.add(s,a);w=n.mul(w,v),v=n.add(m,b),w=n.sub(w,v),v=n.add(r,i);let x=n.add(s,l);return v=n.mul(v,x),x=n.add(m,y),v=n.sub(v,x),x=n.add(o,i),c=n.add(a,l),x=n.mul(x,c),c=n.add(b,y),x=n.sub(x,c),p=n.mul(f,v),c=n.mul(g,y),p=n.add(c,p),c=n.sub(b,p),p=n.add(b,p),u=n.mul(c,p),b=n.add(m,m),b=n.add(b,m),y=n.mul(f,y),v=n.mul(g,v),b=n.add(b,y),y=n.sub(m,y),y=n.mul(f,y),v=n.add(v,y),m=n.mul(b,v),u=n.add(u,m),m=n.mul(x,v),c=n.mul(w,c),c=n.sub(c,m),m=n.mul(w,b),p=n.mul(x,p),p=n.add(p,m),new h(c,u,p)}subtract(e){return this.add(e.negate())}is0(){return this.equals(h.ZERO)}wNAF(e){return p.wNAFCached(this,c,e,(e=>{const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}))}multiplyUnsafe(e){const r=h.ZERO;if(e===_0n$1)return r;if(a(e),e===_1n$1)return this;const{endo:o}=t;if(!o)return p.unsafeLadder(this,e);let{k1neg:i,k1:s,k2neg:l,k2:c}=o.splitScalar(e),d=r,u=r,f=this;for(;s>_0n$1||c>_0n$1;)s&_1n$1&&(d=d.add(f)),c&_1n$1&&(u=u.add(f)),f=f.double(),s>>=_1n$1,c>>=_1n$1;return i&&(d=d.negate()),l&&(u=u.negate()),u=new h(n.mul(u.px,o.beta),u.py,u.pz),d.add(u)}multiply(e){a(e);let r,o,i=e;const{endo:s}=t;if(s){const{k1neg:e,k1:t,k2neg:a,k2:l}=s.splitScalar(i);let{p:c,f:d}=this.wNAF(t),{p:u,f:f}=this.wNAF(l);c=p.constTimeNegate(e,c),u=p.constTimeNegate(a,u),u=new h(n.mul(u.px,s.beta),u.py,u.pz),r=c.add(u),o=d.add(f)}else{const{p:e,f:t}=this.wNAF(i);r=e,o=t}return h.normalizeZ([r,o])[0]}multiplyAndAddUnsafe(e,t,n){const r=h.BASE,o=(e,t)=>t!==_0n$1&&t!==_1n$1&&e.equals(r)?e.multiply(t):e.multiplyUnsafe(t),i=o(this,t).add(o(e,n));return i.is0()?void 0:i}toAffine(e){const{px:t,py:r,pz:o}=this,i=this.is0();null==e&&(e=i?n.ONE:n.inv(o));const s=n.mul(t,e),a=n.mul(r,e),l=n.mul(o,e);if(i)return{x:n.ZERO,y:n.ZERO};if(!n.eql(l,n.ONE))throw new Error("invZ was invalid");return{x:s,y:a}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===_1n$1)return!0;if(n)return n(h,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===_1n$1?this:n?n(h,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(h,this,e)}toHex(e=!0){return bytesToHex$2(this.toRawBytes(e))}}h.BASE=new h(t.Gx,t.Gy,n.ONE),h.ZERO=new h(n.ZERO,n.ONE,n.ZERO);const u=t.nBitLength,p=wNAF(h,t.endo?Math.ceil(u/2):u);return{CURVE:t,ProjectivePoint:h,normPrivateKeyToScalar:l,weierstrassEquation:i,isWithinCurveOrder:s}}function validateOpts(e){const t=validateBasic(e);return validateObject(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}function weierstrass(e){const t=validateOpts(e),{Fp:n,n:r}=t,o=n.BYTES+1,i=2*n.BYTES+1;function s(e){return mod(e,r)}function a(e){return invert(e,r)}const{ProjectivePoint:l,normPrivateKeyToScalar:c,weierstrassEquation:d,isWithinCurveOrder:h}=weierstrassPoints({...t,toBytes(e,t,r){const o=t.toAffine(),i=n.toBytes(o.x),s=concatBytes$2;return r?s(Uint8Array.from([t.hasEvenY()?2:3]),i):s(Uint8Array.from([4]),i,n.toBytes(o.y))},fromBytes(e){const t=e.length,r=e[0],s=e.subarray(1);if(t!==o||2!==r&&3!==r){if(t===i&&4===r){return{x:n.fromBytes(s.subarray(0,n.BYTES)),y:n.fromBytes(s.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${o} compressed bytes or ${i} uncompressed bytes`)}{const e=bytesToNumberBE(s);if(!(_0n$1<(a=e)&&a<n.ORDER))throw new Error("Point is not on curve");const t=d(e);let o=n.sqrt(t);return!(1&~r)!==((o&_1n$1)===_1n$1)&&(o=n.neg(o)),{x:e,y:o}}var a}}),u=e=>bytesToHex$2(numberToBytesBE(e,t.nByteLength));function p(e){return e>r>>_1n$1}const f=(e,t,n)=>bytesToNumberBE(e.slice(t,n));class g{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=ensureBytes$1("compactSignature",e,2*n),new g(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=DER.toSig(ensureBytes$1("DER",e));return new g(t,n)}assertValidity(){if(!h(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!h(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new g(this.r,this.s,e)}recoverPublicKey(e){const{r:r,s:o,recovery:i}=this,c=w(ensureBytes$1("msgHash",e));if(null==i||![0,1,2,3].includes(i))throw new Error("recovery id invalid");const d=2===i||3===i?r+t.n:r;if(d>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const h=1&i?"03":"02",p=l.fromHex(h+u(d)),f=a(d),g=s(-c*f),m=s(o*f),b=l.BASE.multiplyAndAddUnsafe(p,g,m);if(!b)throw new Error("point at infinify");return b.assertValidity(),b}hasHighS(){return p(this.s)}normalizeS(){return this.hasHighS()?new g(this.r,s(-this.s),this.recovery):this}toDERRawBytes(){return hexToBytes$2(this.toDERHex())}toDERHex(){return DER.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return hexToBytes$2(this.toCompactHex())}toCompactHex(){return u(this.r)+u(this.s)}}const m={isValidPrivateKey(e){try{return c(e),!0}catch(e){return!1}},normPrivateKeyToScalar:c,randomPrivateKey:()=>numberToBytesBE(hashToPrivateScalar(t.randomBytes(n.BYTES+8),r),t.nByteLength),precompute:(e=8,t=l.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function b(e){const t=e instanceof Uint8Array,n="string"==typeof e,r=(t||n)&&e.length;return t?r===o||r===i:n?r===2*o||r===2*i:e instanceof l}const y=t.bits2int||function(e){const n=bytesToNumberBE(e),r=8*e.length-t.nBitLength;return r>0?n>>BigInt(r):n},w=t.bits2int_modN||function(e){return s(y(e))},v=bitMask(t.nBitLength);function x(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(_0n$1<=e&&e<v))throw new Error(`bigint expected < 2^${t.nBitLength}`);return numberToBytesBE(e,t.nByteLength)}function E(e,r,o=k){if(["recovered","canonical"].some((e=>e in o)))throw new Error("sign() legacy options not supported");const{hash:i,randomBytes:d}=t;let{lowS:u,prehash:f,extraEntropy:m}=o;null==u&&(u=!0),e=ensureBytes$1("msgHash",e),f&&(e=ensureBytes$1("prehashed msgHash",i(e)));const b=w(e),v=c(r),E=[x(v),x(b)];if(null!=m){const e=!0===m?d(n.BYTES):m;E.push(ensureBytes$1("extraEntropy",e,n.BYTES))}const C=concatBytes$2(...E),$=b;return{seed:C,k2sig:function(e){const t=y(e);if(!h(t))return;const n=a(t),r=l.BASE.multiply(t).toAffine(),o=s(r.x);if(o===_0n$1)return;const i=s(n*s($+o*v));if(i===_0n$1)return;let c=(r.x===o?0:2)|Number(r.y&_1n$1),d=i;return u&&p(i)&&(d=function(e){return p(e)?s(-e):e}(i),c^=1),new g(o,d,c)}}}const k={lowS:t.lowS,prehash:!1},C={lowS:t.lowS,prehash:!1};return l.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return l.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(b(e))throw new Error("first arg must be private key");if(!b(t))throw new Error("second arg must be public key");return l.fromHex(t).multiply(c(e)).toRawBytes(n)},sign:function(e,n,r=k){const{seed:o,k2sig:i}=E(e,n,r),s=t;return createHmacDrbg(s.hash.outputLen,s.nByteLength,s.hmac)(o,i)},verify:function(e,n,r,o=C){const i=e;if(n=ensureBytes$1("msgHash",n),r=ensureBytes$1("publicKey",r),"strict"in o)throw new Error("options.strict was renamed to lowS");const{lowS:c,prehash:d}=o;let h,u;try{if("string"==typeof i||i instanceof Uint8Array)try{h=g.fromDER(i)}catch(e){if(!(e instanceof DER.Err))throw e;h=g.fromCompact(i)}else{if("object"!=typeof i||"bigint"!=typeof i.r||"bigint"!=typeof i.s)throw new Error("PARSE");{const{r:e,s:t}=i;h=new g(e,t)}}u=l.fromHex(r)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(c&&h.hasHighS())return!1;d&&(n=t.hash(n));const{r:p,s:f}=h,m=w(n),b=a(f),y=s(m*b),v=s(p*b),x=l.BASE.multiplyAndAddUnsafe(u,y,v)?.toAffine();return!!x&&s(x.x)===p},ProjectivePoint:l,Signature:g,utils:m}}BigInt(4);let HMAC$2=class extends Hash$2{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,assert$3.hash(e);const n=toBytes$3(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,o=new Uint8Array(r);o.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<o.length;e++)o[e]^=54;this.iHash.update(o),this.oHash=e.create();for(let e=0;e<o.length;e++)o[e]^=106;this.oHash.update(o),o.fill(0)}update(e){return assert$3.exists(this),this.iHash.update(e),this}digestInto(e){assert$3.exists(this),assert$3.bytes(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:o,blockLen:i,outputLen:s}=this;return e.finished=r,e.destroyed=o,e.blockLen=i,e.outputLen=s,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}};const hmac$2=(e,t,n)=>new HMAC$2(e,t).update(n).digest();
|
|
6
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function validatePointOpts(e){const t=validateBasic(e);validateObject(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:r,a:o}=t;if(n){if(!r.eql(o,r.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}const{bytesToNumberBE:b2n,hexToBytes:h2b}=ut,DER={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=DER;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],r=e.subarray(2,n+2);if(!n||r.length!==n)throw new t("Invalid signature integer: wrong length");if(128&r[0])throw new t("Invalid signature integer: negative");if(0===r[0]&&!(128&r[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:b2n(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=DER,n="string"==typeof e?h2b(e):e;if(!(n instanceof Uint8Array))throw new Error("ui8a expected");let r=n.length;if(r<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==r-2)throw new t("Invalid signature: incorrect length");const{d:o,l:i}=DER._parseInt(n.subarray(2)),{d:s,l:a}=DER._parseInt(i);if(a.length)throw new t("Invalid signature: left bytes after parsing");return{r:o,s:s}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},r=t(n(e.s)),o=t(n(e.r)),i=r.length/2,s=o.length/2,a=n(i),l=n(s);return`30${n(s+i+4)}02${l}${o}02${a}${r}`}},_0n$1=BigInt(0),_1n$1=BigInt(1);BigInt(2);const _3n=BigInt(3);function weierstrassPoints(e){const t=validatePointOpts(e),{Fp:n}=t,r=t.toBytes||((e,t,r)=>{const o=t.toAffine();return concatBytes$2(Uint8Array.from([4]),n.toBytes(o.x),n.toBytes(o.y))}),o=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function i(e){const{a:r,b:o}=t,i=n.sqr(e),s=n.mul(i,e);return n.add(n.add(s,n.mul(e,r)),o)}if(!n.eql(n.sqr(t.Gy),i(t.Gx)))throw new Error("bad generator point: equation left != right");function s(e){return"bigint"==typeof e&&_0n$1<e&&e<t.n}function a(e){if(!s(e))throw new Error("Expected valid bigint: 0 < bigint < curve.n")}function l(e){const{allowedPrivateKeyLengths:n,nByteLength:r,wrapPrivateKey:o,n:i}=t;if(n&&"bigint"!=typeof e){if(e instanceof Uint8Array&&(e=bytesToHex$2(e)),"string"!=typeof e||!n.includes(e.length))throw new Error("Invalid key");e=e.padStart(2*r,"0")}let s;try{s="bigint"==typeof e?e:bytesToNumberBE(ensureBytes$1("private key",e,r))}catch(t){throw new Error(`private key must be ${r} bytes, hex or bigint, not ${typeof e}`)}return o&&(s=mod(s,i)),a(s),s}const c=new Map;function d(e){if(!(e instanceof h))throw new Error("ProjectivePoint expected")}class h{constructor(e,t,r){if(this.px=e,this.py=t,this.pz=r,null==e||!n.isValid(e))throw new Error("x required");if(null==t||!n.isValid(t))throw new Error("y required");if(null==r||!n.isValid(r))throw new Error("z required")}static fromAffine(e){const{x:t,y:r}=e||{};if(!e||!n.isValid(t)||!n.isValid(r))throw new Error("invalid affine point");if(e instanceof h)throw new Error("projective point not allowed");const o=e=>n.eql(e,n.ZERO);return o(t)&&o(r)?h.ZERO:new h(t,r,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}static fromHex(e){const t=h.fromAffine(o(ensureBytes$1("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return h.BASE.multiply(l(e))}_setWindowSize(e){this._WINDOW_SIZE=e,c.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint)return;throw new Error("bad point: ZERO")}const{x:e,y:r}=this.toAffine();if(!n.isValid(e)||!n.isValid(r))throw new Error("bad point: x or y not FE");const o=n.sqr(r),s=i(e);if(!n.eql(o,s))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){d(e);const{px:t,py:r,pz:o}=this,{px:i,py:s,pz:a}=e,l=n.eql(n.mul(t,a),n.mul(i,o)),c=n.eql(n.mul(r,a),n.mul(s,o));return l&&c}negate(){return new h(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:r}=t,o=n.mul(r,_3n),{px:i,py:s,pz:a}=this;let l=n.ZERO,c=n.ZERO,d=n.ZERO,u=n.mul(i,i),p=n.mul(s,s),f=n.mul(a,a),g=n.mul(i,s);return g=n.add(g,g),d=n.mul(i,a),d=n.add(d,d),l=n.mul(e,d),c=n.mul(o,f),c=n.add(l,c),l=n.sub(p,c),c=n.add(p,c),c=n.mul(l,c),l=n.mul(g,l),d=n.mul(o,d),f=n.mul(e,f),g=n.sub(u,f),g=n.mul(e,g),g=n.add(g,d),d=n.add(u,u),u=n.add(d,u),u=n.add(u,f),u=n.mul(u,g),c=n.add(c,u),f=n.mul(s,a),f=n.add(f,f),u=n.mul(f,g),l=n.sub(l,u),d=n.mul(f,p),d=n.add(d,d),d=n.add(d,d),new h(l,c,d)}add(e){d(e);const{px:r,py:o,pz:i}=this,{px:s,py:a,pz:l}=e;let c=n.ZERO,u=n.ZERO,p=n.ZERO;const f=t.a,g=n.mul(t.b,_3n);let m=n.mul(r,s),b=n.mul(o,a),y=n.mul(i,l),w=n.add(r,o),v=n.add(s,a);w=n.mul(w,v),v=n.add(m,b),w=n.sub(w,v),v=n.add(r,i);let x=n.add(s,l);return v=n.mul(v,x),x=n.add(m,y),v=n.sub(v,x),x=n.add(o,i),c=n.add(a,l),x=n.mul(x,c),c=n.add(b,y),x=n.sub(x,c),p=n.mul(f,v),c=n.mul(g,y),p=n.add(c,p),c=n.sub(b,p),p=n.add(b,p),u=n.mul(c,p),b=n.add(m,m),b=n.add(b,m),y=n.mul(f,y),v=n.mul(g,v),b=n.add(b,y),y=n.sub(m,y),y=n.mul(f,y),v=n.add(v,y),m=n.mul(b,v),u=n.add(u,m),m=n.mul(x,v),c=n.mul(w,c),c=n.sub(c,m),m=n.mul(w,b),p=n.mul(x,p),p=n.add(p,m),new h(c,u,p)}subtract(e){return this.add(e.negate())}is0(){return this.equals(h.ZERO)}wNAF(e){return p.wNAFCached(this,c,e,(e=>{const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}))}multiplyUnsafe(e){const r=h.ZERO;if(e===_0n$1)return r;if(a(e),e===_1n$1)return this;const{endo:o}=t;if(!o)return p.unsafeLadder(this,e);let{k1neg:i,k1:s,k2neg:l,k2:c}=o.splitScalar(e),d=r,u=r,f=this;for(;s>_0n$1||c>_0n$1;)s&_1n$1&&(d=d.add(f)),c&_1n$1&&(u=u.add(f)),f=f.double(),s>>=_1n$1,c>>=_1n$1;return i&&(d=d.negate()),l&&(u=u.negate()),u=new h(n.mul(u.px,o.beta),u.py,u.pz),d.add(u)}multiply(e){a(e);let r,o,i=e;const{endo:s}=t;if(s){const{k1neg:e,k1:t,k2neg:a,k2:l}=s.splitScalar(i);let{p:c,f:d}=this.wNAF(t),{p:u,f:f}=this.wNAF(l);c=p.constTimeNegate(e,c),u=p.constTimeNegate(a,u),u=new h(n.mul(u.px,s.beta),u.py,u.pz),r=c.add(u),o=d.add(f)}else{const{p:e,f:t}=this.wNAF(i);r=e,o=t}return h.normalizeZ([r,o])[0]}multiplyAndAddUnsafe(e,t,n){const r=h.BASE,o=(e,t)=>t!==_0n$1&&t!==_1n$1&&e.equals(r)?e.multiply(t):e.multiplyUnsafe(t),i=o(this,t).add(o(e,n));return i.is0()?void 0:i}toAffine(e){const{px:t,py:r,pz:o}=this,i=this.is0();null==e&&(e=i?n.ONE:n.inv(o));const s=n.mul(t,e),a=n.mul(r,e),l=n.mul(o,e);if(i)return{x:n.ZERO,y:n.ZERO};if(!n.eql(l,n.ONE))throw new Error("invZ was invalid");return{x:s,y:a}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===_1n$1)return!0;if(n)return n(h,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===_1n$1?this:n?n(h,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(h,this,e)}toHex(e=!0){return bytesToHex$2(this.toRawBytes(e))}}h.BASE=new h(t.Gx,t.Gy,n.ONE),h.ZERO=new h(n.ZERO,n.ONE,n.ZERO);const u=t.nBitLength,p=wNAF(h,t.endo?Math.ceil(u/2):u);return{CURVE:t,ProjectivePoint:h,normPrivateKeyToScalar:l,weierstrassEquation:i,isWithinCurveOrder:s}}function validateOpts(e){const t=validateBasic(e);return validateObject(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}function weierstrass(e){const t=validateOpts(e),{Fp:n,n:r}=t,o=n.BYTES+1,i=2*n.BYTES+1;function s(e){return mod(e,r)}function a(e){return invert(e,r)}const{ProjectivePoint:l,normPrivateKeyToScalar:c,weierstrassEquation:d,isWithinCurveOrder:h}=weierstrassPoints({...t,toBytes(e,t,r){const o=t.toAffine(),i=n.toBytes(o.x),s=concatBytes$2;return r?s(Uint8Array.from([t.hasEvenY()?2:3]),i):s(Uint8Array.from([4]),i,n.toBytes(o.y))},fromBytes(e){const t=e.length,r=e[0],s=e.subarray(1);if(t!==o||2!==r&&3!==r){if(t===i&&4===r){return{x:n.fromBytes(s.subarray(0,n.BYTES)),y:n.fromBytes(s.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${o} compressed bytes or ${i} uncompressed bytes`)}{const e=bytesToNumberBE(s);if(!(_0n$1<(a=e)&&a<n.ORDER))throw new Error("Point is not on curve");const t=d(e);let o=n.sqrt(t);return!(1&~r)!==((o&_1n$1)===_1n$1)&&(o=n.neg(o)),{x:e,y:o}}var a}}),u=e=>bytesToHex$2(numberToBytesBE(e,t.nByteLength));function p(e){return e>r>>_1n$1}const f=(e,t,n)=>bytesToNumberBE(e.slice(t,n));class g{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=ensureBytes$1("compactSignature",e,2*n),new g(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=DER.toSig(ensureBytes$1("DER",e));return new g(t,n)}assertValidity(){if(!h(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!h(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new g(this.r,this.s,e)}recoverPublicKey(e){const{r:r,s:o,recovery:i}=this,c=w(ensureBytes$1("msgHash",e));if(null==i||![0,1,2,3].includes(i))throw new Error("recovery id invalid");const d=2===i||3===i?r+t.n:r;if(d>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const h=1&i?"03":"02",p=l.fromHex(h+u(d)),f=a(d),g=s(-c*f),m=s(o*f),b=l.BASE.multiplyAndAddUnsafe(p,g,m);if(!b)throw new Error("point at infinify");return b.assertValidity(),b}hasHighS(){return p(this.s)}normalizeS(){return this.hasHighS()?new g(this.r,s(-this.s),this.recovery):this}toDERRawBytes(){return hexToBytes$2(this.toDERHex())}toDERHex(){return DER.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return hexToBytes$2(this.toCompactHex())}toCompactHex(){return u(this.r)+u(this.s)}}const m={isValidPrivateKey(e){try{return c(e),!0}catch(e){return!1}},normPrivateKeyToScalar:c,randomPrivateKey:()=>numberToBytesBE(hashToPrivateScalar(t.randomBytes(n.BYTES+8),r),t.nByteLength),precompute:(e=8,t=l.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function b(e){const t=e instanceof Uint8Array,n="string"==typeof e,r=(t||n)&&e.length;return t?r===o||r===i:n?r===2*o||r===2*i:e instanceof l}const y=t.bits2int||function(e){const n=bytesToNumberBE(e),r=8*e.length-t.nBitLength;return r>0?n>>BigInt(r):n},w=t.bits2int_modN||function(e){return s(y(e))},v=bitMask(t.nBitLength);function x(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(_0n$1<=e&&e<v))throw new Error(`bigint expected < 2^${t.nBitLength}`);return numberToBytesBE(e,t.nByteLength)}function k(e,r,o=E){if(["recovered","canonical"].some((e=>e in o)))throw new Error("sign() legacy options not supported");const{hash:i,randomBytes:d}=t;let{lowS:u,prehash:f,extraEntropy:m}=o;null==u&&(u=!0),e=ensureBytes$1("msgHash",e),f&&(e=ensureBytes$1("prehashed msgHash",i(e)));const b=w(e),v=c(r),k=[x(v),x(b)];if(null!=m){const e=!0===m?d(n.BYTES):m;k.push(ensureBytes$1("extraEntropy",e,n.BYTES))}const C=concatBytes$2(...k),$=b;return{seed:C,k2sig:function(e){const t=y(e);if(!h(t))return;const n=a(t),r=l.BASE.multiply(t).toAffine(),o=s(r.x);if(o===_0n$1)return;const i=s(n*s($+o*v));if(i===_0n$1)return;let c=(r.x===o?0:2)|Number(r.y&_1n$1),d=i;return u&&p(i)&&(d=function(e){return p(e)?s(-e):e}(i),c^=1),new g(o,d,c)}}}const E={lowS:t.lowS,prehash:!1},C={lowS:t.lowS,prehash:!1};return l.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return l.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(b(e))throw new Error("first arg must be private key");if(!b(t))throw new Error("second arg must be public key");return l.fromHex(t).multiply(c(e)).toRawBytes(n)},sign:function(e,n,r=E){const{seed:o,k2sig:i}=k(e,n,r),s=t;return createHmacDrbg(s.hash.outputLen,s.nByteLength,s.hmac)(o,i)},verify:function(e,n,r,o=C){const i=e;if(n=ensureBytes$1("msgHash",n),r=ensureBytes$1("publicKey",r),"strict"in o)throw new Error("options.strict was renamed to lowS");const{lowS:c,prehash:d}=o;let h,u;try{if("string"==typeof i||i instanceof Uint8Array)try{h=g.fromDER(i)}catch(e){if(!(e instanceof DER.Err))throw e;h=g.fromCompact(i)}else{if("object"!=typeof i||"bigint"!=typeof i.r||"bigint"!=typeof i.s)throw new Error("PARSE");{const{r:e,s:t}=i;h=new g(e,t)}}u=l.fromHex(r)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(c&&h.hasHighS())return!1;d&&(n=t.hash(n));const{r:p,s:f}=h,m=w(n),b=a(f),y=s(m*b),v=s(p*b),x=l.BASE.multiplyAndAddUnsafe(u,y,v)?.toAffine();return!!x&&s(x.x)===p},ProjectivePoint:l,Signature:g,utils:m}}BigInt(4);let HMAC$2=class extends Hash$2{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,assert$3.hash(e);const n=toBytes$3(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,o=new Uint8Array(r);o.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<o.length;e++)o[e]^=54;this.iHash.update(o),this.oHash=e.create();for(let e=0;e<o.length;e++)o[e]^=106;this.oHash.update(o),o.fill(0)}update(e){return assert$3.exists(this),this.iHash.update(e),this}digestInto(e){assert$3.exists(this),assert$3.bytes(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:o,blockLen:i,outputLen:s}=this;return e.finished=r,e.destroyed=o,e.blockLen=i,e.outputLen=s,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}};const hmac$2=(e,t,n)=>new HMAC$2(e,t).update(n).digest();
|
|
7
7
|
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
8
8
|
function getHash(e){return{hash:e,hmac:(t,...n)=>hmac$2(e,t,concatBytes$3(...n)),randomBytes:randomBytes$2}}function createCurve(e,t){const n=t=>weierstrass({...e,...getHash(t)});return Object.freeze({...n(t),create:n})}
|
|
9
|
-
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */hmac$2.create=(e,t)=>new HMAC$2(e,t);const secp256k1P=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),secp256k1N=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),_1n=BigInt(1),_2n=BigInt(2),divNearest=(e,t)=>(e+t/_2n)/t;function sqrtMod(e){const t=secp256k1P,n=BigInt(3),r=BigInt(6),o=BigInt(11),i=BigInt(22),s=BigInt(23),a=BigInt(44),l=BigInt(88),c=e*e*e%t,d=c*c*e%t,h=pow2(d,n,t)*d%t,u=pow2(h,n,t)*d%t,p=pow2(u,_2n,t)*c%t,f=pow2(p,o,t)*p%t,g=pow2(f,i,t)*f%t,m=pow2(g,a,t)*g%t,b=pow2(m,l,t)*m%t,y=pow2(b,a,t)*g%t,w=pow2(y,n,t)*d%t,v=pow2(w,s,t)*f%t,x=pow2(v,r,t)*c%t,E=pow2(x,_2n,t);if(!Fp.eql(Fp.sqr(E),e))throw new Error("Cannot find square root");return E}const Fp=Field(secp256k1P,void 0,void 0,{sqrt:sqrtMod}),secp256k1=createCurve({a:BigInt(0),b:BigInt(7),Fp:Fp,n:secp256k1N,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=secp256k1N,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-_1n*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),o=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=n,s=BigInt("0x100000000000000000000000000000000"),a=divNearest(i*e,t),l=divNearest(-r*e,t);let c=mod(e-a*n-l*o,t),d=mod(-a*r-l*i,t);const h=c>s,u=d>s;if(h&&(c=t-c),u&&(d=t-d),c>s||d>s)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:h,k1:c,k2neg:u,k2:d}}}},sha256$2),_0n=BigInt(0),fe=e=>"bigint"==typeof e&&_0n<e&&e<secp256k1P,ge=e=>"bigint"==typeof e&&_0n<e&&e<secp256k1N,TAGGED_HASH_PREFIXES={};function taggedHash(e,...t){let n=TAGGED_HASH_PREFIXES[e];if(void 0===n){const t=sha256$2(Uint8Array.from(e,(e=>e.charCodeAt(0))));n=concatBytes$2(t,t),TAGGED_HASH_PREFIXES[e]=n}return sha256$2(concatBytes$2(n,...t))}const pointToBytes=e=>e.toRawBytes(!0).slice(1),numTo32b=e=>numberToBytesBE(e,32),modP=e=>mod(e,secp256k1P),modN=e=>mod(e,secp256k1N),Point$1=secp256k1.ProjectivePoint,GmulAdd=(e,t,n)=>Point$1.BASE.multiplyAndAddUnsafe(e,t,n);function schnorrGetExtPubKey(e){let t=secp256k1.utils.normPrivateKeyToScalar(e),n=Point$1.fromPrivateKey(t);return{scalar:n.hasEvenY()?t:modN(-t),bytes:pointToBytes(n)}}function lift_x(e){if(!fe(e))throw new Error("bad x: need 0 < x < p");const t=modP(e*e);let n=sqrtMod(modP(t*e+BigInt(7)));n%_2n!==_0n&&(n=modP(-n));const r=new Point$1(e,n,_1n);return r.assertValidity(),r}function challenge(...e){return modN(bytesToNumberBE(taggedHash("BIP0340/challenge",...e)))}function schnorrGetPublicKey(e){return schnorrGetExtPubKey(e).bytes}function schnorrSign(e,t,n=randomBytes$2(32)){const r=ensureBytes$1("message",e),{bytes:o,scalar:i}=schnorrGetExtPubKey(t),s=ensureBytes$1("auxRand",n,32),a=numTo32b(i^bytesToNumberBE(taggedHash("BIP0340/aux",s))),l=taggedHash("BIP0340/nonce",a,o,r),c=modN(bytesToNumberBE(l));if(c===_0n)throw new Error("sign failed: k is zero");const{bytes:d,scalar:h}=schnorrGetExtPubKey(c),u=challenge(d,o,r),p=new Uint8Array(64);if(p.set(d,0),p.set(numTo32b(modN(h+u*i)),32),!schnorrVerify(p,r,o))throw new Error("sign: Invalid signature produced");return p}function schnorrVerify(e,t,n){const r=ensureBytes$1("signature",e,64),o=ensureBytes$1("message",t),i=ensureBytes$1("publicKey",n,32);try{const e=lift_x(bytesToNumberBE(i)),t=bytesToNumberBE(r.subarray(0,32));if(!fe(t))return!1;const n=bytesToNumberBE(r.subarray(32,64));if(!ge(n))return!1;const s=challenge(numTo32b(t),pointToBytes(e),o),a=GmulAdd(e,n,modN(-s));return!(!a||!a.hasEvenY()||a.toAffine().x!==t)}catch(e){return!1}}const schnorr=(()=>({getPublicKey:schnorrGetPublicKey,sign:schnorrSign,verify:schnorrVerify,utils:{randomPrivateKey:secp256k1.utils.randomPrivateKey,lift_x:lift_x,pointToBytes:pointToBytes,numberToBytesBE:numberToBytesBE,bytesToNumberBE:bytesToNumberBE,taggedHash:taggedHash,mod:mod}}))(),crypto$2="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,u8a$1=e=>e instanceof Uint8Array,createView$1=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),rotr$1=(e,t)=>e<<32-t|e>>>t,isLE$2=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];if(!isLE$2)throw new Error("Non little-endian hardware is not supported");const hexes$1=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function bytesToHex$1(e){if(!u8a$1(e))throw new Error("Uint8Array expected");let t="";for(let n=0;n<e.length;n++)t+=hexes$1[e[n]];return t}function hexToBytes$1(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const n=new Uint8Array(t/2);for(let t=0;t<n.length;t++){const r=2*t,o=e.slice(r,r+2),i=Number.parseInt(o,16);if(Number.isNaN(i)||i<0)throw new Error("Invalid byte sequence");n[t]=i}return n}function utf8ToBytes$2(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function toBytes$2(e){if("string"==typeof e&&(e=utf8ToBytes$2(e)),!u8a$1(e))throw new Error("expected Uint8Array, got "+typeof e);return e}function concatBytes$1(...e){const t=new Uint8Array(e.reduce(((e,t)=>e+t.length),0));let n=0;return e.forEach((e=>{if(!u8a$1(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}let Hash$1=class{clone(){return this._cloneInto()}};function wrapConstructor$1(e){const t=t=>e().update(toBytes$2(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function randomBytes$1(e=32){if(crypto$2&&"function"==typeof crypto$2.getRandomValues)return crypto$2.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}function number$2(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function bool$2(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)}function bytes$2(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function hash$2(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");number$2(e.outputLen),number$2(e.blockLen)}function exists$2(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function output$2(e,t){bytes$2(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}const assert$2={number:number$2,bool:bool$2,bytes:bytes$2,hash:hash$2,exists:exists$2,output:output$2};function setBigUint64$1(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const o=BigInt(32),i=BigInt(4294967295),s=Number(n>>o&i),a=Number(n&i),l=r?4:0,c=r?0:4;e.setUint32(t+l,s,r),e.setUint32(t+c,a,r)}let SHA2$1=class extends Hash$1{constructor(e,t,n,r){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=createView$1(this.buffer)}update(e){assert$2.exists(this);const{view:t,buffer:n,blockLen:r}=this,o=(e=toBytes$2(e)).length;for(let i=0;i<o;){const s=Math.min(r-this.pos,o-i);if(s!==r)n.set(e.subarray(i,i+s),this.pos),this.pos+=s,i+=s,this.pos===r&&(this.process(t,0),this.pos=0);else{const t=createView$1(e);for(;r<=o-i;i+=r)this.process(t,i)}}return this.length+=e.length,this.roundClean(),this}digestInto(e){assert$2.exists(this),assert$2.output(e,this),this.finished=!0;const{buffer:t,view:n,blockLen:r,isLE:o}=this;let{pos:i}=this;t[i++]=128,this.buffer.subarray(i).fill(0),this.padOffset>r-i&&(this.process(n,0),i=0);for(let e=i;e<r;e++)t[e]=0;setBigUint64$1(n,r-8,BigInt(8*this.length),o),this.process(n,0);const s=createView$1(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=a/4,c=this.get();if(l>c.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;e<l;e++)s.setUint32(4*e,c[e],o)}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());const{blockLen:t,buffer:n,length:r,finished:o,destroyed:i,pos:s}=this;return e.length=r,e.pos=s,e.finished=o,e.destroyed=i,r%t&&e.buffer.set(n),e}};const Chi$1=(e,t,n)=>e&t^~e&n,Maj$1=(e,t,n)=>e&t^e&n^t&n,SHA256_K$1=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),IV$1=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),SHA256_W$1=new Uint32Array(64);let SHA256$1=class extends SHA2$1{constructor(){super(64,32,8,!1),this.A=0|IV$1[0],this.B=0|IV$1[1],this.C=0|IV$1[2],this.D=0|IV$1[3],this.E=0|IV$1[4],this.F=0|IV$1[5],this.G=0|IV$1[6],this.H=0|IV$1[7]}get(){const{A:e,B:t,C:n,D:r,E:o,F:i,G:s,H:a}=this;return[e,t,n,r,o,i,s,a]}set(e,t,n,r,o,i,s,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|o,this.F=0|i,this.G=0|s,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)SHA256_W$1[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=SHA256_W$1[e-15],n=SHA256_W$1[e-2],r=rotr$1(t,7)^rotr$1(t,18)^t>>>3,o=rotr$1(n,17)^rotr$1(n,19)^n>>>10;SHA256_W$1[e]=o+SHA256_W$1[e-7]+r+SHA256_W$1[e-16]|0}let{A:n,B:r,C:o,D:i,E:s,F:a,G:l,H:c}=this;for(let e=0;e<64;e++){const t=c+(rotr$1(s,6)^rotr$1(s,11)^rotr$1(s,25))+Chi$1(s,a,l)+SHA256_K$1[e]+SHA256_W$1[e]|0,d=(rotr$1(n,2)^rotr$1(n,13)^rotr$1(n,22))+Maj$1(n,r,o)|0;c=l,l=a,a=s,s=i+t|0,i=o,o=r,r=n,n=t+d|0}n=n+this.A|0,r=r+this.B|0,o=o+this.C|0,i=i+this.D|0,s=s+this.E|0,a=a+this.F|0,l=l+this.G|0,c=c+this.H|0,this.set(n,r,o,i,s,a,l,c)}roundClean(){SHA256_W$1.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}};class SHA224 extends SHA256$1{constructor(){super(),this.A=-1056596264,this.B=914150663,this.C=812702999,this.D=-150054599,this.E=-4191439,this.F=1750603025,this.G=1694076839,this.H=-1090891868,this.outputLen=28}}const sha256$1=wrapConstructor$1((()=>new SHA256$1));
|
|
9
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */hmac$2.create=(e,t)=>new HMAC$2(e,t);const secp256k1P=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),secp256k1N=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),_1n=BigInt(1),_2n=BigInt(2),divNearest=(e,t)=>(e+t/_2n)/t;function sqrtMod(e){const t=secp256k1P,n=BigInt(3),r=BigInt(6),o=BigInt(11),i=BigInt(22),s=BigInt(23),a=BigInt(44),l=BigInt(88),c=e*e*e%t,d=c*c*e%t,h=pow2(d,n,t)*d%t,u=pow2(h,n,t)*d%t,p=pow2(u,_2n,t)*c%t,f=pow2(p,o,t)*p%t,g=pow2(f,i,t)*f%t,m=pow2(g,a,t)*g%t,b=pow2(m,l,t)*m%t,y=pow2(b,a,t)*g%t,w=pow2(y,n,t)*d%t,v=pow2(w,s,t)*f%t,x=pow2(v,r,t)*c%t,k=pow2(x,_2n,t);if(!Fp.eql(Fp.sqr(k),e))throw new Error("Cannot find square root");return k}const Fp=Field(secp256k1P,void 0,void 0,{sqrt:sqrtMod}),secp256k1=createCurve({a:BigInt(0),b:BigInt(7),Fp:Fp,n:secp256k1N,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=secp256k1N,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-_1n*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),o=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=n,s=BigInt("0x100000000000000000000000000000000"),a=divNearest(i*e,t),l=divNearest(-r*e,t);let c=mod(e-a*n-l*o,t),d=mod(-a*r-l*i,t);const h=c>s,u=d>s;if(h&&(c=t-c),u&&(d=t-d),c>s||d>s)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:h,k1:c,k2neg:u,k2:d}}}},sha256$2),_0n=BigInt(0),fe=e=>"bigint"==typeof e&&_0n<e&&e<secp256k1P,ge=e=>"bigint"==typeof e&&_0n<e&&e<secp256k1N,TAGGED_HASH_PREFIXES={};function taggedHash(e,...t){let n=TAGGED_HASH_PREFIXES[e];if(void 0===n){const t=sha256$2(Uint8Array.from(e,(e=>e.charCodeAt(0))));n=concatBytes$2(t,t),TAGGED_HASH_PREFIXES[e]=n}return sha256$2(concatBytes$2(n,...t))}const pointToBytes=e=>e.toRawBytes(!0).slice(1),numTo32b=e=>numberToBytesBE(e,32),modP=e=>mod(e,secp256k1P),modN=e=>mod(e,secp256k1N),Point$1=secp256k1.ProjectivePoint,GmulAdd=(e,t,n)=>Point$1.BASE.multiplyAndAddUnsafe(e,t,n);function schnorrGetExtPubKey(e){let t=secp256k1.utils.normPrivateKeyToScalar(e),n=Point$1.fromPrivateKey(t);return{scalar:n.hasEvenY()?t:modN(-t),bytes:pointToBytes(n)}}function lift_x(e){if(!fe(e))throw new Error("bad x: need 0 < x < p");const t=modP(e*e);let n=sqrtMod(modP(t*e+BigInt(7)));n%_2n!==_0n&&(n=modP(-n));const r=new Point$1(e,n,_1n);return r.assertValidity(),r}function challenge(...e){return modN(bytesToNumberBE(taggedHash("BIP0340/challenge",...e)))}function schnorrGetPublicKey(e){return schnorrGetExtPubKey(e).bytes}function schnorrSign(e,t,n=randomBytes$2(32)){const r=ensureBytes$1("message",e),{bytes:o,scalar:i}=schnorrGetExtPubKey(t),s=ensureBytes$1("auxRand",n,32),a=numTo32b(i^bytesToNumberBE(taggedHash("BIP0340/aux",s))),l=taggedHash("BIP0340/nonce",a,o,r),c=modN(bytesToNumberBE(l));if(c===_0n)throw new Error("sign failed: k is zero");const{bytes:d,scalar:h}=schnorrGetExtPubKey(c),u=challenge(d,o,r),p=new Uint8Array(64);if(p.set(d,0),p.set(numTo32b(modN(h+u*i)),32),!schnorrVerify(p,r,o))throw new Error("sign: Invalid signature produced");return p}function schnorrVerify(e,t,n){const r=ensureBytes$1("signature",e,64),o=ensureBytes$1("message",t),i=ensureBytes$1("publicKey",n,32);try{const e=lift_x(bytesToNumberBE(i)),t=bytesToNumberBE(r.subarray(0,32));if(!fe(t))return!1;const n=bytesToNumberBE(r.subarray(32,64));if(!ge(n))return!1;const s=challenge(numTo32b(t),pointToBytes(e),o),a=GmulAdd(e,n,modN(-s));return!(!a||!a.hasEvenY()||a.toAffine().x!==t)}catch(e){return!1}}const schnorr=(()=>({getPublicKey:schnorrGetPublicKey,sign:schnorrSign,verify:schnorrVerify,utils:{randomPrivateKey:secp256k1.utils.randomPrivateKey,lift_x:lift_x,pointToBytes:pointToBytes,numberToBytesBE:numberToBytesBE,bytesToNumberBE:bytesToNumberBE,taggedHash:taggedHash,mod:mod}}))(),crypto$2="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,u8a$1=e=>e instanceof Uint8Array,createView$1=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),rotr$1=(e,t)=>e<<32-t|e>>>t,isLE$2=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];if(!isLE$2)throw new Error("Non little-endian hardware is not supported");const hexes$1=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function bytesToHex$1(e){if(!u8a$1(e))throw new Error("Uint8Array expected");let t="";for(let n=0;n<e.length;n++)t+=hexes$1[e[n]];return t}function hexToBytes$1(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const n=new Uint8Array(t/2);for(let t=0;t<n.length;t++){const r=2*t,o=e.slice(r,r+2),i=Number.parseInt(o,16);if(Number.isNaN(i)||i<0)throw new Error("Invalid byte sequence");n[t]=i}return n}function utf8ToBytes$2(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function toBytes$2(e){if("string"==typeof e&&(e=utf8ToBytes$2(e)),!u8a$1(e))throw new Error("expected Uint8Array, got "+typeof e);return e}function concatBytes$1(...e){const t=new Uint8Array(e.reduce(((e,t)=>e+t.length),0));let n=0;return e.forEach((e=>{if(!u8a$1(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}let Hash$1=class{clone(){return this._cloneInto()}};function wrapConstructor$1(e){const t=t=>e().update(toBytes$2(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function randomBytes$1(e=32){if(crypto$2&&"function"==typeof crypto$2.getRandomValues)return crypto$2.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}function number$2(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function bool$2(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)}function bytes$2(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function hash$2(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");number$2(e.outputLen),number$2(e.blockLen)}function exists$2(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function output$2(e,t){bytes$2(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}const assert$2={number:number$2,bool:bool$2,bytes:bytes$2,hash:hash$2,exists:exists$2,output:output$2};function setBigUint64$1(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const o=BigInt(32),i=BigInt(4294967295),s=Number(n>>o&i),a=Number(n&i),l=r?4:0,c=r?0:4;e.setUint32(t+l,s,r),e.setUint32(t+c,a,r)}let SHA2$1=class extends Hash$1{constructor(e,t,n,r){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=createView$1(this.buffer)}update(e){assert$2.exists(this);const{view:t,buffer:n,blockLen:r}=this,o=(e=toBytes$2(e)).length;for(let i=0;i<o;){const s=Math.min(r-this.pos,o-i);if(s!==r)n.set(e.subarray(i,i+s),this.pos),this.pos+=s,i+=s,this.pos===r&&(this.process(t,0),this.pos=0);else{const t=createView$1(e);for(;r<=o-i;i+=r)this.process(t,i)}}return this.length+=e.length,this.roundClean(),this}digestInto(e){assert$2.exists(this),assert$2.output(e,this),this.finished=!0;const{buffer:t,view:n,blockLen:r,isLE:o}=this;let{pos:i}=this;t[i++]=128,this.buffer.subarray(i).fill(0),this.padOffset>r-i&&(this.process(n,0),i=0);for(let e=i;e<r;e++)t[e]=0;setBigUint64$1(n,r-8,BigInt(8*this.length),o),this.process(n,0);const s=createView$1(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=a/4,c=this.get();if(l>c.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;e<l;e++)s.setUint32(4*e,c[e],o)}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());const{blockLen:t,buffer:n,length:r,finished:o,destroyed:i,pos:s}=this;return e.length=r,e.pos=s,e.finished=o,e.destroyed=i,r%t&&e.buffer.set(n),e}};const Chi$1=(e,t,n)=>e&t^~e&n,Maj$1=(e,t,n)=>e&t^e&n^t&n,SHA256_K$1=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),IV$1=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),SHA256_W$1=new Uint32Array(64);let SHA256$1=class extends SHA2$1{constructor(){super(64,32,8,!1),this.A=0|IV$1[0],this.B=0|IV$1[1],this.C=0|IV$1[2],this.D=0|IV$1[3],this.E=0|IV$1[4],this.F=0|IV$1[5],this.G=0|IV$1[6],this.H=0|IV$1[7]}get(){const{A:e,B:t,C:n,D:r,E:o,F:i,G:s,H:a}=this;return[e,t,n,r,o,i,s,a]}set(e,t,n,r,o,i,s,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|o,this.F=0|i,this.G=0|s,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)SHA256_W$1[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=SHA256_W$1[e-15],n=SHA256_W$1[e-2],r=rotr$1(t,7)^rotr$1(t,18)^t>>>3,o=rotr$1(n,17)^rotr$1(n,19)^n>>>10;SHA256_W$1[e]=o+SHA256_W$1[e-7]+r+SHA256_W$1[e-16]|0}let{A:n,B:r,C:o,D:i,E:s,F:a,G:l,H:c}=this;for(let e=0;e<64;e++){const t=c+(rotr$1(s,6)^rotr$1(s,11)^rotr$1(s,25))+Chi$1(s,a,l)+SHA256_K$1[e]+SHA256_W$1[e]|0,d=(rotr$1(n,2)^rotr$1(n,13)^rotr$1(n,22))+Maj$1(n,r,o)|0;c=l,l=a,a=s,s=i+t|0,i=o,o=r,r=n,n=t+d|0}n=n+this.A|0,r=r+this.B|0,o=o+this.C|0,i=i+this.D|0,s=s+this.E|0,a=a+this.F|0,l=l+this.G|0,c=c+this.H|0,this.set(n,r,o,i,s,a,l,c)}roundClean(){SHA256_W$1.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}};class SHA224 extends SHA256$1{constructor(){super(),this.A=-1056596264,this.B=914150663,this.C=812702999,this.D=-150054599,this.E=-4191439,this.F=1750603025,this.G=1694076839,this.H=-1090891868,this.outputLen=28}}const sha256$1=wrapConstructor$1((()=>new SHA256$1));
|
|
10
10
|
/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
11
11
|
function assertNumber(e){if(!Number.isSafeInteger(e))throw new Error(`Wrong integer: ${e}`)}function chain$1(...e){const t=(e,t)=>n=>e(t(n));return{encode:Array.from(e).reverse().reduce(((e,n)=>e?t(e,n.encode):n.encode),void 0),decode:e.reduce(((e,n)=>e?t(e,n.decode):n.decode),void 0)}}function alphabet$1(e){return{encode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("alphabet.encode input should be an array of numbers");return t.map((t=>{if(assertNumber(t),t<0||t>=e.length)throw new Error(`Digit index outside alphabet: ${t} (alphabet: ${e.length})`);return e[t]}))},decode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("alphabet.decode input should be array of strings");return t.map((t=>{if("string"!=typeof t)throw new Error(`alphabet.decode: not string element=${t}`);const n=e.indexOf(t);if(-1===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}}function join$1(e=""){if("string"!=typeof e)throw new Error("join separator should be string");return{encode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("join.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`join.encode: non-string input=${e}`);return t.join(e)},decode:t=>{if("string"!=typeof t)throw new Error("join.decode input should be string");return t.split(e)}}}function padding$1(e,t="="){if(assertNumber(e),"string"!=typeof t)throw new Error("padding chr should be string");return{encode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.encode: non-string input=${e}`);for(;n.length*e%8;)n.push(t);return n},decode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.decode: non-string input=${e}`);let r=n.length;if(r*e%8)throw new Error("Invalid padding: string should have whole number of bytes");for(;r>0&&n[r-1]===t;r--)if(!((r-1)*e%8))throw new Error("Invalid padding: string has too much padding");return n.slice(0,r)}}}function normalize$1(e){if("function"!=typeof e)throw new Error("normalize fn should be function");return{encode:e=>e,decode:t=>e(t)}}function convertRadix$1(e,t,n){if(t<2)throw new Error(`convertRadix: wrong from=${t}, base cannot be less than 2`);if(n<2)throw new Error(`convertRadix: wrong to=${n}, base cannot be less than 2`);if(!Array.isArray(e))throw new Error("convertRadix: data should be array");if(!e.length)return[];let r=0;const o=[],i=Array.from(e);for(i.forEach((e=>{if(assertNumber(e),e<0||e>=t)throw new Error(`Wrong integer: ${e}`)}));;){let e=0,s=!0;for(let o=r;o<i.length;o++){const a=i[o],l=t*e+a;if(!Number.isSafeInteger(l)||t*e/t!==e||l-a!=t*e)throw new Error("convertRadix: carry overflow");if(e=l%n,i[o]=Math.floor(l/n),!Number.isSafeInteger(i[o])||i[o]*n+e!==l)throw new Error("convertRadix: carry overflow");s&&(i[o]?s=!1:r=o)}if(o.push(e),s)break}for(let t=0;t<e.length-1&&0===e[t];t++)o.push(0);return o.reverse()}wrapConstructor$1((()=>new SHA224));const gcd$1=(e,t)=>t?gcd$1(t,e%t):e,radix2carry$1=(e,t)=>e+(t-gcd$1(e,t));function convertRadix2$1(e,t,n,r){if(!Array.isArray(e))throw new Error("convertRadix2: data should be array");if(t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(radix2carry$1(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${radix2carry$1(t,n)}`);let o=0,i=0;const s=2**n-1,a=[];for(const r of e){if(assertNumber(r),r>=2**t)throw new Error(`convertRadix2: invalid data word=${r} from=${t}`);if(o=o<<t|r,i+t>32)throw new Error(`convertRadix2: carry overflow pos=${i} from=${t}`);for(i+=t;i>=n;i-=n)a.push((o>>i-n&s)>>>0);o&=2**i-1}if(o=o<<n-i&s,!r&&i>=t)throw new Error("Excess padding");if(!r&&o)throw new Error(`Non-zero padding: ${o}`);return r&&i>0&&a.push(o>>>0),a}function radix$1(e){return assertNumber(e),{encode:t=>{if(!(t instanceof Uint8Array))throw new Error("radix.encode input should be Uint8Array");return convertRadix$1(Array.from(t),256,e)},decode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("radix.decode input should be array of strings");return Uint8Array.from(convertRadix$1(t,e,256))}}}function radix2$1(e,t=!1){if(assertNumber(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(radix2carry$1(8,e)>32||radix2carry$1(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!(n instanceof Uint8Array))throw new Error("radix2.encode input should be Uint8Array");return convertRadix2$1(Array.from(n),8,e,!t)},decode:n=>{if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("radix2.decode input should be array of strings");return Uint8Array.from(convertRadix2$1(n,e,8,t))}}}function unsafeWrapper(e){if("function"!=typeof e)throw new Error("unsafeWrapper fn should be function");return function(...t){try{return e.apply(null,t)}catch(e){}}}const base16=chain$1(radix2$1(4),alphabet$1("0123456789ABCDEF"),join$1("")),base32=chain$1(radix2$1(5),alphabet$1("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),padding$1(5),join$1(""));chain$1(radix2$1(5),alphabet$1("0123456789ABCDEFGHIJKLMNOPQRSTUV"),padding$1(5),join$1("")),chain$1(radix2$1(5),alphabet$1("0123456789ABCDEFGHJKMNPQRSTVWXYZ"),join$1(""),normalize$1((e=>e.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1"))));const base64$1=chain$1(radix2$1(6),alphabet$1("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),padding$1(6),join$1("")),base64url=chain$1(radix2$1(6),alphabet$1("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),padding$1(6),join$1("")),genBase58$1=e=>chain$1(radix$1(58),alphabet$1(e),join$1("")),base58$1=genBase58$1("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");genBase58$1("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),genBase58$1("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz");const XMR_BLOCK_LEN=[0,2,3,5,6,7,9,10,11],base58xmr={encode(e){let t="";for(let n=0;n<e.length;n+=8){const r=e.subarray(n,n+8);t+=base58$1.encode(r).padStart(XMR_BLOCK_LEN[r.length],"1")}return t},decode(e){let t=[];for(let n=0;n<e.length;n+=11){const r=e.slice(n,n+11),o=XMR_BLOCK_LEN.indexOf(r.length),i=base58$1.decode(r);for(let e=0;e<i.length-o;e++)if(0!==i[e])throw new Error("base58xmr: wrong padding");t=t.concat(Array.from(i.slice(i.length-o)))}return Uint8Array.from(t)}},BECH_ALPHABET=chain$1(alphabet$1("qpzry9x8gf2tvdw0s3jn54khce6mua7l"),join$1("")),POLYMOD_GENERATORS=[996825010,642813549,513874426,1027748829,705979059];function bech32Polymod(e){const t=e>>25;let n=(33554431&e)<<5;for(let e=0;e<POLYMOD_GENERATORS.length;e++)1==(t>>e&1)&&(n^=POLYMOD_GENERATORS[e]);return n}function bechChecksum(e,t,n=1){const r=e.length;let o=1;for(let t=0;t<r;t++){const n=e.charCodeAt(t);if(n<33||n>126)throw new Error(`Invalid prefix (${e})`);o=bech32Polymod(o)^n>>5}o=bech32Polymod(o);for(let t=0;t<r;t++)o=bech32Polymod(o)^31&e.charCodeAt(t);for(let e of t)o=bech32Polymod(o)^e;for(let e=0;e<6;e++)o=bech32Polymod(o);return o^=n,BECH_ALPHABET.encode(convertRadix2$1([o%2**30],30,5,!1))}function genBech32(e){const t="bech32"===e?1:734539939,n=radix2$1(5),r=n.decode,o=n.encode,i=unsafeWrapper(r);function s(e,n=90){if("string"!=typeof e)throw new Error("bech32.decode input should be string, not "+typeof e);if(e.length<8||!1!==n&&e.length>n)throw new TypeError(`Wrong string length: ${e.length} (${e}). Expected (8..${n})`);const r=e.toLowerCase();if(e!==r&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const o=(e=r).lastIndexOf("1");if(0===o||-1===o)throw new Error('Letter "1" must be present between prefix and data only');const i=e.slice(0,o),s=e.slice(o+1);if(s.length<6)throw new Error("Data must be at least 6 characters long");const a=BECH_ALPHABET.decode(s).slice(0,-6),l=bechChecksum(i,a,t);if(!s.endsWith(l))throw new Error(`Invalid checksum in ${e}: expected "${l}"`);return{prefix:i,words:a}}return{encode:function(e,n,r=90){if("string"!=typeof e)throw new Error("bech32.encode prefix should be string, not "+typeof e);if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("bech32.encode words should be array of numbers, not "+typeof n);const o=e.length+7+n.length;if(!1!==r&&o>r)throw new TypeError(`Length ${o} exceeds limit ${r}`);return`${e=e.toLowerCase()}1${BECH_ALPHABET.encode(n)}${bechChecksum(e,n,t)}`},decode:s,decodeToBytes:function(e){const{prefix:t,words:n}=s(e,!1);return{prefix:t,words:n,bytes:r(n)}},decodeUnsafe:unsafeWrapper(s),fromWords:r,fromWordsUnsafe:i,toWords:o}}const bech32=genBech32("bech32");genBech32("bech32m");const utf8={encode:e=>(new TextDecoder).decode(e),decode:e=>(new TextEncoder).encode(e)},hex=chain$1(radix2$1(4),alphabet$1("0123456789abcdef"),join$1(""),normalize$1((e=>{if("string"!=typeof e||e.length%2)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()}))),CODERS={utf8:utf8,hex:hex,base16:base16,base32:base32,base64:base64$1,base64url:base64url,base58:base58$1,base58xmr:base58xmr};Object.keys(CODERS).join(", ");const wordlist="abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo".split("\n");function number$1(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function bool$1(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)}function isBytes$2(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function bytes$1(e,...t){if(!isBytes$2(e))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function hash$1(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");number$1(e.outputLen),number$1(e.blockLen)}function exists$1(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function output$1(e,t){bytes$1(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}const assert$1={number:number$1,bool:bool$1,bytes:bytes$1,hash:hash$1,exists:exists$1,output:output$1},crypto$1="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0;
|
|
12
12
|
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
13
|
-
function isBytes$1(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}const createView=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),rotr=(e,t)=>e<<32-t|e>>>t,isLE$1=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];if(!isLE$1)throw new Error("Non little-endian hardware is not supported");const hexes=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function bytesToHex(e){if(!isBytes$1(e))throw new Error("Uint8Array expected");let t="";for(let n=0;n<e.length;n++)t+=hexes[e[n]];return t}const asciis={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function asciiToBase16(e){return e>=asciis._0&&e<=asciis._9?e-asciis._0:e>=asciis._A&&e<=asciis._F?e-(asciis._A-10):e>=asciis._a&&e<=asciis._f?e-(asciis._a-10):void 0}function hexToBytes(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,o=0;t<n;t++,o+=2){const n=asciiToBase16(e.charCodeAt(o)),i=asciiToBase16(e.charCodeAt(o+1));if(void 0===n||void 0===i){const t=e[o]+e[o+1];throw new Error('hex string expected, got non-hex character "'+t+'" at index '+o)}r[t]=16*n+i}return r}function utf8ToBytes$1(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function toBytes$1(e){if("string"==typeof e&&(e=utf8ToBytes$1(e)),!isBytes$1(e))throw new Error("expected Uint8Array, got "+typeof e);return e}function concatBytes(...e){let t=0;for(let n=0;n<e.length;n++){const r=e[n];if(!isBytes$1(r))throw new Error("Uint8Array expected");t+=r.length}const n=new Uint8Array(t);for(let t=0,r=0;t<e.length;t++){const o=e[t];n.set(o,r),r+=o.length}return n}class Hash{clone(){return this._cloneInto()}}const toStr={}.toString;function checkOpts$1(e,t){if(void 0!==t&&"[object Object]"!==toStr.call(t))throw new Error("Options should be object or undefined");return Object.assign(e,t)}function wrapConstructor(e){const t=t=>e().update(toBytes$1(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function randomBytes(e=32){if(crypto$1&&"function"==typeof crypto$1.getRandomValues)return crypto$1.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}let HMAC$1=class extends Hash{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,hash$1(e);const n=toBytes$1(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,o=new Uint8Array(r);o.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<o.length;e++)o[e]^=54;this.iHash.update(o),this.oHash=e.create();for(let e=0;e<o.length;e++)o[e]^=106;this.oHash.update(o),o.fill(0)}update(e){return exists$1(this),this.iHash.update(e),this}digestInto(e){exists$1(this),bytes$1(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:o,blockLen:i,outputLen:s}=this;return e.finished=r,e.destroyed=o,e.blockLen=i,e.outputLen=s,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}};const hmac$1=(e,t,n)=>new HMAC$1(e,t).update(n).digest();function pbkdf2Init(e,t,n,r){hash$1(e);const o=checkOpts$1({dkLen:32,asyncTick:10},r),{c:i,dkLen:s,asyncTick:a}=o;if(number$1(i),number$1(s),number$1(a),i<1)throw new Error("PBKDF2: iterations (c) should be >= 1");const l=toBytes$1(t),c=toBytes$1(n),d=new Uint8Array(s),h=hmac$1.create(e,l),u=h._cloneInto().update(c);return{c:i,dkLen:s,asyncTick:a,DK:d,PRF:h,PRFSalt:u}}function pbkdf2Output(e,t,n,r,o){return e.destroy(),t.destroy(),r&&r.destroy(),o.fill(0),n}function pbkdf2(e,t,n,r){const{c:o,dkLen:i,DK:s,PRF:a,PRFSalt:l}=pbkdf2Init(e,t,n,r);let c;const d=new Uint8Array(4),h=createView(d),u=new Uint8Array(a.outputLen);for(let e=1,t=0;t<i;e++,t+=a.outputLen){const n=s.subarray(t,t+a.outputLen);h.setInt32(0,e,!1),(c=l._cloneInto(c)).update(d).digestInto(u),n.set(u.subarray(0,n.length));for(let e=1;e<o;e++){a._cloneInto(c).update(u).digestInto(u);for(let e=0;e<n.length;e++)n[e]^=u[e]}}return pbkdf2Output(a,l,s,c,u)}function setBigUint64(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const o=BigInt(32),i=BigInt(4294967295),s=Number(n>>o&i),a=Number(n&i),l=r?4:0,c=r?0:4;e.setUint32(t+l,s,r),e.setUint32(t+c,a,r)}hmac$1.create=(e,t)=>new HMAC$1(e,t);class SHA2 extends Hash{constructor(e,t,n,r){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=createView(this.buffer)}update(e){exists$1(this);const{view:t,buffer:n,blockLen:r}=this,o=(e=toBytes$1(e)).length;for(let i=0;i<o;){const s=Math.min(r-this.pos,o-i);if(s!==r)n.set(e.subarray(i,i+s),this.pos),this.pos+=s,i+=s,this.pos===r&&(this.process(t,0),this.pos=0);else{const t=createView(e);for(;r<=o-i;i+=r)this.process(t,i)}}return this.length+=e.length,this.roundClean(),this}digestInto(e){exists$1(this),output$1(e,this),this.finished=!0;const{buffer:t,view:n,blockLen:r,isLE:o}=this;let{pos:i}=this;t[i++]=128,this.buffer.subarray(i).fill(0),this.padOffset>r-i&&(this.process(n,0),i=0);for(let e=i;e<r;e++)t[e]=0;setBigUint64(n,r-8,BigInt(8*this.length),o),this.process(n,0);const s=createView(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=a/4,c=this.get();if(l>c.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;e<l;e++)s.setUint32(4*e,c[e],o)}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());const{blockLen:t,buffer:n,length:r,finished:o,destroyed:i,pos:s}=this;return e.length=r,e.pos=s,e.finished=o,e.destroyed=i,r%t&&e.buffer.set(n),e}}const Chi=(e,t,n)=>e&t^~e&n,Maj=(e,t,n)=>e&t^e&n^t&n,SHA256_K=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),IV=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),SHA256_W=new Uint32Array(64);class SHA256 extends SHA2{constructor(){super(64,32,8,!1),this.A=0|IV[0],this.B=0|IV[1],this.C=0|IV[2],this.D=0|IV[3],this.E=0|IV[4],this.F=0|IV[5],this.G=0|IV[6],this.H=0|IV[7]}get(){const{A:e,B:t,C:n,D:r,E:o,F:i,G:s,H:a}=this;return[e,t,n,r,o,i,s,a]}set(e,t,n,r,o,i,s,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|o,this.F=0|i,this.G=0|s,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)SHA256_W[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=SHA256_W[e-15],n=SHA256_W[e-2],r=rotr(t,7)^rotr(t,18)^t>>>3,o=rotr(n,17)^rotr(n,19)^n>>>10;SHA256_W[e]=o+SHA256_W[e-7]+r+SHA256_W[e-16]|0}let{A:n,B:r,C:o,D:i,E:s,F:a,G:l,H:c}=this;for(let e=0;e<64;e++){const t=c+(rotr(s,6)^rotr(s,11)^rotr(s,25))+Chi(s,a,l)+SHA256_K[e]+SHA256_W[e]|0,d=(rotr(n,2)^rotr(n,13)^rotr(n,22))+Maj(n,r,o)|0;c=l,l=a,a=s,s=i+t|0,i=o,o=r,r=n,n=t+d|0}n=n+this.A|0,r=r+this.B|0,o=o+this.C|0,i=i+this.D|0,s=s+this.E|0,a=a+this.F|0,l=l+this.G|0,c=c+this.H|0,this.set(n,r,o,i,s,a,l,c)}roundClean(){SHA256_W.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}}const sha256=wrapConstructor((()=>new SHA256)),U32_MASK64=BigInt(2**32-1),_32n=BigInt(32);function fromBig(e,t=!1){return t?{h:Number(e&U32_MASK64),l:Number(e>>_32n&U32_MASK64)}:{h:0|Number(e>>_32n&U32_MASK64),l:0|Number(e&U32_MASK64)}}function split(e,t=!1){let n=new Uint32Array(e.length),r=new Uint32Array(e.length);for(let o=0;o<e.length;o++){const{h:i,l:s}=fromBig(e[o],t);[n[o],r[o]]=[i,s]}return[n,r]}const toBig=(e,t)=>BigInt(e>>>0)<<_32n|BigInt(t>>>0),shrSH=(e,t,n)=>e>>>n,shrSL=(e,t,n)=>e<<32-n|t>>>n,rotrSH=(e,t,n)=>e>>>n|t<<32-n,rotrSL=(e,t,n)=>e<<32-n|t>>>n,rotrBH=(e,t,n)=>e<<64-n|t>>>n-32,rotrBL=(e,t,n)=>e>>>n-32|t<<64-n,rotr32H=(e,t)=>t,rotr32L=(e,t)=>e,rotlSH=(e,t,n)=>e<<n|t>>>32-n,rotlSL=(e,t,n)=>t<<n|e>>>32-n,rotlBH=(e,t,n)=>t<<n-32|e>>>64-n,rotlBL=(e,t,n)=>e<<n-32|t>>>64-n;function add(e,t,n,r){const o=(t>>>0)+(r>>>0);return{h:e+n+(o/2**32|0)|0,l:0|o}}const add3L=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0),add3H=(e,t,n,r)=>t+n+r+(e/2**32|0)|0,add4L=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0),add4H=(e,t,n,r,o)=>t+n+r+o+(e/2**32|0)|0,add5L=(e,t,n,r,o)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(o>>>0),add5H=(e,t,n,r,o,i)=>t+n+r+o+i+(e/2**32|0)|0,u64={fromBig:fromBig,split:split,toBig:toBig,shrSH:shrSH,shrSL:shrSL,rotrSH:rotrSH,rotrSL:rotrSL,rotrBH:rotrBH,rotrBL:rotrBL,rotr32H:rotr32H,rotr32L:rotr32L,rotlSH:rotlSH,rotlSL:rotlSL,rotlBH:rotlBH,rotlBL:rotlBL,add:add,add3L:add3L,add3H:add3H,add4L:add4L,add4H:add4H,add5H:add5H,add5L:add5L},[SHA512_Kh,SHA512_Kl]=(()=>u64.split(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242","0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc68b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5defb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0xeada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c100d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map((e=>BigInt(e)))))(),SHA512_W_H=new Uint32Array(80),SHA512_W_L=new Uint32Array(80);class SHA512 extends SHA2{constructor(){super(128,64,16,!1),this.Ah=1779033703,this.Al=-205731576,this.Bh=-1150833019,this.Bl=-2067093701,this.Ch=1013904242,this.Cl=-23791573,this.Dh=-1521486534,this.Dl=1595750129,this.Eh=1359893119,this.El=-1377402159,this.Fh=-1694144372,this.Fl=725511199,this.Gh=528734635,this.Gl=-79577749,this.Hh=1541459225,this.Hl=327033209}get(){const{Ah:e,Al:t,Bh:n,Bl:r,Ch:o,Cl:i,Dh:s,Dl:a,Eh:l,El:c,Fh:d,Fl:h,Gh:u,Gl:p,Hh:f,Hl:g}=this;return[e,t,n,r,o,i,s,a,l,c,d,h,u,p,f,g]}set(e,t,n,r,o,i,s,a,l,c,d,h,u,p,f,g){this.Ah=0|e,this.Al=0|t,this.Bh=0|n,this.Bl=0|r,this.Ch=0|o,this.Cl=0|i,this.Dh=0|s,this.Dl=0|a,this.Eh=0|l,this.El=0|c,this.Fh=0|d,this.Fl=0|h,this.Gh=0|u,this.Gl=0|p,this.Hh=0|f,this.Hl=0|g}process(e,t){for(let n=0;n<16;n++,t+=4)SHA512_W_H[n]=e.getUint32(t),SHA512_W_L[n]=e.getUint32(t+=4);for(let e=16;e<80;e++){const t=0|SHA512_W_H[e-15],n=0|SHA512_W_L[e-15],r=u64.rotrSH(t,n,1)^u64.rotrSH(t,n,8)^u64.shrSH(t,n,7),o=u64.rotrSL(t,n,1)^u64.rotrSL(t,n,8)^u64.shrSL(t,n,7),i=0|SHA512_W_H[e-2],s=0|SHA512_W_L[e-2],a=u64.rotrSH(i,s,19)^u64.rotrBH(i,s,61)^u64.shrSH(i,s,6),l=u64.rotrSL(i,s,19)^u64.rotrBL(i,s,61)^u64.shrSL(i,s,6),c=u64.add4L(o,l,SHA512_W_L[e-7],SHA512_W_L[e-16]),d=u64.add4H(c,r,a,SHA512_W_H[e-7],SHA512_W_H[e-16]);SHA512_W_H[e]=0|d,SHA512_W_L[e]=0|c}let{Ah:n,Al:r,Bh:o,Bl:i,Ch:s,Cl:a,Dh:l,Dl:c,Eh:d,El:h,Fh:u,Fl:p,Gh:f,Gl:g,Hh:m,Hl:b}=this;for(let e=0;e<80;e++){const t=u64.rotrSH(d,h,14)^u64.rotrSH(d,h,18)^u64.rotrBH(d,h,41),y=u64.rotrSL(d,h,14)^u64.rotrSL(d,h,18)^u64.rotrBL(d,h,41),w=d&u^~d&f,v=h&p^~h&g,x=u64.add5L(b,y,v,SHA512_Kl[e],SHA512_W_L[e]),E=u64.add5H(x,m,t,w,SHA512_Kh[e],SHA512_W_H[e]),k=0|x,C=u64.rotrSH(n,r,28)^u64.rotrBH(n,r,34)^u64.rotrBH(n,r,39),$=u64.rotrSL(n,r,28)^u64.rotrBL(n,r,34)^u64.rotrBL(n,r,39),S=n&o^n&s^o&s,_=r&i^r&a^i&a;m=0|f,b=0|g,f=0|u,g=0|p,u=0|d,p=0|h,({h:d,l:h}=u64.add(0|l,0|c,0|E,0|k)),l=0|s,c=0|a,s=0|o,a=0|i,o=0|n,i=0|r;const A=u64.add3L(k,$,_);n=u64.add3H(A,E,C,S),r=0|A}({h:n,l:r}=u64.add(0|this.Ah,0|this.Al,0|n,0|r)),({h:o,l:i}=u64.add(0|this.Bh,0|this.Bl,0|o,0|i)),({h:s,l:a}=u64.add(0|this.Ch,0|this.Cl,0|s,0|a)),({h:l,l:c}=u64.add(0|this.Dh,0|this.Dl,0|l,0|c)),({h:d,l:h}=u64.add(0|this.Eh,0|this.El,0|d,0|h)),({h:u,l:p}=u64.add(0|this.Fh,0|this.Fl,0|u,0|p)),({h:f,l:g}=u64.add(0|this.Gh,0|this.Gl,0|f,0|g)),({h:m,l:b}=u64.add(0|this.Hh,0|this.Hl,0|m,0|b)),this.set(n,r,o,i,s,a,l,c,d,h,u,p,f,g,m,b)}roundClean(){SHA512_W_H.fill(0),SHA512_W_L.fill(0)}destroy(){this.buffer.fill(0),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)}}const sha512=wrapConstructor((()=>new SHA512));
|
|
13
|
+
function isBytes$1(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}const createView=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),rotr=(e,t)=>e<<32-t|e>>>t,isLE$1=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];if(!isLE$1)throw new Error("Non little-endian hardware is not supported");const hexes=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function bytesToHex(e){if(!isBytes$1(e))throw new Error("Uint8Array expected");let t="";for(let n=0;n<e.length;n++)t+=hexes[e[n]];return t}const asciis={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function asciiToBase16(e){return e>=asciis._0&&e<=asciis._9?e-asciis._0:e>=asciis._A&&e<=asciis._F?e-(asciis._A-10):e>=asciis._a&&e<=asciis._f?e-(asciis._a-10):void 0}function hexToBytes(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,o=0;t<n;t++,o+=2){const n=asciiToBase16(e.charCodeAt(o)),i=asciiToBase16(e.charCodeAt(o+1));if(void 0===n||void 0===i){const t=e[o]+e[o+1];throw new Error('hex string expected, got non-hex character "'+t+'" at index '+o)}r[t]=16*n+i}return r}function utf8ToBytes$1(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function toBytes$1(e){if("string"==typeof e&&(e=utf8ToBytes$1(e)),!isBytes$1(e))throw new Error("expected Uint8Array, got "+typeof e);return e}function concatBytes(...e){let t=0;for(let n=0;n<e.length;n++){const r=e[n];if(!isBytes$1(r))throw new Error("Uint8Array expected");t+=r.length}const n=new Uint8Array(t);for(let t=0,r=0;t<e.length;t++){const o=e[t];n.set(o,r),r+=o.length}return n}class Hash{clone(){return this._cloneInto()}}const toStr={}.toString;function checkOpts$1(e,t){if(void 0!==t&&"[object Object]"!==toStr.call(t))throw new Error("Options should be object or undefined");return Object.assign(e,t)}function wrapConstructor(e){const t=t=>e().update(toBytes$1(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function randomBytes(e=32){if(crypto$1&&"function"==typeof crypto$1.getRandomValues)return crypto$1.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}let HMAC$1=class extends Hash{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,hash$1(e);const n=toBytes$1(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,o=new Uint8Array(r);o.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<o.length;e++)o[e]^=54;this.iHash.update(o),this.oHash=e.create();for(let e=0;e<o.length;e++)o[e]^=106;this.oHash.update(o),o.fill(0)}update(e){return exists$1(this),this.iHash.update(e),this}digestInto(e){exists$1(this),bytes$1(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:o,blockLen:i,outputLen:s}=this;return e.finished=r,e.destroyed=o,e.blockLen=i,e.outputLen=s,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}};const hmac$1=(e,t,n)=>new HMAC$1(e,t).update(n).digest();function pbkdf2Init(e,t,n,r){hash$1(e);const o=checkOpts$1({dkLen:32,asyncTick:10},r),{c:i,dkLen:s,asyncTick:a}=o;if(number$1(i),number$1(s),number$1(a),i<1)throw new Error("PBKDF2: iterations (c) should be >= 1");const l=toBytes$1(t),c=toBytes$1(n),d=new Uint8Array(s),h=hmac$1.create(e,l),u=h._cloneInto().update(c);return{c:i,dkLen:s,asyncTick:a,DK:d,PRF:h,PRFSalt:u}}function pbkdf2Output(e,t,n,r,o){return e.destroy(),t.destroy(),r&&r.destroy(),o.fill(0),n}function pbkdf2(e,t,n,r){const{c:o,dkLen:i,DK:s,PRF:a,PRFSalt:l}=pbkdf2Init(e,t,n,r);let c;const d=new Uint8Array(4),h=createView(d),u=new Uint8Array(a.outputLen);for(let e=1,t=0;t<i;e++,t+=a.outputLen){const n=s.subarray(t,t+a.outputLen);h.setInt32(0,e,!1),(c=l._cloneInto(c)).update(d).digestInto(u),n.set(u.subarray(0,n.length));for(let e=1;e<o;e++){a._cloneInto(c).update(u).digestInto(u);for(let e=0;e<n.length;e++)n[e]^=u[e]}}return pbkdf2Output(a,l,s,c,u)}function setBigUint64(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const o=BigInt(32),i=BigInt(4294967295),s=Number(n>>o&i),a=Number(n&i),l=r?4:0,c=r?0:4;e.setUint32(t+l,s,r),e.setUint32(t+c,a,r)}hmac$1.create=(e,t)=>new HMAC$1(e,t);class SHA2 extends Hash{constructor(e,t,n,r){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=createView(this.buffer)}update(e){exists$1(this);const{view:t,buffer:n,blockLen:r}=this,o=(e=toBytes$1(e)).length;for(let i=0;i<o;){const s=Math.min(r-this.pos,o-i);if(s!==r)n.set(e.subarray(i,i+s),this.pos),this.pos+=s,i+=s,this.pos===r&&(this.process(t,0),this.pos=0);else{const t=createView(e);for(;r<=o-i;i+=r)this.process(t,i)}}return this.length+=e.length,this.roundClean(),this}digestInto(e){exists$1(this),output$1(e,this),this.finished=!0;const{buffer:t,view:n,blockLen:r,isLE:o}=this;let{pos:i}=this;t[i++]=128,this.buffer.subarray(i).fill(0),this.padOffset>r-i&&(this.process(n,0),i=0);for(let e=i;e<r;e++)t[e]=0;setBigUint64(n,r-8,BigInt(8*this.length),o),this.process(n,0);const s=createView(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=a/4,c=this.get();if(l>c.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;e<l;e++)s.setUint32(4*e,c[e],o)}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());const{blockLen:t,buffer:n,length:r,finished:o,destroyed:i,pos:s}=this;return e.length=r,e.pos=s,e.finished=o,e.destroyed=i,r%t&&e.buffer.set(n),e}}const Chi=(e,t,n)=>e&t^~e&n,Maj=(e,t,n)=>e&t^e&n^t&n,SHA256_K=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),IV=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),SHA256_W=new Uint32Array(64);class SHA256 extends SHA2{constructor(){super(64,32,8,!1),this.A=0|IV[0],this.B=0|IV[1],this.C=0|IV[2],this.D=0|IV[3],this.E=0|IV[4],this.F=0|IV[5],this.G=0|IV[6],this.H=0|IV[7]}get(){const{A:e,B:t,C:n,D:r,E:o,F:i,G:s,H:a}=this;return[e,t,n,r,o,i,s,a]}set(e,t,n,r,o,i,s,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|o,this.F=0|i,this.G=0|s,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)SHA256_W[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=SHA256_W[e-15],n=SHA256_W[e-2],r=rotr(t,7)^rotr(t,18)^t>>>3,o=rotr(n,17)^rotr(n,19)^n>>>10;SHA256_W[e]=o+SHA256_W[e-7]+r+SHA256_W[e-16]|0}let{A:n,B:r,C:o,D:i,E:s,F:a,G:l,H:c}=this;for(let e=0;e<64;e++){const t=c+(rotr(s,6)^rotr(s,11)^rotr(s,25))+Chi(s,a,l)+SHA256_K[e]+SHA256_W[e]|0,d=(rotr(n,2)^rotr(n,13)^rotr(n,22))+Maj(n,r,o)|0;c=l,l=a,a=s,s=i+t|0,i=o,o=r,r=n,n=t+d|0}n=n+this.A|0,r=r+this.B|0,o=o+this.C|0,i=i+this.D|0,s=s+this.E|0,a=a+this.F|0,l=l+this.G|0,c=c+this.H|0,this.set(n,r,o,i,s,a,l,c)}roundClean(){SHA256_W.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}}const sha256=wrapConstructor((()=>new SHA256)),U32_MASK64=BigInt(2**32-1),_32n=BigInt(32);function fromBig(e,t=!1){return t?{h:Number(e&U32_MASK64),l:Number(e>>_32n&U32_MASK64)}:{h:0|Number(e>>_32n&U32_MASK64),l:0|Number(e&U32_MASK64)}}function split(e,t=!1){let n=new Uint32Array(e.length),r=new Uint32Array(e.length);for(let o=0;o<e.length;o++){const{h:i,l:s}=fromBig(e[o],t);[n[o],r[o]]=[i,s]}return[n,r]}const toBig=(e,t)=>BigInt(e>>>0)<<_32n|BigInt(t>>>0),shrSH=(e,t,n)=>e>>>n,shrSL=(e,t,n)=>e<<32-n|t>>>n,rotrSH=(e,t,n)=>e>>>n|t<<32-n,rotrSL=(e,t,n)=>e<<32-n|t>>>n,rotrBH=(e,t,n)=>e<<64-n|t>>>n-32,rotrBL=(e,t,n)=>e>>>n-32|t<<64-n,rotr32H=(e,t)=>t,rotr32L=(e,t)=>e,rotlSH=(e,t,n)=>e<<n|t>>>32-n,rotlSL=(e,t,n)=>t<<n|e>>>32-n,rotlBH=(e,t,n)=>t<<n-32|e>>>64-n,rotlBL=(e,t,n)=>e<<n-32|t>>>64-n;function add(e,t,n,r){const o=(t>>>0)+(r>>>0);return{h:e+n+(o/2**32|0)|0,l:0|o}}const add3L=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0),add3H=(e,t,n,r)=>t+n+r+(e/2**32|0)|0,add4L=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0),add4H=(e,t,n,r,o)=>t+n+r+o+(e/2**32|0)|0,add5L=(e,t,n,r,o)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(o>>>0),add5H=(e,t,n,r,o,i)=>t+n+r+o+i+(e/2**32|0)|0,u64={fromBig:fromBig,split:split,toBig:toBig,shrSH:shrSH,shrSL:shrSL,rotrSH:rotrSH,rotrSL:rotrSL,rotrBH:rotrBH,rotrBL:rotrBL,rotr32H:rotr32H,rotr32L:rotr32L,rotlSH:rotlSH,rotlSL:rotlSL,rotlBH:rotlBH,rotlBL:rotlBL,add:add,add3L:add3L,add3H:add3H,add4L:add4L,add4H:add4H,add5H:add5H,add5L:add5L},[SHA512_Kh,SHA512_Kl]=(()=>u64.split(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242","0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc68b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5defb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0xeada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c100d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map((e=>BigInt(e)))))(),SHA512_W_H=new Uint32Array(80),SHA512_W_L=new Uint32Array(80);class SHA512 extends SHA2{constructor(){super(128,64,16,!1),this.Ah=1779033703,this.Al=-205731576,this.Bh=-1150833019,this.Bl=-2067093701,this.Ch=1013904242,this.Cl=-23791573,this.Dh=-1521486534,this.Dl=1595750129,this.Eh=1359893119,this.El=-1377402159,this.Fh=-1694144372,this.Fl=725511199,this.Gh=528734635,this.Gl=-79577749,this.Hh=1541459225,this.Hl=327033209}get(){const{Ah:e,Al:t,Bh:n,Bl:r,Ch:o,Cl:i,Dh:s,Dl:a,Eh:l,El:c,Fh:d,Fl:h,Gh:u,Gl:p,Hh:f,Hl:g}=this;return[e,t,n,r,o,i,s,a,l,c,d,h,u,p,f,g]}set(e,t,n,r,o,i,s,a,l,c,d,h,u,p,f,g){this.Ah=0|e,this.Al=0|t,this.Bh=0|n,this.Bl=0|r,this.Ch=0|o,this.Cl=0|i,this.Dh=0|s,this.Dl=0|a,this.Eh=0|l,this.El=0|c,this.Fh=0|d,this.Fl=0|h,this.Gh=0|u,this.Gl=0|p,this.Hh=0|f,this.Hl=0|g}process(e,t){for(let n=0;n<16;n++,t+=4)SHA512_W_H[n]=e.getUint32(t),SHA512_W_L[n]=e.getUint32(t+=4);for(let e=16;e<80;e++){const t=0|SHA512_W_H[e-15],n=0|SHA512_W_L[e-15],r=u64.rotrSH(t,n,1)^u64.rotrSH(t,n,8)^u64.shrSH(t,n,7),o=u64.rotrSL(t,n,1)^u64.rotrSL(t,n,8)^u64.shrSL(t,n,7),i=0|SHA512_W_H[e-2],s=0|SHA512_W_L[e-2],a=u64.rotrSH(i,s,19)^u64.rotrBH(i,s,61)^u64.shrSH(i,s,6),l=u64.rotrSL(i,s,19)^u64.rotrBL(i,s,61)^u64.shrSL(i,s,6),c=u64.add4L(o,l,SHA512_W_L[e-7],SHA512_W_L[e-16]),d=u64.add4H(c,r,a,SHA512_W_H[e-7],SHA512_W_H[e-16]);SHA512_W_H[e]=0|d,SHA512_W_L[e]=0|c}let{Ah:n,Al:r,Bh:o,Bl:i,Ch:s,Cl:a,Dh:l,Dl:c,Eh:d,El:h,Fh:u,Fl:p,Gh:f,Gl:g,Hh:m,Hl:b}=this;for(let e=0;e<80;e++){const t=u64.rotrSH(d,h,14)^u64.rotrSH(d,h,18)^u64.rotrBH(d,h,41),y=u64.rotrSL(d,h,14)^u64.rotrSL(d,h,18)^u64.rotrBL(d,h,41),w=d&u^~d&f,v=h&p^~h&g,x=u64.add5L(b,y,v,SHA512_Kl[e],SHA512_W_L[e]),k=u64.add5H(x,m,t,w,SHA512_Kh[e],SHA512_W_H[e]),E=0|x,C=u64.rotrSH(n,r,28)^u64.rotrBH(n,r,34)^u64.rotrBH(n,r,39),$=u64.rotrSL(n,r,28)^u64.rotrBL(n,r,34)^u64.rotrBL(n,r,39),S=n&o^n&s^o&s,_=r&i^r&a^i&a;m=0|f,b=0|g,f=0|u,g=0|p,u=0|d,p=0|h,({h:d,l:h}=u64.add(0|l,0|c,0|k,0|E)),l=0|s,c=0|a,s=0|o,a=0|i,o=0|n,i=0|r;const A=u64.add3L(E,$,_);n=u64.add3H(A,k,C,S),r=0|A}({h:n,l:r}=u64.add(0|this.Ah,0|this.Al,0|n,0|r)),({h:o,l:i}=u64.add(0|this.Bh,0|this.Bl,0|o,0|i)),({h:s,l:a}=u64.add(0|this.Ch,0|this.Cl,0|s,0|a)),({h:l,l:c}=u64.add(0|this.Dh,0|this.Dl,0|l,0|c)),({h:d,l:h}=u64.add(0|this.Eh,0|this.El,0|d,0|h)),({h:u,l:p}=u64.add(0|this.Fh,0|this.Fl,0|u,0|p)),({h:f,l:g}=u64.add(0|this.Gh,0|this.Gl,0|f,0|g)),({h:m,l:b}=u64.add(0|this.Hh,0|this.Hl,0|m,0|b)),this.set(n,r,o,i,s,a,l,c,d,h,u,p,f,g,m,b)}roundClean(){SHA512_W_H.fill(0),SHA512_W_L.fill(0)}destroy(){this.buffer.fill(0),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)}}const sha512=wrapConstructor((()=>new SHA512));
|
|
14
14
|
/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */function isBytes(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function chain(...e){const t=e=>e,n=(e,t)=>n=>e(t(n));return{encode:e.map((e=>e.encode)).reduceRight(n,t),decode:e.map((e=>e.decode)).reduce(n,t)}}function alphabet(e){return{encode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("alphabet.encode input should be an array of numbers");return t.map((t=>{if(t<0||t>=e.length)throw new Error(`Digit index outside alphabet: ${t} (alphabet: ${e.length})`);return e[t]}))},decode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("alphabet.decode input should be array of strings");return t.map((t=>{if("string"!=typeof t)throw new Error(`alphabet.decode: not string element=${t}`);const n=e.indexOf(t);if(-1===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}}function join(e=""){if("string"!=typeof e)throw new Error("join separator should be string");return{encode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("join.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`join.encode: non-string input=${e}`);return t.join(e)},decode:t=>{if("string"!=typeof t)throw new Error("join.decode input should be string");return t.split(e)}}}function padding(e,t="="){if("string"!=typeof t)throw new Error("padding chr should be string");return{encode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.encode: non-string input=${e}`);for(;n.length*e%8;)n.push(t);return n},decode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.decode: non-string input=${e}`);let r=n.length;if(r*e%8)throw new Error("Invalid padding: string should have whole number of bytes");for(;r>0&&n[r-1]===t;r--)if(!((r-1)*e%8))throw new Error("Invalid padding: string has too much padding");return n.slice(0,r)}}}function convertRadix(e,t,n){if(t<2)throw new Error(`convertRadix: wrong from=${t}, base cannot be less than 2`);if(n<2)throw new Error(`convertRadix: wrong to=${n}, base cannot be less than 2`);if(!Array.isArray(e))throw new Error("convertRadix: data should be array");if(!e.length)return[];let r=0;const o=[],i=Array.from(e);for(i.forEach((e=>{if(e<0||e>=t)throw new Error(`Wrong integer: ${e}`)}));;){let e=0,s=!0;for(let o=r;o<i.length;o++){const a=i[o],l=t*e+a;if(!Number.isSafeInteger(l)||t*e/t!==e||l-a!=t*e)throw new Error("convertRadix: carry overflow");e=l%n;const c=Math.floor(l/n);if(i[o]=c,!Number.isSafeInteger(c)||c*n+e!==l)throw new Error("convertRadix: carry overflow");s&&(c?s=!1:r=o)}if(o.push(e),s)break}for(let t=0;t<e.length-1&&0===e[t];t++)o.push(0);return o.reverse()}const gcd=(e,t)=>t?gcd(t,e%t):e,radix2carry=(e,t)=>e+(t-gcd(e,t));function convertRadix2(e,t,n,r){if(!Array.isArray(e))throw new Error("convertRadix2: data should be array");if(t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(radix2carry(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${radix2carry(t,n)}`);let o=0,i=0;const s=2**n-1,a=[];for(const r of e){if(r>=2**t)throw new Error(`convertRadix2: invalid data word=${r} from=${t}`);if(o=o<<t|r,i+t>32)throw new Error(`convertRadix2: carry overflow pos=${i} from=${t}`);for(i+=t;i>=n;i-=n)a.push((o>>i-n&s)>>>0);o&=2**i-1}if(o=o<<n-i&s,!r&&i>=t)throw new Error("Excess padding");if(!r&&o)throw new Error(`Non-zero padding: ${o}`);return r&&i>0&&a.push(o>>>0),a}function radix(e){return{encode:t=>{if(!isBytes(t))throw new Error("radix.encode input should be Uint8Array");return convertRadix(Array.from(t),256,e)},decode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("radix.decode input should be array of numbers");return Uint8Array.from(convertRadix(t,e,256))}}}function radix2(e,t=!1){if(e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(radix2carry(8,e)>32||radix2carry(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!isBytes(n))throw new Error("radix2.encode input should be Uint8Array");return convertRadix2(Array.from(n),8,e,!t)},decode:n=>{if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("radix2.decode input should be array of numbers");return Uint8Array.from(convertRadix2(n,e,8,t))}}}function checksum(e,t){if("function"!=typeof t)throw new Error("checksum fn should be function");return{encode(n){if(!isBytes(n))throw new Error("checksum.encode: input should be Uint8Array");const r=t(n).slice(0,e),o=new Uint8Array(n.length+e);return o.set(n),o.set(r,n.length),o},decode(n){if(!isBytes(n))throw new Error("checksum.decode: input should be Uint8Array");const r=n.slice(0,-e),o=t(r).slice(0,e),i=n.slice(-e);for(let t=0;t<e;t++)if(o[t]!==i[t])throw new Error("Invalid checksum");return r}}}const utils$1={alphabet:alphabet,chain:chain,checksum:checksum,convertRadix:convertRadix,convertRadix2:convertRadix2,radix:radix,radix2:radix2,join:join,padding:padding},base64=chain(radix2(6),alphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),padding(6),join("")),genBase58=e=>chain(radix(58),alphabet(e),join("")),base58=genBase58("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"),createBase58check=e=>chain(checksum(4,(t=>e(e(t)))),base58),base58check$1=createBase58check,isJapanese=e=>"あいこくしん"===e[0];function nfkd(e){if("string"!=typeof e)throw new TypeError("Invalid mnemonic type: "+typeof e);return e.normalize("NFKD")}function normalize(e){const t=nfkd(e),n=t.split(" ");if(![12,15,18,21,24].includes(n.length))throw new Error("Invalid mnemonic");return{nfkd:t,words:n}}function assertEntropy(e){assert$1.bytes(e,16,20,24,28,32)}function generateMnemonic(e,t=128){if(assert$1.number(t),t%32!=0||t>256)throw new TypeError("Invalid entropy");return entropyToMnemonic(randomBytes(t/8),e)}const calcChecksum=e=>{const t=8-e.length/4;return new Uint8Array([sha256(e)[0]>>t<<t])};function getCoder(e){if(!Array.isArray(e)||2048!==e.length||"string"!=typeof e[0])throw new Error("Worlist: expected array of 2048 strings");return e.forEach((e=>{if("string"!=typeof e)throw new Error(`Wordlist: non-string element: ${e}`)})),utils$1.chain(utils$1.checksum(1,calcChecksum),utils$1.radix2(11,!0),utils$1.alphabet(e))}function mnemonicToEntropy(e,t){const{words:n}=normalize(e),r=getCoder(t).decode(n);return assertEntropy(r),r}function entropyToMnemonic(e,t){assertEntropy(e);return getCoder(t).encode(e).join(isJapanese(t)?" ":" ")}function validateMnemonic(e,t){try{mnemonicToEntropy(e,t)}catch(e){return!1}return!0}const salt=e=>nfkd(`mnemonic${e}`);function mnemonicToSeedSync(e,t=""){return pbkdf2(sha512,normalize(e).nfkd,salt(t),{c:2048,dkLen:64})}const Rho=new Uint8Array([7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8]),Id=Uint8Array.from({length:16},((e,t)=>t)),Pi=Id.map((e=>(9*e+5)%16));let idxL=[Id],idxR=[Pi];for(let e=0;e<4;e++)for(let t of[idxL,idxR])t.push(t[e].map((e=>Rho[e])));const shifts=[[11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8],[12,13,11,15,6,9,9,7,12,15,11,13,7,8,7,7],[13,15,14,11,7,7,6,8,13,14,13,12,5,5,6,9],[14,11,12,14,8,6,5,5,15,12,15,14,9,9,8,6],[15,12,13,13,9,5,8,6,14,11,12,11,8,6,5,5]].map((e=>new Uint8Array(e))),shiftsL=idxL.map(((e,t)=>e.map((e=>shifts[t][e])))),shiftsR=idxR.map(((e,t)=>e.map((e=>shifts[t][e])))),Kl=new Uint32Array([0,1518500249,1859775393,2400959708,2840853838]),Kr=new Uint32Array([1352829926,1548603684,1836072691,2053994217,0]),rotl$1=(e,t)=>e<<t|e>>>32-t;function f(e,t,n,r){return 0===e?t^n^r:1===e?t&n|~t&r:2===e?(t|~n)^r:3===e?t&r|n&~r:t^(n|~r)}const BUF=new Uint32Array(16);class RIPEMD160 extends SHA2{constructor(){super(64,20,8,!0),this.h0=1732584193,this.h1=-271733879,this.h2=-1732584194,this.h3=271733878,this.h4=-1009589776}get(){const{h0:e,h1:t,h2:n,h3:r,h4:o}=this;return[e,t,n,r,o]}set(e,t,n,r,o){this.h0=0|e,this.h1=0|t,this.h2=0|n,this.h3=0|r,this.h4=0|o}process(e,t){for(let n=0;n<16;n++,t+=4)BUF[n]=e.getUint32(t,!0);let n=0|this.h0,r=n,o=0|this.h1,i=o,s=0|this.h2,a=s,l=0|this.h3,c=l,d=0|this.h4,h=d;for(let e=0;e<5;e++){const t=4-e,u=Kl[e],p=Kr[e],g=idxL[e],m=idxR[e],b=shiftsL[e],y=shiftsR[e];for(let t=0;t<16;t++){const r=rotl$1(n+f(e,o,s,l)+BUF[g[t]]+u,b[t])+d|0;n=d,d=l,l=0|rotl$1(s,10),s=o,o=r}for(let e=0;e<16;e++){const n=rotl$1(r+f(t,i,a,c)+BUF[m[e]]+p,y[e])+h|0;r=h,h=c,c=0|rotl$1(a,10),a=i,i=n}}this.set(this.h1+s+c|0,this.h2+l+h|0,this.h3+d+r|0,this.h4+n+i|0,this.h0+o+a|0)}roundClean(){BUF.fill(0)}destroy(){this.destroyed=!0,this.buffer.fill(0),this.set(0,0,0,0,0)}}const ripemd160=wrapConstructor((()=>new RIPEMD160)),Point=secp256k1.ProjectivePoint,base58check=base58check$1(sha256);function bytesToNumber(e){return BigInt(`0x${bytesToHex(e)}`)}function numberToBytes(e){return hexToBytes(e.toString(16).padStart(64,"0"))}const MASTER_SECRET=utf8ToBytes$1("Bitcoin seed"),BITCOIN_VERSIONS={private:76066276,public:76067358},HARDENED_OFFSET=2147483648,hash160=e=>ripemd160(sha256(e)),fromU32=e=>createView(e).getUint32(0,!1),toU32=e=>{if(!Number.isSafeInteger(e)||e<0||e>2**32-1)throw new Error(`Invalid number=${e}. Should be from 0 to 2 ** 32 - 1`);const t=new Uint8Array(4);return createView(t).setUint32(0,e,!1),t};class HDKey{get fingerprint(){if(!this.pubHash)throw new Error("No publicKey set!");return fromU32(this.pubHash)}get identifier(){return this.pubHash}get pubKeyHash(){return this.pubHash}get privateKey(){return this.privKeyBytes||null}get publicKey(){return this.pubKey||null}get privateExtendedKey(){const e=this.privateKey;if(!e)throw new Error("No private key");return base58check.encode(this.serialize(this.versions.private,concatBytes(new Uint8Array([0]),e)))}get publicExtendedKey(){if(!this.pubKey)throw new Error("No public key");return base58check.encode(this.serialize(this.versions.public,this.pubKey))}static fromMasterSeed(e,t=BITCOIN_VERSIONS){if(bytes$1(e),8*e.length<128||8*e.length>512)throw new Error(`HDKey: wrong seed length=${e.length}. Should be between 128 and 512 bits; 256 bits is advised)`);const n=hmac$1(sha512,MASTER_SECRET,e);return new HDKey({versions:t,chainCode:n.slice(32),privateKey:n.slice(0,32)})}static fromExtendedKey(e,t=BITCOIN_VERSIONS){const n=base58check.decode(e),r=createView(n),o=r.getUint32(0,!1),i={versions:t,depth:n[4],parentFingerprint:r.getUint32(5,!1),index:r.getUint32(9,!1),chainCode:n.slice(13,45)},s=n.slice(45),a=0===s[0];if(o!==t[a?"private":"public"])throw new Error("Version mismatch");return new HDKey(a?{...i,privateKey:s.slice(1)}:{...i,publicKey:s})}static fromJSON(e){return HDKey.fromExtendedKey(e.xpriv)}constructor(e){if(this.depth=0,this.index=0,this.chainCode=null,this.parentFingerprint=0,!e||"object"!=typeof e)throw new Error("HDKey.constructor must not be called directly");if(this.versions=e.versions||BITCOIN_VERSIONS,this.depth=e.depth||0,this.chainCode=e.chainCode,this.index=e.index||0,this.parentFingerprint=e.parentFingerprint||0,!this.depth&&(this.parentFingerprint||this.index))throw new Error("HDKey: zero depth with non-zero index/parent fingerprint");if(e.publicKey&&e.privateKey)throw new Error("HDKey: publicKey and privateKey at same time.");if(e.privateKey){if(!secp256k1.utils.isValidPrivateKey(e.privateKey))throw new Error("Invalid private key");this.privKey="bigint"==typeof e.privateKey?e.privateKey:bytesToNumber(e.privateKey),this.privKeyBytes=numberToBytes(this.privKey),this.pubKey=secp256k1.getPublicKey(e.privateKey,!0)}else{if(!e.publicKey)throw new Error("HDKey: no public or private key provided");this.pubKey=Point.fromHex(e.publicKey).toRawBytes(!0)}this.pubHash=hash160(this.pubKey)}derive(e){if(!/^[mM]'?/.test(e))throw new Error('Path must start with "m" or "M"');if(/^[mM]'?$/.test(e))return this;const t=e.replace(/^[mM]'?\//,"").split("/");let n=this;for(const e of t){const t=/^(\d+)('?)$/.exec(e);if(!t||3!==t.length)throw new Error(`Invalid child index: ${e}`);let r=+t[1];if(!Number.isSafeInteger(r)||r>=HARDENED_OFFSET)throw new Error("Invalid index");"'"===t[2]&&(r+=HARDENED_OFFSET),n=n.deriveChild(r)}return n}deriveChild(e){if(!this.pubKey||!this.chainCode)throw new Error("No publicKey or chainCode set");let t=toU32(e);if(e>=HARDENED_OFFSET){const e=this.privateKey;if(!e)throw new Error("Could not derive hardened child key");t=concatBytes(new Uint8Array([0]),e,t)}else t=concatBytes(this.pubKey,t);const n=hmac$1(sha512,this.chainCode,t),r=bytesToNumber(n.slice(0,32)),o=n.slice(32);if(!secp256k1.utils.isValidPrivateKey(r))throw new Error("Tweak bigger than curve order");const i={versions:this.versions,chainCode:o,depth:this.depth+1,parentFingerprint:this.fingerprint,index:e};try{if(this.privateKey){const e=mod(this.privKey+r,secp256k1.CURVE.n);if(!secp256k1.utils.isValidPrivateKey(e))throw new Error("The tweak was out of range or the resulted private key is invalid");i.privateKey=e}else{const e=Point.fromHex(this.pubKey).add(Point.fromPrivateKey(r));if(e.equals(Point.ZERO))throw new Error("The tweak was equal to negative P, which made the result key invalid");i.publicKey=e.toRawBytes(!0)}return new HDKey(i)}catch(t){return this.deriveChild(e+1)}}sign(e){if(!this.privateKey)throw new Error("No privateKey set!");return bytes$1(e,32),secp256k1.sign(e,this.privKey).toCompactRawBytes()}verify(e,t){if(bytes$1(e,32),bytes$1(t,64),!this.publicKey)throw new Error("No publicKey set!");let n;try{n=secp256k1.Signature.fromCompact(t)}catch(e){return!1}return secp256k1.verify(n,e,this.publicKey)}wipePrivateData(){return this.privKey=void 0,this.privKeyBytes&&(this.privKeyBytes.fill(0),this.privKeyBytes=void 0),this}toJSON(){return{xpriv:this.privateExtendedKey,xpub:this.publicExtendedKey}}serialize(e,t){if(!this.chainCode)throw new Error("No chainCode set");return bytes$1(t,33),concatBytes(toU32(e),new Uint8Array([this.depth]),toU32(this.parentFingerprint),toU32(this.index),this.chainCode,t)}}
|
|
15
|
-
/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */const u8a=e=>e instanceof Uint8Array,u32=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4)),isLE=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];if(!isLE)throw new Error("Non little-endian hardware is not supported");function utf8ToBytes(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function toBytes(e){if("string"==typeof e&&(e=utf8ToBytes(e)),!u8a(e))throw new Error("expected Uint8Array, got "+typeof e);return e}const isPlainObject=e=>"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object;function checkOpts(e,t){if(void 0!==t&&("object"!=typeof t||!isPlainObject(t)))throw new Error("options must be object or undefined");return Object.assign(e,t)}function ensureBytes(e,t){if(!(e instanceof Uint8Array))throw new Error("Uint8Array expected");if(e.length!==t)throw new Error(`Uint8Array length ${t} expected`)}function equalBytes(e,t){if(e.length!==t.length)throw new Error("equalBytes: Different size of Uint8Arrays");let n=!0;for(let r=0;r<e.length;r++)n&&(n=e[r]===t[r]);return n}function number(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function bool(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)}function bytes(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function hash(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("hash must be wrapped by utils.wrapConstructor");number(e.outputLen),number(e.blockLen)}function exists(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function output(e,t){bytes(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}const assert={number:number,bool:bool,bytes:bytes,hash:hash,exists:exists,output:output},u8to16=(e,t)=>255&e[t++]|(255&e[t++])<<8;class Poly1305{constructor(e){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,ensureBytes(e=toBytes(e),32);const t=u8to16(e,0),n=u8to16(e,2),r=u8to16(e,4),o=u8to16(e,6),i=u8to16(e,8),s=u8to16(e,10),a=u8to16(e,12),l=u8to16(e,14);this.r[0]=8191&t,this.r[1]=8191&(t>>>13|n<<3),this.r[2]=7939&(n>>>10|r<<6),this.r[3]=8191&(r>>>7|o<<9),this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,this.r[6]=8191&(i>>>14|s<<2),this.r[7]=8065&(s>>>11|a<<5),this.r[8]=8191&(a>>>8|l<<8),this.r[9]=l>>>5&127;for(let t=0;t<8;t++)this.pad[t]=u8to16(e,16+2*t)}process(e,t,n=!1){const r=n?0:2048,{h:o,r:i}=this,s=i[0],a=i[1],l=i[2],c=i[3],d=i[4],h=i[5],u=i[6],p=i[7],f=i[8],g=i[9],m=u8to16(e,t+0),b=u8to16(e,t+2),y=u8to16(e,t+4),w=u8to16(e,t+6),v=u8to16(e,t+8),x=u8to16(e,t+10),E=u8to16(e,t+12),k=u8to16(e,t+14);let C=o[0]+(8191&m),$=o[1]+(8191&(m>>>13|b<<3)),S=o[2]+(8191&(b>>>10|y<<6)),_=o[3]+(8191&(y>>>7|w<<9)),A=o[4]+(8191&(w>>>4|v<<12)),N=o[5]+(v>>>1&8191),L=o[6]+(8191&(v>>>14|x<<2)),B=o[7]+(8191&(x>>>11|E<<5)),R=o[8]+(8191&(E>>>8|k<<8)),T=o[9]+(k>>>5|r),I=0,U=I+C*s+$*(5*g)+S*(5*f)+_*(5*p)+A*(5*u);I=U>>>13,U&=8191,U+=N*(5*h)+L*(5*d)+B*(5*c)+R*(5*l)+T*(5*a),I+=U>>>13,U&=8191;let M=I+C*a+$*s+S*(5*g)+_*(5*f)+A*(5*p);I=M>>>13,M&=8191,M+=N*(5*u)+L*(5*h)+B*(5*d)+R*(5*c)+T*(5*l),I+=M>>>13,M&=8191;let O=I+C*l+$*a+S*s+_*(5*g)+A*(5*f);I=O>>>13,O&=8191,O+=N*(5*p)+L*(5*u)+B*(5*h)+R*(5*d)+T*(5*c),I+=O>>>13,O&=8191;let P=I+C*c+$*l+S*a+_*s+A*(5*g);I=P>>>13,P&=8191,P+=N*(5*f)+L*(5*p)+B*(5*u)+R*(5*h)+T*(5*d),I+=P>>>13,P&=8191;let H=I+C*d+$*c+S*l+_*a+A*s;I=H>>>13,H&=8191,H+=N*(5*g)+L*(5*f)+B*(5*p)+R*(5*u)+T*(5*h),I+=H>>>13,H&=8191;let D=I+C*h+$*d+S*c+_*l+A*a;I=D>>>13,D&=8191,D+=N*s+L*(5*g)+B*(5*f)+R*(5*p)+T*(5*u),I+=D>>>13,D&=8191;let j=I+C*u+$*h+S*d+_*c+A*l;I=j>>>13,j&=8191,j+=N*a+L*s+B*(5*g)+R*(5*f)+T*(5*p),I+=j>>>13,j&=8191;let F=I+C*p+$*u+S*h+_*d+A*c;I=F>>>13,F&=8191,F+=N*l+L*a+B*s+R*(5*g)+T*(5*f),I+=F>>>13,F&=8191;let K=I+C*f+$*p+S*u+_*h+A*d;I=K>>>13,K&=8191,K+=N*c+L*l+B*a+R*s+T*(5*g),I+=K>>>13,K&=8191;let q=I+C*g+$*f+S*p+_*u+A*h;I=q>>>13,q&=8191,q+=N*d+L*c+B*l+R*a+T*s,I+=q>>>13,q&=8191,I=(I<<2)+I|0,I=I+U|0,U=8191&I,I>>>=13,M+=I,o[0]=U,o[1]=M,o[2]=O,o[3]=P,o[4]=H,o[5]=D,o[6]=j,o[7]=F,o[8]=K,o[9]=q}finalize(){const{h:e,pad:t}=this,n=new Uint16Array(10);let r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=5*r,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let o=(1^r)-1;for(let e=0;e<10;e++)n[e]&=o;o=~o;for(let t=0;t<10;t++)e[t]=e[t]&o|n[t];e[0]=65535&(e[0]|e[1]<<13),e[1]=65535&(e[1]>>>3|e[2]<<10),e[2]=65535&(e[2]>>>6|e[3]<<7),e[3]=65535&(e[3]>>>9|e[4]<<4),e[4]=65535&(e[4]>>>12|e[5]<<1|e[6]<<14),e[5]=65535&(e[6]>>>2|e[7]<<11),e[6]=65535&(e[7]>>>5|e[8]<<8),e[7]=65535&(e[8]>>>8|e[9]<<5);let i=e[0]+t[0];e[0]=65535&i;for(let n=1;n<8;n++)i=(e[n]+t[n]|0)+(i>>>16)|0,e[n]=65535&i}update(e){assert.exists(this);const{buffer:t,blockLen:n}=this,r=(e=toBytes(e)).length;for(let o=0;o<r;){const i=Math.min(n-this.pos,r-o);if(i!==n)t.set(e.subarray(o,o+i),this.pos),this.pos+=i,o+=i,this.pos===n&&(this.process(t,0,!1),this.pos=0);else for(;n<=r-o;o+=n)this.process(e,o)}return this}destroy(){this.h.fill(0),this.r.fill(0),this.buffer.fill(0),this.pad.fill(0)}digestInto(e){assert.exists(this),assert.output(e,this),this.finished=!0;const{buffer:t,h:n}=this;let{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let o=0;for(let t=0;t<8;t++)e[o++]=n[t]>>>0,e[o++]=n[t]>>>8;return e}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}}function wrapConstructorWithKey(e){const t=(t,n)=>e(n).update(toBytes(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}wrapConstructorWithKey((e=>new Poly1305(e)));const sigma16=utf8ToBytes("expand 16-byte k"),sigma32=utf8ToBytes("expand 32-byte k"),sigma16_32=u32(sigma16),sigma32_32=u32(sigma32),isAligned32=e=>!(e.byteOffset%4),salsaBasic=e=>{const{core:t,rounds:n,counterRight:r,counterLen:o,allow128bitKeys:i,extendNonceFn:s,blockLen:a}=checkOpts({rounds:20,counterRight:!1,counterLen:8,allow128bitKeys:!0,blockLen:64},e);assert.number(o),assert.number(n),assert.number(a),assert.bool(r),assert.bool(i);const l=a/4;if(a%4!=0)throw new Error("Salsa/ChaCha: blockLen must be aligned to 4 bytes");return(e,c,d,h,u=0)=>{if(assert.bytes(e),assert.bytes(c),assert.bytes(d),h||(h=new Uint8Array(d.length)),assert.bytes(h),assert.number(u),u<0||u>=2**32-1)throw new Error("Salsa/ChaCha: counter overflow");if(h.length<d.length)throw new Error(`Salsa/ChaCha: output (${h.length}) is shorter than data (${d.length})`);const p=[];let f,g;if(32===e.length)f=e,g=sigma32_32;else{if(16!==e.length||!i)throw new Error(`Salsa/ChaCha: invalid 32-byte key, got length=${e.length}`);f=new Uint8Array(32),f.set(e),f.set(e,16),g=sigma16_32,p.push(f)}if(s){if(c.length<=16)throw new Error("Salsa/ChaCha: extended nonce must be bigger than 16 bytes");f=s(g,f,c.subarray(0,16),new Uint8Array(32)),p.push(f),c=c.subarray(16)}const m=16-o;if(c.length!==m)throw new Error(`Salsa/ChaCha: nonce must be ${m} or 16 bytes`);if(12!==m){const e=new Uint8Array(12);e.set(c,r?0:12-c.length),p.push(c=e)}const b=new Uint8Array(a),y=u32(b),w=u32(f),v=u32(c),x=isAligned32(d)&&u32(d),E=isAligned32(h)&&u32(h);p.push(y);const k=d.length;for(let e=0,r=u;e<k;r++){if(t(g,w,v,y,r,n),r>=2**32-1)throw new Error("Salsa/ChaCha: counter overflow");const o=Math.min(a,k-e);if(o===a&&E&&x){const t=e/4;if(e%4!=0)throw new Error("Salsa/ChaCha: invalid block position");for(let e=0;e<l;e++)E[t+e]=x[t+e]^y[e];e+=a}else{for(let t=0;t<o;t++)h[e+t]=d[e+t]^b[t];e+=o}}for(let e=0;e<p.length;e++)p[e].fill(0);return h}},rotl=(e,t)=>e<<t|e>>>32-t;function chachaCore(e,t,n,r,o,i=20){let s=e[0],a=e[1],l=e[2],c=e[3],d=t[0],h=t[1],u=t[2],p=t[3],f=t[4],g=t[5],m=t[6],b=t[7],y=o,w=n[0],v=n[1],x=n[2],E=s,k=a,C=l,$=c,S=d,_=h,A=u,N=p,L=f,B=g,R=m,T=b,I=y,U=w,M=v,O=x;for(let e=0;e<i;e+=2)E=E+S|0,I=rotl(I^E,16),L=L+I|0,S=rotl(S^L,12),E=E+S|0,I=rotl(I^E,8),L=L+I|0,S=rotl(S^L,7),k=k+_|0,U=rotl(U^k,16),B=B+U|0,_=rotl(_^B,12),k=k+_|0,U=rotl(U^k,8),B=B+U|0,_=rotl(_^B,7),C=C+A|0,M=rotl(M^C,16),R=R+M|0,A=rotl(A^R,12),C=C+A|0,M=rotl(M^C,8),R=R+M|0,A=rotl(A^R,7),$=$+N|0,O=rotl(O^$,16),T=T+O|0,N=rotl(N^T,12),$=$+N|0,O=rotl(O^$,8),T=T+O|0,N=rotl(N^T,7),E=E+_|0,O=rotl(O^E,16),R=R+O|0,_=rotl(_^R,12),E=E+_|0,O=rotl(O^E,8),R=R+O|0,_=rotl(_^R,7),k=k+A|0,I=rotl(I^k,16),T=T+I|0,A=rotl(A^T,12),k=k+A|0,I=rotl(I^k,8),T=T+I|0,A=rotl(A^T,7),C=C+N|0,U=rotl(U^C,16),L=L+U|0,N=rotl(N^L,12),C=C+N|0,U=rotl(U^C,8),L=L+U|0,N=rotl(N^L,7),$=$+S|0,M=rotl(M^$,16),B=B+M|0,S=rotl(S^B,12),$=$+S|0,M=rotl(M^$,8),B=B+M|0,S=rotl(S^B,7);let P=0;r[P++]=s+E|0,r[P++]=a+k|0,r[P++]=l+C|0,r[P++]=c+$|0,r[P++]=d+S|0,r[P++]=h+_|0,r[P++]=u+A|0,r[P++]=p+N|0,r[P++]=f+L|0,r[P++]=g+B|0,r[P++]=m+R|0,r[P++]=b+T|0,r[P++]=y+I|0,r[P++]=w+U|0,r[P++]=v+M|0,r[P++]=x+O|0}const chacha20=salsaBasic({core:chachaCore,counterRight:!1,counterLen:4,allow128bitKeys:!1});class HMAC extends Hash$1{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,assert$2.hash(e);const n=toBytes$2(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,o=new Uint8Array(r);o.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<o.length;e++)o[e]^=54;this.iHash.update(o),this.oHash=e.create();for(let e=0;e<o.length;e++)o[e]^=106;this.oHash.update(o),o.fill(0)}update(e){return assert$2.exists(this),this.iHash.update(e),this}digestInto(e){assert$2.exists(this),assert$2.bytes(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:o,blockLen:i,outputLen:s}=this;return e.finished=r,e.destroyed=o,e.blockLen=i,e.outputLen=s,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const hmac=(e,t,n)=>new HMAC(e,t).update(n).digest();function extract$1(e,t,n){return assert$2.hash(e),void 0===n&&(n=new Uint8Array(e.outputLen)),hmac(e,toBytes$2(n),toBytes$2(t))}hmac.create=(e,t)=>new HMAC(e,t);const HKDF_COUNTER$1=new Uint8Array([0]),EMPTY_BUFFER$1=new Uint8Array;function expand$1(e,t,n,r=32){if(assert$2.hash(e),assert$2.number(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const o=Math.ceil(r/e.outputLen),i=new Uint8Array(o*e.outputLen),s=hmac.create(e,t),a=s._cloneInto(),l=new Uint8Array(s.outputLen);for(let t=0;t<o;t++)HKDF_COUNTER$1[0]=t+1,a.update(0===t?EMPTY_BUFFER$1:l).update(n).update(HKDF_COUNTER$1).digestInto(l),i.set(l,e.outputLen*t),s._cloneInto(a);return s.destroy(),a.destroy(),l.fill(0),HKDF_COUNTER$1.fill(0),i.slice(0,r)}const hkdf=(e,t,n,r,o)=>expand$1(e,extract$1(e,t,n),r,o);var __defProp=Object.defineProperty,__export=(e,t)=>{for(var n in t)__defProp(e,n,{get:t[n],enumerable:!0})};function generatePrivateKey(){return bytesToHex$1(schnorr.utils.randomPrivateKey())}function getPublicKey(e){return bytesToHex$1(schnorr.getPublicKey(e))}var utils_exports={};__export(utils_exports,{MessageNode:()=>MessageNode,MessageQueue:()=>MessageQueue,insertEventIntoAscendingList:()=>insertEventIntoAscendingList,insertEventIntoDescendingList:()=>insertEventIntoDescendingList,normalizeURL:()=>normalizeURL,utf8Decoder:()=>utf8Decoder,utf8Encoder:()=>utf8Encoder});var utf8Decoder=new TextDecoder("utf-8"),utf8Encoder=new TextEncoder;function normalizeURL(e){let t=new URL(e);return t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),("80"===t.port&&"ws:"===t.protocol||"443"===t.port&&"wss:"===t.protocol)&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}function insertEventIntoDescendingList(e,t){let n,r=0,o=e.length-1,i=r;if(o<0)i=0;else if(t.created_at<e[o].created_at)i=o+1;else if(t.created_at>=e[r].created_at)i=r;else for(;;){if(o<=r+1){i=o;break}if(n=Math.floor(r+(o-r)/2),e[n].created_at>t.created_at)r=n;else{if(!(e[n].created_at<t.created_at)){i=n;break}o=n}}return e[i]?.id!==t.id?[...e.slice(0,i),t,...e.slice(i)]:e}function insertEventIntoAscendingList(e,t){let n,r=0,o=e.length-1,i=r;if(o<0)i=0;else if(t.created_at>e[o].created_at)i=o+1;else if(t.created_at<=e[r].created_at)i=r;else for(;;){if(o<=r+1){i=o;break}if(n=Math.floor(r+(o-r)/2),e[n].created_at<t.created_at)r=n;else{if(!(e[n].created_at>t.created_at)){i=n;break}o=n}}return e[i]?.id!==t.id?[...e.slice(0,i),t,...e.slice(i)]:e}var MessageNode=class{_value;_next;get value(){return this._value}set value(e){this._value=e}get next(){return this._next}set next(e){this._next=e}constructor(e){this._value=e,this._next=null}},MessageQueue=class{_first;_last;get first(){return this._first}set first(e){this._first=e}get last(){return this._last}set last(e){this._last=e}_size;get size(){return this._size}set size(e){this._size=e}constructor(){this._first=null,this._last=null,this._size=0}enqueue(e){const t=new MessageNode(e);return 0!==this._size&&this._last?(this._last.next=t,this._last=t):(this._first=t,this._last=t),this._size++,!0}dequeue(){if(0===this._size||!this._first)return null;let e=this._first;return this._first=e.next,e.next=null,this._size--,e.value}},verifiedSymbol=Symbol("verified");function getBlankEvent(e=255){return{kind:e,content:"",tags:[],created_at:0}}function finishEvent(e,t){const n=e;return n.pubkey=getPublicKey(t),n.id=getEventHash(n),n.sig=getSignature(n,t),n[verifiedSymbol]=!0,n}function serializeEvent(e){if(!validateEvent(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function getEventHash(e){return bytesToHex$1(sha256$1(utf8Encoder.encode(serializeEvent(e))))}var isRecord=e=>e instanceof Object;function validateEvent(e){if(!isRecord(e))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;t<e.tags.length;t++){let n=e.tags[t];if(!Array.isArray(n))return!1;for(let e=0;e<n.length;e++)if("object"==typeof n[e])return!1}return!0}function verifySignature(e){if("boolean"==typeof e[verifiedSymbol])return e[verifiedSymbol];const t=getEventHash(e);if(t!==e.id)return e[verifiedSymbol]=!1;try{return e[verifiedSymbol]=schnorr.verify(e.sig,t,e.pubkey)}catch(t){return e[verifiedSymbol]=!1}}function getSignature(e,t){return bytesToHex$1(schnorr.sign(getEventHash(e),t))}function matchFilter(e,t){if(e.ids&&-1===e.ids.indexOf(t.id)&&!e.ids.some((e=>t.id.startsWith(e))))return!1;if(e.kinds&&-1===e.kinds.indexOf(t.kind))return!1;if(e.authors&&-1===e.authors.indexOf(t.pubkey)&&!e.authors.some((e=>t.pubkey.startsWith(e))))return!1;for(let n in e)if("#"===n[0]){let r=e[`#${n.slice(1)}`];if(r&&!t.tags.find((([e,t])=>e===n.slice(1)&&-1!==r.indexOf(t))))return!1}return!(e.since&&t.created_at<e.since)&&!(e.until&&t.created_at>e.until)}function matchFilters(e,t){for(let n=0;n<e.length;n++)if(matchFilter(e[n],t))return!0;return!1}function mergeFilters(...e){let t={};for(let n=0;n<e.length;n++){let r=e[n];Object.entries(r).forEach((([e,n])=>{if("kinds"===e||"ids"===e||"authors"===e||"#"===e[0]){t[e]=t[e]||[];for(let r=0;r<n.length;r++){let o=n[r];t[e].includes(o)||t[e].push(o)}}})),r.limit&&(!t.limit||r.limit>t.limit)&&(t.limit=r.limit),r.until&&(!t.until||r.until>t.until)&&(t.until=r.until),r.since&&(!t.since||r.since<t.since)&&(t.since=r.since)}return t}var fakejson_exports={};function getHex64(e,t){let n=t.length+3,r=e.indexOf(`"${t}":`)+n,o=e.slice(r).indexOf('"')+r+1;return e.slice(o,o+64)}function getInt(e,t){let n=t.length,r=e.indexOf(`"${t}":`)+n+3,o=e.slice(r),i=Math.min(o.indexOf(","),o.indexOf("}"));return parseInt(o.slice(0,i),10)}function getSubscriptionId(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let r=t+7+1+n,o=e.slice(r+1,80).indexOf('"');if(-1===o)return null;let i=r+1+o;return e.slice(r+1,i)}function matchEventId(e,t){return t===getHex64(e,"id")}function matchEventPubkey(e,t){return t===getHex64(e,"pubkey")}function matchEventKind(e,t){return t===getInt(e,"kind")}__export(fakejson_exports,{getHex64:()=>getHex64,getInt:()=>getInt,getSubscriptionId:()=>getSubscriptionId,matchEventId:()=>matchEventId,matchEventKind:()=>matchEventKind,matchEventPubkey:()=>matchEventPubkey});var newListeners=()=>({connect:[],disconnect:[],error:[],notice:[],auth:[]});function relayInit(e,t={}){let{listTimeout:n=3e3,getTimeout:r=3e3,countTimeout:o=3e3}=t;var i,s,a={},l=newListeners(),c={},d={};function h(){return 1===i?.readyState}async function u(e){let t=JSON.stringify(e);if(h()||(await new Promise((e=>setTimeout(e,1e3))),h()))try{i.send(t)}catch(e){console.log(e)}}const p=(e,{verb:t="REQ",skipVerification:n=!1,alreadyHaveEvent:r=null,id:o=Math.random().toString().slice(2)}={})=>{let i=o;a[i]={id:i,filters:e,skipVerification:n,alreadyHaveEvent:r},u([t,i,...e]);let s={sub:(t,o={})=>p(t||e,{skipVerification:o.skipVerification||n,alreadyHaveEvent:o.alreadyHaveEvent||r,id:i}),unsub:()=>{delete a[i],delete c[i],u(["CLOSE",i])},on:(e,t)=>{c[i]=c[i]||{event:[],count:[],eose:[]},c[i][e].push(t)},off:(e,t)=>{let n=c[i],r=n[e].indexOf(t);r>=0&&n[e].splice(r,1)},get events(){return eventsGenerator(s)}};return s};function f(e,t){return new Promise(((n,r)=>{if(!e.id)return void r(new Error(`event ${e} has no id`));let o=e.id;u([t,e]),d[o]={resolve:n,reject:r}}))}return{url:e,sub:p,on:(e,t)=>{l[e].push(t),"connect"===e&&1===i?.readyState&&t()},off:(e,t)=>{let n=l[e].indexOf(t);-1!==n&&l[e].splice(n,1)},list:(e,t)=>new Promise((r=>{let o=p(e,t),i=[],s=setTimeout((()=>{o.unsub(),r(i)}),n);o.on("eose",(()=>{o.unsub(),clearTimeout(s),r(i)})),o.on("event",(e=>{i.push(e)}))})),get:(e,t)=>new Promise((n=>{let o=p([e],t),i=setTimeout((()=>{o.unsub(),n(null)}),r);o.on("event",(e=>{o.unsub(),clearTimeout(i),n(e)}))})),count:e=>new Promise((t=>{let n=p(e,{...p,verb:"COUNT"}),r=setTimeout((()=>{n.unsub(),t(null)}),o);n.on("count",(e=>{n.unsub(),clearTimeout(r),t(e)}))})),async publish(e){await f(e,"EVENT")},async auth(e){await f(e,"AUTH")},connect:async function(){h()||await async function(){return s||(s=new Promise(((t,n)=>{try{i=new WebSocket(e)}catch(e){n(e)}i.onopen=()=>{l.connect.forEach((e=>e())),t()},i.onerror=()=>{s=void 0,l.error.forEach((e=>e())),n()},i.onclose=async()=>{s=void 0,l.disconnect.forEach((e=>e()))};let r,o=new MessageQueue;function h(){if(0===o.size)return clearInterval(r),void(r=null);var t=o.dequeue();if(!t)return;let n=getSubscriptionId(t);if(n){let r=a[n];if(r&&r.alreadyHaveEvent&&r.alreadyHaveEvent(getHex64(t,"id"),e))return}try{let e=JSON.parse(t);switch(e[0]){case"EVENT":{let t=e[1],n=e[2];return void(validateEvent(n)&&a[t]&&(a[t].skipVerification||verifySignature(n))&&matchFilters(a[t].filters,n)&&(a[t],(c[t]?.event||[]).forEach((e=>e(n)))))}case"COUNT":let t=e[1],n=e[2];return void(a[t]&&(c[t]?.count||[]).forEach((e=>e(n))));case"EOSE":{let t=e[1];return void(t in c&&(c[t].eose.forEach((e=>e())),c[t].eose=[]))}case"OK":{let t=e[1],n=e[2],r=e[3]||"";if(t in d){let{resolve:e,reject:o}=d[t];n?e(null):o(new Error(r))}return}case"NOTICE":let r=e[1];return void l.notice.forEach((e=>e(r)));case"AUTH":{let t=e[1];return void l.auth?.forEach((e=>e(t)))}}}catch(e){return}}i.onmessage=e=>{o.enqueue(e.data),r||(r=setInterval(h,0))}})),s)}()},close(){l=newListeners(),c={},d={},i?.readyState===WebSocket.OPEN&&i.close()},get status(){return i?.readyState??3}}}async function*eventsGenerator(e){let t;const n=[],r=e=>{t?(t(e),t=void 0):n.push(e)};e.on("event",r);try{for(;;)if(n.length>0)yield n.shift();else{const e=await new Promise((e=>{t=e}));yield e}}finally{e.off("event",r)}}var SimplePool=class{_conn;_seenOn={};batchedByKey={};eoseSubTimeout;getTimeout;seenOnEnabled=!0;batchInterval=100;constructor(e={}){this._conn={},this.eoseSubTimeout=e.eoseSubTimeout||3400,this.getTimeout=e.getTimeout||3400,this.seenOnEnabled=!1!==e.seenOnEnabled,this.batchInterval=e.batchInterval||100}close(e){e.forEach((e=>{let t=this._conn[normalizeURL(e)];t&&t.close()}))}async ensureRelay(e){const t=normalizeURL(e);this._conn[t]||(this._conn[t]=relayInit(t,{getTimeout:.9*this.getTimeout,listTimeout:.9*this.getTimeout}));const n=this._conn[t];return await n.connect(),n}sub(e,t,n){let r=new Set,o={...n||{}};o.alreadyHaveEvent=(e,t)=>{if(n?.alreadyHaveEvent?.(e,t))return!0;if(this.seenOnEnabled){let n=this._seenOn[e]||new Set;n.add(t),this._seenOn[e]=n}return r.has(e)};let i=[],s=new Set,a=new Set,l=e.length,c=!1,d=setTimeout((()=>{c=!0;for(let e of a.values())e()}),n?.eoseSubTimeout||this.eoseSubTimeout);e.filter(((e,t,n)=>n.indexOf(e)===t)).forEach((async e=>{let n;try{n=await this.ensureRelay(e)}catch(e){return void u()}if(!n)return;let h=n.sub(t,o);function u(){if(l--,0===l){clearTimeout(d);for(let e of a.values())e()}}h.on("event",(e=>{r.add(e.id);for(let t of s.values())t(e)})),h.on("eose",(()=>{c||u()})),i.push(h)}));let h={sub:(e,t)=>(i.forEach((n=>n.sub(e,t))),h),unsub(){i.forEach((e=>e.unsub()))},on(e,t){"event"===e?s.add(t):"eose"===e&&a.add(t)},off(e,t){"event"===e?s.delete(t):"eose"===e&&a.delete(t)},get events(){return eventsGenerator(h)}};return h}get(e,t,n){return new Promise((r=>{let o=this.sub(e,[t],n),i=setTimeout((()=>{o.unsub(),r(null)}),this.getTimeout);o.on("event",(e=>{r(e),clearTimeout(i),o.unsub()}))}))}list(e,t,n){return new Promise((r=>{let o=[],i=this.sub(e,t,n);i.on("event",(e=>{o.push(e)})),i.on("eose",(()=>{i.unsub(),r(o)}))}))}batchedList(e,t,n){return new Promise((r=>{this.batchedByKey[e]?this.batchedByKey[e].push({filters:n,relays:t,resolve:r,events:[]}):(this.batchedByKey[e]=[{filters:n,relays:t,resolve:r,events:[]}],setTimeout((()=>{Object.keys(this.batchedByKey).forEach((async e=>{const t=this.batchedByKey[e],n=[],r=[];t.forEach((e=>{n.push(...e.filters),r.push(...e.relays)}));const o=this.sub(r,[mergeFilters(...n)]);o.on("event",(e=>{t.forEach((t=>matchFilters(t.filters,e)&&t.events.push(e)))})),o.on("eose",(()=>{o.unsub(),t.forEach((e=>e.resolve(e.events)))})),delete this.batchedByKey[e]}))}),this.batchInterval))}))}publish(e,t){return e.map((async e=>(await this.ensureRelay(e)).publish(t)))}seenOn(e){return Array.from(this._seenOn[e]?.values?.()||[])}},nip19_exports={};__export(nip19_exports,{BECH32_REGEX:()=>BECH32_REGEX,decode:()=>decode,naddrEncode:()=>naddrEncode,neventEncode:()=>neventEncode,noteEncode:()=>noteEncode,nprofileEncode:()=>nprofileEncode,npubEncode:()=>npubEncode,nrelayEncode:()=>nrelayEncode,nsecEncode:()=>nsecEncode});var Bech32MaxSize=5e3,BECH32_REGEX=/[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;function integerToUint8Array(e){const t=new Uint8Array(4);return t[0]=e>>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t}function decode(e){let{prefix:t,words:n}=bech32.decode(e,Bech32MaxSize),r=new Uint8Array(bech32.fromWords(n));switch(t){case"nprofile":{let e=parseTLV(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:bytesToHex$1(e[0][0]),relays:e[1]?e[1].map((e=>utf8Decoder.decode(e))):[]}}}case"nevent":{let e=parseTLV(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:bytesToHex$1(e[0][0]),relays:e[1]?e[1].map((e=>utf8Decoder.decode(e))):[],author:e[2]?.[0]?bytesToHex$1(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(bytesToHex$1(e[3][0]),16):void 0}}}case"naddr":{let e=parseTLV(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:utf8Decoder.decode(e[0][0]),pubkey:bytesToHex$1(e[2][0]),kind:parseInt(bytesToHex$1(e[3][0]),16),relays:e[1]?e[1].map((e=>utf8Decoder.decode(e))):[]}}}case"nrelay":{let e=parseTLV(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nrelay");return{type:"nrelay",data:utf8Decoder.decode(e[0][0])}}case"nsec":case"npub":case"note":return{type:t,data:bytesToHex$1(r)};default:throw new Error(`unknown prefix ${t}`)}}function parseTLV(e){let t={},n=e;for(;n.length>0;){let e=n[0],r=n[1];if(!r)throw new Error(`malformed TLV ${e}`);let o=n.slice(2,2+r);if(n=n.slice(2+r),o.length<r)throw new Error(`not enough data to read on TLV ${e}`);t[e]=t[e]||[],t[e].push(o)}return t}function nsecEncode(e){return encodeBytes("nsec",e)}function npubEncode(e){return encodeBytes("npub",e)}function noteEncode(e){return encodeBytes("note",e)}function encodeBech32(e,t){let n=bech32.toWords(t);return bech32.encode(e,n,Bech32MaxSize)}function encodeBytes(e,t){return encodeBech32(e,hexToBytes$1(t))}function nprofileEncode(e){return encodeBech32("nprofile",encodeTLV({0:[hexToBytes$1(e.pubkey)],1:(e.relays||[]).map((e=>utf8Encoder.encode(e)))}))}function neventEncode(e){let t;return null!=e.kind&&(t=integerToUint8Array(e.kind)),encodeBech32("nevent",encodeTLV({0:[hexToBytes$1(e.id)],1:(e.relays||[]).map((e=>utf8Encoder.encode(e))),2:e.author?[hexToBytes$1(e.author)]:[],3:t?[new Uint8Array(t)]:[]}))}function naddrEncode(e){let t=new ArrayBuffer(4);return new DataView(t).setUint32(0,e.kind,!1),encodeBech32("naddr",encodeTLV({0:[utf8Encoder.encode(e.identifier)],1:(e.relays||[]).map((e=>utf8Encoder.encode(e))),2:[hexToBytes$1(e.pubkey)],3:[new Uint8Array(t)]}))}function nrelayEncode(e){return encodeBech32("nrelay",encodeTLV({0:[utf8Encoder.encode(e)]}))}function encodeTLV(e){let t=[];return Object.entries(e).forEach((([e,n])=>{n.forEach((n=>{let r=new Uint8Array(n.length+2);r.set([parseInt(e)],0),r.set([n.length],1),r.set(n,2),t.push(r)}))})),concatBytes$1(...t)}var nip04_exports={};async function encrypt(e,t,n){const r=getNormalizedX(secp256k1.getSharedSecret(e,"02"+t));let o=Uint8Array.from(randomBytes$1(16)),i=utf8Encoder.encode(n),s=await crypto.subtle.importKey("raw",r,{name:"AES-CBC"},!1,["encrypt"]),a=await crypto.subtle.encrypt({name:"AES-CBC",iv:o},s,i);return`${base64$1.encode(new Uint8Array(a))}?iv=${base64$1.encode(new Uint8Array(o.buffer))}`}async function decrypt(e,t,n){let[r,o]=n.split("?iv="),i=getNormalizedX(secp256k1.getSharedSecret(e,"02"+t)),s=await crypto.subtle.importKey("raw",i,{name:"AES-CBC"},!1,["decrypt"]),a=base64$1.decode(r),l=base64$1.decode(o),c=await crypto.subtle.decrypt({name:"AES-CBC",iv:l},s,a);return utf8Decoder.decode(c)}function getNormalizedX(e){return e.slice(1,33)}__export(nip04_exports,{decrypt:()=>decrypt,encrypt:()=>encrypt}),"undefined"!=typeof crypto&&!crypto.subtle&&crypto.webcrypto&&(crypto.subtle=crypto.webcrypto.subtle);var nip05_exports={};__export(nip05_exports,{NIP05_REGEX:()=>NIP05_REGEX,queryProfile:()=>queryProfile,searchDomain:()=>searchDomain,useFetchImplementation:()=>useFetchImplementation});var NIP05_REGEX=/^(?:([\w.+-]+)@)?([\w.-]+)$/,_fetch;try{_fetch=fetch}catch{}function useFetchImplementation(e){_fetch=e}async function searchDomain(e,t=""){try{return(await(await _fetch(`https://${e}/.well-known/nostr.json?name=${t}`)).json()).names}catch(e){return{}}}async function queryProfile(e){const t=e.match(NIP05_REGEX);if(!t)return null;const[n,r="_",o]=t;try{const e=await _fetch(`https://${o}/.well-known/nostr.json?name=${r}`),{names:t,relays:n}=parseNIP05Result(await e.json()),i=t[r];return i?{pubkey:i,relays:n?.[i]}:null}catch(e){return null}}function parseNIP05Result(e){const t={names:{}};for(const[n,r]of Object.entries(e.names))"string"==typeof n&&"string"==typeof r&&(t.names[n]=r);if(e.relays){t.relays={};for(const[n,r]of Object.entries(e.relays))"string"==typeof n&&Array.isArray(r)&&(t.relays[n]=r.filter((e=>"string"==typeof e)))}return t}var nip06_exports={};function privateKeyFromSeedWords(e,t){let n=HDKey.fromMasterSeed(mnemonicToSeedSync(e,t)).derive("m/44'/1237'/0'/0/0").privateKey;if(!n)throw new Error("could not derive private key");return bytesToHex$1(n)}function generateSeedWords(){return generateMnemonic(wordlist)}function validateWords(e){return validateMnemonic(e,wordlist)}__export(nip06_exports,{generateSeedWords:()=>generateSeedWords,privateKeyFromSeedWords:()=>privateKeyFromSeedWords,validateWords:()=>validateWords});var nip10_exports={};function parse(e){const t={reply:void 0,root:void 0,mentions:[],profiles:[]},n=[];for(const r of e.tags)"e"===r[0]&&r[1]&&n.push(r),"p"===r[0]&&r[1]&&t.profiles.push({pubkey:r[1],relays:r[2]?[r[2]]:[]});for(let e=0;e<n.length;e++){const r=n[e],[o,i,s,a]=r,l={id:i,relays:s?[s]:[]},c=0===e,d=e===n.length-1;"root"!==a?"reply"!==a?"mention"!==a?c?t.root=l:d?t.reply=l:t.mentions.push(l):t.mentions.push(l):t.reply=l:t.root=l}return t}__export(nip10_exports,{parse:()=>parse});var nip13_exports={};function getPow(e){let t=0;for(let n=0;n<e.length;n++){const r=parseInt(e[n],16);if(0!==r){t+=Math.clz32(r)-28;break}t+=4}return t}function minePow(e,t){let n=0;const r=e,o=["nonce",n.toString(),t.toString()];for(r.tags.push(o);;){const e=Math.floor((new Date).getTime()/1e3);if(e!==r.created_at&&(n=0,r.created_at=e),o[1]=(++n).toString(),r.id=getEventHash(r),getPow(r.id)>=t)break}return r}__export(nip13_exports,{getPow:()=>getPow,minePow:()=>minePow});var nip18_exports={};function finishRepostEvent(e,t,n,r){return finishEvent({kind:6,tags:[...e.tags??[],["e",t.id,n],["p",t.pubkey]],content:""===e.content?"":JSON.stringify(t),created_at:e.created_at},r)}function getRepostedEventPointer(e){if(6!==e.kind)return;let t,n;for(let r=e.tags.length-1;r>=0&&(void 0===t||void 0===n);r--){const o=e.tags[r];o.length>=2&&("e"===o[0]&&void 0===t?t=o:"p"===o[0]&&void 0===n&&(n=o))}return void 0!==t?{id:t[1],relays:[t[2],n?.[2]].filter((e=>"string"==typeof e)),author:n?.[1]}:void 0}function getRepostedEvent(e,{skipVerification:t}={}){const n=getRepostedEventPointer(e);if(void 0===n||""===e.content)return;let r;try{r=JSON.parse(e.content)}catch(e){return}return r.id===n.id&&(t||verifySignature(r))?r:void 0}__export(nip18_exports,{finishRepostEvent:()=>finishRepostEvent,getRepostedEvent:()=>getRepostedEvent,getRepostedEventPointer:()=>getRepostedEventPointer});var nip21_exports={};__export(nip21_exports,{NOSTR_URI_REGEX:()=>NOSTR_URI_REGEX,parse:()=>parse2,test:()=>test});var NOSTR_URI_REGEX=new RegExp(`nostr:(${BECH32_REGEX.source})`);function test(e){return"string"==typeof e&&new RegExp(`^${NOSTR_URI_REGEX.source}$`).test(e)}function parse2(e){const t=e.match(new RegExp(`^${NOSTR_URI_REGEX.source}$`));if(!t)throw new Error(`Invalid Nostr URI: ${e}`);return{uri:t[0],value:t[1],decoded:decode(t[1])}}var nip25_exports={};function finishReactionEvent(e,t,n){const r=t.tags.filter((e=>e.length>=2&&("e"===e[0]||"p"===e[0])));return finishEvent({...e,kind:7,tags:[...e.tags??[],...r,["e",t.id],["p",t.pubkey]],content:e.content??"+"},n)}function getReactedEventPointer(e){if(7!==e.kind)return;let t,n;for(let r=e.tags.length-1;r>=0&&(void 0===t||void 0===n);r--){const o=e.tags[r];o.length>=2&&("e"===o[0]&&void 0===t?t=o:"p"===o[0]&&void 0===n&&(n=o))}return void 0!==t&&void 0!==n?{id:t[1],relays:[t[2],n[2]].filter((e=>void 0!==e)),author:n[1]}:void 0}__export(nip25_exports,{finishReactionEvent:()=>finishReactionEvent,getReactedEventPointer:()=>getReactedEventPointer});var nip26_exports={};function createDelegation(e,t){let n=[];(t.kind||-1)>=0&&n.push(`kind=${t.kind}`),t.until&&n.push(`created_at<${t.until}`),t.since&&n.push(`created_at>${t.since}`);let r=n.join("&");if(""===r)throw new Error("refusing to create a delegation without any conditions");let o=sha256$1(utf8Encoder.encode(`nostr:delegation:${t.pubkey}:${r}`)),i=bytesToHex$1(schnorr.sign(o,e));return{from:getPublicKey(e),to:t.pubkey,cond:r,sig:i}}function getDelegator(e){let t=e.tags.find((e=>"delegation"===e[0]&&e.length>=4));if(!t)return null;let n=t[1],r=t[2],o=t[3],i=r.split("&");for(let t=0;t<i.length;t++){let[n,r,o]=i[t].split(/\b/);if(("kind"!==n||"="!==r||e.kind!==parseInt(o))&&!("created_at"===n&&"<"===r&&e.created_at<parseInt(o)||"created_at"===n&&">"===r&&e.created_at>parseInt(o)))return null}let s=sha256$1(utf8Encoder.encode(`nostr:delegation:${e.pubkey}:${r}`));return schnorr.verify(o,s,n)?n:null}__export(nip26_exports,{createDelegation:()=>createDelegation,getDelegator:()=>getDelegator});var nip27_exports={};__export(nip27_exports,{matchAll:()=>matchAll,regex:()=>regex,replaceAll:()=>replaceAll});var regex=()=>new RegExp(`\\b${NOSTR_URI_REGEX.source}\\b`,"g");function*matchAll(e){const t=e.matchAll(regex());for(const e of t)try{const[t,n]=e;yield{uri:t,value:n,decoded:decode(n),start:e.index,end:e.index+t.length}}catch(e){}}function replaceAll(e,t){return e.replaceAll(regex(),((e,n)=>t({uri:e,value:n,decoded:decode(n)})))}var nip28_exports={};__export(nip28_exports,{channelCreateEvent:()=>channelCreateEvent,channelHideMessageEvent:()=>channelHideMessageEvent,channelMessageEvent:()=>channelMessageEvent,channelMetadataEvent:()=>channelMetadataEvent,channelMuteUserEvent:()=>channelMuteUserEvent});var channelCreateEvent=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return finishEvent({kind:40,tags:[...e.tags??[]],content:n,created_at:e.created_at},t)},channelMetadataEvent=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return finishEvent({kind:41,tags:[["e",e.channel_create_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},channelMessageEvent=(e,t)=>{const n=[["e",e.channel_create_event_id,e.relay_url,"root"]];return e.reply_to_channel_message_event_id&&n.push(["e",e.reply_to_channel_message_event_id,e.relay_url,"reply"]),finishEvent({kind:42,tags:[...n,...e.tags??[]],content:e.content,created_at:e.created_at},t)},channelHideMessageEvent=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return finishEvent({kind:43,tags:[["e",e.channel_message_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},channelMuteUserEvent=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return finishEvent({kind:44,tags:[["p",e.pubkey_to_mute],...e.tags??[]],content:n,created_at:e.created_at},t)},nip39_exports={},_fetch2;__export(nip39_exports,{useFetchImplementation:()=>useFetchImplementation2,validateGithub:()=>validateGithub});try{_fetch2=fetch}catch{}function useFetchImplementation2(e){_fetch2=e}async function validateGithub(e,t,n){try{return await(await _fetch2(`https://gist.github.com/${t}/${n}/raw`)).text()===`Verifying that I control the following Nostr public key: ${e}`}catch(e){return!1}}var nip42_exports={};__export(nip42_exports,{authenticate:()=>authenticate});var authenticate=async({challenge:e,relay:t,sign:n})=>{const r={kind:22242,created_at:Math.floor(Date.now()/1e3),tags:[["relay",t.url],["challenge",e]],content:""};return t.auth(await n(r))},nip44_exports={};__export(nip44_exports,{decrypt:()=>decrypt2,encrypt:()=>encrypt2,utils:()=>utils});var utils={v2:{maxPlaintextSize:65408,minCiphertextSize:100,maxCiphertextSize:102400,getConversationKey:(e,t)=>secp256k1.getSharedSecret(e,"02"+t).subarray(1,33),getMessageKeys(e,t){const n=hkdf(sha256$1,e,t,"nip44-v2",76);return{encryption:n.subarray(0,32),nonce:n.subarray(32,44),auth:n.subarray(44,76)}},calcPadding(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("expected positive integer");if(e<=32)return 32;const t=1<<Math.floor(Math.log2(e-1))+1,n=t<=256?32:t/8;return n*(Math.floor((e-1)/n)+1)},pad(e){const t=utf8Encoder.encode(e),n=t.length;if(n<1||n>=utils.v2.maxPlaintextSize)throw new Error("invalid plaintext length: must be between 1b and 64KB");const r=utils.v2.calcPadding(n),o=new Uint8Array(r-n),i=new Uint8Array(2);return new DataView(i.buffer).setUint16(0,n),concatBytes$1(i,t,o)},unpad(e){const t=new DataView(e.buffer).getUint16(0),n=e.subarray(2,2+t);if(0===t||n.length!==t||e.length!==2+utils.v2.calcPadding(t))throw new Error("invalid padding");return utf8Decoder.decode(n)}}};function encrypt2(e,t,n={}){const r=n.version??2;if(2!==r)throw new Error("unknown encryption version "+r);const o=n.salt??randomBytes$1(32);ensureBytes(o,32);const i=utils.v2.getMessageKeys(e,o),s=utils.v2.pad(t),a=chacha20(i.encryption,i.nonce,s),l=hmac(sha256$1,i.auth,a);return base64$1.encode(concatBytes$1(new Uint8Array([r]),o,a,l))}function decrypt2(e,t){const n=utils.v2;ensureBytes(e,32);const r=t.length;if(r<n.minCiphertextSize||r>=n.maxCiphertextSize)throw new Error("invalid ciphertext length: "+r);if("#"===t[0])throw new Error("unknown encryption version");let o;try{o=base64$1.decode(t)}catch(e){throw new Error("invalid base64: "+e.message)}const i=o.subarray(0,1)[0];if(2!==i)throw new Error("unknown encryption version "+i);const s=o.subarray(1,33),a=o.subarray(33,-32),l=o.subarray(-32),c=n.getMessageKeys(e,s);if(!equalBytes(hmac(sha256$1,c.auth,a),l))throw new Error("invalid MAC");const d=chacha20(c.encryption,c.nonce,a);return n.unpad(d)}var nip47_exports={};function parseConnectionString(e){const{pathname:t,searchParams:n}=new URL(e),r=t,o=n.get("relay"),i=n.get("secret");if(!r||!o||!i)throw new Error("invalid connection string");return{pubkey:r,relay:o,secret:i}}async function makeNwcRequestEvent({pubkey:e,secret:t,invoice:n}){const r={method:"pay_invoice",params:{invoice:n}},o=await encrypt(t,e,JSON.stringify(r));return finishEvent({kind:23194,created_at:Math.round(Date.now()/1e3),content:o,tags:[["p",e]]},t)}__export(nip47_exports,{makeNwcRequestEvent:()=>makeNwcRequestEvent,parseConnectionString:()=>parseConnectionString});var nip57_exports={},_fetch3;__export(nip57_exports,{getZapEndpoint:()=>getZapEndpoint,makeZapReceipt:()=>makeZapReceipt,makeZapRequest:()=>makeZapRequest,useFetchImplementation:()=>useFetchImplementation3,validateZapRequest:()=>validateZapRequest});try{_fetch3=fetch}catch{}function useFetchImplementation3(e){_fetch3=e}async function getZapEndpoint(e){try{let t="",{lud06:n,lud16:r}=JSON.parse(e.content);if(n){let{words:e}=bech32.decode(n,1e3),r=bech32.fromWords(e);t=utf8Decoder.decode(r)}else{if(!r)return null;{let[e,n]=r.split("@");t=`https://${n}/.well-known/lnurlp/${e}`}}let o=await _fetch3(t),i=await o.json();if(i.allowsNostr&&i.nostrPubkey)return i.callback}catch(e){}return null}function makeZapRequest({profile:e,event:t,amount:n,relays:r,comment:o=""}){if(!n)throw new Error("amount not given");if(!e)throw new Error("profile not given");let i={kind:9734,created_at:Math.round(Date.now()/1e3),content:o,tags:[["p",e],["amount",n.toString()],["relays",...r]]};return t&&i.tags.push(["e",t]),i}function validateZapRequest(e){let t;try{t=JSON.parse(e)}catch(e){return"Invalid zap request JSON."}if(!validateEvent(t))return"Zap request is not a valid Nostr event.";if(!verifySignature(t))return"Invalid signature on zap request.";let n=t.tags.find((([e,t])=>"p"===e&&t));if(!n)return"Zap request doesn't have a 'p' tag.";if(!n[1].match(/^[a-f0-9]{64}$/))return"Zap request 'p' tag is not valid hex.";let r=t.tags.find((([e,t])=>"e"===e&&t));return r&&!r[1].match(/^[a-f0-9]{64}$/)?"Zap request 'e' tag is not valid hex.":t.tags.find((([e,t])=>"relays"===e&&t))?null:"Zap request doesn't have a 'relays' tag."}function makeZapReceipt({zapRequest:e,preimage:t,bolt11:n,paidAt:r}){let o=JSON.parse(e).tags.filter((([e])=>"e"===e||"p"===e||"a"===e)),i={kind:9735,created_at:Math.round(r.getTime()/1e3),content:"",tags:[...o,["bolt11",n],["description",e]]};return t&&i.tags.push(["preimage",t]),i}var nip98_exports={};__export(nip98_exports,{getToken:()=>getToken,unpackEventFromToken:()=>unpackEventFromToken,validateEvent:()=>validateEvent2,validateToken:()=>validateToken});var _authorizationScheme="Nostr ";async function getToken(e,t,n,r=!1){if(!e||!t)throw new Error("Missing loginUrl or httpMethod");const o=getBlankEvent(27235);o.tags=[["u",e],["method",t]],o.created_at=Math.round((new Date).getTime()/1e3);const i=await n(o);return(r?_authorizationScheme:"")+base64$1.encode(utf8Encoder.encode(JSON.stringify(i)))}async function validateToken(e,t,n){const r=await unpackEventFromToken(e).catch((e=>{throw e}));return await validateEvent2(r,t,n).catch((e=>{throw e}))}async function unpackEventFromToken(e){if(!e)throw new Error("Missing token");e=e.replace(_authorizationScheme,"");const t=utf8Decoder.decode(base64$1.decode(e));if(!t||0===t.length||!t.startsWith("{"))throw new Error("Invalid token");return JSON.parse(t)}async function validateEvent2(e,t,n){if(!e)throw new Error("Invalid nostr event");if(!verifySignature(e))throw new Error("Invalid nostr event, signature invalid");if(27235!==e.kind)throw new Error("Invalid nostr event, kind invalid");if(!e.created_at)throw new Error("Invalid nostr event, created_at invalid");if(Math.round((new Date).getTime()/1e3)-e.created_at>60)throw new Error("Invalid nostr event, expired");const r=e.tags.find((e=>"u"===e[0]));if(1!==r?.length&&r?.[1]!==t)throw new Error("Invalid nostr event, url tag invalid");const o=e.tags.find((e=>"method"===e[0]));if(1!==o?.length&&o?.[1].toLowerCase()!==n.toLowerCase())throw new Error("Invalid nostr event, method tag invalid");return!0}const LOCAL_STORE_KEY="__nostrlogin_nip46",LOGGED_IN_ACCOUNTS="__nostrlogin_accounts",RECENT_ACCOUNTS="__nostrlogin_recent",OUTBOX_RELAYS=["wss://purplepag.es","wss://relay.nos.social","wss://user.kindpag.es","wss://relay.damus.io","wss://nos.lol"],DEFAULT_SIGNUP_RELAYS=["wss://relay.damus.io/","wss://nos.lol/","wss://relay.primal.net/"],localStorageSetItem=(e,t)=>{localStorage.setItem(e,t)},localStorageGetItem=e=>{const t=window.localStorage.getItem(e);if(t)try{return JSON.parse(t)}catch{}return null},localStorageRemoveItem=e=>{localStorage.removeItem(e)},fetchProfile=async(e,t)=>{if(t&&"function"==typeof t.fetchEvents)try{const n=t.getUser({pubkey:e.pubkey});return n.ndk=t,await n.fetchProfile()}catch(e){}const n=Array.isArray(t)&&t.length?t:DEFAULT_SIGNUP_RELAYS,r=(new SimplePool).sub(n,[{kinds:[0],authors:[e.pubkey],limit:1}]);return await new Promise((e=>{const t=setTimeout((()=>{try{r.unsub()}catch{}e(null)}),3e3);r.on("event",(n=>{clearTimeout(t);try{r.unsub()}catch{}if(!n||!n.content)return e(null);try{const t=JSON.parse(n.content);e(t)}catch(t){e(null)}})),r.on("eose",(()=>{clearTimeout(t);try{r.unsub()}catch{}e(null)}))}))},prepareSignupRelays=e=>{const t=(e||"").split(",").map((e=>e.trim())).filter((e=>e.startsWith("ws")));return t.length||t.push(...DEFAULT_SIGNUP_RELAYS),t},createProfile=async(e,t,n,r)=>{const o={name:e.name},i={kind:0,created_at:Math.floor(Date.now()/1e3),pubkey:e.pubkey,content:JSON.stringify(o),tags:[]};window.location.hostname&&i.tags.push(["client",window.location.hostname]);const s={kind:10002,created_at:Math.floor(Date.now()/1e3),pubkey:e.pubkey,content:"",tags:[]},a=prepareSignupRelays(n);for(const e of a)s.tags.push(["r",e]);await t.sign(i),console.log("signed profile",i),await t.sign(s),console.log("signed relays",s);const l=r&&r.length?r:OUTBOX_RELAYS,c=new SimplePool;await Promise.any(c.publish(l,i)),console.log("published profile",i),await Promise.any(c.publish(l,s)),console.log("published relays",s)},bunkerUrlToInfo=(e,t="")=>{const n=new URL(e);return{pubkey:"",signerPubkey:n.hostname||n.pathname.split("//")[1],sk:t||generatePrivateKey(),relays:n.searchParams.getAll("relay"),token:n.searchParams.get("secret")||"",authMethod:"connect"}},isBunkerUrl=e=>e.startsWith("bunker://"),getBunkerUrl=async(e,t)=>{if(!e)return"";if(isBunkerUrl(e))return e;if(e.includes("@")){const[n,r]=e.toLocaleLowerCase().split("@"),o=t.devOverrideBunkerOrigin||`https://${r}`,i=`${o}/.well-known/nostr.json?name=_`,s=`${o}/.well-known/nostr.json?name=${n}`,a=await fetch(i),l=await a.json(),c=l.names._,d=l.nip46[c],h=await fetch(s),u=(await h.json()).names[n];if(!d||0===d.length)throw new Error("Bunker relay not provided");return`bunker://${u}?${d.map((e=>`relay=${encodeURIComponent(e)}`)).join("&")}`}throw new Error("Invalid user name or bunker url")},checkNip05=async e=>{let t=!1,n="",r="";return await(async()=>{if(!e||!e.includes("@"))return;const[o,i]=e.toLocaleLowerCase().split("@");if(!o)return;if(!new RegExp(/^[\w-.]+@([\w-]+\.)+[\w-]{2,8}$/g).test(e))return void(n="Invalid name");if(!i)return void(n="Select service");const s=`https://${i}/.well-known/nostr.json?name=${o.toLowerCase()}`;try{const e=await fetch(s),t=await e.json();if(t.names[o])return void(r=t.names[o])}catch{}t=!0})(),{available:t,taken:""!=r,error:n,pubkey:r}},upgradeInfo=e=>{"typeAuthMethod"in e&&delete e.typeAuthMethod,e.authMethod||("extension"in e&&e.extension?e.authMethod="extension":"readOnly"in e&&e.readOnly?e.authMethod="readOnly":e.authMethod="connect"),e.nip05&&isBunkerUrl(e.nip05)&&(e.bunkerUrl=e.nip05,e.nip05=""),"connect"!==e.authMethod||e.signerPubkey||(e.signerPubkey=e.pubkey),"amber"===e.authMethod&&(e.signerPubkey||(e.signerPubkey=""),e.relays||(e.relays=[]))},localStorageAddAccount=e=>{localStorageSetItem(LOCAL_STORE_KEY,JSON.stringify(e));const t=localStorageGetItem(LOGGED_IN_ACCOUNTS)||[],n=localStorageGetItem(RECENT_ACCOUNTS)||[];t.forEach((e=>upgradeInfo(e))),n.forEach((e=>upgradeInfo(e)));const r=t,o=t.findIndex((t=>t.pubkey===e.pubkey&&t.authMethod===e.authMethod));-1!==o?r[o]=e:r.push(e);const i=n.filter((t=>t.pubkey!==e.pubkey||t.authMethod!==e.authMethod));localStorageSetItem(RECENT_ACCOUNTS,JSON.stringify(i)),localStorageSetItem(LOGGED_IN_ACCOUNTS,JSON.stringify(r))},localStorageRemoveCurrentAccount=()=>{const e=localStorageGetItem(LOCAL_STORE_KEY);if(!e)return;upgradeInfo(e);const t={...e};delete t.sk,delete t.otpData;const n=localStorageGetItem(LOGGED_IN_ACCOUNTS)||[],r=localStorageGetItem(RECENT_ACCOUNTS)||[];n.forEach((e=>upgradeInfo(e))),r.forEach((e=>upgradeInfo(e)));const o=r;if("connect"===t.authMethod&&t.bunkerUrl&&t.bunkerUrl.includes("secret="))console.log("nostr login bunker conn with a secret not saved to recent");else if("local"===t.authMethod)console.log("nostr login temporary local keys not save to recent");else{const e=r.findIndex((e=>e.pubkey===t.pubkey&&e.authMethod===t.authMethod));-1!==e?o[e]=t:o.push(t)}const i=n.filter((t=>t.pubkey!==e.pubkey||t.authMethod!==e.authMethod));localStorageSetItem(RECENT_ACCOUNTS,JSON.stringify(o)),localStorageSetItem(LOGGED_IN_ACCOUNTS,JSON.stringify(i)),localStorageRemoveItem(LOCAL_STORE_KEY)},localStorageRemoveRecent=e=>{const t=localStorageGetItem(RECENT_ACCOUNTS)||[];t.forEach((e=>upgradeInfo(e)));const n=t.filter((t=>t.pubkey!==e.pubkey||t.authMethod!==e.authMethod));localStorageSetItem(RECENT_ACCOUNTS,JSON.stringify(n))},localStorageGetRecents=()=>{const e=localStorageGetItem(RECENT_ACCOUNTS)||[];return e.forEach((e=>upgradeInfo(e))),e},localStorageGetAccounts=()=>{const e=localStorageGetItem(LOGGED_IN_ACCOUNTS)||[];return e.forEach((e=>upgradeInfo(e))),e},localStorageGetCurrent=()=>{const e=localStorageGetItem(LOCAL_STORE_KEY);return e&&upgradeInfo(e),e},getDarkMode=e=>{const t=localStorage.getItem("nl-dark-mode");return t?Boolean(JSON.parse(t)):void 0!==e.darkMode?e.darkMode:!(!window.matchMedia||!window.matchMedia("(prefers-color-scheme: dark)").matches)},getIcon=async()=>document.location.origin+"/favicon.ico";class NostrRpc extends lib.EventEmitter{localSigner;localPubkey;localPrivateKey;remotePubkey="";pool;relays=[];subscription;isSubscribed=!1;useNip44=!1;requests=new Set;constructor(e,t=[]){super(),this.localSigner=e,this.localPubkey=e.pubkey,this.localPrivateKey=e.privateKey,this.pool=new SimplePool,this.relays=t&&t.length?t:[]}setUseNip44(e){this.useNip44=e}isNip04(e){const t=e.length;return!(t<28)&&("?"===e[t-28]&&"i"===e[t-27]&&"v"===e[t-26]&&"="===e[t-25])}async decryptEventContent(e){const t=this.isNip04(e.content)?this.localSigner.decrypt.bind(this.localSigner):this.localSigner.decryptNip44?.bind(this.localSigner)??this.localSigner.decrypt.bind(this.localSigner);try{const n=await t(e.pubkey||e.pubkey,e.content);return JSON.parse(n)}catch(e){throw e}}async parseEvent(e){const t=await this.decryptEventContent(e),{id:n,method:r,params:o,result:i,error:s}=t;return r?{id:n,pubkey:e.pubkey,method:r,params:o,event:e}:{id:n,result:i,error:s,event:e}}subscribe(e,t){if(this.isSubscribed)return;this.relays=e&&e.length?e:this.relays;const n=[{...t,since:Math.floor(Date.now()/1e3)-60}];this.subscription=this.pool.sub(this.relays,n),this.subscription.on("event",(async e=>{try{const t=await this.parseEvent(e);t.method?this.emit("request",t):this.emit(`response-${t.id}`,t)}catch(e){}})),this.subscription.on("eose",(()=>{})),this.isSubscribed=!0}stop(){if(this.subscription&&this.subscription.unsub)try{this.subscription.unsub()}catch(e){}this.isSubscribed=!1}getId(){return Math.random().toString(36).substring(7)}setResponseHandler(e,t){let n=!1;const r=o=>{"auth_url"===o.result?(this.once(`response-${e}`,r),n||(n=!0,this.emit("authUrl",o.error))):t&&this.requests.has(e)&&(this.requests.delete(e),t(o))};this.once(`response-${e}`,r)}async createRequestEvent(e,t,n,r=[],o=24133){this.requests.add(e);const i={id:e,method:n,params:r},s={kind:o,content:this.useNip44&&"create_account"!==n&&this.localSigner.encryptNip44?await this.localSigner.encryptNip44(t,JSON.stringify(i)):await this.localSigner.encrypt(t,JSON.stringify(i)),tags:[["p",t]],pubkey:this.localPubkey,created_at:Math.floor(Date.now()/1e3)};return await this.localSigner.sign(s),s}async publishRequest(e){try{await Promise.any(this.pool.publish(this.relays,e))}catch(e){}}async sendRequest(e,t,n=[],r=24133,o){const i=this.getId();this.setResponseHandler(i,o);const s=await this.createRequestEvent(i,e,t,n,r);await this.publishRequest(s)}async listen(e,t){const n=this.localPubkey;return this.subscribe(t||this.relays,{kinds:[24133],"#p":[n]}),new Promise(((t,n)=>{this.once("request",(async r=>{try{const o=await this.parseEvent(r);if("auth_url"===o.result)return;const i=o;"ack"===i.result||i.result===e?(t(r.pubkey),this.stop()):(n(i.error),this.stop())}catch(e){}}))}))}}class IframeNostrRpc extends NostrRpc{peerOrigin;iframePort;iframeRequests=new Map;constructor(e,t,n=[]){super(e,n),this.peerOrigin=t}setWorkerIframePort(e){if(!this.peerOrigin)throw new Error("Unexpected iframe port");this.iframePort=e,setInterval((()=>{try{this.iframePort.postMessage("ping")}catch(e){}}),5e3),this.iframePort.onmessage=async e=>{if("string"==typeof e.data&&e.data.startsWith("errorNoKey")){const t=e.data.split(":")[1],n=this.iframeRequests.get(t)||{id:"",pubkey:""},{id:r="",pubkey:o=""}=n;r&&o&&this.requests.has(r)&&this.emit(`iframeRestart-${o}`)}else try{const t=e.data;if(!validateEvent(t))throw new Error("Invalid event from iframe");if(!verifySignature(t))throw new Error("Invalid event signature from iframe");const n=await this.parseEvent(t);n.method||this.emit(`response-${n.id}`,n)}catch(e){}}}async sendRequest(e,t,n=[],r=24133,o){const i=this.getId();this.setResponseHandler(i,o);const s=await this.createRequestEvent(i,e,t,n,r);if(this.iframeRequests.set(s.id,{id:i,pubkey:e}),this.iframePort)try{this.iframePort.postMessage(s)}catch(e){await this.publishRequest(s)}else await this.publishRequest(s)}}class ReadyListener{origin;messages;promise;constructor(e,t){this.origin=t,this.messages=e,this.promise=new Promise((e=>{const n=async r=>{const o=new URL(t).hostname,i=new URL(r.origin).hostname;(i===o||i.endsWith("."+o))&&Array.isArray(r.data)&&r.data.length&&this.messages.includes(r.data[0])&&(window.removeEventListener("message",n),e(r.data))};window.addEventListener("message",n)}))}async wait(){return await this.promise}}class Nip46Signer extends lib.EventEmitter{_userPubkey="";remotePubkey="";rpc;localSigner;constructor(e,t,n,r=[]){super(),this.remotePubkey=t,this.localSigner=e,this.rpc=n?new IframeNostrRpc(e,n,r):new NostrRpc(e,r),this.rpc.setUseNip44(!0),this.rpc.on("authUrl",(e=>{this.emit("authUrl",e)}))}get userPubkey(){return this._userPubkey}async setSignerPubkey(e,t=!1){this.remotePubkey=e,this.rpc.on(`iframeRestart-${e}`,(()=>{this.emit("iframeRestart")})),await this.initUserPubkey(t?e:"")}async initUserPubkey(e){if(this._userPubkey)throw new Error("Already called initUserPubkey");this._userPubkey=e||await new Promise(((e,t)=>{if(!this.remotePubkey)throw new Error("Signer pubkey not set");this.rpc.sendRequest(this.remotePubkey,"get_public_key",[],24133,(n=>{if(n.error)return t(n.error);e(n.result)}))}))}async listen(e){const t=await this.rpc.listen(e,this.rpc.relays);await this.setSignerPubkey(t)}async connect(e,t){if(!this.remotePubkey)throw new Error("No signer pubkey");return new Promise(((n,r)=>{const o=[this.localSigner.pubkey,e||"",t||""];this.rpc.sendRequest(this.remotePubkey,"connect",o,24133,(e=>{"ack"===e.result?n():r(e.error)}))}))}async createAccount2(e){return new Promise(((t,n)=>{this.rpc.sendRequest(this.remotePubkey,"create_account",[e],24133,(e=>{e.error?n(e.error):t(e.result)}))}))}async encrypt(e,t){return this.localSigner.encrypt(e,t)}async decrypt(e,t){return this.localSigner.decrypt(e,t)}async sign(e){return await this.localSigner.sign(e),e.sig}}class BannerManager extends lib.EventEmitter{banner=null;iframeReady;params;constructor(e){super(),this.params=e}onAuthUrl(e,t){this.banner&&(this.banner.notify=e?{mode:t?"iframeAuthUrl":"authUrl",url:e}:{mode:""})}onIframeRestart(e){this.banner&&(this.iframeReady=new ReadyListener(["rebinderDone","rebinderError"],new URL(e).origin),this.banner.notify={mode:"rebind",url:e})}onUserInfo(e){this.banner&&(this.banner.userInfo=e)}onCallTimeout(){this.banner&&(this.banner.notify={mode:"timeout"})}onCallStart(){this.banner&&(this.banner.isLoading=!0)}async onCallEnd(){this.banner&&(this.iframeReady&&(await this.iframeReady.wait(),this.iframeReady=void 0),this.banner.isLoading=!1,this.banner.notify={mode:""})}onUpdateAccounts(e){this.banner&&(this.banner.accounts=e)}onDarkMode(e){this.banner&&(this.banner.darkMode=e)}launchAuthBanner(e){this.banner=document.createElement("nl-banner"),this.banner.setAttribute("dark-mode",String(getDarkMode(e))),e.theme&&this.banner.setAttribute("theme",e.theme),e.noBanner&&this.banner.setAttribute("hidden-mode","true"),this.banner.addEventListener("handleLoginBanner",(e=>{this.emit("launch",e.detail)})),this.banner.addEventListener("handleConfirmLogout",(()=>{this.emit("onConfirmLogout")})),this.banner.addEventListener("handleLogoutBanner",(async()=>{this.emit("logout")})),this.banner.addEventListener("handleImportModal",(e=>{this.emit("import")})),this.banner.addEventListener("handleNotifyConfirmBanner",(e=>{this.emit("onAuthUrlClick",e.detail)})),this.banner.addEventListener("handleNotifyConfirmBannerIframe",(e=>{this.emit("onIframeAuthUrlClick",e.detail)})),this.banner.addEventListener("handleSwitchAccount",(e=>{this.emit("onSwitchAccount",e.detail)})),this.banner.addEventListener("handleOpenWelcomeModal",(()=>{this.emit("launch"),this.banner&&(this.banner.isOpen=!1)})),document.body.appendChild(this.banner)}}function extract(e,t,n){return hash$1(e),hmac$1(e,toBytes$1(n),toBytes$1(t))}const HKDF_COUNTER=new Uint8Array([0]),EMPTY_BUFFER=new Uint8Array;function expand(e,t,n,r=32){if(hash$1(e),number$1(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const o=Math.ceil(r/e.outputLen);void 0===n&&(n=EMPTY_BUFFER);const i=new Uint8Array(o*e.outputLen),s=hmac$1.create(e,t),a=s._cloneInto(),l=new Uint8Array(s.outputLen);for(let t=0;t<o;t++)HKDF_COUNTER[0]=t+1,a.update(0===t?EMPTY_BUFFER:l).update(n).update(HKDF_COUNTER).digestInto(l),i.set(l,e.outputLen*t),s._cloneInto(a);return s.destroy(),a.destroy(),l.fill(0),HKDF_COUNTER.fill(0),i.slice(0,r)}const decoder=new TextDecoder,u={minPlaintextSize:1,maxPlaintextSize:65535,utf8Encode:utf8ToBytes$1,utf8Decode:e=>decoder.decode(e),getConversationKey(e,t){const n=secp256k1.getSharedSecret(e,"02"+t).subarray(1,33);return extract(sha256,n,"nip44-v2")},getMessageKeys(e,t){const n=expand(sha256,e,t,76);return{chacha_key:n.subarray(0,32),chacha_nonce:n.subarray(32,44),hmac_key:n.subarray(44,76)}},calcPaddedLen(e){if(!Number.isSafeInteger(e)||e<1)throw new Error("expected positive integer");if(e<=32)return 32;const t=1<<Math.floor(Math.log2(e-1))+1,n=t<=256?32:t/8;return n*(Math.floor((e-1)/n)+1)},writeU16BE(e){if(!Number.isSafeInteger(e)||e<u.minPlaintextSize||e>u.maxPlaintextSize)throw new Error("invalid plaintext size: must be between 1 and 65535 bytes");const t=new Uint8Array(2);return new DataView(t.buffer).setUint16(0,e,!1),t},pad(e){const t=u.utf8Encode(e),n=t.length;return concatBytes(u.writeU16BE(n),t,new Uint8Array(u.calcPaddedLen(n)-n))},unpad(e){const t=new DataView(e.buffer).getUint16(0),n=e.subarray(2,2+t);if(t<u.minPlaintextSize||t>u.maxPlaintextSize||n.length!==t||e.length!==2+u.calcPaddedLen(t))throw new Error("invalid padding");return u.utf8Decode(n)},hmacAad(e,t,n){if(32!==n.length)throw new Error("AAD associated data must be 32 bytes");const r=concatBytes(n,t);return hmac$1(sha256,e,r)},decodePayload(e){if("string"!=typeof e)throw new Error("payload must be a valid string");const t=e.length;if(t<132||t>87472)throw new Error("invalid payload length: "+t);if("#"===e[0])throw new Error("unknown encryption version");let n;try{n=base64.decode(e)}catch(e){throw new Error("invalid base64: "+e.message)}const r=n.length;if(r<99||r>65603)throw new Error("invalid data length: "+r);const o=n[0];if(2!==o)throw new Error("unknown encryption version "+o);return{nonce:n.subarray(1,33),ciphertext:n.subarray(33,-32),mac:n.subarray(-32)}}};function encryptNip44(e,t,n=randomBytes(32)){const{chacha_key:r,chacha_nonce:o,hmac_key:i}=u.getMessageKeys(t,n),s=u.pad(e),a=chacha20(r,o,s),l=u.hmacAad(i,a,n);return base64.encode(concatBytes(new Uint8Array([2]),n,a,l))}function decryptNip44(e,t){const{nonce:n,ciphertext:r,mac:o}=u.decodePayload(e),{chacha_key:i,chacha_nonce:s,hmac_key:a}=u.getMessageKeys(t,n);if(!equalBytes(u.hmacAad(a,r,n),o))throw new Error("invalid MAC");const l=chacha20(i,s,r);return u.unpad(l)}class Nip44{cache=new Map;createKey(e,t){return u.getConversationKey(e,t)}getKey(e,t,n){const r=getPublicKey(e)+t;let o=this.cache.get(r);if(o)return o;const i=this.createKey(e,t);return this.cache.set(r,i),i}encrypt(e,t,n){return encryptNip44(n,this.getKey(e,t))}decrypt(e,t,n){return decryptNip44(n,this.getKey(e,t))}}class Nip46Client extends lib.EventEmitter{pool;localPrivateKey;remotePubkey;relays;pendingRequests=new Map;defaultTimeoutMs;useNip44;subscription=null;isSubscribed=!1;nip44Codec=new Nip44;iframeConfig;retryConfig;iframeKeepaliveInterval;constructor(e){super(),this.pool=new SimplePool,this.localPrivateKey=e.localPrivateKey,this.remotePubkey=e.remotePubkey,this.relays=e.relays,this.defaultTimeoutMs=e.timeoutMs||3e4,this.useNip44=e.useNip44||!1,this.iframeConfig=e.iframeConfig,this.retryConfig=e.retryConfig||{maxRetries:3,retryDelayMs:1e3},this.iframeConfig?.port&&this.setupIframePort(this.iframeConfig.port)}get localPubkey(){return getPublicKey(this.localPrivateKey)}async sendRequest(e,t=[],n){let r=null;for(let o=0;o<=this.retryConfig.maxRetries;o++)try{if(o>0){const t=this.retryConfig.retryDelayMs*o;console.log(`[Nip46Client] Retry attempt ${o}/${this.retryConfig.maxRetries} for ${e} after ${t}ms`),await new Promise((e=>setTimeout(e,t)))}return await this.sendRequestInternal(e,t,n)}catch(e){r=e;if(!(e.message.includes("timed out")||e.message.includes("network")||e.message.includes("publish"))||o===this.retryConfig.maxRetries)throw console.error(`[Nip46Client] Request failed after ${o+1} attempts:`,e.message),e}throw r||new Error("Request failed after retries")}async sendRequestInternal(e,t=[],n){const r=n||this.defaultTimeoutMs,o=this.generateId(),i={id:o,method:e,params:t};return console.log("[Nip46Client] Sending request:",{id:o,method:e,params:t}),this.isSubscribed||this.subscribeToResponses(),await this.publishRequest(i),new Promise(((t,n)=>{const i=setTimeout((()=>{this.pendingRequests.delete(o);const t=new Error(`Request ${o} (${e}) timed out after ${r}ms`);console.error("[Nip46Client]",t.message),n(t)}),r);this.pendingRequests.set(o,{resolve:t,reject:n,timer:i,method:e})}))}async publishRequest(e){const t=JSON.stringify(e),n=this.useNip44?await this.nip44Codec.encrypt(this.localPrivateKey,this.remotePubkey,t):await nip04_exports.encrypt(this.localPrivateKey,this.remotePubkey,t),r={kind:24133,pubkey:this.localPubkey,created_at:Math.floor(Date.now()/1e3),tags:[["p",this.remotePubkey]],content:n,id:"",sig:""};if(r.id=getEventHash(r),r.sig=getSignature(r,this.localPrivateKey),this.iframeConfig?.port)try{return this.iframeConfig.port.postMessage(r),void console.log("[Nip46Client] Request sent via iframe:",e.id)}catch(e){console.warn("[Nip46Client] Iframe send failed, falling back to relays:",e)}try{await Promise.any(this.pool.publish(this.relays,r)),console.log("[Nip46Client] Request published to relays:",e.id)}catch(e){throw console.error("[Nip46Client] Failed to publish to relays:",e),new Error("Failed to publish request to relays")}}subscribeToResponses(){if(this.isSubscribed)return;const e={kinds:[24133],"#p":[this.localPubkey],since:Math.floor(Date.now()/1e3)-60};console.log("[Nip46Client] Subscribing to responses"),this.subscription=this.pool.sub(this.relays,[e]),this.subscription.on("event",(async e=>{await this.handleResponseEvent(e)})),this.subscription.on("eose",(()=>{console.log("[Nip46Client] EOSE received")})),this.isSubscribed=!0}async handleResponseEvent(e){try{const t=this.isNip04(e.content)?await nip04_exports.decrypt(this.localPrivateKey,e.pubkey,e.content):await this.nip44Codec.decrypt(this.localPrivateKey,e.pubkey,e.content),n=JSON.parse(t);if(console.log("[Nip46Client] Response received:",{id:n.id,hasResult:!!n.result,hasError:!!n.error}),this.emit("response",{response:n,pubkey:e.pubkey}),"auth_url"===n.result)return console.log("[Nip46Client] Auth URL received:",n.error),void this.emit("authUrl",n.error);const r=this.pendingRequests.get(n.id);r?(clearTimeout(r.timer),this.pendingRequests.delete(n.id),n.error?(console.error("[Nip46Client] Request failed:",{id:n.id,method:r.method,error:n.error}),r.reject(new Error(n.error))):void 0!==n.result?(console.log("[Nip46Client] Request succeeded:",{id:n.id,method:r.method}),r.resolve(n.result)):r.reject(new Error("Invalid response: no result or error"))):console.warn("[Nip46Client] Received response for unknown request:",n.id)}catch(e){console.error("[Nip46Client] Failed to parse response event:",e)}}isNip04(e){const t=e.length;return!(t<28)&&("?"===e[t-28]&&"i"===e[t-27]&&"v"===e[t-26]&&"="===e[t-25])}generateId(){return Math.random().toString(36).substring(2,15)}setUseNip44(e){this.useNip44=e}cleanup(){console.log("[Nip46Client] Cleaning up");for(const[e,t]of this.pendingRequests)clearTimeout(t.timer),t.reject(new Error("Client cleanup"));if(this.pendingRequests.clear(),this.subscription){try{"function"==typeof this.subscription.unsub&&this.subscription.unsub(),"function"==typeof this.subscription.close&&this.subscription.close()}catch(e){}this.subscription=null,this.isSubscribed=!1}this.iframeKeepaliveInterval&&(clearInterval(this.iframeKeepaliveInterval),this.iframeKeepaliveInterval=void 0),this.pool.close(this.relays),this.removeAllListeners()}isConnected(){return this.isSubscribed}setIframePort(e){if(!this.iframeConfig)throw new Error("Iframe config not set");this.iframeConfig.port=e,this.setupIframePort(e)}setupIframePort(e){e.onmessage=async e=>{if("ping"!==e.data)try{const t=e.data;if(!t||"object"!=typeof t)return void console.warn("[Nip46Client] Invalid message from iframe");await this.handleResponseEvent(t)}catch(e){console.error("[Nip46Client] Iframe message error:",e)}},this.iframeKeepaliveInterval=setInterval((()=>{try{e.postMessage("ping")}catch(e){console.warn("[Nip46Client] Failed to send keepalive ping:",e)}}),5e3),console.log("[Nip46Client] Iframe port setup complete")}}class Nip46Adapter extends lib.EventEmitter{client;localSigner;userPubkey="";remotePubkey;constructor(e,t){super(),this.client=e,this.localSigner=t,this.remotePubkey=e.remotePubkey||"",this.client.on("authUrl",(e=>{this.emit("authUrl",e)})),this.client.on("response",(({response:e,pubkey:t})=>{this.emit("response",e,t)}))}async initUserPubkey(e){if(this.userPubkey)throw new Error("Already called initUserPubkey");if(e)return this.userPubkey=e,void console.log("[Nip46Adapter] User pubkey set from hint:",e);console.log("[Nip46Adapter] Fetching user pubkey");try{const e=await this.client.sendRequest("get_public_key",[]);if(!e)throw new Error("No public key returned");this.userPubkey=e,console.log("[Nip46Adapter] User pubkey fetched:",e)}catch(e){throw console.error("[Nip46Adapter] Failed to get user pubkey:",e.message),e}}async listen(e,t=6e4){return console.log("[Nip46Adapter] Starting listen mode, timeout:",t),new Promise(((n,r)=>{const o=setTimeout((()=>{i();const e=new Error(`Listen timeout after ${t}ms`);console.error("[Nip46Adapter]",e.message),r(e)}),t),i=()=>{clearTimeout(o),this.client.off("response",s)},s=({response:t,pubkey:o})=>{t&&"auth_url"!==t.result&&("ack"===t.result||t.result===e?(i(),console.log("[Nip46Adapter] Listen succeeded, signer pubkey:",o),n(o)):t.error&&(i(),console.error("[Nip46Adapter] Listen failed:",t.error),r(new Error(t.error))))};this.client.on("response",s)}))}async connect(e,t,n=3e4){console.log("[Nip46Adapter] Connecting with token, timeout:",n);try{const r=await this.client.sendRequest("connect",[this.localSigner.pubkey,e||"",t||""],n);if("ack"!==r)throw new Error(`Connect failed: ${r||"unknown error"}`);console.log("[Nip46Adapter] Connected successfully")}catch(e){throw console.error("[Nip46Adapter] Connect failed:",e.message),e}}async setListenReply(e,t){try{const n=e&&e.content?JSON.parse(e.content):null;if(!n)throw new Error("Bad reply");if(n.result!==t)throw new Error("Bad reply");this.userPubkey=e.pubkey}catch(e){throw new Error("Failed to set listen reply")}}async createAccount2({bunkerPubkey:e,name:t,domain:n,perms:r=""}){const o=[t,n,"",r];console.log("[Nip46Adapter] Creating account:",{name:t,domain:n});try{const e=await this.client.sendRequest("create_account",o);if(!e)throw new Error("create_account returned empty result");if("error"===e)throw new Error("create_account failed");return console.log("[Nip46Adapter] Account created successfully"),e}catch(e){throw console.error("[Nip46Adapter] Failed to create account:",e.message),e}}async encrypt(e,t){return await this.client.sendRequest("nip04_encrypt",[e,t])}async decrypt(e,t){return await this.client.sendRequest("nip04_decrypt",[e,t])}async sign(e){try{const t=await this.client.sendRequest("sign_event",[JSON.stringify(e)]);try{const e="string"==typeof t?JSON.parse(t):t;if(e&&e.sig)return e.sig}catch(e){}return t}catch(e){throw console.error("[Nip46Adapter] Failed to sign event:",e.message),e}}get rpc(){return{sendRequest:async(e,t,n,r,o)=>{try{o({result:await this.client.sendRequest(t,n)})}catch(e){o({error:e.message})}}}}}class PrivateKeySigner{nip44=new Nip44;_pubkey;privateKey;constructor(e){this.privateKey=e,this._pubkey=getPublicKey(e)}get pubkey(){return this._pubkey}async blockUntilReady(){return Promise.resolve()}async user(){return{pubkey:this.pubkey}}async sign(e){e.created_at||(e.created_at=Math.floor(Date.now()/1e3));const t=getEventHash(e);e.id=t;const n=getSignature(e,this.privateKey);return e.sig=n,n}async encrypt(e,t){const n="string"==typeof e?e:e.pubkey;return nip04_exports.encrypt(this.privateKey,n,t)}async decrypt(e,t){const n="string"==typeof e?e:e.pubkey;return nip04_exports.decrypt(this.privateKey,n,t)}encryptNip44(e,t){const n="string"==typeof e?e:e.pubkey;return Promise.resolve(this.nip44.encrypt(this.privateKey,n,t))}decryptNip44(e,t){const n="string"==typeof e?e:e.pubkey;return Promise.resolve(this.nip44.decrypt(this.privateKey,n,t))}}const DEFAULT_NOSTRCONNECT_RELAYS=["wss://relay.nsec.app/","wss://ephemeral.snowflare.cc/"],NOSTRCONNECT_APPS=[{name:"Nsec.app",domain:"nsec.app",canImport:!0,img:"https://nsec.app/assets/favicon.ico",link:"https://use.nsec.app/<nostrconnect>",relays:DEFAULT_NOSTRCONNECT_RELAYS},{name:"Amber",img:"https://raw.githubusercontent.com/greenart7c3/Amber/refs/heads/master/assets/android-icon.svg",link:"amber",relays:DEFAULT_NOSTRCONNECT_RELAYS},{name:"Other key stores",img:"",link:"<nostrconnect>",relays:DEFAULT_NOSTRCONNECT_RELAYS}];class AuthNostrService extends lib.EventEmitter{signer=null;localSigner=null;params;signerPromise;signerErrCallback;readyPromise;readyCallback;nip44Codec=new Nip44;nostrConnectKey="";nostrConnectSecret="";iframe;starterReady;nip04;nip44;constructor(e){super(),this.params=e,this.nip04={encrypt:this.encrypt04.bind(this),decrypt:this.decrypt04.bind(this)},this.nip44={encrypt:this.encrypt44.bind(this),decrypt:this.decrypt44.bind(this)}}isIframe(){return!!this.iframe}async waitReady(){if(this.signerPromise)try{await this.signerPromise}catch{}if(this.readyPromise)try{await this.readyPromise}catch{}}cancelNostrConnect(){this.releaseSigner(),this.resetAuth()}async nostrConnect(e,{domain:t="",link:n="",iframeUrl:r="",importConnect:o=!1}={}){e=e&&e.length>0?e:DEFAULT_NOSTRCONNECT_RELAYS;const i={authMethod:"connect",pubkey:"",signerPubkey:"",sk:this.nostrConnectKey,domain:t,relays:e,iframeUrl:r};if(console.log("nostrconnect info",i,n),n&&!r)if("amber"===n){const t=await this.createNostrConnect(e);console.log("Amber flow via NIP-46, opening:",t),window.location.href=t}else window.open(n,"_blank","width=400,height=700");if(await this.initSigner(i,{listen:!0}),!i.pubkey||!i.signerPubkey)throw new Error("Bad remote pubkey");return i.bunkerUrl=`bunker://${i.signerPubkey}?${e.map(((e,t)=>`${0!==t?"&":""}relay=${e}`))}`,o||this.onAuth("login",i),i}async createNostrConnect(e){this.nostrConnectKey=generatePrivateKey(),this.nostrConnectSecret=Math.random().toString(36).substring(7);const t=getPublicKey(this.nostrConnectKey),n=encodeURIComponent(document.location.host),r=encodeURIComponent(document.location.origin);return`nostrconnect://${t}?image=${encodeURIComponent(await getIcon())}&url=${r}&name=${n}&perms=${encodeURIComponent(this.params.optionsModal.perms||"")}&secret=${this.nostrConnectSecret}${(e||[]).length>0?(e||[]).map(((e,t)=>`&relay=${e}`)):""}`}async getNostrConnectServices(){const e=await this.createNostrConnect(),t=NOSTRCONNECT_APPS.map((e=>({...e})));for(const n of t){let t=[...DEFAULT_NOSTRCONNECT_RELAYS];if(n.link.startsWith("https://")){const e=n.domain||new URL(n.link).hostname;try{const r=await(await fetch(`https://${e}/.well-known/nostr.json`)).json(),o=r.names._,i=r.nip46?.[o];Array.isArray(i)&&i.length>0&&(t=i),n.iframeUrl=r.nip46?.iframe_url||""}catch(e){console.log("Bad app info",e,n)}}const r=e+t.map((e=>e.replace(/['"]/g,""))).map((e=>`&relay=${encodeURIComponent(e)}`)).join("");n.iframeUrl?n.link=r:n.link=n.link.replace("<nostrconnect>",r)}return[e,t]}async localSignup(e,t){const n=!t,r={pubkey:getPublicKey(t=t||generatePrivateKey()),sk:t,name:e,authMethod:"local"};console.log(`localSignup name: ${e}`),await this.setLocal(r,n)}async setLocal(e,t){this.releaseSigner(),this.localSigner=new PrivateKeySigner(e.sk),t&&await createProfile(e,this.localSigner,this.params.optionsModal.signupRelays,this.params.optionsModal.outboxRelays),this.onAuth(t?"signup":"login",e)}prepareImportUrl(e){if("otp"===this.params.userInfo?.authMethod)return e+"&import=true";if(!this.localSigner||"local"!==this.params.userInfo?.authMethod)throw new Error("Most be local keys");return e+"#import="+nip19_exports.nsecEncode(this.localSigner.privateKey)}async importAndConnect(e){const{relays:t,domain:n,link:r,iframeUrl:o}=e;if(!n)throw new Error("Domain required");const i=await this.nostrConnect(t,{domain:n,link:r,importConnect:!0,iframeUrl:o});await this.logout(!0),this.localSigner=null,this.onAuth("login",i)}setReadOnly(e){const t={pubkey:e,authMethod:"readOnly"};this.onAuth("login",t)}setExtension(e){const t={pubkey:e,authMethod:"extension"};this.onAuth("login",t)}setOTP(e,t){const n={pubkey:e,authMethod:"otp",otpData:t};this.onAuth("login",n)}async setConnect(e){this.releaseSigner(),await this.startAuth(),await this.initSigner(e),this.onAuth("login",e),await this.endAuth()}async setAmber(e){this.releaseSigner(),await this.startAuth(),await this.initSigner(e),this.onAuth("login",e),await this.endAuth()}async createAccount(e){const[t,n]=e.split("@"),r=await getBunkerUrl(`_@${n}`,this.params.optionsModal);console.log("create account bunker's url",r);const o=bunkerUrlToInfo(r);if(!o.signerPubkey)throw new Error("Bad bunker url");const i=Boolean(this.params.userInfo);await this.initSigner(o,{eventToAddAccount:i});return{bunkerUrl:`bunker://${await this.signer.createAccount2({bunkerPubkey:o.signerPubkey,name:t,domain:n,perms:this.params.optionsModal.perms})}?`+(o.relays??[]).map((e=>`relay=${encodeURIComponent(e)}`)).join("&"),sk:o.sk}}releaseSigner(){this.signer=null,this.signerErrCallback?.("cancelled"),this.localSigner=null}async logout(e=!1){e||this.releaseSigner(),localStorageRemoveCurrentAccount(),this.onAuth("logout"),this.emit("updateAccounts")}setUserInfo(e){this.params.userInfo=e,this.emit("onUserInfo",e),e&&(localStorageAddAccount(e),this.emit("updateAccounts"))}exportKeys(){return this.params.userInfo?"local"!==this.params.userInfo.authMethod?"":nip19_exports.nsecEncode(this.params.userInfo.sk):""}onAuth(e,t=null){if("logout"!==e&&!t)throw new Error("No user info in onAuth");if(t&&this.params.userInfo&&(t.pubkey!==this.params.userInfo.pubkey||t.authMethod!==this.params.userInfo.authMethod)){const e=new CustomEvent("nlAuth",{detail:{type:"logout"}});console.log("nostr-login auth",e.detail),document.dispatchEvent(e)}this.setUserInfo(t),t&&fetchProfile(t,t.relays).then((e=>{if(this.params.userInfo!==t)return;const n={...this.params.userInfo,picture:e?.image||e?.picture,name:e?.name||e?.displayName||e?.nip05||nip19_exports.npubEncode(t.pubkey)};this.setUserInfo(n)}));try{const n=t?nip19_exports.npubEncode(t.pubkey):"",r={type:e};"logout"===e?(this.iframe&&this.iframe.remove(),this.iframe=void 0):(r.pubkey=t.pubkey,r.name=t.name,t.sk&&(r.localNsec=nip19_exports.nsecEncode(t.sk)),t.relays&&(r.relays=t.relays),t.otpData&&(r.otpData=t.otpData),r.method=t.authMethod||"connect");const o=new CustomEvent("nlAuth",{detail:r});console.log("nostr-login auth",r),document.dispatchEvent(o),this.params.optionsModal.onAuth&&this.params.optionsModal.onAuth(n,r)}catch(e){console.log("onAuth error",e)}}async createIframe(e){if(!e)return;const t=new URL(e);let n;const r="__nostr-login-worker-iframe-"+t.hostname.replaceAll(".","-");n=document.querySelector(`#${r}`),console.log("iframe",r,n),n||(n=document.createElement("iframe"),n.setAttribute("width","0"),n.setAttribute("height","0"),n.setAttribute("border","0"),n.style.display="none",n.id=r,document.body.append(n)),n.setAttribute("src",e);const o=new ReadyListener(["workerReady","workerError"],t.origin);await new Promise((e=>{n.addEventListener("load",e)}));const i=await o.wait();return console.log("nostr-login iframe ready",e,i),{iframe:n,port:i[1]}}async sendNeedAuth(){const[e]=await this.getNostrConnectServices(),t=new CustomEvent("nlNeedAuth",{detail:{nostrconnect:e}});console.log("nostr-login need auth",e),document.dispatchEvent(t)}isAuthing(){return!!this.readyCallback}startAuth(){if(console.log("startAuth"),this.readyCallback)throw new Error("Already started");this.readyPromise=new Promise((e=>this.readyCallback=e))}async endAuth(){if(console.log("endAuth",this.params.userInfo),this.params.userInfo&&this.params.userInfo.iframeUrl){const{iframe:e,port:t}=await this.createIframe(this.params.userInfo.iframeUrl)||{};if(this.iframe=e,!this.iframe||!t)return;this.signer.rpc.setWorkerIframePort(t)}this.readyCallback(),this.readyCallback=void 0}resetAuth(){this.readyCallback&&this.readyCallback(),this.readyCallback=void 0}async listen(e){if(!e.iframeUrl)return this.signer.listen(this.nostrConnectSecret);const t=await this.starterReady.wait();if("starterError"===t[0])throw new Error(t[1]);return this.signer.setListenReply(t[1],this.nostrConnectSecret)}async connect(e,t){return this.signer.connect(e.token,t)}async initSigner(e,{listen:t=!1,connect:n=!1,eventToAddAccount:r=!1}={}){if(this.signerPromise)try{await this.signerPromise}catch{}console.log("initSigner info",e);const o=e.iframeUrl?new URL(e.iframeUrl).origin:void 0;return o&&(this.starterReady=new ReadyListener(["starterDone","starterError"],o)),this.emit("onIframeUrl",e.iframeUrl),this.signerPromise=new Promise((async(i,s)=>{this.signerErrCallback=s;try{const s=new PrivateKeySigner(e.sk);if(e.iframeUrl)this.signer=new Nip46Signer(s,e.signerPubkey,o,e.relays||[]),this.signer.on("iframeRestart",(async()=>{const t=e.iframeUrl+(e.iframeUrl.includes("?")?"&":"?")+"pubkey="+e.pubkey+"&rebind="+s.pubkey;this.emit("iframeRestart",{pubkey:e.pubkey,iframeUrl:t})})),this.signer.on("authUrl",(t=>{console.log("nostr login auth url",t),this.emit("onAuthUrl",{url:t,iframeUrl:e.iframeUrl,eventToAddAccount:r})}));else{const t=new Nip46Client({localPrivateKey:e.sk,remotePubkey:e.signerPubkey,relays:e.relays||[],timeoutMs:3e4}),n=new Nip46Adapter(t,s);this.signer=n,this.signer.on("authUrl",(t=>{console.log("nostr login auth url",t),this.emit("onAuthUrl",{url:t,iframeUrl:e.iframeUrl,eventToAddAccount:r})}))}t?await this.listen(e):n?await this.connect(e,this.params.optionsModal.perms):await this.signer.initUserPubkey(e.pubkey),e.pubkey=this.signer.userPubkey,e.signerPubkey=this.signer.remotePubkey,i()}catch(e){console.log("initSigner failure",e),this.signer=null,s(e)}})),this.signerPromise}async authNip46(e,{name:t,bunkerUrl:n,sk:r="",domain:o="",iframeUrl:i=""}){try{const s=bunkerUrlToInfo(n,r);if(isBunkerUrl(t)?s.bunkerUrl=t:(s.nip05=t,s.domain=t.split("@")[1]),o&&(s.domain=o),i&&(s.iframeUrl=i),!s.signerPubkey||!s.sk||!s.relays||0===s.relays.length)throw new Error(`Bad bunker url ${n}`);const a=Boolean(this.params.userInfo);console.log("authNip46",e,s),await this.initSigner(s,{connect:!0,eventToAddAccount:a}),this.onAuth(e,s)}catch(e){throw console.log("nostr login auth failed",e),e}}async signEvent(e){const t=(async()=>(this.localSigner?(e.pubkey=getPublicKey(this.localSigner.privateKey),e.id=getEventHash(e),e.sig=await this.localSigner.sign(e)):(e.pubkey=this.signer?.remotePubkey,e.id=getEventHash(e),e.sig=await(this.signer?.sign(e))),e))(),n=new Promise(((e,t)=>{setTimeout((()=>t(new Error("Sign timeout"))),2e4)})),r=await Promise.race([t,n]);return console.log("signed",{event:r}),r}async codec_call(e,t,n){return new Promise(((r,o)=>{this.signer.rpc.sendRequest(this.signer.remotePubkey,e,[t,n],24133,(e=>{e.error?o(e.error):r(e.result)}))}))}async encrypt04(e,t){return this.localSigner?this.localSigner.encrypt(e,t):this.signer&&"function"==typeof this.signer.encrypt?this.signer.encrypt(e,t):this.codec_call("nip04_encrypt",e,t)}async decrypt04(e,t){return this.localSigner?this.localSigner.decrypt(e,t):this.signer&&"function"==typeof this.signer.decrypt?this.signer.decrypt(e,t):this.codec_call("nip04_decrypt",e,t)}async encrypt44(e,t){return this.localSigner?this.nip44Codec.encrypt(this.localSigner.privateKey,e,t):this.codec_call("nip44_encrypt",e,t)}async decrypt44(e,t){return this.localSigner?this.nip44Codec.decrypt(this.localSigner.privateKey,e,t):this.codec_call("nip44_decrypt",e,t)}}class ModalManager extends lib.EventEmitter{modal=null;params;extensionService;authNostrService;launcherPromise;accounts=[];recents=[];opt;constructor(e,t,n){super(),this.params=e,this.extensionService=n,this.authNostrService=t}async waitReady(){if(this.launcherPromise){try{await this.launcherPromise}catch{}this.launcherPromise=void 0}}async launch(e){console.log("nostr-login launch",e),this.launcherPromise&&await this.waitReady(),this.authNostrService.isAuthing()&&this.authNostrService.resetAuth(),this.opt=e;const t=document.createElement("dialog");if(this.modal=document.createElement("nl-auth"),this.modal.accounts=this.accounts,this.modal.recents=this.recents,this.modal.setAttribute("dark-mode",String(getDarkMode(e))),e.theme&&this.modal.setAttribute("theme",e.theme),e.startScreen&&this.modal.setAttribute("start-screen",e.startScreen),e.bunkers)this.modal.setAttribute("bunkers",e.bunkers);else{let e="nsec.app,highlighter.com";this.modal.setAttribute("bunkers",e)}void 0!==e.methods&&(this.modal.authMethods=e.methods),void 0!==e.localSignup&&(this.modal.localSignup=e.localSignup),void 0!==e.signupNstart&&(this.modal.signupNjump=e.signupNstart),e.title&&(this.modal.welcomeTitle=e.title),e.description&&(this.modal.welcomeDescription=e.description),this.modal.hasExtension=this.extensionService.hasExtension(),this.modal.hasOTP=!!e.otpRequestUrl&&!!e.otpReplyUrl,this.modal.isLoadingExtension=!1,this.modal.isLoading=!1,[this.modal.connectionString,this.modal.connectionStringServices]=await this.authNostrService.getNostrConnectServices(),t.appendChild(this.modal),document.body.appendChild(t);let n="";return this.launcherPromise=new Promise(((e,r)=>{t.addEventListener("close",(()=>{r(new Error("Closed")),this.authNostrService.resetAuth(),this.modal&&(document.body.removeChild(this.modal.parentNode),this.modal=null)}));const o=async e=>{this.modal&&(this.modal.isLoading=!1),await this.authNostrService.endAuth(),t.close(),this.modal=null,e()},i=async(t,n)=>{this.modal&&(this.modal.isLoading=!0);try{n&&!n.start||this.authNostrService.startAuth(),await t(),n&&!n.end||await o(e)}catch(e){console.log("error",e),this.modal&&(this.modal.isLoading=!1,this.modal.authUrl="",this.modal.iframeUrl="","cancelled"!==e&&(this.modal.error=e.toString()))}},s=async(e,t)=>{await i((async()=>{const n=await getBunkerUrl(e,this.params.optionsModal);await this.authNostrService.authNip46("login",{name:e,bunkerUrl:n,domain:t})}))},a=async e=>{await i((async()=>{const{bunkerUrl:t,sk:n}=await this.authNostrService.createAccount(e);await this.authNostrService.authNip46("signup",{name:e,bunkerUrl:t,sk:n})}))},l=async()=>{try{await navigator.clipboard.writeText(this.authNostrService.exportKeys()),localStorageSetItem("backupKey","true")}catch(e){console.error("Failed to copy to clipboard: ",e)}},c=async e=>{await i((async()=>{const{iframeUrl:t}=e;e.link=this.authNostrService.prepareImportUrl(e.link),this.modal&&t&&(this.modal.authUrl=e.link,this.modal.iframeUrl=t,this.modal.isLoading=!1,console.log("nostrconnect authUrl",this.modal.authUrl,this.modal.iframeUrl)),await this.authNostrService.importAndConnect(e)}))},d=async e=>{await i((async()=>{const{relays:t,domain:n,link:r,iframeUrl:o}=e||{};console.log("nostrConnect",e,t,n,r,o),this.modal&&(o&&(this.modal.authUrl=r,this.modal.iframeUrl=o,this.modal.isLoading=!1,console.log("nostrconnect authUrl",this.modal.authUrl,this.modal.iframeUrl)),e||(this.modal.isLoading=!1)),await this.authNostrService.nostrConnect(t,{domain:n,link:r,iframeUrl:o})}))},h=async e=>{await i((async()=>{if(!e)throw new Error("Please enter some nickname");await this.authNostrService.localSignup(e)}))},u=async()=>{await i((async()=>{const e=new URL(window.location.href),t=e.hostname.toLocaleLowerCase().replace(/^www\./i,"").charAt(0).toUpperCase()+e.hostname.slice(1),n=prepareSignupRelays(this.params.optionsModal.signupRelays);return this.modal.njumpIframe=`\n <html><body>\n <script src='https://start.njump.me/modal.js'><\/script>\n <script>\n new NstartModal({\n baseUrl: 'https://start.njump.me',\n // Required parameters\n an: '${t}',\n // Optional parameters\n s: [${this.opt.followNpubs?`'${this.opt.followNpubs}'`:""}],\n afb: false, // forceBunker\n asb: false, // skipBunker\n aan: false, // avoidNsec\n aac: true, // avoidNcryptsec\n ahc: true, // hide close button\n arr: ${JSON.stringify(n)}, //readRelays\n awr: ${JSON.stringify(n)}, //writeRelays\n // Callbacks\n onComplete: (result) => {\n console.log('Login token:', result.nostrLogin);\n window.parent.location.href='${window.location.href}#nostr-login='+result.nostrLogin;\n },\n onCancel: () => {\n window.parent.location.href='${window.location.href}#nostr-login=null';\n },\n }).open();\n <\/script>\n </body></html>\n `.replaceAll("&","&"),new Promise(((e,t)=>{const n=async n=>{if(console.log("nsecOrBunker",n),n.startsWith("nsec1")){let t;try{t=nip19_exports.decode(n)}catch(e){throw new Error("Bad nsec value")}if("nsec"!==t.type)throw new Error("Bad bech32 type");await this.authNostrService.localSignup("",t.data),e()}else n.startsWith("bunker:")?(await this.authNostrService.authNip46("login",{name:"",bunkerUrl:n}),e()):t("null"===n?"Cancelled":"Unknown return value")};window.addEventListener("hashchange",(async()=>{if(window.location.hash.startsWith("#nostr-login=")){const e=window.location.hash.split("#nostr-login=")[1],t=new URL(window.location.toString());t.hash="",window.history.replaceState({},"",t.toString()),n(e)}}))}))}))};if(!this.modal)throw new Error("WTH?");this.modal.addEventListener("handleContinue",(()=>{this.modal&&(this.modal.isLoading=!0,this.emit("onAuthUrlClick",this.modal.authUrl))})),this.modal.addEventListener("nlLogin",(e=>{s(e.detail)})),this.modal.addEventListener("nlSignup",(e=>{a(e.detail)})),this.modal.addEventListener("nlLocalSignup",(e=>{h(e.detail)})),this.modal.addEventListener("nlSignupNjump",(e=>{u()})),this.modal.addEventListener("nlImportAccount",(e=>{c(e.detail)})),this.modal.addEventListener("nlExportKeys",(e=>{l()})),this.modal.addEventListener("handleLogoutBanner",(()=>{this.emit("onLogoutBanner")})),this.modal.addEventListener("nlNostrConnect",(e=>{d(e.detail)})),this.modal.addEventListener("nlNostrConnectDefault",(()=>{this.authNostrService.isAuthing()||d()})),this.modal.addEventListener("nlNostrConnectDefaultCancel",(()=>{console.log("nlNostrConnectDefaultCancel"),this.authNostrService.cancelNostrConnect()})),this.modal.addEventListener("nlSwitchAccount",(e=>{const n=e.detail;this.emit("onSwitchAccount",n),setTimeout((()=>t.close()),300)})),this.modal.addEventListener("nlLoginRecentAccount",(async e=>{const n=e.detail;if("readOnly"===n.authMethod)this.authNostrService.setReadOnly(n.pubkey),t.close();else if("otp"===n.authMethod)try{this.modal.dispatchEvent(new CustomEvent("nlLoginOTPUser",{detail:n.nip05||n.pubkey}))}catch(e){console.error(e)}else if("extension"===n.authMethod)await this.extensionService.trySetExtensionForPubkey(n.pubkey),t.close();else if("amber"===n.authMethod)this.authNostrService.setAmber(n),t.close();else{const e=n.bunkerUrl||n.nip05;if(!e)throw new Error("Bad connect info");s(e,n.domain)}})),this.modal.addEventListener("nlRemoveRecent",(e=>{localStorageRemoveRecent(e.detail),this.emit("updateAccounts")}));const p=async e=>{let t="";if(e.includes("@")){const{error:n,pubkey:r}=await checkNip05(e);if(!r)throw new Error(n);t=r}else if(e.startsWith("npub")){const{type:n,data:r}=nip19_exports.decode(e);if("npub"!==n)throw new Error("Bad npub");t=r}else 64===e.trim().length&&(t=e.trim(),nip19_exports.npubEncode(t));return t};this.modal.addEventListener("nlLoginReadOnly",(async e=>{await i((async()=>{const t=e.detail,n=await p(t);this.authNostrService.setReadOnly(n)}))})),this.modal.addEventListener("nlLoginExtension",(async()=>{if(!this.extensionService.hasExtension())throw new Error("No extension");await i((async()=>{this.modal&&(this.modal.isLoadingExtension=!0,await this.extensionService.setExtension(),this.modal.isLoadingExtension=!1)}))})),this.modal.addEventListener("nlLoginOTPUser",(async e=>{await i((async()=>{if(!this.modal)return;const t=e.detail,r=await p(t),o=this.opt.otpRequestUrl+(this.opt.otpRequestUrl.includes("?")?"&":"?")+"pubkey="+r,i=await fetch(o);if(200!==i.status)throw console.warn("nostr-login: bad otp reply",i),new Error("Failed to send DM");this.modal.isOTP=!0,n=r,this.modal.isLoading=!1}),{start:!0})})),this.modal.addEventListener("nlLoginOTPCode",(async e=>{await i((async()=>{if(!this.modal)return;const t=e.detail,r=this.opt.otpReplyUrl+(this.opt.otpRequestUrl.includes("?")?"&":"?")+"pubkey="+n+"&code="+t,o=await fetch(r);if(200!==o.status)throw console.warn("nostr-login: bad otp reply",o),new Error("Invalid code");const i=await o.text();this.authNostrService.setOTP(n,i),this.modal.isOTP=!1}),{end:!0})})),this.modal.addEventListener("nlCheckSignup",(async e=>{const{available:t,taken:n,error:r}=await checkNip05(e.detail);this.modal&&(this.modal.error=String(r),!r&&n&&(this.modal.error="Already taken"),this.modal.signupNameIsAvailable=t)})),this.modal.addEventListener("nlCheckLogin",(async e=>{const{available:t,taken:n,error:r}=await checkNip05(e.detail);this.modal&&(this.modal.error=String(r),t&&(this.modal.error="Name not found"),this.modal.loginIsGood=n)}));const f=()=>{this.modal&&(this.modal.isLoading=!1),t.close(),r(new Error("Cancelled"))};this.modal.addEventListener("stopFetchHandler",f),this.modal.addEventListener("nlCloseModal",f),this.modal.addEventListener("nlChangeDarkMode",(e=>{setDarkMode(e.detail),document.dispatchEvent(new CustomEvent("nlDarkMode",{detail:e.detail}))})),this.on("onIframeAuthUrlCallEnd",(()=>{t.close(),this.modal=null,e()})),t.showModal()})),this.launcherPromise}async showIframeUrl(e){await this.waitReady(),this.launch({startScreen:"iframe"}).catch((()=>console.log("closed auth iframe"))),this.modal.authUrl=e}connectModals(e){const t=async e=>{await this.launch(e)},n=document.getElementsByTagName("nl-button");for(let r=0;r<n.length;r++){const o=n[r].getAttribute("nl-theme"),i=n[r].getAttribute("start-screen"),s={...e};switch(o&&(s.theme=o),i){case"login":case"login-bunker-url":case"login-read-only":case"signup":case"switch-account":case"welcome":s.startScreen=i}n[r].addEventListener("click",(function(){t(s)}))}}onAuthUrl(e){this.modal&&(this.modal.authUrl=e,this.modal.isLoading=!1)}onIframeUrl(e){this.modal&&(console.log("modal iframe url",e),this.modal.iframeUrl=e)}onCallEnd(){this.modal&&this.modal.authUrl&&this.params.userInfo?.iframeUrl&&this.emit("onIframeAuthUrlCallEnd")}onUpdateAccounts(e,t){this.accounts=e,this.recents=t,this.modal&&(this.modal.accounts=e,this.modal.recents=t)}onDarkMode(e){this.modal&&(this.modal.darkMode=e)}}class Nostr{#e;nip04;nip44;constructor(e){this.#e=e,this.getPublicKey=this.getPublicKey.bind(this),this.signEvent=this.signEvent.bind(this),this.getRelays=this.getRelays.bind(this),this.nip04={encrypt:this.encrypt04.bind(this),decrypt:this.decrypt04.bind(this)},this.nip44={encrypt:this.encrypt44.bind(this),decrypt:this.decrypt44.bind(this)}}async ensureAuth(){if(await this.#e.waitReady(),!this.#e.getUserInfo()&&(await this.#e.launch(),!this.#e.getUserInfo()))throw new Error("Rejected by user")}async getPublicKey(){await this.ensureAuth();const e=this.#e.getUserInfo();if(e)return e.pubkey;throw new Error("No user")}async signEvent(e){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().signEvent(e)))}async getRelays(){return{}}async encrypt04(e,t){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().nip04.encrypt(e,t)))}async decrypt04(e,t){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().nip04.decrypt(e,t)))}async encrypt44(e,t){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().nip44.encrypt(e,t)))}async decrypt44(e,t){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().nip44.decrypt(e,t)))}}class NostrExtensionService extends lib.EventEmitter{params;nostrExtension;constructor(e){super(),this.params=e}startCheckingExtension(e){if(this.checkExtension(e))return;const t=setInterval((()=>{this.checkExtension(e)&&clearTimeout(t)}),100)}checkExtension(e){return!(this.nostrExtension||!window.nostr||window.nostr===e)&&(this.initExtension(e),!0)}async initExtension(e,t){this.nostrExtension=window.nostr,window.nostr=e,"extension"===this.params.userInfo?.authMethod&&await this.trySetExtensionForPubkey(this.params.userInfo.pubkey),t||setTimeout((()=>{window.nostr!==e&&this.nostrExtension!==window.nostr&&this.initExtension(e,!0)}),300)}async setExtensionReadPubkey(e){window.nostr=this.nostrExtension;const t=await window.nostr.getPublicKey();e&&e!==t?this.emit("extensionLogout"):this.emit("extensionLogin",t)}async trySetExtensionForPubkey(e){if(this.nostrExtension)return this.setExtensionReadPubkey(e)}async setExtension(){return this.setExtensionReadPubkey()}unsetExtension(e){window.nostr===this.nostrExtension&&(window.nostr=e)}getExtension(){return this.nostrExtension}hasExtension(){return!!this.nostrExtension}}class NostrParams{userInfo;optionsModal;constructor(){this.userInfo=null,this.optionsModal={theme:"default",startScreen:"welcome",devOverrideBunkerOrigin:""}}}class Popup{popup=null;constructor(){}openPopup(e){if((!this.popup||this.popup.closed)&&(this.popup=window.open(e,"_blank","width=400,height=700"),console.log("popup",this.popup),!this.popup))throw new Error("Popup blocked. Try again, please!")}closePopup(){try{this.popup?.close(),this.popup=null}catch{}}}const CALL_TIMEOUT=5e3;class ProcessManager extends lib.EventEmitter{callCount=0;callTimer;constructor(){super()}onAuthUrl(){Boolean(this.callTimer)&&clearTimeout(this.callTimer)}onIframeUrl(){Boolean(this.callTimer)&&clearTimeout(this.callTimer)}async wait(e){let t,n;this.callTimer||(this.callTimer=setTimeout((()=>this.emit("onCallTimeout")),CALL_TIMEOUT)),this.callCount||this.emit("onCallStart"),this.callCount++;try{n=await e()}catch(e){t=e}if(this.callCount--,this.emit("onCallEnd"),this.callTimer&&clearTimeout(this.callTimer),this.callTimer=void 0,t)throw t;return n}}class NostrLoginInitializer{extensionService;params;authNostrService;nostr;processManager;popupManager;bannerManager;modalManager;customLaunchCallback;constructor(){this.params=new NostrParams,this.processManager=new ProcessManager,this.popupManager=new Popup,this.bannerManager=new BannerManager(this.params),this.authNostrService=new AuthNostrService(this.params),this.extensionService=new NostrExtensionService(this.params),this.modalManager=new ModalManager(this.params,this.authNostrService,this.extensionService);const e={waitReady:async()=>{await this.authNostrService.waitReady(),await this.modalManager.waitReady()},getUserInfo:()=>this.params.userInfo,getSigner:()=>{if("readOnly"===this.params.userInfo.authMethod)throw new Error("Read only");return"extension"===this.params.userInfo.authMethod?this.extensionService.getExtension():this.authNostrService},launch:()=>this.launch(),wait:e=>this.processManager.wait(e)};this.nostr=new Nostr(e),this.processManager.on("onCallTimeout",(()=>{this.bannerManager.onCallTimeout()})),this.processManager.on("onCallEnd",(()=>{this.bannerManager.onCallEnd(),this.modalManager.onCallEnd()})),this.processManager.on("onCallStart",(()=>{this.bannerManager.onCallStart()})),this.authNostrService.on("onIframeUrl",(e=>{this.modalManager.onIframeUrl(e)})),this.authNostrService.on("iframeRestart",(({iframeUrl:e})=>{this.processManager.onIframeUrl(),this.bannerManager.onIframeRestart(e)})),this.authNostrService.on("onAuthUrl",(({url:e,iframeUrl:t,eventToAddAccount:n})=>{this.processManager.onAuthUrl(),n?this.modalManager.onAuthUrl(e):this.params.userInfo?this.bannerManager.onAuthUrl(e,t):this.modalManager.onAuthUrl(e)})),this.authNostrService.on("updateAccounts",(()=>{this.updateAccounts()})),this.authNostrService.on("onUserInfo",(e=>{this.bannerManager.onUserInfo(e)})),this.modalManager.on("onAuthUrlClick",(e=>{this.openPopup(e)})),this.bannerManager.on("onIframeAuthUrlClick",(e=>{this.modalManager.showIframeUrl(e)})),this.modalManager.on("onSwitchAccount",(async e=>{this.switchAccount(e)})),this.modalManager.on("onLogoutBanner",(async e=>{logout()})),this.bannerManager.on("onConfirmLogout",(async()=>{this.launch("confirm-logout")})),this.modalManager.on("updateAccounts",(()=>{this.updateAccounts()})),this.bannerManager.on("logout",(()=>{logout()})),this.bannerManager.on("onAuthUrlClick",(e=>{this.openPopup(e)})),this.bannerManager.on("onSwitchAccount",(async e=>{this.switchAccount(e)})),this.bannerManager.on("import",(()=>{this.launch("import")})),this.extensionService.on("extensionLogin",(e=>{this.authNostrService.setExtension(e)})),this.extensionService.on("extensionLogout",(()=>{logout()})),this.bannerManager.on("launch",(e=>{this.launch(e)}))}openPopup(e){e.startsWith("nostrsigner:")?window.open(e,"_blank","width=400,height=600"):this.popupManager.openPopup(e)}async switchAccount(e,t=!1){if(console.log("nostr login switch to info",e),this.extensionService.unsetExtension(this.nostr),"readOnly"===e.authMethod)this.authNostrService.setReadOnly(e.pubkey);else if("otp"===e.authMethod)this.authNostrService.setOTP(e.pubkey,e.otpData||"");else if("local"===e.authMethod&&e.sk)this.authNostrService.setLocal(e,t);else if("extension"===e.authMethod)await this.extensionService.trySetExtensionForPubkey(e.pubkey);else if("connect"===e.authMethod&&e.sk&&e.relays&&e.relays[0])this.authNostrService.setConnect(e);else{if("amber"!==e.authMethod)throw new Error("Bad auth info");this.authNostrService.setAmber(e)}}updateAccounts(){const e=localStorageGetAccounts(),t=localStorageGetRecents();this.bannerManager.onUpdateAccounts(e),this.modalManager.onUpdateAccounts(e,t)}async launchCustomNostrConnect(){try{this.authNostrService.isAuthing()&&this.authNostrService.cancelNostrConnect();const e=new Promise((e=>this.customLaunchCallback=e));await this.authNostrService.startAuth(),await this.authNostrService.sendNeedAuth();try{await this.authNostrService.nostrConnect(),await this.authNostrService.endAuth()}catch(t){"cancelled"===t&&await e}}catch(e){console.error("launchCustomNostrConnect",e)}}fulfillCustomLaunchPromise(){if(this.customLaunchCallback){const e=this.customLaunchCallback;this.customLaunchCallback=void 0,e()}}launch=async e=>{if(!e&&this.params.optionsModal.customNostrConnect)return this.launchCustomNostrConnect();const t=localStorageGetRecents(),n=localStorageGetAccounts(),r={...this.params.optionsModal};e&&"default"!==e?r.startScreen=e:(Boolean(t?.length)||Boolean(n?.length))&&(r.startScreen="switch-account"),this.customLaunchCallback&&this.authNostrService.cancelNostrConnect();try{await this.modalManager.launch(r),this.fulfillCustomLaunchPromise()}catch(e){console.log("nostr-login failed",e)}};init=async e=>{this.extensionService.startCheckingExtension(this.nostr),window.nostr=this.nostr,this.modalManager.connectModals(e),this.bannerManager.launchAuthBanner(e),e&&(this.params.optionsModal={...e});try{const e=localStorageGetCurrent();if(e){if(!e.pubkey)throw new Error("Bad stored info");await this.switchAccount(e)}}catch(e){console.log("nostr login init error",e),await logout()}this.updateAccounts()};logout=async()=>{this.extensionService.unsetExtension(this.nostr),await this.authNostrService.logout()};setDarkMode=e=>{localStorageSetItem("nl-dark-mode",`${e}`),this.bannerManager.onDarkMode(e),this.modalManager.onDarkMode(e)};setAuth=async e=>{if(!e.type)throw new Error("Invalid auth event");if("login"!==e.type&&"logout"!==e.type&&"signup"!==e.type)throw new Error("Invalid auth event");if(e.method&&"connect"!==e.method&&"extension"!==e.method&&"local"!==e.method&&"otp"!==e.method&&"readOnly"!==e.method&&"amber"!==e.method)throw new Error("Invalid auth event");if("logout"===e.type)return this.logout();if(!e.method||!e.pubkey)throw new Error("Invalid pubkey");const t={authMethod:e.method,pubkey:e.pubkey,relays:e.relays,sk:e.localNsec,otpData:e.otpData,name:e.name};await this.switchAccount(t,"signup"===e.type)};cancelNeedAuth=()=>{console.log("cancelNeedAuth"),this.fulfillCustomLaunchPromise(),this.authNostrService.cancelNostrConnect()}}const initializer=new NostrLoginInitializer,{init:init,launch:launch,logout:logout,setDarkMode:setDarkMode,setAuth:setAuth,cancelNeedAuth:cancelNeedAuth}=initializer;document.addEventListener("nlLogout",logout),document.addEventListener("nlLaunch",(e=>{launch(e.detail||"")})),document.addEventListener("nlNeedAuthCancel",(()=>{cancelNeedAuth()})),document.addEventListener("nlDarkMode",(e=>{setDarkMode(!!e.detail)})),document.addEventListener("nlSetAuth",(e=>{setAuth(e.detail)})),(()=>{const e=document.currentScript,t=async()=>{const t={};if(e){const n=e.getAttribute("data-dark-mode");n&&(t.darkMode="true"===n);const r=e.getAttribute("data-bunkers");r&&(t.bunkers=r);const o=e.getAttribute("data-start-screen");o&&(t.startScreen=o);const i=e.getAttribute("data-perms");i&&(t.perms=i);const s=e.getAttribute("data-theme");s&&(t.theme=s);const a=e.getAttribute("data-no-banner");a&&(t.noBanner="true"===a);const l=e.getAttribute("data-local-signup");l&&(t.localSignup="true"===l);const c=e.getAttribute("data-signup-nstart")||e.getAttribute("data-signup-njump");c&&(t.signupNstart="true"===c);const d=e.getAttribute("data-follow-npubs");d&&(t.followNpubs=d);const h=e.getAttribute("data-otp-request-url");h&&(t.otpRequestUrl=h);const u=e.getAttribute("data-otp-reply-url");u&&(t.otpReplyUrl=u),!!h!=!!u&&console.warn("nostr-login: need request and reply urls for OTP auth");const p=e.getAttribute("data-methods");p&&(t.methods=p.trim().split(",").filter((e=>!!e)));const f=e.getAttribute("data-title");f&&(t.title=f);const g=e.getAttribute("data-description");g&&(t.description=g);const m=e.getAttribute("data-signup-relays");m&&(t.signupRelays=m);const b=e.getAttribute("data-outbox-relays");b&&(t.outboxRelays=b.split(","));const y="true"===e.getAttribute("data-dev");y&&(t.dev=y);const w="true"===e.getAttribute("data-custom-nostr-connect");w&&(t.customNostrConnect=w),console.log("nostr-login options",t)}init(t)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",t):t()})()})();
|
|
15
|
+
/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */const u8a=e=>e instanceof Uint8Array,u32=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4)),isLE=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];if(!isLE)throw new Error("Non little-endian hardware is not supported");function utf8ToBytes(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function toBytes(e){if("string"==typeof e&&(e=utf8ToBytes(e)),!u8a(e))throw new Error("expected Uint8Array, got "+typeof e);return e}const isPlainObject=e=>"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object;function checkOpts(e,t){if(void 0!==t&&("object"!=typeof t||!isPlainObject(t)))throw new Error("options must be object or undefined");return Object.assign(e,t)}function ensureBytes(e,t){if(!(e instanceof Uint8Array))throw new Error("Uint8Array expected");if(e.length!==t)throw new Error(`Uint8Array length ${t} expected`)}function equalBytes(e,t){if(e.length!==t.length)throw new Error("equalBytes: Different size of Uint8Arrays");let n=!0;for(let r=0;r<e.length;r++)n&&(n=e[r]===t[r]);return n}function number(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function bool(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)}function bytes(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function hash(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("hash must be wrapped by utils.wrapConstructor");number(e.outputLen),number(e.blockLen)}function exists(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function output(e,t){bytes(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}const assert={number:number,bool:bool,bytes:bytes,hash:hash,exists:exists,output:output},u8to16=(e,t)=>255&e[t++]|(255&e[t++])<<8;class Poly1305{constructor(e){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,ensureBytes(e=toBytes(e),32);const t=u8to16(e,0),n=u8to16(e,2),r=u8to16(e,4),o=u8to16(e,6),i=u8to16(e,8),s=u8to16(e,10),a=u8to16(e,12),l=u8to16(e,14);this.r[0]=8191&t,this.r[1]=8191&(t>>>13|n<<3),this.r[2]=7939&(n>>>10|r<<6),this.r[3]=8191&(r>>>7|o<<9),this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,this.r[6]=8191&(i>>>14|s<<2),this.r[7]=8065&(s>>>11|a<<5),this.r[8]=8191&(a>>>8|l<<8),this.r[9]=l>>>5&127;for(let t=0;t<8;t++)this.pad[t]=u8to16(e,16+2*t)}process(e,t,n=!1){const r=n?0:2048,{h:o,r:i}=this,s=i[0],a=i[1],l=i[2],c=i[3],d=i[4],h=i[5],u=i[6],p=i[7],f=i[8],g=i[9],m=u8to16(e,t+0),b=u8to16(e,t+2),y=u8to16(e,t+4),w=u8to16(e,t+6),v=u8to16(e,t+8),x=u8to16(e,t+10),k=u8to16(e,t+12),E=u8to16(e,t+14);let C=o[0]+(8191&m),$=o[1]+(8191&(m>>>13|b<<3)),S=o[2]+(8191&(b>>>10|y<<6)),_=o[3]+(8191&(y>>>7|w<<9)),A=o[4]+(8191&(w>>>4|v<<12)),N=o[5]+(v>>>1&8191),L=o[6]+(8191&(v>>>14|x<<2)),B=o[7]+(8191&(x>>>11|k<<5)),R=o[8]+(8191&(k>>>8|E<<8)),T=o[9]+(E>>>5|r),I=0,U=I+C*s+$*(5*g)+S*(5*f)+_*(5*p)+A*(5*u);I=U>>>13,U&=8191,U+=N*(5*h)+L*(5*d)+B*(5*c)+R*(5*l)+T*(5*a),I+=U>>>13,U&=8191;let M=I+C*a+$*s+S*(5*g)+_*(5*f)+A*(5*p);I=M>>>13,M&=8191,M+=N*(5*u)+L*(5*h)+B*(5*d)+R*(5*c)+T*(5*l),I+=M>>>13,M&=8191;let O=I+C*l+$*a+S*s+_*(5*g)+A*(5*f);I=O>>>13,O&=8191,O+=N*(5*p)+L*(5*u)+B*(5*h)+R*(5*d)+T*(5*c),I+=O>>>13,O&=8191;let P=I+C*c+$*l+S*a+_*s+A*(5*g);I=P>>>13,P&=8191,P+=N*(5*f)+L*(5*p)+B*(5*u)+R*(5*h)+T*(5*d),I+=P>>>13,P&=8191;let H=I+C*d+$*c+S*l+_*a+A*s;I=H>>>13,H&=8191,H+=N*(5*g)+L*(5*f)+B*(5*p)+R*(5*u)+T*(5*h),I+=H>>>13,H&=8191;let D=I+C*h+$*d+S*c+_*l+A*a;I=D>>>13,D&=8191,D+=N*s+L*(5*g)+B*(5*f)+R*(5*p)+T*(5*u),I+=D>>>13,D&=8191;let j=I+C*u+$*h+S*d+_*c+A*l;I=j>>>13,j&=8191,j+=N*a+L*s+B*(5*g)+R*(5*f)+T*(5*p),I+=j>>>13,j&=8191;let F=I+C*p+$*u+S*h+_*d+A*c;I=F>>>13,F&=8191,F+=N*l+L*a+B*s+R*(5*g)+T*(5*f),I+=F>>>13,F&=8191;let K=I+C*f+$*p+S*u+_*h+A*d;I=K>>>13,K&=8191,K+=N*c+L*l+B*a+R*s+T*(5*g),I+=K>>>13,K&=8191;let q=I+C*g+$*f+S*p+_*u+A*h;I=q>>>13,q&=8191,q+=N*d+L*c+B*l+R*a+T*s,I+=q>>>13,q&=8191,I=(I<<2)+I|0,I=I+U|0,U=8191&I,I>>>=13,M+=I,o[0]=U,o[1]=M,o[2]=O,o[3]=P,o[4]=H,o[5]=D,o[6]=j,o[7]=F,o[8]=K,o[9]=q}finalize(){const{h:e,pad:t}=this,n=new Uint16Array(10);let r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=5*r,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let o=(1^r)-1;for(let e=0;e<10;e++)n[e]&=o;o=~o;for(let t=0;t<10;t++)e[t]=e[t]&o|n[t];e[0]=65535&(e[0]|e[1]<<13),e[1]=65535&(e[1]>>>3|e[2]<<10),e[2]=65535&(e[2]>>>6|e[3]<<7),e[3]=65535&(e[3]>>>9|e[4]<<4),e[4]=65535&(e[4]>>>12|e[5]<<1|e[6]<<14),e[5]=65535&(e[6]>>>2|e[7]<<11),e[6]=65535&(e[7]>>>5|e[8]<<8),e[7]=65535&(e[8]>>>8|e[9]<<5);let i=e[0]+t[0];e[0]=65535&i;for(let n=1;n<8;n++)i=(e[n]+t[n]|0)+(i>>>16)|0,e[n]=65535&i}update(e){assert.exists(this);const{buffer:t,blockLen:n}=this,r=(e=toBytes(e)).length;for(let o=0;o<r;){const i=Math.min(n-this.pos,r-o);if(i!==n)t.set(e.subarray(o,o+i),this.pos),this.pos+=i,o+=i,this.pos===n&&(this.process(t,0,!1),this.pos=0);else for(;n<=r-o;o+=n)this.process(e,o)}return this}destroy(){this.h.fill(0),this.r.fill(0),this.buffer.fill(0),this.pad.fill(0)}digestInto(e){assert.exists(this),assert.output(e,this),this.finished=!0;const{buffer:t,h:n}=this;let{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let o=0;for(let t=0;t<8;t++)e[o++]=n[t]>>>0,e[o++]=n[t]>>>8;return e}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}}function wrapConstructorWithKey(e){const t=(t,n)=>e(n).update(toBytes(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}wrapConstructorWithKey((e=>new Poly1305(e)));const sigma16=utf8ToBytes("expand 16-byte k"),sigma32=utf8ToBytes("expand 32-byte k"),sigma16_32=u32(sigma16),sigma32_32=u32(sigma32),isAligned32=e=>!(e.byteOffset%4),salsaBasic=e=>{const{core:t,rounds:n,counterRight:r,counterLen:o,allow128bitKeys:i,extendNonceFn:s,blockLen:a}=checkOpts({rounds:20,counterRight:!1,counterLen:8,allow128bitKeys:!0,blockLen:64},e);assert.number(o),assert.number(n),assert.number(a),assert.bool(r),assert.bool(i);const l=a/4;if(a%4!=0)throw new Error("Salsa/ChaCha: blockLen must be aligned to 4 bytes");return(e,c,d,h,u=0)=>{if(assert.bytes(e),assert.bytes(c),assert.bytes(d),h||(h=new Uint8Array(d.length)),assert.bytes(h),assert.number(u),u<0||u>=2**32-1)throw new Error("Salsa/ChaCha: counter overflow");if(h.length<d.length)throw new Error(`Salsa/ChaCha: output (${h.length}) is shorter than data (${d.length})`);const p=[];let f,g;if(32===e.length)f=e,g=sigma32_32;else{if(16!==e.length||!i)throw new Error(`Salsa/ChaCha: invalid 32-byte key, got length=${e.length}`);f=new Uint8Array(32),f.set(e),f.set(e,16),g=sigma16_32,p.push(f)}if(s){if(c.length<=16)throw new Error("Salsa/ChaCha: extended nonce must be bigger than 16 bytes");f=s(g,f,c.subarray(0,16),new Uint8Array(32)),p.push(f),c=c.subarray(16)}const m=16-o;if(c.length!==m)throw new Error(`Salsa/ChaCha: nonce must be ${m} or 16 bytes`);if(12!==m){const e=new Uint8Array(12);e.set(c,r?0:12-c.length),p.push(c=e)}const b=new Uint8Array(a),y=u32(b),w=u32(f),v=u32(c),x=isAligned32(d)&&u32(d),k=isAligned32(h)&&u32(h);p.push(y);const E=d.length;for(let e=0,r=u;e<E;r++){if(t(g,w,v,y,r,n),r>=2**32-1)throw new Error("Salsa/ChaCha: counter overflow");const o=Math.min(a,E-e);if(o===a&&k&&x){const t=e/4;if(e%4!=0)throw new Error("Salsa/ChaCha: invalid block position");for(let e=0;e<l;e++)k[t+e]=x[t+e]^y[e];e+=a}else{for(let t=0;t<o;t++)h[e+t]=d[e+t]^b[t];e+=o}}for(let e=0;e<p.length;e++)p[e].fill(0);return h}},rotl=(e,t)=>e<<t|e>>>32-t;function chachaCore(e,t,n,r,o,i=20){let s=e[0],a=e[1],l=e[2],c=e[3],d=t[0],h=t[1],u=t[2],p=t[3],f=t[4],g=t[5],m=t[6],b=t[7],y=o,w=n[0],v=n[1],x=n[2],k=s,E=a,C=l,$=c,S=d,_=h,A=u,N=p,L=f,B=g,R=m,T=b,I=y,U=w,M=v,O=x;for(let e=0;e<i;e+=2)k=k+S|0,I=rotl(I^k,16),L=L+I|0,S=rotl(S^L,12),k=k+S|0,I=rotl(I^k,8),L=L+I|0,S=rotl(S^L,7),E=E+_|0,U=rotl(U^E,16),B=B+U|0,_=rotl(_^B,12),E=E+_|0,U=rotl(U^E,8),B=B+U|0,_=rotl(_^B,7),C=C+A|0,M=rotl(M^C,16),R=R+M|0,A=rotl(A^R,12),C=C+A|0,M=rotl(M^C,8),R=R+M|0,A=rotl(A^R,7),$=$+N|0,O=rotl(O^$,16),T=T+O|0,N=rotl(N^T,12),$=$+N|0,O=rotl(O^$,8),T=T+O|0,N=rotl(N^T,7),k=k+_|0,O=rotl(O^k,16),R=R+O|0,_=rotl(_^R,12),k=k+_|0,O=rotl(O^k,8),R=R+O|0,_=rotl(_^R,7),E=E+A|0,I=rotl(I^E,16),T=T+I|0,A=rotl(A^T,12),E=E+A|0,I=rotl(I^E,8),T=T+I|0,A=rotl(A^T,7),C=C+N|0,U=rotl(U^C,16),L=L+U|0,N=rotl(N^L,12),C=C+N|0,U=rotl(U^C,8),L=L+U|0,N=rotl(N^L,7),$=$+S|0,M=rotl(M^$,16),B=B+M|0,S=rotl(S^B,12),$=$+S|0,M=rotl(M^$,8),B=B+M|0,S=rotl(S^B,7);let P=0;r[P++]=s+k|0,r[P++]=a+E|0,r[P++]=l+C|0,r[P++]=c+$|0,r[P++]=d+S|0,r[P++]=h+_|0,r[P++]=u+A|0,r[P++]=p+N|0,r[P++]=f+L|0,r[P++]=g+B|0,r[P++]=m+R|0,r[P++]=b+T|0,r[P++]=y+I|0,r[P++]=w+U|0,r[P++]=v+M|0,r[P++]=x+O|0}const chacha20=salsaBasic({core:chachaCore,counterRight:!1,counterLen:4,allow128bitKeys:!1});class HMAC extends Hash$1{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,assert$2.hash(e);const n=toBytes$2(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,o=new Uint8Array(r);o.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<o.length;e++)o[e]^=54;this.iHash.update(o),this.oHash=e.create();for(let e=0;e<o.length;e++)o[e]^=106;this.oHash.update(o),o.fill(0)}update(e){return assert$2.exists(this),this.iHash.update(e),this}digestInto(e){assert$2.exists(this),assert$2.bytes(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:o,blockLen:i,outputLen:s}=this;return e.finished=r,e.destroyed=o,e.blockLen=i,e.outputLen=s,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const hmac=(e,t,n)=>new HMAC(e,t).update(n).digest();function extract$1(e,t,n){return assert$2.hash(e),void 0===n&&(n=new Uint8Array(e.outputLen)),hmac(e,toBytes$2(n),toBytes$2(t))}hmac.create=(e,t)=>new HMAC(e,t);const HKDF_COUNTER$1=new Uint8Array([0]),EMPTY_BUFFER$1=new Uint8Array;function expand$1(e,t,n,r=32){if(assert$2.hash(e),assert$2.number(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const o=Math.ceil(r/e.outputLen),i=new Uint8Array(o*e.outputLen),s=hmac.create(e,t),a=s._cloneInto(),l=new Uint8Array(s.outputLen);for(let t=0;t<o;t++)HKDF_COUNTER$1[0]=t+1,a.update(0===t?EMPTY_BUFFER$1:l).update(n).update(HKDF_COUNTER$1).digestInto(l),i.set(l,e.outputLen*t),s._cloneInto(a);return s.destroy(),a.destroy(),l.fill(0),HKDF_COUNTER$1.fill(0),i.slice(0,r)}const hkdf=(e,t,n,r,o)=>expand$1(e,extract$1(e,t,n),r,o);var __defProp=Object.defineProperty,__export=(e,t)=>{for(var n in t)__defProp(e,n,{get:t[n],enumerable:!0})};function generatePrivateKey(){return bytesToHex$1(schnorr.utils.randomPrivateKey())}function getPublicKey(e){return bytesToHex$1(schnorr.getPublicKey(e))}var utils_exports={};__export(utils_exports,{MessageNode:()=>MessageNode,MessageQueue:()=>MessageQueue,insertEventIntoAscendingList:()=>insertEventIntoAscendingList,insertEventIntoDescendingList:()=>insertEventIntoDescendingList,normalizeURL:()=>normalizeURL,utf8Decoder:()=>utf8Decoder,utf8Encoder:()=>utf8Encoder});var utf8Decoder=new TextDecoder("utf-8"),utf8Encoder=new TextEncoder;function normalizeURL(e){let t=new URL(e);return t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),("80"===t.port&&"ws:"===t.protocol||"443"===t.port&&"wss:"===t.protocol)&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}function insertEventIntoDescendingList(e,t){let n,r=0,o=e.length-1,i=r;if(o<0)i=0;else if(t.created_at<e[o].created_at)i=o+1;else if(t.created_at>=e[r].created_at)i=r;else for(;;){if(o<=r+1){i=o;break}if(n=Math.floor(r+(o-r)/2),e[n].created_at>t.created_at)r=n;else{if(!(e[n].created_at<t.created_at)){i=n;break}o=n}}return e[i]?.id!==t.id?[...e.slice(0,i),t,...e.slice(i)]:e}function insertEventIntoAscendingList(e,t){let n,r=0,o=e.length-1,i=r;if(o<0)i=0;else if(t.created_at>e[o].created_at)i=o+1;else if(t.created_at<=e[r].created_at)i=r;else for(;;){if(o<=r+1){i=o;break}if(n=Math.floor(r+(o-r)/2),e[n].created_at<t.created_at)r=n;else{if(!(e[n].created_at>t.created_at)){i=n;break}o=n}}return e[i]?.id!==t.id?[...e.slice(0,i),t,...e.slice(i)]:e}var MessageNode=class{_value;_next;get value(){return this._value}set value(e){this._value=e}get next(){return this._next}set next(e){this._next=e}constructor(e){this._value=e,this._next=null}},MessageQueue=class{_first;_last;get first(){return this._first}set first(e){this._first=e}get last(){return this._last}set last(e){this._last=e}_size;get size(){return this._size}set size(e){this._size=e}constructor(){this._first=null,this._last=null,this._size=0}enqueue(e){const t=new MessageNode(e);return 0!==this._size&&this._last?(this._last.next=t,this._last=t):(this._first=t,this._last=t),this._size++,!0}dequeue(){if(0===this._size||!this._first)return null;let e=this._first;return this._first=e.next,e.next=null,this._size--,e.value}},verifiedSymbol=Symbol("verified");function getBlankEvent(e=255){return{kind:e,content:"",tags:[],created_at:0}}function finishEvent(e,t){const n=e;return n.pubkey=getPublicKey(t),n.id=getEventHash(n),n.sig=getSignature(n,t),n[verifiedSymbol]=!0,n}function serializeEvent(e){if(!validateEvent(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function getEventHash(e){return bytesToHex$1(sha256$1(utf8Encoder.encode(serializeEvent(e))))}var isRecord=e=>e instanceof Object;function validateEvent(e){if(!isRecord(e))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;t<e.tags.length;t++){let n=e.tags[t];if(!Array.isArray(n))return!1;for(let e=0;e<n.length;e++)if("object"==typeof n[e])return!1}return!0}function verifySignature(e){if("boolean"==typeof e[verifiedSymbol])return e[verifiedSymbol];const t=getEventHash(e);if(t!==e.id)return e[verifiedSymbol]=!1;try{return e[verifiedSymbol]=schnorr.verify(e.sig,t,e.pubkey)}catch(t){return e[verifiedSymbol]=!1}}function getSignature(e,t){return bytesToHex$1(schnorr.sign(getEventHash(e),t))}function matchFilter(e,t){if(e.ids&&-1===e.ids.indexOf(t.id)&&!e.ids.some((e=>t.id.startsWith(e))))return!1;if(e.kinds&&-1===e.kinds.indexOf(t.kind))return!1;if(e.authors&&-1===e.authors.indexOf(t.pubkey)&&!e.authors.some((e=>t.pubkey.startsWith(e))))return!1;for(let n in e)if("#"===n[0]){let r=e[`#${n.slice(1)}`];if(r&&!t.tags.find((([e,t])=>e===n.slice(1)&&-1!==r.indexOf(t))))return!1}return!(e.since&&t.created_at<e.since)&&!(e.until&&t.created_at>e.until)}function matchFilters(e,t){for(let n=0;n<e.length;n++)if(matchFilter(e[n],t))return!0;return!1}function mergeFilters(...e){let t={};for(let n=0;n<e.length;n++){let r=e[n];Object.entries(r).forEach((([e,n])=>{if("kinds"===e||"ids"===e||"authors"===e||"#"===e[0]){t[e]=t[e]||[];for(let r=0;r<n.length;r++){let o=n[r];t[e].includes(o)||t[e].push(o)}}})),r.limit&&(!t.limit||r.limit>t.limit)&&(t.limit=r.limit),r.until&&(!t.until||r.until>t.until)&&(t.until=r.until),r.since&&(!t.since||r.since<t.since)&&(t.since=r.since)}return t}var fakejson_exports={};function getHex64(e,t){let n=t.length+3,r=e.indexOf(`"${t}":`)+n,o=e.slice(r).indexOf('"')+r+1;return e.slice(o,o+64)}function getInt(e,t){let n=t.length,r=e.indexOf(`"${t}":`)+n+3,o=e.slice(r),i=Math.min(o.indexOf(","),o.indexOf("}"));return parseInt(o.slice(0,i),10)}function getSubscriptionId(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let r=t+7+1+n,o=e.slice(r+1,80).indexOf('"');if(-1===o)return null;let i=r+1+o;return e.slice(r+1,i)}function matchEventId(e,t){return t===getHex64(e,"id")}function matchEventPubkey(e,t){return t===getHex64(e,"pubkey")}function matchEventKind(e,t){return t===getInt(e,"kind")}__export(fakejson_exports,{getHex64:()=>getHex64,getInt:()=>getInt,getSubscriptionId:()=>getSubscriptionId,matchEventId:()=>matchEventId,matchEventKind:()=>matchEventKind,matchEventPubkey:()=>matchEventPubkey});var newListeners=()=>({connect:[],disconnect:[],error:[],notice:[],auth:[]});function relayInit(e,t={}){let{listTimeout:n=3e3,getTimeout:r=3e3,countTimeout:o=3e3}=t;var i,s,a={},l=newListeners(),c={},d={};function h(){return 1===i?.readyState}async function u(e){let t=JSON.stringify(e);if(h()||(await new Promise((e=>setTimeout(e,1e3))),h()))try{i.send(t)}catch(e){console.log(e)}}const p=(e,{verb:t="REQ",skipVerification:n=!1,alreadyHaveEvent:r=null,id:o=Math.random().toString().slice(2)}={})=>{let i=o;a[i]={id:i,filters:e,skipVerification:n,alreadyHaveEvent:r},u([t,i,...e]);let s={sub:(t,o={})=>p(t||e,{skipVerification:o.skipVerification||n,alreadyHaveEvent:o.alreadyHaveEvent||r,id:i}),unsub:()=>{delete a[i],delete c[i],u(["CLOSE",i])},on:(e,t)=>{c[i]=c[i]||{event:[],count:[],eose:[]},c[i][e].push(t)},off:(e,t)=>{let n=c[i],r=n[e].indexOf(t);r>=0&&n[e].splice(r,1)},get events(){return eventsGenerator(s)}};return s};function f(e,t){return new Promise(((n,r)=>{if(!e.id)return void r(new Error(`event ${e} has no id`));let o=e.id;u([t,e]),d[o]={resolve:n,reject:r}}))}return{url:e,sub:p,on:(e,t)=>{l[e].push(t),"connect"===e&&1===i?.readyState&&t()},off:(e,t)=>{let n=l[e].indexOf(t);-1!==n&&l[e].splice(n,1)},list:(e,t)=>new Promise((r=>{let o=p(e,t),i=[],s=setTimeout((()=>{o.unsub(),r(i)}),n);o.on("eose",(()=>{o.unsub(),clearTimeout(s),r(i)})),o.on("event",(e=>{i.push(e)}))})),get:(e,t)=>new Promise((n=>{let o=p([e],t),i=setTimeout((()=>{o.unsub(),n(null)}),r);o.on("event",(e=>{o.unsub(),clearTimeout(i),n(e)}))})),count:e=>new Promise((t=>{let n=p(e,{...p,verb:"COUNT"}),r=setTimeout((()=>{n.unsub(),t(null)}),o);n.on("count",(e=>{n.unsub(),clearTimeout(r),t(e)}))})),async publish(e){await f(e,"EVENT")},async auth(e){await f(e,"AUTH")},connect:async function(){h()||await async function(){return s||(s=new Promise(((t,n)=>{try{i=new WebSocket(e)}catch(e){n(e)}i.onopen=()=>{l.connect.forEach((e=>e())),t()},i.onerror=()=>{s=void 0,l.error.forEach((e=>e())),n()},i.onclose=async()=>{s=void 0,l.disconnect.forEach((e=>e()))};let r,o=new MessageQueue;function h(){if(0===o.size)return clearInterval(r),void(r=null);var t=o.dequeue();if(!t)return;let n=getSubscriptionId(t);if(n){let r=a[n];if(r&&r.alreadyHaveEvent&&r.alreadyHaveEvent(getHex64(t,"id"),e))return}try{let e=JSON.parse(t);switch(e[0]){case"EVENT":{let t=e[1],n=e[2];return void(validateEvent(n)&&a[t]&&(a[t].skipVerification||verifySignature(n))&&matchFilters(a[t].filters,n)&&(a[t],(c[t]?.event||[]).forEach((e=>e(n)))))}case"COUNT":let t=e[1],n=e[2];return void(a[t]&&(c[t]?.count||[]).forEach((e=>e(n))));case"EOSE":{let t=e[1];return void(t in c&&(c[t].eose.forEach((e=>e())),c[t].eose=[]))}case"OK":{let t=e[1],n=e[2],r=e[3]||"";if(t in d){let{resolve:e,reject:o}=d[t];n?e(null):o(new Error(r))}return}case"NOTICE":let r=e[1];return void l.notice.forEach((e=>e(r)));case"AUTH":{let t=e[1];return void l.auth?.forEach((e=>e(t)))}}}catch(e){return}}i.onmessage=e=>{o.enqueue(e.data),r||(r=setInterval(h,0))}})),s)}()},close(){l=newListeners(),c={},d={},i?.readyState===WebSocket.OPEN&&i.close()},get status(){return i?.readyState??3}}}async function*eventsGenerator(e){let t;const n=[],r=e=>{t?(t(e),t=void 0):n.push(e)};e.on("event",r);try{for(;;)if(n.length>0)yield n.shift();else{const e=await new Promise((e=>{t=e}));yield e}}finally{e.off("event",r)}}var SimplePool=class{_conn;_seenOn={};batchedByKey={};eoseSubTimeout;getTimeout;seenOnEnabled=!0;batchInterval=100;constructor(e={}){this._conn={},this.eoseSubTimeout=e.eoseSubTimeout||3400,this.getTimeout=e.getTimeout||3400,this.seenOnEnabled=!1!==e.seenOnEnabled,this.batchInterval=e.batchInterval||100}close(e){e.forEach((e=>{let t=this._conn[normalizeURL(e)];t&&t.close()}))}async ensureRelay(e){const t=normalizeURL(e);this._conn[t]||(this._conn[t]=relayInit(t,{getTimeout:.9*this.getTimeout,listTimeout:.9*this.getTimeout}));const n=this._conn[t];return await n.connect(),n}sub(e,t,n){let r=new Set,o={...n||{}};o.alreadyHaveEvent=(e,t)=>{if(n?.alreadyHaveEvent?.(e,t))return!0;if(this.seenOnEnabled){let n=this._seenOn[e]||new Set;n.add(t),this._seenOn[e]=n}return r.has(e)};let i=[],s=new Set,a=new Set,l=e.length,c=!1,d=setTimeout((()=>{c=!0;for(let e of a.values())e()}),n?.eoseSubTimeout||this.eoseSubTimeout);e.filter(((e,t,n)=>n.indexOf(e)===t)).forEach((async e=>{let n;try{n=await this.ensureRelay(e)}catch(e){return void u()}if(!n)return;let h=n.sub(t,o);function u(){if(l--,0===l){clearTimeout(d);for(let e of a.values())e()}}h.on("event",(e=>{r.add(e.id);for(let t of s.values())t(e)})),h.on("eose",(()=>{c||u()})),i.push(h)}));let h={sub:(e,t)=>(i.forEach((n=>n.sub(e,t))),h),unsub(){i.forEach((e=>e.unsub()))},on(e,t){"event"===e?s.add(t):"eose"===e&&a.add(t)},off(e,t){"event"===e?s.delete(t):"eose"===e&&a.delete(t)},get events(){return eventsGenerator(h)}};return h}get(e,t,n){return new Promise((r=>{let o=this.sub(e,[t],n),i=setTimeout((()=>{o.unsub(),r(null)}),this.getTimeout);o.on("event",(e=>{r(e),clearTimeout(i),o.unsub()}))}))}list(e,t,n){return new Promise((r=>{let o=[],i=this.sub(e,t,n);i.on("event",(e=>{o.push(e)})),i.on("eose",(()=>{i.unsub(),r(o)}))}))}batchedList(e,t,n){return new Promise((r=>{this.batchedByKey[e]?this.batchedByKey[e].push({filters:n,relays:t,resolve:r,events:[]}):(this.batchedByKey[e]=[{filters:n,relays:t,resolve:r,events:[]}],setTimeout((()=>{Object.keys(this.batchedByKey).forEach((async e=>{const t=this.batchedByKey[e],n=[],r=[];t.forEach((e=>{n.push(...e.filters),r.push(...e.relays)}));const o=this.sub(r,[mergeFilters(...n)]);o.on("event",(e=>{t.forEach((t=>matchFilters(t.filters,e)&&t.events.push(e)))})),o.on("eose",(()=>{o.unsub(),t.forEach((e=>e.resolve(e.events)))})),delete this.batchedByKey[e]}))}),this.batchInterval))}))}publish(e,t){return e.map((async e=>(await this.ensureRelay(e)).publish(t)))}seenOn(e){return Array.from(this._seenOn[e]?.values?.()||[])}},nip19_exports={};__export(nip19_exports,{BECH32_REGEX:()=>BECH32_REGEX,decode:()=>decode,naddrEncode:()=>naddrEncode,neventEncode:()=>neventEncode,noteEncode:()=>noteEncode,nprofileEncode:()=>nprofileEncode,npubEncode:()=>npubEncode,nrelayEncode:()=>nrelayEncode,nsecEncode:()=>nsecEncode});var Bech32MaxSize=5e3,BECH32_REGEX=/[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;function integerToUint8Array(e){const t=new Uint8Array(4);return t[0]=e>>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t}function decode(e){let{prefix:t,words:n}=bech32.decode(e,Bech32MaxSize),r=new Uint8Array(bech32.fromWords(n));switch(t){case"nprofile":{let e=parseTLV(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:bytesToHex$1(e[0][0]),relays:e[1]?e[1].map((e=>utf8Decoder.decode(e))):[]}}}case"nevent":{let e=parseTLV(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:bytesToHex$1(e[0][0]),relays:e[1]?e[1].map((e=>utf8Decoder.decode(e))):[],author:e[2]?.[0]?bytesToHex$1(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(bytesToHex$1(e[3][0]),16):void 0}}}case"naddr":{let e=parseTLV(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:utf8Decoder.decode(e[0][0]),pubkey:bytesToHex$1(e[2][0]),kind:parseInt(bytesToHex$1(e[3][0]),16),relays:e[1]?e[1].map((e=>utf8Decoder.decode(e))):[]}}}case"nrelay":{let e=parseTLV(r);if(!e[0]?.[0])throw new Error("missing TLV 0 for nrelay");return{type:"nrelay",data:utf8Decoder.decode(e[0][0])}}case"nsec":case"npub":case"note":return{type:t,data:bytesToHex$1(r)};default:throw new Error(`unknown prefix ${t}`)}}function parseTLV(e){let t={},n=e;for(;n.length>0;){let e=n[0],r=n[1];if(!r)throw new Error(`malformed TLV ${e}`);let o=n.slice(2,2+r);if(n=n.slice(2+r),o.length<r)throw new Error(`not enough data to read on TLV ${e}`);t[e]=t[e]||[],t[e].push(o)}return t}function nsecEncode(e){return encodeBytes("nsec",e)}function npubEncode(e){return encodeBytes("npub",e)}function noteEncode(e){return encodeBytes("note",e)}function encodeBech32(e,t){let n=bech32.toWords(t);return bech32.encode(e,n,Bech32MaxSize)}function encodeBytes(e,t){return encodeBech32(e,hexToBytes$1(t))}function nprofileEncode(e){return encodeBech32("nprofile",encodeTLV({0:[hexToBytes$1(e.pubkey)],1:(e.relays||[]).map((e=>utf8Encoder.encode(e)))}))}function neventEncode(e){let t;return null!=e.kind&&(t=integerToUint8Array(e.kind)),encodeBech32("nevent",encodeTLV({0:[hexToBytes$1(e.id)],1:(e.relays||[]).map((e=>utf8Encoder.encode(e))),2:e.author?[hexToBytes$1(e.author)]:[],3:t?[new Uint8Array(t)]:[]}))}function naddrEncode(e){let t=new ArrayBuffer(4);return new DataView(t).setUint32(0,e.kind,!1),encodeBech32("naddr",encodeTLV({0:[utf8Encoder.encode(e.identifier)],1:(e.relays||[]).map((e=>utf8Encoder.encode(e))),2:[hexToBytes$1(e.pubkey)],3:[new Uint8Array(t)]}))}function nrelayEncode(e){return encodeBech32("nrelay",encodeTLV({0:[utf8Encoder.encode(e)]}))}function encodeTLV(e){let t=[];return Object.entries(e).forEach((([e,n])=>{n.forEach((n=>{let r=new Uint8Array(n.length+2);r.set([parseInt(e)],0),r.set([n.length],1),r.set(n,2),t.push(r)}))})),concatBytes$1(...t)}var nip04_exports={};async function encrypt(e,t,n){const r=getNormalizedX(secp256k1.getSharedSecret(e,"02"+t));let o=Uint8Array.from(randomBytes$1(16)),i=utf8Encoder.encode(n),s=await crypto.subtle.importKey("raw",r,{name:"AES-CBC"},!1,["encrypt"]),a=await crypto.subtle.encrypt({name:"AES-CBC",iv:o},s,i);return`${base64$1.encode(new Uint8Array(a))}?iv=${base64$1.encode(new Uint8Array(o.buffer))}`}async function decrypt(e,t,n){let[r,o]=n.split("?iv="),i=getNormalizedX(secp256k1.getSharedSecret(e,"02"+t)),s=await crypto.subtle.importKey("raw",i,{name:"AES-CBC"},!1,["decrypt"]),a=base64$1.decode(r),l=base64$1.decode(o),c=await crypto.subtle.decrypt({name:"AES-CBC",iv:l},s,a);return utf8Decoder.decode(c)}function getNormalizedX(e){return e.slice(1,33)}__export(nip04_exports,{decrypt:()=>decrypt,encrypt:()=>encrypt}),"undefined"!=typeof crypto&&!crypto.subtle&&crypto.webcrypto&&(crypto.subtle=crypto.webcrypto.subtle);var nip05_exports={};__export(nip05_exports,{NIP05_REGEX:()=>NIP05_REGEX,queryProfile:()=>queryProfile,searchDomain:()=>searchDomain,useFetchImplementation:()=>useFetchImplementation});var NIP05_REGEX=/^(?:([\w.+-]+)@)?([\w.-]+)$/,_fetch;try{_fetch=fetch}catch{}function useFetchImplementation(e){_fetch=e}async function searchDomain(e,t=""){try{return(await(await _fetch(`https://${e}/.well-known/nostr.json?name=${t}`)).json()).names}catch(e){return{}}}async function queryProfile(e){const t=e.match(NIP05_REGEX);if(!t)return null;const[n,r="_",o]=t;try{const e=await _fetch(`https://${o}/.well-known/nostr.json?name=${r}`),{names:t,relays:n}=parseNIP05Result(await e.json()),i=t[r];return i?{pubkey:i,relays:n?.[i]}:null}catch(e){return null}}function parseNIP05Result(e){const t={names:{}};for(const[n,r]of Object.entries(e.names))"string"==typeof n&&"string"==typeof r&&(t.names[n]=r);if(e.relays){t.relays={};for(const[n,r]of Object.entries(e.relays))"string"==typeof n&&Array.isArray(r)&&(t.relays[n]=r.filter((e=>"string"==typeof e)))}return t}var nip06_exports={};function privateKeyFromSeedWords(e,t){let n=HDKey.fromMasterSeed(mnemonicToSeedSync(e,t)).derive("m/44'/1237'/0'/0/0").privateKey;if(!n)throw new Error("could not derive private key");return bytesToHex$1(n)}function generateSeedWords(){return generateMnemonic(wordlist)}function validateWords(e){return validateMnemonic(e,wordlist)}__export(nip06_exports,{generateSeedWords:()=>generateSeedWords,privateKeyFromSeedWords:()=>privateKeyFromSeedWords,validateWords:()=>validateWords});var nip10_exports={};function parse(e){const t={reply:void 0,root:void 0,mentions:[],profiles:[]},n=[];for(const r of e.tags)"e"===r[0]&&r[1]&&n.push(r),"p"===r[0]&&r[1]&&t.profiles.push({pubkey:r[1],relays:r[2]?[r[2]]:[]});for(let e=0;e<n.length;e++){const r=n[e],[o,i,s,a]=r,l={id:i,relays:s?[s]:[]},c=0===e,d=e===n.length-1;"root"!==a?"reply"!==a?"mention"!==a?c?t.root=l:d?t.reply=l:t.mentions.push(l):t.mentions.push(l):t.reply=l:t.root=l}return t}__export(nip10_exports,{parse:()=>parse});var nip13_exports={};function getPow(e){let t=0;for(let n=0;n<e.length;n++){const r=parseInt(e[n],16);if(0!==r){t+=Math.clz32(r)-28;break}t+=4}return t}function minePow(e,t){let n=0;const r=e,o=["nonce",n.toString(),t.toString()];for(r.tags.push(o);;){const e=Math.floor((new Date).getTime()/1e3);if(e!==r.created_at&&(n=0,r.created_at=e),o[1]=(++n).toString(),r.id=getEventHash(r),getPow(r.id)>=t)break}return r}__export(nip13_exports,{getPow:()=>getPow,minePow:()=>minePow});var nip18_exports={};function finishRepostEvent(e,t,n,r){return finishEvent({kind:6,tags:[...e.tags??[],["e",t.id,n],["p",t.pubkey]],content:""===e.content?"":JSON.stringify(t),created_at:e.created_at},r)}function getRepostedEventPointer(e){if(6!==e.kind)return;let t,n;for(let r=e.tags.length-1;r>=0&&(void 0===t||void 0===n);r--){const o=e.tags[r];o.length>=2&&("e"===o[0]&&void 0===t?t=o:"p"===o[0]&&void 0===n&&(n=o))}return void 0!==t?{id:t[1],relays:[t[2],n?.[2]].filter((e=>"string"==typeof e)),author:n?.[1]}:void 0}function getRepostedEvent(e,{skipVerification:t}={}){const n=getRepostedEventPointer(e);if(void 0===n||""===e.content)return;let r;try{r=JSON.parse(e.content)}catch(e){return}return r.id===n.id&&(t||verifySignature(r))?r:void 0}__export(nip18_exports,{finishRepostEvent:()=>finishRepostEvent,getRepostedEvent:()=>getRepostedEvent,getRepostedEventPointer:()=>getRepostedEventPointer});var nip21_exports={};__export(nip21_exports,{NOSTR_URI_REGEX:()=>NOSTR_URI_REGEX,parse:()=>parse2,test:()=>test});var NOSTR_URI_REGEX=new RegExp(`nostr:(${BECH32_REGEX.source})`);function test(e){return"string"==typeof e&&new RegExp(`^${NOSTR_URI_REGEX.source}$`).test(e)}function parse2(e){const t=e.match(new RegExp(`^${NOSTR_URI_REGEX.source}$`));if(!t)throw new Error(`Invalid Nostr URI: ${e}`);return{uri:t[0],value:t[1],decoded:decode(t[1])}}var nip25_exports={};function finishReactionEvent(e,t,n){const r=t.tags.filter((e=>e.length>=2&&("e"===e[0]||"p"===e[0])));return finishEvent({...e,kind:7,tags:[...e.tags??[],...r,["e",t.id],["p",t.pubkey]],content:e.content??"+"},n)}function getReactedEventPointer(e){if(7!==e.kind)return;let t,n;for(let r=e.tags.length-1;r>=0&&(void 0===t||void 0===n);r--){const o=e.tags[r];o.length>=2&&("e"===o[0]&&void 0===t?t=o:"p"===o[0]&&void 0===n&&(n=o))}return void 0!==t&&void 0!==n?{id:t[1],relays:[t[2],n[2]].filter((e=>void 0!==e)),author:n[1]}:void 0}__export(nip25_exports,{finishReactionEvent:()=>finishReactionEvent,getReactedEventPointer:()=>getReactedEventPointer});var nip26_exports={};function createDelegation(e,t){let n=[];(t.kind||-1)>=0&&n.push(`kind=${t.kind}`),t.until&&n.push(`created_at<${t.until}`),t.since&&n.push(`created_at>${t.since}`);let r=n.join("&");if(""===r)throw new Error("refusing to create a delegation without any conditions");let o=sha256$1(utf8Encoder.encode(`nostr:delegation:${t.pubkey}:${r}`)),i=bytesToHex$1(schnorr.sign(o,e));return{from:getPublicKey(e),to:t.pubkey,cond:r,sig:i}}function getDelegator(e){let t=e.tags.find((e=>"delegation"===e[0]&&e.length>=4));if(!t)return null;let n=t[1],r=t[2],o=t[3],i=r.split("&");for(let t=0;t<i.length;t++){let[n,r,o]=i[t].split(/\b/);if(("kind"!==n||"="!==r||e.kind!==parseInt(o))&&!("created_at"===n&&"<"===r&&e.created_at<parseInt(o)||"created_at"===n&&">"===r&&e.created_at>parseInt(o)))return null}let s=sha256$1(utf8Encoder.encode(`nostr:delegation:${e.pubkey}:${r}`));return schnorr.verify(o,s,n)?n:null}__export(nip26_exports,{createDelegation:()=>createDelegation,getDelegator:()=>getDelegator});var nip27_exports={};__export(nip27_exports,{matchAll:()=>matchAll,regex:()=>regex,replaceAll:()=>replaceAll});var regex=()=>new RegExp(`\\b${NOSTR_URI_REGEX.source}\\b`,"g");function*matchAll(e){const t=e.matchAll(regex());for(const e of t)try{const[t,n]=e;yield{uri:t,value:n,decoded:decode(n),start:e.index,end:e.index+t.length}}catch(e){}}function replaceAll(e,t){return e.replaceAll(regex(),((e,n)=>t({uri:e,value:n,decoded:decode(n)})))}var nip28_exports={};__export(nip28_exports,{channelCreateEvent:()=>channelCreateEvent,channelHideMessageEvent:()=>channelHideMessageEvent,channelMessageEvent:()=>channelMessageEvent,channelMetadataEvent:()=>channelMetadataEvent,channelMuteUserEvent:()=>channelMuteUserEvent});var channelCreateEvent=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return finishEvent({kind:40,tags:[...e.tags??[]],content:n,created_at:e.created_at},t)},channelMetadataEvent=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return finishEvent({kind:41,tags:[["e",e.channel_create_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},channelMessageEvent=(e,t)=>{const n=[["e",e.channel_create_event_id,e.relay_url,"root"]];return e.reply_to_channel_message_event_id&&n.push(["e",e.reply_to_channel_message_event_id,e.relay_url,"reply"]),finishEvent({kind:42,tags:[...n,...e.tags??[]],content:e.content,created_at:e.created_at},t)},channelHideMessageEvent=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return finishEvent({kind:43,tags:[["e",e.channel_message_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},channelMuteUserEvent=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return finishEvent({kind:44,tags:[["p",e.pubkey_to_mute],...e.tags??[]],content:n,created_at:e.created_at},t)},nip39_exports={},_fetch2;__export(nip39_exports,{useFetchImplementation:()=>useFetchImplementation2,validateGithub:()=>validateGithub});try{_fetch2=fetch}catch{}function useFetchImplementation2(e){_fetch2=e}async function validateGithub(e,t,n){try{return await(await _fetch2(`https://gist.github.com/${t}/${n}/raw`)).text()===`Verifying that I control the following Nostr public key: ${e}`}catch(e){return!1}}var nip42_exports={};__export(nip42_exports,{authenticate:()=>authenticate});var authenticate=async({challenge:e,relay:t,sign:n})=>{const r={kind:22242,created_at:Math.floor(Date.now()/1e3),tags:[["relay",t.url],["challenge",e]],content:""};return t.auth(await n(r))},nip44_exports={};__export(nip44_exports,{decrypt:()=>decrypt2,encrypt:()=>encrypt2,utils:()=>utils});var utils={v2:{maxPlaintextSize:65408,minCiphertextSize:100,maxCiphertextSize:102400,getConversationKey:(e,t)=>secp256k1.getSharedSecret(e,"02"+t).subarray(1,33),getMessageKeys(e,t){const n=hkdf(sha256$1,e,t,"nip44-v2",76);return{encryption:n.subarray(0,32),nonce:n.subarray(32,44),auth:n.subarray(44,76)}},calcPadding(e){if(!Number.isSafeInteger(e)||e<0)throw new Error("expected positive integer");if(e<=32)return 32;const t=1<<Math.floor(Math.log2(e-1))+1,n=t<=256?32:t/8;return n*(Math.floor((e-1)/n)+1)},pad(e){const t=utf8Encoder.encode(e),n=t.length;if(n<1||n>=utils.v2.maxPlaintextSize)throw new Error("invalid plaintext length: must be between 1b and 64KB");const r=utils.v2.calcPadding(n),o=new Uint8Array(r-n),i=new Uint8Array(2);return new DataView(i.buffer).setUint16(0,n),concatBytes$1(i,t,o)},unpad(e){const t=new DataView(e.buffer).getUint16(0),n=e.subarray(2,2+t);if(0===t||n.length!==t||e.length!==2+utils.v2.calcPadding(t))throw new Error("invalid padding");return utf8Decoder.decode(n)}}};function encrypt2(e,t,n={}){const r=n.version??2;if(2!==r)throw new Error("unknown encryption version "+r);const o=n.salt??randomBytes$1(32);ensureBytes(o,32);const i=utils.v2.getMessageKeys(e,o),s=utils.v2.pad(t),a=chacha20(i.encryption,i.nonce,s),l=hmac(sha256$1,i.auth,a);return base64$1.encode(concatBytes$1(new Uint8Array([r]),o,a,l))}function decrypt2(e,t){const n=utils.v2;ensureBytes(e,32);const r=t.length;if(r<n.minCiphertextSize||r>=n.maxCiphertextSize)throw new Error("invalid ciphertext length: "+r);if("#"===t[0])throw new Error("unknown encryption version");let o;try{o=base64$1.decode(t)}catch(e){throw new Error("invalid base64: "+e.message)}const i=o.subarray(0,1)[0];if(2!==i)throw new Error("unknown encryption version "+i);const s=o.subarray(1,33),a=o.subarray(33,-32),l=o.subarray(-32),c=n.getMessageKeys(e,s);if(!equalBytes(hmac(sha256$1,c.auth,a),l))throw new Error("invalid MAC");const d=chacha20(c.encryption,c.nonce,a);return n.unpad(d)}var nip47_exports={};function parseConnectionString(e){const{pathname:t,searchParams:n}=new URL(e),r=t,o=n.get("relay"),i=n.get("secret");if(!r||!o||!i)throw new Error("invalid connection string");return{pubkey:r,relay:o,secret:i}}async function makeNwcRequestEvent({pubkey:e,secret:t,invoice:n}){const r={method:"pay_invoice",params:{invoice:n}},o=await encrypt(t,e,JSON.stringify(r));return finishEvent({kind:23194,created_at:Math.round(Date.now()/1e3),content:o,tags:[["p",e]]},t)}__export(nip47_exports,{makeNwcRequestEvent:()=>makeNwcRequestEvent,parseConnectionString:()=>parseConnectionString});var nip57_exports={},_fetch3;__export(nip57_exports,{getZapEndpoint:()=>getZapEndpoint,makeZapReceipt:()=>makeZapReceipt,makeZapRequest:()=>makeZapRequest,useFetchImplementation:()=>useFetchImplementation3,validateZapRequest:()=>validateZapRequest});try{_fetch3=fetch}catch{}function useFetchImplementation3(e){_fetch3=e}async function getZapEndpoint(e){try{let t="",{lud06:n,lud16:r}=JSON.parse(e.content);if(n){let{words:e}=bech32.decode(n,1e3),r=bech32.fromWords(e);t=utf8Decoder.decode(r)}else{if(!r)return null;{let[e,n]=r.split("@");t=`https://${n}/.well-known/lnurlp/${e}`}}let o=await _fetch3(t),i=await o.json();if(i.allowsNostr&&i.nostrPubkey)return i.callback}catch(e){}return null}function makeZapRequest({profile:e,event:t,amount:n,relays:r,comment:o=""}){if(!n)throw new Error("amount not given");if(!e)throw new Error("profile not given");let i={kind:9734,created_at:Math.round(Date.now()/1e3),content:o,tags:[["p",e],["amount",n.toString()],["relays",...r]]};return t&&i.tags.push(["e",t]),i}function validateZapRequest(e){let t;try{t=JSON.parse(e)}catch(e){return"Invalid zap request JSON."}if(!validateEvent(t))return"Zap request is not a valid Nostr event.";if(!verifySignature(t))return"Invalid signature on zap request.";let n=t.tags.find((([e,t])=>"p"===e&&t));if(!n)return"Zap request doesn't have a 'p' tag.";if(!n[1].match(/^[a-f0-9]{64}$/))return"Zap request 'p' tag is not valid hex.";let r=t.tags.find((([e,t])=>"e"===e&&t));return r&&!r[1].match(/^[a-f0-9]{64}$/)?"Zap request 'e' tag is not valid hex.":t.tags.find((([e,t])=>"relays"===e&&t))?null:"Zap request doesn't have a 'relays' tag."}function makeZapReceipt({zapRequest:e,preimage:t,bolt11:n,paidAt:r}){let o=JSON.parse(e).tags.filter((([e])=>"e"===e||"p"===e||"a"===e)),i={kind:9735,created_at:Math.round(r.getTime()/1e3),content:"",tags:[...o,["bolt11",n],["description",e]]};return t&&i.tags.push(["preimage",t]),i}var nip98_exports={};__export(nip98_exports,{getToken:()=>getToken,unpackEventFromToken:()=>unpackEventFromToken,validateEvent:()=>validateEvent2,validateToken:()=>validateToken});var _authorizationScheme="Nostr ";async function getToken(e,t,n,r=!1){if(!e||!t)throw new Error("Missing loginUrl or httpMethod");const o=getBlankEvent(27235);o.tags=[["u",e],["method",t]],o.created_at=Math.round((new Date).getTime()/1e3);const i=await n(o);return(r?_authorizationScheme:"")+base64$1.encode(utf8Encoder.encode(JSON.stringify(i)))}async function validateToken(e,t,n){const r=await unpackEventFromToken(e).catch((e=>{throw e}));return await validateEvent2(r,t,n).catch((e=>{throw e}))}async function unpackEventFromToken(e){if(!e)throw new Error("Missing token");e=e.replace(_authorizationScheme,"");const t=utf8Decoder.decode(base64$1.decode(e));if(!t||0===t.length||!t.startsWith("{"))throw new Error("Invalid token");return JSON.parse(t)}async function validateEvent2(e,t,n){if(!e)throw new Error("Invalid nostr event");if(!verifySignature(e))throw new Error("Invalid nostr event, signature invalid");if(27235!==e.kind)throw new Error("Invalid nostr event, kind invalid");if(!e.created_at)throw new Error("Invalid nostr event, created_at invalid");if(Math.round((new Date).getTime()/1e3)-e.created_at>60)throw new Error("Invalid nostr event, expired");const r=e.tags.find((e=>"u"===e[0]));if(1!==r?.length&&r?.[1]!==t)throw new Error("Invalid nostr event, url tag invalid");const o=e.tags.find((e=>"method"===e[0]));if(1!==o?.length&&o?.[1].toLowerCase()!==n.toLowerCase())throw new Error("Invalid nostr event, method tag invalid");return!0}const LOCAL_STORE_KEY="__nostrlogin_nip46",LOGGED_IN_ACCOUNTS="__nostrlogin_accounts",RECENT_ACCOUNTS="__nostrlogin_recent",OUTBOX_RELAYS=["wss://purplepag.es","wss://relay.nos.social","wss://user.kindpag.es","wss://relay.damus.io","wss://nos.lol"],DEFAULT_SIGNUP_RELAYS=["wss://relay.damus.io/","wss://nos.lol/","wss://relay.primal.net/"],localStorageSetItem=(e,t)=>{localStorage.setItem(e,t)},localStorageGetItem=e=>{const t=window.localStorage.getItem(e);if(t)try{return JSON.parse(t)}catch{}return null},localStorageRemoveItem=e=>{localStorage.removeItem(e)},fetchProfile=async(e,t)=>{if(t&&"function"==typeof t.fetchEvents)try{const n=t.getUser({pubkey:e.pubkey});return n.ndk=t,await n.fetchProfile()}catch(e){}const n=Array.isArray(t)&&t.length?t:DEFAULT_SIGNUP_RELAYS,r=(new SimplePool).sub(n,[{kinds:[0],authors:[e.pubkey],limit:1}]);return await new Promise((e=>{const t=setTimeout((()=>{try{r.unsub()}catch{}e(null)}),3e3);r.on("event",(n=>{clearTimeout(t);try{r.unsub()}catch{}if(!n||!n.content)return e(null);try{const t=JSON.parse(n.content);e(t)}catch(t){e(null)}})),r.on("eose",(()=>{clearTimeout(t);try{r.unsub()}catch{}e(null)}))}))},prepareSignupRelays=e=>{const t=(e||"").split(",").map((e=>e.trim())).filter((e=>e.startsWith("ws")));return t.length||t.push(...DEFAULT_SIGNUP_RELAYS),t},createProfile=async(e,t,n,r)=>{const o={name:e.name},i={kind:0,created_at:Math.floor(Date.now()/1e3),pubkey:e.pubkey,content:JSON.stringify(o),tags:[]};window.location.hostname&&i.tags.push(["client",window.location.hostname]);const s={kind:10002,created_at:Math.floor(Date.now()/1e3),pubkey:e.pubkey,content:"",tags:[]},a=prepareSignupRelays(n);for(const e of a)s.tags.push(["r",e]);await t.sign(i),console.log("signed profile",i),await t.sign(s),console.log("signed relays",s);const l=r&&r.length?r:OUTBOX_RELAYS,c=new SimplePool;await Promise.any(c.publish(l,i)),console.log("published profile",i),await Promise.any(c.publish(l,s)),console.log("published relays",s)},bunkerUrlToInfo=(e,t="")=>{const n=new URL(e);return{pubkey:"",signerPubkey:n.hostname||n.pathname.split("//")[1],sk:t||generatePrivateKey(),relays:n.searchParams.getAll("relay"),token:n.searchParams.get("secret")||"",authMethod:"connect"}},isBunkerUrl=e=>e.startsWith("bunker://"),getBunkerUrl=async(e,t)=>{if(!e)return"";if(isBunkerUrl(e))return e;if(e.includes("@")){const[n,r]=e.toLocaleLowerCase().split("@"),o=t.devOverrideBunkerOrigin||`https://${r}`,i=`${o}/.well-known/nostr.json?name=_`,s=`${o}/.well-known/nostr.json?name=${n}`,a=await fetch(i),l=await a.json(),c=l.names._,d=l.nip46[c],h=await fetch(s),u=(await h.json()).names[n];if(!d||0===d.length)throw new Error("Bunker relay not provided");return`bunker://${u}?${d.map((e=>`relay=${encodeURIComponent(e)}`)).join("&")}`}throw new Error("Invalid user name or bunker url")},checkNip05=async e=>{let t=!1,n="",r="";return await(async()=>{if(!e||!e.includes("@"))return;const[o,i]=e.toLocaleLowerCase().split("@");if(!o)return;if(!new RegExp(/^[\w-.]+@([\w-]+\.)+[\w-]{2,8}$/g).test(e))return void(n="Invalid name");if(!i)return void(n="Select service");const s=`https://${i}/.well-known/nostr.json?name=${o.toLowerCase()}`;try{const e=await fetch(s),t=await e.json();if(t.names[o])return void(r=t.names[o])}catch{}t=!0})(),{available:t,taken:""!=r,error:n,pubkey:r}},upgradeInfo=e=>{"typeAuthMethod"in e&&delete e.typeAuthMethod,e.authMethod||("extension"in e&&e.extension?e.authMethod="extension":"readOnly"in e&&e.readOnly?e.authMethod="readOnly":e.authMethod="connect"),e.nip05&&isBunkerUrl(e.nip05)&&(e.bunkerUrl=e.nip05,e.nip05=""),"connect"!==e.authMethod||e.signerPubkey||(e.signerPubkey=e.pubkey),"amber"===e.authMethod&&(e.signerPubkey||(e.signerPubkey=""),e.relays||(e.relays=[]))},localStorageAddAccount=e=>{localStorageSetItem(LOCAL_STORE_KEY,JSON.stringify(e));const t=localStorageGetItem(LOGGED_IN_ACCOUNTS)||[],n=localStorageGetItem(RECENT_ACCOUNTS)||[];t.forEach((e=>upgradeInfo(e))),n.forEach((e=>upgradeInfo(e)));const r=t,o=t.findIndex((t=>t.pubkey===e.pubkey&&t.authMethod===e.authMethod));-1!==o?r[o]=e:r.push(e);const i=n.filter((t=>t.pubkey!==e.pubkey||t.authMethod!==e.authMethod));localStorageSetItem(RECENT_ACCOUNTS,JSON.stringify(i)),localStorageSetItem(LOGGED_IN_ACCOUNTS,JSON.stringify(r))},localStorageRemoveCurrentAccount=()=>{const e=localStorageGetItem(LOCAL_STORE_KEY);if(!e)return;upgradeInfo(e);const t={...e};delete t.sk,delete t.otpData;const n=localStorageGetItem(LOGGED_IN_ACCOUNTS)||[],r=localStorageGetItem(RECENT_ACCOUNTS)||[];n.forEach((e=>upgradeInfo(e))),r.forEach((e=>upgradeInfo(e)));const o=r;if("connect"===t.authMethod&&t.bunkerUrl&&t.bunkerUrl.includes("secret="))console.log("nostr login bunker conn with a secret not saved to recent");else if("local"===t.authMethod)console.log("nostr login temporary local keys not save to recent");else{const e=r.findIndex((e=>e.pubkey===t.pubkey&&e.authMethod===t.authMethod));-1!==e?o[e]=t:o.push(t)}const i=n.filter((t=>t.pubkey!==e.pubkey||t.authMethod!==e.authMethod));localStorageSetItem(RECENT_ACCOUNTS,JSON.stringify(o)),localStorageSetItem(LOGGED_IN_ACCOUNTS,JSON.stringify(i)),localStorageRemoveItem(LOCAL_STORE_KEY)},localStorageRemoveRecent=e=>{const t=localStorageGetItem(RECENT_ACCOUNTS)||[];t.forEach((e=>upgradeInfo(e)));const n=t.filter((t=>t.pubkey!==e.pubkey||t.authMethod!==e.authMethod));localStorageSetItem(RECENT_ACCOUNTS,JSON.stringify(n))},localStorageGetRecents=()=>{const e=localStorageGetItem(RECENT_ACCOUNTS)||[];return e.forEach((e=>upgradeInfo(e))),e},localStorageGetAccounts=()=>{const e=localStorageGetItem(LOGGED_IN_ACCOUNTS)||[];return e.forEach((e=>upgradeInfo(e))),e},localStorageGetCurrent=()=>{const e=localStorageGetItem(LOCAL_STORE_KEY);return e&&upgradeInfo(e),e},getDarkMode=e=>{const t=localStorage.getItem("nl-dark-mode");return t?Boolean(JSON.parse(t)):void 0!==e.darkMode?e.darkMode:!(!window.matchMedia||!window.matchMedia("(prefers-color-scheme: dark)").matches)},getIcon=async()=>document.location.origin+"/favicon.ico";class NostrRpc extends lib.EventEmitter{localSigner;localPubkey;localPrivateKey;remotePubkey="";pool;relays=[];subscription;isSubscribed=!1;useNip44=!1;requests=new Set;constructor(e,t=[]){super(),this.localSigner=e,this.localPubkey=e.pubkey,this.localPrivateKey=e.privateKey,this.pool=new SimplePool,this.relays=t&&t.length?t:[]}setUseNip44(e){this.useNip44=e}isNip04(e){const t=e.length;return!(t<28)&&("?"===e[t-28]&&"i"===e[t-27]&&"v"===e[t-26]&&"="===e[t-25])}async decryptEventContent(e){const t=this.isNip04(e.content)?this.localSigner.decrypt.bind(this.localSigner):this.localSigner.decryptNip44?.bind(this.localSigner)??this.localSigner.decrypt.bind(this.localSigner);try{const n=await t(e.pubkey||e.pubkey,e.content);return JSON.parse(n)}catch(e){throw e}}async parseEvent(e){const t=await this.decryptEventContent(e),{id:n,method:r,params:o,result:i,error:s}=t;return r?{id:n,pubkey:e.pubkey,method:r,params:o,event:e}:{id:n,result:i,error:s,event:e}}subscribe(e,t){if(this.isSubscribed)return;this.relays=e&&e.length?e:this.relays;const n=[{...t,since:Math.floor(Date.now()/1e3)-60}];this.subscription=this.pool.sub(this.relays,n),this.subscription.on("event",(async e=>{try{const t=await this.parseEvent(e);t.method?this.emit("request",t):this.emit(`response-${t.id}`,t)}catch(e){}})),this.subscription.on("eose",(()=>{})),this.isSubscribed=!0}stop(){if(this.subscription&&this.subscription.unsub)try{this.subscription.unsub()}catch(e){}this.isSubscribed=!1}getId(){return Math.random().toString(36).substring(7)}setResponseHandler(e,t){let n=!1;const r=o=>{"auth_url"===o.result?(this.once(`response-${e}`,r),n||(n=!0,this.emit("authUrl",o.error))):t&&this.requests.has(e)&&(this.requests.delete(e),t(o))};this.once(`response-${e}`,r)}async createRequestEvent(e,t,n,r=[],o=24133){this.requests.add(e);const i={id:e,method:n,params:r},s={kind:o,content:this.useNip44&&"create_account"!==n&&this.localSigner.encryptNip44?await this.localSigner.encryptNip44(t,JSON.stringify(i)):await this.localSigner.encrypt(t,JSON.stringify(i)),tags:[["p",t]],pubkey:this.localPubkey,created_at:Math.floor(Date.now()/1e3)};return await this.localSigner.sign(s),s}async publishRequest(e){try{await Promise.any(this.pool.publish(this.relays,e))}catch(e){}}async sendRequest(e,t,n=[],r=24133,o){const i=this.getId();this.setResponseHandler(i,o);const s=await this.createRequestEvent(i,e,t,n,r);await this.publishRequest(s)}async listen(e,t){const n=this.localPubkey;return this.subscribe(t||this.relays,{kinds:[24133],"#p":[n]}),new Promise(((t,n)=>{this.once("request",(async r=>{try{const o=await this.parseEvent(r);if("auth_url"===o.result)return;const i=o;"ack"===i.result||i.result===e?(t(r.pubkey),this.stop()):(n(i.error),this.stop())}catch(e){}}))}))}}class IframeNostrRpc extends NostrRpc{peerOrigin;iframePort;iframeRequests=new Map;constructor(e,t,n=[]){super(e,n),this.peerOrigin=t}setWorkerIframePort(e){if(!this.peerOrigin)throw new Error("Unexpected iframe port");this.iframePort=e,setInterval((()=>{try{this.iframePort.postMessage("ping")}catch(e){}}),5e3),this.iframePort.onmessage=async e=>{if("string"==typeof e.data&&e.data.startsWith("errorNoKey")){const t=e.data.split(":")[1],n=this.iframeRequests.get(t)||{id:"",pubkey:""},{id:r="",pubkey:o=""}=n;r&&o&&this.requests.has(r)&&this.emit(`iframeRestart-${o}`)}else try{const t=e.data;if(!validateEvent(t))throw new Error("Invalid event from iframe");if(!verifySignature(t))throw new Error("Invalid event signature from iframe");const n=await this.parseEvent(t);n.method||this.emit(`response-${n.id}`,n)}catch(e){}}}async sendRequest(e,t,n=[],r=24133,o){const i=this.getId();this.setResponseHandler(i,o);const s=await this.createRequestEvent(i,e,t,n,r);if(this.iframeRequests.set(s.id,{id:i,pubkey:e}),this.iframePort)try{this.iframePort.postMessage(s)}catch(e){await this.publishRequest(s)}else await this.publishRequest(s)}}class ReadyListener{origin;messages;promise;constructor(e,t){this.origin=t,this.messages=e,this.promise=new Promise((e=>{const n=async r=>{const o=new URL(t).hostname,i=new URL(r.origin).hostname;(i===o||i.endsWith("."+o))&&Array.isArray(r.data)&&r.data.length&&this.messages.includes(r.data[0])&&(window.removeEventListener("message",n),e(r.data))};window.addEventListener("message",n)}))}async wait(){return await this.promise}}class Nip46Signer extends lib.EventEmitter{_userPubkey="";remotePubkey="";rpc;localSigner;constructor(e,t,n,r=[]){super(),this.remotePubkey=t,this.localSigner=e,this.rpc=n?new IframeNostrRpc(e,n,r):new NostrRpc(e,r),this.rpc.setUseNip44(!0),this.rpc.on("authUrl",(e=>{this.emit("authUrl",e)}))}get userPubkey(){return this._userPubkey}async setSignerPubkey(e,t=!1){this.remotePubkey=e,this.rpc.on(`iframeRestart-${e}`,(()=>{this.emit("iframeRestart")})),await this.initUserPubkey(t?e:"")}async initUserPubkey(e){if(this._userPubkey)throw new Error("Already called initUserPubkey");this._userPubkey=e||await new Promise(((e,t)=>{if(!this.remotePubkey)throw new Error("Signer pubkey not set");this.rpc.sendRequest(this.remotePubkey,"get_public_key",[],24133,(n=>{if(n.error)return t(n.error);e(n.result)}))}))}async listen(e){const t=await this.rpc.listen(e,this.rpc.relays);await this.setSignerPubkey(t)}async connect(e,t){if(!this.remotePubkey)throw new Error("No signer pubkey");return new Promise(((n,r)=>{const o=[this.localSigner.pubkey,e||"",t||""];this.rpc.sendRequest(this.remotePubkey,"connect",o,24133,(e=>{"ack"===e.result?n():r(e.error)}))}))}async createAccount2(e){return new Promise(((t,n)=>{this.rpc.sendRequest(this.remotePubkey,"create_account",[e],24133,(e=>{e.error?n(e.error):t(e.result)}))}))}async encrypt(e,t){return this.localSigner.encrypt(e,t)}async decrypt(e,t){return this.localSigner.decrypt(e,t)}async sign(e){return await this.localSigner.sign(e),e.sig}}class BannerManager extends lib.EventEmitter{banner=null;iframeReady;params;constructor(e){super(),this.params=e}onAuthUrl(e,t){this.banner&&(this.banner.notify=e?{mode:t?"iframeAuthUrl":"authUrl",url:e}:{mode:""})}onIframeRestart(e){this.banner&&(this.iframeReady=new ReadyListener(["rebinderDone","rebinderError"],new URL(e).origin),this.banner.notify={mode:"rebind",url:e})}onUserInfo(e){this.banner&&(this.banner.userInfo=e)}onCallTimeout(){this.banner&&(this.banner.notify={mode:"timeout"})}onCallStart(){this.banner&&(this.banner.isLoading=!0)}async onCallEnd(){this.banner&&(this.iframeReady&&(await this.iframeReady.wait(),this.iframeReady=void 0),this.banner.isLoading=!1,this.banner.notify={mode:""})}onUpdateAccounts(e){this.banner&&(this.banner.accounts=e)}onDarkMode(e){this.banner&&(this.banner.darkMode=e)}launchAuthBanner(e){this.banner=document.createElement("nl-banner"),this.banner.setAttribute("dark-mode",String(getDarkMode(e))),e.theme&&this.banner.setAttribute("theme",e.theme),e.noBanner&&this.banner.setAttribute("hidden-mode","true"),this.banner.addEventListener("handleLoginBanner",(e=>{this.emit("launch",e.detail)})),this.banner.addEventListener("handleConfirmLogout",(()=>{this.emit("onConfirmLogout")})),this.banner.addEventListener("handleLogoutBanner",(async()=>{this.emit("logout")})),this.banner.addEventListener("handleImportModal",(e=>{this.emit("import")})),this.banner.addEventListener("handleNotifyConfirmBanner",(e=>{this.emit("onAuthUrlClick",e.detail)})),this.banner.addEventListener("handleNotifyConfirmBannerIframe",(e=>{this.emit("onIframeAuthUrlClick",e.detail)})),this.banner.addEventListener("handleSwitchAccount",(e=>{this.emit("onSwitchAccount",e.detail)})),this.banner.addEventListener("handleOpenWelcomeModal",(()=>{this.emit("launch"),this.banner&&(this.banner.isOpen=!1)})),document.body.appendChild(this.banner)}}function extract(e,t,n){return hash$1(e),hmac$1(e,toBytes$1(n),toBytes$1(t))}const HKDF_COUNTER=new Uint8Array([0]),EMPTY_BUFFER=new Uint8Array;function expand(e,t,n,r=32){if(hash$1(e),number$1(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const o=Math.ceil(r/e.outputLen);void 0===n&&(n=EMPTY_BUFFER);const i=new Uint8Array(o*e.outputLen),s=hmac$1.create(e,t),a=s._cloneInto(),l=new Uint8Array(s.outputLen);for(let t=0;t<o;t++)HKDF_COUNTER[0]=t+1,a.update(0===t?EMPTY_BUFFER:l).update(n).update(HKDF_COUNTER).digestInto(l),i.set(l,e.outputLen*t),s._cloneInto(a);return s.destroy(),a.destroy(),l.fill(0),HKDF_COUNTER.fill(0),i.slice(0,r)}const decoder=new TextDecoder,u={minPlaintextSize:1,maxPlaintextSize:65535,utf8Encode:utf8ToBytes$1,utf8Decode:e=>decoder.decode(e),getConversationKey(e,t){const n=secp256k1.getSharedSecret(e,"02"+t).subarray(1,33);return extract(sha256,n,"nip44-v2")},getMessageKeys(e,t){const n=expand(sha256,e,t,76);return{chacha_key:n.subarray(0,32),chacha_nonce:n.subarray(32,44),hmac_key:n.subarray(44,76)}},calcPaddedLen(e){if(!Number.isSafeInteger(e)||e<1)throw new Error("expected positive integer");if(e<=32)return 32;const t=1<<Math.floor(Math.log2(e-1))+1,n=t<=256?32:t/8;return n*(Math.floor((e-1)/n)+1)},writeU16BE(e){if(!Number.isSafeInteger(e)||e<u.minPlaintextSize||e>u.maxPlaintextSize)throw new Error("invalid plaintext size: must be between 1 and 65535 bytes");const t=new Uint8Array(2);return new DataView(t.buffer).setUint16(0,e,!1),t},pad(e){const t=u.utf8Encode(e),n=t.length;return concatBytes(u.writeU16BE(n),t,new Uint8Array(u.calcPaddedLen(n)-n))},unpad(e){const t=new DataView(e.buffer).getUint16(0),n=e.subarray(2,2+t);if(t<u.minPlaintextSize||t>u.maxPlaintextSize||n.length!==t||e.length!==2+u.calcPaddedLen(t))throw new Error("invalid padding");return u.utf8Decode(n)},hmacAad(e,t,n){if(32!==n.length)throw new Error("AAD associated data must be 32 bytes");const r=concatBytes(n,t);return hmac$1(sha256,e,r)},decodePayload(e){if("string"!=typeof e)throw new Error("payload must be a valid string");const t=e.length;if(t<132||t>87472)throw new Error("invalid payload length: "+t);if("#"===e[0])throw new Error("unknown encryption version");let n;try{n=base64.decode(e)}catch(e){throw new Error("invalid base64: "+e.message)}const r=n.length;if(r<99||r>65603)throw new Error("invalid data length: "+r);const o=n[0];if(2!==o)throw new Error("unknown encryption version "+o);return{nonce:n.subarray(1,33),ciphertext:n.subarray(33,-32),mac:n.subarray(-32)}}};function encryptNip44(e,t,n=randomBytes(32)){const{chacha_key:r,chacha_nonce:o,hmac_key:i}=u.getMessageKeys(t,n),s=u.pad(e),a=chacha20(r,o,s),l=u.hmacAad(i,a,n);return base64.encode(concatBytes(new Uint8Array([2]),n,a,l))}function decryptNip44(e,t){const{nonce:n,ciphertext:r,mac:o}=u.decodePayload(e),{chacha_key:i,chacha_nonce:s,hmac_key:a}=u.getMessageKeys(t,n);if(!equalBytes(u.hmacAad(a,r,n),o))throw new Error("invalid MAC");const l=chacha20(i,s,r);return u.unpad(l)}class Nip44{cache=new Map;createKey(e,t){return u.getConversationKey(e,t)}getKey(e,t,n){const r=getPublicKey(e)+t;let o=this.cache.get(r);if(o)return o;const i=this.createKey(e,t);return this.cache.set(r,i),i}encrypt(e,t,n){return encryptNip44(n,this.getKey(e,t))}decrypt(e,t,n){return decryptNip44(n,this.getKey(e,t))}}class Nip46Client extends lib.EventEmitter{pool;localPrivateKey;remotePubkey;relays;pendingRequests=new Map;defaultTimeoutMs;useNip44;subscription=null;isSubscribed=!1;nip44Codec=new Nip44;iframeConfig;retryConfig;iframeKeepaliveInterval;constructor(e){super(),this.pool=new SimplePool,this.localPrivateKey=e.localPrivateKey,this.remotePubkey=e.remotePubkey,this.relays=e.relays,this.defaultTimeoutMs=e.timeoutMs||3e4,this.useNip44=e.useNip44||!1,this.iframeConfig=e.iframeConfig,this.retryConfig=e.retryConfig||{maxRetries:3,retryDelayMs:1e3},this.iframeConfig?.port&&this.setupIframePort(this.iframeConfig.port)}get localPubkey(){return getPublicKey(this.localPrivateKey)}async sendRequest(e,t=[],n){let r=null;for(let o=0;o<=this.retryConfig.maxRetries;o++)try{if(o>0){const t=this.retryConfig.retryDelayMs*o;console.log(`[Nip46Client] Retry attempt ${o}/${this.retryConfig.maxRetries} for ${e} after ${t}ms`),await new Promise((e=>setTimeout(e,t)))}return await this.sendRequestInternal(e,t,n)}catch(e){r=e;if(!(e.message.includes("timed out")||e.message.includes("network")||e.message.includes("publish"))||o===this.retryConfig.maxRetries)throw console.error(`[Nip46Client] Request failed after ${o+1} attempts:`,e.message),e}throw r||new Error("Request failed after retries")}async sendRequestInternal(e,t=[],n){const r=n||this.defaultTimeoutMs,o=this.generateId(),i={id:o,method:e,params:t};return console.log("[Nip46Client] Sending request:",{id:o,method:e,params:t}),this.isSubscribed||this.subscribeToResponses(),await this.publishRequest(i),new Promise(((t,n)=>{const i=setTimeout((()=>{this.pendingRequests.delete(o);const t=new Error(`Request ${o} (${e}) timed out after ${r}ms`);console.error("[Nip46Client]",t.message),n(t)}),r);this.pendingRequests.set(o,{resolve:t,reject:n,timer:i,method:e})}))}async publishRequest(e){const t=JSON.stringify(e),n=this.useNip44?await this.nip44Codec.encrypt(this.localPrivateKey,this.remotePubkey,t):await nip04_exports.encrypt(this.localPrivateKey,this.remotePubkey,t),r={kind:24133,pubkey:this.localPubkey,created_at:Math.floor(Date.now()/1e3),tags:[["p",this.remotePubkey]],content:n,id:"",sig:""};if(r.id=getEventHash(r),r.sig=getSignature(r,this.localPrivateKey),this.iframeConfig?.port)try{return this.iframeConfig.port.postMessage(r),void console.log("[Nip46Client] Request sent via iframe:",e.id)}catch(e){console.warn("[Nip46Client] Iframe send failed, falling back to relays:",e)}try{await Promise.any(this.pool.publish(this.relays,r)),console.log("[Nip46Client] Request published to relays:",e.id)}catch(e){throw console.error("[Nip46Client] Failed to publish to relays:",e),new Error("Failed to publish request to relays")}}subscribeToResponses(){if(this.isSubscribed)return;const e={kinds:[24133],"#p":[this.localPubkey],since:Math.floor(Date.now()/1e3)-60};console.log("[Nip46Client] Subscribing to responses"),this.subscription=this.pool.sub(this.relays,[e]),this.subscription.on("event",(async e=>{await this.handleResponseEvent(e)})),this.subscription.on("eose",(()=>{console.log("[Nip46Client] EOSE received")})),this.isSubscribed=!0}async handleResponseEvent(e){try{const t=this.isNip04(e.content)?await nip04_exports.decrypt(this.localPrivateKey,e.pubkey,e.content):await this.nip44Codec.decrypt(this.localPrivateKey,e.pubkey,e.content),n=JSON.parse(t);if(console.log("[Nip46Client] Response received:",{id:n.id,hasResult:!!n.result,hasError:!!n.error}),this.emit("response",{response:n,pubkey:e.pubkey}),"auth_url"===n.result)return console.log("[Nip46Client] Auth URL received:",n.error),void this.emit("authUrl",n.error);const r=this.pendingRequests.get(n.id);r?(clearTimeout(r.timer),this.pendingRequests.delete(n.id),n.error?(console.error("[Nip46Client] Request failed:",{id:n.id,method:r.method,error:n.error}),r.reject(new Error(n.error))):void 0!==n.result?(console.log("[Nip46Client] Request succeeded:",{id:n.id,method:r.method}),r.resolve(n.result)):r.reject(new Error("Invalid response: no result or error"))):console.warn("[Nip46Client] Received response for unknown request:",n.id)}catch(e){console.error("[Nip46Client] Failed to parse response event:",e)}}isNip04(e){const t=e.length;return!(t<28)&&("?"===e[t-28]&&"i"===e[t-27]&&"v"===e[t-26]&&"="===e[t-25])}generateId(){return Math.random().toString(36).substring(2,15)}setUseNip44(e){this.useNip44=e}cleanup(){console.log("[Nip46Client] Cleaning up");for(const[e,t]of this.pendingRequests)clearTimeout(t.timer),t.reject(new Error("Client cleanup"));if(this.pendingRequests.clear(),this.subscription){try{"function"==typeof this.subscription.unsub&&this.subscription.unsub(),"function"==typeof this.subscription.close&&this.subscription.close()}catch(e){}this.subscription=null,this.isSubscribed=!1}this.iframeKeepaliveInterval&&(clearInterval(this.iframeKeepaliveInterval),this.iframeKeepaliveInterval=void 0),this.pool.close(this.relays),this.removeAllListeners()}isConnected(){return this.isSubscribed}setIframePort(e){if(!this.iframeConfig)throw new Error("Iframe config not set");this.iframeConfig.port=e,this.setupIframePort(e)}setupIframePort(e){e.onmessage=async e=>{if("ping"!==e.data)try{const t=e.data;if(!t||"object"!=typeof t)return void console.warn("[Nip46Client] Invalid message from iframe");await this.handleResponseEvent(t)}catch(e){console.error("[Nip46Client] Iframe message error:",e)}},this.iframeKeepaliveInterval=setInterval((()=>{try{e.postMessage("ping")}catch(e){console.warn("[Nip46Client] Failed to send keepalive ping:",e)}}),5e3),console.log("[Nip46Client] Iframe port setup complete")}}class Nip46Adapter extends lib.EventEmitter{client;localSigner;userPubkey="";remotePubkey;constructor(e,t){super(),this.client=e,this.localSigner=t,this.remotePubkey=e.remotePubkey||"",this.client.on("authUrl",(e=>{this.emit("authUrl",e)})),this.client.on("response",(({response:e,pubkey:t})=>{this.emit("response",e,t)}))}async initUserPubkey(e){if(this.userPubkey)throw new Error("Already called initUserPubkey");if(e)return this.userPubkey=e,void console.log("[Nip46Adapter] User pubkey set from hint:",e);console.log("[Nip46Adapter] Fetching user pubkey");try{const e=await this.client.sendRequest("get_public_key",[]);if(!e)throw new Error("No public key returned");this.userPubkey=e,console.log("[Nip46Adapter] User pubkey fetched:",e)}catch(e){throw console.error("[Nip46Adapter] Failed to get user pubkey:",e.message),e}}async listen(e,t=6e4){return console.log("[Nip46Adapter] Starting listen mode, timeout:",t),new Promise(((n,r)=>{const o=setTimeout((()=>{i();const e=new Error(`Listen timeout after ${t}ms`);console.error("[Nip46Adapter]",e.message),r(e)}),t),i=()=>{clearTimeout(o),this.client.off("response",s)},s=({response:t,pubkey:o})=>{t&&"auth_url"!==t.result&&("ack"===t.result||t.result===e?(i(),console.log("[Nip46Adapter] Listen succeeded, signer pubkey:",o),n(o)):t.error&&(i(),console.error("[Nip46Adapter] Listen failed:",t.error),r(new Error(t.error))))};this.client.on("response",s)}))}async connect(e,t,n=3e4){console.log("[Nip46Adapter] Connecting with token, timeout:",n);try{const r=await this.client.sendRequest("connect",[this.localSigner.pubkey,e||"",t||""],n);if("ack"!==r)throw new Error(`Connect failed: ${r||"unknown error"}`);console.log("[Nip46Adapter] Connected successfully")}catch(e){throw console.error("[Nip46Adapter] Connect failed:",e.message),e}}async setListenReply(e,t){try{const n=e&&e.content?JSON.parse(e.content):null;if(!n)throw new Error("Bad reply");if(n.result!==t)throw new Error("Bad reply");this.userPubkey=e.pubkey}catch(e){throw new Error("Failed to set listen reply")}}async createAccount2({bunkerPubkey:e,name:t,domain:n,perms:r=""}){const o=[t,n,"",r];console.log("[Nip46Adapter] Creating account:",{name:t,domain:n});try{const e=await this.client.sendRequest("create_account",o);if(!e)throw new Error("create_account returned empty result");if("error"===e)throw new Error("create_account failed");return console.log("[Nip46Adapter] Account created successfully"),e}catch(e){throw console.error("[Nip46Adapter] Failed to create account:",e.message),e}}async encrypt(e,t){return await this.client.sendRequest("nip04_encrypt",[e,t])}async decrypt(e,t){return await this.client.sendRequest("nip04_decrypt",[e,t])}async sign(e){try{const t=await this.client.sendRequest("sign_event",[JSON.stringify(e)]);try{const e="string"==typeof t?JSON.parse(t):t;if(e&&e.sig)return e.sig}catch(e){}return t}catch(e){throw console.error("[Nip46Adapter] Failed to sign event:",e.message),e}}get rpc(){return{sendRequest:async(e,t,n,r,o)=>{try{o({result:await this.client.sendRequest(t,n)})}catch(e){o({error:e.message})}}}}}class PrivateKeySigner{nip44=new Nip44;_pubkey;privateKey;constructor(e){this.privateKey=e,this._pubkey=getPublicKey(e)}get pubkey(){return this._pubkey}async blockUntilReady(){return Promise.resolve()}async user(){return{pubkey:this.pubkey}}async sign(e){e.created_at||(e.created_at=Math.floor(Date.now()/1e3));const t=getEventHash(e);e.id=t;const n=getSignature(e,this.privateKey);return e.sig=n,n}async encrypt(e,t){const n="string"==typeof e?e:e.pubkey;return nip04_exports.encrypt(this.privateKey,n,t)}async decrypt(e,t){const n="string"==typeof e?e:e.pubkey;return nip04_exports.decrypt(this.privateKey,n,t)}encryptNip44(e,t){const n="string"==typeof e?e:e.pubkey;return Promise.resolve(this.nip44.encrypt(this.privateKey,n,t))}decryptNip44(e,t){const n="string"==typeof e?e:e.pubkey;return Promise.resolve(this.nip44.decrypt(this.privateKey,n,t))}}const DEFAULT_NOSTRCONNECT_RELAYS=["wss://relay.nsec.app/","wss://ephemeral.snowflare.cc/"],NOSTRCONNECT_APPS=[{name:"Nsec.app",domain:"nsec.app",canImport:!0,img:"https://nsec.app/assets/favicon.ico",link:"https://use.nsec.app/<nostrconnect>",relays:DEFAULT_NOSTRCONNECT_RELAYS},{name:"Amber",img:"https://raw.githubusercontent.com/greenart7c3/Amber/refs/heads/master/assets/android-icon.svg",link:"amber",relays:DEFAULT_NOSTRCONNECT_RELAYS},{name:"Other key stores",img:"",link:"<nostrconnect>",relays:DEFAULT_NOSTRCONNECT_RELAYS}];class AuthNostrService extends lib.EventEmitter{signer=null;localSigner=null;params;signerPromise;signerErrCallback;readyPromise;readyCallback;nip44Codec=new Nip44;nostrConnectKey="";nostrConnectSecret="";iframe;starterReady;nip04;nip44;constructor(e){super(),this.params=e,this.nip04={encrypt:this.encrypt04.bind(this),decrypt:this.decrypt04.bind(this)},this.nip44={encrypt:this.encrypt44.bind(this),decrypt:this.decrypt44.bind(this)},this.checkAndResumeAmberFlow()}isIframe(){return!!this.iframe}async waitReady(){if(this.signerPromise)try{await this.signerPromise}catch{}if(this.readyPromise)try{await this.readyPromise}catch{}}cancelNostrConnect(){this.releaseSigner(),this.resetAuth(),localStorage.removeItem("nostr-login-amber-pending")}async checkAndResumeAmberFlow(){try{const e=localStorage.getItem("nostr-login-amber-pending");if(!e)return;const{nostrConnectKey:t,nostrConnectSecret:n,relays:r,domain:o,timestamp:i}=JSON.parse(e);if(Date.now()-i>6e5)return console.log("[Amber] Pending flow expired, clearing"),void localStorage.removeItem("nostr-login-amber-pending");console.log("[Amber] Resuming pending flow from localStorage"),this.nostrConnectKey=t,this.nostrConnectSecret=n;const s={authMethod:"connect",pubkey:"",signerPubkey:"",sk:this.nostrConnectKey,domain:o,relays:r};await this.startAuth(),await this.initSigner(s,{listen:!0}),s.pubkey&&s.signerPubkey&&(s.bunkerUrl=`bunker://${s.signerPubkey}?${r.map(((e,t)=>`${0!==t?"&":""}relay=${e}`)).join("")}`,this.onAuth("login",s),await this.endAuth(),localStorage.removeItem("nostr-login-amber-pending"),console.log("[Amber] Flow resumed successfully"))}catch(e){console.error("[Amber] Failed to resume flow:",e),localStorage.removeItem("nostr-login-amber-pending")}}async nostrConnect(e,{domain:t="",link:n="",iframeUrl:r="",importConnect:o=!1}={}){e=e&&e.length>0?e:DEFAULT_NOSTRCONNECT_RELAYS;const i={authMethod:"connect",pubkey:"",signerPubkey:"",sk:this.nostrConnectKey,domain:t,relays:e,iframeUrl:r};if(console.log("nostrconnect info",i,n),n&&!r)if("amber"===n){const n=await this.createNostrConnect(e);console.log("Amber flow via NIP-46, opening:",n),localStorage.setItem("nostr-login-amber-pending",JSON.stringify({nostrConnectKey:this.nostrConnectKey,nostrConnectSecret:this.nostrConnectSecret,relays:e,domain:t,timestamp:Date.now()}));try{const e=`intent://${n.replace("nostrconnect://","")}#Intent;scheme=nostrconnect;package=com.greenart7c3.nostrsigner;end;`;window.open(e,"_system")||(window.location.href=n)}catch(e){window.location.href=n}}else window.open(n,"_blank","width=400,height=700");if(await this.initSigner(i,{listen:!0}),!i.pubkey||!i.signerPubkey)throw new Error("Bad remote pubkey");return i.bunkerUrl=`bunker://${i.signerPubkey}?${e.map(((e,t)=>`${0!==t?"&":""}relay=${e}`))}`,o||this.onAuth("login",i),i}async createNostrConnect(e){this.nostrConnectKey=generatePrivateKey(),this.nostrConnectSecret=Math.random().toString(36).substring(7);const t=getPublicKey(this.nostrConnectKey),n=encodeURIComponent(document.location.host),r=encodeURIComponent(document.location.origin);return`nostrconnect://${t}?image=${encodeURIComponent(await getIcon())}&url=${r}&name=${n}&perms=${encodeURIComponent(this.params.optionsModal.perms||"")}&secret=${this.nostrConnectSecret}${(e||[]).length>0?(e||[]).map(((e,t)=>`&relay=${e}`)).join(""):""}`}async getNostrConnectServices(){const e=await this.createNostrConnect(),t=NOSTRCONNECT_APPS.map((e=>({...e})));for(const n of t){let t=[...DEFAULT_NOSTRCONNECT_RELAYS];if(n.link.startsWith("https://")){const e=n.domain||new URL(n.link).hostname;try{const r=await(await fetch(`https://${e}/.well-known/nostr.json`)).json(),o=r.names._,i=r.nip46?.[o];Array.isArray(i)&&i.length>0&&(t=i),n.iframeUrl=r.nip46?.iframe_url||""}catch(e){console.log("Bad app info",e,n)}}const r=e+t.map((e=>e.replace(/['"]/g,""))).map((e=>`&relay=${encodeURIComponent(e)}`)).join("");n.iframeUrl?n.link=r:n.link=n.link.replace("<nostrconnect>",r)}return[e,t]}async localSignup(e,t){const n=!t,r={pubkey:getPublicKey(t=t||generatePrivateKey()),sk:t,name:e,authMethod:"local"};console.log(`localSignup name: ${e}`),await this.setLocal(r,n)}async setLocal(e,t){this.releaseSigner(),this.localSigner=new PrivateKeySigner(e.sk),t&&await createProfile(e,this.localSigner,this.params.optionsModal.signupRelays,this.params.optionsModal.outboxRelays),this.onAuth(t?"signup":"login",e)}prepareImportUrl(e){if("otp"===this.params.userInfo?.authMethod)return e+"&import=true";if(!this.localSigner||"local"!==this.params.userInfo?.authMethod)throw new Error("Most be local keys");return e+"#import="+nip19_exports.nsecEncode(this.localSigner.privateKey)}async importAndConnect(e){const{relays:t,domain:n,link:r,iframeUrl:o}=e;if(!n)throw new Error("Domain required");const i=await this.nostrConnect(t,{domain:n,link:r,importConnect:!0,iframeUrl:o});await this.logout(!0),this.localSigner=null,this.onAuth("login",i)}setReadOnly(e){const t={pubkey:e,authMethod:"readOnly"};this.onAuth("login",t)}setExtension(e){const t={pubkey:e,authMethod:"extension"};this.onAuth("login",t)}setOTP(e,t){const n={pubkey:e,authMethod:"otp",otpData:t};this.onAuth("login",n)}async setConnect(e){this.releaseSigner(),await this.startAuth(),await this.initSigner(e),this.onAuth("login",e),await this.endAuth()}async setAmber(e){this.releaseSigner(),await this.startAuth(),await this.initSigner(e),this.onAuth("login",e),await this.endAuth()}async createAccount(e){const[t,n]=e.split("@"),r=await getBunkerUrl(`_@${n}`,this.params.optionsModal);console.log("create account bunker's url",r);const o=bunkerUrlToInfo(r);if(!o.signerPubkey)throw new Error("Bad bunker url");const i=Boolean(this.params.userInfo);await this.initSigner(o,{eventToAddAccount:i});return{bunkerUrl:`bunker://${await this.signer.createAccount2({bunkerPubkey:o.signerPubkey,name:t,domain:n,perms:this.params.optionsModal.perms})}?`+(o.relays??[]).map((e=>`relay=${encodeURIComponent(e)}`)).join("&"),sk:o.sk}}releaseSigner(){this.signer=null,this.signerErrCallback?.("cancelled"),this.localSigner=null}async logout(e=!1){e||this.releaseSigner(),localStorageRemoveCurrentAccount(),this.onAuth("logout"),this.emit("updateAccounts")}setUserInfo(e){this.params.userInfo=e,this.emit("onUserInfo",e),e&&(localStorageAddAccount(e),this.emit("updateAccounts"))}exportKeys(){return this.params.userInfo?"local"!==this.params.userInfo.authMethod?"":nip19_exports.nsecEncode(this.params.userInfo.sk):""}onAuth(e,t=null){if("logout"!==e&&!t)throw new Error("No user info in onAuth");if(t&&this.params.userInfo&&(t.pubkey!==this.params.userInfo.pubkey||t.authMethod!==this.params.userInfo.authMethod)){const e=new CustomEvent("nlAuth",{detail:{type:"logout"}});console.log("nostr-login auth",e.detail),document.dispatchEvent(e)}this.setUserInfo(t),t&&fetchProfile(t,t.relays).then((e=>{if(this.params.userInfo!==t)return;const n={...this.params.userInfo,picture:e?.image||e?.picture,name:e?.name||e?.displayName||e?.nip05||nip19_exports.npubEncode(t.pubkey)};this.setUserInfo(n)}));try{const n=t?nip19_exports.npubEncode(t.pubkey):"",r={type:e};"logout"===e?(this.iframe&&this.iframe.remove(),this.iframe=void 0):(r.pubkey=t.pubkey,r.name=t.name,t.sk&&(r.localNsec=nip19_exports.nsecEncode(t.sk)),t.relays&&(r.relays=t.relays),t.otpData&&(r.otpData=t.otpData),r.method=t.authMethod||"connect");const o=new CustomEvent("nlAuth",{detail:r});console.log("nostr-login auth",r),document.dispatchEvent(o),this.params.optionsModal.onAuth&&this.params.optionsModal.onAuth(n,r)}catch(e){console.log("onAuth error",e)}}async createIframe(e){if(!e)return;const t=new URL(e);let n;const r="__nostr-login-worker-iframe-"+t.hostname.replaceAll(".","-");n=document.querySelector(`#${r}`),console.log("iframe",r,n),n||(n=document.createElement("iframe"),n.setAttribute("width","0"),n.setAttribute("height","0"),n.setAttribute("border","0"),n.style.display="none",n.id=r,document.body.append(n)),n.setAttribute("src",e);const o=new ReadyListener(["workerReady","workerError"],t.origin);await new Promise((e=>{n.addEventListener("load",e)}));const i=await o.wait();return console.log("nostr-login iframe ready",e,i),{iframe:n,port:i[1]}}async sendNeedAuth(){const[e]=await this.getNostrConnectServices(),t=new CustomEvent("nlNeedAuth",{detail:{nostrconnect:e}});console.log("nostr-login need auth",e),document.dispatchEvent(t)}isAuthing(){return!!this.readyCallback}startAuth(){if(console.log("startAuth"),this.readyCallback)throw new Error("Already started");this.readyPromise=new Promise((e=>this.readyCallback=e))}async endAuth(){if(console.log("endAuth",this.params.userInfo),this.params.userInfo&&this.params.userInfo.iframeUrl){const{iframe:e,port:t}=await this.createIframe(this.params.userInfo.iframeUrl)||{};if(this.iframe=e,!this.iframe||!t)return;this.signer.rpc.setWorkerIframePort(t)}this.readyCallback(),this.readyCallback=void 0}resetAuth(){this.readyCallback&&this.readyCallback(),this.readyCallback=void 0}async listen(e){if(!e.iframeUrl)return this.signer.listen(this.nostrConnectSecret);const t=await this.starterReady.wait();if("starterError"===t[0])throw new Error(t[1]);return this.signer.setListenReply(t[1],this.nostrConnectSecret)}async connect(e,t){return this.signer.connect(e.token,t)}async initSigner(e,{listen:t=!1,connect:n=!1,eventToAddAccount:r=!1}={}){if(this.signerPromise)try{await this.signerPromise}catch{}console.log("initSigner info",e);const o=e.iframeUrl?new URL(e.iframeUrl).origin:void 0;return o&&(this.starterReady=new ReadyListener(["starterDone","starterError"],o)),this.emit("onIframeUrl",e.iframeUrl),this.signerPromise=new Promise((async(i,s)=>{this.signerErrCallback=s;try{const s=new PrivateKeySigner(e.sk);if(e.iframeUrl)this.signer=new Nip46Signer(s,e.signerPubkey,o,e.relays||[]),this.signer.on("iframeRestart",(async()=>{const t=e.iframeUrl+(e.iframeUrl.includes("?")?"&":"?")+"pubkey="+e.pubkey+"&rebind="+s.pubkey;this.emit("iframeRestart",{pubkey:e.pubkey,iframeUrl:t})})),this.signer.on("authUrl",(t=>{console.log("nostr login auth url",t),this.emit("onAuthUrl",{url:t,iframeUrl:e.iframeUrl,eventToAddAccount:r})}));else{const t=new Nip46Client({localPrivateKey:e.sk,remotePubkey:e.signerPubkey,relays:e.relays||[],timeoutMs:3e4}),n=new Nip46Adapter(t,s);this.signer=n,this.signer.on("authUrl",(t=>{console.log("nostr login auth url",t),this.emit("onAuthUrl",{url:t,iframeUrl:e.iframeUrl,eventToAddAccount:r})}))}t?await this.listen(e):n?await this.connect(e,this.params.optionsModal.perms):await this.signer.initUserPubkey(e.pubkey),e.pubkey=this.signer.userPubkey,e.signerPubkey=this.signer.remotePubkey,i()}catch(e){console.log("initSigner failure",e),this.signer=null,s(e)}})),this.signerPromise}async authNip46(e,{name:t,bunkerUrl:n,sk:r="",domain:o="",iframeUrl:i=""}){try{const s=bunkerUrlToInfo(n,r);if(isBunkerUrl(t)?s.bunkerUrl=t:(s.nip05=t,s.domain=t.split("@")[1]),o&&(s.domain=o),i&&(s.iframeUrl=i),!s.signerPubkey||!s.sk||!s.relays||0===s.relays.length)throw new Error(`Bad bunker url ${n}`);const a=Boolean(this.params.userInfo);console.log("authNip46",e,s),await this.initSigner(s,{connect:!0,eventToAddAccount:a}),this.onAuth(e,s)}catch(e){throw console.log("nostr login auth failed",e),e}}async signEvent(e){const t=(async()=>(this.localSigner?(e.pubkey=getPublicKey(this.localSigner.privateKey),e.id=getEventHash(e),e.sig=await this.localSigner.sign(e)):(e.pubkey=this.signer?.remotePubkey,e.id=getEventHash(e),e.sig=await(this.signer?.sign(e))),e))(),n=new Promise(((e,t)=>{setTimeout((()=>t(new Error("Sign timeout"))),2e4)})),r=await Promise.race([t,n]);return console.log("signed",{event:r}),r}async codec_call(e,t,n){return new Promise(((r,o)=>{this.signer.rpc.sendRequest(this.signer.remotePubkey,e,[t,n],24133,(e=>{e.error?o(e.error):r(e.result)}))}))}async encrypt04(e,t){return this.localSigner?this.localSigner.encrypt(e,t):this.signer&&"function"==typeof this.signer.encrypt?this.signer.encrypt(e,t):this.codec_call("nip04_encrypt",e,t)}async decrypt04(e,t){return this.localSigner?this.localSigner.decrypt(e,t):this.signer&&"function"==typeof this.signer.decrypt?this.signer.decrypt(e,t):this.codec_call("nip04_decrypt",e,t)}async encrypt44(e,t){return this.localSigner?this.nip44Codec.encrypt(this.localSigner.privateKey,e,t):this.codec_call("nip44_encrypt",e,t)}async decrypt44(e,t){return this.localSigner?this.nip44Codec.decrypt(this.localSigner.privateKey,e,t):this.codec_call("nip44_decrypt",e,t)}}class ModalManager extends lib.EventEmitter{modal=null;params;extensionService;authNostrService;launcherPromise;accounts=[];recents=[];opt;constructor(e,t,n){super(),this.params=e,this.extensionService=n,this.authNostrService=t}async waitReady(){if(this.launcherPromise){try{await this.launcherPromise}catch{}this.launcherPromise=void 0}}async launch(e){console.log("nostr-login launch",e),this.launcherPromise&&await this.waitReady(),this.authNostrService.isAuthing()&&this.authNostrService.resetAuth(),this.opt=e;const t=document.createElement("dialog");if(this.modal=document.createElement("nl-auth"),this.modal.accounts=this.accounts,this.modal.recents=this.recents,this.modal.setAttribute("dark-mode",String(getDarkMode(e))),e.theme&&this.modal.setAttribute("theme",e.theme),e.startScreen&&this.modal.setAttribute("start-screen",e.startScreen),e.bunkers)this.modal.setAttribute("bunkers",e.bunkers);else{let e="nsec.app,highlighter.com";this.modal.setAttribute("bunkers",e)}void 0!==e.methods&&(this.modal.authMethods=e.methods),void 0!==e.localSignup&&(this.modal.localSignup=e.localSignup),void 0!==e.signupNstart&&(this.modal.signupNjump=e.signupNstart),e.title&&(this.modal.welcomeTitle=e.title),e.description&&(this.modal.welcomeDescription=e.description),this.modal.hasExtension=this.extensionService.hasExtension(),this.modal.hasOTP=!!e.otpRequestUrl&&!!e.otpReplyUrl,this.modal.isLoadingExtension=!1,this.modal.isLoading=!1,[this.modal.connectionString,this.modal.connectionStringServices]=await this.authNostrService.getNostrConnectServices(),t.appendChild(this.modal),document.body.appendChild(t);let n="";return this.launcherPromise=new Promise(((e,r)=>{t.addEventListener("close",(()=>{r(new Error("Closed")),this.authNostrService.resetAuth(),this.modal&&(document.body.removeChild(this.modal.parentNode),this.modal=null)}));const o=async e=>{this.modal&&(this.modal.isLoading=!1),await this.authNostrService.endAuth(),t.close(),this.modal=null,e()},i=async(t,n)=>{this.modal&&(this.modal.isLoading=!0);try{n&&!n.start||this.authNostrService.startAuth(),await t(),n&&!n.end||await o(e)}catch(e){console.log("error",e),this.modal&&(this.modal.isLoading=!1,this.modal.authUrl="",this.modal.iframeUrl="","cancelled"!==e&&(this.modal.error=e.toString()))}},s=async(e,t)=>{await i((async()=>{const n=await getBunkerUrl(e,this.params.optionsModal);await this.authNostrService.authNip46("login",{name:e,bunkerUrl:n,domain:t})}))},a=async e=>{await i((async()=>{const{bunkerUrl:t,sk:n}=await this.authNostrService.createAccount(e);await this.authNostrService.authNip46("signup",{name:e,bunkerUrl:t,sk:n})}))},l=async()=>{try{await navigator.clipboard.writeText(this.authNostrService.exportKeys()),localStorageSetItem("backupKey","true")}catch(e){console.error("Failed to copy to clipboard: ",e)}},c=async e=>{await i((async()=>{const{iframeUrl:t}=e;e.link=this.authNostrService.prepareImportUrl(e.link),this.modal&&t&&(this.modal.authUrl=e.link,this.modal.iframeUrl=t,this.modal.isLoading=!1,console.log("nostrconnect authUrl",this.modal.authUrl,this.modal.iframeUrl)),await this.authNostrService.importAndConnect(e)}))},d=async e=>{await i((async()=>{const{relays:t,domain:n,link:r,iframeUrl:o}=e||{};console.log("nostrConnect",e,t,n,r,o),this.modal&&(o&&(this.modal.authUrl=r,this.modal.iframeUrl=o,this.modal.isLoading=!1,console.log("nostrconnect authUrl",this.modal.authUrl,this.modal.iframeUrl)),e||(this.modal.isLoading=!1)),await this.authNostrService.nostrConnect(t,{domain:n,link:r,iframeUrl:o})}))},h=async e=>{await i((async()=>{if(!e)throw new Error("Please enter some nickname");await this.authNostrService.localSignup(e)}))},u=async()=>{await i((async()=>{const e=new URL(window.location.href),t=e.hostname.toLocaleLowerCase().replace(/^www\./i,"").charAt(0).toUpperCase()+e.hostname.slice(1),n=prepareSignupRelays(this.params.optionsModal.signupRelays);return this.modal.njumpIframe=`\n <html><body>\n <script src='https://start.njump.me/modal.js'><\/script>\n <script>\n new NstartModal({\n baseUrl: 'https://start.njump.me',\n // Required parameters\n an: '${t}',\n // Optional parameters\n s: [${this.opt.followNpubs?`'${this.opt.followNpubs}'`:""}],\n afb: false, // forceBunker\n asb: false, // skipBunker\n aan: false, // avoidNsec\n aac: true, // avoidNcryptsec\n ahc: true, // hide close button\n arr: ${JSON.stringify(n)}, //readRelays\n awr: ${JSON.stringify(n)}, //writeRelays\n // Callbacks\n onComplete: (result) => {\n console.log('Login token:', result.nostrLogin);\n window.parent.location.href='${window.location.href}#nostr-login='+result.nostrLogin;\n },\n onCancel: () => {\n window.parent.location.href='${window.location.href}#nostr-login=null';\n },\n }).open();\n <\/script>\n </body></html>\n `.replaceAll("&","&"),new Promise(((e,t)=>{const n=async n=>{if(console.log("nsecOrBunker",n),n.startsWith("nsec1")){let t;try{t=nip19_exports.decode(n)}catch(e){throw new Error("Bad nsec value")}if("nsec"!==t.type)throw new Error("Bad bech32 type");await this.authNostrService.localSignup("",t.data),e()}else n.startsWith("bunker:")?(await this.authNostrService.authNip46("login",{name:"",bunkerUrl:n}),e()):t("null"===n?"Cancelled":"Unknown return value")};window.addEventListener("hashchange",(async()=>{if(window.location.hash.startsWith("#nostr-login=")){const e=window.location.hash.split("#nostr-login=")[1],t=new URL(window.location.toString());t.hash="",window.history.replaceState({},"",t.toString()),n(e)}}))}))}))};if(!this.modal)throw new Error("WTH?");this.modal.addEventListener("handleContinue",(()=>{this.modal&&(this.modal.isLoading=!0,this.emit("onAuthUrlClick",this.modal.authUrl))})),this.modal.addEventListener("nlLogin",(e=>{s(e.detail)})),this.modal.addEventListener("nlSignup",(e=>{a(e.detail)})),this.modal.addEventListener("nlLocalSignup",(e=>{h(e.detail)})),this.modal.addEventListener("nlSignupNjump",(e=>{u()})),this.modal.addEventListener("nlImportAccount",(e=>{c(e.detail)})),this.modal.addEventListener("nlExportKeys",(e=>{l()})),this.modal.addEventListener("handleLogoutBanner",(()=>{this.emit("onLogoutBanner")})),this.modal.addEventListener("nlNostrConnect",(e=>{d(e.detail)})),this.modal.addEventListener("nlNostrConnectDefault",(()=>{this.authNostrService.isAuthing()||d()})),this.modal.addEventListener("nlNostrConnectDefaultCancel",(()=>{console.log("nlNostrConnectDefaultCancel"),this.authNostrService.cancelNostrConnect()})),this.modal.addEventListener("nlSwitchAccount",(e=>{const n=e.detail;this.emit("onSwitchAccount",n),setTimeout((()=>t.close()),300)})),this.modal.addEventListener("nlLoginRecentAccount",(async e=>{const n=e.detail;if("readOnly"===n.authMethod)this.authNostrService.setReadOnly(n.pubkey),t.close();else if("otp"===n.authMethod)try{this.modal.dispatchEvent(new CustomEvent("nlLoginOTPUser",{detail:n.nip05||n.pubkey}))}catch(e){console.error(e)}else if("extension"===n.authMethod)await this.extensionService.trySetExtensionForPubkey(n.pubkey),t.close();else if("amber"===n.authMethod)this.authNostrService.setAmber(n),t.close();else{const e=n.bunkerUrl||n.nip05;if(!e)throw new Error("Bad connect info");s(e,n.domain)}})),this.modal.addEventListener("nlRemoveRecent",(e=>{localStorageRemoveRecent(e.detail),this.emit("updateAccounts")}));const p=async e=>{let t="";if(e.includes("@")){const{error:n,pubkey:r}=await checkNip05(e);if(!r)throw new Error(n);t=r}else if(e.startsWith("npub")){const{type:n,data:r}=nip19_exports.decode(e);if("npub"!==n)throw new Error("Bad npub");t=r}else 64===e.trim().length&&(t=e.trim(),nip19_exports.npubEncode(t));return t};this.modal.addEventListener("nlLoginReadOnly",(async e=>{await i((async()=>{const t=e.detail,n=await p(t);this.authNostrService.setReadOnly(n)}))})),this.modal.addEventListener("nlLoginExtension",(async()=>{if(!this.extensionService.hasExtension())throw new Error("No extension");await i((async()=>{this.modal&&(this.modal.isLoadingExtension=!0,await this.extensionService.setExtension(),this.modal.isLoadingExtension=!1)}))})),this.modal.addEventListener("nlLoginOTPUser",(async e=>{await i((async()=>{if(!this.modal)return;const t=e.detail,r=await p(t),o=this.opt.otpRequestUrl+(this.opt.otpRequestUrl.includes("?")?"&":"?")+"pubkey="+r,i=await fetch(o);if(200!==i.status)throw console.warn("nostr-login: bad otp reply",i),new Error("Failed to send DM");this.modal.isOTP=!0,n=r,this.modal.isLoading=!1}),{start:!0})})),this.modal.addEventListener("nlLoginOTPCode",(async e=>{await i((async()=>{if(!this.modal)return;const t=e.detail,r=this.opt.otpReplyUrl+(this.opt.otpRequestUrl.includes("?")?"&":"?")+"pubkey="+n+"&code="+t,o=await fetch(r);if(200!==o.status)throw console.warn("nostr-login: bad otp reply",o),new Error("Invalid code");const i=await o.text();this.authNostrService.setOTP(n,i),this.modal.isOTP=!1}),{end:!0})})),this.modal.addEventListener("nlCheckSignup",(async e=>{const{available:t,taken:n,error:r}=await checkNip05(e.detail);this.modal&&(this.modal.error=String(r),!r&&n&&(this.modal.error="Already taken"),this.modal.signupNameIsAvailable=t)})),this.modal.addEventListener("nlCheckLogin",(async e=>{const{available:t,taken:n,error:r}=await checkNip05(e.detail);this.modal&&(this.modal.error=String(r),t&&(this.modal.error="Name not found"),this.modal.loginIsGood=n)}));const f=()=>{this.modal&&(this.modal.isLoading=!1),t.close(),r(new Error("Cancelled"))};this.modal.addEventListener("stopFetchHandler",f),this.modal.addEventListener("nlCloseModal",f),this.modal.addEventListener("nlChangeDarkMode",(e=>{setDarkMode(e.detail),document.dispatchEvent(new CustomEvent("nlDarkMode",{detail:e.detail}))})),this.on("onIframeAuthUrlCallEnd",(()=>{t.close(),this.modal=null,e()})),t.showModal()})),this.launcherPromise}async showIframeUrl(e){await this.waitReady(),this.launch({startScreen:"iframe"}).catch((()=>console.log("closed auth iframe"))),this.modal.authUrl=e}connectModals(e){const t=async e=>{await this.launch(e)},n=document.getElementsByTagName("nl-button");for(let r=0;r<n.length;r++){const o=n[r].getAttribute("nl-theme"),i=n[r].getAttribute("start-screen"),s={...e};switch(o&&(s.theme=o),i){case"login":case"login-bunker-url":case"login-read-only":case"signup":case"switch-account":case"welcome":s.startScreen=i}n[r].addEventListener("click",(function(){t(s)}))}}onAuthUrl(e){this.modal&&(this.modal.authUrl=e,this.modal.isLoading=!1)}onIframeUrl(e){this.modal&&(console.log("modal iframe url",e),this.modal.iframeUrl=e)}onCallEnd(){this.modal&&this.modal.authUrl&&this.params.userInfo?.iframeUrl&&this.emit("onIframeAuthUrlCallEnd")}onUpdateAccounts(e,t){this.accounts=e,this.recents=t,this.modal&&(this.modal.accounts=e,this.modal.recents=t)}onDarkMode(e){this.modal&&(this.modal.darkMode=e)}}class Nostr{#e;nip04;nip44;constructor(e){this.#e=e,this.getPublicKey=this.getPublicKey.bind(this),this.signEvent=this.signEvent.bind(this),this.getRelays=this.getRelays.bind(this),this.nip04={encrypt:this.encrypt04.bind(this),decrypt:this.decrypt04.bind(this)},this.nip44={encrypt:this.encrypt44.bind(this),decrypt:this.decrypt44.bind(this)}}async ensureAuth(){if(await this.#e.waitReady(),!this.#e.getUserInfo()&&(await this.#e.launch(),!this.#e.getUserInfo()))throw new Error("Rejected by user")}async getPublicKey(){await this.ensureAuth();const e=this.#e.getUserInfo();if(e)return e.pubkey;throw new Error("No user")}async signEvent(e){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().signEvent(e)))}async getRelays(){return{}}async encrypt04(e,t){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().nip04.encrypt(e,t)))}async decrypt04(e,t){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().nip04.decrypt(e,t)))}async encrypt44(e,t){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().nip44.encrypt(e,t)))}async decrypt44(e,t){return await this.ensureAuth(),this.#e.wait((async()=>await this.#e.getSigner().nip44.decrypt(e,t)))}}class NostrExtensionService extends lib.EventEmitter{params;nostrExtension;constructor(e){super(),this.params=e}startCheckingExtension(e){if(this.checkExtension(e))return;const t=setInterval((()=>{this.checkExtension(e)&&clearTimeout(t)}),100)}checkExtension(e){return!(this.nostrExtension||!window.nostr||window.nostr===e)&&(this.initExtension(e),!0)}async initExtension(e,t){this.nostrExtension=window.nostr,window.nostr=e,"extension"===this.params.userInfo?.authMethod&&await this.trySetExtensionForPubkey(this.params.userInfo.pubkey),t||setTimeout((()=>{window.nostr!==e&&this.nostrExtension!==window.nostr&&this.initExtension(e,!0)}),300)}async setExtensionReadPubkey(e){window.nostr=this.nostrExtension;const t=await window.nostr.getPublicKey();e&&e!==t?this.emit("extensionLogout"):this.emit("extensionLogin",t)}async trySetExtensionForPubkey(e){if(this.nostrExtension)return this.setExtensionReadPubkey(e)}async setExtension(){return this.setExtensionReadPubkey()}unsetExtension(e){window.nostr===this.nostrExtension&&(window.nostr=e)}getExtension(){return this.nostrExtension}hasExtension(){return!!this.nostrExtension}}class NostrParams{userInfo;optionsModal;constructor(){this.userInfo=null,this.optionsModal={theme:"default",startScreen:"welcome",devOverrideBunkerOrigin:""}}}class Popup{popup=null;constructor(){}openPopup(e){if((!this.popup||this.popup.closed)&&(this.popup=window.open(e,"_blank","width=400,height=700"),console.log("popup",this.popup),!this.popup))throw new Error("Popup blocked. Try again, please!")}closePopup(){try{this.popup?.close(),this.popup=null}catch{}}}const CALL_TIMEOUT=5e3;class ProcessManager extends lib.EventEmitter{callCount=0;callTimer;constructor(){super()}onAuthUrl(){Boolean(this.callTimer)&&clearTimeout(this.callTimer)}onIframeUrl(){Boolean(this.callTimer)&&clearTimeout(this.callTimer)}async wait(e){let t,n;this.callTimer||(this.callTimer=setTimeout((()=>this.emit("onCallTimeout")),CALL_TIMEOUT)),this.callCount||this.emit("onCallStart"),this.callCount++;try{n=await e()}catch(e){t=e}if(this.callCount--,this.emit("onCallEnd"),this.callTimer&&clearTimeout(this.callTimer),this.callTimer=void 0,t)throw t;return n}}class NostrLoginInitializer{extensionService;params;authNostrService;nostr;processManager;popupManager;bannerManager;modalManager;customLaunchCallback;constructor(){this.params=new NostrParams,this.processManager=new ProcessManager,this.popupManager=new Popup,this.bannerManager=new BannerManager(this.params),this.authNostrService=new AuthNostrService(this.params),this.extensionService=new NostrExtensionService(this.params),this.modalManager=new ModalManager(this.params,this.authNostrService,this.extensionService);const e={waitReady:async()=>{await this.authNostrService.waitReady(),await this.modalManager.waitReady()},getUserInfo:()=>this.params.userInfo,getSigner:()=>{if("readOnly"===this.params.userInfo.authMethod)throw new Error("Read only");return"extension"===this.params.userInfo.authMethod?this.extensionService.getExtension():this.authNostrService},launch:()=>this.launch(),wait:e=>this.processManager.wait(e)};this.nostr=new Nostr(e),this.processManager.on("onCallTimeout",(()=>{this.bannerManager.onCallTimeout()})),this.processManager.on("onCallEnd",(()=>{this.bannerManager.onCallEnd(),this.modalManager.onCallEnd()})),this.processManager.on("onCallStart",(()=>{this.bannerManager.onCallStart()})),this.authNostrService.on("onIframeUrl",(e=>{this.modalManager.onIframeUrl(e)})),this.authNostrService.on("iframeRestart",(({iframeUrl:e})=>{this.processManager.onIframeUrl(),this.bannerManager.onIframeRestart(e)})),this.authNostrService.on("onAuthUrl",(({url:e,iframeUrl:t,eventToAddAccount:n})=>{this.processManager.onAuthUrl(),n?this.modalManager.onAuthUrl(e):this.params.userInfo?this.bannerManager.onAuthUrl(e,t):this.modalManager.onAuthUrl(e)})),this.authNostrService.on("updateAccounts",(()=>{this.updateAccounts()})),this.authNostrService.on("onUserInfo",(e=>{this.bannerManager.onUserInfo(e)})),this.modalManager.on("onAuthUrlClick",(e=>{this.openPopup(e)})),this.bannerManager.on("onIframeAuthUrlClick",(e=>{this.modalManager.showIframeUrl(e)})),this.modalManager.on("onSwitchAccount",(async e=>{this.switchAccount(e)})),this.modalManager.on("onLogoutBanner",(async e=>{logout()})),this.bannerManager.on("onConfirmLogout",(async()=>{this.launch("confirm-logout")})),this.modalManager.on("updateAccounts",(()=>{this.updateAccounts()})),this.bannerManager.on("logout",(()=>{logout()})),this.bannerManager.on("onAuthUrlClick",(e=>{this.openPopup(e)})),this.bannerManager.on("onSwitchAccount",(async e=>{this.switchAccount(e)})),this.bannerManager.on("import",(()=>{this.launch("import")})),this.extensionService.on("extensionLogin",(e=>{this.authNostrService.setExtension(e)})),this.extensionService.on("extensionLogout",(()=>{logout()})),this.bannerManager.on("launch",(e=>{this.launch(e)}))}openPopup(e){e.startsWith("nostrsigner:")?window.open(e,"_blank","width=400,height=600"):this.popupManager.openPopup(e)}async switchAccount(e,t=!1){if(console.log("nostr login switch to info",e),this.extensionService.unsetExtension(this.nostr),"readOnly"===e.authMethod)this.authNostrService.setReadOnly(e.pubkey);else if("otp"===e.authMethod)this.authNostrService.setOTP(e.pubkey,e.otpData||"");else if("local"===e.authMethod&&e.sk)this.authNostrService.setLocal(e,t);else if("extension"===e.authMethod)await this.extensionService.trySetExtensionForPubkey(e.pubkey);else if("connect"===e.authMethod&&e.sk&&e.relays&&e.relays[0])this.authNostrService.setConnect(e);else{if("amber"!==e.authMethod)throw new Error("Bad auth info");this.authNostrService.setAmber(e)}}updateAccounts(){const e=localStorageGetAccounts(),t=localStorageGetRecents();this.bannerManager.onUpdateAccounts(e),this.modalManager.onUpdateAccounts(e,t)}async launchCustomNostrConnect(){try{this.authNostrService.isAuthing()&&this.authNostrService.cancelNostrConnect();const e=new Promise((e=>this.customLaunchCallback=e));await this.authNostrService.startAuth(),await this.authNostrService.sendNeedAuth();try{await this.authNostrService.nostrConnect(),await this.authNostrService.endAuth()}catch(t){"cancelled"===t&&await e}}catch(e){console.error("launchCustomNostrConnect",e)}}fulfillCustomLaunchPromise(){if(this.customLaunchCallback){const e=this.customLaunchCallback;this.customLaunchCallback=void 0,e()}}launch=async e=>{if(!e&&this.params.optionsModal.customNostrConnect)return this.launchCustomNostrConnect();const t=localStorageGetRecents(),n=localStorageGetAccounts(),r={...this.params.optionsModal};e&&"default"!==e?r.startScreen=e:(Boolean(t?.length)||Boolean(n?.length))&&(r.startScreen="switch-account"),this.customLaunchCallback&&this.authNostrService.cancelNostrConnect();try{await this.modalManager.launch(r),this.fulfillCustomLaunchPromise()}catch(e){console.log("nostr-login failed",e)}};init=async e=>{this.extensionService.startCheckingExtension(this.nostr),window.nostr=this.nostr,this.modalManager.connectModals(e),this.bannerManager.launchAuthBanner(e),e&&(this.params.optionsModal={...e});try{const e=localStorageGetCurrent();if(e){if(!e.pubkey)throw new Error("Bad stored info");await this.switchAccount(e)}}catch(e){console.log("nostr login init error",e),await logout()}this.updateAccounts()};logout=async()=>{this.extensionService.unsetExtension(this.nostr),await this.authNostrService.logout()};setDarkMode=e=>{localStorageSetItem("nl-dark-mode",`${e}`),this.bannerManager.onDarkMode(e),this.modalManager.onDarkMode(e)};setAuth=async e=>{if(!e.type)throw new Error("Invalid auth event");if("login"!==e.type&&"logout"!==e.type&&"signup"!==e.type)throw new Error("Invalid auth event");if(e.method&&"connect"!==e.method&&"extension"!==e.method&&"local"!==e.method&&"otp"!==e.method&&"readOnly"!==e.method&&"amber"!==e.method)throw new Error("Invalid auth event");if("logout"===e.type)return this.logout();if(!e.method||!e.pubkey)throw new Error("Invalid pubkey");const t={authMethod:e.method,pubkey:e.pubkey,relays:e.relays,sk:e.localNsec,otpData:e.otpData,name:e.name};await this.switchAccount(t,"signup"===e.type)};cancelNeedAuth=()=>{console.log("cancelNeedAuth"),this.fulfillCustomLaunchPromise(),this.authNostrService.cancelNostrConnect()}}const initializer=new NostrLoginInitializer,{init:init,launch:launch,logout:logout,setDarkMode:setDarkMode,setAuth:setAuth,cancelNeedAuth:cancelNeedAuth}=initializer;document.addEventListener("nlLogout",logout),document.addEventListener("nlLaunch",(e=>{launch(e.detail||"")})),document.addEventListener("nlNeedAuthCancel",(()=>{cancelNeedAuth()})),document.addEventListener("nlDarkMode",(e=>{setDarkMode(!!e.detail)})),document.addEventListener("nlSetAuth",(e=>{setAuth(e.detail)})),(()=>{const e=document.currentScript,t=async()=>{const t={};if(e){const n=e.getAttribute("data-dark-mode");n&&(t.darkMode="true"===n);const r=e.getAttribute("data-bunkers");r&&(t.bunkers=r);const o=e.getAttribute("data-start-screen");o&&(t.startScreen=o);const i=e.getAttribute("data-perms");i&&(t.perms=i);const s=e.getAttribute("data-theme");s&&(t.theme=s);const a=e.getAttribute("data-no-banner");a&&(t.noBanner="true"===a);const l=e.getAttribute("data-local-signup");l&&(t.localSignup="true"===l);const c=e.getAttribute("data-signup-nstart")||e.getAttribute("data-signup-njump");c&&(t.signupNstart="true"===c);const d=e.getAttribute("data-follow-npubs");d&&(t.followNpubs=d);const h=e.getAttribute("data-otp-request-url");h&&(t.otpRequestUrl=h);const u=e.getAttribute("data-otp-reply-url");u&&(t.otpReplyUrl=u),!!h!=!!u&&console.warn("nostr-login: need request and reply urls for OTP auth");const p=e.getAttribute("data-methods");p&&(t.methods=p.trim().split(",").filter((e=>!!e)));const f=e.getAttribute("data-title");f&&(t.title=f);const g=e.getAttribute("data-description");g&&(t.description=g);const m=e.getAttribute("data-signup-relays");m&&(t.signupRelays=m);const b=e.getAttribute("data-outbox-relays");b&&(t.outboxRelays=b.split(","));const y="true"===e.getAttribute("data-dev");y&&(t.dev=y);const w="true"===e.getAttribute("data-custom-nostr-connect");w&&(t.customNostrConnect=w),console.log("nostr-login options",t)}init(t)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",t):t()})()})();
|