import{generateBip39Mnemonicasqe,deriveSeedFromBip39Mnemonicasne,deriveHdPrivateNodeFromSeedasKe,deriveHdPathasWe,secp256k1asoe,hash160asze,encodeCashAddressasno,lockingBytecodeToCashAddressasGe,cashAddressToLockingBytecodeasoo,binToHexasje,hexToBinasso,utf8ToBinasie,binToBase64asNt,base64ToBinasDt}from"@bitauth/libauth";varmt="bchtest";var$t="m/44'/145'/0'",Je=5,kt="bns.wallet.v1";functionae(e){lett=ze(e);returnUint8Array.from([118,169,20,...t,136,172])}functionse(e,t,n){leto=Ge({bytecode:ae(e),prefix:t,tokenSupport:n});if(typeofo=="string")thrownewError(`address encoding failed: ${o}`);returno.address}varRt=classe{constructor(t,n,o=mt,s=$t){this.mnemonic=t,this.prefix=o,this.accountPath=s,this._root=Ke(n),this._keys=newMap,this._derive()}staticasynccreate(t=mt,n=$t){leto=qe();returnnewe(o,awaitne(o),t,n)}staticasyncfromMnemonic(t,n=mt,o=$t){lets=String(t).trim().toLowerCase().replace(/\s+/g," "),r=awaitne(s);if(typeofr=="string")thrownewError(`invalid recovery phrase: ${r}`);returnnewe(s,r,n,o)}_derive(){this.receive=[],this.change=[];for(let[t,n]of[[0,this.receive],[1,this.change]])for(leto=0;o<Je;o++){lets=`${this.accountPath}/${t}/${o}`,r=We(this._root,s);if(typeofr=="string")thrownewError(`HD derivation failed at ${s}: ${r}`);leta=oe.derivePublicKeyCompressed(r.privateKey);if(typeofa=="string")thrownewError(`pubkey derivation failed: ${a}`);leti=ae(a),l={path:s,branch:t,index:o,privateKey:r.privateKey,publicKey:a,lockingBytecode:i,address:se(a,this.prefix,!1),tokenAddress:se(a,this.prefix,!0)};n.push(l),this._keys.set(je(i),l)}}getaddress(){returnthis.receive[0].address}gettokenAddress(){returnthis.receive[0].tokenAddress}getwatchedAddresses(){return[...this.receive,...this.change].map(t=>t.address)}keyFor(t){letn=this._keys.get(t);returnn?{privateKey:n.privateKey,publicKey:n.publicKey}:null}signMessage(t,n){if(!(tinstanceofUint8Array)||t.length!==32)thrownewError("signMessage expects a 32-byte Uint8Array digest");leto=n||this.address,s=[...this.receive,...this.change].find(h=>h.address===o);if(!s)thrownewError(`no key for address ${o}`);letr=oe.signMessageHashRecoverableCompact(s.privateKey,t);if(typeofr=="string")thrownewError(`signMessage failed: ${r}`);let{signature:a}=r,i=r.recoveryId??r.recovery;if(typeofi!="number")thrownewError("signMessage: no recovery id in signature result");letl=31+i,c=newUint8Array(65);returnc[0]=l,c.set(a,1),c}asyncencrypt(t){letn=crypto.getRandomValues(newUint8Array(16)),o=crypto.getRandomValues(newUint8Array(12)),s=awaitre(t,n),r=newUint8Array(awaitcrypto.subtle.encrypt({name:"AES-GCM",iv:o},s,ie(this.mnemonic)));returnJSON.stringify({v:1,kdf:"PBKDF2-SHA256",iterations:Ft,prefix:this.prefix,salt:Nt(n),iv:Nt(o),ct:Nt(r)})}staticasyncdecrypt(t,n){leto=typeoft=="string"?JSON.parse(t):t,s=awaitre(n,Dt(o.salt),o.iterations??Ft),r;try{r=awaitcrypto.subtle.decrypt({name:"AES-GCM",iv:Dt(o.iv)},s,Dt(o.ct))}catch{thrownewError("wrong password")}returne.fromMnemonic(newTextDecoder().decode(r),o.prefix??mt)}asyncsave(t,n=globalThis.localStorage){n.setItem(kt,awaitthis.encrypt(t))}staticasyncload(t,n=globalThis.localStorage){leto=n.getItem(kt);returno?e.decrypt(o,t):null}staticexists(t=globalThis.localStorage){return!!t?.getItem(kt)}staticforget(t=globalThis.localStorage){t.removeItem(kt)}},Ft=25e4;asyncfunctionre(e,t,n=Ft){leto=awaitcrypto.subtle.importKey("raw",ie(String(e)),"PBKDF2",!1,["deriveKey"]);returncrypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:n,hash:"SHA-256"},o,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}varbt=["wss://silentmode.st/electrum","wss://chipnet.bch.ninja:50004","wss://chipnet.imaginary.cash:50004","wss://tbch4.loping.net:62002"],Lt=class{constructor(t,n){this.url=t,this.WS=n||globalThis.WebSocket,this.id=0,this.pending=newMap,this.buf=""}connect(){returnnewPromise((t,n)=>{leto=newthis.WS(this.url);this.ws=o;lets=async()=>{try{awaitthis.call("server.version",["bns-web","1.4.2"]),t(this)}catch(i){n(i)}},r=i=>n(newError("el
`))>=0;){let s=this.buf.slice(0,n).trim();if(this.buf=this.buf.slice(n+1),s)try{this._handle(JSON.parse(s))}catch{}}let o=this.buf.trim();if(o)try{let s=JSON.parse(o);this._handle(s),this.buf=""}catch{}}call(t,n=[]){let o=++this.id;return new Promise((s,r)=>{this.pending.set(o,{resolve:s,reject:r}),this.ws.send(JSON.stringify({id:o,method:t,params:n})+`
`),setTimeout(()=>{this.pending.has(o)&&(this.pending.delete(o),r(new Error(`electrumtimeout:${t}`)))},2e4)})}close(){try{this.ws.close()}catch{}}};async function ce(e=bt,t){let n=[];for(let o of e)try{return await new Lt(o,t).connect()}catch(s){n.push(`${o}:${s?.message??s}`)}throw Pe(e.length,n)}function Pe(e,t){let n=new Error(`noelectrumserverreachable(tried${e}).Theseusenon-standardports,whichsomenetworksandVPNsblock:
`)}`);returnn.code="NO_ELECTRUM",n.failures=t,n}import{cashAddressToLockingBytecodeasYe,lockingBytecodeToCashAddressasXe,sha256asVe,hash160asco,binToHexasQe,hexToBinaslo}from"@bitauth/libauth";functionle(e){returnQe(Ve.hash(e).slice().reverse())}function_(e){lett=Ye(e);if(typeoft=="string")thrownewError(`bad address "${e}": ${t}`);returnt.bytecode}functionZe(e){returnle(_(e))}functionM(e){lett=_(e),n=String(e).includes(":")?e.split(":")[0]:"bchtest",o=Xe({bytecode:t,prefix:n,tokenSupport:!0});if(typeofo=="string")thrownewError(`cannot token-encode "${e}": ${o}`);returno.address}asyncfunctionue(e,t){letn=_(t),o=le(n);return(awaite.call("blockchain.scripthash.listunspent",[o,"include_tokens"])).map(r=>({txid:r.tx_hash,vout:r.tx_pos,satoshis:BigInt(r.value),height:r.height,address:t,lockingBytecode:n,token:r.token_data?{category:r.token_data.category,amount:BigInt(r.token_data.amount??0),nft:r.token_data.nft?{capability:r.token_data.nft.capability,commitment:r.token_data.nft.commitment}:void0}:void0}))}asyncfunctionz(e,t){letn=[];for(letooft)n.push(...awaitue(e,o));returnn}asyncfunctionV(e,t){returne.call("blockchain.transaction.broadcast",[t])}import{binToHexasvt,hexToBinasj,utf8ToBinasst,binToUtf8asde,encodeTransactionastn,decodeTransactionaspo}from"@bitauth/libauth";varen="BNS1",Tt="bchtest:qp8njaa9a3ahg7259s5qajnce526n0rttsq8qwx4jl",Mt="bchtest:qzc4c76vtw9nd49g6x8nmvc0jz62uvk4dc7hmpmerh",I=600n,F=1000n,U=546n,Ct="bch",Ht=200,nn=/^[a-z0-9-]{1,32}$/,he=/^[a-z0-9-]{1,16}$/;functionht(e){lett=String(e).toLowerCase().trim().replace(/^\.+/,"").replace(/\.+$/,"");if(!he.test(t))thrownewError(`invalid TLD "${e}" (allowed: [a-z0-9-]{1,16})`);returnt}varSt=classextendsError{constructor(t){super(t),this.name="NoGenesisInputError",this.code="NO_GENESIS_INPUT"}},J=classextendsError{constructor(t,{needSats:n,haveSats:o}={}){super(t),this.name="InsufficientFundsError",this.code="INSUFFICIENT_FUNDS",this.needSats=n,this.haveSats=o}};functionP(e){lett=String(e).toLowerCase().trim().replace(/\.$/,"").split(".").filter(Boolean),n,o;if(t.length===0)thrownewError(`invalid name "${e}"`);if(t.length===1?(n=t[0],o=Ct):(o=t[t.length-1],n=t[t.length-2]),!nn.test(n)||!he.test(o))thrownewError(`invalid name "${e}" (allowed: <label>.<tld>, [a-z0-9-])`);returno===Ct?n:`${n}.${o}`}functionY(e){returne.includes(".")?e:`${e}.${Ct}`}functionit(e,t,n){leto=JSON.stringify({o:e,n:t,r:n??{}}),s=st(en+o);if(s.length>Ht)thrownewError(`records too large (${s.length} > ${Ht} bytes)`);returns}functionUt(e,t="REG"){returnHt-it(t,e,{}).length}functionon(e){returne.length<=75?Uint8Array.from([e.length,...e]):e.length<=255?Uint8Array.from([76,e.length,...e]):Uint8Array.from([77,e.length&255,e.length>>8&255,...e])}functionpt(e){returnUint8Array.from([106,...on(e)])}functionqt(){returnUint8Array.from([65,...newUint8Array(65),33,...newUint8Array(33)])}varsn=e=>!e.token;functionq(e,t,{requireGenesis:n=!0}={}){leto=e.filter(sn),s=[],r=0n;if(n){leti=o.filter(l=>l.vout===0).sort((l,c)=>c.satoshis>l.satoshis?1:-1);if(i.length===0)thrownewSt("wallet has no coin at output index 0, which CashTokens requires to create a new certificate category \u2014 send a small amount to yourself first (buildPrepTx)");s.push(i[0]),r+=i[0].satoshis}leta=o.filter(i=>!s.some(l=>l.txid===i.txid&&l.vout===i.vout)).sort((i,l)=>l.satoshis>i.satoshis?1:-1);for(letiofa){if(r>=t)break;s.push(i),r+=i.satoshis}return{inputs:s,totalSats:r}}functionrt(e){return{outpointTransactionHash:j(e.txid),outpointIndex:e.vout,sequenceNumber:4294967294,unlockingBytecode:qt()}}functiondt(e){return{...rt(e),lockingBytecode:e.lockingBytecode,valueSatoshis:e.satoshis,...e.token?{token:{amount:e.token.amount??0n,category:j(e.token.category),...e.token.nft?{nft:{capability:e.token.nft.capability,commitment:j(e.token.nft.commitment||"")}}:{}}}:{}}}functionet(e){returntn(e).length}functionKt({name:e,ownerAddress:t,ownerTokenAddress:n,changeAddress:o,records:s={},utxos:r,feeAddress:a=null,feeSats:i=0n,tldFeeAddress:l
`))>=0;){let s=this.buf.slice(0,n).trim();if(this.buf=this.buf.slice(n+1),s)try{this._handle(JSON.parse(s))}catch{}}let o=this.buf.trim();if(o)try{let s=JSON.parse(o);this._handle(s),this.buf=""}catch{}}call(t,n=[]){let o=++this.id;return new Promise((s,r)=>{this.pending.set(o,{resolve:s,reject:r}),this.ws.send(JSON.stringify({id:o,method:t,params:n})+`
`),setTimeout(()=>{this.pending.has(o)&&(this.pending.delete(o),r(new Error(`electrumtimeout:${t}`)))},2e4)})}close(){try{this.ws.close()}catch{}}},gn=e=>typeof e=="string"?{url:e}:e;async function yn(e,t,{directIP:n=!1}={}){let o;for(let s of e){let r=gn(s);try{return await new Bt(r.url,t).connect()}catch(a){o=a}if(n&&r.ip)try{let a=new URL(r.url),i=`${a.protocol}//${r.ip}:${a.port}`;return await new Bt(i,t,{servername:a.hostname}).connect()}catch(a){o=a}}throw o??new Error("no electrum server reachable")}function Se(e){if(!e||!e.startsWith("6a"))return null;let t=pn(e),n=1,o=[];for(;n<t.length;){let r=t[n++],a;if(r<=75)a=r;else if(r===76)a=t[n++];else if(r===77)a=t[n]|t[n+1]<<8,n+=2;else return null;o.push(t.slice(n,n+a)),n+=a}let s=new TextDecoder().decode(o[0]??new Uint8Array);if(!s.startsWith(xe))return null;try{let r=JSON.parse(s.slice(xe.length));if(mn.has(r.o)&&typeof r.n=="string")return r}catch{}return null}var mn=new Set(["REG","UPD","TREG","TUPD"]);function ve(e,t){let n=e.height>0?e.height:1/0,o=t.height>0?t.height:1/0;return n-o||e.tx_hash.localeCompare(t.tx_hash)}function Te(e,t){let n=new Set(e.map(i=>i.tx_hash)),o=new Map(e.map(i=>{let l=new Set;for(let c of t.get(i.tx_hash)?.vin??[])c.txid&&c.txid!==i.tx_hash&&n.has(c.txid)&&l.add(c.txid);return[i.tx_hash,l]})),s=new Set,r=[],a=[...e];for(;a.length;){let i=a.findIndex(c=>[...o.get(c.tx_hash)].every(h=>s.has(h)));i<0&&(i=0);let[l]=a.splice(i,1);s.add(l.tx_hash),r.push(l)}return r}function jt(e){let t=e.lastIndexOf(".");return t<0?e:e.slice(t+1)}function wn(e,t,n){let o=n.get(e);return o?o.regHeight>0&&t>0?o.regHeight<=t:!0:!1}async function Pt(e){let t=typeof e.unionHistory=="function"?(await e.unionHistory(we)).history:await e.call("blockchain.scripthash.get_history",[we]);t.sort(ve);let n=new Map;for(let{tx_hash:s}of t)try{n.set(s,await e.call("blockchain.transaction.get",[s,!0]))}catch{}let o=new Map;for(let{tx_hash:s,height:r}of Te(t.filter(a=>n.has(a.tx_hash)),n)){let i=n.get(s).vout||[],l=null;for(let h of i)l=Se(h.scriptPubKey?.hex)??l;if(!l||typeof l.n!="string"||!be.test(l.n))continue;let c=l.n;if(l.o==="TREG"){if(o.has(c))continue;let h=Jt(c),u=i.find(d=>d.tokenData?.nft&&d.tokenData.nft.commitment===h);if(!u)continue;o.set(c,{category:u.tokenData.category,regHeight:r,regTxid:s,mintScriptHex:u.scriptPubKey?.hex??null,records:l.r??{},updates:[{height:r,txid:s,records:l.r??{}}]})}else if(l.o==="TUPD"){let h=o.get(c);if(!h||!i.some(u=>u.tokenData&&u.tokenData.category===h.category))continue;h.records=l.r??{},h.updates.push({height:r,txid:s,records:h.records})}}return o}function xn(e,t){if(!e)return{};let n=e.updates||[];if(!n.length)return e.records||{};let o={};for(let s of n)t>0&&(s.height<=0||s.height>t)||(o=s.records||{});return o}function kn(e,t){let n=xn(e,t);return n.policy==="cosign"||n.hidden===1||n.hidden===!0||n.hidden==="1"}function bn(e,t,n){let o=Jt(n);return(e||[]).some(s=>s.tokenData&&s.tokenData.category===t.category&&s.tokenData.nft&&s.tokenData.nft.commitment===o)}function ke(e){if(!e||!e.scriptPubKey)return null;let t=e.scriptPubKey;return typeof t.address=="string"?t.address:Array.isArray(t.addresses)&&t.addresses.length?t.addresses[0]:null}async function gt({electrum:e=hn,WebSocket:t,client:n,directIP:o=!1,enforceTld:s=!1,cosignGate:r=!0}={}){let a=n??await yn(e,t,{directIP:o});try{let i=null;if(s||r)try{i=await Pt(a)}catch(d){if(s)throw d;i=null}let l=null,c;if(typeof a.unionHistory=="function"){let d=await a.unionHistory(me);c=d.history,l={servers:d.servers,unreachable:d.unreachable,disagreements:d.disagreements}}else c=await a.call("blockchain.scripthash.get_history",[me]);c.sort(ve);let h=new Map;for(let{tx_hash:d}of c)try{h.set(d,await a.call("blockchain.transaction.get",[d,!0]))}catch{}let u=new Map;for(let{tx_hash:d,height:f}of Te(c.filter(m=>h.has(m.tx_hash)),h)){let g=h.get(d).vout||[],p=null;for(let x of g)p=Se(x.scriptPubKey?.hex)??p;if(!p)continue;let y=p.n;if(!un.test(y))continue;let w=dn(y);if(p.o==="REG"){if(u.has(w)||s&&!wn(jt(w),f,i))continue;if(r&&i){let b=i.get(jt(w));if(b&&kn(b,f)&&!bn(g,b,jt(w)))contin