The addendum states the claim, the paid-entry rule, why a name inside the covenant answers only to a verified state, and when a name stops resolving. The registration bundle is rebuilt so the dashboard and market index names by the same rules as the gateway.
7 lines
74 KiB
JavaScript
7 lines
74 KiB
JavaScript
import{generateBip39Mnemonic as lo,deriveSeedFromBip39Mnemonic as ze,deriveHdPrivateNodeFromSeed as uo,deriveHdPath as fo,secp256k1 as Ye,hash160 as ho,encodeCashAddress as Ms,lockingBytecodeToCashAddress as po,cashAddressToLockingBytecode as $s,binToHex as go,hexToBin as Hs,utf8ToBin as Je,binToBase64 as oe,base64ToBin as se}from"@bitauth/libauth";var vt={chipnet:{id:"chipnet",label:"chipnet",prefix:"bchtest",beacon:"bchtest:qp8njaa9a3ahg7259s5qajnce526n0rttsq8qwx4jl",beaconScripthash:"e1cdbba719436f49acb4bf245b44df875c6d6b405eda46a9d3e736d138102f3b",tldBeacon:"bchtest:qzc4c76vtw9nd49g6x8nmvc0jz62uvk4dc7hmpmerh",tldBeaconScripthash:"c85db10e106606273422b2733b2a6fb8b35a4d0e7dbfb20cf59bdb0833c008b8",electrum:[{url:"wss://silentmode.st/electrum",ip:"195.184.247.106"},{url:"wss://coinspectrum.duckdns.org:50011",ip:"195.184.247.106"},{url:"wss://chipnet.bch.ninja:50004",ip:"135.148.236.244"},{url:"wss://chipnet.imaginary.cash:50004",ip:"66.29.152.199"},{url:"wss://tbch4.loping.net:62002",ip:"183.89.202.207"}],beaconOnly:/silentmode\.st\/electrum|coinspectrum\.duckdns\.org:50011/,electrumListName:"electrum.bch",rootTldName:"tlds.bch",bootstrapTlds:["bch"],startHeight:2e5,hostingBucket:"bns",nameListUrl:"https://dl.silentmode.st/bns-name-snapshot.json",nameListMirrorUrl:"https://navigate.st/bns/silentmode.bch/bns-name-snapshot.json",cdnIndexUrl:"https://dl.silentmode.st/bns-name-index.json",nostrTags:{names:"bns-name-list",tlds:"bns-tld-list"},explorerTx:"https://chipnet.imaginary.cash/tx/",faucets:[{name:"tbch.googol.cash",url:"https://tbch.googol.cash/"},{name:"chipnet.bch.ninja faucet",url:"https://chipnet.bch.ninja/faucet"}],operatorAddress:"bchtest:qzew3dqcsj0guwe5y3uxf9q2xs5ajgy9lca4z093cu",accountPath:"m/44'/145'/0'",bchnRpcPort:48332,blocklists:[{name:"sirius-blocklist.x",beacon:"bchtest:qrrnwvuasq5fy63mdvp3umx5qfavtu7mnq950rdssw",scripthash:"fa14c5fd7a22bd1856b44168823a1ab3ff50961c917dafbcba749aeaa7b26646"}],covenant:{version:1,fundLock:"76a914b2e8b418849e8e3b34247864940a3429d92085fe88ac",steward:"02817a308db60d949f5a0543085f6757578dab169d4381934e997cbaef52c34c0d",blocksPerYear:52560,graceBlocks:26280,tiers:[{maxLabel:2,renewalSats:2e6,head:"011e0350cd0002a86604809698000400e1f5050380841e"},{maxLabel:4,renewalSats:5e5,head:"011e0350cd0002a86603a025260440787d010320a107"},{maxLabel:7,renewalSats:2e5,head:"011e0350cd0002a8660340420f048096980003400d03"},{maxLabel:255,renewalSats:1e5,head:"011e0350cd0002a8660320a10703404b4c03a08601"}],tail:"105279a97b887b7bad51b275827701209c2102817a308db60d949f5a0543085f6757578dab169d4381934e997cbaef52c34c0d1976a914b2e8b418849e8e3b34247864940a3429d92085fe88ac5b79009c635c79a95b79885d7a5d7aad5c7951a269597a815c79597a959376040065cd1d9f6901145a7a7e547e7c54807ec1011a7f777eaa00cd02aa207b7e01877e8800d1c0ce8800d2c0cf8800ccc0c6a26951cd8851cc537a597a95a26951d100886d6d6d7551675b79519c635e7a820114885d79a95c7a885d7a5d7aad01147c7e547e5a7a7ec1011a7f777eaa00cd02aa207b7e01877e8800d1c0ce8800d2c0cf8800ccc0c6a2696d6d6d6d6d51675b79529c635c7a820114885a7a8176b175c576040065cd1d9f697c597993587900709f635a795a795c79945479567994955d7996937b757c785e799501649677686079827701209dc0cf01117a7eaa011456797e01207e7c7e587a7e51c702aa207baa7e01877e8853795c7993040065cd1d9f690114557a7e547e547a5b7a9354807ec1011a7f777eaa00cd02aa207b7e01877e8800d1c0ce8800d2c0cf8800ccc0c6a26951cd547a8851cc7b527994a26951d100887600a06352cd0376a9145a797e0288ac7e8852cc78a26952d10088686d6d6d6d6d51675b79539c635c79a95b7a885c7a5c7aadc0cec454a16900d178879169c451a06351d17887916968c452a06352d17887916968c453a06353d178879169686d6d6d6d6d6d51675b7a549d5b79a95b79885c7a5c7aadc1011a7f77aa5c7a7c5d79aa7eaa537abb01145a7a7e547e597a7e597a7eaa00cd02aa207b7e01877e8800d1c0ce8800d2c0cf8800ccc0c6a2696d6d6d6d5168686868"}},mainnet:{id:"mainnet",label:"mainnet",prefix:"bitcoincash",beacon:null,beaconScripthash:null,tldBeacon:null,tldBeaconScripthash:null,electrum:[{url:"wss://bch.imaginary.cash:50004",ip:"67.223.119.97"},{url:"wss://electrum.imaginary.cash:50004",ip:"15.204.113.162"},{url:"wss://electroncash.dk:50004",ip:"87.63.200.138"},{url:"wss://bch.loping.net:50004",ip:"183.89.202.207"},{url:"wss://bch.soul-dev.com:50004",ip:"174.141.196.204"},{url:"wss://cashnode.bch.ninja:50004",ip:"135.148.236.246"}],beaconOnly:/(?!)/,electrumListName:"electrum.bch",rootTldName:"tlds.bch",bootstrapTlds:["bch"],startHeight:null,hostingBucket:"bns-mainnet",nameListUrl:"https://s3.silentmode.st:8600/bns-mainnet/name-list.json",cdnIndexUrl:"https://dl.silentmode.st/bns-mainnet-name-index.json",nostrTags:{names:"bns-mainnet-name-list",tlds:"bns-mainnet-tld-list"},explorerTx:"https://blockchair.com/bitcoin-cash/transaction/",faucets:[],operatorAddress:null,accountPath:"m/44'/145'/0'",bchnRpcPort:8332,blocklists:[],covenant:null}},Fe="chipnet";function Cn(){let t=typeof globalThis<"u"?globalThis.BNS_NETWORK:null,e=typeof process<"u"&&process.env?process.env.BNS_NETWORK:null;return String(t||e||Fe).trim().toLowerCase()}function st(t){if(t&&typeof t=="object")return t;let e=t||Cn(),n=vt[e];if(!n)throw new Error(`unknown network "${e}" (known: ${Object.keys(vt).join(", ")})`);return n}var S=st();function Xt(t=S){let e=st(t);if(!e.beaconScripthash||!e.tldBeaconScripthash)throw new Error(`${e.label}: beacon addresses are not pinned yet (see ROADMAP-MAINNET.md \xA76)`);return e}var As=S.beacon,Bs=S.beaconScripthash,Is=S.tldBeacon,Ps=S.tldBeaconScripthash,Ns=S.electrum,Rs=vt.chipnet.electrum,Ls=S.electrumListName,Pe="BNS1";var Me="bch",Dn=/^[a-z0-9-]{1,32}$/,$e=/^[a-z0-9-]{1,16}$/,He=/^[a-z0-9-]{1,32}(\.[a-z0-9-]{1,16})?$/;function Ke(t){return t.includes(".")?t:t+"."+Me}var Ut=t=>{let e=new Uint8Array(t.length/2);for(let n=0;n<e.length;n++)e[n]=parseInt(t.substr(n*2,2),16);return e},Jt=t=>[...new TextEncoder().encode(t)].map(e=>e.toString(16).padStart(2,"0")).join("");function Un(t){let n=String(t).toLowerCase().trim().replace(/^[a-z]+:\/\//,"").split("/")[0].replace(/\.$/,"").split(".").filter(Boolean);if(n.length===0)throw new Error(`invalid name "${t}"`);let o,s;if(n.length===1?(o=n[0],s=Me):(s=n[n.length-1],o=n[n.length-2]),!Dn.test(o)||!$e.test(s))throw new Error(`invalid name "${t}" (allowed: <label>.<tld>, [a-z0-9-])`);return`${o}.${s}`}var Lt=class{constructor(e,n,o){this.url=e,this.WS=n||globalThis.WebSocket,this.options=o,this.id=0,this.pending=new Map,this.buf=""}connect(){return new Promise((e,n)=>{let o=this.options?new this.WS(this.url,this.options):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(a){n(a)}},r=a=>n(new Error("electrum ws error: "+(a?.message||this.url))),i=a=>this._onData(typeof a.data=="string"?a.data:a.data.toString());o.addEventListener?(o.addEventListener("open",s),o.addEventListener("error",r),o.addEventListener("message",i)):(o.onopen=s,o.onerror=r,o.onmessage=i)})}_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{}}},Fn=t=>typeof t=="string"?{url:t}:t;async function Ct(t,e,{directIP:n=!1}={}){let o;for(let s of t){let r=Fn(s);try{return await new Lt(r.url,e).connect()}catch(i){o=i}if(n&&r.ip)try{let i=new URL(r.url),a=`${i.protocol}//${r.ip}:${i.port}`;return await new Lt(a,e,{servername:i.hostname}).connect()}catch(i){o=i}}throw o??new Error("no electrum server reachable")}function Mn(t){if(!t||!t.startsWith("6a"))return null;let e=Ut(t),n=1,o=[];for(;n<e.length;){let r=e[n++],i;if(r<=75)i=r;else if(r===76)i=e[n++];else if(r===77)i=e[n]|e[n+1]<<8,n+=2;else return null;o.push(e.slice(n,n+i)),n+=i}let s=new TextDecoder().decode(o[0]??new Uint8Array);if(!s.startsWith(Pe))return null;try{let r=JSON.parse(s.slice(Pe.length));if(!$n.has(r.o))return null;if(typeof r.n=="string"||r.o==="RPT"&&Array.isArray(r.n)&&r.n.every(i=>typeof i=="string"))return r}catch{}return null}function Qt(t){let e=null;for(let n of t||[]){let o=Mn(n&&n.scriptPubKey?n.scriptPubKey.hex:null);if(o){if(e)return null;e=o}}return e}var $n=new Set(["REG","UPD","REL","TREG","TUPD","RPT","BLK","UBK"]);function Zt(t,e){let n=t.height>0?t.height:1/0,o=e.height>0?e.height:1/0;return n-o||t.tx_hash.localeCompare(e.tx_hash)}function te(t,e){let n=new Set(t.map(a=>a.tx_hash)),o=new Map(t.map(a=>{let l=new Set;for(let c of e.get(a.tx_hash)?.vin??[])c.txid&&c.txid!==a.tx_hash&&n.has(c.txid)&&l.add(c.txid);return[a.tx_hash,l]})),s=new Set,r=[],i=[...t];for(;i.length;){let a=i.findIndex(c=>[...o.get(c.tx_hash)].every(h=>s.has(h)));a<0&&(a=0);let[l]=i.splice(a,1);s.add(l.tx_hash),r.push(l)}return r}function We(t,e){let n=e&&e.tokenData;if(!n||!n.nft||typeof n.category!="string")return!1;let o=n.category;if(!(t.vin||[]).some(i=>i&&i.txid===o&&i.vout===0)||(t.vout||[]).filter(i=>i.tokenData&&i.tokenData.category===o).length!==1)return!1;let s=n.nft.capability;if(s!=null&&s!==""&&s!=="none")return!1;let r;try{r=BigInt(n.amount??0)}catch{return!1}return r===0n}function Yt(t){let e=t.lastIndexOf(".");return e<0?t:t.slice(e+1)}function Hn(t,e,n){let o=n.get(t);return o?o.regHeight>0&&e>0?o.regHeight<=e:!0:!1}async function ee(t,e=S){let{tldBeaconScripthash:n}=Xt(e),o=typeof t.unionHistory=="function"?(await t.unionHistory(n)).history:await t.call("blockchain.scripthash.get_history",[n]);o.sort(Zt);let s=new Map;for(let{tx_hash:i}of o)try{s.set(i,await t.call("blockchain.transaction.get",[i,!0]))}catch{}let r=new Map;for(let{tx_hash:i,height:a}of te(o.filter(l=>s.has(l.tx_hash)),s)){let l=s.get(i),c=l.vout||[],h=Qt(c);if(!h||typeof h.n!="string"||!$e.test(h.n))continue;let d=h.n;if(h.o==="TREG"){if(r.has(d))continue;let u=Jt(d),f=c.find(y=>y.tokenData?.nft&&y.tokenData.nft.commitment===u);if(!f||!We(l,f))continue;r.set(d,{category:f.tokenData.category,regHeight:a,regTxid:i,mintScriptHex:f.scriptPubKey?.hex??null,records:h.r??{},updates:[{height:a,txid:i,records:h.r??{}}]})}else if(h.o==="TUPD"){let u=r.get(d);if(!u||!c.some(f=>f.tokenData&&f.tokenData.category===u.category))continue;u.records=h.r??{},u.updates.push({height:a,txid:i,records:u.records})}}return r}function Kn(t,e){if(!t)return{};let n=t.updates||[];if(!n.length)return t.records||{};let o={};for(let s of n)e>0&&(s.height<=0||s.height>e)||(o=s.records||{});return o}function Wn(t,e){let n=Kn(t,e);return n.policy==="cosign"||n.hidden===1||n.hidden===!0||n.hidden==="1"}function Gn(t,e,n){let o=Jt(n);return(t||[]).some(s=>s.tokenData&&s.tokenData.category===e.category&&s.tokenData.nft&&s.tokenData.nft.commitment===o)}function Ne(t){if(!t||!t.scriptPubKey)return null;let e=t.scriptPubKey;return typeof e.address=="string"?e.address:Array.isArray(e.addresses)&&e.addresses.length?e.addresses[0]:null}function Ge(t,e){let n=t&&t.txid?e.get(t.txid):null;return!n||!Array.isArray(n.vout)?null:n.vout.find(o=>o&&o.n===t.vout)??n.vout[t.vout]??null}function jn(t,e,n){return!t||!e||!e.category||(t.vout||[]).some(o=>o.tokenData&&o.tokenData.category===e.category)?!1:(t.vin||[]).some(o=>{let s=Ge(o,n);return!!(s&&s.tokenData&&s.tokenData.nft&&s.tokenData.category===e.category)})}function qn(t,e){return t===void 0?!0:t>0?!(e>0)||e>t:!1}async function gt({network:t=S,electrum:e=st(t).electrum,WebSocket:n,client:o,directIP:s=!1,enforceTld:r=!1,cosignGate:i=!0,height:a=null}={}){let l=Xt(t),c=o??await Ct(e,n,{directIP:s});try{let h=null;if(r||i)try{h=await ee(c,l)}catch(g){if(r)throw g;h=null}let d=null,u;if(typeof c.unionHistory=="function"){let g=await c.unionHistory(l.beaconScripthash);u=g.history,d={servers:g.servers,unreachable:g.unreachable,disagreements:g.disagreements}}else u=await c.call("blockchain.scripthash.get_history",[l.beaconScripthash]);u.sort(Zt);let f=new Map;for(let{tx_hash:g}of u)try{f.set(g,await c.call("blockchain.transaction.get",[g,!0]))}catch{}let y=new Map,p=new Map;for(let{tx_hash:g,height:x}of te(u.filter(w=>f.has(w.tx_hash)),f)){let w=f.get(g),A=w.vout||[],v=Qt(A);if(!v)continue;let T=v.n;if(!He.test(T))continue;let E=Ke(T);if(v.o==="REG"){if(y.has(E)||!qn(p.get(E),x)||r&&!Hn(Yt(E),x,h))continue;if(i&&h){let O=h.get(Yt(E));if(O&&Wn(O,x)&&!Gn(A,O,Yt(E)))continue}let k=Jt(T),b=A.find(O=>O.tokenData?.nft&&O.tokenData.nft.commitment===k);if(!b||!We(w,b))continue;y.set(E,{name:E,category:b.tokenData.category,records:v.r??{},txid:g,height:x,updatedTxid:null,owner:Ne(b)}),Re(y.get(E),v,b,w,x,l),p.delete(E)}else if(v.o==="REL"){let k=y.get(E);if(!k||!jn(w,k,f))continue;y.delete(E),p.set(E,x)}else if(v.o==="UPD"){let k=y.get(E);if(!k)continue;let b=A.find(O=>O.tokenData&&O.tokenData.category===k.category);if(!b||!Re(k,v,b,w,x,l))continue;k.records=v.r??{},k.updatedTxid=g,k.covenant||(k.owner=Ne(b)??k.owner)}}let m=a;if(!(m>0))try{let g=await c.call("blockchain.headers.subscribe",[]);g&&g.height>0&&(m=g.height)}catch{}return oo(y,Math.max(m>0?m:0,no(u)),l),d&&Object.defineProperty(y,"integrity",{value:d,enumerable:!1}),Object.defineProperty(y,"released",{value:p,enumerable:!1}),y}finally{o||c.close()}}var zn=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]),ot=(t,e)=>t>>>e|t<<32-e;function Vt(t){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),n=t.length,o=new Uint8Array(n+9+63>>6<<6);o.set(t),o[n]=128;let s=new DataView(o.buffer);s.setUint32(o.length-8,Math.floor(n*8/4294967296)),s.setUint32(o.length-4,n*8>>>0);let r=new Uint32Array(64);for(let l=0;l<o.length;l+=64){for(let g=0;g<16;g++)r[g]=s.getUint32(l+g*4);for(let g=16;g<64;g++){let x=ot(r[g-15],7)^ot(r[g-15],18)^r[g-15]>>>3,w=ot(r[g-2],17)^ot(r[g-2],19)^r[g-2]>>>10;r[g]=r[g-16]+x+r[g-7]+w|0}let c=e[0],h=e[1],d=e[2],u=e[3],f=e[4],y=e[5],p=e[6],m=e[7];for(let g=0;g<64;g++){let x=m+(ot(f,6)^ot(f,11)^ot(f,25))+(f&y^~f&p)+zn[g]+r[g]|0,w=(ot(c,2)^ot(c,13)^ot(c,22))+(c&h^c&d^h&d)|0;m=p,p=y,y=f,f=u+x|0,u=d,d=h,h=c,c=x+w|0}e[0]+=c,e[1]+=h,e[2]+=d,e[3]+=u,e[4]+=f,e[5]+=y,e[6]+=p,e[7]+=m}let i=new Uint8Array(32),a=new DataView(i.buffer);for(let l=0;l<8;l++)a.setUint32(l*4,e[l]);return i}var Dt=t=>[...t].map(e=>e.toString(16).padStart(2,"0")).join(""),je="qpzry9x8gf2tvdw0s3jn54khce6mua7l";function qe(t){let e=[0x98f2bc8e61n,0x79b76d99e2n,0xf33e5fb3c4n,0xae2eabe2a8n,0x1e4f43e470n],n=1n;for(let o of t){let s=n>>35n;n=(n&0x07ffffffffn)<<5n^BigInt(o);for(let r=0;r<5;r++)s>>BigInt(r)&1n&&(n^=e[r])}return n^1n}function ne(t){let e=String(t).trim().toLowerCase(),n=e.indexOf(":");if(n<1)throw new Error(`address needs its network prefix: "${t}"`);let o=e.slice(0,n),s=[...e.slice(n+1)].map(u=>je.indexOf(u));if(s.length<9||s.some(u=>u<0))throw new Error(`not a cashaddr: "${t}"`);if(qe([...[...o].map(u=>u.charCodeAt(0)&31),0,...s])!==0n)throw new Error(`bad cashaddr checksum: "${t}"`);let r=[],i=0,a=0;for(let u of s.slice(0,-8))for(i=i<<5|u,a+=5;a>=8;)a-=8,r.push(i>>a&255);let l=r[0],c=l>>3&15,h=Dt(r.slice(1)),d=[20,24,28,32,40,48,56,64][l&7];if(h.length!==d*2)throw new Error(`cashaddr hash length mismatch: "${t}"`);if((c===0||c===2)&&d===20)return"76a914"+h+"88ac";if((c===1||c===3)&&d===20)return"a914"+h+"87";if((c===1||c===3)&&d===32)return"aa20"+h+"87";throw new Error(`unsupported address type: "${t}"`)}function Yn(t){return Dt(Vt(Ut(ne(t))).reverse())}function Vn(t,e=S.prefix){let n=[],o=0,s=0;for(let a of[0,...Ut(t)])for(o=(o<<8|a)&4095,s+=8;s>=5;)s-=5,n.push(o>>s&31);s&&n.push(o<<5-s&31);let r=qe([...[...e].map(a=>a.charCodeAt(0)&31),0,...n,0,0,0,0,0,0,0,0]),i=[];for(let a=0;a<8;a++)i.push(Number(r>>BigInt(5*(7-a))&31n));return e+":"+[...n,...i].map(a=>je[a]).join("")}var Xn=5e8;function Jn(t,e){let n=String(t).split(".")[0];return e.tiers.findIndex(o=>n.length<=o.maxLabel)}function Qn(t,e,n,o){let s=o>>>0,r=[s&255,s>>>8&255,s>>>16&255,s>>>24&255],i="14"+n+"04"+Dt(r)+t.tiers[e].head+t.tail;return"aa20"+Dt(Vt(Vt(Ut(i))))+"87"}function Zn(t,e,n,o=S){let s=st(o).covenant,r=t?t.c:null;if(!s||!r||typeof r!="object"||!e||!e.scriptPubKey||typeof r.o!="string"||!/^[0-9a-f]{40}$/.test(r.o)||!Number.isInteger(r.e)||r.e<=0||r.e>=Xn)return null;let i=Jn(n,s);return i<0||e.scriptPubKey.hex!==Qn(s,i,r.o,r.e)?null:{ownerPkh:r.o,expiry:r.e,tier:i+1,version:s.version}}function to(t,e,n,o=S){let s=st(o).covenant;if(!s||!t||!(n>0))return!1;let r=0;for(let a of e.vout||[])a&&a.scriptPubKey&&a.scriptPubKey.hex===s.fundLock&&!a.tokenData&&(r+=Math.round(Number(a.value)*1e8));let i=Math.floor(r/s.tiers[t.tier-1].renewalSats);return i>=1&&t.expiry<=n+i*s.blocksPerYear}function Re(t,e,n,o,s,r=S){let i=Zn(e,n,t.name,r);if(t.covenant){if(!i)return!1}else if(!i||!to(i,o,s,r))return!0;return t.covenant=i,t.owner=Vn(i.ownerPkh,st(r).prefix),!0}function eo(t,e,n=S){let o=st(n).covenant;if(!t||!o)return null;let s=t.expiry+o.graceBlocks;return{status:e<t.expiry?"active":e<s?"idle":"open",expiry:t.expiry,idleEnd:s}}function no(t){let e=0;for(let n of t||[])n&&n.height>e&&(e=n.height);return e}function oo(t,e,n=S){for(let o of t.values()){let s=eo(o.covenant,e,n);s&&(o.status=s.status,o.expiry=s.expiry,o.idleEnd=s.idleEnd,s.status==="open"&&(o.lapsedRecords=o.records,o.records={}))}return Object.defineProperty(t,"height",{value:e,enumerable:!1,configurable:!0}),t}var Le=new Set(["phishing","impersonation","malware","scam-financial","csam","stolen"]);function Ce(t,e,n){return(t.vin||[]).some(o=>{let s=Ge(o,n);return!!(s&&s.scriptPubKey&&s.scriptPubKey.hex===e)})}var so=t=>typeof t=="string"&&/^[0-9a-f]{64}$/.test(t);function De(t){return typeof t=="string"&&He.test(t)?Ke(t):null}function ro({history:t,txs:e,address:n,source:o=null}){let s=ne(n),r=e instanceof Map?e:new Map(Object.entries(e||{})),i=te([...t||[]].filter(h=>r.has(h.tx_hash)).sort(Zt),r),a=h=>Qt(h.vout),l=new Map;for(let{tx_hash:h,height:d}of i){let u=r.get(h),f=a(u);if(!f||f.o!=="RPT"||!Ce(u,s,r)||f.t!=="block"&&f.t!=="unblock")continue;let y=(f.n||[]).map(De);!y.length||y.some(p=>!p)||f.t==="block"&&!Le.has(f.r)||l.set(h,{type:f.t,names:new Set(y),reason:f.r??null,evidence:f.e??null,vote:f.v??null,height:d})}let c=new Map;for(let{tx_hash:h,height:d}of i){let u=r.get(h),f=a(u);if(!f||f.o!=="BLK"&&f.o!=="UBK"||!Ce(u,s,r))continue;let y=De(f.n);if(!y||!so(f.p))continue;let p=l.get(f.p);if(!(!p||!p.names.has(y)))if(f.o==="BLK"){if(p.type!=="block"||!Le.has(f.r)||p.reason!==f.r)continue;c.set(y,{name:y,reason:f.r,reportTxid:f.p,txid:h,height:d,evidence:f.e??p.evidence,vote:p.vote,source:o,address:n})}else{if(p.type!=="unblock")continue;c.delete(y)}}return c}function Ue(t,e){let n=t&&t.name&&e&&typeof e.get=="function"?e.get(t.name)?.records?.bl:null;if(typeof n=="string")try{return ne(n),n}catch{}return t?.beacon??null}async function ao({network:t=S,lists:e,index:n=null,electrum:o,WebSocket:s,client:r,directIP:i=!1}={}){let a=st(t),l=e??a.blocklists??[],c=new Map;if(!l.length)return c;let h=o??a.electrum.filter(u=>!a.beaconOnly.test(typeof u=="string"?u:u.url)),d=r;if(!d)try{d=await Ct(h,s,{directIP:i})}catch(u){let f=new Set((a.blocklists||[]).map(y=>y.beacon));if(o||!l.every(y=>f.has(Ue(y,n))))throw u;d=await Ct(a.electrum,s,{directIP:i})}try{for(let u of l){let f=Ue(u,n);if(!f)continue;let y=Yn(f),p=typeof d.unionHistory=="function"?(await d.unionHistory(y)).history:await d.call("blockchain.scripthash.get_history",[y]);if(!p||!p.length)continue;let m=new Map;for(let{tx_hash:g}of p)try{m.set(g,await d.call("blockchain.transaction.get",[g,!0]))}catch{}for(let[g,x]of ro({history:p,txs:m,address:f,source:u.name??f})){let w=c.get(g);w?w.sources.push(x):c.set(g,{...x,sources:[x]})}}return c}finally{r||d.close()}}function io(t,e){let n=t&&e&&typeof e.get=="function"?e.get(t.name):null;return n?{...t,blocked:!0,blockReason:n.reason,blockReportTxid:n.reportTxid,blockedBy:n.source}:t}async function co(t,e={}){let n=Un(t),o=st(e.network),s=e.blocklists===void 0?o.blocklists??[]:e.blocklists||[];if(!s.length)return(await gt(e)).get(n)??null;let r=e.client??await Ct(e.electrum??o.electrum,e.WebSocket,{directIP:!!e.directIP});try{let i=await gt({...e,client:r}),a=i.get(n)??null;if(!a)return null;let l=null;try{l=await ao(e.client?{network:o,lists:s,index:i,client:e.client}:{network:o,lists:s,index:i,WebSocket:e.WebSocket,directIP:!!e.directIP})}catch{}return io(a,l)}finally{e.client||r.close()}}var Cs=S.rootTldName,Ds=S.bootstrapTlds.slice();var yo="bchtest",mo="bitcoincash",It=S.prefix,re="m/44'/145'/0'",xo=5,Ft="bns.wallet.v1";function Qe(t){let e=ho(t);return Uint8Array.from([118,169,20,...e,136,172])}function Ve(t,e,n){let o=po({bytecode:Qe(t),prefix:e,tokenSupport:n});if(typeof o=="string")throw new Error(`address encoding failed: ${o}`);return o.address}var ae=class t{constructor(e,n,o=It,s=re){this.mnemonic=e,this.prefix=o,this.accountPath=s,this._root=uo(n),this._keys=new Map,this._derive()}static async create(e=It,n=re){let o=lo();return new t(o,await ze(o),e,n)}static async fromMnemonic(e,n=It,o=re){let s=String(e).trim().toLowerCase().replace(/\s+/g," "),r=await ze(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;o<xo;o++){let s=`${this.accountPath}/${e}/${o}`,r=fo(this._root,s);if(typeof r=="string")throw new Error(`HD derivation failed at ${s}: ${r}`);let i=Ye.derivePublicKeyCompressed(r.privateKey);if(typeof i=="string")throw new Error(`pubkey derivation failed: ${i}`);let a=Qe(i),l={path:s,branch:e,index:o,privateKey:r.privateKey,publicKey:i,lockingBytecode:a,address:Ve(i,this.prefix,!1),tokenAddress:Ve(i,this.prefix,!0)};n.push(l),this._keys.set(go(a),l)}}get address(){return this.receive[0].address}get tokenAddress(){return this.receive[0].tokenAddress}get watchedAddresses(){return[...this.receive,...this.change].map(e=>e.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=Ye.signMessageHashRecoverableCompact(s.privateKey,e);if(typeof r=="string")throw new Error(`signMessage failed: ${r}`);let{signature:i}=r,a=r.recoveryId??r.recovery;if(typeof a!="number")throw new Error("signMessage: no recovery id in signature result");let l=31+a,c=new Uint8Array(65);return c[0]=l,c.set(i,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,Je(this.mnemonic)));return JSON.stringify({v:1,kdf:"PBKDF2-SHA256",iterations:ie,prefix:this.prefix,salt:oe(n),iv:oe(o),ct:oe(r)})}static async decrypt(e,n){let o=typeof e=="string"?JSON.parse(e):e,s=await Xe(n,se(o.salt),o.iterations??ie),r;try{r=await crypto.subtle.decrypt({name:"AES-GCM",iv:se(o.iv)},s,se(o.ct))}catch{throw new Error("wrong password")}return t.fromMnemonic(new TextDecoder().decode(r),o.prefix??It)}async save(e,n=globalThis.localStorage){n.setItem(Ft,await this.encrypt(e))}static async load(e,n=globalThis.localStorage){let o=n.getItem(Ft);return o?t.decrypt(o,e):null}static exists(e=globalThis.localStorage){return!!e?.getItem(Ft)}static forget(e=globalThis.localStorage){e.removeItem(Ft)}},ie=25e4;async function Xe(t,e,n=ie){let o=await crypto.subtle.importKey("raw",Je(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 js=vt.chipnet.electrum.map(t=>t.url),Mt=S.electrum.map(t=>t.url),ce=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(a){n(a)}},r=a=>n(new Error("electrum ws error: "+(a?.message||this.url))),i=a=>this._onData(typeof a.data=="string"?a.data:a.data.toString());o.addEventListener?(o.addEventListener("open",s),o.addEventListener("error",r),o.addEventListener("message",i)):(o.onopen=s,o.onerror=r,o.onmessage=i)})}_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 Ze(t=Mt,e){let n=[];for(let o of t)try{return await new ce(o,e).connect()}catch(s){n.push(`${o}: ${s?.message??s}`)}throw wo(t.length,n)}function wo(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 bo,lockingBytecodeToCashAddress as ko,sha256 as So,hash160 as Ys,binToHex as To,hexToBin as Vs}from"@bitauth/libauth";function tn(t){return To(So.hash(t).slice().reverse())}function C(t){let e=bo(t);if(typeof e=="string")throw new Error(`bad address "${t}": ${e}`);return e.bytecode}function vo(t){return tn(C(t))}function j(t){let e=C(t),n=String(t).includes(":")?t.split(":")[0]:S.prefix,o=ko({bytecode:e,prefix:n,tokenSupport:!0});if(typeof o=="string")throw new Error(`cannot token-encode "${t}": ${o}`);return o.address}async function en(t,e){let n=C(e),o=tn(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 q(t,e){let n=[];for(let o of e)n.push(...await en(t,o));return n}async function tt(t,e){return t.call("blockchain.transaction.broadcast",[e])}async function nn(t,e,n=!0){return t.call("blockchain.transaction.get",[e,n])}import{binToHex as Pt,hexToBin as V,utf8ToBin as yt,binToUtf8 as de,encodeTransaction as Eo,decodeTransaction as Zs}from"@bitauth/libauth";var Oo="BNS1",lt=S.beacon,fe=S.tldBeacon,I=600n,R=1000n,K=546n,le="bch",ue=200,_o=/^[a-z0-9-]{1,32}$/,on=/^[a-z0-9-]{1,16}$/;function Et(t){let e=String(t).toLowerCase().trim().replace(/^\.+/,"").replace(/\.+$/,"");if(!on.test(e))throw new Error(`invalid TLD "${t}" (allowed: [a-z0-9-]{1,16})`);return e}var $t=class extends Error{constructor(e){super(e),this.name="NoGenesisInputError",this.code="NO_GENESIS_INPUT"}},X=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 D(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=le):(o=e[e.length-1],n=e[e.length-2]),!_o.test(n)||!on.test(o))throw new Error(`invalid name "${t}" (allowed: <label>.<tld>, [a-z0-9-])`);return o===le?n:`${n}.${o}`}function z(t){return t.includes(".")?t:`${t}.${le}`}function J(t,e,n,o=null){let s=JSON.stringify(o?{o:t,n:e,r:n??{},c:o}:{o:t,n:e,r:n??{}}),r=yt(Oo+s);if(r.length>ue)throw new Error(`records too large (${r.length} > ${ue} bytes)`);return r}function he(t,e="REG"){return ue-J(e,t,{}).length}function Ao(t){return t.length<=75?Uint8Array.from([t.length,...t]):t.length<=255?Uint8Array.from([76,t.length,...t]):Uint8Array.from([77,t.length&255,t.length>>8&255,...t])}function et(t){return Uint8Array.from([106,...Ao(t)])}function pe(){return Uint8Array.from([65,...new Uint8Array(65),33,...new Uint8Array(33)])}var Bo=t=>!t.token;function F(t,e,{requireGenesis:n=!0}={}){let o=t.filter(Bo),s=[],r=0n;if(n){let a=o.filter(l=>l.vout===0).sort((l,c)=>c.satoshis>l.satoshis?1:-1);if(a.length===0)throw new $t("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(a[0]),r+=a[0].satoshis}let i=o.filter(a=>!s.some(l=>l.txid===a.txid&&l.vout===a.vout)).sort((a,l)=>l.satoshis>a.satoshis?1:-1);for(let a of i){if(r>=e)break;s.push(a),r+=a.satoshis}return{inputs:s,totalSats:r}}function mt(t){return{outpointTransactionHash:V(t.txid),outpointIndex:t.vout,sequenceNumber:4294967294,unlockingBytecode:pe()}}function bt(t){return{...mt(t),lockingBytecode:t.lockingBytecode,valueSatoshis:t.satoshis,...t.token?{token:{amount:t.token.amount??0n,category:V(t.token.category),...t.token.nft?{nft:{capability:t.token.nft.capability,commitment:V(t.token.nft.commitment||"")}}:{}}}:{}}}function rt(t){return Eo(t).length}function ge({name:t,ownerAddress:e,ownerTokenAddress:n,changeAddress:o,records:s={},utxos:r,feeAddress:i=null,feeSats:a=0n,tldFeeAddress:l=null,tldFeeSats:c=0n,beaconAddress:h=lt,feeRate:d=1,addressToLockingBytecode:u,cosignUtxo:f=null,cosignTokenAddress:y=null}){if(typeof u!="function")throw new Error("addressToLockingBytecode must be injected (see chain.js)");let p=D(t),m=J("REG",p,s),g=BigInt(a??0n),x=BigInt(c??0n);if(f&&!f.token?.nft)throw new Error("cosignUtxo does not carry a TLD certificate");let w=f?BigInt(f.satoshis):0n,A=f?u(y??n??e):null;if(g>0n&&!i)throw new Error("feeSats set but feeAddress missing");if(x>0n&&!l)throw new Error("tldFeeSats set but tldFeeAddress missing");let v=u(o??e),T=u(n??e),E=u(h),k=g>0n?u(i):null,b=x>0n?u(l):null,O=R+I+g+x+w,P=F(r,O+300n-w),_=0n,B=0n,U=!0;for(let N=0;N<6;N++){let{inputs:$}=P,H=f?[...$,f]:$,W=P.totalSats+w,ht=H[0],ct=V(ht.txid),Y=(St,Tt)=>{let Z=[];return St&&Z.push({lockingBytecode:v,valueSatoshis:Tt}),Z.push({lockingBytecode:T,valueSatoshis:R,token:{amount:0n,category:ct,nft:{capability:"none",commitment:yt(p)}}}),Z.push({lockingBytecode:et(m),valueSatoshis:0n}),Z.push({lockingBytecode:E,valueSatoshis:I}),b&&Z.push({lockingBytecode:b,valueSatoshis:x}),k&&Z.push({lockingBytecode:k,valueSatoshis:g}),f&&Z.push({lockingBytecode:A,valueSatoshis:w,token:{amount:BigInt(f.token.amount??0),category:V(f.token.category),nft:{capability:f.token.nft.capability,commitment:V(f.token.nft.commitment||"")}}}),{version:2,locktime:0,inputs:H.map(mt),outputs:Z}},Nn=Y(!0,1000000n),Rn=rt(Nn);_=BigInt(Math.ceil(Rn*d));let Bt=O+_;if(W<Bt){let St=F(r,Bt+200n-w);if(St.inputs.length>$.length){P=St;continue}throw new X(`not enough funds: need ${Bt} sat, have ${W} sat`,{needSats:Bt,haveSats:W})}if(B=W-Bt,U=B>=K,!U){let St=Y(!1,0n);_=W-O;let Tt=BigInt(Math.ceil(rt(St)*d));if(_<Tt){let Z=F(r,O+Tt+K+200n-w);if(Z.inputs.length>$.length){P=Z;continue}throw new X(`not enough funds: need ${O+Tt} sat, have ${W} sat`,{needSats:O+Tt,haveSats:W})}B=0n}let Ln=Y(U,B),pt={},wt=0;return U&&(pt.change=wt++),pt.certificate=wt++,pt.opReturn=wt++,pt.beacon=wt++,b&&(pt.tldOwnerFee=wt++),k&&(pt.serviceFee=wt++),f&&(pt.cosignCertificate=wt++),{name:p,displayName:z(p),category:Pt(ct),transaction:Ln,sourceOutputs:H.map(bt),inputUtxos:H,outputMap:pt,payload:m,costs:{certificateDustSats:R,beaconDustSats:I,serviceFeeSats:g,tldOwnerFeeSats:x,chainFeeSats:_,changeSats:B,totalInputSats:W,netCostSats:g+x+_+I}}}throw new Error("could not converge on a fee \u2014 please retry")}function Ht({tld:t,ownerAddress:e,ownerTokenAddress:n,changeAddress:o,records:s={},utxos:r,feeAddress:i=null,feeSats:a=0n,beaconAddress:l=fe,feeRate:c=1,addressToLockingBytecode:h}){if(typeof h!="function")throw new Error("addressToLockingBytecode must be injected (see chain.js)");let d=Et(t),u=J("TREG",d,s),f=BigInt(a??0n);if(f>0n&&!i)throw new Error("feeSats set but feeAddress missing");let y=h(o??e),p=h(n??e),m=h(l),g=f>0n?h(i):null,x=R+I+f,w=F(r,x+300n),A=0n,v=0n,T=!0;for(let E=0;E<6;E++){let{inputs:k,totalSats:b}=w,O=k[0],P=V(O.txid),_=(ht,ct)=>{let Y=[];return ht&&Y.push({lockingBytecode:y,valueSatoshis:ct}),Y.push({lockingBytecode:p,valueSatoshis:R,token:{amount:0n,category:P,nft:{capability:"none",commitment:yt(d)}}}),Y.push({lockingBytecode:et(u),valueSatoshis:0n}),Y.push({lockingBytecode:m,valueSatoshis:I}),g&&Y.push({lockingBytecode:g,valueSatoshis:f}),{version:2,locktime:0,inputs:k.map(mt),outputs:Y}},B=_(!0,1000000n),U=rt(B);A=BigInt(Math.ceil(U*c));let N=x+A;if(b<N){let ht=F(r,N+200n);if(ht.inputs.length>k.length){w=ht;continue}throw new X(`not enough funds: need ${N} sat, have ${b} sat`,{needSats:N,haveSats:b})}if(v=b-N,T=v>=K,!T){let ht=_(!1,0n);A=b-x;let ct=BigInt(Math.ceil(rt(ht)*c));if(A<ct){let Y=F(r,x+ct+K+200n);if(Y.inputs.length>k.length){w=Y;continue}throw new X(`not enough funds: need ${x+ct} sat, have ${b} sat`,{needSats:x+ct,haveSats:b})}v=0n}let $=_(T,v),H={},W=0;return T&&(H.change=W++),H.certificate=W++,H.opReturn=W++,H.beacon=W++,g&&(H.serviceFee=W++),{tld:d,category:Pt(P),transaction:$,sourceOutputs:k.map(bt),inputUtxos:k,outputMap:H,payload:u,costs:{certificateDustSats:R,beaconDustSats:I,serviceFeeSats:f,chainFeeSats:A,changeSats:v,totalInputSats:b,netCostSats:f+A+I}}}throw new Error("could not converge on a fee \u2014 please retry")}function Nt({name:t,ownerAddress:e,ownerTokenAddress:n,records:o={},certificateUtxo:s,utxos:r,beaconAddress:i=lt,feeRate:a=1,addressToLockingBytecode:l}){if(typeof l!="function")throw new Error("addressToLockingBytecode must be injected (see chain.js)");let c=D(t);if(!s?.token?.nft)throw new Error("certificateUtxo does not carry a certificate");let h=Pt(yt(c));if(s.token.nft.commitment!==h)throw new Error(`certificate commitment mismatch: holds "${de(V(s.token.nft.commitment))}", asked to update "${c}"`);let d=J("UPD",c,o),u=l(e),f=l(n??e),y=l(i),p=R+I,m=F(r,p+400n,{requireGenesis:!1}),g=0n,x=0n,w=!0;for(let A=0;A<6;A++){let v=[s,...m.inputs],T=s.satoshis+m.totalSats,E=(B,U)=>{let N=[];return B&&N.push({lockingBytecode:u,valueSatoshis:U}),N.push({lockingBytecode:f,valueSatoshis:R,token:{amount:0n,category:V(s.token.category),nft:{capability:"none",commitment:yt(c)}}}),N.push({lockingBytecode:et(d),valueSatoshis:0n}),N.push({lockingBytecode:y,valueSatoshis:I}),{version:2,locktime:0,inputs:v.map(mt),outputs:N}},k=rt(E(!0,1000000n));g=BigInt(Math.ceil(k*a));let b=p+g;if(T<b){let B=F(r,b+200n,{requireGenesis:!1});if(B.inputs.length>m.inputs.length){m=B;continue}throw new X(`not enough funds: need ${b} sat, have ${T} sat`,{needSats:b,haveSats:T})}x=T-b,w=x>=K,w||(g=T-p,x=0n);let O=E(w,x),P={},_=0;return w&&(P.change=_++),P.certificate=_++,P.opReturn=_++,P.beacon=_++,{name:c,displayName:z(c),category:s.token.category,transaction:O,sourceOutputs:v.map(bt),inputUtxos:v,outputMap:P,payload:d,costs:{certificateDustSats:R,beaconDustSats:I,serviceFeeSats:0n,chainFeeSats:g,changeSats:x,totalInputSats:T,netCostSats:g+I}}}throw new Error("could not converge on a fee \u2014 please retry")}function ye({name:t,ownerAddress:e,certificateUtxo:n,utxos:o=[],beaconAddress:s=lt,feeRate:r=1,addressToLockingBytecode:i}){if(typeof i!="function")throw new Error("addressToLockingBytecode must be injected (see chain.js)");let a=D(t);if(!n?.token?.nft)throw new Error("certificateUtxo does not carry a certificate");let l=Pt(yt(a));if(n.token.nft.commitment!==l)throw new Error(`certificate commitment mismatch: holds "${de(V(n.token.nft.commitment))}", asked to release "${a}"`);let c=J("REL",a,{}),h=i(e),d=i(s),u=I,f={inputs:[],totalSats:0n},y=0n,p=0n,m=!0;for(let g=0;g<6;g++){let x=[n,...f.inputs],w=n.satoshis+f.totalSats,A=(O,P)=>{let _=[];return O&&_.push({lockingBytecode:h,valueSatoshis:P}),_.push({lockingBytecode:et(c),valueSatoshis:0n}),_.push({lockingBytecode:d,valueSatoshis:I}),{version:2,locktime:0,inputs:x.map(mt),outputs:_}},v=BigInt(Math.ceil(rt(A(!1,0n))*r)),T=BigInt(Math.ceil(rt(A(!0,1000000n))*r));if(w<u+v){let O=F(o,u+T+200n,{requireGenesis:!1});if(O.inputs.length>f.inputs.length){f=O;continue}throw new X(`not enough funds: need ${u+v} sat, have ${w} sat`,{needSats:u+v,haveSats:w})}p=w-u-T,m=p>=K,m?y=T:(y=w-u,p=0n);let E=A(m,p),k={},b=0;return m&&(k.change=b++),k.opReturn=b++,k.beacon=b++,{name:a,displayName:z(a),category:n.token.category,transaction:E,sourceOutputs:x.map(bt),inputUtxos:x,outputMap:k,payload:c,costs:{beaconDustSats:I,chainFeeSats:y,changeSats:p,totalInputSats:w,netCostSats:y+I}}}throw new Error("could not converge on a fee \u2014 please retry")}function sn({tld:t,ownerAddress:e,ownerTokenAddress:n,records:o={},certificateUtxo:s,utxos:r,beaconAddress:i=fe,feeRate:a=1,addressToLockingBytecode:l}){if(typeof l!="function")throw new Error("addressToLockingBytecode must be injected (see chain.js)");let c=Et(t);if(!s?.token?.nft)throw new Error("certificateUtxo does not carry a certificate");let h=Pt(yt(c));if(s.token.nft.commitment!==h)throw new Error(`TLD certificate commitment mismatch: holds "${de(V(s.token.nft.commitment))}", asked to update ".${c}"`);let d=J("TUPD",c,o),u=l(e),f=l(n??e),y=l(i),p=R+I,m=F(r,p+400n,{requireGenesis:!1}),g=0n,x=0n,w=!0;for(let A=0;A<6;A++){let v=[s,...m.inputs],T=s.satoshis+m.totalSats,E=(B,U)=>{let N=[];return B&&N.push({lockingBytecode:u,valueSatoshis:U}),N.push({lockingBytecode:f,valueSatoshis:R,token:{amount:0n,category:V(s.token.category),nft:{capability:"none",commitment:yt(c)}}}),N.push({lockingBytecode:et(d),valueSatoshis:0n}),N.push({lockingBytecode:y,valueSatoshis:I}),{version:2,locktime:0,inputs:v.map(mt),outputs:N}},k=rt(E(!0,1000000n));g=BigInt(Math.ceil(k*a));let b=p+g;if(T<b){let B=F(r,b+200n,{requireGenesis:!1});if(B.inputs.length>m.inputs.length){m=B;continue}throw new X(`not enough funds: need ${b} sat, have ${T} sat`,{needSats:b,haveSats:T})}x=T-b,w=x>=K,w||(g=T-p,x=0n);let O=E(w,x),P={},_=0;return w&&(P.change=_++),P.certificate=_++,P.opReturn=_++,P.beacon=_++,{tld:c,displayName:`.${c}`,category:s.token.category,transaction:O,sourceOutputs:v.map(bt),inputUtxos:v,outputMap:P,payload:d,costs:{certificateDustSats:R,beaconDustSats:I,serviceFeeSats:0n,chainFeeSats:g,changeSats:x,totalInputSats:T,netCostSats:g+I}}}throw new Error("could not converge on a fee \u2014 please retry")}function Ot({ownerAddress:t,utxos:e,amountSats:n=10000n,feeRate:o=1,addressToLockingBytecode:s}){let r=s(t),i=F(e,n+400n,{requireGenesis:!1});if(i.inputs.length===0)throw new X("wallet is empty");for(let a=0;a<6;a++){let{inputs:l,totalSats:c}=i,h=(y,p)=>({version:2,locktime:0,inputs:l.map(mt),outputs:[{lockingBytecode:r,valueSatoshis:n},...y?[{lockingBytecode:r,valueSatoshis:p}]:[]]}),d=BigInt(Math.ceil(rt(h(!0,1000000n))*o));if(c<n+d){let y=BigInt(Math.ceil(rt(h(!1,0n))*o));if(c<=y+K)throw new X(`not enough funds to prepare the wallet: have ${c} sat`,{needSats:y+K,haveSats:c});return{transaction:{version:2,locktime:0,inputs:l.map(mt),outputs:[{lockingBytecode:r,valueSatoshis:c-y}]},sourceOutputs:l.map(bt),inputUtxos:l,costs:{chainFeeSats:y}}}let u=c-n-d,f=u>=K;return{transaction:h(f,u),sourceOutputs:l.map(bt),inputUtxos:l,costs:{chainFeeSats:f?d:c-n}}}throw new Error("could not converge on a fee \u2014 please retry")}function kt(t){return t.some(e=>e.vout===0&&!e.token)}function rn({transaction:t,sourceOutputs:e},{broadcast:n=!0,userPrompt:o}={}){return{transaction:t,sourceOutputs:e,broadcast:n,...o?{userPrompt:o}:{}}}import{generateSigningSerializationBCH as Io,hash256 as cn,secp256k1 as Po,encodeTransaction as No,binToHex as me}from"@bitauth/libauth";var an=65;function at(t,e,n){let o={...t,inputs:t.inputs.map((r,i)=>{let a=e[i],l=n(me(a.lockingBytecode));if(!l)throw new Error(`no key for input ${i} \u2014 cannot sign`);let c=Io({inputIndex:i,sourceOutputs:e,transaction:t},{coveredBytecode:a.lockingBytecode,signingSerializationType:Uint8Array.of(an)}),h=cn(c),d=Po.signMessageHashSchnorr(l.privateKey,h);if(typeof d=="string")throw new Error(`signing failed on input ${i}: ${d}`);let u=Uint8Array.from([...d,an]);return{...r,unlockingBytecode:Uint8Array.from([u.length,...u,l.publicKey.length,...l.publicKey])}})},s=No(o);return{transaction:o,hex:me(s),txid:xe(s)}}function xe(t){return me(cn(t).slice().reverse())}function we(t){let e=new Uint8Array(t.length/2);for(let n=0;n<e.length;n++)e[n]=parseInt(t.substr(n*2,2),16);return xe(e)}var L={network:S.id,addressPrefix:S.prefix,explorerTx:S.explorerTx,selfHosted:null,get electrum(){return this.selfHosted?[this.selfHosted,...Mt]:Mt},beacon:S.beacon,tldBeacon:S.tldBeacon,serviceFee:{address:S.operatorAddress,sats:10000n},feeRate:1,wizardConnect:{dappName:"Silent Mode",dappIcon:"https://silentmode.st/icon.png"},faucets:S.faucets};function Ro(t){let e=r=>(Number(r)/1e8).toFixed(8).replace(/0+$/,"").replace(/\.$/,""),n=[],o=BigInt(t.tldOwnerFeeSats??0n),s=BigInt(t.serviceFeeSats??0n);return o>0n?(n.push({label:"Service fee \u2014 TLD owner (90%)",sats:o,bch:e(o),note:"goes to whoever holds this TLD's certificate on chain"}),n.push({label:"Service fee \u2014 platform (10%)",sats:s,bch:e(s),note:"covers the resolver + gateway + indexer"})):n.push({label:"Service fee",sats:s,bch:e(s)}),n.push({label:"Network fee",sats:t.chainFeeSats,bch:e(t.chainFeeSats)}),n.push({label:"Discovery beacon",sats:t.beaconDustSats,bch:e(t.beaconDustSats)}),n.push({label:"Held in the certificate",sats:t.certificateDustSats,bch:e(t.certificateDustSats),note:"stays yours \u2014 it lives in the certificate you now own"}),n.push({label:"Total",sats:t.netCostSats,bch:e(t.netCostSats),total:!0}),n}import{hexToBin as gn,binToHex as xt,decodeTransaction as Mo,lockingBytecodeToCashAddress as $o,sha256 as Ho,utf8ToBin as Ko,binToBase64 as Wo}from"@bitauth/libauth";import{encodeTransaction as ke,decodeTransaction as ln,generateSigningSerializationBCH as un,hash256 as Se,hash160 as Lo,secp256k1 as dn,hexToBin as ut,binToHex as M,utf8ToBin as fn}from"@bitauth/libauth";var Kt=65,be=195,it=(t,e)=>({outpointTransactionHash:ut(t.txid),outpointIndex:t.vout,sequenceNumber:4294967294,unlockingBytecode:e??pe()}),dt=t=>t?{amount:BigInt(t.amount??0),category:ut(t.category),...t.nft?{nft:{capability:t.nft.capability,commitment:ut(t.nft.commitment||"")}}:{}}:void 0,Te=t=>({lockingBytecode:t.lockingBytecode instanceof Uint8Array?M(t.lockingBytecode):String(t.lockingBytecode),valueSatoshis:String(t.valueSatoshis),...t.token?{token:{category:t.token.category instanceof Uint8Array?M(t.token.category):String(t.token.category),amount:String(t.token.amount??0),...t.token.nft?{nft:{capability:t.token.nft.capability,commitment:t.token.nft.commitment instanceof Uint8Array?M(t.token.nft.commitment):String(t.token.nft.commitment||"")}}:{}}}:{}}),ve=t=>({lockingBytecode:ut(t.lockingBytecode),valueSatoshis:BigInt(t.valueSatoshis??t.satoshis),...t.token?{token:dt(t.token)}:{}}),ft=(t,e)=>({...it(t,e),lockingBytecode:t.lockingBytecode instanceof Uint8Array?t.lockingBytecode:ut(t.lockingBytecode),valueSatoshis:BigInt(t.satoshis),...t.token?{token:dt(t.token)}:{}});function hn(t,e,n,o,s){let r=e[n],i=un({inputIndex:n,sourceOutputs:e,transaction:t},{coveredBytecode:r.lockingBytecode,signingSerializationType:Uint8Array.of(s)}),a=Se(i),l=dn.signMessageHashSchnorr(o.privateKey,a);if(typeof l=="string")throw new Error(`signing failed on input ${n}: ${l}`);let c=Uint8Array.from([...l,s]);return Uint8Array.from([c.length,...c,o.publicKey.length,...o.publicKey])}function _t(t,e,n,{sighash:o=Kt,skip:s=[]}={}){let r={...t,inputs:t.inputs.map((a,l)=>{if(s.includes(l))return a;let c=n(M(e[l].lockingBytecode));return c?{...a,unlockingBytecode:hn(t,e,l,c,o)}:a})},i=ke(r);return{transaction:r,hex:M(i),txid:M(Se(i).slice().reverse())}}function Co({name:t,certificateUtxo:e,priceSats:n,sellerAddress:o,addressToLockingBytecode:s,keyFor:r}){let i=D(t),a=BigInt(n);if(a<K)throw new Error(`price must be at least ${K} sat`);if(!e?.token?.nft)throw new Error("certificateUtxo does not carry a certificate");if(e.token.nft.commitment!==M(fn(i)))throw new Error("certificate commitment does not match the name");let l=s(o),c=ft(e),h={version:2,locktime:0,inputs:[it(e)],outputs:[{lockingBytecode:l,valueSatoshis:a}]},d=r(M(c.lockingBytecode));if(!d)throw new Error("this wallet does not hold the key for the certificate");return h.inputs[0].unlockingBytecode=hn(h,[c],0,d,be),{v:1,name:i,seller:o,price_sats:a.toString(),category:e.token.category,partial_tx:M(ke(h)),source_output:{txid:e.txid,vout:e.vout,satoshis:BigInt(e.satoshis).toString(),lockingBytecode:M(c.lockingBytecode),token:{category:e.token.category,amount:String(e.token.amount??0),nft:e.token.nft?{capability:e.token.nft.capability,commitment:e.token.nft.commitment}:void 0}},created_at:new Date().toISOString()}}function Do(t){let e=t[0],n=t.slice(1,1+e),o=t[1+e],s=t.slice(2+e,2+e+o);return{sig:n,pubkey:s}}var Uo=t=>Uint8Array.from([118,169,20,...Lo(t),136,172]);function pn(t,e={}){let n=o=>({ok:!1,error:o});try{if(!t||t.v!==1)return n("unsupported listing version");let o=D(t.name),s=ln(ut(t.partial_tx));if(typeof s=="string")return n("partial_tx does not decode: "+s);if(s.inputs.length!==1||s.outputs.length<1)return n("partial_tx must have exactly one input and a payment output");let r=t.source_output;if(!r?.token?.nft)return n("source_output carries no certificate");if(M(s.inputs[0].outpointTransactionHash)!==r.txid||s.inputs[0].outpointIndex!==r.vout)return n("input does not spend source_output");if(r.token.nft.commitment!==M(fn(o)))return n("certificate commitment does not match the name");if(e.category&&r.token.category!==e.category)return n("certificate category does not match the registry");let i=s.outputs[0].valueSatoshis;if(i<K)return n("price below dust");if(BigInt(t.price_sats)!==i)return n("price_sats does not match output 0");let{sig:a,pubkey:l}=Do(s.inputs[0].unlockingBytecode);if(a.length!==65||a[64]!==be)return n("input 0 is not signed SINGLE|ANYONECANPAY");let c=ut(r.lockingBytecode);if(M(Uo(l))!==M(c))return n("public key does not own the certificate output");if(e.ownerLockingBytecode&&M(c)!==e.ownerLockingBytecode)return n("certificate is not held by the current owner");if(M(s.outputs[0].lockingBytecode)!==M(c))return n("payment does not go to the certificate holder");let h={...s.inputs[0],lockingBytecode:c,valueSatoshis:BigInt(r.satoshis),token:dt(r.token)},d=un({inputIndex:0,sourceOutputs:[h],transaction:s},{coveredBytecode:c,signingSerializationType:Uint8Array.of(be)});return dn.verifySignatureSchnorr(a.slice(0,64),l,Se(d))?{ok:!0,name:o,price_sats:i,seller_lock:M(c),category:r.token.category}:n("seller signature is invalid")}catch(o){return n(String(o?.message||o))}}function Fo({listing:t,buyerAddress:e,buyerTokenAddress:n,utxos:o,records:s={},beaconAddress:r=lt,feeRate:i=1,addressToLockingBytecode:a}){let l=pn(t);if(!l.ok)throw new Error("bad listing: "+l.error);let c=l.name,h=ln(ut(t.partial_tx)),d=t.source_output,u=h.inputs[0],f={...u,lockingBytecode:ut(d.lockingBytecode),valueSatoshis:BigInt(d.satoshis),token:dt(d.token)},y=h.outputs[0],p=y.valueSatoshis,m=a(e),g=a(n??e),x=a(r),w=J("UPD",c,s),A=p+R+I-BigInt(d.satoshis),v=F(o,A+400n,{requireGenesis:!1}),T=E=>ke(E).length;for(let E=0;E<6;E++){let{inputs:k,totalSats:b}=v,O=($,H)=>({version:2,locktime:0,inputs:[u,...k.map(W=>it(W))],outputs:[y,{lockingBytecode:g,valueSatoshis:R,token:dt(d.token)},{lockingBytecode:et(w),valueSatoshis:0n},{lockingBytecode:x,valueSatoshis:I},...$?[{lockingBytecode:m,valueSatoshis:H}]:[]]}),P=BigInt(Math.ceil(T(O(!0,1000000n))*i)),_=A+P;if(b<_){let $=F(o,_+200n,{requireGenesis:!1});if($.inputs.length>k.length){v=$;continue}let H=new Error(`not enough funds: need ${_} sat, have ${b} sat`);throw H.needSats=_,H.haveSats=b,H}let B=b-_,U=B>=K;U||(B=0n);let N=O(U,B);return{name:c,transaction:N,sourceOutputs:[f,...k.map($=>ft($))],sellerInputIndex:0,costs:{priceSats:p,beaconDustSats:I,certificateDustSats:R,chainFeeSats:U?P:b-A,changeSats:B,totalInputSats:b}}}throw new Error("could not converge on a fee \u2014 please retry")}var Go=90n,jo=100n;async function yn(t,e,n=L.addressPrefix){let s=(await ee(t)).get(String(e).toLowerCase());if(!s?.mintScriptHex)return null;try{let r=gn(s.mintScriptHex),i=$o({bytecode:r,prefix:n,tokenSupport:!1});return typeof i=="string"?null:i.address}catch{return null}}function mn(t){let e=BigInt(t??0n),n=e*Go/jo,o=e-n;return{tldOwnerFeeSats:n,platformFeeSats:o}}var qo=S.beaconOnly;async function zo({electrum:t=L.electrum,WebSocket:e,beaconOk:n=!1}={}){let o=n?t:t.filter(s=>!qo.test(typeof s=="string"?s:s.url||""));return Ze(o,e)}async function Wt(t,e){let n=D(e),o=z(n),s=await gt({client:t}),r=s.get(o)??null,i=s.released?.get(o),a=i!==void 0&&!(i>0);return{name:o,rawName:n,available:!r&&!a,entry:r,releasedAt:i??null,releasePending:a,reason:r?"registered":a?"release-pending":null,recordBudgetBytes:he(n)}}async function Gt(t,{name:e,ownerAddress:n,records:o={},utxos:s,serviceFee:r=L.serviceFee,feeRate:i=L.feeRate,cosignUtxo:a=null,cosignTokenAddress:l=null}){let c=s??await q(t,[n]),h=D(e),d=h.indexOf("."),u=d<0?"bch":h.slice(d+1),f=BigInt(r.sats??0n),y=null,p=0n,m=f;if(f>0n){try{y=await yn(t,u)}catch{y=null}if(y&&y!==n){let g=mn(f);p=g.tldOwnerFeeSats,m=g.platformFeeSats}}return ge({name:e,ownerAddress:n,ownerTokenAddress:j(n),records:o,utxos:c,feeAddress:m>0n?r.address:null,feeSats:m,tldFeeAddress:p>0n?y:null,tldFeeSats:p,beaconAddress:L.beacon,feeRate:i,addressToLockingBytecode:C,cosignUtxo:a,cosignTokenAddress:l})}function xn(t,{tld:e,category:n}){let o=[...new TextEncoder().encode(String(e).toLowerCase())].map(s=>s.toString(16).padStart(2,"0")).join("");return t.find(s=>s.token?.nft&&(!n||s.token.category===n)&&s.token.nft.commitment===o)??null}async function wn(t,{wallet:e,utxos:n,feeRate:o,onProgress:s}){if(kt(n))return{utxos:n,prepTxid:null};s("preparing-wallet");let r=Ot({ownerAddress:e.address,utxos:n,feeRate:o,addressToLockingBytecode:C}),i=at(r.transaction,r.sourceOutputs,c=>e.keyFor(c)),a=await tt(t,i.hex);return s("prepared",{txid:a}),{utxos:i.transaction.outputs.slice(0,2).map((c,h)=>({txid:a,vout:h,satoshis:c.valueSatoshis,address:e.address,lockingBytecode:C(e.address)})),prepTxid:a}}async function Yo(t,{wallet:e,name:n,records:o={},serviceFee:s=L.serviceFee,feeRate:r=L.feeRate,tldCert:i,onProgress:a=()=>{}}){if(!i?.utxo?.token?.nft||!i.owner)throw new Error("tldCert must be the /api/tld-cert response ({ owner, utxo })");a("checking-availability");let l=await Wt(t,n);if(!l.available)throw new Error(l.releasePending?`"${l.name}" was just released \u2014 it can be registered once that release is in a block`:`"${l.name}" is already registered`);a("loading-coins");let c=await q(t,e.watchedAddresses);if(c.filter(m=>!m.token).reduce((m,g)=>m+g.satoshis,0n)===0n)throw new Error("wallet is empty \u2014 fund the address first");let d=null;({utxos:c,prepTxid:d}=await wn(t,{wallet:e,utxos:c,feeRate:r,onProgress:a})),a("building");let u=await Gt(t,{name:n,ownerAddress:e.address,records:o,utxos:c,serviceFee:s,feeRate:r,cosignUtxo:{...i.utxo,address:i.owner},cosignTokenAddress:j(i.owner)}),f=u.transaction.inputs.length-1;a("signing");let y={...u.transaction,inputs:u.transaction.inputs.map((m,g)=>g===f?{...m,unlockingBytecode:new Uint8Array}:m)},p=_t(y,u.sourceOutputs,m=>e.keyFor(m),{skip:[f]});return{name:u.name,displayName:u.displayName,category:u.category,tx:p.hex,sourceOutputs:u.sourceOutputs.map(Te),cosignInputIndex:f,costs:u.costs,prepTxid:d}}function Vo(t,e){let n=Mo(gn(String(t.tx||"")));if(typeof n=="string")throw new Error("invalid transaction: "+n);let o=(t.sourceOutputs||[]).map(ve);if(o.length!==n.inputs.length)throw new Error("sourceOutputs do not match the transaction inputs");let s=[],r=0;n.inputs.forEach((a,l)=>{let c=o[l];if(!e(xt(c.lockingBytecode))){s.push(l);return}if(c.token?.nft&&!n.outputs.some(d=>d.token&&xt(d.token.category)===xt(c.token.category)&&xt(d.token.nft?.commitment??new Uint8Array)===xt(c.token.nft.commitment??new Uint8Array)&&xt(d.lockingBytecode)===xt(c.lockingBytecode)&&d.valueSatoshis>=c.valueSatoshis))throw new Error("refusing to sign: the request would not return your TLD certificate to you");r+=1});let i=_t(n,o,e,{skip:s});return{hex:i.hex,txid:i.txid,signedInputs:r}}async function Xo(t,{wallet:e,name:n,records:o={},serviceFee:s=L.serviceFee,feeRate:r=L.feeRate,cosign:i=null,onProgress:a=()=>{}}){a("checking-availability");let l=await Wt(t,n);if(!l.available)throw new Error(l.releasePending?`"${l.name}" was just released \u2014 it can be registered once that release is in a block`:`"${l.name}" is already registered`);a("loading-coins");let c=await q(t,e.watchedAddresses);if(c.filter(m=>!m.token).reduce((m,g)=>m+g.satoshis,0n)===0n)throw new Error("wallet is empty \u2014 fund the address first");let d=null;if(i&&(d=xn(c,i),!d))throw new Error(`this wallet does not hold the certificate for .${i.tld} \u2014 only the TLD owner can co-sign`);let u=null;({utxos:c,prepTxid:u}=await wn(t,{wallet:e,utxos:c,feeRate:r,onProgress:a})),a("building");let f=await Gt(t,{name:n,ownerAddress:e.address,records:o,utxos:c,serviceFee:s,feeRate:r,cosignUtxo:d,cosignTokenAddress:d?j(e.address):null});a("signing");let y=at(f.transaction,f.sourceOutputs,m=>e.keyFor(m));a("broadcasting");let p=await tt(t,y.hex);return a("registered",{txid:p,category:f.category}),{name:f.name,displayName:f.displayName,category:f.category,txid:p,prepTxid:u,ownerAddress:e.address,certificateAddress:j(e.address),costs:f.costs,hex:y.hex}}async function Jo(t,{wallet:e,tld:n,records:o={},serviceFee:s={address:null,sats:0n},feeRate:r=L.feeRate,tldListUrl:i=null,onProgress:a=()=>{}}){let l=Et(n);if(a("checking-availability"),i)try{let p=await fetch(i);if(p.ok){let m=await p.json();if(Array.isArray(m.tlds)&&m.tlds.some(x=>(x.tld||x)===l))throw new Error(`".${l}" is already registered as a TLD`)}}catch(p){if(/already registered/.test(p.message))throw p}a("loading-coins");let c=await q(t,e.watchedAddresses);if(c.filter(p=>!p.token).reduce((p,m)=>p+m.satoshis,0n)===0n)throw new Error("wallet is empty \u2014 fund the address first");let d=null;if(!kt(c)){a("preparing-wallet");let p=Ot({ownerAddress:e.address,utxos:c,feeRate:r,addressToLockingBytecode:C}),m=at(p.transaction,p.sourceOutputs,g=>e.keyFor(g));d=await tt(t,m.hex),a("prepared",{txid:d}),c=[{txid:d,vout:0,satoshis:m.transaction.outputs[0].valueSatoshis,address:e.address,lockingBytecode:C(e.address)},...m.transaction.outputs.length>1?[{txid:d,vout:1,satoshis:m.transaction.outputs[1].valueSatoshis,address:e.address,lockingBytecode:C(e.address)}]:[]]}a("building");let u=Ht({tld:l,ownerAddress:e.address,ownerTokenAddress:j(e.address),changeAddress:e.address,records:o,utxos:c,feeAddress:s.address||null,feeSats:BigInt(s.sats??0n),feeRate:r,addressToLockingBytecode:C});a("signing");let f=at(u.transaction,u.sourceOutputs,p=>e.keyFor(p));a("broadcasting");let y=await tt(t,f.hex);return a("registered",{txid:y,category:u.category}),{tld:u.tld,category:u.category,txid:y,prepTxid:d,ownerAddress:e.address,certificateAddress:j(e.address),costs:u.costs,hex:f.hex}}async function Qo(t,{session:e,tld:n,records:o={},serviceFee:s={address:null,sats:0n},feeRate:r=L.feeRate,tldListUrl:i=null,onProgress:a=()=>{}}){let l=Et(n);if(a("checking-availability"),i)try{let m=await fetch(i);if(m.ok){let g=await m.json();if(Array.isArray(g.tlds)&&g.tlds.some(w=>(w.tld||w)===l))throw new Error(`".${l}" is already registered as a TLD`)}}catch(m){if(/already registered/.test(m.message))throw m}a("reading-wallet");let c=await e.getAddresses();if(!c.length)throw new Error("the wallet exposed no addresses");let h=c[0];a("loading-coins");let d=await q(t,c);if(d.filter(m=>!m.token).reduce((m,g)=>m+g.satoshis,0n)===0n)throw new Error("the connected wallet has no spendable coins");let u=null;if(!kt(d)){a("preparing-wallet");let m=Ot({ownerAddress:h,utxos:d,feeRate:r,addressToLockingBytecode:C}),g=await e.signTransaction(m,{userPrompt:"One-time setup so your wallet can create a TLD certificate"});u=await Rt(t,e,g,a),a("prepared",{txid:u}),d=[{txid:u,vout:0,satoshis:m.transaction.outputs[0].valueSatoshis,address:h,lockingBytecode:C(h)},...d.filter(x=>!x.token&&!m.inputUtxos.some(w=>w.txid===x.txid&&w.vout===x.vout))]}a("building");let f=Ht({tld:l,ownerAddress:h,ownerTokenAddress:j(h),changeAddress:h,records:o,utxos:d,feeAddress:s.address||null,feeSats:BigInt(s.sats??0n),feeRate:r,addressToLockingBytecode:C});a("awaiting-approval");let y=await e.signTransaction(f,{userPrompt:`Register .${l} \u2014 the TLD certificate is minted to your own address`}),p=await Rt(t,e,y,a);return a("registered",{txid:p,category:f.category}),{tld:f.tld,category:f.category,txid:p,prepTxid:u,ownerAddress:h,certificateAddress:j(h),costs:f.costs}}async function Rt(t,e,n,o){let s=n.signedTransactionHash??we(n.signedTransaction);if(e.walletBroadcasts)return s;o("broadcasting");try{return await tt(t,n.signedTransaction)}catch(r){let i=String(r?.message??r);if(/already|duplicate|txn-already|in mempool/i.test(i))return s;throw r}}async function Zo(t,{session:e,name:n,ownerAddress:o,records:s={},serviceFee:r=L.serviceFee,feeRate:i=L.feeRate,onProgress:a=()=>{}}){a("checking-availability");let l=await Wt(t,n);if(!l.available)throw new Error(l.releasePending?`"${l.name}" was just released \u2014 it can be registered once that release is in a block`:`"${l.name}" is already registered`);a("reading-wallet");let c=await e.getAddresses();if(!c.length)throw new Error("the wallet exposed no addresses");let h=o??c[0];a("loading-coins");let d=await q(t,c);if(!d.some(p=>!p.token))throw new Error("the connected wallet has no spendable coins");if(!kt(d)){a("preparing-wallet");let p=Ot({ownerAddress:h,utxos:d,feeRate:i,addressToLockingBytecode:C}),m=await e.signTransaction(p,{userPrompt:"One-time setup so your wallet can create a name certificate"}),g=await Rt(t,e,m,a);a("prepared",{txid:g}),d=[{txid:g,vout:0,satoshis:p.transaction.outputs[0].valueSatoshis,address:h,lockingBytecode:C(h)},...d.filter(x=>!x.token&&!p.inputUtxos.some(w=>w.txid===x.txid&&w.vout===x.vout))]}a("building");let u=await Gt(t,{name:n,ownerAddress:h,records:s,utxos:d,serviceFee:r,feeRate:i});a("awaiting-approval");let f=await e.signTransaction(u,{userPrompt:`Register ${u.displayName} \u2014 the certificate is minted to your own address`}),y=await Rt(t,e,f,a);return a("registered",{txid:y,category:u.category}),{name:u.name,displayName:u.displayName,category:u.category,txid:y,ownerAddress:h,certificateAddress:j(h),costs:u.costs}}async function ts(t,{addresses:e,category:n,rawName:o}){let s=await q(t,e),r=[...new TextEncoder().encode(o)].map(i=>i.toString(16).padStart(2,"0")).join("");return s.find(i=>i.token?.category===n&&i.token?.nft?.commitment===r)??null}async function es(t,{wallet:e,name:n,records:o,feeRate:s=L.feeRate,onProgress:r=()=>{}}){r("resolving");let i=D(n),l=(await gt({client:t})).get(z(i));if(!l)throw new Error(`"${z(i)}" is not registered`);r("loading-coins");let c=await q(t,e.watchedAddresses),h=c.find(y=>y.token?.category===l.category&&y.token?.nft);if(!h)throw new Error(`this wallet does not hold the certificate for "${z(i)}" \u2014 only the owner can change its records`);r("building");let d=Nt({name:n,ownerAddress:e.address,ownerTokenAddress:j(e.address),records:o,certificateUtxo:h,utxos:c.filter(y=>!y.token),beaconAddress:L.beacon,feeRate:s,addressToLockingBytecode:C});r("signing");let u=at(d.transaction,d.sourceOutputs,y=>e.keyFor(y));r("broadcasting");let f=await tt(t,u.hex);return r("updated",{txid:f}),{name:d.name,displayName:d.displayName,category:d.category,txid:f,records:o,costs:d.costs}}async function bn(t,e,n=L.beacon){let o=await nn(t,e.txid,!0),s=xt(C(n));return(o?.vout??[]).some(r=>r.scriptPubKey?.hex===s)}async function ns(t,{wallet:e,name:n,feeRate:o=L.feeRate,onProgress:s=()=>{}}){s("resolving");let r=D(n),a=(await gt({client:t})).get(z(r));if(!a)throw new Error(`"${z(r)}" is not registered`);s("loading-coins");let l=p=>p.token?.category===a.category&&p.token?.nft,c=await q(t,e.watchedAddresses),h=c.find(l);if(!h)throw new Error(`this wallet does not hold the certificate for "${z(r)}" \u2014 only the owner can release it`);let d=null;if(!await bn(t,h)){s("anchoring");let p=Nt({name:n,ownerAddress:e.address,ownerTokenAddress:j(e.address),records:a.records??{},certificateUtxo:h,utxos:c.filter(g=>!g.token),beaconAddress:L.beacon,feeRate:o,addressToLockingBytecode:C}),m=at(p.transaction,p.sourceOutputs,g=>e.keyFor(g));d=await tt(t,m.hex),s("anchored",{txid:d}),h=null;for(let g=0;g<12&&!h;g++)await new Promise(x=>setTimeout(x,1500)),c=await q(t,e.watchedAddresses),h=c.find(x=>l(x)&&x.txid===d)??null;if(!h)throw new Error("the anchoring update was broadcast but is not visible yet \u2014 try the release again in a minute")}s("building");let u=ye({name:n,ownerAddress:e.address,certificateUtxo:h,utxos:c.filter(p=>!p.token),beaconAddress:L.beacon,feeRate:o,addressToLockingBytecode:C});s("signing");let f=at(u.transaction,u.sourceOutputs,p=>e.keyFor(p));s("broadcasting");let y=await tt(t,f.hex);return s("released",{txid:y}),{name:u.name,displayName:u.displayName,category:u.category,txid:y,anchorTxid:d,costs:u.costs}}async function os(t,{session:e,name:n,records:o,feeRate:s=L.feeRate,onProgress:r=()=>{}}){r("resolving");let i=D(n),l=(await gt({client:t})).get(z(i));if(!l)throw new Error(`"${z(i)}" is not registered`);r("reading-wallet");let c=await e.getAddresses(),h=await q(t,c),d=h.find(p=>p.token?.category===l.category&&p.token?.nft);if(!d)throw new Error(`this wallet does not hold the certificate for "${z(i)}" \u2014 only the owner can change its records`);r("building");let u=Nt({name:n,ownerAddress:d.address,ownerTokenAddress:j(d.address),records:o,certificateUtxo:d,utxos:h.filter(p=>!p.token),beaconAddress:L.beacon,feeRate:s,addressToLockingBytecode:C});r("awaiting-approval");let f=await e.signTransaction(u,{userPrompt:`Point ${u.displayName} somewhere new`}),y=await Rt(t,e,f,r);return r("updated",{txid:y}),{name:u.name,displayName:u.displayName,category:u.category,txid:y,records:o,costs:u.costs}}async function ss(t,{wallet:e,tld:n,records:o,category:s,feeRate:r=L.feeRate,onProgress:i=()=>{}}){if(!s)throw new Error("setTldRecords requires the TLD certificate's category id");i("loading-coins");let a=await q(t,e.watchedAddresses),l=a.find(u=>u.token?.category===s&&u.token?.nft);if(!l)throw new Error(`this wallet does not hold the TLD certificate for ".${n}" \u2014 only the owner can change its policy`);i("building");let c=sn({tld:n,ownerAddress:e.address,ownerTokenAddress:j(e.address),records:o,certificateUtxo:l,utxos:a.filter(u=>!u.token),feeRate:r,addressToLockingBytecode:C});i("signing");let h=at(c.transaction,c.sourceOutputs,u=>e.keyFor(u));i("broadcasting");let d=await tt(t,h.hex);return i("updated",{txid:d}),{tld:c.tld,displayName:c.displayName,category:c.category,txid:d,records:o,costs:c.costs}}async function rs(t,e){if(!e||e.v!==1&&e.v!==2)throw new Error("manifest.v must be 1 or 2");if(!e.name)throw new Error("manifest.name is required");if(typeof e.seq!="number"||e.seq<0)throw new Error("manifest.seq must be a non-negative integer");let n={...e};delete n.sig;let o=JSON.stringify(Ee(n)),s=Ho.hash(Ko(o)),r=t.signMessage(s);return{...e,sig:Wo(r)}}function Ee(t){if(t!=null){if(Array.isArray(t))return t.map(Ee).filter(e=>e!==void 0);if(typeof t=="object"){let e={};for(let n of Object.keys(t).sort()){let o=Ee(t[n]);o!==void 0&&(e[n]=o)}return e}return t}}async function as(t,e){let n=await q(t,e),o=n.filter(s=>!s.token);return{sats:o.reduce((s,r)=>s+r.satoshis,0n),confirmedSats:o.filter(s=>s.height>0).reduce((s,r)=>s+r.satoshis,0n),coins:o.length,certificates:n.filter(s=>s.token?.nft),hasGenesisInput:kt(n)}}import{hexToBin as Q,binToHex as nt,encodeDataPush as G,bigIntToVmNumber as qt,hash256 as Oe,hash160 as is,encodeLockingBytecodeP2sh32 as cs,encodeLockingBytecodeP2pkh as vn,lockingBytecodeToCashAddress as ls,OpcodesBCH as us,numberToBinUint32LE as kr,binToNumberUint32LE as Sn,secp256k1 as En,sha256 as ds,generateSigningSerializationBCH as fs,encodeTransaction as On,flattenBinArray as At}from"@bitauth/libauth";var kn={contractName:"UsdListing",constructorInputs:[{name:"oraclePk",type:"pubkey"},{name:"sellerPkh",type:"bytes20"},{name:"targetCents",type:"int"},{name:"floorSats",type:"int"},{name:"ceilSats",type:"int"},{name:"maxAgeSecs",type:"int"}],abi:[{name:"buy",inputs:[{name:"oracleMsg",type:"bytes"},{name:"oracleSig",type:"datasig"}]},{name:"cancel",inputs:[{name:"pk",type:"pubkey"},{name:"s",type:"sig"}]}],bytecode:"OP_6 OP_PICK OP_0 OP_NUMEQUAL OP_IF OP_TXLOCKTIME OP_CHECKLOCKTIMEVERIFY OP_DROP OP_7 OP_PICK OP_SIZE OP_NIP 28 OP_NUMEQUALVERIFY OP_8 OP_ROLL OP_8 OP_PICK OP_ROT OP_CHECKDATASIGVERIFY OP_6 OP_ROLL OP_4 OP_SPLIT OP_4 OP_SPLIT OP_ROT OP_BIN2NUM OP_ROT OP_BIN2NUM OP_DUP OP_0 OP_GREATERTHAN OP_VERIFY OP_ROT OP_INPUTINDEX OP_OUTPOINTTXHASH OP_EQUALVERIFY OP_TXLOCKTIME 302a OP_ADD OP_2 OP_PICK OP_GREATERTHANOREQUAL OP_VERIFY OP_TXLOCKTIME OP_ROT OP_7 OP_ROLL OP_ADD OP_LESSTHANOREQUAL OP_VERIFY OP_ROT 00e1f505 OP_MUL OP_SWAP OP_DIV OP_DUP OP_3 OP_PICK OP_LESSTHAN OP_IF OP_2 OP_PICK OP_NIP OP_ENDIF OP_DUP OP_4 OP_PICK OP_GREATERTHAN OP_IF OP_3 OP_PICK OP_NIP OP_ENDIF OP_0 OP_OUTPUTBYTECODE 76a914 OP_3 OP_ROLL OP_CAT 88ac OP_CAT OP_EQUALVERIFY OP_0 OP_OUTPUTVALUE OP_LESSTHANOREQUAL OP_VERIFY OP_0 OP_OUTPUTTOKENCATEGORY OP_0 OP_EQUALVERIFY OP_1 OP_OUTPUTTOKENCATEGORY OP_INPUTINDEX OP_UTXOTOKENCATEGORY OP_EQUALVERIFY OP_1 OP_OUTPUTTOKENCOMMITMENT OP_INPUTINDEX OP_UTXOTOKENCOMMITMENT OP_EQUAL OP_NIP OP_NIP OP_NIP OP_ELSE OP_6 OP_ROLL OP_1 OP_NUMEQUALVERIFY OP_6 OP_PICK OP_HASH160 OP_ROT OP_EQUALVERIFY OP_6 OP_ROLL OP_6 OP_ROLL OP_CHECKSIGVERIFY OP_2DROP OP_2DROP OP_DROP OP_1 OP_ENDIF",compiler:{name:"cashc",version:"0.13.3",options:{enforceFunctionParameterTypes:!0,enforceLocktimeGuard:!0}}};var hs=2,_e=1200,ps=7200,gs=t=>{let e=us[t];if(e===void 0)throw new Error("unknown opcode "+t);return Uint8Array.of(e)};function ys(t){let e=t.trim().split(/\s+/).filter(Boolean).map(n=>n.startsWith("OP_")?gs(n):G(Q(n)));return At(e)}var ms=ys(kn.bytecode),jt=t=>G(qt(BigInt(t))),xs=0,Tn=1;function ws(t){let e=Q(t);if(e.length!==25||e[0]!==118||e[1]!==169||e[2]!==20)throw new Error("seller must hold the certificate on a plain P2PKH address");return nt(e.slice(3,23))}function Ae({oraclePk:t,sellerPkh:e,targetCents:n,floorSats:o,ceilSats:s,maxAgeSecs:r=_e}){if(!(BigInt(n)>0n)||!(BigInt(o)>0n)||BigInt(s)<BigInt(o))throw new Error("bad listing terms");return At([jt(r),jt(s),jt(o),jt(n),G(Q(e)),G(Q(t)),ms])}var zt=t=>cs(Oe(t));function Be(t,e=S.prefix){let n=ls({bytecode:zt(t),prefix:e});if(typeof n=="string")throw new Error(n);return n.address}function _n({targetCents:t,priceCents:e,floorSats:n,ceilSats:o}){let s=BigInt(t)*100000000n/BigInt(e);return s<BigInt(n)&&(s=BigInt(n)),s>BigInt(o)&&(s=BigInt(o)),s}var An=t=>({ts:Sn(t.slice(0,4)),priceCents:Sn(t.slice(4,8)),outpointTxid:nt(t.slice(8,40).slice().reverse())});function Bn(t,e,n){return En.verifySignatureSchnorr(n,t,ds.hash(e))===!0}var Ie=(t,e,n,o,{requireGenesis:s=!1}={})=>{let r=F(t,e+600n,{requireGenesis:s});for(let i=0;i<6;i++){let{inputs:a,totalSats:l}=r,c=o(a,!0,1000000n),h=BigInt(Math.ceil(On(c.transaction).length*n)),d=e+h;if(l<d){let y=F(t,d+200n,{requireGenesis:s});if(y.inputs.length>a.length){r=y;continue}let p=new Error(`not enough funds: need ${d} sat, have ${l} sat`);throw p.needSats=d,p.haveSats=l,p}let u=l-d,f=u>=K;return f||(u=0n),{...o(a,f,u),fee:f?h:l-e,change:u}}throw new Error("could not converge on a fee \u2014 please retry")};function bs({name:t,certificateUtxo:e,utxos:n,sellerAddress:o,oraclePk:s,targetCents:r,floorSats:i,ceilSats:a,maxAgeSecs:l=_e,records:c={},beaconAddress:h=lt,feeRate:d=1,addressToLockingBytecode:u}){let f=D(t);if(!e?.token?.nft)throw new Error("certificateUtxo does not carry a certificate");let y=u(o),p=ws(nt(u(e.address||o))),m=Ae({oraclePk:s,sellerPkh:p,targetCents:r,floorSats:i,ceilSats:a,maxAgeSecs:l}),g=zt(m),x=J("UPD",f,c),w=n.filter(T=>!T.token),A=R+I-BigInt(e.satoshis);return{...Ie(w,A>0n?A:0n,d,(T,E,k)=>({transaction:{version:2,locktime:0,inputs:[it(e),...T.map(b=>it(b))],outputs:[{lockingBytecode:g,valueSatoshis:R,token:dt(e.token)},{lockingBytecode:et(x),valueSatoshis:0n},{lockingBytecode:u(h),valueSatoshis:I},...E?[{lockingBytecode:y,valueSatoshis:k}]:[]]},sourceOutputs:[ft(e),...T.map(b=>ft(b))]})),name:f,redeem:m,redeemHex:nt(m),address:Be(m,o.split(":")[0]),sellerPkh:p,covenantVout:0}}function In(t){let e=Q(t.redeem_hex);return{redeem:e,utxo:{txid:t.outpoint.txid,vout:t.outpoint.vout,satoshis:BigInt(t.outpoint.satoshis??R),lockingBytecode:zt(e),token:t.token}}}function ks({listing:t,quote:e,buyerAddress:n,buyerTokenAddress:o,utxos:s,records:r={},beaconAddress:i=lt,feeRate:a=1,addressToLockingBytecode:l}){let c=D(t.name),h=Q(e.message),d=Q(e.signature);if(!Bn(Q(t.oracle_pk),h,d))throw new Error("oracle signature does not verify against the listing's oracle key");let{ts:u,priceCents:f,outpointTxid:y}=An(h);if(y!==String(t.outpoint.txid).toLowerCase())throw new Error("quote was issued for a different listing");let p=_n({targetCents:t.target_cents,priceCents:f,floorSats:t.floor_sats,ceilSats:t.ceil_sats}),{redeem:m,utxo:g}=In(t),x=vn(Q(t.seller_pkh)),w=At([G(d),G(h),G(qt(BigInt(xs))),G(m)]),A=l(n),v=l(o??n),T=J("UPD",c,r),E=s.filter(O=>!O.token),k=p+R+I-g.satoshis;return{...Ie(E,k,a,(O,P,_)=>({transaction:{version:2,locktime:Math.max(0,u-ps),inputs:[it(g,w),...O.map(B=>it(B))],outputs:[{lockingBytecode:x,valueSatoshis:p},{lockingBytecode:v,valueSatoshis:R,token:dt(g.token)},{lockingBytecode:et(T),valueSatoshis:0n},{lockingBytecode:l(i),valueSatoshis:I},...P?[{lockingBytecode:A,valueSatoshis:_}]:[]]},sourceOutputs:[ft(g),...O.map(B=>ft(B))]})),name:c,covenantInputIndex:0,priceSats:p,priceCents:f,quoteTs:u}}function Ss({listing:t,sellerAddress:e,sellerTokenAddress:n,utxos:o,records:s={},beaconAddress:r=lt,feeRate:i=1,addressToLockingBytecode:a,keyFor:l}){let c=D(t.name),{redeem:h,utxo:d}=In(t),u=vn(Q(t.seller_pkh)),f=l(nt(u));if(!f)throw new Error("this wallet does not hold the seller key for this listing");let y=f.privateKey,p=f.publicKey,m=a(n??e),g=J("UPD",c,s),x=o.filter(B=>!B.token),w=R+I-d.satoshis,A=At([G(new Uint8Array(65)),G(p),G(qt(BigInt(Tn))),G(h)]),v=Ie(x,w>0n?w:0n,i,(B,U,N)=>({transaction:{version:2,locktime:0,inputs:[it(d,A),...B.map($=>it($))],outputs:[{lockingBytecode:m,valueSatoshis:R,token:dt(d.token)},{lockingBytecode:et(g),valueSatoshis:0n},{lockingBytecode:a(r),valueSatoshis:I},...U?[{lockingBytecode:a(e),valueSatoshis:N}]:[]]},sourceOutputs:[ft(d),...B.map($=>ft($))]})),T=_t(v.transaction,v.sourceOutputs,l,{skip:[0]}),E=fs({inputIndex:0,sourceOutputs:v.sourceOutputs,transaction:T.transaction},{coveredBytecode:h,signingSerializationType:Uint8Array.of(Kt)}),k=En.signMessageHashSchnorr(y,Oe(E));if(typeof k=="string")throw new Error(k);let b=At([k,Uint8Array.of(Kt)]),O=At([G(b),G(p),G(qt(BigInt(Tn))),G(h)]),P={...T.transaction,inputs:T.transaction.inputs.map((B,U)=>U===0?{...B,unlockingBytecode:O}:B)},_=On(P);return{name:c,transaction:P,sourceOutputs:v.sourceOutputs,hex:nt(_),txid:nt(Oe(_).slice().reverse())}}function Ts(t,{oraclePk:e}={}){let n=o=>({ok:!1,error:o});try{if(t?.kind!=="usd"||t.v!==hs)return n("not a v2 usd listing");for(let r of["name","seller","seller_pkh","category","target_cents","floor_sats","ceil_sats","max_age_secs","oracle_pk","redeem_hex","covenant_address","outpoint","token"])if(t[r]==null)return n("missing "+r);if(e&&t.oracle_pk!==e)return n("listing was made for a different oracle key");let o=Ae({oraclePk:t.oracle_pk,sellerPkh:t.seller_pkh,targetCents:t.target_cents,floorSats:t.floor_sats,ceilSats:t.ceil_sats,maxAgeSecs:t.max_age_secs});if(nt(o)!==t.redeem_hex)return n("redeem script does not match the stated terms");let s=String(t.seller).split(":")[0]||S.prefix;return Be(o,s)!==t.covenant_address?n("covenant address does not match"):nt(is(Q(t.seller_pkh))).length!==40?n("bad seller pkh"):t.token?.category!==t.category||!t.token?.nft?n("token does not match category"):Q(t.token.nft.commitment||"").length===0||nt(new TextEncoder().encode(D(t.name)))!==t.token.nft.commitment?n("commitment does not match the name"):{ok:!0,name:D(t.name),covenant_lock:nt(zt(o))}}catch(o){return n(String(o?.message||o))}}import{hash160 as vs,lockingBytecodeToCashAddress as Es,binToHex as Ar}from"@bitauth/libauth";function Pn(t){return Uint8Array.from([118,169,20,...vs(t),136,172])}function Os(t,e=S.prefix,n=!1){let o=Es({bytecode:Pn(t),prefix:e,tokenSupport:n});if(typeof o=="string")throw new Error(`address encoding failed: ${o}`);return o.address}function _s(t){return t?{ready:!0,approvals:1,explanation:"Your wallet can mint the certificate directly."}:{ready:!1,approvals:2,explanation:"Your wallet needs one small setup transaction to itself before it can create a certificate \u2014 a rule of the Bitcoin Cash token system, not a fee we charge. You will be asked to approve it, then the registration. This happens only once."}}import{binToHex as Gr,hexToBin as jr}from"@bitauth/libauth";import{stringify as zr}from"@bitauth/libauth";export{ae as BuiltInWallet,yo as CHIPNET_PREFIX,_e as DEFAULT_MAX_AGE_SECS,Fe as DEFAULT_NETWORK_ID,It as DEFAULT_PREFIX,X as InsufficientFundsError,mo as MAINNET_PREFIX,S as NETWORK,vt as NETWORKS,$t as NoGenesisInputError,L as REGISTRAR,fe as TLD_BEACON,C as addressToLockingBytecode,vo as addressToScripthash,Gr as binToHex,tt as broadcast,Yo as buildCosignRequest,gt as buildIndex,Co as buildListing,Ot as buildPrepTx,ge as buildRegistrationTx,ye as buildReleaseTx,Ht as buildTldRegistrationTx,Nt as buildUpdateTx,ks as buildUsdBuyTx,Ss as buildUsdCancelTx,bs as buildUsdListingTx,Wt as checkAvailability,Fo as completeSale,zo as connect,_s as describeGenesisRequirement,z as displayName,ts as findCertificateUtxo,xn as findTldCertificateUtxo,yn as findTldOwnerAddress,as as getBalance,st as getNetwork,en as getUtxos,q as getUtxosForAddresses,kt as hasGenesisInput,jr as hexToBin,bn as isAnchored,D as normalizeName,Et as normalizeTld,An as parseOracleMessage,he as payloadBudget,_n as payoutSats,Ro as priceSummary,Os as pubkeyToAddress,Pn as pubkeyToLockingBytecode,Gt as quoteRegistration,Jo as registerTldWithBuiltInWallet,Qo as registerTldWithExternalWallet,Xo as registerWithBuiltInWallet,Zo as registerWithExternalWallet,ns as releaseWithBuiltInWallet,Xt as requireBeacons,co as resolveName,es as setRecordsWithBuiltInWallet,os as setRecordsWithExternalWallet,ss as setTldRecordsWithBuiltInWallet,Vo as signCosignRequest,_t as signInputs,rs as signRecordsManifest,at as signTransaction,ve as sourceOutputFromJson,Te as sourceOutputToJson,mn as splitServiceFee,zr as stringify,j as toTokenAddress,rn as toWcTransactionObject,xe as txidOf,we as txidOfHex,Be as usdListingAddress,Ae as usdListingRedeem,pn as verifyListing,Bn as verifyOracleMessage,Ts as verifyUsdListing};
|