import{generateBip39Mnemonic as dn,deriveSeedFromBip39Mnemonic as ye,deriveHdPrivateNodeFromSeed as hn,deriveHdPath as pn,secp256k1 as me,hash160 as fn,encodeCashAddress as Ko,lockingBytecodeToCashAddress as gn,cashAddressToLockingBytecode as Go,binToHex as yn,hexToBin as Wo,utf8ToBin as ke,binToBase64 as Ht,base64ToBin as Kt}from"@bitauth/libauth";var Et="bchtest";var Gt="m/44'/145'/0'",mn=5,At="bns.wallet.v1";function be(t){let e=fn(t);return Uint8Array.from([118,169,20,...e,136,172])}function we(t,e,n){let o=gn({bytecode:be(t),prefix:e,tokenSupport:n});if(typeof o=="string")throw new Error(`address encoding failed: ${o}`);return o.address}var Wt=class t{constructor(e,n,o=Et,s=Gt){this.mnemonic=e,this.prefix=o,this.accountPath=s,this._root=hn(n),this._keys=new Map,this._derive()}static async create(e=Et,n=Gt){let o=dn();return new t(o,await ye(o),e,n)}static async fromMnemonic(e,n=Et,o=Gt){let s=String(e).trim().toLowerCase().replace(/\s+/g," "),r=await ye(s);if(typeof r=="string")throw new Error(`invalid recovery phrase: ${r}`);return new t(s,r,n,o)}_derive(){this.receive=[],this.change=[];for(let[e,n]of[[0,this.receive],[1,this.change]])for(let o=0;oe.address)}keyFor(e){let n=this._keys.get(e);return n?{privateKey:n.privateKey,publicKey:n.publicKey}:null}signMessage(e,n){if(!(e instanceof Uint8Array)||e.length!==32)throw new Error("signMessage expects a 32-byte Uint8Array digest");let o=n||this.address,s=[...this.receive,...this.change].find(h=>h.address===o);if(!s)throw new Error(`no key for address ${o}`);let r=me.signMessageHashRecoverableCompact(s.privateKey,e);if(typeof r=="string")throw new Error(`signMessage failed: ${r}`);let{signature:a}=r,i=r.recoveryId??r.recovery;if(typeof i!="number")throw new Error("signMessage: no recovery id in signature result");let l=31+i,c=new Uint8Array(65);return c[0]=l,c.set(a,1),c}async encrypt(e){let n=crypto.getRandomValues(new Uint8Array(16)),o=crypto.getRandomValues(new Uint8Array(12)),s=await xe(e,n),r=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o},s,ke(this.mnemonic)));return JSON.stringify({v:1,kdf:"PBKDF2-SHA256",iterations:qt,prefix:this.prefix,salt:Ht(n),iv:Ht(o),ct:Ht(r)})}static async decrypt(e,n){let o=typeof e=="string"?JSON.parse(e):e,s=await xe(n,Kt(o.salt),o.iterations??qt),r;try{r=await crypto.subtle.decrypt({name:"AES-GCM",iv:Kt(o.iv)},s,Kt(o.ct))}catch{throw new Error("wrong password")}return t.fromMnemonic(new TextDecoder().decode(r),o.prefix??Et)}async save(e,n=globalThis.localStorage){n.setItem(At,await this.encrypt(e))}static async load(e,n=globalThis.localStorage){let o=n.getItem(At);return o?t.decrypt(o,e):null}static exists(e=globalThis.localStorage){return!!e?.getItem(At)}static forget(e=globalThis.localStorage){e.removeItem(At)}},qt=25e4;async function xe(t,e,n=qt){let o=await crypto.subtle.importKey("raw",ke(String(t)),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:e,iterations:n,hash:"SHA-256"},o,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}var Bt=["wss://silentmode.st/electrum","wss://chipnet.bch.ninja:50004","wss://chipnet.imaginary.cash:50004","wss://tbch4.loping.net:62002"],zt=class{constructor(e,n){this.url=e,this.WS=n||globalThis.WebSocket,this.id=0,this.pending=new Map,this.buf=""}connect(){return new Promise((e,n)=>{let o=new this.WS(this.url);this.ws=o;let s=async()=>{try{await this.call("server.version",["bns-web","1.4.2"]),e(this)}catch(i){n(i)}},r=i=>n(new Error("electrum ws error: "+(i?.message||this.url))),a=i=>this._onData(typeof i.data=="string"?i.data:i.data.toString());o.addEventListener?(o.addEventListener("open",s),o.addEventListener("error",r),o.addEventListener("message",a)):(o.onopen=s,o.onerror=r,o.onmessage=a)})}_handle(e){let n=this.pending.get(e.id);n&&(this.pending.delete(e.id),e.error?n.reject(new Error(JSON.stringify(e.error))):n.resolve(e.result))}_onData(e){this.buf+=e;let n;for(;(n=this.buf.indexOf(` `))>=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(e,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:e,params:n})+` `),setTimeout(()=>{this.pending.has(o)&&(this.pending.delete(o),r(new Error(`electrum timeout: ${e}`)))},2e4)})}close(){try{this.ws.close()}catch{}}};async function Se(t=Bt,e){let n=[];for(let o of t)try{return await new zt(o,e).connect()}catch(s){n.push(`${o}: ${s?.message??s}`)}throw wn(t.length,n)}function wn(t,e){let n=new Error(`no electrum server reachable (tried ${t}). These use non-standard ports, which some networks and VPNs block: ${e.join(` `)}`);return n.code="NO_ELECTRUM",n.failures=e,n}import{cashAddressToLockingBytecode as xn,lockingBytecodeToCashAddress as kn,sha256 as bn,hash160 as Yo,binToHex as Sn,hexToBin as Vo}from"@bitauth/libauth";function Te(t){return Sn(bn.hash(t).slice().reverse())}function L(t){let e=xn(t);if(typeof e=="string")throw new Error(`bad address "${t}": ${e}`);return e.bytecode}function Tn(t){return Te(L(t))}function W(t){let e=L(t),n=String(t).includes(":")?t.split(":")[0]:"bchtest",o=kn({bytecode:e,prefix:n,tokenSupport:!0});if(typeof o=="string")throw new Error(`cannot token-encode "${t}": ${o}`);return o.address}async function _e(t,e){let n=L(e),o=Te(n);return(await t.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:e,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}:void 0}:void 0}))}async function z(t,e){let n=[];for(let o of e)n.push(...await _e(t,o));return n}async function ot(t,e){return t.call("blockchain.transaction.broadcast",[e])}import{binToHex as Pt,hexToBin as V,utf8ToBin as pt,binToUtf8 as Oe,encodeTransaction as _n,decodeTransaction as Qo}from"@bitauth/libauth";var On="BNS1",ut="bchtest:qp8njaa9a3ahg7259s5qajnce526n0rttsq8qwx4jl",Vt="bchtest:qzc4c76vtw9nd49g6x8nmvc0jz62uvk4dc7hmpmerh",v=600n,I=1000n,K=546n,jt="bch",Yt=200,En=/^[a-z0-9-]{1,32}$/,Ee=/^[a-z0-9-]{1,16}$/;function kt(t){let e=String(t).toLowerCase().trim().replace(/^\.+/,"").replace(/\.+$/,"");if(!Ee.test(e))throw new Error(`invalid TLD "${t}" (allowed: [a-z0-9-]{1,16})`);return e}var It=class extends Error{constructor(e){super(e),this.name="NoGenesisInputError",this.code="NO_GENESIS_INPUT"}},J=class extends Error{constructor(e,{needSats:n,haveSats:o}={}){super(e),this.name="InsufficientFundsError",this.code="INSUFFICIENT_FUNDS",this.needSats=n,this.haveSats=o}};function M(t){let e=String(t).toLowerCase().trim().replace(/\.$/,"").split(".").filter(Boolean),n,o;if(e.length===0)throw new Error(`invalid name "${t}"`);if(e.length===1?(n=e[0],o=jt):(o=e[e.length-1],n=e[e.length-2]),!En.test(n)||!Ee.test(o))throw new Error(`invalid name "${t}" (allowed: