`))>=0;){let r=this.buf.slice(0,n).trim();if(this.buf=this.buf.slice(n+1),r)try{this._handle(JSON.parse(r))}catch{}}let s=this.buf.trim();if(s)try{let r=JSON.parse(s);this._handle(r),this.buf=""}catch{}}call(t,n=[]){let s=++this.id;return new Promise((r,o)=>{this.pending.set(s,{resolve:r,reject:o}),this.ws.send(JSON.stringify({id:s,method:t,params:n})+`
`),setTimeout(()=>{this.pending.has(s)&&(this.pending.delete(s),o(new Error(`electrumtimeout:${t}`)))},2e4)})}close(){try{this.ws.close()}catch{}}};async function It(e=et,t){let n=[];for(let s of e)try{return await new ft(s,t).connect()}catch(r){n.push(`${s}:${r?.message??r}`)}throw Qt(e.length,n)}function Qt(e,t){let n=new Error(`noelectrumserverreachable(tried${e}).Theseusenon-standardports,whichsomenetworksandVPNsblock:
${t.join(`
`)}`);returnn.code="NO_ELECTRUM",n.failures=t,n}import{cashAddressToLockingBytecodeasZt,lockingBytecodeToCashAddressaste,sha256asee,hash160asJe,binToHexasne,hexToBinasYe}from"@bitauth/libauth";functionse(e){returnne(ee.hash(e).slice().reverse())}functionk(e){lett=Zt(e);if(typeoft=="string")thrownewError(`bad address "${e}": ${t}`);returnt.bytecode}functionF(e){lett=k(e),n=String(e).includes(":")?e.split(":")[0]:"bchtest",s=te({bytecode:t,prefix:n,tokenSupport:!0});if(typeofs=="string")thrownewError(`cannot token-encode "${e}": ${s}`);returns.address}asyncfunctionRt(e,t){letn=k(t),s=se(n);return(awaite.call("blockchain.scripthash.listunspent",[s,"include_tokens"])).map(o=>({txid:o.tx_hash,vout:o.tx_pos,satoshis:BigInt(o.value),height:o.height,address:t,lockingBytecode:n,token:o.token_data?{category:o.token_data.category,amount:BigInt(o.token_data.amount??0),nft:o.token_data.nft?{capability:o.token_data.nft.capability,commitment:o.token_data.nft.commitment}:void0}:void0}))}asyncfunctionN(e,t){letn=[];for(letsoft)n.push(...awaitRt(e,s));returnn}asyncfunctionK(e,t){returne.call("blockchain.transaction.broadcast",[t])}import{binToHexasUt,hexToBinasG,utf8ToBinasnt,binToUtf8asoe,encodeTransactionasre,decodeTransactionasQe}from"@bitauth/libauth";varie="BNS1",Ot="bchtest:qp8njaa9a3ahg7259s5qajnce526n0rttsq8qwx4jl",U=600n,j=1000n,W=546n,gt="bch",yt=200,ae=/^[a-z0-9-]{1,32}$/,ce=/^[a-z0-9-]{1,16}$/;varst=classextendsError{constructor(t){super(t),this.name="NoGenesisInputError",this.code="NO_GENESIS_INPUT"}},O=classextendsError{constructor(t,{needSats:n,haveSats:s}={}){super(t),this.name="InsufficientFundsError",this.code="INSUFFICIENT_FUNDS",this.needSats=n,this.haveSats=s}};functionC(e){lett=String(e).toLowerCase().trim().replace(/\.$/,"").split(".").filter(Boolean),n,s;if(t.length===0)thrownewError(`invalid name "${e}"`);if(t.length===1?(n=t[0],s=gt):(s=t[t.length-1],n=t[t.length-2]),!ae.test(n)||!ce.test(s))thrownewError(`invalid name "${e}" (allowed: <label>.<tld>, [a-z0-9-])`);returns===gt?n:`${n}.${s}`}functionE(e){returne.includes(".")?e:`${e}.${gt}`}functionwt(e,t,n){lets=JSON.stringify({o:e,n:t,r:n??{}}),r=nt(ie+s);if(r.length>yt)thrownewError(`records too large (${r.length} > ${yt} bytes)`);returnr}functionmt(e,t="REG"){returnyt-wt(t,e,{}).length}functionle(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])}functionFt(e){returnUint8Array.from([106,...le(e)])}functionde(){returnUint8Array.from([65,...newUint8Array(65),33,...newUint8Array(33)])}varhe=e=>!e.token;functionq(e,t,{requireGenesis:n=!0}={}){lets=e.filter(he),r=[],o=0n;if(n){leta=s.filter(c=>c.vout===0).sort((c,l)=>l.satoshis>c.satoshis?1:-1);if(a.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)");r.push(a[0]),o+=a[0].satoshis}leti=s.filter(a=>!r.some(c=>c.txid===a.txid&&c.vout===a.vout)).sort((a,c)=>c.satoshis>a.satoshis?1:-1);for(letaofi){if(o>=t)break;r.push(a),o+=a.satoshis}return{inputs:r,totalSats:o}}functionX(e){return{outpointTransactionHash:G(e.txid),outpointIndex:e.vout,sequenceNumber:4294967294,unlockingBytecode:de()}}functionot(e){return{...X(e),lockingBytecode:e.lockingBytecode,valueSatoshis:e.satoshis,...e.token?{token:{amount:e.token.amount??0n,category:G(e.token.category),...e.token.nft?{nft:{capability:e.token.nft.capability,commitment:G(e.token.nft.commitment||"")}}:{}}}:{}}}functionV(e){returnre(e).length}functionxt({name:e,ownerAddress:t,ownerTokenAddress:n,changeAddress:s,records:r={},utxos:o,feeAddress:i=null,feeSats:a=0n,beaconAddress:c=Ot,feeRate:l=1,addressToLockingBytecode:h}){if(typeofh!="function")thrownewError("addressToLockingBytecode must be injected (see chain.js)");letd=C(e),p=wt("REG",d,r),g=BigInt(a??0n);if(g>0n&&!i)thrownewError("feeSats set but feeAddress missing");letu=h(s??t),f
`))>=0;){let r=this.buf.slice(0,n).trim();if(this.buf=this.buf.slice(n+1),r)try{this._handle(JSON.parse(r))}catch{}}let s=this.buf.trim();if(s)try{let r=JSON.parse(s);this._handle(r),this.buf=""}catch{}}call(t,n=[]){let s=++this.id;return new Promise((r,o)=>{this.pending.set(s,{resolve:r,reject:o}),this.ws.send(JSON.stringify({id:s,method:t,params:n})+`
`),setTimeout(()=>{this.pending.has(s)&&(this.pending.delete(s),o(new Error(`electrumtimeout:${t}`)))},2e4)})}close(){try{this.ws.close()}catch{}}},ve=e=>typeof e=="string"?{url:e}:e;async function Te(e,t,{directIP:n=!1}={}){let s;for(let r of e){let o=ve(r);try{return await new at(o.url,t).connect()}catch(i){s=i}if(n&&o.ip)try{let i=new URL(o.url),a=`${i.protocol}//${o.ip}:${i.port}`;return await new at(a,t,{servername:i.hostname}).connect()}catch(i){s=i}}throw s??new Error("no electrum server reachable")}function Ee(e){if(!e||!e.startsWith("6a"))return null;let t=be(e),n=1,s=[];for(;n<t.length;){let o=t[n++],i;if(o<=75)i=o;else if(o===76)i=t[n++];else if(o===77)i=t[n]|t[n+1]<<8,n+=2;else return null;s.push(t.slice(n,n+i)),n+=i}let r=new TextDecoder().decode(s[0]??new Uint8Array);if(!r.startsWith(Mt))return null;try{let o=JSON.parse(r.slice(Mt.length));if((o.o==="REG"||o.o==="UPD")&&typeof o.n=="string")return o}catch{}return null}function Ae(e,t){let n=e.height>0?e.height:1/0,s=t.height>0?t.height:1/0;return n-s||e.tx_hash.localeCompare(t.tx_hash)}function _e(e,t){let n=new Set(e.map(a=>a.tx_hash)),s=new Map(e.map(a=>{let c=new Set;for(let l of t.get(a.tx_hash)?.vin??[])l.txid&&l.txid!==a.tx_hash&&n.has(l.txid)&&c.add(l.txid);return[a.tx_hash,c]})),r=new Set,o=[],i=[...e];for(;i.length;){let a=i.findIndex(l=>[...s.get(l.tx_hash)].every(h=>r.has(h)));a<0&&(a=0);let[c]=i.splice(a,1);r.add(c.tx_hash),o.push(c)}return o}async function z({electrum:e=xe,WebSocket:t,client:n,directIP:s=!1}={}){let r=n??await Te(e,t,{directIP:s});try{let o=null,i;if(typeof r.unionHistory=="function"){let l=await r.unionHistory(Ht);i=l.history,o={servers:l.servers,unreachable:l.unreachable,disagreements:l.disagreements}}else i=await r.call("blockchain.scripthash.get_history",[Ht]);i.sort(Ae);let a=new Map;for(let{tx_hash:l}of i)try{a.set(l,await r.call("blockchain.transaction.get",[l,!0]))}catch{}let c=new Map;for(let{tx_hash:l,height:h}of _e(i.filter(d=>a.has(d.tx_hash)),a)){let p=a.get(l).vout||[],g=null;for(let w of p)g=Ee(w.scriptPubKey?.hex)??g;if(!g)continue;let u=g.n;if(!we.test(u))continue;let f=me(u);if(g.o==="REG"){if(c.has(f))continue;let w=ke(u),m=p.find(y=>y.tokenData?.nft&&y.tokenData.nft.commitment===w);if(!m)continue;c.set(f,{name:f,category:m.tokenData.category,records:g.r??{},txid:l,height:h,updatedTxid:null})}else if(g.o==="UPD"){let w=c.get(f);if(!w||!p.some(y=>y.tokenData&&y.tokenData.category===w.category))continue;w.records=g.r??{},w.updatedTxid=l}}return o&&Object.defineProperty(c,"integrity",{value:o,enumerable:!1}),c}finally{n||r.close()}}async function Be(e,t={}){let n=Se(e);return(await z(t)).get(n)??null}var b={network:"chipnet",addressPrefix:"bchtest",selfHosted:null,get electrum(){return this.selfHosted?[this.selfHosted,...et]:et},beacon:"bchtest:qp8njaa9a3ahg7259s5qajnce526n0rttsq8qwx4jl",serviceFee:{address:"bchtest:qzew3dqcsj0guwe5y3uxf9q2xs5ajgy9lca4z093cu",sats:10000n},feeRate:1,wizardConnect:{dappName:"Silent Mode",dappIcon:"https://silentmode.st/icon.png"},faucets:[{name:"tbch.googol.cash",url:"https://tbch.googol.cash/"},{name:"chipnet.bch.ninja faucet",url:"https://chipnet.bch.ninja/faucet"}]};function Ne(e){let t=n=>(Number(n)/1e8).toFixed(8).replace(/0+$/,"").replace(/\.$/,"");return[{label:"Service fee",sats:e.serviceFeeSats,bch:t(e.serviceFeeSats)},{label:"Network fee",sats:e.chainFeeSats,bch:t(e.chainFeeSats)},{label:"Discovery beacon",sats:e.beaconDustSats,bch:t(e.beaconDustSats)},{label:"Held in the certificate",sats:e.certificateDustSats,bch:t(e.certificateDustSats),note:"stays yours \u2014 it lives in the certificate you now own"},{label:"Total",sats:e.netCostSats,bch:t(e.netCostSats),total:!0}]}async function $e({electrum:e=b.electrum,WebSocket:t}={}){return It(e,t)}async function Tt(e,t){let n=C(t),s=E(n),o=(await z({client:e})).get(s)??null;return{name:s,rawName:n,available:!o,entry:o,recordBudgetBytes:mt(n)}}async function Et(e,{name:t,ownerAddress:n,records:s={},utxos:r,serviceFee:o=b.serviceFee,feeRate:i=b.feeRate}){let a=r??await N(e,[n]);return xt({name:t,ownerAddress:n,ownerTokenAddre