import{generateBip39Mnemonic as ae,deriveSeedFromBip39Mnemonic as Lt,deriveHdPrivateNodeFromSeed as ce,deriveHdPath as le,secp256k1 as de,hash160 as ue,encodeCashAddress as un,lockingBytecodeToCashAddress as he,cashAddressToLockingBytecode as hn,binToHex as pe,hexToBin as pn,utf8ToBin as Ht,binToBase64 as xt,base64ToBin as bt}from"@bitauth/libauth";var at="bchtest";var fe="m/44'/145'/0'",ge=5,ht="bns.wallet.v1";function Mt(e){let t=ue(e);return Uint8Array.from([118,169,20,...t,136,172])}function Ct(e,t,n){let s=he({bytecode:Mt(e),prefix:t,tokenSupport:n});if(typeof s=="string")throw new Error(`address encoding failed: ${s}`);return s.address}var St=class e{constructor(t,n,s=at){this.mnemonic=t,this.prefix=s,this._root=ce(n),this._keys=new Map,this._derive()}static async create(t=at){let n=ae();return new e(n,await Lt(n),t)}static async fromMnemonic(t,n=at){let s=String(t).trim().toLowerCase().replace(/\s+/g," "),o=await Lt(s);if(typeof o=="string")throw new Error(`invalid recovery phrase: ${o}`);return new e(s,o,n)}_derive(){this.receive=[],this.change=[];for(let[t,n]of[[0,this.receive],[1,this.change]])for(let s=0;st.address)}keyFor(t){let n=this._keys.get(t);return n?{privateKey:n.privateKey,publicKey:n.publicKey}:null}async encrypt(t){let n=crypto.getRandomValues(new Uint8Array(16)),s=crypto.getRandomValues(new Uint8Array(12)),o=await Ut(t,n),r=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:s},o,Ht(this.mnemonic)));return JSON.stringify({v:1,kdf:"PBKDF2-SHA256",iterations:kt,prefix:this.prefix,salt:xt(n),iv:xt(s),ct:xt(r)})}static async decrypt(t,n){let s=typeof t=="string"?JSON.parse(t):t,o=await Ut(n,bt(s.salt),s.iterations??kt),r;try{r=await crypto.subtle.decrypt({name:"AES-GCM",iv:bt(s.iv)},o,bt(s.ct))}catch{throw new Error("wrong password")}return e.fromMnemonic(new TextDecoder().decode(r),s.prefix??at)}async save(t,n=globalThis.localStorage){n.setItem(ht,await this.encrypt(t))}static async load(t,n=globalThis.localStorage){let s=n.getItem(ht);return s?e.decrypt(s,t):null}static exists(t=globalThis.localStorage){return!!t?.getItem(ht)}static forget(t=globalThis.localStorage){t.removeItem(ht)}},kt=25e4;async function Ut(e,t,n=kt){let s=await crypto.subtle.importKey("raw",Ht(String(e)),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:n,hash:"SHA-256"},s,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}var pt=["wss://silentmode.st/electrum","wss://chipnet.bch.ninja:50004","wss://chipnet.imaginary.cash:50004","wss://tbch4.loping.net:62002"],vt=class{constructor(t,n){this.url=t,this.WS=n||globalThis.WebSocket,this.id=0,this.pending=new Map,this.buf=""}connect(){return new Promise((t,n)=>{let s=new this.WS(this.url);this.ws=s;let o=async()=>{try{await this.call("server.version",["bns-web","1.4.2"]),t(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());s.addEventListener?(s.addEventListener("open",o),s.addEventListener("error",r),s.addEventListener("message",a)):(s.onopen=o,s.onerror=r,s.onmessage=a)})}_handle(t){let n=this.pending.get(t.id);n&&(this.pending.delete(t.id),t.error?n.reject(new Error(JSON.stringify(t.error))):n.resolve(t.result))}_onData(t){this.buf+=t;let n;for(;(n=this.buf.indexOf(` `))>=0;){let o=this.buf.slice(0,n).trim();if(this.buf=this.buf.slice(n+1),o)try{this._handle(JSON.parse(o))}catch{}}let s=this.buf.trim();if(s)try{let o=JSON.parse(s);this._handle(o),this.buf=""}catch{}}call(t,n=[]){let s=++this.id;return new Promise((o,r)=>{this.pending.set(s,{resolve:o,reject:r}),this.ws.send(JSON.stringify({id:s,method:t,params:n})+` `),setTimeout(()=>{this.pending.has(s)&&(this.pending.delete(s),r(new Error(`electrum timeout: ${t}`)))},2e4)})}close(){try{this.ws.close()}catch{}}};async function Wt(e=pt,t){let n=[];for(let s of e)try{return await new vt(s,t).connect()}catch(o){n.push(`${s}: ${o?.message??o}`)}throw ye(e.length,n)}function ye(e,t){let n=new Error(`no electrum server reachable (tried ${e}). These use non-standard ports, which some networks and VPNs block: ${t.join(` `)}`);return n.code="NO_ELECTRUM",n.failures=t,n}import{cashAddressToLockingBytecode as we,lockingBytecodeToCashAddress as me,sha256 as xe,hash160 as wn,binToHex as be,hexToBin as mn}from"@bitauth/libauth";function jt(e){return be(xe.hash(e).slice().reverse())}function S(e){let t=we(e);if(typeof t=="string")throw new Error(`bad address "${e}": ${t}`);return t.bytecode}function Se(e){return jt(S(e))}function F(e){let t=S(e),n=String(e).includes(":")?e.split(":")[0]:"bchtest",s=me({bytecode:t,prefix:n,tokenSupport:!0});if(typeof s=="string")throw new Error(`cannot token-encode "${e}": ${s}`);return s.address}async function Kt(e,t){let n=S(t),s=jt(n);return(await e.call("blockchain.scripthash.listunspent",[s,"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}:void 0}:void 0}))}async function R(e,t){let n=[];for(let s of t)n.push(...await Kt(e,s));return n}async function q(e,t){return e.call("blockchain.transaction.broadcast",[t])}import{binToHex as At,hexToBin as Y,utf8ToBin as ct,binToUtf8 as ke,encodeTransaction as ve,decodeTransaction as Sn}from"@bitauth/libauth";var Te="BNS1",zt="bchtest:qp8njaa9a3ahg7259s5qajnce526n0rttsq8qwx4jl",qt="bchtest:qzc4c76vtw9nd49g6x8nmvc0jz62uvk4dc7hmpmerh",I=600n,M=1000n,G=546n,Tt="bch",Et=200,Ee=/^[a-z0-9-]{1,32}$/,Gt=/^[a-z0-9-]{1,16}$/;function dt(e){let t=String(e).toLowerCase().trim().replace(/^\.+/,"").replace(/\.+$/,"");if(!Gt.test(t))throw new Error(`invalid TLD "${e}" (allowed: [a-z0-9-]{1,16})`);return t}var ft=class extends Error{constructor(t){super(t),this.name="NoGenesisInputError",this.code="NO_GENESIS_INPUT"}},U=class extends Error{constructor(t,{needSats:n,haveSats:s}={}){super(t),this.name="InsufficientFundsError",this.code="INSUFFICIENT_FUNDS",this.needSats=n,this.haveSats=s}};function P(e){let t=String(e).toLowerCase().trim().replace(/\.$/,"").split(".").filter(Boolean),n,s;if(t.length===0)throw new Error(`invalid name "${e}"`);if(t.length===1?(n=t[0],s=Tt):(s=t[t.length-1],n=t[t.length-2]),!Ee.test(n)||!Gt.test(s))throw new Error(`invalid name "${e}" (allowed: