phala 1.0.18 → 1.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{$ as Z,O as A,P as ke,Q as q,R as V,S as J,U as Q,V as we,W as be,X as Se,Y as _e,Z as Ee,a as e,aa as $e,b as ie,ba as De,c as W,ca as xe,d as U,da as Ie,e as ne,ea as N,f as _,g as h,h as he,i as ae,j as se,k as me,l as O,m as ye,n as ve,q as Ce}from"./chunk-6GN3UXCF.js";import{Command as Sr}from"commander";import Ae from"chalk";var Pe=Ae.hex("#cdfa50"),X=Pe(`
2
+ import{$ as Me,Q as Fs,S as Ds,V as tt,W as $s,X as Cr,Y as ye,_ as kr,a,b as Is,ba as Ar,c as xn,ca as Sr,d as Er,da as Re,e as Jt,ea as Ns,f as yn,fa as Ms,g as Te,ga as Rs,h as _,i as Ts,ia as Ir,j as Pe,ja as Tr,k as ce,ka as Us,l as me,m as Yt,ma as Pr,n as bn,na as zs,o as Ps,oa as Hs,p as _s,pa as Ls,qa as Vs,r as vn,ra as be,s as Bs}from"./chunk-ZUJB7PGQ.js";import{$ as An,$a as Ln,A as js,Aa as Dn,B as Dr,Ba as Xt,C as fe,Ca as zr,D as Ks,Da as $n,E as Ws,Ea as Hr,F as Js,Fa as Nn,G as Ys,Ga as Mn,H as M,Ha as Rn,I as xt,Ia as Un,J as ne,Ja as zn,K as Zs,Ka as gi,L as Qs,La as Lr,M as Xs,Ma as hi,N as se,Na as Vr,O as yt,Oa as Or,P as ue,Pa as Gr,Q as ei,Qa as Et,R as ti,Ra as Ct,S as ri,Sa as qr,T as oi,Ta as jr,U as ot,Ua as Le,V as $r,Va as kt,W as J,Wa as ie,X as G,Xa as xi,Y as ni,Ya as Kr,Z as si,Za as yi,_ as Nr,_a as Hn,a as _r,aa as U,ab as Vn,b as wn,ba as ii,bb as bi,c as Br,ca as bt,cb as vi,d as _e,da as ai,db as er,e as pe,ea as ci,eb as wi,f as T,fa as mi,fb as ve,g as Os,ga as pi,gb as Ei,h as ht,ha as Mr,hb as Ci,i as Gs,ia as Rr,ib as ki,j as Fr,ja as fi,k as En,ka as ui,l as qs,la as li,m as Be,ma as Qt,n as Ue,na as di,nb as Ve,o as rt,oa as vt,p as L,pa as nt,q as Cn,qa as Ur,r as q,ra as Sn,s as C,sa as In,t as H,ta as Tn,u as P,ua as Pn,v as Zt,va as _n,w as ze,wa as wt,x as X,xa as st,y as He,ya as Bn,z as kn,za as Fn}from"./chunk-WITLSA6W.js";import"./chunk-KC2EQH4K.js";import{Command as Ju}from"commander";import Ai from"chalk";var Si=Ai.hex("#cdfa50"),Wr=Si(`
3
3
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28E0\u28E4\u28E4\u28E4\u28C0\u2840\u2800\u2880\u28C0\u28E4\u28E4\u28C0\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800
4
4
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28F4\u287F\u281B\u2809\u2801\u2800\u2808\u2809\u281B\u283F\u281B\u2809\u2809\u2809\u2809\u2819\u2837\u28C4\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800
5
5
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28A0\u28FF\u280B\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2818\u28E7\u2800\u2800\u2800\u2800\u2800\u2800\u2800
@@ -21,7 +21,7 @@ import{$ as Z,O as A,P as ke,Q as q,R as V,S as J,U as Q,V as we,W as be,X as Se
21
21
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u28C6\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2809\u281B\u283F\u283F\u28FF\u28FF\u28FF\u28FF\u28FF\u283F\u281F\u280B\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28FE\u2800\u2800\u2800\u2800\u2800\u2800\u2800
22
22
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2819\u283B\u28B6\u28E6\u28E4\u28C4\u28C0\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28C0\u28C0\u28E4\u28F4\u28F6\u283F\u281B\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800
23
23
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2808\u2809\u2819\u281B\u283B\u283F\u283F\u283F\u283F\u28BF\u28FF\u28FF\u28FF\u283F\u283F\u283F\u283F\u281F\u281B\u281B\u2809\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800
24
- `),$r=Pe(`
24
+ `),Qu=Si(`
25
25
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28E0\u28E4\u28E4\u28E4\u28C0\u2840\u2800\u2880\u28C0\u28E4\u28E4\u28C0\u2840\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800
26
26
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2880\u28F4\u287F\u281B\u2809\u2801\u2800\u2808\u2809\u281B\u283F\u281B\u2809\u2809\u2809\u2809\u2819\u2837\u28C4\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800
27
27
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28A0\u28FF\u280B\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2818\u28E7\u2800\u2800\u2800\u2800\u2800\u2800\u2800
@@ -43,25 +43,30 @@ import{$ as Z,O as A,P as ke,Q as q,R as V,S as J,U as Q,V as we,W as be,X as Se
43
43
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28B8\u28C6\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2809\u281B\u283F\u283F\u28FF\u28FF\u28FF\u28FF\u28FF\u283F\u281F\u280B\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28FE\u2800\u2800\u2800\u2800\u2800\u2800\u2800
44
44
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2819\u283B\u28B6\u28E6\u28E4\u28C4\u28C0\u28C0\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u28C0\u28C0\u28C0\u28E4\u28F4\u28F6\u283F\u281B\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800
45
45
  \u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2808\u2809\u2819\u281B\u283B\u283F\u283F\u283F\u283F\u28BF\u28FF\u28FF\u28FF\u283F\u283F\u283F\u283F\u281F\u281B\u281B\u2809\u2801\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800\u2800
46
- `),Dr=Ae.cyan("PHALA TEE CLOUD CLI");import{Command as At}from"commander";import{Command as $t}from"commander";import Dt from"prompts";var Fe=new $t().name("login").description("Set the API key for authentication").argument("[api-key]","Phala Cloud API key to set").action(async o=>{try{let t;if(!o)o=(await Dt({type:"password",name:"apiKey",message:"Enter your API key:",validate:async i=>{if(i.length===0)return"API key cannot be empty";try{if(await ie(i),t=await A(),!t.username)return await U(),"Invalid API key"}catch{return"Invalid API key"}return!0}})).apiKey;else if(await ie(o),t=await A(),!t.username)return await U(),"Invalid API key";e.success(`Welcome ${t.username}! API key validated and saved successfully`),e.break(),e.info(`Open in Web UI at ${h}/dashboard/`)}catch(t){e.error(`Failed to set API key: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as xt}from"commander";var Te=new xt().name("logout").description("Remove the stored API key").action(async()=>{try{await U(),e.success("API key removed successfully")}catch(o){e.error(`Failed to remove API key: ${o instanceof Error?o.message:String(o)}`),process.exit(1)}});import{Command as It}from"commander";var Me=new It().name("status").description("Check authentication status").option("-j, --json","Output in JSON format").option("-d, --debug","Enable debug output").action(async o=>{try{o.debug&&(process.env.DEBUG="true");let t=await W();if(!t){e.warn('Not authenticated. Please set an API key with "phala auth login"');return}e.debug(`Using API key: ${t.substring(0,5)}...`);let r=e.startSpinner("Checking authentication status");try{let i=await A();if(r.stop(!0),o.json){console.log(JSON.stringify(i,null,2));return}e.break(),e.success(`Authenticated as ${i.username}`);let n={Username:i.username,Email:i.email,Role:i.role,Team:`${i.team_name} (${i.team_tier})`,Credits:`$${(i.credits+i.granted_credits).toFixed(2)}`};i.trial_ended_at&&(n["Trial Ended At"]=i.trial_ended_at),e.keyValueTable(n,{borderStyle:"rounded"})}catch(i){r.stop(!1),e.error("Authentication failed. Your API key may be invalid or expired."),e.info('Please set a new API key with "phala auth login"'),o.debug&&e.debug(`Error details: ${i instanceof Error?i.message:String(i)}`)}}catch(t){e.error(`Failed to check authentication status: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});var Ve=new At().name("auth").description("Authenticate with Phala Cloud").addCommand(Fe).addCommand(Te).addCommand(Me);import{Command as Ht}from"commander";import{Command as Ot}from"commander";import{execa as Mt}from"execa";import E from"node:fs";import K from"node:path";import Vt from"handlebars";import{exec as Nt,spawn as Rt}from"node:child_process";import{promisify as Lt}from"node:util";import Oe from"node:os";import Pt from"inquirer";import ce from"node:fs";import pe from"node:path";function P(o,t=process.cwd()){let r=pe.resolve(t,o);if(!ce.existsSync(r))throw new Error(`File not found at ${r}`);return!0}async function F(o,t,r="file",i=process.cwd()){return(await Pt.prompt([{type:"input",name:r,message:o,default:t,validate:m=>{let a=pe.resolve(i,m);return ce.existsSync(a)?!0:`File not found at ${a}`}}]))[r]}function ee(o,t){for(let r of o){let i=pe.join(process.cwd(),r);if(ce.existsSync(i))return t?e.info(t.replace("{path}",i)):e.info(`File detected: ${i}`),r}}import*as b from"node:fs";import*as D from"node:path";import*as R from"node:os";import{execSync as L,spawn as Ft}from"node:child_process";import*as le from"node:net";var C={version:"0.1.4",baseUrl:"https://github.com/Leechael/tappd-simulator/releases/download/v0.1.4",installDir:D.join(R.homedir(),".phala-cloud","tappd-simulator"),defaultLogPath:D.join(R.homedir(),".phala-cloud","logs","tappd-simulator.log"),platforms:{darwin:{filename:"tappd-simulator-0.1.4-aarch64-apple-darwin.tgz",extractedFolder:"tappd-simulator-0.1.4-aarch64-apple-darwin",socketArg:"unix:/tmp/tappd.sock"},linux:{filename:"tappd-simulator-0.1.4-x86_64-linux-musl.tgz",extractedFolder:"tappd-simulator-0.1.4-x86_64-linux-musl",socketArg:"unix:/tmp/tappd.sock"},win32:{filename:"tappd-simulator-0.1.4-x86_64-pc-windows-msvc.tgz",extractedFolder:"tappd-simulator-0.1.4-x86_64-pc-windows-msvc",socketArg:"127.0.0.1:8090"}}};function Ne(){try{if(!b.existsSync(C.installDir))return!1;let o=R.platform();if(!C.platforms[o])throw new Error(`Unsupported platform: ${o}`);let t=D.join(C.installDir,C.platforms[o].extractedFolder);if(!b.existsSync(t))return!1;let i=D.join(t,o==="win32"?"tappd-simulator.exe":"tappd-simulator");return b.existsSync(i)}catch(o){return e.error("Error checking if simulator is installed:",o),!1}}function z(){let o=R.platform();if(!C.platforms[o])throw new Error(`Unsupported platform: ${o}. Only darwin, linux, and win32 are supported.`);return o}async function Re(o){let t=r=>{e.info(r),o&&o(r)};try{let r=z(),i=C.platforms[r];b.existsSync(C.installDir)||(e.info(`Creating installation directory at ${C.installDir}`),b.mkdirSync(C.installDir,{recursive:!0})),process.chdir(C.installDir);let n=`${C.baseUrl}/${i.filename}`;e.info(`Downloading simulator from ${n}`),L(`wget ${n}`,{stdio:"inherit"}),e.info(`Extracting ${i.filename}`),L(`tar -xvf ${i.filename}`,{stdio:"inherit"}),e.success("Simulator installation completed successfully")}catch(r){throw e.error("Error installing simulator:",r),new Error(`Failed to install simulator: ${r}`)}}async function Le(o={}){try{let t=z(),r=C.platforms[t],i=D.join(C.installDir,r.extractedFolder);process.chdir(i);let n=t==="win32"?"tappd-simulator.exe":"./tappd-simulator",m={background:o.background??!0,logToFile:o.logToFile??!0,logFilePath:o.logFilePath??C.defaultLogPath};if(m.logToFile){let s=D.dirname(m.logFilePath);b.existsSync(s)||b.mkdirSync(s,{recursive:!0}),e.info(`Simulator logs will be written to: ${m.logFilePath}`)}e.info(`Starting simulator with: ${n} -l ${r.socketArg}`);let a="inherit",c=null;m.logToFile&&(c=b.createWriteStream(m.logFilePath,{flags:"a"}),a=["ignore",c,c]);let l=Ft(n,["-l",r.socketArg],{stdio:a,shell:t==="win32",detached:m.background});if(c){let s=new Date().toISOString();c.write(`
47
- [${s}] Simulator started
48
- `)}return m.background&&(l.unref(),e.success("Simulator is running in the background")),await de(),l}catch(t){throw e.error("Error running simulator:",t),new Error(`Failed to run simulator: ${t}`)}}async function te(){try{let o=z(),t=C.platforms[o];if(o==="darwin"||o==="linux"){let r="/tmp/tappd.sock";return b.existsSync(r)?new Promise(i=>{let n=le.createConnection({path:r}).on("connect",()=>{n.end(),i(!0)}).on("error",()=>{i(!1)});setTimeout(()=>{n.end(),i(!1)},1e3)}):!1}if(o==="win32"){let r="127.0.0.1";return new Promise(n=>{let m=le.createConnection({host:r,port:8090}).on("connect",()=>{m.end(),n(!0)}).on("error",()=>{n(!1)});setTimeout(()=>{m.end(),n(!1)},1e3)})}return!1}catch(o){return e.error("Error checking if simulator is running:",o),!1}}async function Ue(){try{let o=z();if(!await te())return e.info("Simulator is not running"),!0;e.info("Stopping simulator..."),o==="win32"?L(`for /f "tokens=5" %a in ('netstat -ano ^| findstr :8080') do taskkill /F /PID %a`,{stdio:"inherit"}):L("pkill -f tappd-simulator",{stdio:"inherit"});let t=!await te();return t?e.success("Simulator stopped successfully"):e.error("Failed to stop simulator"),await T(),t}catch(o){return e.error("Error stopping simulator:",o),!1}}function Tt(){return z()==="win32"?"http://127.0.0.1:8090":"unix:///tmp/tappd.sock"}async function de(o){try{let t=Tt(),r=o||t;return await L(`export DSTACK_SIMULATOR_ENDPOINT=${r}`),e.success(`Setting DSTACK_SIMULATOR_ENDPOINT=${r} for current process`),o}catch(t){throw e.error("Error setting simulator endpoint environment variable:",t),new Error(`Failed to set simulator endpoint: ${t}`)}}async function T(){return await L("unset DSTACK_SIMULATOR_ENDPOINT"),e.debug("Deleted DSTACK_SIMULATOR_ENDPOINT from current process"),!0}var j=Lt(Nt),ze=".phala-cloud/logs",Ut=".phala-cloud/compose",Ke=10,v=class{username;image;registry;constructor(t,r,i){this.image=t,this.username=r||"",this.registry=i||""}ensureLogsDir(){let t=K.resolve(ze);E.existsSync(t)||E.mkdirSync(t,{recursive:!0})}getLogFilePath(t,r){let i=new Date().toISOString().replace(/[:.]/g,"-");return K.resolve(ze,`${r||this.image}-${t}-${i}.log`)}getSystemArchitecture(){let t=Oe.arch();switch(t){case"arm":case"arm64":return"arm64";case"x64":return"amd64";default:return t}}spawnProcess(t,r,i,n){return new Promise((m,a)=>{let c=Rt(t,r);this.ensureLogsDir();let l=this.getLogFilePath(i,n),s=E.createWriteStream(l,{flags:"a"}),f=[],g=(p,u=!1)=>{let y=p.toString().split(`
49
- `);s.write(p);for(let d of y)if(d.trim()){f.push(d),f.length>Ke&&f.shift(),console.clear(),console.log(`Latest ${Ke} lines (full log at ${l}):`),console.log("-".repeat(50));for(let I of f)u?console.error(I):console.log(I)}};c.stdout.on("data",p=>g(p)),c.stderr.on("data",p=>g(p,!0)),c.on("close",p=>{s.end(),p===0?(console.log(`
50
- Operation completed. Full log available at: ${l}`),m()):a(new Error(`Process exited with code ${p}. Check log file: ${l}`))}),c.on("error",p=>{s.end(),a(p)})})}setCredentials(t,r){this.username=t,r&&(this.registry=r)}async buildImage(t,r){try{let i=this.getSystemArchitecture(),n=`${this.username}/${this.image}:${r}`,m=e.startSpinner(`Building Docker image ${this.username}/${this.image}:${r}`);P(t);let a=["build","-t",n,"-f",t];return i==="arm64"&&(console.log("Detected arm64 architecture, using --platform linux/amd64"),a.push("--platform","linux/amd64")),a.push("."),await this.spawnProcess("docker",a,"build",this.image),m.stop(!0,`Docker image ${n} built successfully`),!0}catch(i){return e.error(`Failed to build Docker image: ${i instanceof Error?i.message:String(i)}`),!1}}async pushImage(t){try{let r=e.startSpinner(`Pushing Docker image ${t} to Docker Hub`);if(!await _())throw r.stop(!1),new Error('Docker credentials not found. Please log in first with "phala docker login"');let n=t;return console.log(`Pushing image ${n} to Docker Hub...`),await this.spawnProcess("docker",["push",n],"push",t.replace(/.*\/+([\w-]+):.*$/g,"$1")),r.stop(!0,`Docker image ${n} pushed successfully`),!0}catch(r){return e.error(`Failed to push Docker image: ${r instanceof Error?r.message:String(r)}`),!1}}async login(t,r,i){try{let n=e.startSpinner(`Logging in to Docker Hub as ${t}`);if(await this.checkLogin())return n.stop(!0,"Already logged in to Docker Hub"),this.setCredentials(t,i),!0;if(!r)throw n.stop(!1),new Error("Password is required for Docker login");try{await Mt("docker",["login",...i?[i]:[],"-u",t,"--password-stdin"],{input:r,timeout:1e4})}catch(a){throw a.timedOut?(n.stop(!1),new Error("Docker login timed out. Please check your credentials and try again.")):a}return n.stop(!0,"Logged in to Docker Hub successfully"),this.setCredentials(t,i),!0}catch(n){return e.error(`Failed to login to Docker Hub: ${n instanceof Error?n.message:String(n)}`),!1}}async checkLogin(){try{let t=Oe.homedir(),r=K.join(t,".docker","config.json");if(!E.existsSync(r))return!1;let i=JSON.parse(E.readFileSync(r,"utf-8"));return!!(i?.auths&&Object.keys(i.auths).length>0)}catch(t){return e.debug(`Docker login check failed: ${t instanceof Error?t.message:String(t)}`),!1}}async buildComposeFile(t,r,i){if(!this.username)throw new Error("Docker Hub username is required for building compose file");let n=i==="eliza"?ye:ve,m=Ce.parse({template:n}),a=K.resolve(Ut);E.existsSync(a)||(e.info(`Creating directory: ${a}`),E.mkdirSync(a,{recursive:!0}));let c=[];r&&(c=E.readFileSync(r,"utf-8").split(`
51
- `).filter(u=>u&&!u.startsWith("#")).map(u=>{let y=u.indexOf("#");return y>0&&(u=u.substring(0,y).trim()),u.trim()}).filter(u=>u.includes("=")).map(u=>{let[y,d]=u.split("=",2),I=y.trim();return(d?d.trim():"")===""?null:`${I}=${I}`}).filter(Boolean));let l=t,f=Vt.compile(m.template,{noEscape:!0})({imageName:l,envVars:c.map(p=>p.replace(/=.*/,`=\${${p.split("=")[0]}}`))}),g=K.join(a,`${t.replace(/.*\/+([\w-]+):.*$/g,"$1")}-tee-compose.yaml`);return E.writeFileSync(g,f),e.success(`Backup of docker compose file created at: ${g}`),g}async runComposeLocally(t,r){try{let i=e.startSpinner(`Running Docker Compose file at ${t}`);P(t);let n=["-f",t,"up","-d"];return r&&(P(r),n.splice(2,0,"--env-file",r)),await j(`docker compose ${n.join(" ")}`),i.stop(!0,"Docker Compose file running successfully"),!0}catch(i){return e.error(`Failed to run Docker Compose file: ${i instanceof Error?i.message:String(i)}`),!1}}async runSimulator(t,r){try{e.info(`Running TEE simulator with image ${t}`),e.info("Pulling latest simulator image..."),await j(`docker pull ${t}`),e.info("Starting simulator in background...");let{stdout:i}=await j(`docker run -d --name tee-simulator --rm -p ${r}:${r} ${t}`),n=i.trim();return e.success(`TEE simulator running successfully. Container ID: ${n}`),e.break(),e.break(),e.info("Useful commands:"),e.info(`- View logs: docker logs -f ${n}`),e.info(`- Stop simulator: docker stop ${n}`),de(`http://localhost:${r}`),!0}catch(i){return e.error(`Failed to run TEE simulator: ${i instanceof Error?i.message:String(i)}`),!1}}async stopSimulator(){try{let t=e.startSpinner("Stopping TEE simulator...");return await j("docker stop tee-simulator"),await T(),t.stop(!0,"TEE simulator stopped successfully"),!0}catch(t){return e.error(`Failed to stop TEE simulator: ${t instanceof Error?t.message:String(t)}`),!1}}static async listLocalImages(){try{let{stdout:t}=await j('docker images --format "{{.Repository}}:{{.Tag}}"'),i=(await _())?.username;return t.split(`
52
- `).filter(m=>m&&!m.includes("<none>")).filter(m=>m.includes(`${i}/`)).map(m=>({imageName:m}))}catch(t){return e.error(`Failed to list local Docker images: ${t instanceof Error?t.message:String(t)}`),[]}}};import je from"prompts";var Be=new Ot().name("login").description("Login to Docker Hub").option("-u, --username <username>","Docker Hub username").option("-p, --password <password>","Docker Hub password").option("-r, --registry <registry>","Docker registry URL").action(async o=>{try{let t=o.username,r=o.password,i=o.registry;if(!t){e.info("First we need your Docker Hub username to check if you are already logged in.");let c=await je({type:"text",name:"username",message:"Enter your Docker Hub username:",validate:l=>l.length>0?!0:"Username cannot be empty"});c.username||(e.error("Username is required"),process.exit(1)),t=c.username}let n=new v("",t,i);if(await n.login(t)){e.success(`${t} is logged in to Docker Hub`),await ne({username:t,registry:i||null});return}if(!r){let c=await je({type:"password",name:"password",message:"Enter your Docker Hub password:",validate:l=>l.length>0?!0:"Password cannot be empty"});c.password||(e.error("Password is required"),process.exit(1)),r=c.password}await n.login(t,r,i)||(e.error("Failed to login to Docker Hub"),process.exit(1)),await ne({username:t,registry:i||null}),e.success("Logged in to Docker Hub successfully")}catch(t){e.error(`Failed to login to Docker Hub: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as zt}from"commander";import Ge from"node:path";import He from"inquirer";import Kt from"node:fs";var Ye=new zt().name("build").description("Build a Docker image").option("-i, --image <image>","Image name").option("-t, --tag <tag>","Image tag").option("-f, --file <file>","Path to Dockerfile","Dockerfile").action(async o=>{try{let t=await _();if(t||(e.error('Docker information not found. Please login first with "phala docker login"'),process.exit(1)),!o.image){let a=await He.prompt([{type:"input",name:"image",message:"Enter the Docker image name:",validate:c=>c.trim()?!0:"Image name is required"}]);o.image=a.image}if(!o.tag){let a=await He.prompt([{type:"input",name:"tag",message:"Enter the Docker image tag:",default:"latest",validate:c=>c.trim()?!0:"Tag is required"}]);o.tag=a.tag}let r=Ge.resolve(process.cwd(),o.file);Kt.existsSync(r)||(e.info(`Default Dockerfile not found at ${r}`),o.file=await F("Enter the path to your Dockerfile:","Dockerfile","file"));let i=Ge.resolve(process.cwd(),o.file);await new v(o.image,t.username,t.registry).buildImage(i,o.tag)||(e.error("Failed to build Docker image"),process.exit(1)),e.success(`Docker image ${t.username}/${o.image}:${o.tag} built successfully`)}catch(t){e.error(`Failed to build Docker image: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as jt}from"commander";import Bt from"inquirer";var We=new jt().name("push").description("Push a Docker image to Docker Hub").option("-i, --image <image>","Full image name (e.g. username/image:tag)").action(async o=>{try{let t=await _();t||(e.error('Docker information not found. Please login first with "phala docker login"'),process.exit(1));let r=o.image;if(!r){let m=await v.listLocalImages();if(m.length===0&&(e.error('No local Docker images found. Please build an image first with "phala docker build"'),process.exit(1)),!r){let a=Array.from(new Set(m.map(l=>l.imageName))),{selectedImage:c}=await Bt.prompt([{type:"list",name:"selectedImage",message:"Select an image to push:",choices:a}]);r=c}}await new v("",t.username,t.registry).pushImage(r)||(e.error("Failed to push Docker image"),process.exit(1)),e.success(`Docker image ${r} pushed successfully`)}catch(t){e.error(`Failed to push Docker image: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as Gt}from"commander";import B from"inquirer";import G from"node:fs";import re from"node:path";var qe=new Gt().name("generate").description("Generate a Docker Compose file").option("-i, --image <imageName>","Docker image name to use in the compose file (e.g. phala/phala-cloud)").option("-e, --env-file <envFile>","Path to environment variables file").option("-o, --output <output>","Output path for generated docker-compose.yml").option("--template <template>","Template to use for the generated docker-compose.yml").action(async o=>{try{let t=await _();(!t||!t.username)&&(e.error("Docker Hub username not found. Please login first with `phala docker login`"),process.exit(1));let r=o.image;if(!r){let c=await v.listLocalImages();if(c.length===0&&(e.error('No local Docker images found. Please build an image first with "phala docker build"'),process.exit(1)),!r){let l=Array.from(new Set(c.map(f=>f.imageName))),{selectedImage:s}=await B.prompt([{type:"list",name:"selectedImage",message:"Select an image to use in the compose file:",choices:l}]);r=s}}let i=o.envFile;if(i)try{P(i)}catch{e.error(`File not found: ${i}`),process.exit(1)}else{let c=re.join(process.cwd(),".env");if(G.existsSync(c)){let{useDefault:s}=await B.prompt([{type:"confirm",name:"useDefault",message:"Use .env file in current directory?",default:!0}]);s&&(i=c)}if(!i){let{envPath:s}=await B.prompt([{type:"input",name:"envPath",message:"Enter path to environment variables file:",validate:f=>{try{return P(f),!0}catch{return`File not found: ${f}`}}}]);i=s}}let n=o.output;if(!n&&(n=re.join(process.cwd(),"docker-compose.yml"),G.existsSync(n))){let{confirmOverwrite:c}=await B.prompt([{type:"confirm",name:"confirmOverwrite",message:`File ${n} already exists. Overwrite?`,default:!1}]);if(!c){let{customPath:l}=await B.prompt([{type:"input",name:"customPath",message:"Enter alternative output path:",default:re.join(process.cwd(),"docker-generated-compose.yml")}]);n=l}}let m=new v("",t.username,t.registry);i?e.info(`Generating Docker Compose file for ${r} using env file: ${i}`):e.info(`Generating Docker Compose file for ${r} without env file`);let a=await m.buildComposeFile(r,i,o.template);if(a!==n){let c=re.dirname(n);G.existsSync(c)||(e.info(`Creating directory: ${c}`),G.mkdirSync(c,{recursive:!0})),G.copyFileSync(a,n)}e.success(`Docker Compose file generated successfully: ${n}`)}catch(t){e.error(`Failed to generate Docker Compose file: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});var Je=new Ht().name("docker").description("Login to Docker Hub and manage Docker images").addCommand(Be).addCommand(Ye).addCommand(We).addCommand(qe);import{Command as qt}from"commander";import{Command as Yt}from"commander";var Qe=new Yt().name("start").description("Start the TEE simulator").option("-i, --image <image>","Simulator image",he).option("-p, --port <port>","Simulator port (default: 8090)","8090").option("-t, --type <type>","Simulator type (docker, native)","docker").action(async o=>{try{if(o.type==="docker")await new v("").runSimulator(o.image,o.port)||(e.error("Failed to start TEE simulator"),process.exit(1));else if(o.type==="native")if(Ne()||await Re(),await te()){e.success("TEE simulator is already running");return}else{let r=Le();e.success("TEE simulator started successfully")}else e.error("Invalid simulator type"),process.exit(1)}catch(t){e.error(`Failed to start TEE simulator: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as Wt}from"commander";var Ze=new Wt().name("stop").description("Stop the TEE simulator").option("-t, --type <type>","Simulator type (docker, native)","docker").action(async o=>{try{o.type==="docker"?await new v("").stopSimulator()||(e.error("Failed to stop TEE simulator"),process.exit(1)):o.type==="native"?await Ue()||(e.error("Failed to stop TEE simulator"),process.exit(1)):(e.error("Invalid simulator type"),process.exit(1))}catch(t){e.error(`Failed to stop TEE simulator: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});var Xe=new qt().name("simulator").description("TEE simulator commands").addCommand(Qe).addCommand(Ze);import{Command as gr}from"commander";import{Command as Jt}from"commander";import ue from"chalk";var et=new Jt().name("list").alias("ls").description("List all CVMs").option("-j, --json","Output in JSON format").action(async o=>{try{let t=e.startSpinner("Fetching CVMs"),r=await ke();if(t.stop(!0),!r||r.length===0){e.info("No CVMs found");return}if(o.json){console.log(JSON.stringify(r,null,2));return}for(let i of r)e.keyValueTable({Name:i.name,"App ID":`app_${i.hosted.app_id}`,"CVM ID":i.hosted.id.replace(/-/g,""),Region:i.node.region_identifier,Status:i.status==="running"?ue.green(i.status):i.status==="stopped"?ue.red(i.status):ue.yellow(i.status),"Node Info URL":i.hosted.app_url,"App URL":`${h}/dashboard/cvms/${i.hosted.id.replace(/-/g,"")}`}),e.break();e.success(`Found ${r.length} CVMs`),e.break(),e.info(`Go to ${h}/dashboard/ to view your CVMs`)}catch(t){e.error(`Failed to list CVMs: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as Qt}from"commander";import fe from"chalk";async function w(o){if(!o){let t=await Z();return t||void 0}return await q(o)}var tt=new Qt().name("get").description("Get details of a CVM").argument("[app-id]","App ID of the CVM (optional)").option("-j, --json","Output in JSON format").action(async(o,t)=>{try{let r=await w(o),i=e.startSpinner(`Fetching CVM with App ID app_${r}`),n=await V(r);if(i.stop(!0),e.break(),n||(e.error(`CVM with App ID app_${r} not found`),process.exit(1)),t.json){console.log(JSON.stringify(n,null,2));return}e.keyValueTable({Name:n.name,"App ID":`app_${n.app_id}`,Status:n.status==="running"?fe.green(n.status):n.status==="stopped"?fe.red(n.status):fe.yellow(n.status),vCPU:n.vcpu,Memory:`${n.memory} MB`,"Disk Size":`${n.disk_size} GB`,"Dstack Image":n.base_image,"App URL":`${h}/dashboard/cvms/app_${n.app_id}`})}catch(r){e.error(`Failed to get CVM details: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}});import{Command as Zt}from"commander";var rt=new Zt().name("start").description("Start a stopped CVM").argument("[app-id]","App ID of the CVM (if not provided, a selection prompt will appear)").action(async o=>{try{let t=await w(o),r=e.startSpinner(`Starting CVM with App ID app_${t}`),i=await we(t);r.stop(!0),e.break();let n={"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`};e.keyValueTable(n,{borderStyle:"rounded"}),e.break(),e.success(`Your CVM is being started. You can check the dashboard for more details:
53
- ${h}/dashboard/cvms/app_${i.app_id}`)}catch(t){e.error(`Failed to start CVM: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as Xt}from"commander";var ot=new Xt().name("stop").description("Stop a running CVM").argument("[app-id]","App ID of the CVM (if not provided, a selection prompt will appear)").action(async o=>{try{let t=await w(o),r=e.startSpinner(`Stopping CVM with App ID app_${t}`),i=await be(t);r.stop(!0),e.break();let n={"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`};e.keyValueTable(n,{borderStyle:"rounded"}),e.break(),e.success(`Your CVM is being stopped. You can check the dashboard for more details:
54
- ${h}/dashboard/cvms/app_${i.app_id}`)}catch(t){e.error(`Failed to stop CVM: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as er}from"commander";var it=new er().name("restart").description("Restart a CVM").argument("[app-id]","App ID of the CVM (if not provided, a selection prompt will appear)").action(async o=>{try{let t=await w(o),r=e.startSpinner(`Restarting CVM with App ID app_${t}`),i=await Se(t);r.stop(!0),e.break();let n={"CVM ID":i.id,Name:i.name,Status:i.status,"App ID":`app_${i.app_id}`,"App URL":i.app_url?i.app_url:`${h}/dashboard/cvms/app_${i.app_id}`};e.keyValueTable(n,{borderStyle:"rounded"}),e.break(),e.success(`Your CVM is being restarted. You can check the dashboard for more details:
55
- ${h}/dashboard/cvms/app_${i.app_id}`)}catch(t){e.error(`Failed to restart CVM: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as tr}from"commander";import oe from"chalk";var nt=new tr().name("attestation").description("Get attestation information for a CVM").argument("[app-id]","CVM app ID (will prompt for selection if not provided)").option("-j, --json","Output in JSON format").action(async(o,t)=>{try{let r;if(o)r=await q(o);else{e.info("No CVM specified, fetching available CVMs...");let n=await Z();if(!n)return;r=n}let i=e.startSpinner(`Fetching attestation information for CVM app_${r}...`);try{let n=await $e(r);if(i.stop(!0),!n||Object.keys(n).length===0){e.info("No attestation information found");return}if(t?.json){e.info(JSON.stringify(n,null,2));return}e.success("Attestation Summary:");let m={Status:n.is_online?oe.green("Online"):oe.red("Offline"),"Public Access":n.is_public?oe.green("Enabled"):oe.yellow("Disabled"),Error:n.error||"None",Certificates:`${n.app_certificates?.length||0} found`};if(e.keyValueTable(m,{borderStyle:"rounded"}),n.app_certificates&&n.app_certificates.length>0&&n.app_certificates.forEach((a,c)=>{e.break(),e.success(`Certificate #${c+1} (${a.position_in_chain===0?"End Entity":"CA"}):`);let l={Subject:`${a.subject.common_name||"Unknown"}${a.subject.organization?` (${a.subject.organization})`:""}`,Issuer:`${a.issuer.common_name||"Unknown"}${a.issuer.organization?` (${a.issuer.organization})`:""}`,"Serial Number":a.serial_number,Validity:`${new Date(a.not_before).toLocaleString()} to ${new Date(a.not_after).toLocaleString()}`,Fingerprint:a.fingerprint,"Signature Algorithm":a.signature_algorithm,"Is CA":a.is_ca?"Yes":"No","Position in Chain":a.position_in_chain};e.keyValueTable(l,{borderStyle:"rounded"})}),n.tcb_info){e.break(),e.success("Trusted Computing Base (TCB) Information:");let a={Mrtd:n.tcb_info.mrtd,"Rootfs Hash":n.tcb_info.rootfs_hash,Rtmr0:n.tcb_info.rtmr0,Rtmr1:n.tcb_info.rtmr1,Rtmr2:n.tcb_info.rtmr2,Rtmr3:n.tcb_info.rtmr3,"Event Log Entries":`${n.tcb_info.event_log.length} entries`};if(e.keyValueTable(a,{borderStyle:"rounded"}),n.tcb_info.event_log&&n.tcb_info.event_log.length>0){e.break(),e.success("Event Log (Showing entries to reproduce RTMR3):");let c=5,l=n.tcb_info.event_log.filter(s=>s.event!==null&&s.event!=="").map(s=>({Event:s.event,IMR:s.imr.toString(),"Event Type":s.event_type.toString(),Payload:s.event_payload}));e.table(l,[{key:"Event",header:"Event",minWidth:8},{key:"IMR",header:"IMR",minWidth:3},{key:"Event Type",header:"Type",minWidth:8},{key:"Payload",header:"Payload",minWidth:25}]),n.tcb_info.event_log.length>c&&e.info("To see all full attestation data, use --json"),e.break(),e.success("To reproduce RTMR3, use the tool at https://rtmr3-calculator.vercel.app/")}}}catch(n){throw i.stop(!1),n}}catch(r){e.error(`Failed to get attestation information: ${r instanceof Error?r.message:String(r)}`)}});import{Command as rr}from"commander";import{encryptEnvVars as or}from"@phala/dstack-sdk/encrypt-env-vars";import st from"node:fs";import ir from"node:path";import mt from"inquirer";import*as at from"node:fs";var M=(o,t)=>{let r={};if(o){for(let i of o)if(i.includes("=")){let[n,...m]=i.split("="),a=m.join("=");n&&(r[n]=a)}}if(t){let i=at.readFileSync(t,"utf8");for(let n of i.split(`
56
- `)){if(!n.trim()||n.trim().startsWith("#"))continue;let m=-1,a=!1,c="";for(let d=0;d<n.length;d++)if((n[d]==='"'||n[d]==="'"||n[d]==="`")&&(d===0||n[d-1]!=="\\"))a&&n[d]===c?(a=!1,c=""):a||(a=!0,c=n[d]);else if(n[d]==="="&&!a){m=d;break}else if(n[d]==="#"&&!a)break;if(m===-1){n.trim().startsWith("#");continue}let l=n.substring(0,m).trim(),s=n.substring(m+1),f=!1,g="",p=-1;for(let d=0;d<s.length;d++)if((s[d]==='"'||s[d]==="'"||s[d]==="`")&&(d===0||s[d-1]!=="\\"))f&&s[d]===g?(f=!1,g=""):f||(f=!0,g=s[d]);else if(s[d]==="#"&&!f&&d>0&&s[d-1]===" "){p=d-1;break}else if(s[d]==="#"&&!f&&d===0){p=d;break}p!==-1&&(s=s.substring(0,p)),s===void 0&&(s="");let u=s.charAt(0),y=s.charAt(s.length-1);u==='"'&&y==='"'||u==="'"&&y==="'"||u==="`"&&y==="`"?(s=s.substring(1,s.length-1),u==='"'&&(s=s.replace(/\\\\n/g,`
57
- `))):s=s.trim(),l&&(r[l]=s)}}return Object.entries(r).map(([i,n])=>({key:i,value:n}))};var ct=new rr().name("create").description("Create a new CVM").option("-n, --name <name>","Name of the CVM").option("-c, --compose <compose>","Path to Docker Compose file").option("--vcpu <vcpu>",`Number of vCPUs, default is ${ae}`).option("--memory <memory>",`Memory in MB, default is ${se}`).option("--disk-size <diskSize>",`Disk size in GB, default is ${me}`).option("--teepod-id <teepodId>","TEEPod ID to use. If not provided, it will be selected from the list of available TEEPods.").option("--image <image>","Version of dstack image to use. If not provided, it will be selected from the list of available images for the selected TEEPod.").option("-e, --env-file <envFile>","Path to environment file").option("--skip-env","Skip environment variable prompt",!1).option("--debug","Enable debug mode",!1).action(async o=>{try{if(!o.name){let{name:k}=await mt.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",validate:$=>$.trim()?$.trim().length>20?"CVM name must be less than 20 characters":$.trim().length<3?"CVM name must be at least 3 characters":/^[a-zA-Z0-9_-]+$/.test($)?!0:"CVM name must contain only letters, numbers, underscores, and hyphens":"CVM name is required"}]);o.name=k}if(!o.compose){let $=ee(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");o.compose=await F("Enter the path to your Docker Compose file:",$,"file")}let t=ir.resolve(o.compose);st.existsSync(t)||(e.error(`Docker Compose file not found: ${t}`),process.exit(1));let r=st.readFileSync(t,"utf8");await T(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?e.info("\u{1F510} Using private DockerHub registry credentials..."):process.env.DSTACK_AWS_ACCESS_KEY_ID&&process.env.DSTACK_AWS_SECRET_ACCESS_KEY&&process.env.DSTACK_AWS_REGION&&process.env.DSTACK_AWS_ECR_REGISTRY?e.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):e.info("\u{1F510} Using public DockerHub registry...");let i=[];if(o.envFile)try{i=M([],o.envFile)}catch(k){e.error(`Failed to read environment file: ${k instanceof Error?k.message:String(k)}`),process.exit(1)}else if(!o.skipEnv){let{shouldSkip:k}=await mt.prompt([{type:"confirm",name:"shouldSkip",message:"Do you want to skip environment variable prompt?",default:!0}]);if(k)e.info("Skipping environment variable prompt");else{let $=await F("Enter the path to your environment file:",".env","file");i=M([],$)}}let n=Number(o.vcpu)||ae,m=Number(o.memory)||se,a=Number(o.diskSize)||me;(Number.isNaN(n)||n<=0)&&(e.error(`Invalid number of vCPUs: ${n}`),process.exit(1)),(Number.isNaN(m)||m<=0)&&(e.error(`Invalid memory: ${m}`),process.exit(1)),(Number.isNaN(a)||a<=0)&&(e.error(`Invalid disk size: ${a}`),process.exit(1));let c=e.startSpinner("Fetching available TEEPods"),l=await N();c.stop(!0),l.nodes.length===0&&(e.error("No TEEPods available. Please try again later."),process.exit(1));let s;o.teepodId?(s=l.nodes.find(k=>k.teepod_id===Number(o.teepodId)),s||(e.error("Failed to find selected TEEPod"),process.exit(1))):(s=l.nodes[0],s||(e.error("Failed to find default TEEPod"),process.exit(1)));let f;o.image?(f=s.images?.find(k=>k.name===o.image),f||(e.error(`Failed to find selected image: ${o.image}`),process.exit(1))):(f=s.images?.find(k=>k.name===O),f||(e.error(`Failed to find default image ${O}`),process.exit(1)));let g={teepod_id:s.teepod_id,name:o.name,image:f.name,vcpu:n,memory:m,disk_size:a,compose_manifest:{docker_compose_file:r,docker_config:{url:"",username:"",password:""},features:["kms","tproxy-net"],kms_enabled:!0,manifest_version:2,name:o.name,public_logs:!0,public_sysinfo:!0,tproxy_enabled:!0},listed:!1},p=e.startSpinner("Getting public key from CVM"),u=await J(g);p.stop(!0),u||(e.error("Failed to get public key from CVM"),process.exit(1));let y=e.startSpinner("Encrypting environment variables"),d=await or(i,u.app_env_encrypt_pubkey);y.stop(!0),o.debug&&(e.debug("Public key:",u.app_env_encrypt_pubkey),e.debug("Encrypted environment variables:",d),e.debug("Environment variables:",JSON.stringify(i)));let I=e.startSpinner("Creating CVM"),S=await Q({...g,encrypted_env:d,app_env_encrypt_pubkey:u.app_env_encrypt_pubkey,app_id_salt:u.app_id_salt});I.stop(!0),S||(e.error("Failed to create CVM"),process.exit(1)),e.success("CVM created successfully"),e.break();let Et={"CVM ID":S.id,Name:S.name,Status:S.status,"App ID":`app_${S.app_id}`,"App URL":S.app_url?S.app_url:`${h}/dashboard/cvms/app_${S.app_id}`};e.keyValueTable(Et,{borderStyle:"rounded"}),e.info(""),e.success(`Your CVM is being created. You can check its status with:
58
- phala cvms get app_${S.app_id}`)}catch(t){e.error(`Failed to create CVM: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as nr}from"commander";import ar from"inquirer";var pt=new nr().name("delete").description("Delete a CVM").argument("[app-id]","App ID of the CVM to delete (if not provided, a selection prompt will appear)").option("-f, --force","Skip confirmation prompt",!1).action(async(o,t)=>{try{let r=await w(o);if(!t.force){let{confirm:m}=await ar.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete CVM with App ID app_${r}? This action cannot be undone.`,default:!1}]);if(!m){e.info("Deletion cancelled");return}}let i=e.startSpinner(`Deleting CVM app_${r}`),n=await Ee(r);i.stop(!0),n||(e.error(`Failed to delete CVM app_${r}`),process.exit(1)),e.success(`CVM app_${r} deleted successfully`)}catch(r){e.error(`Failed to delete CVM: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}});import{Command as sr}from"commander";import mr from"node:fs";import{encryptEnvVars as cr}from"@phala/dstack-sdk/encrypt-env-vars";var lt=new sr().name("upgrade").description("Upgrade a CVM to a new version").argument("[app-id]","CVM app ID to upgrade (will prompt for selection if not provided)").option("-c, --compose <compose>","Path to new Docker Compose file").option("-e, --env-file <envFile>","Path to environment file").option("--debug","Enable debug mode",!1).action(async(o,t)=>{try{let r=await w(o),i=e.startSpinner(`Fetching current configuration for CVM app_${r}`),n=await V(r);if(i.stop(!0),n||(e.error(`CVM with App ID app_${r} not found`),process.exit(1)),!t.compose){let g=ee(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");t.compose=await F("Enter the path to your Docker Compose file:",g,"file")}let m="";if(t.compose)try{m=mr.readFileSync(t.compose,"utf8")}catch(f){e.error(`Failed to read Docker Compose file: ${f instanceof Error?f.message:String(f)}`),process.exit(1)}await T(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?e.info("\u{1F510} Using private DockerHub registry credentials..."):process.env.DSTACK_AWS_ACCESS_KEY_ID&&process.env.DSTACK_AWS_SECRET_ACCESS_KEY&&process.env.DSTACK_AWS_REGION&&process.env.DSTACK_AWS_ECR_REGISTRY?e.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):e.info("\u{1F510} Using public DockerHub registry...");let a="";if(t.envFile){let f=[];if(t.envFile)try{f=M([],t.envFile),a=await cr(f,n.encrypted_env_pubkey)}catch(g){e.error(`Failed to read environment file: ${g instanceof Error?g.message:String(g)}`),process.exit(1)}}let c={compose_manifest:{docker_compose_file:m,manifest_version:1,runner:"docker-compose",version:"1.0.0",features:["kms","tproxy-net"],name:`app_${r}`},encrypted_env:a,allow_restart:!0},l=e.startSpinner(`Upgrading CVM app_${r}`),s=await _e(r,c);s||(l.stop(!1),e.error("Failed to upgrade CVM"),process.exit(1)),l.stop(!0),s.detail&&e.info(`Details: ${s.detail}`),e.break(),e.success(`Your CVM is being upgraded. You can check the dashboard for more details:
59
- ${h}/dashboard/cvms/app_${r}`)}catch(r){e.error(`Failed to upgrade CVM: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}});import{Command as pr}from"commander";import H from"inquirer";import x from"chalk";var dt=new pr().name("resize").description("Resize resources for a CVM").argument("[app-id]","App ID of the CVM (if not provided, a selection prompt will appear)").option("-v, --vcpu <vcpu>","Number of virtual CPUs").option("-m, --memory <memory>","Memory size in MB").option("-d, --disk-size <diskSize>","Disk size in GB").option("-r, --allow-restart <allowRestart>","Allow restart of the CVM if needed for resizing").option("-y, --yes","Automatically confirm the resize operation").action(async(o,t)=>{try{let r=await w(o),i=await V(r),n=t.vcpu,m=t.memory,a=t.diskSize,c=t.allowRestart;n||(n=(await H.prompt([{type:"input",name:"vcpu",message:"Enter number of vCPUs:",validate:p=>{let u=parseInt(p);return isNaN(u)||u<0?"Please enter a valid non-negative number":!0},default:i.vcpu,filter:p=>parseInt(p)}])).vcpu),m||(m=(await H.prompt([{type:"input",name:"memory",message:"Enter memory in MB:",validate:p=>{let u=parseInt(p);return isNaN(u)||u<0?"Please enter a valid non-negative number":!0},default:i.memory,filter:p=>parseInt(p)}])).memory),a||(a=(await H.prompt([{type:"input",name:"diskSize",message:"Enter disk size in GB:",validate:p=>{let u=parseInt(p);return isNaN(u)||u<0?"Please enter a valid non-negative number":!0},default:i.disk_size,filter:p=>parseInt(p)}])).diskSize),c||(c=(await H.prompt([{type:"confirm",name:"allowRestart",message:"Allow restart of the CVM if needed for resizing?",default:!1}])).allowRestart);let l=`Are you sure you want to resize CVM app_${r} with the following changes:
60
- `;if(e.keyValueTable({vCPUs:i.vcpu!==n?`${x.red(i.vcpu)} -> ${x.green(n)}`:i.vcpu,Memory:i.memory!==m?`${x.red(i.memory)} MB -> ${x.green(m)} MB`:i.memory,"Disk Size":i.disk_size!==a?`${x.red(i.disk_size)} GB -> ${x.green(a)} GB`:i.disk_size,"Allow Restart":c?x.green("Yes"):x.red("No")}),!t.yes){let{confirm:g}=await H.prompt([{type:"confirm",name:"confirm",message:l,default:!1}]);if(!g){e.info("Resize operation cancelled");return}}let s=e.startSpinner(`Resizing CVM with App ID app_${r}`);await Ie(r,n,m,a,c?1:0),s.stop(!0),e.break(),e.success(`Your CVM is being resized. You can check the dashboard for more details:
61
- ${h}/dashboard/cvms/app_${r}`)}catch(r){e.error(`Failed to resize CVM: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}});import{Command as lr}from"commander";var ut=new lr().name("list-nodes").description("List all available worker nodes.").action(async()=>{try{let{nodes:o,kms_list:t}=await N();if(o.length===0){e.info("No available nodes found.");return}e.info("Available Nodes:"),o.forEach(r=>{e.info("----------------------------------------"),e.info(` ID: ${r.teepod_id}`),e.info(` Name: ${r.name}`),e.info(` Region: ${r.region_identifier}`),e.info(` FMSPC: ${r.fmspc||"N/A"}`),e.info(` Device ID: ${r.device_id||"N/A"}`),e.info(` Support Onchain KMS: ${r.support_onchain_kms}`),e.info(" Images:"),r.images&&r.images.length>0?r.images.forEach(i=>{e.info(` - ${i.name}`),e.info(` Hash: ${i.os_image_hash||"N/A"}`)}):e.info(" N/A")}),t&&t.length>0&&(e.info(`
62
- Available KMS Instances:`),t.forEach(r=>{e.info("----------------------------------------"),e.info(` ID: ${r.id}`),e.info(` URL: ${r.url}`),e.info(` Version: ${r.version}`),e.info(` Chain ID: ${r.chain_id}`),e.info(` Contract Address: ${r.kms_contract_address}`),e.info(` Gateway App ID: ${r.gateway_app_id}`)}))}catch(o){e.error(`Failed to list available nodes: ${o instanceof Error?o.message:String(o)}`)}});import{Command as dr}from"commander";import{encryptEnvVars as ur}from"@phala/dstack-sdk/encrypt-env-vars";import ft from"node:fs";import fr from"node:path";var gt=new dr().name("replicate").description("Create a replica of an existing CVM").argument("<cvm-id>","UUID of the CVM to replicate").option("--teepod-id <teepodId>","TEEPod ID to use for the replica").option("-e, --env-file <envFile>","Path to environment file").action(async(o,t)=>{try{let r;if(o=o.replace(/-/g,""),t.envFile){let a=fr.resolve(process.cwd(),t.envFile);if(!ft.existsSync(a))throw new Error(`Environment file not found: ${a}`);let l=ft.readFileSync(a,"utf-8").split(`
63
- `).filter(g=>g.trim()!==""&&!g.trim().startsWith("#")).map(g=>{let[p,...u]=g.split("=");return{key:p.trim(),value:u.join("=").trim()}}),s=await De(o);e.info("Encrypting environment variables..."),r=await ur(l,s.env_pubkey)}let i={};t.teepodId&&(i.teepod_id=parseInt(t.teepodId,10)),r&&(i.encrypted_env=r);let n=await xe(o,i);e.success(`Successfully created replica of CVM UUID: ${o} with App ID: ${n.app_id}`);let m={"CVM UUID":n.vm_uuid.replace(/-/g,""),"App ID":n.app_id,Name:n.name,Status:n.status,TEEPod:`${n.teepod.name} (ID: ${n.teepod_id})`,vCPUs:n.vcpu,Memory:`${n.memory} MB`,"Disk Size":`${n.disk_size} GB`,"App URL":n.app_url||`${process.env.CLOUD_URL||"https://cloud.phala.network"}/dashboard/cvms/${n.vm_uuid.replace(/-/g,"")}`};e.keyValueTable(m,{borderStyle:"rounded"}),e.success(`Your CVM replica is being created. You can check its status with:
64
- phala cvms get ${n.app_id}`)}catch(r){e.error("Failed to create CVM replica:",r instanceof Error?r.message:r),process.exit(1)}});var ht=new gr().name("cvms").description("Manage Phala Confidential Virtual Machines (CVMs)").addCommand(nt).addCommand(ct).addCommand(pt).addCommand(tt).addCommand(et).addCommand(rt).addCommand(ot).addCommand(dt).addCommand(it).addCommand(lt).addCommand(ut).addCommand(gt);import{Command as hr}from"commander";import{execSync as Y}from"node:child_process";import*as vt from"node:os";function yr(o){let t=vt.platform();try{switch(t){case"darwin":Y(`open "${o}"`);break;case"win32":Y(`start "" "${o}"`);break;case"linux":try{Y(`xdg-open "${o}"`)}catch{try{Y(`gnome-open "${o}"`)}catch{Y(`kde-open "${o}"`)}}break;default:throw new Error(`Unsupported platform: ${t}`)}e.success(`Opened URL in your default browser: ${o}`)}catch(r){e.error(`Failed to open URL: ${r instanceof Error?r.message:String(r)}`),e.info(`Please manually open this URL in your browser: ${o}`)}}function yt(o){return new Promise(t=>setTimeout(t,o))}var Ct=new hr().name("join").alias("free").description("Join Phala Cloud! Get an account and deploy a CVM for FREE").action(async()=>{try{let o="https://cloud.phala.network/register?invite=beta",t=e.startSpinner("Brewing a fresh cup of TEE \u{1F375}");await yt(2e3),t.stop(!0),e.break(),e.break(),console.log(X),e.info("TEE is served! Opening Phala Cloud registration page..."),await yt(1e3),e.break(),yr(o)}catch(o){e.error(`Error: ${o instanceof Error?o.message:String(o)}`),process.exit(1)}});import{Command as kr}from"commander";var vr=`version: '3'
46
+ `),Xu=Ai.cyan("PHALA TEE CLOUD CLI");import{Command as Zm}from"commander";import{Command as Km}from"commander";import Wm from"prompts";var Ii=new Km().name("login").description("Set the API key for authentication").argument("[api-key]","Phala Cloud API key to set").action(async e=>{try{let t;if(!e)e=(await Wm({type:"password",name:"apiKey",message:"Enter your API key:",validate:async o=>{if(o.length===0)return"API key cannot be empty";try{if(await xn(o),t=await tt(),!t.username)return await Jt(),"Invalid API key"}catch{return"Invalid API key"}return!0}})).apiKey;else if(await xn(e),t=await tt(),!t.username)return await Jt(),"Invalid API key";a.success(`Welcome ${t.username}! API key validated and saved successfully`),a.break(),a.info(`Open in Web UI at ${_}/dashboard/`)}catch(t){a.error(`Failed to set API key: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as Jm}from"commander";var Ti=new Jm().name("logout").description("Remove the stored API key").action(async()=>{try{await Jt(),a.success("API key removed successfully")}catch(e){a.error(`Failed to remove API key: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}});import{Command as Ym}from"commander";var Pi=new Ym().name("status").description("Check authentication status").option("-j, --json","Output in JSON format").option("-d, --debug","Enable debug output").action(async e=>{try{e.debug&&(process.env.DEBUG="true");let t=await Er();if(!t){a.warn('Not authenticated. Please set an API key with "phala auth login"');return}a.debug(`Using API key: ${t.substring(0,5)}...`);let r=a.startSpinner("Checking authentication status");try{let o=await tt();if(r.stop(!0),e.json){console.log(JSON.stringify(o,null,2));return}a.break(),a.success(`Authenticated as ${o.username}`);let n={Username:o.username,Email:o.email,Role:o.role,Team:`${o.team_name} (${o.team_tier})`,Credits:`$${(o.credits+o.granted_credits).toFixed(2)}`};o.trial_ended_at&&(n["Trial Ended At"]=o.trial_ended_at),a.keyValueTable(n,{borderStyle:"rounded"})}catch(o){r.stop(!1),a.error("Authentication failed. Your API key may be invalid or expired."),a.info('Please set a new API key with "phala auth login"'),e.debug&&a.debug(`Error details: ${o instanceof Error?o.message:String(o)}`)}}catch(t){a.error(`Failed to check authentication status: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});var _i=new Zm().name("auth").description("Authenticate with Phala Cloud").addCommand(Ii).addCommand(Ti).addCommand(Pi);import{Command as lp}from"commander";import{Command as ap}from"commander";import{execa as tp}from"execa";import Fe from"node:fs";import rr from"node:path";import rp from"handlebars";import{exec as op,spawn as np}from"node:child_process";import{promisify as sp}from"node:util";import Ni from"node:os";import Qm from"inquirer";import On from"node:fs";import Gn from"node:path";function it(e,t=process.cwd()){let r=Gn.resolve(t,e);if(!On.existsSync(r))throw new Error(`File not found at ${r}`);return!0}async function R(e,t,r="file",o=process.cwd()){return(await Qm.prompt([{type:"input",name:r,message:e,default:t,validate:s=>{let i=Gn.resolve(o,s);return On.existsSync(i)?!0:`File not found at ${i}`}}]))[r]}function we(e,t){for(let r of e){let o=Gn.join(process.cwd(),r);if(On.existsSync(o))return t?a.info(t.replace("{path}",o)):a.info(`File detected: ${o}`),r}}import*as oe from"node:fs";import*as Oe from"node:path";import*as At from"node:os";import{execSync as St,spawn as Xm}from"node:child_process";import*as qn from"node:net";var ee={version:"0.1.4",baseUrl:"https://github.com/Leechael/tappd-simulator/releases/download/v0.1.4",installDir:Oe.join(At.homedir(),".phala-cloud","tappd-simulator"),defaultLogPath:Oe.join(At.homedir(),".phala-cloud","logs","tappd-simulator.log"),platforms:{darwin:{filename:"tappd-simulator-0.1.4-aarch64-apple-darwin.tgz",extractedFolder:"tappd-simulator-0.1.4-aarch64-apple-darwin",socketArg:"unix:/tmp/tappd.sock"},linux:{filename:"tappd-simulator-0.1.4-x86_64-linux-musl.tgz",extractedFolder:"tappd-simulator-0.1.4-x86_64-linux-musl",socketArg:"unix:/tmp/tappd.sock"},win32:{filename:"tappd-simulator-0.1.4-x86_64-pc-windows-msvc.tgz",extractedFolder:"tappd-simulator-0.1.4-x86_64-pc-windows-msvc",socketArg:"127.0.0.1:8090"}}};function Bi(){try{if(!oe.existsSync(ee.installDir))return!1;let e=At.platform();if(!ee.platforms[e])throw new Error(`Unsupported platform: ${e}`);let t=Oe.join(ee.installDir,ee.platforms[e].extractedFolder);if(!oe.existsSync(t))return!1;let o=Oe.join(t,e==="win32"?"tappd-simulator.exe":"tappd-simulator");return oe.existsSync(o)}catch(e){return a.error("Error checking if simulator is installed:",e),!1}}function tr(){let e=At.platform();if(!ee.platforms[e])throw new Error(`Unsupported platform: ${e}. Only darwin, linux, and win32 are supported.`);return e}async function Fi(e){let t=r=>{a.info(r),e&&e(r)};try{let r=tr(),o=ee.platforms[r];oe.existsSync(ee.installDir)||(a.info(`Creating installation directory at ${ee.installDir}`),oe.mkdirSync(ee.installDir,{recursive:!0})),process.chdir(ee.installDir);let n=`${ee.baseUrl}/${o.filename}`;a.info(`Downloading simulator from ${n}`),St(`wget ${n}`,{stdio:"inherit"}),a.info(`Extracting ${o.filename}`),St(`tar -xvf ${o.filename}`,{stdio:"inherit"}),a.success("Simulator installation completed successfully")}catch(r){throw a.error("Error installing simulator:",r),new Error(`Failed to install simulator: ${r}`)}}async function Di(e={}){try{let t=tr(),r=ee.platforms[t],o=Oe.join(ee.installDir,r.extractedFolder);process.chdir(o);let n=t==="win32"?"tappd-simulator.exe":"./tappd-simulator",s={background:e.background??!0,logToFile:e.logToFile??!0,logFilePath:e.logFilePath??ee.defaultLogPath};if(s.logToFile){let m=Oe.dirname(s.logFilePath);oe.existsSync(m)||oe.mkdirSync(m,{recursive:!0}),a.info(`Simulator logs will be written to: ${s.logFilePath}`)}a.info(`Starting simulator with: ${n} -l ${r.socketArg}`);let i="inherit",c=null;s.logToFile&&(c=oe.createWriteStream(s.logFilePath,{flags:"a"}),i=["ignore",c,c]);let p=Xm(n,["-l",r.socketArg],{stdio:i,shell:t==="win32",detached:s.background});if(c){let m=new Date().toISOString();c.write(`
47
+ [${m}] Simulator started
48
+ `)}return s.background&&(p.unref(),a.success("Simulator is running in the background")),await jn(),p}catch(t){throw a.error("Error running simulator:",t),new Error(`Failed to run simulator: ${t}`)}}async function Jr(){try{let e=tr(),t=ee.platforms[e];if(e==="darwin"||e==="linux"){let r="/tmp/tappd.sock";return oe.existsSync(r)?new Promise(o=>{let n=qn.createConnection({path:r}).on("connect",()=>{n.end(),o(!0)}).on("error",()=>{o(!1)});setTimeout(()=>{n.end(),o(!1)},1e3)}):!1}if(e==="win32"){let r="127.0.0.1";return new Promise(n=>{let s=qn.createConnection({host:r,port:8090}).on("connect",()=>{s.end(),n(!0)}).on("error",()=>{n(!1)});setTimeout(()=>{s.end(),n(!1)},1e3)})}return!1}catch(e){return a.error("Error checking if simulator is running:",e),!1}}async function $i(){try{let e=tr();if(!await Jr())return a.info("Simulator is not running"),!0;a.info("Stopping simulator..."),e==="win32"?St(`for /f "tokens=5" %a in ('netstat -ano ^| findstr :8080') do taskkill /F /PID %a`,{stdio:"inherit"}):St("pkill -f tappd-simulator",{stdio:"inherit"});let t=!await Jr();return t?a.success("Simulator stopped successfully"):a.error("Failed to stop simulator"),await at(),t}catch(e){return a.error("Error stopping simulator:",e),!1}}function ep(){return tr()==="win32"?"http://127.0.0.1:8090":"unix:///tmp/tappd.sock"}async function jn(e){try{let t=ep(),r=e||t;return await St(`export DSTACK_SIMULATOR_ENDPOINT=${r}`),a.success(`Setting DSTACK_SIMULATOR_ENDPOINT=${r} for current process`),e}catch(t){throw a.error("Error setting simulator endpoint environment variable:",t),new Error(`Failed to set simulator endpoint: ${t}`)}}async function at(){return await St("unset DSTACK_SIMULATOR_ENDPOINT"),a.debug("Deleted DSTACK_SIMULATOR_ENDPOINT from current process"),!0}var or=sp(op),Mi=".phala-cloud/logs",ip=".phala-cloud/compose",Ri=10,Y=class{username;image;registry;constructor(t,r,o){this.image=t,this.username=r||"",this.registry=o||""}ensureLogsDir(){let t=rr.resolve(Mi);Fe.existsSync(t)||Fe.mkdirSync(t,{recursive:!0})}getLogFilePath(t,r){let o=new Date().toISOString().replace(/[:.]/g,"-");return rr.resolve(Mi,`${r||this.image}-${t}-${o}.log`)}getSystemArchitecture(){let t=Ni.arch();switch(t){case"arm":case"arm64":return"arm64";case"x64":return"amd64";default:return t}}spawnProcess(t,r,o,n){return new Promise((s,i)=>{let c=np(t,r);this.ensureLogsDir();let p=this.getLogFilePath(o,n),m=Fe.createWriteStream(p,{flags:"a"}),l=[],f=(u,d=!1)=>{let y=u.toString().split(`
49
+ `);m.write(u);for(let h of y)if(h.trim()){l.push(h),l.length>Ri&&l.shift(),console.clear(),console.log(`Latest ${Ri} lines (full log at ${p}):`),console.log("-".repeat(50));for(let g of l)d?console.error(g):console.log(g)}};c.stdout.on("data",u=>f(u)),c.stderr.on("data",u=>f(u,!0)),c.on("close",u=>{m.end(),u===0?(console.log(`
50
+ Operation completed. Full log available at: ${p}`),s()):i(new Error(`Process exited with code ${u}. Check log file: ${p}`))}),c.on("error",u=>{m.end(),i(u)})})}setCredentials(t,r){this.username=t,r&&(this.registry=r)}async buildImage(t,r){try{let o=this.getSystemArchitecture(),n=`${this.username}/${this.image}:${r}`,s=a.startSpinner(`Building Docker image ${this.username}/${this.image}:${r}`);it(t);let i=["build","-t",n,"-f",t];return o==="arm64"&&(console.log("Detected arm64 architecture, using --platform linux/amd64"),i.push("--platform","linux/amd64")),i.push("."),await this.spawnProcess("docker",i,"build",this.image),s.stop(!0,`Docker image ${n} built successfully`),!0}catch(o){return a.error(`Failed to build Docker image: ${o instanceof Error?o.message:String(o)}`),!1}}async pushImage(t){try{let r=a.startSpinner(`Pushing Docker image ${t} to Docker Hub`);if(!await Te())throw r.stop(!1),new Error('Docker credentials not found. Please log in first with "phala docker login"');let n=t;return console.log(`Pushing image ${n} to Docker Hub...`),await this.spawnProcess("docker",["push",n],"push",t.replace(/.*\/+([\w-]+):.*$/g,"$1")),r.stop(!0,`Docker image ${n} pushed successfully`),!0}catch(r){return a.error(`Failed to push Docker image: ${r instanceof Error?r.message:String(r)}`),!1}}async login(t,r,o){try{let n=a.startSpinner(`Logging in to Docker Hub as ${t}`);if(await this.checkLogin())return n.stop(!0,"Already logged in to Docker Hub"),this.setCredentials(t,o),!0;if(!r)throw n.stop(!1),new Error("Password is required for Docker login");try{await tp("docker",["login",...o?[o]:[],"-u",t,"--password-stdin"],{input:r,timeout:1e4})}catch(i){throw i.timedOut?(n.stop(!1),new Error("Docker login timed out. Please check your credentials and try again.")):i}return n.stop(!0,"Logged in to Docker Hub successfully"),this.setCredentials(t,o),!0}catch(n){return a.error(`Failed to login to Docker Hub: ${n instanceof Error?n.message:String(n)}`),!1}}async checkLogin(){try{let t=Ni.homedir(),r=rr.join(t,".docker","config.json");if(!Fe.existsSync(r))return!1;let o=JSON.parse(Fe.readFileSync(r,"utf-8"));return!!(o?.auths&&Object.keys(o.auths).length>0)}catch(t){return a.debug(`Docker login check failed: ${t instanceof Error?t.message:String(t)}`),!1}}async buildComposeFile(t,r,o){if(!this.username)throw new Error("Docker Hub username is required for building compose file");let n=o==="eliza"?Ps:_s,s=Bs.parse({template:n}),i=rr.resolve(ip);Fe.existsSync(i)||(a.info(`Creating directory: ${i}`),Fe.mkdirSync(i,{recursive:!0}));let c=[];r&&(c=Fe.readFileSync(r,"utf-8").split(`
51
+ `).filter(d=>d&&!d.startsWith("#")).map(d=>{let y=d.indexOf("#");return y>0&&(d=d.substring(0,y).trim()),d.trim()}).filter(d=>d.includes("=")).map(d=>{let[y,h]=d.split("=",2),g=y.trim();return(h?h.trim():"")===""?null:`${g}=${g}`}).filter(Boolean));let p=t,l=rp.compile(s.template,{noEscape:!0})({imageName:p,envVars:c.map(u=>u.replace(/=.*/,`=\${${u.split("=")[0]}}`))}),f=rr.join(i,`${t.replace(/.*\/+([\w-]+):.*$/g,"$1")}-tee-compose.yaml`);return Fe.writeFileSync(f,l),a.success(`Backup of docker compose file created at: ${f}`),f}async runComposeLocally(t,r){try{let o=a.startSpinner(`Running Docker Compose file at ${t}`);it(t);let n=["-f",t,"up","-d"];return r&&(it(r),n.splice(2,0,"--env-file",r)),await or(`docker compose ${n.join(" ")}`),o.stop(!0,"Docker Compose file running successfully"),!0}catch(o){return a.error(`Failed to run Docker Compose file: ${o instanceof Error?o.message:String(o)}`),!1}}async runSimulator(t,r){try{a.info(`Running TEE simulator with image ${t}`),a.info("Pulling latest simulator image..."),await or(`docker pull ${t}`),a.info("Starting simulator in background...");let{stdout:o}=await or(`docker run -d --name tee-simulator --rm -p ${r}:${r} ${t}`),n=o.trim();return a.success(`TEE simulator running successfully. Container ID: ${n}`),a.break(),a.break(),a.info("Useful commands:"),a.info(`- View logs: docker logs -f ${n}`),a.info(`- Stop simulator: docker stop ${n}`),jn(`http://localhost:${r}`),!0}catch(o){return a.error(`Failed to run TEE simulator: ${o instanceof Error?o.message:String(o)}`),!1}}async stopSimulator(){try{let t=a.startSpinner("Stopping TEE simulator...");return await or("docker stop tee-simulator"),await at(),t.stop(!0,"TEE simulator stopped successfully"),!0}catch(t){return a.error(`Failed to stop TEE simulator: ${t instanceof Error?t.message:String(t)}`),!1}}static async listLocalImages(){try{let{stdout:t}=await or('docker images --format "{{.Repository}}:{{.Tag}}"'),o=(await Te())?.username;return t.split(`
52
+ `).filter(s=>s&&!s.includes("<none>")).filter(s=>s.includes(`${o}/`)).map(s=>({imageName:s}))}catch(t){return a.error(`Failed to list local Docker images: ${t instanceof Error?t.message:String(t)}`),[]}}};import Ui from"prompts";var zi=new ap().name("login").description("Login to Docker Hub").option("-u, --username <username>","Docker Hub username").option("-p, --password <password>","Docker Hub password").option("-r, --registry <registry>","Docker registry URL").action(async e=>{try{let t=e.username,r=e.password,o=e.registry;if(!t){a.info("First we need your Docker Hub username to check if you are already logged in.");let c=await Ui({type:"text",name:"username",message:"Enter your Docker Hub username:",validate:p=>p.length>0?!0:"Username cannot be empty"});c.username||(a.error("Username is required"),process.exit(1)),t=c.username}let n=new Y("",t,o);if(await n.login(t)){a.success(`${t} is logged in to Docker Hub`),await yn({username:t,registry:o||null});return}if(!r){let c=await Ui({type:"password",name:"password",message:"Enter your Docker Hub password:",validate:p=>p.length>0?!0:"Password cannot be empty"});c.password||(a.error("Password is required"),process.exit(1)),r=c.password}await n.login(t,r,o)||(a.error("Failed to login to Docker Hub"),process.exit(1)),await yn({username:t,registry:o||null}),a.success("Logged in to Docker Hub successfully")}catch(t){a.error(`Failed to login to Docker Hub: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as cp}from"commander";import Hi from"node:path";import Li from"inquirer";import mp from"node:fs";var Vi=new cp().name("build").description("Build a Docker image").option("-i, --image <image>","Image name").option("-t, --tag <tag>","Image tag").option("-f, --file <file>","Path to Dockerfile","Dockerfile").action(async e=>{try{let t=await Te();if(t||(a.error('Docker information not found. Please login first with "phala docker login"'),process.exit(1)),!e.image){let i=await Li.prompt([{type:"input",name:"image",message:"Enter the Docker image name:",validate:c=>c.trim()?!0:"Image name is required"}]);e.image=i.image}if(!e.tag){let i=await Li.prompt([{type:"input",name:"tag",message:"Enter the Docker image tag:",default:"latest",validate:c=>c.trim()?!0:"Tag is required"}]);e.tag=i.tag}let r=Hi.resolve(process.cwd(),e.file);mp.existsSync(r)||(a.info(`Default Dockerfile not found at ${r}`),e.file=await R("Enter the path to your Dockerfile:","Dockerfile","file"));let o=Hi.resolve(process.cwd(),e.file);await new Y(e.image,t.username,t.registry).buildImage(o,e.tag)||(a.error("Failed to build Docker image"),process.exit(1)),a.success(`Docker image ${t.username}/${e.image}:${e.tag} built successfully`)}catch(t){a.error(`Failed to build Docker image: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as pp}from"commander";import fp from"inquirer";var Oi=new pp().name("push").description("Push a Docker image to Docker Hub").option("-i, --image <image>","Full image name (e.g. username/image:tag)").action(async e=>{try{let t=await Te();t||(a.error('Docker information not found. Please login first with "phala docker login"'),process.exit(1));let r=e.image;if(!r){let s=await Y.listLocalImages();if(s.length===0&&(a.error('No local Docker images found. Please build an image first with "phala docker build"'),process.exit(1)),!r){let i=Array.from(new Set(s.map(p=>p.imageName))),{selectedImage:c}=await fp.prompt([{type:"list",name:"selectedImage",message:"Select an image to push:",choices:i}]);r=c}}await new Y("",t.username,t.registry).pushImage(r)||(a.error("Failed to push Docker image"),process.exit(1)),a.success(`Docker image ${r} pushed successfully`)}catch(t){a.error(`Failed to push Docker image: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as up}from"commander";import nr from"inquirer";import sr from"node:fs";import Yr from"node:path";var Gi=new up().name("generate").description("Generate a Docker Compose file").option("-i, --image <imageName>","Docker image name to use in the compose file (e.g. phala/phala-cloud)").option("-e, --env-file <envFile>","Path to environment variables file").option("-o, --output <output>","Output path for generated docker-compose.yml").option("--template <template>","Template to use for the generated docker-compose.yml").action(async e=>{try{let t=await Te();(!t||!t.username)&&(a.error("Docker Hub username not found. Please login first with `phala docker login`"),process.exit(1));let r=e.image;if(!r){let c=await Y.listLocalImages();if(c.length===0&&(a.error('No local Docker images found. Please build an image first with "phala docker build"'),process.exit(1)),!r){let p=Array.from(new Set(c.map(l=>l.imageName))),{selectedImage:m}=await nr.prompt([{type:"list",name:"selectedImage",message:"Select an image to use in the compose file:",choices:p}]);r=m}}let o=e.envFile;if(o)try{it(o)}catch{a.error(`File not found: ${o}`),process.exit(1)}else{let c=Yr.join(process.cwd(),".env");if(sr.existsSync(c)){let{useDefault:m}=await nr.prompt([{type:"confirm",name:"useDefault",message:"Use .env file in current directory?",default:!0}]);m&&(o=c)}if(!o){let{envPath:m}=await nr.prompt([{type:"input",name:"envPath",message:"Enter path to environment variables file:",validate:l=>{try{return it(l),!0}catch{return`File not found: ${l}`}}}]);o=m}}let n=e.output;if(!n&&(n=Yr.join(process.cwd(),"docker-compose.yml"),sr.existsSync(n))){let{confirmOverwrite:c}=await nr.prompt([{type:"confirm",name:"confirmOverwrite",message:`File ${n} already exists. Overwrite?`,default:!1}]);if(!c){let{customPath:p}=await nr.prompt([{type:"input",name:"customPath",message:"Enter alternative output path:",default:Yr.join(process.cwd(),"docker-generated-compose.yml")}]);n=p}}let s=new Y("",t.username,t.registry);o?a.info(`Generating Docker Compose file for ${r} using env file: ${o}`):a.info(`Generating Docker Compose file for ${r} without env file`);let i=await s.buildComposeFile(r,o,e.template);if(i!==n){let c=Yr.dirname(n);sr.existsSync(c)||(a.info(`Creating directory: ${c}`),sr.mkdirSync(c,{recursive:!0})),sr.copyFileSync(i,n)}a.success(`Docker Compose file generated successfully: ${n}`)}catch(t){a.error(`Failed to generate Docker Compose file: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});var qi=new lp().name("docker").description("Login to Docker Hub and manage Docker images").addCommand(zi).addCommand(Vi).addCommand(Oi).addCommand(Gi);import{Command as hp}from"commander";import{Command as dp}from"commander";var ji=new dp().name("start").description("Start the TEE simulator").option("-i, --image <image>","Simulator image",Ts).option("-p, --port <port>","Simulator port (default: 8090)","8090").option("-t, --type <type>","Simulator type (docker, native)","docker").action(async e=>{try{if(e.type==="docker")await new Y("").runSimulator(e.image,e.port)||(a.error("Failed to start TEE simulator"),process.exit(1));else if(e.type==="native")if(Bi()||await Fi(),await Jr()){a.success("TEE simulator is already running");return}else{let r=Di();a.success("TEE simulator started successfully")}else a.error("Invalid simulator type"),process.exit(1)}catch(t){a.error(`Failed to start TEE simulator: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as gp}from"commander";var Ki=new gp().name("stop").description("Stop the TEE simulator").option("-t, --type <type>","Simulator type (docker, native)","docker").action(async e=>{try{e.type==="docker"?await new Y("").stopSimulator()||(a.error("Failed to stop TEE simulator"),process.exit(1)):e.type==="native"?await $i()||(a.error("Failed to stop TEE simulator"),process.exit(1)):(a.error("Invalid simulator type"),process.exit(1))}catch(t){a.error(`Failed to stop TEE simulator: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});var Wi=new hp().name("simulator").description("TEE simulator commands").addCommand(ji).addCommand(Ki);import{Command as Fu}from"commander";import{Command as xp}from"commander";import Kn from"chalk";var Ji=new xp().name("list").alias("ls").description("List all CVMs").option("-j, --json","Output in JSON format").action(async e=>{try{let t=a.startSpinner("Fetching CVMs"),r=await $s();if(t.stop(!0),!r||r.length===0){a.info("No CVMs found");return}if(e.json){console.log(JSON.stringify(r,null,2));return}for(let o of r)a.keyValueTable({Name:o.name,"App ID":`app_${o.hosted.app_id}`,"CVM ID":o.hosted.id.replace(/-/g,""),Region:o.node.region_identifier,Status:o.status==="running"?Kn.green(o.status):o.status==="stopped"?Kn.red(o.status):Kn.yellow(o.status),"Node Info URL":o.hosted.app_url,"App URL":`${_}/dashboard/cvms/${o.hosted.id.replace(/-/g,"")}`}),a.break();a.success(`Found ${r.length} CVMs`),a.break(),a.info(`Go to ${_}/dashboard/ to view your CVMs`)}catch(t){a.error(`Failed to list CVMs: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as yp}from"commander";import Wn from"chalk";async function ae(e){if(!e){let t=await Pr();return t||void 0}return await Cr(e)}var Yi=new yp().name("get").description("Get details of a CVM").argument("[app-id]","App ID of the CVM (optional)").option("-j, --json","Output in JSON format").action(async(e,t)=>{try{let r=await ae(e),o=a.startSpinner(`Fetching CVM with App ID app_${r}`),n=await ye(r);if(o.stop(!0),a.break(),n||(a.error(`CVM with App ID app_${r} not found`),process.exit(1)),t.json){console.log(JSON.stringify(n,null,2));return}a.keyValueTable({Name:n.name,"App ID":`app_${n.app_id}`,Status:n.status==="running"?Wn.green(n.status):n.status==="stopped"?Wn.red(n.status):Wn.yellow(n.status),vCPU:n.vcpu,Memory:`${n.memory} MB`,"Disk Size":`${n.disk_size} GB`,"Dstack Image":n.base_image,"App URL":`${_}/dashboard/cvms/app_${n.app_id}`})}catch(r){a.error(`Failed to get CVM details: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}});import{Command as bp}from"commander";var Zi=new bp().name("start").description("Start a stopped CVM").argument("[app-id]","App ID of the CVM (if not provided, a selection prompt will appear)").action(async e=>{try{let t=await ae(e),r=a.startSpinner(`Starting CVM with App ID app_${t}`),o=await Ns(t);r.stop(!0),a.break();let n={"CVM ID":o.id,Name:o.name,Status:o.status,"App ID":`app_${o.app_id}`};a.keyValueTable(n,{borderStyle:"rounded"}),a.break(),a.success(`Your CVM is being started. You can check the dashboard for more details:
53
+ ${_}/dashboard/cvms/app_${o.app_id}`)}catch(t){a.error(`Failed to start CVM: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as vp}from"commander";var Qi=new vp().name("stop").description("Stop a running CVM").argument("[app-id]","App ID of the CVM (if not provided, a selection prompt will appear)").action(async e=>{try{let t=await ae(e),r=a.startSpinner(`Stopping CVM with App ID app_${t}`),o=await Ms(t);r.stop(!0),a.break();let n={"CVM ID":o.id,Name:o.name,Status:o.status,"App ID":`app_${o.app_id}`};a.keyValueTable(n,{borderStyle:"rounded"}),a.break(),a.success(`Your CVM is being stopped. You can check the dashboard for more details:
54
+ ${_}/dashboard/cvms/app_${o.app_id}`)}catch(t){a.error(`Failed to stop CVM: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as wp}from"commander";var Xi=new wp().name("restart").description("Restart a CVM").argument("[app-id]","App ID of the CVM (if not provided, a selection prompt will appear)").action(async e=>{try{let t=await ae(e),r=a.startSpinner(`Restarting CVM with App ID app_${t}`),o=await Rs(t);r.stop(!0),a.break();let n={"CVM ID":o.id,Name:o.name,Status:o.status,"App ID":`app_${o.app_id}`,"App URL":o.app_url?o.app_url:`${_}/dashboard/cvms/app_${o.app_id}`};a.keyValueTable(n,{borderStyle:"rounded"}),a.break(),a.success(`Your CVM is being restarted. You can check the dashboard for more details:
55
+ ${_}/dashboard/cvms/app_${o.app_id}`)}catch(t){a.error(`Failed to restart CVM: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as Ep}from"commander";import Zr from"chalk";var ea=new Ep().name("attestation").description("Get attestation information for a CVM").argument("[app-id]","CVM app ID (will prompt for selection if not provided)").option("-j, --json","Output in JSON format").action(async(e,t)=>{try{let r;if(e)r=await Cr(e);else{a.info("No CVM specified, fetching available CVMs...");let n=await Pr();if(!n)return;r=n}let o=a.startSpinner(`Fetching attestation information for CVM app_${r}...`);try{let n=await zs(r);if(o.stop(!0),!n||Object.keys(n).length===0){a.info("No attestation information found");return}if(t?.json){a.info(JSON.stringify(n,null,2));return}a.success("Attestation Summary:");let s={Status:n.is_online?Zr.green("Online"):Zr.red("Offline"),"Public Access":n.is_public?Zr.green("Enabled"):Zr.yellow("Disabled"),Error:n.error||"None",Certificates:`${n.app_certificates?.length||0} found`};if(a.keyValueTable(s,{borderStyle:"rounded"}),n.app_certificates&&n.app_certificates.length>0&&n.app_certificates.forEach((i,c)=>{a.break(),a.success(`Certificate #${c+1} (${i.position_in_chain===0?"End Entity":"CA"}):`);let p={Subject:`${i.subject.common_name||"Unknown"}${i.subject.organization?` (${i.subject.organization})`:""}`,Issuer:`${i.issuer.common_name||"Unknown"}${i.issuer.organization?` (${i.issuer.organization})`:""}`,"Serial Number":i.serial_number,Validity:`${new Date(i.not_before).toLocaleString()} to ${new Date(i.not_after).toLocaleString()}`,Fingerprint:i.fingerprint,"Signature Algorithm":i.signature_algorithm,"Is CA":i.is_ca?"Yes":"No","Position in Chain":i.position_in_chain};a.keyValueTable(p,{borderStyle:"rounded"})}),n.tcb_info){a.break(),a.success("Trusted Computing Base (TCB) Information:");let i={Mrtd:n.tcb_info.mrtd,"Rootfs Hash":n.tcb_info.rootfs_hash,Rtmr0:n.tcb_info.rtmr0,Rtmr1:n.tcb_info.rtmr1,Rtmr2:n.tcb_info.rtmr2,Rtmr3:n.tcb_info.rtmr3,"Event Log Entries":`${n.tcb_info.event_log.length} entries`};if(a.keyValueTable(i,{borderStyle:"rounded"}),n.tcb_info.event_log&&n.tcb_info.event_log.length>0){a.break(),a.success("Event Log (Showing entries to reproduce RTMR3):");let c=5,p=n.tcb_info.event_log.filter(m=>m.event!==null&&m.event!=="").map(m=>({Event:m.event,IMR:m.imr.toString(),"Event Type":m.event_type.toString(),Payload:m.event_payload}));a.table(p,[{key:"Event",header:"Event",minWidth:8},{key:"IMR",header:"IMR",minWidth:3},{key:"Event Type",header:"Type",minWidth:8},{key:"Payload",header:"Payload",minWidth:25}]),n.tcb_info.event_log.length>c&&a.info("To see all full attestation data, use --json"),a.break(),a.success("To reproduce RTMR3, use the tool at https://rtmr3-calculator.vercel.app/")}}}catch(n){throw o.stop(!1),n}}catch(r){a.error(`Failed to get attestation information: ${r instanceof Error?r.message:String(r)}`)}});import{Command as Cp}from"commander";import{encryptEnvVars as kp}from"@phala/dstack-sdk/encrypt-env-vars";import ra from"node:fs";import Ap from"node:path";import oa from"inquirer";import*as ta from"node:fs";var z=(e,t)=>{let r={};if(e){for(let o of e)if(o.includes("=")){let[n,...s]=o.split("="),i=s.join("=");n&&(r[n]=i)}}if(t){let o=ta.readFileSync(t,"utf8");for(let n of o.split(`
56
+ `)){if(!n.trim()||n.trim().startsWith("#"))continue;let s=-1,i=!1,c="";for(let h=0;h<n.length;h++)if((n[h]==='"'||n[h]==="'"||n[h]==="`")&&(h===0||n[h-1]!=="\\"))i&&n[h]===c?(i=!1,c=""):i||(i=!0,c=n[h]);else if(n[h]==="="&&!i){s=h;break}else if(n[h]==="#"&&!i)break;if(s===-1){n.trim().startsWith("#");continue}let p=n.substring(0,s).trim(),m=n.substring(s+1),l=!1,f="",u=-1;for(let h=0;h<m.length;h++)if((m[h]==='"'||m[h]==="'"||m[h]==="`")&&(h===0||m[h-1]!=="\\"))l&&m[h]===f?(l=!1,f=""):l||(l=!0,f=m[h]);else if(m[h]==="#"&&!l&&h>0&&m[h-1]===" "){u=h-1;break}else if(m[h]==="#"&&!l&&h===0){u=h;break}u!==-1&&(m=m.substring(0,u)),m===void 0&&(m="");let d=m.charAt(0),y=m.charAt(m.length-1);d==='"'&&y==='"'||d==="'"&&y==="'"||d==="`"&&y==="`"?(m=m.substring(1,m.length-1),d==='"'&&(m=m.replace(/\\\\n/g,`
57
+ `))):m=m.trim(),p&&(r[p]=m)}}return Object.entries(r).map(([o,n])=>({key:o,value:n}))};var na=new Cp().name("create").description("Create a new CVM").option("-n, --name <name>","Name of the CVM").option("-c, --compose <compose>","Path to Docker Compose file").option("--vcpu <vcpu>",`Number of vCPUs, default is ${Pe}`).option("--memory <memory>",`Memory in MB, default is ${ce}`).option("--disk-size <diskSize>",`Disk size in GB, default is ${me}`).option("--teepod-id <teepodId>","TEEPod ID to use. If not provided, it will be selected from the list of available TEEPods.").option("--image <image>","Version of dstack image to use. If not provided, it will be selected from the list of available images for the selected TEEPod.").option("-e, --env-file <envFile>","Path to environment file").option("--skip-env","Skip environment variable prompt",!1).option("--debug","Enable debug mode",!1).action(async e=>{try{if(!e.name){let{name:v}=await oa.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",validate:E=>E.trim()?E.trim().length>20?"CVM name must be less than 20 characters":E.trim().length<3?"CVM name must be at least 3 characters":/^[a-zA-Z0-9_-]+$/.test(E)?!0:"CVM name must contain only letters, numbers, underscores, and hyphens":"CVM name is required"}]);e.name=v}if(!e.compose){let E=we(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e.compose=await R("Enter the path to your Docker Compose file:",E,"file")}let t=Ap.resolve(e.compose);ra.existsSync(t)||(a.error(`Docker Compose file not found: ${t}`),process.exit(1));let r=ra.readFileSync(t,"utf8");await at(),process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?a.info("\u{1F510} Using private DockerHub registry credentials..."):process.env.DSTACK_AWS_ACCESS_KEY_ID&&process.env.DSTACK_AWS_SECRET_ACCESS_KEY&&process.env.DSTACK_AWS_REGION&&process.env.DSTACK_AWS_ECR_REGISTRY?a.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):a.info("\u{1F510} Using public DockerHub registry...");let o=[];if(e.envFile)try{o=z([],e.envFile)}catch(v){a.error(`Failed to read environment file: ${v instanceof Error?v.message:String(v)}`),process.exit(1)}else if(!e.skipEnv){let{shouldSkip:v}=await oa.prompt([{type:"confirm",name:"shouldSkip",message:"Do you want to skip environment variable prompt?",default:!0}]);if(v)a.info("Skipping environment variable prompt");else{let E=await R("Enter the path to your environment file:",".env","file");o=z([],E)}}let n=Number(e.vcpu)||Pe,s=Number(e.memory)||ce,i=Number(e.diskSize)||me;(Number.isNaN(n)||n<=0)&&(a.error(`Invalid number of vCPUs: ${n}`),process.exit(1)),(Number.isNaN(s)||s<=0)&&(a.error(`Invalid memory: ${s}`),process.exit(1)),(Number.isNaN(i)||i<=0)&&(a.error(`Invalid disk size: ${i}`),process.exit(1));let c=a.startSpinner("Fetching available TEEPods"),p=await be();c.stop(!0),p.nodes.length===0&&(a.error("No TEEPods available. Please try again later."),process.exit(1));let m;e.teepodId?(m=p.nodes.find(v=>v.teepod_id===Number(e.teepodId)),m||(a.error("Failed to find selected TEEPod"),process.exit(1))):(m=p.nodes[0],m||(a.error("Failed to find default TEEPod"),process.exit(1)));let l;e.image?(l=m.images?.find(v=>v.name===e.image),l||(a.error(`Failed to find selected image: ${e.image}`),process.exit(1))):(l=m.images?.find(v=>v.name===Yt),l||(a.error(`Failed to find default image ${Yt}`),process.exit(1)));let f={teepod_id:m.teepod_id,name:e.name,image:l.name,vcpu:n,memory:s,disk_size:i,compose_manifest:{docker_compose_file:r,docker_config:{url:"",username:"",password:""},features:["kms","tproxy-net"],kms_enabled:!0,manifest_version:2,name:e.name,public_logs:!0,public_sysinfo:!0,tproxy_enabled:!0},listed:!1},u=a.startSpinner("Getting public key from CVM"),d=await Me(f);u.stop(!0),d||(a.error("Failed to get public key from CVM"),process.exit(1));let y=a.startSpinner("Encrypting environment variables"),h=await kp(o,d.app_env_encrypt_pubkey);y.stop(!0),e.debug&&(a.debug("Public key:",d.app_env_encrypt_pubkey),a.debug("Encrypted environment variables:",h),a.debug("Environment variables:",JSON.stringify(o)));let g=a.startSpinner("Creating CVM"),x=await Re({...f,encrypted_env:h,app_env_encrypt_pubkey:d.app_env_encrypt_pubkey,app_id_salt:d.app_id_salt});g.stop(!0),x||(a.error("Failed to create CVM"),process.exit(1)),a.success("CVM created successfully"),a.break();let b={"CVM ID":x.id,Name:x.name,Status:x.status,"App ID":`app_${x.app_id}`,"App URL":x.app_url?x.app_url:`${_}/dashboard/cvms/app_${x.app_id}`};a.keyValueTable(b,{borderStyle:"rounded"}),a.info(""),a.success(`Your CVM is being created. You can check its status with:
58
+ phala cvms get app_${x.app_id}`)}catch(t){a.error(`Failed to create CVM: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}});import{Command as Sp}from"commander";import Ip from"inquirer";var sa=new Sp().name("delete").description("Delete a CVM").argument("[app-id]","App ID of the CVM to delete (if not provided, a selection prompt will appear)").option("-f, --force","Skip confirmation prompt",!1).action(async(e,t)=>{try{let r=await ae(e);if(!t.force){let{confirm:s}=await Ip.prompt([{type:"confirm",name:"confirm",message:`Are you sure you want to delete CVM with App ID app_${r}? This action cannot be undone.`,default:!1}]);if(!s){a.info("Deletion cancelled");return}}let o=a.startSpinner(`Deleting CVM app_${r}`),n=await Us(r);o.stop(!0),n||(a.error(`Failed to delete CVM app_${r}`),process.exit(1)),a.success(`CVM app_${r} deleted successfully`)}catch(r){a.error(`Failed to delete CVM: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}});import{Command as tu}from"commander";import gm from"node:fs";import{encryptEnvVars as ru}from"@phala/dstack-sdk/encrypt-env-vars";import hm from"inquirer";import{ethers as yr}from"ethers";function w(e,t,r){let o=e[t.name];if(typeof o=="function")return o;let n=e[r];return typeof n=="function"?n:s=>t(e,s)}var Qr=class extends T{constructor(t){super(`Filter type "${t}" is not supported.`,{name:"FilterTypeNotSupportedError"})}};var ia="/docs/contract/encodeEventTopics";function Ee(e){let{abi:t,eventName:r,args:o}=e,n=t[0];if(r){let p=$r({abi:t,name:r});if(!p)throw new En(r,{docsPath:ia});n=p}if(n.type!=="event")throw new En(void 0,{docsPath:ia});let s=Br(n),i=xt(s),c=[];if(o&&"inputs"in n){let p=n.inputs?.filter(l=>"indexed"in l&&l.indexed),m=Array.isArray(o)?o:Object.values(o).length>0?p?.map(l=>o[l.name])??[]:[];m.length>0&&(c=p?.map((l,f)=>Array.isArray(m[f])?m[f].map((u,d)=>aa({param:l,value:m[f][d]})):typeof m[f]<"u"&&m[f]!==null?aa({param:l,value:m[f]}):null)??[])}return[i,...c]}function aa({param:e,value:t}){if(e.type==="string"||e.type==="bytes")return M(ze(t));if(e.type==="tuple"||e.type.match(/^(.*)\[(\d+)?\]$/))throw new Qr(e.type);return ot([e],[t])}function Ge(e,{method:t}){let r={};return e.transport.type==="fallback"&&e.transport.onResponse?.(({method:o,response:n,status:s,transport:i})=>{s==="success"&&t===o&&(r[n]=i.request)}),o=>r[o]||e.request}async function Xr(e,t){let{address:r,abi:o,args:n,eventName:s,fromBlock:i,strict:c,toBlock:p}=t,m=Ge(e,{method:"eth_newFilter"}),l=s?Ee({abi:o,args:n,eventName:s}):void 0,f=await e.request({method:"eth_newFilter",params:[{address:r,fromBlock:typeof i=="bigint"?P(i):i,toBlock:typeof p=="bigint"?P(p):p,topics:l}]});return{abi:o,args:n,eventName:s,id:f,request:m(f),strict:!!c,type:"event"}}var Tp=3;function le(e,{abi:t,address:r,args:o,docsPath:n,functionName:s,sender:i}){let c=e instanceof vt?e:e instanceof T?e.walk(y=>"data"in y)||e.walk():{},{code:p,data:m,details:l,message:f,shortMessage:u}=c,d=(()=>e instanceof ht?new di({functionName:s}):[Tp,wt.code].includes(p)&&(m||l||f||u)?new Qt({abi:t,data:typeof m=="object"?m.data:m,functionName:s,message:c instanceof Ur?l:u??f}):e)();return new li(d,{abi:t,args:o,contractAddress:r,docsPath:n,functionName:s,sender:i})}function ca(e){let t=M(`0x${e.substring(4)}`).substring(26);return Qs(`0x${t}`)}async function pa({hash:e,signature:t}){let r=_e(e)?e:C(e),{secp256k1:o}=await import("@noble/curves/secp256k1");return`0x${(()=>{if(typeof t=="object"&&"r"in t&&"s"in t){let{r:m,s:l,v:f,yParity:u}=t,d=Number(u??f),y=ma(d);return new o.Signature(L(m),L(l)).addRecoveryBit(y)}let i=_e(t)?t:C(t),c=q(`0x${i.slice(130)}`),p=ma(c);return o.Signature.fromCompact(i.substring(2,130)).addRecoveryBit(p)})().recoverPublicKey(r.substring(2)).toHex(!1)}`}function ma(e){if(e===0||e===1)return e;if(e===27)return 0;if(e===28)return 1;throw new Error("Invalid yParityOrV value")}async function eo({hash:e,signature:t}){return ca(await pa({hash:e,signature:t}))}function de(e,t="hex"){let r=fa(e),o=Nr(new Uint8Array(r.length));return r.encode(o),t==="hex"?H(o.bytes):o.bytes}function fa(e){return Array.isArray(e)?Pp(e.map(t=>fa(t))):_p(e)}function Pp(e){let t=e.reduce((n,s)=>n+s.length,0),r=ua(t);return{length:(()=>t<=55?1+t:1+r+t)(),encode(n){t<=55?n.pushByte(192+t):(n.pushByte(192+55+r),r===1?n.pushUint8(t):r===2?n.pushUint16(t):r===3?n.pushUint24(t):n.pushUint32(t));for(let{encode:s}of e)s(n)}}}function _p(e){let t=typeof e=="string"?X(e):e,r=ua(t.length);return{length:(()=>t.length===1&&t[0]<128?1:t.length<=55?1+t.length:1+r+t.length)(),encode(n){t.length===1&&t[0]<128?n.pushBytes(t):t.length<=55?(n.pushByte(128+t.length),n.pushBytes(t)):(n.pushByte(128+55+r),r===1?n.pushUint8(t.length):r===2?n.pushUint16(t.length):r===3?n.pushUint24(t.length):n.pushUint32(t.length),n.pushBytes(t))}}}function ua(e){if(e<2**8)return 1;if(e<2**16)return 2;if(e<2**24)return 3;if(e<2**32)return 4;throw new T("Length is too large.")}function la(e){let{chainId:t,contractAddress:r,nonce:o,to:n}=e,s=M(ue(["0x05",de([t?P(t):"0x",r,o?P(o):"0x"])]));return n==="bytes"?X(s):s}async function da(e){let{authorization:t,signature:r}=e;return eo({hash:la(t),signature:r??t})}var to=class extends T{constructor(t,{account:r,docsPath:o,chain:n,data:s,gas:i,gasPrice:c,maxFeePerGas:p,maxPriorityFeePerGas:m,nonce:l,to:f,value:u}){let d=ai({from:r?.address,to:f,value:typeof u<"u"&&`${ii(u)} ${n?.nativeCurrency?.symbol||"ETH"}`,data:s,gas:i,gasPrice:typeof c<"u"&&`${bt(c)} gwei`,maxFeePerGas:typeof p<"u"&&`${bt(p)} gwei`,maxPriorityFeePerGas:typeof m<"u"&&`${bt(m)} gwei`,nonce:l});super(t.shortMessage,{cause:t,docsPath:o,metaMessages:[...t.metaMessages?[...t.metaMessages," "]:[],"Estimate Gas Arguments:",d].filter(Boolean),name:"EstimateGasExecutionError"}),Object.defineProperty(this,"cause",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.cause=t}};function ga(e,{docsPath:t,...r}){let o=(()=>{let n=Or(e,r);return n instanceof Vr?e:n})();return new to(o,{docsPath:t,...r})}var ro=class extends T{constructor(){super("`baseFeeMultiplier` must be greater than 1.",{name:"BaseFeeScalarError"})}},qe=class extends T{constructor(){super("Chain does not support EIP-1559 fees.",{name:"Eip1559FeesNotSupportedError"})}},oo=class extends T{constructor({maxPriorityFeePerGas:t}){super(`\`maxFeePerGas\` cannot be less than the \`maxPriorityFeePerGas\` (${bt(t)} gwei).`,{name:"MaxFeePerGasTooLowError"})}};var It=class extends T{constructor({blockHash:t,blockNumber:r}){let o="Block";t&&(o=`Block at hash "${t}"`),r&&(o=`Block at number "${r}"`),super(`${o} could not be found.`,{name:"BlockNotFoundError"})}};var Jn={"0x0":"legacy","0x1":"eip2930","0x2":"eip1559","0x3":"eip4844","0x4":"eip7702"};function ct(e){let t={...e,blockHash:e.blockHash?e.blockHash:null,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,chainId:e.chainId?q(e.chainId):void 0,gas:e.gas?BigInt(e.gas):void 0,gasPrice:e.gasPrice?BigInt(e.gasPrice):void 0,maxFeePerBlobGas:e.maxFeePerBlobGas?BigInt(e.maxFeePerBlobGas):void 0,maxFeePerGas:e.maxFeePerGas?BigInt(e.maxFeePerGas):void 0,maxPriorityFeePerGas:e.maxPriorityFeePerGas?BigInt(e.maxPriorityFeePerGas):void 0,nonce:e.nonce?q(e.nonce):void 0,to:e.to?e.to:null,transactionIndex:e.transactionIndex?Number(e.transactionIndex):null,type:e.type?Jn[e.type]:void 0,typeHex:e.type?e.type:void 0,value:e.value?BigInt(e.value):void 0,v:e.v?BigInt(e.v):void 0};return e.authorizationList&&(t.authorizationList=Bp(e.authorizationList)),t.yParity=(()=>{if(e.yParity)return Number(e.yParity);if(typeof t.v=="bigint"){if(t.v===0n||t.v===27n)return 0;if(t.v===1n||t.v===28n)return 1;if(t.v>=35n)return t.v%2n===0n?1:0}})(),t.type==="legacy"&&(delete t.accessList,delete t.maxFeePerBlobGas,delete t.maxFeePerGas,delete t.maxPriorityFeePerGas,delete t.yParity),t.type==="eip2930"&&(delete t.maxFeePerBlobGas,delete t.maxFeePerGas,delete t.maxPriorityFeePerGas),t.type==="eip1559"&&delete t.maxFeePerBlobGas,t}var ha=Et("transaction",ct);function Bp(e){return e.map(t=>({contractAddress:t.address,chainId:Number(t.chainId),nonce:Number(t.nonce),r:t.r,s:t.s,yParity:Number(t.yParity)}))}function ir(e){let t=(e.transactions??[]).map(r=>typeof r=="string"?r:ct(r));return{...e,baseFeePerGas:e.baseFeePerGas?BigInt(e.baseFeePerGas):null,blobGasUsed:e.blobGasUsed?BigInt(e.blobGasUsed):void 0,difficulty:e.difficulty?BigInt(e.difficulty):void 0,excessBlobGas:e.excessBlobGas?BigInt(e.excessBlobGas):void 0,gasLimit:e.gasLimit?BigInt(e.gasLimit):void 0,gasUsed:e.gasUsed?BigInt(e.gasUsed):void 0,hash:e.hash?e.hash:null,logsBloom:e.logsBloom?e.logsBloom:null,nonce:e.nonce?e.nonce:null,number:e.number?BigInt(e.number):null,size:e.size?BigInt(e.size):void 0,timestamp:e.timestamp?BigInt(e.timestamp):void 0,transactions:t,totalDifficulty:e.totalDifficulty?BigInt(e.totalDifficulty):null}}var xa=Et("block",ir);async function Z(e,{blockHash:t,blockNumber:r,blockTag:o,includeTransactions:n}={}){let s=o??"latest",i=n??!1,c=r!==void 0?P(r):void 0,p=null;if(t?p=await e.request({method:"eth_getBlockByHash",params:[t,i]},{dedupe:!0}):p=await e.request({method:"eth_getBlockByNumber",params:[c||s,i]},{dedupe:!!c}),!p)throw new It({blockHash:t,blockNumber:r});return(e.chain?.formatters?.block?.format||ir)(p)}async function Tt(e){let t=await e.request({method:"eth_gasPrice"});return BigInt(t)}async function ya(e,t){return Yn(e,t)}async function Yn(e,t){let{block:r,chain:o=e.chain,request:n}=t||{};try{let s=o?.fees?.maxPriorityFeePerGas??o?.fees?.defaultPriorityFee;if(typeof s=="function"){let c=r||await w(e,Z,"getBlock")({}),p=await s({block:c,client:e,request:n});if(p===null)throw new Error;return p}if(typeof s<"u")return s;let i=await e.request({method:"eth_maxPriorityFeePerGas"});return L(i)}catch{let[s,i]=await Promise.all([r?Promise.resolve(r):w(e,Z,"getBlock")({}),w(e,Tt,"getGasPrice")({})]);if(typeof s.baseFeePerGas!="bigint")throw new qe;let c=i-s.baseFeePerGas;return c<0n?0n:c}}async function ba(e,t){return no(e,t)}async function no(e,t){let{block:r,chain:o=e.chain,request:n,type:s="eip1559"}=t||{},i=await(async()=>typeof o?.fees?.baseFeeMultiplier=="function"?o.fees.baseFeeMultiplier({block:r,client:e,request:n}):o?.fees?.baseFeeMultiplier??1.2)();if(i<1)throw new ro;let p=10**(i.toString().split(".")[1]?.length??0),m=u=>u*BigInt(Math.ceil(i*p))/BigInt(p),l=r||await w(e,Z,"getBlock")({});if(typeof o?.fees?.estimateFeesPerGas=="function"){let u=await o.fees.estimateFeesPerGas({block:r,client:e,multiply:m,request:n,type:s});if(u!==null)return u}if(s==="eip1559"){if(typeof l.baseFeePerGas!="bigint")throw new qe;let u=typeof n?.maxPriorityFeePerGas=="bigint"?n.maxPriorityFeePerGas:await Yn(e,{block:l,chain:o,request:n}),d=m(l.baseFeePerGas);return{maxFeePerGas:n?.maxFeePerGas??d+u,maxPriorityFeePerGas:u}}return{gasPrice:n?.gasPrice??m(await w(e,Tt,"getGasPrice")({}))}}async function so(e,{address:t,blockTag:r="latest",blockNumber:o}){let n=await e.request({method:"eth_getTransactionCount",params:[t,o?P(o):r]},{dedupe:!!o});return q(n)}function Pt(e){let{kzg:t}=e,r=e.to??(typeof e.blobs[0]=="string"?"hex":"bytes"),o=typeof e.blobs[0]=="string"?e.blobs.map(s=>X(s)):e.blobs,n=[];for(let s of o)n.push(Uint8Array.from(t.blobToKzgCommitment(s)));return r==="bytes"?n:n.map(s=>H(s))}function _t(e){let{kzg:t}=e,r=e.to??(typeof e.blobs[0]=="string"?"hex":"bytes"),o=typeof e.blobs[0]=="string"?e.blobs.map(i=>X(i)):e.blobs,n=typeof e.commitments[0]=="string"?e.commitments.map(i=>X(i)):e.commitments,s=[];for(let i=0;i<o.length;i++){let c=o[i],p=n[i];s.push(Uint8Array.from(t.computeBlobKzgProof(c,p)))}return r==="bytes"?s:s.map(i=>H(i))}function Fp(e,t,r,o){if(typeof e.setBigUint64=="function")return e.setBigUint64(t,r,o);let n=BigInt(32),s=BigInt(4294967295),i=Number(r>>n&s),c=Number(r&s),p=o?4:0,m=o?0:4;e.setUint32(t+p,i,o),e.setUint32(t+m,c,o)}function va(e,t,r){return e&t^~e&r}function wa(e,t,r){return e&t^e&r^t&r}var io=class extends Ws{constructor(t,r,o,n){super(),this.blockLen=t,this.outputLen=r,this.padOffset=o,this.isLE=n,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(t),this.view=Dr(this.buffer)}update(t){kn(this);let{view:r,buffer:o,blockLen:n}=this;t=Ks(t);let s=t.length;for(let i=0;i<s;){let c=Math.min(n-this.pos,s-i);if(c===n){let p=Dr(t);for(;n<=s-i;i+=n)this.process(p,i);continue}o.set(t.subarray(i,i+c),this.pos),this.pos+=c,i+=c,this.pos===n&&(this.process(r,0),this.pos=0)}return this.length+=t.length,this.roundClean(),this}digestInto(t){kn(this),js(t,this),this.finished=!0;let{buffer:r,view:o,blockLen:n,isLE:s}=this,{pos:i}=this;r[i++]=128,this.buffer.subarray(i).fill(0),this.padOffset>n-i&&(this.process(o,0),i=0);for(let f=i;f<n;f++)r[f]=0;Fp(o,n-8,BigInt(this.length*8),s),this.process(o,0);let c=Dr(t),p=this.outputLen;if(p%4)throw new Error("_sha2: outputLen should be aligned to 32bit");let m=p/4,l=this.get();if(m>l.length)throw new Error("_sha2: outputLen bigger than state");for(let f=0;f<m;f++)c.setUint32(4*f,l[f],s)}digest(){let{buffer:t,outputLen:r}=this;this.digestInto(t);let o=t.slice(0,r);return this.destroy(),o}_cloneInto(t){t||(t=new this.constructor),t.set(...this.get());let{blockLen:r,buffer:o,length:n,finished:s,destroyed:i,pos:c}=this;return t.length=n,t.pos=c,t.finished=s,t.destroyed=i,n%r&&t.buffer.set(o),t}};var Dp=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]),je=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),Ke=new Uint32Array(64),Zn=class extends io{constructor(){super(64,32,8,!1),this.A=je[0]|0,this.B=je[1]|0,this.C=je[2]|0,this.D=je[3]|0,this.E=je[4]|0,this.F=je[5]|0,this.G=je[6]|0,this.H=je[7]|0}get(){let{A:t,B:r,C:o,D:n,E:s,F:i,G:c,H:p}=this;return[t,r,o,n,s,i,c,p]}set(t,r,o,n,s,i,c,p){this.A=t|0,this.B=r|0,this.C=o|0,this.D=n|0,this.E=s|0,this.F=i|0,this.G=c|0,this.H=p|0}process(t,r){for(let f=0;f<16;f++,r+=4)Ke[f]=t.getUint32(r,!1);for(let f=16;f<64;f++){let u=Ke[f-15],d=Ke[f-2],y=fe(u,7)^fe(u,18)^u>>>3,h=fe(d,17)^fe(d,19)^d>>>10;Ke[f]=h+Ke[f-7]+y+Ke[f-16]|0}let{A:o,B:n,C:s,D:i,E:c,F:p,G:m,H:l}=this;for(let f=0;f<64;f++){let u=fe(c,6)^fe(c,11)^fe(c,25),d=l+u+va(c,p,m)+Dp[f]+Ke[f]|0,h=(fe(o,2)^fe(o,13)^fe(o,22))+wa(o,n,s)|0;l=m,m=p,p=c,c=i+d|0,i=s,s=n,n=o,o=d+h|0}o=o+this.A|0,n=n+this.B|0,s=s+this.C|0,i=i+this.D|0,c=c+this.E|0,p=p+this.F|0,m=m+this.G|0,l=l+this.H|0,this.set(o,n,s,i,c,p,m,l)}roundClean(){Ke.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}};var Ea=Js(()=>new Zn);function Ca(e,t){let r=t||"hex",o=Ea(_e(e,{strict:!1})?ze(e):e);return r==="bytes"?o:C(o)}function ka(e){let{commitment:t,version:r=1}=e,o=e.to??(typeof t=="string"?"hex":"bytes"),n=Ca(t,"bytes");return n.set([r],0),o==="bytes"?n:H(n)}function ao(e){let{commitments:t,version:r}=e,o=e.to??(typeof t[0]=="string"?"hex":"bytes"),n=[];for(let s of t)n.push(ka({commitment:s,to:o,version:r}));return n}var co=class extends T{constructor({maxSize:t,size:r}){super("Blob size is too large.",{metaMessages:[`Max: ${t} bytes`,`Given: ${r} bytes`],name:"BlobSizeTooLargeError"})}},Bt=class extends T{constructor(){super("Blob data must not be empty.",{name:"EmptyBlobError"})}},mo=class extends T{constructor({hash:t,size:r}){super(`Versioned hash "${t}" size is invalid.`,{metaMessages:["Expected: 32",`Received: ${r}`],name:"InvalidVersionedHashSizeError"})}},po=class extends T{constructor({hash:t,version:r}){super(`Versioned hash "${t}" version is invalid.`,{metaMessages:[`Expected: ${1}`,`Received: ${r}`],name:"InvalidVersionedHashVersionError"})}};function Aa(e){let t=e.to??(typeof e.data=="string"?"hex":"bytes"),r=typeof e.data=="string"?X(e.data):e.data,o=pe(r);if(!o)throw new Bt;if(o>761855)throw new co({maxSize:761855,size:o});let n=[],s=!0,i=0;for(;s;){let c=Nr(new Uint8Array(131072)),p=0;for(;p<4096;){let m=r.slice(i,i+(32-1));if(c.pushByte(0),c.pushBytes(m),m.length<31){c.pushByte(128),s=!1;break}p++,i+=31}n.push(c)}return t==="bytes"?n.map(c=>c.bytes):n.map(c=>H(c.bytes))}function fo(e){let{data:t,kzg:r,to:o}=e,n=e.blobs??Aa({data:t,to:o}),s=e.commitments??Pt({blobs:n,kzg:r,to:o}),i=e.proofs??_t({blobs:n,commitments:s,kzg:r,to:o}),c=[];for(let p=0;p<n.length;p++)c.push({blob:n[p],commitment:s[p],proof:i[p]});return c}function uo(e){if(e.type)return e.type;if(typeof e.authorizationList<"u")return"eip7702";if(typeof e.blobs<"u"||typeof e.blobVersionedHashes<"u"||typeof e.maxFeePerBlobGas<"u"||typeof e.sidecars<"u")return"eip4844";if(typeof e.maxFeePerGas<"u"||typeof e.maxPriorityFeePerGas<"u")return"eip1559";if(typeof e.gasPrice<"u")return typeof e.accessList<"u"?"eip2930":"legacy";throw new mi({transaction:e})}async function lo(e){let t=await e.request({method:"eth_chainId"},{dedupe:!0});return q(t)}var Mp=["blobVersionedHashes","chainId","fees","gas","nonce","type"],Sa=new Map;async function go(e,t){let{account:r=e.account,blobs:o,chain:n,gas:s,kzg:i,nonce:c,nonceManager:p,parameters:m=Mp,type:l}=t,f=r&&J(r),u={...t,...f?{from:f?.address}:{}},d;async function y(){return d||(d=await w(e,Z,"getBlock")({blockTag:"latest"}),d)}let h;async function g(){return h||(n?n.id:typeof t.chainId<"u"?t.chainId:(h=await w(e,lo,"getChainId")({}),h))}if(m.includes("nonce")&&typeof c>"u"&&f)if(p){let x=await g();u.nonce=await p.consume({address:f.address,chainId:x,client:e})}else u.nonce=await w(e,so,"getTransactionCount")({address:f.address,blockTag:"pending"});if((m.includes("blobVersionedHashes")||m.includes("sidecars"))&&o&&i){let x=Pt({blobs:o,kzg:i});if(m.includes("blobVersionedHashes")){let b=ao({commitments:x,to:"hex"});u.blobVersionedHashes=b}if(m.includes("sidecars")){let b=_t({blobs:o,commitments:x,kzg:i}),v=fo({blobs:o,commitments:x,proofs:b,to:"hex"});u.sidecars=v}}if(m.includes("chainId")&&(u.chainId=await g()),(m.includes("fees")||m.includes("type"))&&typeof l>"u")try{u.type=uo(u)}catch{let x=Sa.get(e.uid);typeof x>"u"&&(x=typeof(await y())?.baseFeePerGas=="bigint",Sa.set(e.uid,x)),u.type=x?"eip1559":"legacy"}if(m.includes("fees"))if(u.type!=="legacy"&&u.type!=="eip2930"){if(typeof u.maxFeePerGas>"u"||typeof u.maxPriorityFeePerGas>"u"){let x=await y(),{maxFeePerGas:b,maxPriorityFeePerGas:v}=await no(e,{block:x,chain:n,request:u});if(typeof t.maxPriorityFeePerGas>"u"&&t.maxFeePerGas&&t.maxFeePerGas<v)throw new oo({maxPriorityFeePerGas:v});u.maxPriorityFeePerGas=v,u.maxFeePerGas=b}}else{if(typeof t.maxFeePerGas<"u"||typeof t.maxPriorityFeePerGas<"u")throw new qe;if(typeof t.gasPrice>"u"){let x=await y(),{gasPrice:b}=await no(e,{block:x,chain:n,request:u,type:"legacy"});u.gasPrice=b}}return m.includes("gas")&&typeof s>"u"&&(u.gas=await w(e,Ft,"estimateGas")({...u,account:f&&{address:f.address,type:"json-rpc"}})),Le(u),delete u.parameters,u}async function ho(e,{address:t,blockNumber:r,blockTag:o="latest"}){let n=r?P(r):void 0,s=await e.request({method:"eth_getBalance",params:[t,n||o]});return BigInt(s)}async function Ft(e,t){let{account:r=e.account}=t,o=r?J(r):void 0;try{let N=function(et){let{block:xe,request:Ie,rpcStateOverride:Ne}=et;return e.request({method:"eth_estimateGas",params:Ne?[Ie,xe??"latest",Ne]:xe?[Ie,xe]:[Ie]})},{accessList:n,authorizationList:s,blobs:i,blobVersionedHashes:c,blockNumber:p,blockTag:m,data:l,gas:f,gasPrice:u,maxFeePerBlobGas:d,maxFeePerGas:y,maxPriorityFeePerGas:h,nonce:g,value:x,stateOverride:b,...v}=await go(e,{...t,parameters:o?.type==="local"?void 0:["blobVersionedHashes"]}),S=(p?P(p):void 0)||m,k=qr(b),A=await(async()=>{if(v.to)return v.to;if(s&&s.length>0)return await da({authorization:s[0]}).catch(()=>{throw new T("`to` is required. Could not infer from `authorizationList`")})})();Le(t);let B=e.chain?.formatters?.transactionRequest?.format,D=(B||Ct)({...Gr(v,{format:B}),from:o?.address,accessList:n,authorizationList:s,blobs:i,blobVersionedHashes:c,data:l,gas:f,gasPrice:u,maxFeePerBlobGas:d,maxFeePerGas:y,maxPriorityFeePerGas:h,nonce:g,to:A,value:x}),O=BigInt(await N({block:S,request:D,rpcStateOverride:k}));if(s){let et=await ho(e,{address:D.from}),xe=await Promise.all(s.map(async Ie=>{let{contractAddress:Ne}=Ie,gn=await N({block:S,request:{authorizationList:void 0,data:l,from:o?.address,to:Ne,value:P(et)},rpcStateOverride:k}).catch(()=>100000n);return 2n*BigInt(gn)}));O+=xe.reduce((Ie,Ne)=>Ie+Ne,0n)}return O}catch(n){throw ga(n,{...t,account:o,chain:e.chain})}}async function Ia(e,t){let{abi:r,address:o,args:n,functionName:s,dataSuffix:i,...c}=t,p=G({abi:r,args:n,functionName:s});try{return await w(e,Ft,"estimateGas")({data:`${p}${i?i.replace("0x",""):""}`,to:o,...c})}catch(m){let l=c.account?J(c.account):void 0;throw le(m,{abi:r,address:o,args:n,docsPath:"/docs/contract/estimateContractGas",functionName:s,sender:l?.address})}}var Ta="/docs/contract/decodeEventLog";function Dt(e){let{abi:t,data:r,strict:o,topics:n}=e,s=o??!0,[i,...c]=n;if(!i)throw new Gs({docsPath:Ta});let p=(()=>t.length===1?t[0]:t.find(h=>h.type==="event"&&i===xt(Br(h))))();if(!(p&&"name"in p)||p.type!=="event")throw new Fr(i,{docsPath:Ta});let{name:m,inputs:l}=p,f=l?.some(h=>!("name"in h&&h.name)),u=f?[]:{},d=l.filter(h=>"indexed"in h&&h.indexed);for(let h=0;h<d.length;h++){let g=d[h],x=c[h];if(!x)throw new Ue({abiItem:p,param:g});u[f?h:g.name||h]=Rp({param:g,value:x})}let y=l.filter(h=>!("indexed"in h&&h.indexed));if(y.length>0){if(r&&r!=="0x")try{let h=An(y,r);if(h)if(f)u=[...u,...h];else for(let g=0;g<y.length;g++)u[y[g].name]=h[g]}catch(h){if(s)throw h instanceof Os||h instanceof si?new Be({abiItem:p,data:r,params:y,size:pe(r)}):h}else if(s)throw new Be({abiItem:p,data:"0x",params:y,size:0})}return{eventName:m,args:Object.values(u).length>0?u:void 0}}function Rp({param:e,value:t}){return e.type==="string"||e.type==="bytes"||e.type==="tuple"||e.type.match(/^(.*)\[(\d+)?\]$/)?t:(An([e],t)||[])[0]}function $t(e){let{abi:t,args:r,logs:o,strict:n=!0}=e,s=(()=>{if(e.eventName)return Array.isArray(e.eventName)?e.eventName:[e.eventName]})();return o.map(i=>{try{let c=t.find(m=>m.type==="event"&&i.topics[0]===xt(m));if(!c)return null;let p=Dt({...i,abi:[c],strict:n});return s&&!s.includes(p.eventName)||!Up({args:p.args,inputs:c.inputs,matchArgs:r})?null:{...p,...i}}catch(c){let p,m;if(c instanceof Fr)return null;if(c instanceof Be||c instanceof Ue){if(n)return null;p=c.abiItem.name,m=c.abiItem.inputs?.some(l=>!("name"in l&&l.name))}return{...i,args:m?[]:{},eventName:p}}}).filter(Boolean)}function Up(e){let{args:t,inputs:r,matchArgs:o}=e;if(!o)return!0;if(!t)return!1;function n(s,i,c){try{return s.type==="address"?kt(i,c):s.type==="string"||s.type==="bytes"?M(ze(i))===c:i===c}catch{return!1}}return Array.isArray(t)&&Array.isArray(o)?o.every((s,i)=>{if(s==null)return!0;let c=r[i];return c?(Array.isArray(s)?s:[s]).some(m=>n(c,m,t[i])):!1}):typeof t=="object"&&!Array.isArray(t)&&typeof o=="object"&&!Array.isArray(o)?Object.entries(o).every(([s,i])=>{if(i==null)return!0;let c=r.find(m=>m.name===s);return c?(Array.isArray(i)?i:[i]).some(m=>n(c,m,t[s])):!1}):!1}function Q(e,{args:t,eventName:r}={}){return{...e,blockHash:e.blockHash?e.blockHash:null,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,logIndex:e.logIndex?Number(e.logIndex):null,transactionHash:e.transactionHash?e.transactionHash:null,transactionIndex:e.transactionIndex?Number(e.transactionIndex):null,...r?{args:t,eventName:r}:{}}}async function Nt(e,{address:t,blockHash:r,fromBlock:o,toBlock:n,event:s,events:i,args:c,strict:p}={}){let m=p??!1,l=i??(s?[s]:void 0),f=[];l&&(f=[l.flatMap(h=>Ee({abi:[h],eventName:h.name,args:i?void 0:c}))],s&&(f=f[0]));let u;r?u=await e.request({method:"eth_getLogs",params:[{address:t,topics:f,blockHash:r}]}):u=await e.request({method:"eth_getLogs",params:[{address:t,topics:f,fromBlock:typeof o=="bigint"?P(o):o,toBlock:typeof n=="bigint"?P(n):n}]});let d=u.map(y=>Q(y));return l?$t({abi:l,args:c,logs:d,strict:m}):d}async function xo(e,t){let{abi:r,address:o,args:n,blockHash:s,eventName:i,fromBlock:c,toBlock:p,strict:m}=t,l=i?$r({abi:r,name:i}):void 0,f=l?void 0:r.filter(u=>u.type==="event");return w(e,Nt,"getLogs")({address:o,args:n,blockHash:s,event:l,events:f,fromBlock:c,toBlock:p,strict:m})}async function W(e,t){let{abi:r,address:o,args:n,functionName:s,...i}=t,c=G({abi:r,args:n,functionName:s});try{let{data:p}=await w(e,Ve,"call")({...i,data:c,to:o});return ie({abi:r,args:n,functionName:s,data:p||"0x"})}catch(p){throw le(p,{abi:r,address:o,args:n,docsPath:"/docs/contract/readContract",functionName:s})}}async function Pa(e,t){let{abi:r,address:o,args:n,dataSuffix:s,functionName:i,...c}=t,p=c.account?J(c.account):e.account,m=G({abi:r,args:n,functionName:i});try{let{data:l}=await w(e,Ve,"call")({batch:!1,data:`${m}${s?s.replace("0x",""):""}`,to:o,...c,account:p}),f=ie({abi:r,args:n,functionName:i,data:l||"0x"}),u=r.filter(d=>"name"in d&&d.name===t.functionName);return{result:f,request:{abi:u,address:o,args:n,dataSuffix:s,functionName:i,...c,account:p}}}catch(l){throw le(l,{abi:r,address:o,args:n,docsPath:"/docs/contract/simulateContract",functionName:i,sender:p?.address})}}var Qn=new Map,_a=new Map,zp=0;function te(e,t,r){let o=++zp,n=()=>Qn.get(e)||[],s=()=>{let l=n();Qn.set(e,l.filter(f=>f.id!==o))},i=()=>{let l=n();if(!l.some(u=>u.id===o))return;let f=_a.get(e);l.length===1&&f&&f(),s()},c=n();if(Qn.set(e,[...c,{id:o,fns:t}]),c&&c.length>0)return i;let p={};for(let l in t)p[l]=(...f)=>{let u=n();if(u.length!==0)for(let d of u)d.fns[l]?.(...f)};let m=r(p);return typeof m=="function"&&_a.set(e,m),i}async function ar(e){return new Promise(t=>setTimeout(t,e))}function Ce(e,{emitOnBegin:t,initialWaitTime:r,interval:o}){let n=!0,s=()=>n=!1;return(async()=>{let c;t&&(c=await e({unpoll:s}));let p=await r?.(c)??o;await ar(p);let m=async()=>{n&&(await e({unpoll:s}),await ar(o),m())};m()})(),s}var Hp=new Map,Lp=new Map;function Ba(e){let t=(n,s)=>({clear:()=>s.delete(n),get:()=>s.get(n),set:i=>s.set(n,i)}),r=t(e,Hp),o=t(e,Lp);return{clear:()=>{r.clear(),o.clear()},promise:r,response:o}}async function Fa(e,{cacheKey:t,cacheTime:r=Number.POSITIVE_INFINITY}){let o=Ba(t),n=o.response.get();if(n&&r>0&&new Date().getTime()-n.created.getTime()<r)return n.data;let s=o.promise.get();s||(s=e(),o.promise.set(s));try{let i=await s;return o.response.set({created:new Date,data:i}),i}finally{o.promise.clear()}}var Vp=e=>`blockNumber.${e}`;async function ke(e,{cacheTime:t=e.cacheTime}={}){let r=await Fa(()=>e.request({method:"eth_blockNumber"}),{cacheKey:Vp(e.uid),cacheTime:t});return BigInt(r)}async function We(e,{filter:t}){let r="strict"in t&&t.strict,o=await t.request({method:"eth_getFilterChanges",params:[t.id]});if(typeof o[0]=="string")return o;let n=o.map(s=>Q(s));return!("abi"in t)||!t.abi?n:$t({abi:t.abi,logs:n,strict:r})}async function Je(e,{filter:t}){return t.request({method:"eth_uninstallFilter",params:[t.id]})}function Da(e,t){let{abi:r,address:o,args:n,batch:s=!0,eventName:i,fromBlock:c,onError:p,onLogs:m,poll:l,pollingInterval:f=e.pollingInterval,strict:u}=t;return(()=>typeof l<"u"?l:typeof c=="bigint"?!0:!(e.transport.type==="webSocket"||e.transport.type==="fallback"&&e.transport.transports[0].config.type==="webSocket"))()?(()=>{let g=u??!1,x=U(["watchContractEvent",o,n,s,e.uid,i,f,g,c]);return te(x,{onLogs:m,onError:p},b=>{let v;c!==void 0&&(v=c-1n);let E,S=!1,k=Ce(async()=>{if(!S){try{E=await w(e,Xr,"createContractEventFilter")({abi:r,address:o,args:n,eventName:i,strict:g,fromBlock:c})}catch{}S=!0;return}try{let A;if(E)A=await w(e,We,"getFilterChanges")({filter:E});else{let B=await w(e,ke,"getBlockNumber")({});v&&v<B?A=await w(e,xo,"getContractEvents")({abi:r,address:o,args:n,eventName:i,fromBlock:v+1n,toBlock:B,strict:g}):A=[],v=B}if(A.length===0)return;if(s)b.onLogs(A);else for(let B of A)b.onLogs([B])}catch(A){E&&A instanceof st&&(S=!1),b.onError?.(A)}},{emitOnBegin:!0,interval:f});return async()=>{E&&await w(e,Je,"uninstallFilter")({filter:E}),k()}})})():(()=>{let g=u??!1,x=U(["watchContractEvent",o,n,s,e.uid,i,f,g]),b=!0,v=()=>b=!1;return te(x,{onLogs:m,onError:p},E=>((async()=>{try{let S=(()=>{if(e.transport.type==="fallback"){let B=e.transport.transports.find(F=>F.config.type==="webSocket");return B?B.value:e.transport}return e.transport})(),k=i?Ee({abi:r,eventName:i,args:n}):[],{unsubscribe:A}=await S.subscribe({params:["logs",{address:o,topics:k}],onData(B){if(!b)return;let F=B.result;try{let{eventName:D,args:N}=Dt({abi:r,data:F.data,topics:F.topics,strict:u}),O=Q(F,{args:N,eventName:D});E.onLogs([O])}catch(D){let N,O;if(D instanceof Be||D instanceof Ue){if(u)return;N=D.abiItem.name,O=D.abiItem.inputs?.some(xe=>!("name"in xe&&xe.name))}let et=Q(F,{args:O?[]:{},eventName:N});E.onLogs([et])}},onError(B){E.onError?.(B)}});v=A,b||v()}catch(S){p?.(S)}})(),()=>v()))})()}async function $a(e,{serializedTransaction:t}){return e.request({method:"eth_sendRawTransaction",params:[t]},{retryCount:0})}var yo=class extends T{constructor({address:t}){super(`No EIP-712 domain found on contract "${t}".`,{metaMessages:["Ensure that:",`- The contract is deployed at the address "${t}".`,"- `eip712Domain()` function exists on the contract.","- `eip712Domain()` function matches signature to ERC-5267 specification."],name:"Eip712DomainNotFoundError"})}};async function Na(e,t){let{address:r,factory:o,factoryData:n}=t;try{let[s,i,c,p,m,l,f]=await w(e,W,"readContract")({abi:Op,address:r,functionName:"eip712Domain",factory:o,factoryData:n});return{domain:{name:i,version:c,chainId:Number(p),verifyingContract:m,salt:l},extensions:f,fields:s}}catch(s){let i=s;throw i.name==="ContractFunctionExecutionError"&&i.cause.name==="ContractFunctionZeroDataError"?new yo({address:r}):i}}var Op=[{inputs:[],name:"eip712Domain",outputs:[{name:"fields",type:"bytes1"},{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"},{name:"salt",type:"bytes32"},{name:"extensions",type:"uint256[]"}],stateMutability:"view",type:"function"}];var bo=256,vo;function wo(e=11){if(!vo||bo+e>256*2){vo="",bo=0;for(let t=0;t<256;t++)vo+=(256+Math.random()*256|0).toString(16).substring(1)}return vo.substring(bo,bo+++e)}function Ma(e){let{batch:t,cacheTime:r=e.pollingInterval??4e3,ccipRead:o,key:n="base",name:s="Base Client",pollingInterval:i=4e3,type:c="base"}=e,p=e.chain,m=e.account?J(e.account):void 0,{config:l,request:f,value:u}=e.transport({chain:p,pollingInterval:i}),d={...l,...u},y={account:m,batch:t,cacheTime:r,ccipRead:o,chain:p,key:n,name:s,pollingInterval:i,request:f,transport:d,type:c,uid:wo()};function h(g){return x=>{let b=x(g);for(let E in y)delete b[E];let v={...g,...b};return Object.assign(v,{extend:h(v)})}}return Object.assign(y,{extend:h(y)})}var Eo=new Zs(8192);function Ra(e,{enabled:t=!0,id:r}){if(!t||!r)return e();if(Eo.get(r))return Eo.get(r);let o=e().finally(()=>Eo.delete(r));return Eo.set(r,o),o}function cr(e,{delay:t=100,retryCount:r=2,shouldRetry:o=()=>!0}={}){return new Promise((n,s)=>{let i=async({count:c=0}={})=>{let p=async({error:m})=>{let l=typeof t=="function"?t({count:c,error:m}):t;l&&await ar(l),i({count:c+1})};try{let m=await e();n(m)}catch(m){if(c<r&&await o({count:c,error:m}))return p({error:m});s(m)}};i()})}function Ua(e,t={}){return async(r,o={})=>{let{dedupe:n=!1,methods:s,retryDelay:i=150,retryCount:c=3,uid:p}={...t,...o},{method:m}=r;if(s?.exclude?.includes(m))throw new Xt(new Error("method not supported"),{method:m});if(s?.include&&!s.include.includes(m))throw new Xt(new Error("method not supported"),{method:m});let l=n?Zt(`${p}.${U(r)}`):void 0;return Ra(()=>cr(async()=>{try{return await e(r)}catch(f){let u=f;switch(u.code){case In.code:throw new In(u);case Tn.code:throw new Tn(u);case Pn.code:throw new Pn(u,{method:r.method});case _n.code:throw new _n(u);case wt.code:throw new wt(u);case st.code:throw new st(u);case Bn.code:throw new Bn(u);case Fn.code:throw new Fn(u);case Dn.code:throw new Dn(u);case Xt.code:throw new Xt(u,{method:r.method});case zr.code:throw new zr(u);case $n.code:throw new $n(u);case Hr.code:throw new Hr(u);case Nn.code:throw new Nn(u);case Mn.code:throw new Mn(u);case Rn.code:throw new Rn(u);case Un.code:throw new Un(u);case zn.code:throw new zn(u);case 5e3:throw new Hr(u);default:throw f instanceof T?f:new gi(u)}}},{delay:({count:f,error:u})=>{if(u&&u instanceof nt){let d=u?.headers?.get("Retry-After");if(d?.match(/\d/))return Number.parseInt(d)*1e3}return~~(1<<f)*i},retryCount:c,shouldRetry:({error:f})=>Gp(f)}),{enabled:n,id:l})}}function Gp(e){return"code"in e&&typeof e.code=="number"?e.code===-1||e.code===zr.code||e.code===wt.code:e instanceof nt&&e.status?e.status===403||e.status===408||e.status===413||e.status===429||e.status===500||e.status===502||e.status===503||e.status===504:!0}function za({key:e,methods:t,name:r,request:o,retryCount:n=3,retryDelay:s=150,timeout:i,type:c},p){let m=wo();return{config:{key:e,methods:t,name:r,request:o,retryCount:n,retryDelay:s,timeout:i,type:c},request:Ua(o,{methods:t,retryCount:n,retryDelay:s,uid:m}),value:p}}var Co=class extends T{constructor(){super("No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.",{docsPath:"/docs/clients/intro",name:"UrlRequiredError"})}};function Ha(e,{errorInstance:t=new Error("timed out"),timeout:r,signal:o}){return new Promise((n,s)=>{(async()=>{let i;try{let c=new AbortController;r>0&&(i=setTimeout(()=>{o?c.abort():s(t)},r)),n(await e({signal:c?.signal||null}))}catch(c){c?.name==="AbortError"&&s(t),s(c)}finally{clearTimeout(i)}})()})}function qp(){return{current:0,take(){return this.current++},reset(){this.current=0}}}var Xn=qp();function La(e,t={}){return{async request(r){let{body:o,onRequest:n=t.onRequest,onResponse:s=t.onResponse,timeout:i=t.timeout??1e4}=r,c={...t.fetchOptions??{},...r.fetchOptions??{}},{headers:p,method:m,signal:l}=c;try{let f=await Ha(async({signal:d})=>{let y={...c,body:Array.isArray(o)?U(o.map(b=>({jsonrpc:"2.0",id:b.id??Xn.take(),...b}))):U({jsonrpc:"2.0",id:o.id??Xn.take(),...o}),headers:{"Content-Type":"application/json",...p},method:m||"POST",signal:l||(i>0?d:null)},h=new Request(e,y),g=await n?.(h,y)??{...y,url:e};return await fetch(g.url??e,g)},{errorInstance:new Sn({body:o,url:e}),timeout:i,signal:!0});s&&await s(f);let u;if(f.headers.get("Content-Type")?.startsWith("application/json"))u=await f.json();else{u=await f.text();try{u=JSON.parse(u||"{}")}catch(d){if(f.ok)throw d;u={error:u}}}if(!f.ok)throw new nt({body:o,details:U(u.error)||f.statusText,headers:f.headers,status:f.status,url:e});return u}catch(f){throw f instanceof nt||f instanceof Sn?f:new nt({body:o,cause:f,url:e})}}}}function mt(e,t={}){let{batch:r,fetchOptions:o,key:n="http",methods:s,name:i="HTTP JSON-RPC",onFetchRequest:c,onFetchResponse:p,retryDelay:m,raw:l}=t;return({chain:f,retryCount:u,timeout:d})=>{let{batchSize:y=1e3,wait:h=0}=typeof r=="object"?r:{},g=t.retryCount??u,x=d??t.timeout??1e4,b=e||f?.rpcUrls.default.http[0];if(!b)throw new Co;let v=La(b,{fetchOptions:o,onRequest:c,onResponse:p,timeout:x});return za({key:n,methods:s,name:i,async request({method:E,params:S}){let k={method:E,params:S},{schedule:A}=ki({id:b,wait:h,shouldSplitBatch(N){return N.length>y},fn:N=>v.request({body:N}),sort:(N,O)=>N.id-O.id}),B=async N=>r?A(N):[await v.request({body:N})],[{error:F,result:D}]=await B(k);if(l)return{error:F,result:D};if(F)throw new Ur({body:k,error:F,url:b});return D},retryCount:g,retryDelay:m,timeout:x,type:"http"},{fetchOptions:o,url:b})}}function Mt(e,t){if(!(e instanceof T))return!1;let r=e.walk(o=>o instanceof Qt);return r instanceof Qt?!!(r.data?.errorName==="ResolverNotFound"||r.data?.errorName==="ResolverWildcardNotSupported"||r.data?.errorName==="ResolverNotContract"||r.data?.errorName==="ResolverError"||r.data?.errorName==="HttpError"||r.reason?.includes("Wildcard on non-extended resolvers is not supported")||t==="reverse"&&r.reason===ni[50]):!1}function ko(e){if(e.length!==66||e.indexOf("[")!==0||e.indexOf("]")!==65)return null;let t=`0x${e.slice(1,65)}`;return _e(t)?t:null}function Rt(e){let t=new Uint8Array(32).fill(0);if(!e)return H(t);let r=e.split(".");for(let o=r.length-1;o>=0;o-=1){let n=ko(r[o]),s=n?ze(n):M(He(r[o]),"bytes");t=M(yt([t,s]),"bytes")}return H(t)}function Va(e){return`[${e.slice(2)}]`}function Oa(e){let t=new Uint8Array(32).fill(0);return e?ko(e)||M(He(e)):H(t)}function Ye(e){let t=e.replace(/^\.|\.$/gm,"");if(t.length===0)return new Uint8Array(1);let r=new Uint8Array(He(t).byteLength+2),o=0,n=t.split(".");for(let s=0;s<n.length;s++){let i=He(n[s]);i.byteLength>255&&(i=He(Va(Oa(n[s])))),r[o]=i.length,r.set(i,o+1),o+=i.length+1}return r.byteLength!==o+1?r.slice(0,o+1):r}async function Ga(e,{blockNumber:t,blockTag:r,coinType:o,name:n,gatewayUrls:s,strict:i,universalResolverAddress:c}){let p=c;if(!p){if(!e.chain)throw new Error("client chain not configured. universalResolverAddress is required.");p=ve({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}try{let m=G({abi:Ln,functionName:"addr",...o!=null?{args:[Rt(n),BigInt(o)]}:{args:[Rt(n)]}}),l={address:p,abi:Kr,functionName:"resolve",args:[C(Ye(n)),m],blockNumber:t,blockTag:r},f=w(e,W,"readContract"),u=s?await f({...l,args:[...l.args,s]}):await f(l);if(u[0]==="0x")return null;let d=ie({abi:Ln,args:o!=null?[Rt(n),BigInt(o)]:void 0,functionName:"addr",data:u[0]});return d==="0x"||rt(d)==="0x00"?null:d}catch(m){if(i)throw m;if(Mt(m,"resolve"))return null;throw m}}var Ao=class extends T{constructor({data:t}){super("Unable to extract image from metadata. The metadata may be malformed or invalid.",{metaMessages:["- Metadata must be a JSON object with at least an `image`, `image_url` or `image_data` property.","",`Provided data: ${JSON.stringify(t)}`],name:"EnsAvatarInvalidMetadataError"})}},Ze=class extends T{constructor({reason:t}){super(`ENS NFT avatar URI is invalid. ${t}`,{name:"EnsAvatarInvalidNftUriError"})}},Ut=class extends T{constructor({uri:t}){super(`Unable to resolve ENS avatar URI "${t}". The URI may be malformed, invalid, or does not respond with a valid image.`,{name:"EnsAvatarUriResolutionError"})}},So=class extends T{constructor({namespace:t}){super(`ENS NFT avatar namespace "${t}" is not supported. Must be "erc721" or "erc1155".`,{name:"EnsAvatarUnsupportedNamespaceError"})}};var jp=/(?<protocol>https?:\/\/[^\/]*|ipfs:\/|ipns:\/|ar:\/)?(?<root>\/)?(?<subpath>ipfs\/|ipns\/)?(?<target>[\w\-.]+)(?<subtarget>\/.*)?/,Kp=/^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[A-Za-z2-7]{58,}|B[A-Z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|F[0-9A-F]{50,})(\/(?<target>[\w\-.]+))?(?<subtarget>\/.*)?$/,Wp=/^data:([a-zA-Z\-/+]*);base64,([^"].*)/,Jp=/^data:([a-zA-Z\-/+]*)?(;[a-zA-Z0-9].*?)?(,)/;async function Yp(e){try{let t=await fetch(e,{method:"HEAD"});return t.status===200?t.headers.get("content-type")?.startsWith("image/"):!1}catch(t){return typeof t=="object"&&typeof t.response<"u"||!globalThis.hasOwnProperty("Image")?!1:new Promise(r=>{let o=new Image;o.onload=()=>{r(!0)},o.onerror=()=>{r(!1)},o.src=e})}}function qa(e,t){return e?e.endsWith("/")?e.slice(0,-1):e:t}function es({uri:e,gatewayUrls:t}){let r=Wp.test(e);if(r)return{uri:e,isOnChain:!0,isEncoded:r};let o=qa(t?.ipfs,"https://ipfs.io"),n=qa(t?.arweave,"https://arweave.net"),s=e.match(jp),{protocol:i,subpath:c,target:p,subtarget:m=""}=s?.groups||{},l=i==="ipns:/"||c==="ipns/",f=i==="ipfs:/"||c==="ipfs/"||Kp.test(e);if(e.startsWith("http")&&!l&&!f){let d=e;return t?.arweave&&(d=e.replace(/https:\/\/arweave.net/g,t?.arweave)),{uri:d,isOnChain:!1,isEncoded:!1}}if((l||f)&&p)return{uri:`${o}/${l?"ipns":"ipfs"}/${p}${m}`,isOnChain:!1,isEncoded:!1};if(i==="ar:/"&&p)return{uri:`${n}/${p}${m||""}`,isOnChain:!1,isEncoded:!1};let u=e.replace(Jp,"");if(u.startsWith("<svg")&&(u=`data:image/svg+xml;base64,${btoa(u)}`),u.startsWith("data:")||u.startsWith("{"))return{uri:u,isOnChain:!0,isEncoded:!1};throw new Ut({uri:e})}function ts(e){if(typeof e!="object"||!("image"in e)&&!("image_url"in e)&&!("image_data"in e))throw new Ao({data:e});return e.image||e.image_url||e.image_data}async function ja({gatewayUrls:e,uri:t}){try{let r=await fetch(t).then(n=>n.json());return await Io({gatewayUrls:e,uri:ts(r)})}catch{throw new Ut({uri:t})}}async function Io({gatewayUrls:e,uri:t}){let{uri:r,isOnChain:o}=es({uri:t,gatewayUrls:e});if(o||await Yp(r))return r;throw new Ut({uri:t})}function Ka(e){let t=e;t.startsWith("did:nft:")&&(t=t.replace("did:nft:","").replace(/_/g,"/"));let[r,o,n]=t.split("/"),[s,i]=r.split(":"),[c,p]=o.split(":");if(!s||s.toLowerCase()!=="eip155")throw new Ze({reason:"Only EIP-155 supported"});if(!i)throw new Ze({reason:"Chain ID not found"});if(!p)throw new Ze({reason:"Contract address not found"});if(!n)throw new Ze({reason:"Token ID not found"});if(!c)throw new Ze({reason:"ERC namespace not found"});return{chainID:Number.parseInt(i),namespace:c.toLowerCase(),contractAddress:p,tokenID:n}}async function Wa(e,{nft:t}){if(t.namespace==="erc721")return W(e,{address:t.contractAddress,abi:[{name:"tokenURI",type:"function",stateMutability:"view",inputs:[{name:"tokenId",type:"uint256"}],outputs:[{name:"",type:"string"}]}],functionName:"tokenURI",args:[BigInt(t.tokenID)]});if(t.namespace==="erc1155")return W(e,{address:t.contractAddress,abi:[{name:"uri",type:"function",stateMutability:"view",inputs:[{name:"_id",type:"uint256"}],outputs:[{name:"",type:"string"}]}],functionName:"uri",args:[BigInt(t.tokenID)]});throw new So({namespace:t.namespace})}async function Ja(e,{gatewayUrls:t,record:r}){return/eip155:/i.test(r)?Zp(e,{gatewayUrls:t,record:r}):Io({uri:r,gatewayUrls:t})}async function Zp(e,{gatewayUrls:t,record:r}){let o=Ka(r),n=await Wa(e,{nft:o}),{uri:s,isOnChain:i,isEncoded:c}=es({uri:n,gatewayUrls:t});if(i&&(s.includes("data:application/json;base64,")||s.startsWith("{"))){let m=c?atob(s.replace("data:application/json;base64,","")):s,l=JSON.parse(m);return Io({uri:ts(l),gatewayUrls:t})}let p=o.tokenID;return o.namespace==="erc1155"&&(p=p.replace("0x","").padStart(64,"0")),ja({gatewayUrls:t,uri:s.replace(/(?:0x)?{id}/,p)})}async function To(e,{blockNumber:t,blockTag:r,name:o,key:n,gatewayUrls:s,strict:i,universalResolverAddress:c}){let p=c;if(!p){if(!e.chain)throw new Error("client chain not configured. universalResolverAddress is required.");p=ve({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}try{let m={address:p,abi:Kr,functionName:"resolve",args:[C(Ye(o)),G({abi:Hn,functionName:"text",args:[Rt(o),n]})],blockNumber:t,blockTag:r},l=w(e,W,"readContract"),f=s?await l({...m,args:[...m.args,s]}):await l(m);if(f[0]==="0x")return null;let u=ie({abi:Hn,functionName:"text",data:f[0]});return u===""?null:u}catch(m){if(i)throw m;if(Mt(m,"resolve"))return null;throw m}}async function Ya(e,{blockNumber:t,blockTag:r,assetGatewayUrls:o,name:n,gatewayUrls:s,strict:i,universalResolverAddress:c}){let p=await w(e,To,"getEnsText")({blockNumber:t,blockTag:r,key:"avatar",name:n,universalResolverAddress:c,gatewayUrls:s,strict:i});if(!p)return null;try{return await Ja(e,{record:p,gatewayUrls:o})}catch{return null}}async function Za(e,{address:t,blockNumber:r,blockTag:o,gatewayUrls:n,strict:s,universalResolverAddress:i}){let c=i;if(!c){if(!e.chain)throw new Error("client chain not configured. universalResolverAddress is required.");c=ve({blockNumber:r,chain:e.chain,contract:"ensUniversalResolver"})}let p=`${t.toLowerCase().substring(2)}.addr.reverse`;try{let m={address:c,abi:yi,functionName:"reverse",args:[C(Ye(p))],blockNumber:r,blockTag:o},l=w(e,W,"readContract"),[f,u]=n?await l({...m,args:[...m.args,n]}):await l(m);return t.toLowerCase()!==u.toLowerCase()?null:f}catch(m){if(s)throw m;if(Mt(m,"reverse"))return null;throw m}}async function Qa(e,{blockNumber:t,blockTag:r,name:o,universalResolverAddress:n}){let s=n;if(!s){if(!e.chain)throw new Error("client chain not configured. universalResolverAddress is required.");s=ve({blockNumber:t,chain:e.chain,contract:"ensUniversalResolver"})}let[i]=await w(e,W,"readContract")({address:s,abi:[{inputs:[{type:"bytes"}],name:"findResolver",outputs:[{type:"address"},{type:"bytes32"}],stateMutability:"view",type:"function"}],functionName:"findResolver",args:[C(Ye(o))],blockNumber:t,blockTag:r});return i}async function Po(e,t){let{account:r=e.account,blockNumber:o,blockTag:n="latest",blobs:s,data:i,gas:c,gasPrice:p,maxFeePerBlobGas:m,maxFeePerGas:l,maxPriorityFeePerGas:f,to:u,value:d,...y}=t,h=r?J(r):void 0;try{Le(t);let x=(o?P(o):void 0)||n,b=e.chain?.formatters?.transactionRequest?.format,E=(b||Ct)({...Gr(y,{format:b}),from:h?.address,blobs:s,data:i,gas:c,gasPrice:p,maxFeePerBlobGas:m,maxFeePerGas:l,maxPriorityFeePerGas:f,to:u,value:d}),S=await e.request({method:"eth_createAccessList",params:[E,x]});return{accessList:S.accessList,gasUsed:BigInt(S.gasUsed)}}catch(g){throw Ei(g,{...t,account:h,chain:e.chain})}}async function Xa(e){let t=Ge(e,{method:"eth_newBlockFilter"}),r=await e.request({method:"eth_newBlockFilter"});return{id:r,request:t(r),type:"block"}}async function _o(e,{address:t,args:r,event:o,events:n,fromBlock:s,strict:i,toBlock:c}={}){let p=n??(o?[o]:void 0),m=Ge(e,{method:"eth_newFilter"}),l=[];p&&(l=[p.flatMap(d=>Ee({abi:[d],eventName:d.name,args:r}))],o&&(l=l[0]));let f=await e.request({method:"eth_newFilter",params:[{address:t,fromBlock:typeof s=="bigint"?P(s):s,toBlock:typeof c=="bigint"?P(c):c,...l.length?{topics:l}:{}}]});return{abi:p,args:r,eventName:o?o.name:void 0,fromBlock:s,id:f,request:m(f),strict:!!i,toBlock:c,type:"event"}}async function Bo(e){let t=Ge(e,{method:"eth_newPendingTransactionFilter"}),r=await e.request({method:"eth_newPendingTransactionFilter"});return{id:r,request:t(r),type:"transaction"}}async function ec(e){let t=await e.request({method:"eth_blobBaseFee"});return BigInt(t)}async function tc(e,{blockHash:t,blockNumber:r,blockTag:o="latest"}={}){let n=r!==void 0?P(r):void 0,s;return t?s=await e.request({method:"eth_getBlockTransactionCountByHash",params:[t]},{dedupe:!0}):s=await e.request({method:"eth_getBlockTransactionCountByNumber",params:[n||o]},{dedupe:!!n}),q(s)}async function rs(e,{address:t,blockNumber:r,blockTag:o="latest"}){let n=r!==void 0?P(r):void 0,s=await e.request({method:"eth_getCode",params:[t,n||o]},{dedupe:!!n});if(s!=="0x")return s}function rc(e){return{baseFeePerGas:e.baseFeePerGas.map(t=>BigInt(t)),gasUsedRatio:e.gasUsedRatio,oldestBlock:BigInt(e.oldestBlock),reward:e.reward?.map(t=>t.map(r=>BigInt(r)))}}async function oc(e,{blockCount:t,blockNumber:r,blockTag:o="latest",rewardPercentiles:n}){let s=r?P(r):void 0,i=await e.request({method:"eth_feeHistory",params:[P(t),s||o,n]},{dedupe:!!s});return rc(i)}async function nc(e,{filter:t}){let r=t.strict??!1,n=(await t.request({method:"eth_getFilterLogs",params:[t.id]})).map(s=>Q(s));return t.abi?$t({abi:t.abi,logs:n,strict:r}):n}function ge(e){return{formatters:void 0,fees:void 0,serializers:void 0,...e}}var Fo=class extends T{constructor({domain:t}){super(`Invalid domain "${U(t)}".`,{metaMessages:["Must be a valid EIP-712 domain."]})}},Do=class extends T{constructor({primaryType:t,types:r}){super(`Invalid primary type \`${t}\` must be one of \`${JSON.stringify(Object.keys(r))}\`.`,{docsPath:"/api/glossary/Errors#typeddatainvalidprimarytypeerror",metaMessages:["Check that the primary type is a key in `types`."]})}},$o=class extends T{constructor({type:t}){super(`Struct type "${t}" is invalid.`,{metaMessages:["Struct type must not be a Solidity type."],name:"InvalidStructTypeError"})}};function sc(e){let{domain:t={},message:r,primaryType:o}=e,n={EIP712Domain:fc({domain:t}),...e.types};pc({domain:t,message:r,primaryType:o,types:n});let s=["0x1901"];return t&&s.push(Qp({domain:t,types:n})),o!=="EIP712Domain"&&s.push(ic({data:r,primaryType:o,types:n})),M(yt(s))}function Qp({domain:e,types:t}){return ic({data:e,primaryType:"EIP712Domain",types:t})}function ic({data:e,primaryType:t,types:r}){let o=ac({data:e,primaryType:t,types:r});return M(o)}function ac({data:e,primaryType:t,types:r}){let o=[{type:"bytes32"}],n=[Xp({primaryType:t,types:r})];for(let s of r[t]){let[i,c]=mc({types:r,name:s.name,type:s.type,value:e[s.name]});o.push(i),n.push(c)}return ot(o,n)}function Xp({primaryType:e,types:t}){let r=C(ef({primaryType:e,types:t}));return M(r)}function ef({primaryType:e,types:t}){let r="",o=cc({primaryType:e,types:t});o.delete(e);let n=[e,...Array.from(o).sort()];for(let s of n)r+=`${s}(${t[s].map(({name:i,type:c})=>`${c} ${i}`).join(",")})`;return r}function cc({primaryType:e,types:t},r=new Set){let n=e.match(/^\w*/u)?.[0];if(r.has(n)||t[n]===void 0)return r;r.add(n);for(let s of t[n])cc({primaryType:s.type,types:t},r);return r}function mc({types:e,name:t,type:r,value:o}){if(e[r]!==void 0)return[{type:"bytes32"},M(ac({data:o,primaryType:r,types:e}))];if(r==="bytes")return o=`0x${(o.length%2?"0":"")+o.slice(2)}`,[{type:"bytes32"},M(o)];if(r==="string")return[{type:"bytes32"},M(C(o))];if(r.lastIndexOf("]")===r.length-1){let n=r.slice(0,r.lastIndexOf("[")),s=o.map(i=>mc({name:t,type:n,types:e,value:i}));return[{type:"bytes32"},M(ot(s.map(([i])=>i),s.map(([,i])=>i)))]}return[{type:r},o]}function pc(e){let{domain:t,message:r,primaryType:o,types:n}=e,s=(i,c)=>{for(let p of i){let{name:m,type:l}=p,f=c[m],u=l.match(oi);if(u&&(typeof f=="number"||typeof f=="bigint")){let[h,g,x]=u;P(f,{signed:g==="int",size:Number.parseInt(x)/8})}if(l==="address"&&typeof f=="string"&&!se(f))throw new ne({address:f});let d=l.match(ri);if(d){let[h,g]=d;if(g&&pe(f)!==Number.parseInt(g))throw new qs({expectedSize:Number.parseInt(g),givenSize:pe(f)})}let y=n[l];y&&(tf(l),s(y,f))}};if(n.EIP712Domain&&t){if(typeof t!="object")throw new Fo({domain:t});s(n.EIP712Domain,t)}if(o!=="EIP712Domain")if(n[o])s(n[o],r);else throw new Do({primaryType:o,types:n})}function fc({domain:e}){return[typeof e?.name=="string"&&{name:"name",type:"string"},e?.version&&{name:"version",type:"string"},(typeof e?.chainId=="number"||typeof e?.chainId=="bigint")&&{name:"chainId",type:"uint256"},e?.verifyingContract&&{name:"verifyingContract",type:"address"},e?.salt&&{name:"salt",type:"bytes32"}].filter(Boolean)}function tf(e){if(e==="address"||e==="bool"||e==="string"||e.startsWith("bytes")||e.startsWith("uint")||e.startsWith("int"))throw new $o({type:e})}var rf={"0x0":"reverted","0x1":"success"};function os(e){let t={...e,blockNumber:e.blockNumber?BigInt(e.blockNumber):null,contractAddress:e.contractAddress?e.contractAddress:null,cumulativeGasUsed:e.cumulativeGasUsed?BigInt(e.cumulativeGasUsed):null,effectiveGasPrice:e.effectiveGasPrice?BigInt(e.effectiveGasPrice):null,gasUsed:e.gasUsed?BigInt(e.gasUsed):null,logs:e.logs?e.logs.map(r=>Q(r)):null,to:e.to?e.to:null,transactionIndex:e.transactionIndex?q(e.transactionIndex):null,status:e.status?rf[e.status]:null,type:e.type?Jn[e.type]||e.type:null};return e.blobGasPrice&&(t.blobGasPrice=BigInt(e.blobGasPrice)),e.blobGasUsed&&(t.blobGasUsed=BigInt(e.blobGasUsed)),t}var uc=Et("transactionReceipt",os);var lc=`Ethereum Signed Message:
59
+ `;function dc(e){let t=(()=>typeof e=="string"?Zt(e):typeof e.raw=="string"?e.raw:H(e.raw))(),r=Zt(`${lc}${pe(t)}`);return yt([r,t])}function No(e,t){return M(dc(e),t)}var Mo="0x6492649264926492649264926492649264926492649264926492649264926492";function gc(e){return ti(e,-32)===Mo}function hc(e){let{address:t,data:r,signature:o,to:n="hex"}=e,s=ue([ot([{type:"address"},{type:"bytes"},{type:"bytes"}],[t,r,o]),Mo]);return n==="hex"?s:X(s)}function xc(e){let{authorizationList:t}=e;if(t)for(let r of t){let{contractAddress:o,chainId:n}=r;if(!se(o))throw new ne({address:o});if(n<0)throw new er({chainId:n})}Ro(e)}function yc(e){let{blobVersionedHashes:t}=e;if(t){if(t.length===0)throw new Bt;for(let r of t){let o=pe(r),n=q(ei(r,0,1));if(o!==32)throw new mo({hash:r,size:o});if(n!==1)throw new po({hash:r,version:n})}}Ro(e)}function Ro(e){let{chainId:t,maxPriorityFeePerGas:r,maxFeePerGas:o,to:n}=e;if(t<=0)throw new er({chainId:t});if(n&&!se(n))throw new ne({address:n});if(o&&o>jr)throw new Lr({maxFeePerGas:o});if(r&&o&&r>o)throw new hi({maxFeePerGas:o,maxPriorityFeePerGas:r})}function bc(e){let{chainId:t,maxPriorityFeePerGas:r,gasPrice:o,maxFeePerGas:n,to:s}=e;if(t<=0)throw new er({chainId:t});if(s&&!se(s))throw new ne({address:s});if(r||n)throw new T("`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid EIP-2930 Transaction attribute.");if(o&&o>jr)throw new Lr({maxFeePerGas:o})}function vc(e){let{chainId:t,maxPriorityFeePerGas:r,gasPrice:o,maxFeePerGas:n,to:s}=e;if(s&&!se(s))throw new ne({address:s});if(typeof t<"u"&&t<=0)throw new er({chainId:t});if(r||n)throw new T("`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid Legacy Transaction attribute.");if(o&&o>jr)throw new Lr({maxFeePerGas:o})}function wc(e){if(!e||e.length===0)return[];let t=[];for(let r of e){let{contractAddress:o,chainId:n,nonce:s,...i}=r;t.push([n?C(n):"0x",o,s?C(s):"0x",...zt({},i)])}return t}function mr(e){if(!e||e.length===0)return[];let t=[];for(let r=0;r<e.length;r++){let{address:o,storageKeys:n}=e[r];for(let s=0;s<n.length;s++)if(n[s].length-2!==64)throw new pi({storageKey:n[s]});if(!se(o,{strict:!1}))throw new ne({address:o});t.push([o,n])}return t}function Ec(e,t){let r=uo(e);return r==="eip1559"?sf(e,t):r==="eip2930"?af(e,t):r==="eip4844"?nf(e,t):r==="eip7702"?of(e,t):cf(e,t)}function of(e,t){let{authorizationList:r,chainId:o,gas:n,nonce:s,to:i,value:c,maxFeePerGas:p,maxPriorityFeePerGas:m,accessList:l,data:f}=e;xc(e);let u=mr(l),d=wc(r);return ue(["0x04",de([C(o),s?C(s):"0x",m?C(m):"0x",p?C(p):"0x",n?C(n):"0x",i??"0x",c?C(c):"0x",f??"0x",u,d,...zt(e,t)])])}function nf(e,t){let{chainId:r,gas:o,nonce:n,to:s,value:i,maxFeePerBlobGas:c,maxFeePerGas:p,maxPriorityFeePerGas:m,accessList:l,data:f}=e;yc(e);let u=e.blobVersionedHashes,d=e.sidecars;if(e.blobs&&(typeof u>"u"||typeof d>"u")){let v=typeof e.blobs[0]=="string"?e.blobs:e.blobs.map(k=>H(k)),E=e.kzg,S=Pt({blobs:v,kzg:E});if(typeof u>"u"&&(u=ao({commitments:S})),typeof d>"u"){let k=_t({blobs:v,commitments:S,kzg:E});d=fo({blobs:v,commitments:S,proofs:k})}}let y=mr(l),h=[C(r),n?C(n):"0x",m?C(m):"0x",p?C(p):"0x",o?C(o):"0x",s??"0x",i?C(i):"0x",f??"0x",y,c?C(c):"0x",u??[],...zt(e,t)],g=[],x=[],b=[];if(d)for(let v=0;v<d.length;v++){let{blob:E,commitment:S,proof:k}=d[v];g.push(E),x.push(S),b.push(k)}return ue(["0x03",d?de([h,g,x,b]):de(h)])}function sf(e,t){let{chainId:r,gas:o,nonce:n,to:s,value:i,maxFeePerGas:c,maxPriorityFeePerGas:p,accessList:m,data:l}=e;Ro(e);let f=mr(m),u=[C(r),n?C(n):"0x",p?C(p):"0x",c?C(c):"0x",o?C(o):"0x",s??"0x",i?C(i):"0x",l??"0x",f,...zt(e,t)];return ue(["0x02",de(u)])}function af(e,t){let{chainId:r,gas:o,data:n,nonce:s,to:i,value:c,accessList:p,gasPrice:m}=e;bc(e);let l=mr(p),f=[C(r),s?C(s):"0x",m?C(m):"0x",o?C(o):"0x",i??"0x",c?C(c):"0x",n??"0x",l,...zt(e,t)];return ue(["0x01",de(f)])}function cf(e,t){let{chainId:r=0,gas:o,data:n,nonce:s,to:i,value:c,gasPrice:p}=e;vc(e);let m=[s?C(s):"0x",p?C(p):"0x",o?C(o):"0x",i??"0x",c?C(c):"0x",n??"0x"];if(t){let l=(()=>{if(t.v>=35n)return(t.v-35n)/2n>0?t.v:27n+(t.v===35n?0n:1n);if(r>0)return BigInt(r*2)+BigInt(35n+t.v-27n);let d=27n+(t.v===27n?0n:1n);if(t.v!==d)throw new ci({v:t.v});return d})(),f=rt(t.r),u=rt(t.s);m=[...m,C(l),f==="0x00"?"0x":f,u==="0x00"?"0x":u]}else r>0&&(m=[...m,C(r),"0x","0x"]);return de(m)}function zt(e,t){let r=t??e,{v:o,yParity:n}=r;if(typeof r.r>"u")return[];if(typeof r.s>"u")return[];if(typeof o>"u"&&typeof n>"u")return[];let s=rt(r.r),i=rt(r.s);return[(()=>typeof n=="number"?n?C(1):"0x":o===0n?"0x":o===1n?C(1):o===27n?"0x":C(1))(),s==="0x00"?"0x":s,i==="0x00"?"0x":i]}function mf(e){return e.map(t=>({...t,value:BigInt(t.value)}))}function Cc(e){return{...e,balance:e.balance?BigInt(e.balance):void 0,nonce:e.nonce?q(e.nonce):void 0,storageProof:e.storageProof?mf(e.storageProof):void 0}}async function kc(e,{address:t,blockNumber:r,blockTag:o,storageKeys:n}){let s=o??"latest",i=r!==void 0?P(r):void 0,c=await e.request({method:"eth_getProof",params:[t,n,i||s]});return Cc(c)}async function Ac(e,{address:t,blockNumber:r,blockTag:o="latest",slot:n}){let s=r!==void 0?P(r):void 0;return await e.request({method:"eth_getStorageAt",params:[t,n,s||o]})}async function Ht(e,{blockHash:t,blockNumber:r,blockTag:o,hash:n,index:s}){let i=o||"latest",c=r!==void 0?P(r):void 0,p=null;if(n?p=await e.request({method:"eth_getTransactionByHash",params:[n]},{dedupe:!0}):t?p=await e.request({method:"eth_getTransactionByBlockHashAndIndex",params:[t,P(s)]},{dedupe:!0}):(c||i)&&(p=await e.request({method:"eth_getTransactionByBlockNumberAndIndex",params:[c||i,P(s)]},{dedupe:!!c})),!p)throw new Mr({blockHash:t,blockNumber:r,blockTag:i,hash:n,index:s});return(e.chain?.formatters?.transaction?.format||ct)(p)}async function Sc(e,{hash:t,transactionReceipt:r}){let[o,n]=await Promise.all([w(e,ke,"getBlockNumber")({}),t?w(e,Ht,"getTransaction")({hash:t}):void 0]),s=r?.blockNumber||n?.blockNumber;return s?o-s+1n:0n}async function pr(e,{hash:t}){let r=await e.request({method:"eth_getTransactionReceipt",params:[t]},{dedupe:!0});if(!r)throw new Rr({hash:t});return(e.chain?.formatters?.transactionReceipt?.format||os)(r)}async function Ic(e,t){let{allowFailure:r=!0,batchSize:o,blockNumber:n,blockTag:s,multicallAddress:i,stateOverride:c}=t,p=t.contracts,m=o??(typeof e.batch?.multicall=="object"&&e.batch.multicall.batchSize||1024),l=i;if(!l){if(!e.chain)throw new Error("client chain not configured. multicallAddress is required.");l=ve({blockNumber:n,chain:e.chain,contract:"multicall3"})}let f=[[]],u=0,d=0;for(let g=0;g<p.length;g++){let{abi:x,address:b,args:v,functionName:E}=p[g];try{let S=G({abi:x,args:v,functionName:E});d+=(S.length-2)/2,m>0&&d>m&&f[u].length>0&&(u++,d=(S.length-2)/2,f[u]=[]),f[u]=[...f[u],{allowFailure:!0,callData:S,target:b}]}catch(S){let k=le(S,{abi:x,address:b,args:v,docsPath:"/docs/contract/multicall",functionName:E});if(!r)throw k;f[u]=[...f[u],{allowFailure:!0,callData:"0x",target:b}]}}let y=await Promise.allSettled(f.map(g=>w(e,W,"readContract")({abi:xi,address:l,args:[g],blockNumber:n,blockTag:s,functionName:"aggregate3",stateOverride:c}))),h=[];for(let g=0;g<y.length;g++){let x=y[g];if(x.status==="rejected"){if(!r)throw x.reason;for(let v=0;v<f[g].length;v++)h.push({status:"failure",error:x.reason,result:void 0});continue}let b=x.value;for(let v=0;v<b.length;v++){let{returnData:E,success:S}=b[v],{callData:k}=f[g][v],{abi:A,address:B,functionName:F,args:D}=p[h.length];try{if(k==="0x")throw new ht;if(!S)throw new vt({data:E});let N=ie({abi:A,args:D,data:E,functionName:F});h.push(r?{result:N,status:"success"}:N)}catch(N){let O=le(N,{abi:A,address:B,args:D,docsPath:"/docs/contract/multicall",functionName:F});if(!r)throw O;h.push({error:O,result:void 0,status:"failure"})}}}if(h.length!==p.length)throw new T("multicall results mismatch");return h}import{equalBytes as rk}from"@noble/curves/abstract/utils";import{equalBytes as ZC}from"@noble/curves/abstract/utils";var Tc="0.1.1";function Pc(){return Tc}var $=class extends Error{constructor(t,r={}){let o=(()=>{if(r.cause instanceof $){if(r.cause.details)return r.cause.details;if(r.cause.shortMessage)return r.cause.shortMessage}return r.cause?.message?r.cause.message:r.details})(),n=(()=>r.cause instanceof $&&r.cause.docsPath||r.docsPath)(),i=`https://oxlib.sh${n??""}`,c=[t||"An error occurred.",...r.metaMessages?["",...r.metaMessages]:[],...o||n?["",o?`Details: ${o}`:void 0,n?`See: ${i}`:void 0]:[]].filter(p=>typeof p=="string").join(`
60
+ `);super(c,r.cause?{cause:r.cause}:void 0),Object.defineProperty(this,"details",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"docs",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"docsPath",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"shortMessage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"cause",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"BaseError"}),Object.defineProperty(this,"version",{enumerable:!0,configurable:!0,writable:!0,value:`ox@${Pc()}`}),this.cause=r.cause,this.details=o,this.docs=i,this.docsPath=n,this.shortMessage=t}walk(t){return _c(this,t)}};function _c(e,t){return t?.(e)?e:e&&typeof e=="object"&&"cause"in e&&e.cause?_c(e.cause,t):t?null:e}var pf="#__bigint";function Bc(e,t,r){return JSON.stringify(e,(o,n)=>typeof t=="function"?t(o,n):typeof n=="bigint"?n.toString()+pf:n,r)}function Fc(e,t){if(ns(e)>t)throw new Uo({givenSize:ns(e),maxSize:t})}var De={zero:48,nine:57,A:65,F:70,a:97,f:102};function ss(e){if(e>=De.zero&&e<=De.nine)return e-De.zero;if(e>=De.A&&e<=De.F)return e-(De.A-10);if(e>=De.a&&e<=De.f)return e-(De.a-10)}function Dc(e,t={}){let{dir:r,size:o=32}=t;if(o===0)return e;if(e.length>o)throw new zo({size:e.length,targetSize:o,type:"Bytes"});let n=new Uint8Array(o);for(let s=0;s<o;s++){let i=r==="right";n[i?s:o-s-1]=e[i?s:e.length-s-1]}return n}function fr(e,t){if(j(e)>t)throw new Ho({givenSize:j(e),maxSize:t})}function $c(e,t){if(typeof t=="number"&&t>0&&t>j(e)-1)throw new ur({offset:t,position:"start",size:j(e)})}function Nc(e,t,r){if(typeof t=="number"&&typeof r=="number"&&j(e)!==r-t)throw new ur({offset:r,position:"end",size:j(e)})}function as(e,t={}){let{dir:r,size:o=32}=t;if(o===0)return e;let n=e.replace("0x","");if(n.length>o*2)throw new Lo({size:Math.ceil(n.length/2),targetSize:o,type:"Hex"});return`0x${n[r==="right"?"padEnd":"padStart"](o*2,"0")}`}var lf=new TextEncoder;function Rc(e){return e instanceof Uint8Array?e:typeof e=="string"?gf(e):df(e)}function df(e){return e instanceof Uint8Array?e:new Uint8Array(e)}function gf(e,t={}){let{size:r}=t,o=e;r&&(fr(e,r),o=Se(e,r));let n=o.slice(2);n.length%2&&(n=`0${n}`);let s=n.length/2,i=new Uint8Array(s);for(let c=0,p=0;c<s;c++){let m=ss(n.charCodeAt(p++)),l=ss(n.charCodeAt(p++));if(m===void 0||l===void 0)throw new $(`Invalid byte sequence ("${n[p-2]}${n[p-1]}" in "${n}").`);i[c]=m*16+l}return i}function Uc(e,t={}){let{size:r}=t,o=lf.encode(e);return typeof r=="number"?(Fc(o,r),hf(o,r)):o}function hf(e,t){return Dc(e,{dir:"right",size:t})}function ns(e){return e.length}var Uo=class extends ${constructor({givenSize:t,maxSize:r}){super(`Size cannot exceed \`${r}\` bytes. Given size: \`${t}\` bytes.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Bytes.SizeOverflowError"})}};var zo=class extends ${constructor({size:t,targetSize:r,type:o}){super(`${o.charAt(0).toUpperCase()}${o.slice(1).toLowerCase()} size (\`${t}\`) exceeds padding size (\`${r}\`).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Bytes.SizeExceedsPaddingSizeError"})}};var xf=new TextEncoder,yf=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,"0"));function bf(e,t={}){let{strict:r=!1}=t;if(!e)throw new Vo(e);if(typeof e!="string")throw new Vo(e);if(r&&!/^0x[0-9a-fA-F]*$/.test(e))throw new Oo(e);if(!e.startsWith("0x"))throw new Oo(e)}function re(...e){return`0x${e.reduce((t,r)=>t+r.replace("0x",""),"")}`}function Go(e,t={}){let r=`0x${Number(e)}`;return typeof t.size=="number"?(fr(r,t.size),$e(r,t.size)):r}function Lt(e,t={}){let r="";for(let n=0;n<e.length;n++)r+=yf[e[n]];let o=`0x${r}`;return typeof t.size=="number"?(fr(o,t.size),Se(o,t.size)):o}function V(e,t={}){let{signed:r,size:o}=t,n=BigInt(e),s;o?r?s=(1n<<BigInt(o)*8n-1n)-1n:s=2n**(BigInt(o)*8n)-1n:typeof e=="number"&&(s=BigInt(Number.MAX_SAFE_INTEGER));let i=typeof s=="bigint"&&r?-s-1n:0;if(s&&n>s||n<i){let m=typeof e=="bigint"?"n":"";throw new lr({max:s?`${s}${m}`:void 0,min:`${i}${m}`,signed:r,size:o,value:`${e}${m}`})}let p=`0x${(r&&n<0?(1n<<BigInt(o*8))+BigInt(n):n).toString(16)}`;return o?$e(p,o):p}function Vt(e,t={}){return Lt(xf.encode(e),t)}function $e(e,t){return as(e,{dir:"left",size:t})}function Se(e,t){return as(e,{dir:"right",size:t})}function Ot(e,t,r,o={}){let{strict:n}=o;$c(e,t);let s=`0x${e.replace("0x","").slice((t??0)*2,(r??e.length)*2)}`;return n&&Nc(s,t,r),s}function j(e){return Math.ceil((e.length-2)/2)}function cs(e,t={}){let{strict:r=!1}=t;try{return bf(e,{strict:r}),!0}catch{return!1}}var lr=class extends ${constructor({max:t,min:r,signed:o,size:n,value:s}){super(`Number \`${s}\` is not in safe${n?` ${n*8}-bit`:""}${o?" signed":" unsigned"} integer range ${t?`(\`${r}\` to \`${t}\`)`:`(above \`${r}\`)`}`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Hex.IntegerOutOfRangeError"})}};var Vo=class extends ${constructor(t){super(`Value \`${typeof t=="object"?Bc(t):t}\` of type \`${typeof t}\` is an invalid hex type.`,{metaMessages:['Hex types must be represented as `"0x${string}"`.']}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Hex.InvalidHexTypeError"})}},Oo=class extends ${constructor(t){super(`Value \`${t}\` is an invalid hex value.`,{metaMessages:['Hex values must start with `"0x"` and contain only hexadecimal characters (0-9, a-f, A-F).']}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Hex.InvalidHexValueError"})}};var Ho=class extends ${constructor({givenSize:t,maxSize:r}){super(`Size cannot exceed \`${r}\` bytes. Given size: \`${t}\` bytes.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Hex.SizeOverflowError"})}},ur=class extends ${constructor({offset:t,position:r,size:o}){super(`Slice ${r==="start"?"starting":"ending"} at offset \`${t}\` is out-of-bounds (size: \`${o}\`).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Hex.SliceOffsetOutOfBoundsError"})}},Lo=class extends ${constructor({size:t,targetSize:r,type:o}){super(`${o.charAt(0).toUpperCase()}${o.slice(1).toLowerCase()} size (\`${t}\`) exceeds padding size (\`${r}\`).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Hex.SizeExceedsPaddingSizeError"})}};function zc(e){return{address:e.address,amount:V(e.amount),index:V(e.index),validatorIndex:V(e.validatorIndex)}}function Hc(e){return{...typeof e.baseFeePerGas=="bigint"&&{baseFeePerGas:V(e.baseFeePerGas)},...typeof e.blobBaseFee=="bigint"&&{blobBaseFee:V(e.blobBaseFee)},...typeof e.feeRecipient=="string"&&{feeRecipient:e.feeRecipient},...typeof e.gasLimit=="bigint"&&{gasLimit:V(e.gasLimit)},...typeof e.number=="bigint"&&{number:V(e.number)},...typeof e.prevRandao=="bigint"&&{prevRandao:V(e.prevRandao)},...typeof e.time=="bigint"&&{time:V(e.time)},...e.withdrawals&&{withdrawals:e.withdrawals.map(zc)}}}async function dr(e,t){let{blockNumber:r,blockTag:o="latest",blocks:n,returnFullTransactions:s,traceTransfers:i,validation:c}=t;try{let p=[];for(let u of n){let d=u.blockOverrides?Hc(u.blockOverrides):void 0,y=u.calls.map(g=>{let x=g,b=x.account?J(x.account):void 0,v={...x,data:x.abi?G(x):x.data,from:x.from??b?.address};return Le(v),Ct(v)}),h=u.stateOverrides?qr(u.stateOverrides):void 0;p.push({blockOverrides:d,calls:y,stateOverrides:h})}let l=(r?P(r):void 0)||o;return(await e.request({method:"eth_simulateV1",params:[{blockStateCalls:p,returnFullTransactions:s,traceTransfers:i,validation:c},l]})).map((u,d)=>({...ir(u),calls:u.calls.map((y,h)=>{let{abi:g,args:x,functionName:b,to:v}=n[d].calls[h],E=y.error?.data??y.returnData,S=BigInt(y.gasUsed),k=y.logs?.map(D=>Q(D)),A=y.status==="0x1"?"success":"failure",B=g&&A==="success"?ie({abi:g,data:E,functionName:b}):null,F=(()=>{if(A==="success")return;let D;if(y.error?.data==="0x"?D=new ht:y.error&&(D=new vt(y.error)),!!D)return le(D,{abi:g??[],address:v,args:x,functionName:b??"<unknown>"})})();return{data:E,gasUsed:S,logs:k,status:A,...A==="success"?{result:B}:{error:F}}})}))}catch(p){let m=p,l=Or(m,{});throw l instanceof Vr?m:l}}function qo(e,t={}){let{as:r=typeof e=="string"?"Hex":"Bytes"}=t,o=Ys(Rc(e));return r==="Bytes"?o:Lt(o)}var jo=class extends Map{constructor(t){super(),Object.defineProperty(this,"maxSize",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.maxSize=t}get(t){let r=super.get(t);return super.has(t)&&r!==void 0&&(this.delete(t),super.set(t,r)),r}set(t,r){if(super.set(t,r),this.maxSize&&this.size>this.maxSize){let o=this.keys().next().value;o&&this.delete(o)}return this}};var Ef={checksum:new jo(8192)},Ko=Ef.checksum;var kf=/^0x[a-fA-F0-9]{40}$/;function Gt(e,t={}){let{strict:r=!0}=t;if(!kf.test(e))throw new Wo({address:e,cause:new ms});if(r){if(e.toLowerCase()===e)return;if(Vc(e)!==e)throw new Wo({address:e,cause:new ps})}}function Vc(e){if(Ko.has(e))return Ko.get(e);Gt(e,{strict:!1});let t=e.substring(2).toLowerCase(),r=qo(Uc(t),{as:"Bytes"}),o=t.split("");for(let s=0;s<40;s+=2)r[s>>1]>>4>=8&&o[s]&&(o[s]=o[s].toUpperCase()),(r[s>>1]&15)>=8&&o[s+1]&&(o[s+1]=o[s+1].toUpperCase());let n=`0x${o.join("")}`;return Ko.set(e,n),n}function Jo(e,t={}){let{strict:r=!0}=t??{};try{return Gt(e,{strict:r}),!0}catch{return!1}}var Wo=class extends ${constructor({address:t,cause:r}){super(`Address "${t}" is invalid.`,{cause:r}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Address.InvalidAddressError"})}},ms=class extends ${constructor(){super("Address is not a 20 byte (40 hexadecimal character) value."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Address.InvalidInputError"})}},ps=class extends ${constructor(){super("Address does not match its checksum counterpart."),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"Address.InvalidChecksumError"})}};function Zo(e){let t=!0,r="",o=0,n="",s=!1;for(let i=0;i<e.length;i++){let c=e[i];if(["(",")",","].includes(c)&&(t=!0),c==="("&&o++,c===")"&&o--,!!t){if(o===0){if(c===" "&&["event","function","error",""].includes(n))n="";else if(n+=c,c===")"){s=!0;break}continue}if(c===" "){e[i-1]!==","&&r!==","&&r!==",("&&(r="",t=!1);continue}n+=c,r+=c}}if(!s)throw new $("Unable to normalize signature.");return n}function Yo(e,t){let r=typeof e,o=t.type;switch(o){case"address":return Jo(e,{strict:!1});case"bool":return r==="boolean";case"function":return r==="string";case"string":return r==="string";default:return o==="tuple"&&"components"in t?Object.values(t.components).every((n,s)=>Yo(Object.values(e)[s],n)):/^u?int(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/.test(o)?r==="number"||r==="bigint":/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/.test(o)?r==="string"||e instanceof Uint8Array:/[a-z]+[1-9]{0,3}(\[[0-9]{0,}\])+$/.test(o)?Array.isArray(e)&&e.every(n=>Yo(n,{...t,type:o.replace(/(\[[0-9]{0,}\])$/,"")})):!1}}function us(e,t,r){for(let o in e){let n=e[o],s=t[o];if(n.type==="tuple"&&s.type==="tuple"&&"components"in n&&"components"in s)return us(n.components,s.components,r[o]);let i=[n.type,s.type];if((()=>i.includes("address")&&i.includes("bytes20")?!0:i.includes("address")&&i.includes("string")?Jo(r[o],{strict:!1}):i.includes("address")&&i.includes("bytes")?Jo(r[o],{strict:!1}):!1)())return i}}function Qo(e,t={}){let{prepare:r=!0}=t,o=(()=>Array.isArray(e)?wn(e):typeof e=="string"?wn(e):e)();return{...o,...r?{hash:qt(o)}:{}}}function Oc(e,t,r){let{args:o=[],prepare:n=!0}=r??{},s=cs(t,{strict:!1}),i=e.filter(m=>s?m.type==="function"||m.type==="error"?ds(m)===Ot(t,0,4):m.type==="event"?qt(m)===t:!1:"name"in m&&m.name===t);if(i.length===0)throw new ft({name:t});if(i.length===1)return{...i[0],...n?{hash:qt(i[0])}:{}};let c;for(let m of i){if(!("inputs"in m))continue;if(!o||o.length===0){if(!m.inputs||m.inputs.length===0)return{...m,...n?{hash:qt(m)}:{}};continue}if(!m.inputs||m.inputs.length===0||m.inputs.length!==o.length)continue;if(o.every((f,u)=>{let d="inputs"in m&&m.inputs[u];return d?Yo(f,d):!1})){if(c&&"inputs"in c&&c.inputs){let f=us(m.inputs,c.inputs,o);if(f)throw new ls({abiItem:m,type:f[0]},{abiItem:c,type:f[1]})}c=m}}let p=(()=>{if(c)return c;let[m,...l]=i;return{...m,overloads:l}})();if(!p)throw new ft({name:t});return{...p,...n?{hash:qt(p)}:{}}}function ds(e){return Ot(qt(e),0,4)}function Sf(e){let t=(()=>typeof e=="string"?e:_r(e))();return Zo(t)}function qt(e){return typeof e!="string"&&"hash"in e&&e.hash?e.hash:qo(Vt(Sf(e)))}var ls=class extends ${constructor(t,r){super("Found ambiguous types in overloaded ABI Items.",{metaMessages:[`\`${t.type}\` in \`${Zo(_r(t.abiItem))}\`, and`,`\`${r.type}\` in \`${Zo(_r(r.abiItem))}\``,"","These types encode differently and cannot be distinguished at runtime.","Remove one of the ambiguous items in the ABI."]}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiItem.AmbiguityError"})}},ft=class extends ${constructor({name:t,data:r,type:o="item"}){let n=(()=>t?` with name "${t}"`:r?` with data "${r}"`:"")();super(`ABI ${o}${n} not found.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiItem.NotFoundError"})}};var qc=/^(.*)\[([0-9]*)\]$/,jc=/^bytes([1-9]|1[0-9]|2[0-9]|3[0-2])?$/,Xo=/^(u?int)(8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?$/,Ck=2n**(8n-1n)-1n,kk=2n**(16n-1n)-1n,Ak=2n**(24n-1n)-1n,Sk=2n**(32n-1n)-1n,Ik=2n**(40n-1n)-1n,Tk=2n**(48n-1n)-1n,Pk=2n**(56n-1n)-1n,_k=2n**(64n-1n)-1n,Bk=2n**(72n-1n)-1n,Fk=2n**(80n-1n)-1n,Dk=2n**(88n-1n)-1n,$k=2n**(96n-1n)-1n,Nk=2n**(104n-1n)-1n,Mk=2n**(112n-1n)-1n,Rk=2n**(120n-1n)-1n,Uk=2n**(128n-1n)-1n,zk=2n**(136n-1n)-1n,Hk=2n**(144n-1n)-1n,Lk=2n**(152n-1n)-1n,Vk=2n**(160n-1n)-1n,Ok=2n**(168n-1n)-1n,Gk=2n**(176n-1n)-1n,qk=2n**(184n-1n)-1n,jk=2n**(192n-1n)-1n,Kk=2n**(200n-1n)-1n,Wk=2n**(208n-1n)-1n,Jk=2n**(216n-1n)-1n,Yk=2n**(224n-1n)-1n,Zk=2n**(232n-1n)-1n,Qk=2n**(240n-1n)-1n,Xk=2n**(248n-1n)-1n,eA=2n**(256n-1n)-1n,tA=-(2n**(8n-1n)),rA=-(2n**(16n-1n)),oA=-(2n**(24n-1n)),nA=-(2n**(32n-1n)),sA=-(2n**(40n-1n)),iA=-(2n**(48n-1n)),aA=-(2n**(56n-1n)),cA=-(2n**(64n-1n)),mA=-(2n**(72n-1n)),pA=-(2n**(80n-1n)),fA=-(2n**(88n-1n)),uA=-(2n**(96n-1n)),lA=-(2n**(104n-1n)),dA=-(2n**(112n-1n)),gA=-(2n**(120n-1n)),hA=-(2n**(128n-1n)),xA=-(2n**(136n-1n)),yA=-(2n**(144n-1n)),bA=-(2n**(152n-1n)),vA=-(2n**(160n-1n)),wA=-(2n**(168n-1n)),EA=-(2n**(176n-1n)),CA=-(2n**(184n-1n)),kA=-(2n**(192n-1n)),AA=-(2n**(200n-1n)),SA=-(2n**(208n-1n)),IA=-(2n**(216n-1n)),TA=-(2n**(224n-1n)),PA=-(2n**(232n-1n)),_A=-(2n**(240n-1n)),BA=-(2n**(248n-1n)),FA=-(2n**(256n-1n)),DA=2n**8n-1n,$A=2n**16n-1n,NA=2n**24n-1n,MA=2n**32n-1n,RA=2n**40n-1n,UA=2n**48n-1n,zA=2n**56n-1n,HA=2n**64n-1n,LA=2n**72n-1n,VA=2n**80n-1n,OA=2n**88n-1n,GA=2n**96n-1n,qA=2n**104n-1n,jA=2n**112n-1n,KA=2n**120n-1n,WA=2n**128n-1n,JA=2n**136n-1n,YA=2n**144n-1n,ZA=2n**152n-1n,QA=2n**160n-1n,XA=2n**168n-1n,eS=2n**176n-1n,tS=2n**184n-1n,rS=2n**192n-1n,oS=2n**200n-1n,nS=2n**208n-1n,sS=2n**216n-1n,iS=2n**224n-1n,aS=2n**232n-1n,cS=2n**240n-1n,mS=2n**248n-1n,pS=2n**256n-1n;function Kc({checksumAddress:e,parameters:t,values:r}){let o=[];for(let n=0;n<t.length;n++)o.push(gs({checksumAddress:e,parameter:t[n],value:r[n]}));return o}function gs({checksumAddress:e=!1,parameter:t,value:r}){let o=t,n=Nf(o.type);if(n){let[s,i]=n;return Pf(r,{checksumAddress:e,length:s,parameter:{...o,type:i}})}if(o.type==="tuple")return $f(r,{checksumAddress:e,parameter:o});if(o.type==="address")return Tf(r,{checksum:e});if(o.type==="bool")return Bf(r);if(o.type.startsWith("uint")||o.type.startsWith("int")){let s=o.type.startsWith("int"),[,,i="256"]=Xo.exec(o.type)??[];return Ff(r,{signed:s,size:Number(i)})}if(o.type.startsWith("bytes"))return _f(r,{type:o.type});if(o.type==="string")return Df(r);throw new hr(o.type)}function en(e){let t=0;for(let s=0;s<e.length;s++){let{dynamic:i,encoded:c}=e[s];i?t+=32:t+=j(c)}let r=[],o=[],n=0;for(let s=0;s<e.length;s++){let{dynamic:i,encoded:c}=e[s];i?(r.push(V(t+n,{size:32})),o.push(c),n+=j(c)):r.push(c)}return re(...r,...o)}function Tf(e,t){let{checksum:r=!1}=t;return Gt(e,{strict:r}),{dynamic:!1,encoded:$e(e.toLowerCase())}}function Pf(e,t){let{checksumAddress:r,length:o,parameter:n}=t,s=o===null;if(!Array.isArray(e))throw new rn(e);if(!s&&e.length!==o)throw new tn({expectedLength:o,givenLength:e.length,type:`${n.type}[${o}]`});let i=!1,c=[];for(let p=0;p<e.length;p++){let m=gs({checksumAddress:r,parameter:n,value:e[p]});m.dynamic&&(i=!0),c.push(m)}if(s||i){let p=en(c);if(s){let m=V(c.length,{size:32});return{dynamic:!0,encoded:c.length>0?re(m,p):m}}if(i)return{dynamic:!0,encoded:p}}return{dynamic:!1,encoded:re(...c.map(({encoded:p})=>p))}}function _f(e,{type:t}){let[,r]=t.split("bytes"),o=j(e);if(!r){let n=e;return o%32!==0&&(n=Se(n,Math.ceil((e.length-2)/2/32)*32)),{dynamic:!0,encoded:re($e(V(o,{size:32})),n)}}if(o!==Number.parseInt(r))throw new gr({expectedSize:Number.parseInt(r),value:e});return{dynamic:!1,encoded:Se(e)}}function Bf(e){if(typeof e!="boolean")throw new $(`Invalid boolean value: "${e}" (type: ${typeof e}). Expected: \`true\` or \`false\`.`);return{dynamic:!1,encoded:$e(Go(e))}}function Ff(e,{signed:t,size:r}){if(typeof r=="number"){let o=2n**(BigInt(r)-(t?1n:0n))-1n,n=t?-o-1n:0n;if(e>o||e<n)throw new lr({max:o.toString(),min:n.toString(),signed:t,size:r/8,value:e.toString()})}return{dynamic:!1,encoded:V(e,{size:32,signed:t})}}function Df(e){let t=Vt(e),r=Math.ceil(j(t)/32),o=[];for(let n=0;n<r;n++)o.push(Se(Ot(t,n*32,(n+1)*32)));return{dynamic:!0,encoded:re(Se(V(j(t),{size:32})),...o)}}function $f(e,t){let{checksumAddress:r,parameter:o}=t,n=!1,s=[];for(let i=0;i<o.components.length;i++){let c=o.components[i],p=Array.isArray(e)?i:c.name,m=gs({checksumAddress:r,parameter:c,value:e[p]});s.push(m),m.dynamic&&(n=!0)}return{dynamic:n,encoded:n?en(s):re(...s.map(({encoded:i})=>i))}}function Nf(e){let t=e.match(/^(.*)\[(\d+)?\]$/);return t?[t[2]?Number(t[2]):null,t[1]]:void 0}function nn(e,t,r){let{checksumAddress:o=!1}=r??{};if(e.length!==t.length)throw new on({expectedLength:e.length,givenLength:t.length});let n=Kc({checksumAddress:o,parameters:e,values:t}),s=en(n);return s.length===0?"0x":s}function xs(e,t){if(e.length!==t.length)throw new on({expectedLength:e.length,givenLength:t.length});let r=[];for(let o=0;o<e.length;o++){let n=e[o],s=t[o];r.push(xs.encode(n,s))}return re(...r)}(function(e){function t(r,o,n=!1){if(r==="address"){let p=o;return Gt(p),$e(p.toLowerCase(),n?32:0)}if(r==="string")return Vt(o);if(r==="bytes")return o;if(r==="bool")return $e(Go(o),n?32:1);let s=r.match(Xo);if(s){let[p,m,l="256"]=s,f=Number.parseInt(l)/8;return V(o,{size:n?32:f,signed:m==="int"})}let i=r.match(jc);if(i){let[p,m]=i;if(Number.parseInt(m)!==(o.length-2)/2)throw new gr({expectedSize:Number.parseInt(m),value:o});return Se(o,n?32:0)}let c=r.match(qc);if(c&&Array.isArray(o)){let[p,m]=c,l=[];for(let f=0;f<o.length;f++)l.push(t(m,o[f],!0));return l.length===0?"0x":re(...l)}throw new hr(r)}e.encode=t})(xs||(xs={}));var tn=class extends ${constructor({expectedLength:t,givenLength:r,type:o}){super(`Array length mismatch for type \`${o}\`. Expected: \`${t}\`. Given: \`${r}\`.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiParameters.ArrayLengthMismatchError"})}},gr=class extends ${constructor({expectedSize:t,value:r}){super(`Size of bytes "${r}" (bytes${j(r)}) does not match expected size (bytes${t}).`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiParameters.BytesSizeMismatchError"})}},on=class extends ${constructor({expectedLength:t,givenLength:r}){super(["ABI encoding parameters/values length mismatch.",`Expected length (parameters): ${t}`,`Given length (values): ${r}`].join(`
61
+ `)),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiParameters.LengthMismatchError"})}},rn=class extends ${constructor(t){super(`Value \`${t}\` is not a valid array.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiParameters.InvalidArrayError"})}},hr=class extends ${constructor(t){super(`Type \`${t}\` is not a valid ABI Type.`),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:"AbiParameters.InvalidTypeError"})}};function Wc(e,t){let{bytecode:r,args:o}=t;return re(r,e.inputs?.length&&o?.length?nn(e.inputs,o):"0x")}function Jc(e){return Qo(e)}function Yc(e,...t){let{overloads:r}=e,o=r?zf([e,...r],e.name,{args:t[0]}):e,n=Hf(o),s=t.length>0?nn(o.inputs,t[0]):void 0;return s?re(n,s):n}function ut(e,t={}){return Qo(e,t)}function zf(e,t,r){let o=Oc(e,t,r);if(o.type!=="function")throw new ft({name:t,type:"function"});return o}function Hf(e){return ds(e)}var Zc="0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",he="0x0000000000000000000000000000000000000000";var Vf="0x6080604052348015600e575f80fd5b5061016d8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c8063f8b2cb4f1461002d575b5f80fd5b610047600480360381019061004291906100db565b61005d565b604051610054919061011e565b60405180910390f35b5f8173ffffffffffffffffffffffffffffffffffffffff16319050919050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100aa82610081565b9050919050565b6100ba816100a0565b81146100c4575f80fd5b50565b5f813590506100d5816100b1565b92915050565b5f602082840312156100f0576100ef61007d565b5b5f6100fd848285016100c7565b91505092915050565b5f819050919050565b61011881610106565b82525050565b5f6020820190506101315f83018461010f565b9291505056fea26469706673582212203b9fe929fe995c7cf9887f0bdba8a36dd78e8b73f149b17d2d9ad7cd09d2dc6264736f6c634300081a0033";async function Qc(e,t){let{blockNumber:r,blockTag:o,calls:n,stateOverrides:s,traceAssetChanges:i,traceTransfers:c,validation:p}=t,m=t.account?J(t.account):void 0;if(i&&!m)throw new T("`account` is required when `traceAssetChanges` is true");let l=m?Wc(Jc("constructor(bytes, bytes)"),{bytecode:bi,args:[Vf,Yc(ut("function getBalance(address)"),[m.address])]}):void 0,f=i?await Promise.all(t.calls.map(async I=>{if(!I.data&&!I.abi)return;let{accessList:K}=await Po(e,{account:m.address,...I,data:I.abi?G(I):I.data});return K.map(({address:Wt,storageKeys:wr})=>wr.length>0?Wt:null)})).then(I=>I.flat().filter(Boolean)):[],u=s?.map(I=>I.address===m?.address?{...I,nonce:0}:I),d=await dr(e,{blockNumber:r,blockTag:o,blocks:[...i?[{calls:[{data:l}],stateOverrides:s},{calls:f.map((I,K)=>({abi:[ut("function balanceOf(address) returns (uint256)")],functionName:"balanceOf",args:[m.address],to:I,from:he,nonce:K})),stateOverrides:[{address:he,nonce:0}]}]:[],{calls:[...n,{}].map((I,K)=>({...I,from:m?.address,nonce:K})),stateOverrides:u},...i?[{calls:[{data:l}]},{calls:f.map((I,K)=>({abi:[ut("function balanceOf(address) returns (uint256)")],functionName:"balanceOf",args:[m.address],to:I,from:he,nonce:K})),stateOverrides:[{address:he,nonce:0}]},{calls:f.map((I,K)=>({to:I,abi:[ut("function decimals() returns (uint256)")],functionName:"decimals",from:he,nonce:K})),stateOverrides:[{address:he,nonce:0}]},{calls:f.map((I,K)=>({to:I,abi:[ut("function tokenURI(uint256) returns (string)")],functionName:"tokenURI",args:[0n],from:he,nonce:K})),stateOverrides:[{address:he,nonce:0}]},{calls:f.map((I,K)=>({to:I,abi:[ut("function symbol() returns (string)")],functionName:"symbol",from:he,nonce:K})),stateOverrides:[{address:he,nonce:0}]}]:[]],traceTransfers:c,validation:p}),y=i?d[2]:d[0],[h,g,,x,b,v,E,S]=i?d:[],{calls:k,...A}=y,B=k.slice(0,-1)??[],F=h?.calls??[],D=g?.calls??[],N=[...F,...D].map(I=>I.status==="success"?L(I.data):null),O=x?.calls??[],et=b?.calls??[],xe=[...O,...et].map(I=>I.status==="success"?L(I.data):null),Ie=(v?.calls??[]).map(I=>I.status==="success"?I.result:null),Ne=(S?.calls??[]).map(I=>I.status==="success"?I.result:null),gn=(E?.calls??[]).map(I=>I.status==="success"?I.result:null),hn=[];for(let[I,K]of xe.entries()){let Wt=N[I];if(typeof K!="bigint"||typeof Wt!="bigint")continue;let wr=Ie[I-1],Gm=Ne[I-1],qm=gn[I-1],Ss=(()=>I===0?{address:Zc,decimals:18,symbol:"ETH"}:{address:f[I-1],decimals:qm||wr?Number(wr??1):void 0,symbol:Gm??void 0})();hn.some(jm=>jm.token.address===Ss.address)||hn.push({token:Ss,value:{pre:Wt,post:K,diff:K-Wt}})}return{assetChanges:hn,block:A,results:B}}import{secp256k1 as Of}from"@noble/curves/secp256k1";function Xc({r:e,s:t,to:r="hex",v:o,yParity:n}){let s=(()=>{if(n===0||n===1)return n;if(o&&(o===27n||o===28n||o>=35n))return o%2n===0n?1:0;throw new Error("Invalid `v` or `yParity` value")})(),i=`0x${new Of.Signature(L(e),L(t)).toCompactHex()}${s===0?"1b":"1c"}`;return r==="hex"?i:X(i)}async function jt(e,t){let{address:r,factory:o,factoryData:n,hash:s,signature:i,universalSignatureVerifierAddress:c=e.chain?.contracts?.universalSignatureVerifier?.address,...p}=t,m=(()=>_e(i)?i:typeof i=="object"&&"r"in i&&"s"in i?Xc(i):H(i))(),l=await(async()=>!o&&!n||gc(m)?m:hc({address:o,data:n,signature:m}))();try{let f=c?{to:c,data:G({abi:Vn,functionName:"isValidSig",args:[r,s,l]}),...p}:{data:wi({abi:Vn,args:[r,s,l],bytecode:vi}),...p},{data:u}=await w(e,Ve,"call")(f);return Cn(u??"0x0")}catch(f){try{if(kt(Xs(r),await eo({hash:s,signature:i})))return!0}catch{}if(f instanceof ui)return!1;throw f}}async function em(e,{address:t,message:r,factory:o,factoryData:n,signature:s,...i}){let c=No(r);return jt(e,{address:t,factory:o,factoryData:n,hash:c,signature:s,...i})}async function tm(e,t){let{address:r,factory:o,factoryData:n,signature:s,message:i,primaryType:c,types:p,domain:m,...l}=t,f=sc({message:i,primaryType:c,types:p,domain:m});return jt(e,{address:r,factory:o,factoryData:n,hash:f,signature:s,...l})}function sn(e,{emitOnBegin:t=!1,emitMissed:r=!1,onBlockNumber:o,onError:n,poll:s,pollingInterval:i=e.pollingInterval}){let c=(()=>typeof s<"u"?s:!(e.transport.type==="webSocket"||e.transport.type==="fallback"&&e.transport.transports[0].config.type==="webSocket"))(),p;return c?(()=>{let f=U(["watchBlockNumber",e.uid,t,r,i]);return te(f,{onBlockNumber:o,onError:n},u=>Ce(async()=>{try{let d=await w(e,ke,"getBlockNumber")({cacheTime:0});if(p){if(d===p)return;if(d-p>1&&r)for(let y=p+1n;y<d;y++)u.onBlockNumber(y,p),p=y}(!p||d>p)&&(u.onBlockNumber(d,p),p=d)}catch(d){u.onError?.(d)}},{emitOnBegin:t,interval:i}))})():(()=>{let f=U(["watchBlockNumber",e.uid,t,r]);return te(f,{onBlockNumber:o,onError:n},u=>{let d=!0,y=()=>d=!1;return(async()=>{try{let h=(()=>{if(e.transport.type==="fallback"){let x=e.transport.transports.find(b=>b.config.type==="webSocket");return x?x.value:e.transport}return e.transport})(),{unsubscribe:g}=await h.subscribe({params:["newHeads"],onData(x){if(!d)return;let b=L(x.result?.number);u.onBlockNumber(b,p),p=b},onError(x){u.onError?.(x)}});y=g,d||y()}catch(h){n?.(h)}})(),()=>y()})})()}async function rm(e,{confirmations:t=1,hash:r,onReplaced:o,pollingInterval:n=e.pollingInterval,retryCount:s=6,retryDelay:i=({count:p})=>~~(1<<p)*200,timeout:c=18e4}){let p=U(["waitForTransactionReceipt",e.uid,r]),m,l,f,u=!1,{promise:d,resolve:y,reject:h}=Ci(),g=c?setTimeout(()=>h(new fi({hash:r})),c):void 0,x=te(p,{onReplaced:o,resolve:y,reject:h},b=>{let v=w(e,sn,"watchBlockNumber")({emitMissed:!0,emitOnBegin:!0,poll:!0,pollingInterval:n,async onBlockNumber(E){let S=A=>{clearTimeout(g),v(),A(),x()},k=E;if(!u)try{if(f){if(t>1&&(!f.blockNumber||k-f.blockNumber+1n<t))return;S(()=>b.resolve(f));return}if(m||(u=!0,await cr(async()=>{m=await w(e,Ht,"getTransaction")({hash:r}),m.blockNumber&&(k=m.blockNumber)},{delay:i,retryCount:s}),u=!1),f=await w(e,pr,"getTransactionReceipt")({hash:r}),t>1&&(!f.blockNumber||k-f.blockNumber+1n<t))return;S(()=>b.resolve(f))}catch(A){if(A instanceof Mr||A instanceof Rr){if(!m){u=!1;return}try{l=m,u=!0;let B=await cr(()=>w(e,Z,"getBlock")({blockNumber:k,includeTransactions:!0}),{delay:i,retryCount:s,shouldRetry:({error:N})=>N instanceof It});u=!1;let F=B.transactions.find(({from:N,nonce:O})=>N===l.from&&O===l.nonce);if(!F||(f=await w(e,pr,"getTransactionReceipt")({hash:F.hash}),t>1&&(!f.blockNumber||k-f.blockNumber+1n<t)))return;let D="replaced";F.to===l.to&&F.value===l.value&&F.input===l.input?D="repriced":F.from===F.to&&F.value===0n&&(D="cancelled"),S(()=>{b.onReplaced?.({reason:D,replacedTransaction:l,transaction:F,transactionReceipt:f}),b.resolve(f)})}catch(B){S(()=>b.reject(B))}}else S(()=>b.reject(A))}}})});return d}function om(e,{blockTag:t="latest",emitMissed:r=!1,emitOnBegin:o=!1,onBlock:n,onError:s,includeTransactions:i,poll:c,pollingInterval:p=e.pollingInterval}){let m=(()=>typeof c<"u"?c:!(e.transport.type==="webSocket"||e.transport.type==="fallback"&&e.transport.transports[0].config.type==="webSocket"))(),l=i??!1,f;return m?(()=>{let y=U(["watchBlocks",e.uid,t,r,o,l,p]);return te(y,{onBlock:n,onError:s},h=>Ce(async()=>{try{let g=await w(e,Z,"getBlock")({blockTag:t,includeTransactions:l});if(g.number&&f?.number){if(g.number===f.number)return;if(g.number-f.number>1&&r)for(let x=f?.number+1n;x<g.number;x++){let b=await w(e,Z,"getBlock")({blockNumber:x,includeTransactions:l});h.onBlock(b,f),f=b}}(!f?.number||t==="pending"&&!g?.number||g.number&&g.number>f.number)&&(h.onBlock(g,f),f=g)}catch(g){h.onError?.(g)}},{emitOnBegin:o,interval:p}))})():(()=>{let y=!0,h=!0,g=()=>y=!1;return(async()=>{try{o&&w(e,Z,"getBlock")({blockTag:t,includeTransactions:l}).then(v=>{y&&h&&(n(v,void 0),h=!1)});let x=(()=>{if(e.transport.type==="fallback"){let v=e.transport.transports.find(E=>E.config.type==="webSocket");return v?v.value:e.transport}return e.transport})(),{unsubscribe:b}=await x.subscribe({params:["newHeads"],async onData(v){if(!y)return;let E=await w(e,Z,"getBlock")({blockNumber:v.blockNumber,includeTransactions:l}).catch(()=>{});y&&(n(E,f),h=!1,f=E)},onError(v){s?.(v)}});g=b,y||g()}catch(x){s?.(x)}})(),()=>g()})()}function nm(e,{address:t,args:r,batch:o=!0,event:n,events:s,fromBlock:i,onError:c,onLogs:p,poll:m,pollingInterval:l=e.pollingInterval,strict:f}){let u=(()=>typeof m<"u"?m:typeof i=="bigint"?!0:!(e.transport.type==="webSocket"||e.transport.type==="fallback"&&e.transport.transports[0].config.type==="webSocket"))(),d=f??!1;return u?(()=>{let g=U(["watchEvent",t,r,o,e.uid,n,l,i]);return te(g,{onLogs:p,onError:c},x=>{let b;i!==void 0&&(b=i-1n);let v,E=!1,S=Ce(async()=>{if(!E){try{v=await w(e,_o,"createEventFilter")({address:t,args:r,event:n,events:s,strict:d,fromBlock:i})}catch{}E=!0;return}try{let k;if(v)k=await w(e,We,"getFilterChanges")({filter:v});else{let A=await w(e,ke,"getBlockNumber")({});b&&b!==A?k=await w(e,Nt,"getLogs")({address:t,args:r,event:n,events:s,fromBlock:b+1n,toBlock:A}):k=[],b=A}if(k.length===0)return;if(o)x.onLogs(k);else for(let A of k)x.onLogs([A])}catch(k){v&&k instanceof st&&(E=!1),x.onError?.(k)}},{emitOnBegin:!0,interval:l});return async()=>{v&&await w(e,Je,"uninstallFilter")({filter:v}),S()}})})():(()=>{let g=!0,x=()=>g=!1;return(async()=>{try{let b=(()=>{if(e.transport.type==="fallback"){let k=e.transport.transports.find(A=>A.config.type==="webSocket");return k?k.value:e.transport}return e.transport})(),v=s??(n?[n]:void 0),E=[];v&&(E=[v.flatMap(A=>Ee({abi:[A],eventName:A.name,args:r}))],n&&(E=E[0]));let{unsubscribe:S}=await b.subscribe({params:["logs",{address:t,topics:E}],onData(k){if(!g)return;let A=k.result;try{let{eventName:B,args:F}=Dt({abi:v??[],data:A.data,topics:A.topics,strict:d}),D=Q(A,{args:F,eventName:B});p([D])}catch(B){let F,D;if(B instanceof Be||B instanceof Ue){if(f)return;F=B.abiItem.name,D=B.abiItem.inputs?.some(O=>!("name"in O&&O.name))}let N=Q(A,{args:D?[]:{},eventName:F});p([N])}},onError(k){c?.(k)}});x=S,g||x()}catch(b){c?.(b)}})(),()=>x()})()}function sm(e,{batch:t=!0,onError:r,onTransactions:o,poll:n,pollingInterval:s=e.pollingInterval}){return(typeof n<"u"?n:e.transport.type!=="webSocket")?(()=>{let m=U(["watchPendingTransactions",e.uid,t,s]);return te(m,{onTransactions:o,onError:r},l=>{let f,u=Ce(async()=>{try{if(!f)try{f=await w(e,Bo,"createPendingTransactionFilter")({});return}catch(y){throw u(),y}let d=await w(e,We,"getFilterChanges")({filter:f});if(d.length===0)return;if(t)l.onTransactions(d);else for(let y of d)l.onTransactions([y])}catch(d){l.onError?.(d)}},{emitOnBegin:!0,interval:s});return async()=>{f&&await w(e,Je,"uninstallFilter")({filter:f}),u()}})})():(()=>{let m=!0,l=()=>m=!1;return(async()=>{try{let{unsubscribe:f}=await e.transport.subscribe({params:["newPendingTransactions"],onData(u){if(!m)return;let d=u.result;o([d])},onError(u){r?.(u)}});l=f,m||l()}catch(f){r?.(f)}})(),()=>l()})()}function im(e){let{scheme:t,statement:r,...o}=e.match(Gf)?.groups??{},{chainId:n,expirationTime:s,issuedAt:i,notBefore:c,requestId:p,...m}=e.match(qf)?.groups??{},l=e.split("Resources:")[1]?.split(`
62
+ - `).slice(1);return{...o,...m,...n?{chainId:Number(n)}:{},...s?{expirationTime:new Date(s)}:{},...i?{issuedAt:new Date(i)}:{},...c?{notBefore:new Date(c)}:{},...p?{requestId:p}:{},...l?{resources:l}:{},...t?{scheme:t}:{},...r?{statement:r}:{}}}var Gf=/^(?:(?<scheme>[a-zA-Z][a-zA-Z0-9+-.]*):\/\/)?(?<domain>[a-zA-Z0-9+-.]*(?::[0-9]{1,5})?) (?:wants you to sign in with your Ethereum account:\n)(?<address>0x[a-fA-F0-9]{40})\n\n(?:(?<statement>.*)\n\n)?/,qf=/(?:URI: (?<uri>.+))\n(?:Version: (?<version>.+))\n(?:Chain ID: (?<chainId>\d+))\n(?:Nonce: (?<nonce>[a-zA-Z0-9]+))\n(?:Issued At: (?<issuedAt>.+))(?:\nExpiration Time: (?<expirationTime>.+))?(?:\nNot Before: (?<notBefore>.+))?(?:\nRequest ID: (?<requestId>.+))?/;function am(e){let{address:t,domain:r,message:o,nonce:n,scheme:s,time:i=new Date}=e;if(r&&o.domain!==r||n&&o.nonce!==n||s&&o.scheme!==s||o.expirationTime&&i>=o.expirationTime||o.notBefore&&i<o.notBefore)return!1;try{if(!o.address||t&&!kt(o.address,t))return!1}catch{return!1}return!0}async function cm(e,t){let{address:r,domain:o,message:n,nonce:s,scheme:i,signature:c,time:p=new Date,...m}=t,l=im(n);if(!l.address||!am({address:r,domain:o,message:l,nonce:s,scheme:i,time:p}))return!1;let u=No(n);return jt(e,{address:l.address,hash:u,signature:c,...m})}function mm(e){return{call:t=>Ve(e,t),createAccessList:t=>Po(e,t),createBlockFilter:()=>Xa(e),createContractEventFilter:t=>Xr(e,t),createEventFilter:t=>_o(e,t),createPendingTransactionFilter:()=>Bo(e),estimateContractGas:t=>Ia(e,t),estimateGas:t=>Ft(e,t),getBalance:t=>ho(e,t),getBlobBaseFee:()=>ec(e),getBlock:t=>Z(e,t),getBlockNumber:t=>ke(e,t),getBlockTransactionCount:t=>tc(e,t),getBytecode:t=>rs(e,t),getChainId:()=>lo(e),getCode:t=>rs(e,t),getContractEvents:t=>xo(e,t),getEip712Domain:t=>Na(e,t),getEnsAddress:t=>Ga(e,t),getEnsAvatar:t=>Ya(e,t),getEnsName:t=>Za(e,t),getEnsResolver:t=>Qa(e,t),getEnsText:t=>To(e,t),getFeeHistory:t=>oc(e,t),estimateFeesPerGas:t=>ba(e,t),getFilterChanges:t=>We(e,t),getFilterLogs:t=>nc(e,t),getGasPrice:()=>Tt(e),getLogs:t=>Nt(e,t),getProof:t=>kc(e,t),estimateMaxPriorityFeePerGas:t=>ya(e,t),getStorageAt:t=>Ac(e,t),getTransaction:t=>Ht(e,t),getTransactionConfirmations:t=>Sc(e,t),getTransactionCount:t=>so(e,t),getTransactionReceipt:t=>pr(e,t),multicall:t=>Ic(e,t),prepareTransactionRequest:t=>go(e,t),readContract:t=>W(e,t),sendRawTransaction:t=>$a(e,t),simulate:t=>dr(e,t),simulateBlocks:t=>dr(e,t),simulateCalls:t=>Qc(e,t),simulateContract:t=>Pa(e,t),verifyMessage:t=>em(e,t),verifySiweMessage:t=>cm(e,t),verifyTypedData:t=>tm(e,t),uninstallFilter:t=>Je(e,t),waitForTransactionReceipt:t=>rm(e,t),watchBlocks:t=>om(e,t),watchBlockNumber:t=>sn(e,t),watchContractEvent:t=>Da(e,t),watchEvent:t=>nm(e,t),watchPendingTransactions:t=>sm(e,t)}}function lt(e){let{key:t="public",name:r="Public Client"}=e;return Ma({...e,key:t,name:r,type:"publicClient"}).extend(mm)}import{ethers as Kt}from"ethers";import Yf from"node:path";import dm from"inquirer";import Zf from"dotenv";import VT from"fs-extra";var pm={gasPriceOracle:{address:"0x420000000000000000000000000000000000000F"},l1Block:{address:"0x4200000000000000000000000000000000000015"},l2CrossDomainMessenger:{address:"0x4200000000000000000000000000000000000007"},l2Erc721Bridge:{address:"0x4200000000000000000000000000000000000014"},l2StandardBridge:{address:"0x4200000000000000000000000000000000000010"},l2ToL1MessagePasser:{address:"0x4200000000000000000000000000000000000016"}};var fm={block:xa({format(e){return{transactions:e.transactions?.map(r=>{if(typeof r=="string")return r;let o=ct(r);return o.typeHex==="0x7e"&&(o.isSystemTx=r.isSystemTx,o.mint=r.mint?L(r.mint):void 0,o.sourceHash=r.sourceHash,o.type="deposit"),o}),stateRoot:e.stateRoot}}}),transaction:ha({format(e){let t={};return e.type==="0x7e"&&(t.isSystemTx=e.isSystemTx,t.mint=e.mint?L(e.mint):void 0,t.sourceHash=e.sourceHash,t.type="deposit"),t}}),transactionReceipt:uc({format(e){return{l1GasPrice:e.l1GasPrice?L(e.l1GasPrice):null,l1GasUsed:e.l1GasUsed?L(e.l1GasUsed):null,l1Fee:e.l1Fee?L(e.l1Fee):null,l1FeeScalar:e.l1FeeScalar?Number(e.l1FeeScalar):null}}})};function jf(e,t){return Wf(e)?Kf(e):Ec(e,t)}var um={transaction:jf};function Kf(e){Jf(e);let{sourceHash:t,data:r,from:o,gas:n,isSystemTx:s,mint:i,to:c,value:p}=e,m=[t,o,c??"0x",i?C(i):"0x",p?C(p):"0x",n?C(n):"0x",s?"0x1":"0x",r??"0x"];return ue(["0x7e",de(m)])}function Wf(e){return e.type==="deposit"||typeof e.sourceHash<"u"}function Jf(e){let{from:t,to:r}=e;if(t&&!se(t))throw new ne({address:t});if(r&&!se(r))throw new ne({address:r})}var ys={contracts:pm,formatters:fm,serializers:um};var an=ge({id:31337,name:"Anvil",nativeCurrency:{decimals:18,name:"Ether",symbol:"ETH"},rpcUrls:{default:{http:["http://127.0.0.1:8545"],webSocket:["ws://127.0.0.1:8545"]}}});var xr=1,cn=ge({...ys,id:8453,name:"Base",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://mainnet.base.org"]}},blockExplorers:{default:{name:"Basescan",url:"https://basescan.org",apiUrl:"https://api.basescan.org/api"}},contracts:{...ys.contracts,disputeGameFactory:{[xr]:{address:"0x43edB88C4B80fDD2AdFF2412A7BebF9dF42cB40e"}},l2OutputOracle:{[xr]:{address:"0x56315b90c40730925ec5485cf004d835058518A0"}},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:5022},portal:{[xr]:{address:"0x49048044D57e1C92A77f79988d21Fa8fAF74E97e",blockCreated:17482143}},l1StandardBridge:{[xr]:{address:"0x3154Cf16ccdb4C6d922629664174b904d80F2C35",blockCreated:17482143}}},sourceId:xr});var mn=ge({id:1,name:"Ethereum",nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://eth.merkle.io"]}},blockExplorers:{default:{name:"Etherscan",url:"https://etherscan.io",apiUrl:"https://api.etherscan.io/api"}},contracts:{ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},ensUniversalResolver:{address:"0xce01f8eee7E479C928F8919abD53E553a36CeF67",blockCreated:19258213},multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:14353601}}});var pn=ge({id:11155111,name:"Sepolia",nativeCurrency:{name:"Sepolia Ether",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://sepolia.drpc.org"]}},blockExplorers:{default:{name:"Etherscan",url:"https://sepolia.etherscan.io",apiUrl:"https://api-sepolia.etherscan.io/api"}},contracts:{multicall3:{address:"0xca11bde05977b3631167028862be2a173976ca11",blockCreated:751532},ensRegistry:{address:"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},ensUniversalResolver:{address:"0xc8Af999e38273D658BE1b921b88A9Ddf005769cC",blockCreated:5317080}},testnet:!0});Zf.config({path:Yf.join(process.cwd(),".env")});var dt=e=>e.startsWith("0x")?e:`0x${e}`,Qf={[mn.id]:mn,[pn.id]:pn,[cn.id]:cn,15107:ge({id:15107,name:"T16Z",nativeCurrency:{name:"ETH",symbol:"ETH",decimals:18},rpcUrls:{default:{http:["https://rpc.t16z.com"]}}}),[an.id]:{...an,rpcUrls:{default:{http:["http://127.0.0.1:8545"]}}}};function gt(e){let t=Qf[e];if(!t)throw new Error(`Unsupported chain ID: ${e}`);return t}async function Qe(e,t,r){let{rpcUrl:o,privateKey:n}=e;if(!o&&t&&(o=gt(t).rpcUrls.default.http[0]),!n){if(process.env.PRIVATE_KEY)n=process.env.PRIVATE_KEY,a.debug("Using private key from PRIVATE_KEY environment variable");else if(r){let{key:c}=await dm.prompt([{type:"password",name:"key",message:"Enter the private key for signing:",validate:p=>!!p||"Private key is required. You can also set the PRIVATE_KEY environment variable."}]);n=c}}let s=new Kt.JsonRpcProvider(o),i=new Kt.Wallet(dt(n),s);return a.success(`Connected to RPC at ${o}. Using wallet ${i.address}`),{wallet:i,rpcUrl:o}}var lm=["function registerApp(address app)","event AppRegistered(address appId)","function setAppAuthImplementation(address _implementation)","function deployAndRegisterApp(address,bool,bool,bytes32,bytes32) returns (address, address)","event AppDeployedViaFactory(address indexed appId, address indexed proxyAddress, address indexed deployer)"];async function Xf(e,t){let r=await dm.prompt([{type:"input",name:"initialDeviceId",message:"Enter the initial device ID (32-byte hex):",when:!e.initialDeviceId,default:Kt.ZeroHash,validate:o=>o.length===66&&o.startsWith("0x")||"Please enter a valid 32-byte hex string (0x...)."},{type:"input",name:"composeHash",message:"Enter the initial compose hash (32-byte hex):",when:!e.composeHash,default:Kt.ZeroHash,validate:o=>o.length===66&&o.startsWith("0x")||"Please enter a valid 32-byte hex string (0x...)."}]);return{deployerAddress:t.address,initialDeviceId:e.initialDeviceId||r.initialDeviceId,composeHash:e.composeHash||r.composeHash}}async function eu(e,t,r,o,n){let s=a.startSpinner(`Deploying AppAuth instance via KmsAuth factory at ${e}...`),c=await new Kt.Contract(e,lm,n).deployAndRegisterApp(t,!1,!0,dt(r),dt(o)),p=await c.wait();s.stop(!0);let m=new Kt.Interface(lm),l=p.logs.find(f=>f.topics[0]===m.getEvent("AppDeployedViaFactory").topicHash);if(l){let{appId:f,proxyAddress:u}=m.parseLog({topics:Array.from(l.topics),data:l.data}).args;return a.success("AppAuth instance deployed and registered successfully!"),a.keyValueTable({"App ID":f,"Proxy Address":u,"Transaction Hash":c.hash}),{appId:f,proxyAddress:u,deployerAddress:t}}else throw a.warn("Could not find AppDeployedViaFactory event to extract details."),new Error("Deployment failed: Event not found.")}async function fn(e,t,r){if(!e.kmsId)throw new Error("KMS ID is required.");if(!r)throw new Error("KMS Contract Address is required.");let o=await Xf(e,t);return await eu(r,o.deployerAddress,o.initialDeviceId,o.composeHash,t)}async function ou(e,t){if(!e)if(!t.interactive)a.error("CVM ID is required. Use --app-id to enter it"),process.exit(1);else{let{id:i}=await hm.prompt([{type:"input",name:"id",message:"Enter the CVM ID to update:"}]);e=i}let r=a.startSpinner(`Fetching current configuration for CVM ${e}`),o=await ye(e);if(r.stop(!0),o||(a.error(`CVM with CVM ID ${e} not found`),process.exit(1)),!t.compose)if(!t.interactive)a.error("Docker Compose file is required. Use --compose to select it"),process.exit(1);else{let c=we(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");t.compose=await R("Enter the path to your new Docker Compose file:",c,"file")}let n=[],s=[];if(!t.skipEnv){let i=t.envFile;if(!i){let c=[".env.production",".env.prod",".env"];for(let p of c)if(gm.existsSync(p)){i=p,a.info(`Using environment file: ${i}`);break}i||t.interactive&&(i=await R("Enter the path to your environment file:",".env","file"))}if(i)try{n=z([],i),s=n.map(c=>c.key),s.length>0?(a.info(`Using environment variables from ${i}`),a.debug(`Allowed environment variables: ${s.join(", ")}`)):a.warn(`No environment variables found in ${i}`)}catch(c){a.error(`Error reading environment file ${i}:`,c)}}return{...t,cvmId:o.vm_uuid.replace(/-/g,""),currentCvm:o,allowedEnvs:s}}async function nu(e,t){let r=gm.readFileSync(e.compose,"utf8"),o="",n=[];if(e.envFile)try{n=z([],e.envFile)}catch(s){a.error(`Failed to process environment file: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}else if(e.interactive){let{useEnvFile:s}=await hm.prompt([{type:"confirm",name:"useEnvFile",message:"Do you want to use an environment file?",default:!1}]);if(s){let i=await R("Enter the path to your environment file:",".env","file");n=z([],i)}}return n.length>0&&(t.encrypted_env_pubkey||(a.error("Could not find public key to encrypt environment variables for this CVM."),process.exit(1)),o=await ru(n,t.encrypted_env_pubkey)),{composeString:r,encryptedEnv:o}}async function su(e,t,r,o,n,s,i={}){let c=a.startSpinner("Adding compose hash for on-chain KMS..."),p;try{let{rpcUrl:m}=await Qe({rpcUrl:n},s),l=gt(s),f=lt({chain:l,transport:mt(m)}),u=[{inputs:[{name:"app",type:"address"}],name:"apps",outputs:[{name:"isRegistered",type:"bool"},{name:"controller",type:"address"}],stateMutability:"view",type:"function"}];try{if(!yr.isAddress(o))throw new Error(`Invalid KMS contract address: ${o}`);if(!yr.isAddress(t))throw new Error(`Invalid custom App ID: ${t}`);let k=t.startsWith("0x")?t:`0x${t}`,[A,B]=await f.readContract({address:o,abi:u,functionName:"apps",args:[k]});if(!A)throw new Error(`App ${t} is not registered in KMS contract ${o}`);if(!B||B===yr.ZeroAddress)throw new Error(`Invalid controller address for app ${t}`);a.info(`Successfully verified AppAuth contract at ${B}`),p=B}catch(k){throw new Error(`Failed to verify custom App ID: ${k instanceof Error?k.message:String(k)}`)}let d=["function addComposeHash(bytes32 composeHash)","event ComposeHashAdded(bytes32 composeHash)"],y=new yr.Contract(p,d,r),h=e.startsWith("0x")?e:`0x${e}`,g=await y.addComposeHash(h),x=await g.wait();c.stop(!0);let b=new yr.Interface(d),v=b.getEvent("ComposeHashAdded").topicHash,E=x.logs.find(k=>k.topics[0]===v),S=null;E&&(S=b.parseLog({topics:Array.from(E.topics),data:E.data}).args.composeHash),i?.json!==!1?console.log(JSON.stringify({success:!0,data:{transaction_hash:g.hash,compose_hash_event:S,event_found:!!E}},null,2)):(a.success("Compose hash added successfully!"),a.info(`Transaction hash: ${g.hash}`),E?a.info(` - Compose Hash: ${S}`):a.warn("Could not find ComposeHashAdded event to extract Compose Hash."))}catch(m){throw c.stop(!1),m}}async function iu(e,t,r,o={}){let n=a.startSpinner("Applying update...");try{let i=await Tr(e,{compose_hash:t,encrypted_env:r});if(n.stop(!0),i===null)o?.json!==!1?console.log(JSON.stringify({success:!0,data:{message:"Update applied successfully",cvm_id:e,compose_hash:t}},null,2)):a.success("Update applied successfully!");else{let c=`Failed to apply update: ${JSON.stringify(i.detail,null,2)}`;o?.json!==!1?console.error(JSON.stringify({success:!1,error:c},null,2)):a.error(c),process.exit(1)}}catch(s){throw n.stop(!1),s}}var xm=new tu().name("upgrade").description("Upgrade a CVM to a new version").argument("[app-id]","CVM app ID to upgrade").option("-c, --compose <compose>","Path to new Docker Compose file").option("-e, --env-file <envFile>","Path to environment file").option("--private-key <privateKey>","Private key for signing transactions").option("--debug","Enable debug mode",!1).option("-i, --interactive","Enable interactive mode for required parameters",!1).option("--rpc-url <rpcUrl>","RPC URL for the blockchain.").option("--json","Output in JSON format (default: true)",!0).option("--no-json","Disable JSON output format").action(async(e,t)=>{try{let{cvmId:r,currentCvm:o,...n}=await ou(e,t),{composeString:s,encryptedEnv:i}=await nu(n,o);await at(),t.json===!1&&(process.env.DSTACK_DOCKER_USERNAME&&process.env.DSTACK_DOCKER_PASSWORD?a.info("\u{1F510} Using private DockerHub registry credentials..."):process.env.DSTACK_AWS_ACCESS_KEY_ID&&process.env.DSTACK_AWS_SECRET_ACCESS_KEY&&process.env.DSTACK_AWS_REGION&&process.env.DSTACK_AWS_ECR_REGISTRY?a.info(`\u{1F510} Using private AWS ECR registry: ${process.env.DSTACK_AWS_ECR_REGISTRY}`):a.info("\u{1F510} Using public DockerHub registry..."));let c=a.startSpinner(`Updating CVM ${r}`),p=await kr(r);p.docker_compose_file=s,p.allowed_envs=n.allowedEnvs;let m=await Ir(r,p);if(c.stop(!0),(!m||!m.compose_hash)&&(a.error("Failed to initiate CVM update or get compose hash."),process.exit(1)),t.json!==!1?console.log(JSON.stringify({success:!0,data:{cvm_id:o.vm_uuid.replace(/-/g,""),app_id:r,compose_hash:m.compose_hash,dashboard_url:`${_}/dashboard/cvms/${o.vm_uuid.replace(/-/g,"")}`,raw:m}},null,2)):(a.success(`CVM update has been provisioned. New compose hash: ${m.compose_hash}`),a.info(`Dashboard: ${_}/dashboard/cvms/${o.vm_uuid.replace(/-/g,"")}`)),o.kms_info){let l=t.privateKey||process.env.PRIVATE_KEY;if(!l)throw new Error("Private key is required for on-chain KMS operations. Please provide it via --private-key or PRIVATE_KEY environment variable");let{wallet:f}=await Qe({privateKey:l,rpcUrl:t.rpcUrl},o.kms_info.chain_id);t.json!==!1?console.log(JSON.stringify({success:!0,data:{wallet_address:f.address}},null,2)):a.info(`Using wallet: ${f.address}`),t.json===!1&&a.info("This CVM uses on-chain KMS. Registering the new compose hash..."),await su(m.compose_hash,e,f,o.kms_info.kms_contract_address,t.rpcUrl,o.kms_info.chain_id,{json:t.json})}await iu(r,m.compose_hash,i,{json:t.json})}catch(r){let o=r instanceof Error?r.message:String(r);t.json!==!1?console.error(JSON.stringify({success:!1,error:o,stack:t.debug&&r instanceof Error?r.stack:void 0},null,2)):a.error(`Failed to upgrade CVM: ${o}`),process.exit(1)}});import{Command as au}from"commander";import br from"inquirer";import Xe from"chalk";var ym=new au().name("resize").description("Resize resources for a CVM").argument("[app-id]","App ID of the CVM (if not provided, a selection prompt will appear)").option("-v, --vcpu <vcpu>","Number of virtual CPUs").option("-m, --memory <memory>","Memory size in MB").option("-d, --disk-size <diskSize>","Disk size in GB").option("-r, --allow-restart <allowRestart>","Allow restart of the CVM if needed for resizing").option("-y, --yes","Automatically confirm the resize operation").action(async(e,t)=>{try{let r=await ae(e),o=await ye(r),n=t.vcpu,s=t.memory,i=t.diskSize,c=t.allowRestart;n||(n=(await br.prompt([{type:"input",name:"vcpu",message:"Enter number of vCPUs:",validate:u=>{let d=parseInt(u);return isNaN(d)||d<0?"Please enter a valid non-negative number":!0},default:o.vcpu.toString(),filter:u=>parseInt(u)}])).vcpu),s||(s=(await br.prompt([{type:"input",name:"memory",message:"Enter memory in MB:",validate:u=>{let d=parseInt(u);return isNaN(d)||d<0?"Please enter a valid non-negative number":!0},default:o.memory.toString(),filter:u=>parseInt(u)}])).memory),i||(i=(await br.prompt([{type:"input",name:"diskSize",message:"Enter disk size in GB:",validate:u=>{let d=parseInt(u);return isNaN(d)||d<0?"Please enter a valid non-negative number":!0},default:o.disk_size.toString(),filter:u=>parseInt(u)}])).diskSize),c||(c=(await br.prompt([{type:"confirm",name:"allowRestart",message:"Allow restart of the CVM if needed for resizing?",default:!1}])).allowRestart);let p=`Are you sure you want to resize CVM app_${r} with the following changes:
63
+ `;if(a.keyValueTable({vCPUs:o.vcpu!==n?`${Xe.red(o.vcpu)} -> ${Xe.green(n)}`:o.vcpu,Memory:o.memory!==s?`${Xe.red(o.memory)} MB -> ${Xe.green(s)} MB`:o.memory,"Disk Size":o.disk_size!==i?`${Xe.red(o.disk_size)} GB -> ${Xe.green(i)} GB`:o.disk_size,"Allow Restart":c?Xe.green("Yes"):Xe.red("No")}),!t.yes){let{confirm:f}=await br.prompt([{type:"confirm",name:"confirm",message:p,default:!1}]);if(!f){a.info("Resize operation cancelled");return}}let m=a.startSpinner(`Resizing CVM with App ID app_${r}`);await Vs(r,n,s,i,c?1:0),m.stop(!0),a.break(),a.success(`Your CVM is being resized. You can check the dashboard for more details:
64
+ ${_}/dashboard/cvms/app_${r}`)}catch(r){a.error(`Failed to resize CVM: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}});import{Command as cu}from"commander";import{encryptEnvVars as mu}from"@phala/dstack-sdk/encrypt-env-vars";import bm from"node:fs";import pu from"node:path";var vm=new cu().name("replicate").description("Create a replica of an existing CVM").argument("<cvm-id>","UUID of the CVM to replicate").option("--node-id <nodeId>","Node ID to use for the replica").option("-e, --env-file <envFile>","Path to environment file").option("--json","Output in JSON format (default: true)",!0).option("--no-json","Disable JSON output format").option("--debug","Enable debug logging",!1).action(async(e,t)=>{try{let r;if(e=e.replace(/-/g,""),t.envFile){let s=pu.resolve(process.cwd(),t.envFile);if(!bm.existsSync(s))throw new Error(`Environment file not found: ${s}`);let c=bm.readFileSync(s,"utf-8").split(`
65
+ `).filter(l=>l.trim()!==""&&!l.trim().startsWith("#")).map(l=>{let[f,...u]=l.split("=");return{key:f.trim(),value:u.join("=").trim()}}),p=await Hs(e);a.info("Encrypting environment variables..."),r=await mu(c,p.env_pubkey)}let o={};t.nodeId&&(o.teepod_id=parseInt(t.nodeId,10)),r&&(o.encrypted_env=r);let n=await Ls(e,o);if(t.json!==!1)console.log(JSON.stringify({success:!0,data:{vm_uuid:n.vm_uuid.replace(/-/g,""),app_id:n.app_id,name:n.name,status:n.status,node:{id:n.teepod_id,name:n.teepod?.name},vcpus:n.vcpu,memory_mb:n.memory,disk_size_gb:n.disk_size,app_url:n.app_url||`${process.env.CLOUD_URL||"https://cloud.phala.network"}/dashboard/cvms/${n.vm_uuid.replace(/-/g,"")}`,raw:n}},null,2));else{a.success(`Successfully created replica of CVM UUID: ${e} with App ID: ${n.app_id}`);let s={"CVM UUID":n.vm_uuid.replace(/-/g,""),"App ID":n.app_id,Name:n.name,Status:n.status,Node:`${n.teepod?.name||"N/A"} (ID: ${n.teepod_id||"N/A"})`,vCPUs:n.vcpu,Memory:`${n.memory} MB`,"Disk Size":`${n.disk_size} GB`,"App URL":n.app_url||`${process.env.CLOUD_URL||"https://cloud.phala.network"}/dashboard/cvms/${n.vm_uuid.replace(/-/g,"")}`};a.keyValueTable(s,{borderStyle:"rounded"}),a.success(`Your CVM replica is being created. You can check its status with:
66
+ phala cvms get ${n.app_id}`)}}catch(r){let o=`Failed to create CVM replica: ${r instanceof Error?r.message:String(r)}`;t.json!==!1?console.error(JSON.stringify({success:!1,error:o,stack:t.debug&&r instanceof Error?r.stack:void 0},null,2)):a.error(o),process.exit(1)}});import{Command as fu}from"commander";import{encryptEnvVars as uu}from"@phala/dstack-sdk/encrypt-env-vars";async function un(e,t){try{let r=await vn.get(bn.KMS_PUBKEY(e,t));return Fs.parse(r)}catch(r){throw new Error(`Failed to get public key from KMS: ${r instanceof Error?r.message:String(r)}`)}}async function wm(e){try{let t=await vn.get(bn.CVM_COMPOSE(e));return{public_key:Ds.parse(t).env_pubkey,signature:""}}catch(t){throw a.error(`Failed to get public key directly from KMS: ${t instanceof Error?t.message:String(t)}`),t}}import lu from"fs-extra";import du from"inquirer";import{ethers as bs}from"ethers";async function gu(e){let t=[];if(!e.skipEnv){let c=e.envFile;if(!c){let p=[".env.production",".env.prod",".env"];for(let m of p)if(lu.existsSync(m)){c=m,a.info(`Using environment file: ${c}`);break}c||(e.interactive?c=await R("Enter the path to your environment file:",".env","file"):(a.error("Environment file is required. Use --env-file to select it"),process.exit(1)))}if(c)try{t=z([],c)}catch(p){a.error(`Error reading environment file ${c}:`,p)}}if(t.length===0)return"";if(!e.appId)if(e.interactive)e.appId=await du.prompt([{type:"input",name:"appId",message:"Enter the App ID for the CVM:"}]);else throw new Error("To encrypt environment variables, --app-id is required.");let r=a.startSpinner("Fetching public key from KMS..."),o;e.kmsId?o=await un(e.kmsId,e.appId):o=await wm(e.appId);let n=o.public_key;if(r.stop(!0),!n)throw new Error("Failed to retrieve public key from KMS.");let s=a.startSpinner("Encrypting environment variables"),i=await uu(t,n);return s.stop(!0),i}async function hu(e,t){a.info(`Using custom App ID: ${e.customAppId}, fetching AppAuth details from KMS...`);let r,o,n,s=a.startSpinner("Fetching available Nodes"),i=await be();if(s.stop(!0),i.nodes.length===0)throw new Error("No Nodes available.");if(r=(i.kms_list||[]).find(d=>d.id===e.kmsId),!r)throw new Error(`No KMS found with ID: ${e.kmsId} in the available Nodes`);o=r.kms_contract_address,a.info(`Using KMS contract address: ${o} from KMS ID: ${e.kmsId}`);let p=i.kms_list?.[0];if(!p)throw new Error("No KMS available");let m=gt(p.chain_id),l=e.rpcUrl||m.rpcUrls.default.http[0],f=lt({chain:m,transport:mt(l)}),u=[{inputs:[{name:"app",type:"address"}],name:"apps",outputs:[{name:"isRegistered",type:"bool"},{name:"controller",type:"address"}],stateMutability:"view",type:"function"}];try{if(!bs.isAddress(o))throw new Error(`Invalid KMS contract address: ${o}`);if(!bs.isAddress(e.appId))throw new Error(`Invalid custom App ID: ${e.appId}`);let d=e.appId.startsWith("0x")?e.appId:`0x${e.appId}`,[y,h]=await f.readContract({address:o,abi:u,functionName:"apps",args:[d]});if(!y)throw new Error(`App ${e.appId} is not registered in KMS contract ${o}`);if(!h||h===bs.ZeroAddress)throw new Error(`Invalid controller address for app ${e.appId}`);a.info(`Successfully verified AppAuth contract at ${h}`),n=h}catch(d){throw new Error(`Failed to verify custom App ID: ${d instanceof Error?d.message:String(d)}`)}return{app_id:e.appId,compose_hash:e.composeHash,contract_address:n,deployer_address:"",encrypted_env:t,kms_id:e.kmsId}}function xu(e,t){if(a.success("CVM provisioned successfully"),a.break(),t.json!==!1){let r={success:!0,data:{cvm_id:e.vm_uuid.replace(/-/g,""),name:e.name,status:e.status,app_id:e.app_id,endpoint:`${_}/dashboard/cvms/${e.vm_uuid.replace(/-/g,"")}`}};console.log(JSON.stringify(r,null,2))}else{let r={"CVM ID":e.vm_uuid.replace(/-/g,""),Name:e.name,Status:e.status,"App ID":e.app_id,Endpoint:`${_}/dashboard/cvms/${e.vm_uuid.replace(/-/g,"")}`};a.keyValueTable(r)}}var Em=new fu().name("commit-provision").description("Provision a new CVM with on-chain KMS integration.").option("-i, --interactive","Enable interactive mode for required parameters",!1).option("--app-id <appId>","App ID for the CVM (with 0x prefix for on-chain KMS).").option("--compose-hash <composeHash>","Compose hash for the CVM (SHA-256 hex string).").option("--kms-id <kmsId>","KMS ID for API-based public key retrieval.").option("--deployer-address <deployerAddress>","Deployer address for the CVM.").option("-e, --env-file <envFile>","Path to environment file.").option("--skip-env","Skip environment variable prompt.",!1).option("--debug","Enable debug mode",!1).option("-c, --compose <compose>","Path to Docker Compose file").option("--json","Output in JSON format (default: true)",!0).option("--no-json","Disable JSON output format").option("--rpc-url <rpcUrl>","RPC URL for the blockchain.").action(async e=>{try{let t=await gu(e),r=await hu(e,t),o=a.startSpinner("Provisioning CVM...");e.debug&&a.info(`Provisioning with config: ${JSON.stringify(r,null,2)}`);let n=await Sr(r);if(o.stop(!0),!n)throw new Error("Failed to provision CVM. The API returned an empty response.");xu(n,e)}catch(t){let r=t instanceof Error?t.message:String(t);e.json!==!1?console.error(JSON.stringify({success:!1,error:r,stack:e.debug&&t instanceof Error?t.stack:void 0},null,2)):(a.error(`Failed to provision CVM: ${r}`),e.debug&&t.stack&&a.error(t.stack)),process.exit(1)}});import{Command as yu}from"commander";import{encryptEnvVars as bu}from"@phala/dstack-sdk/encrypt-env-vars";function Cm(e,t="B"){if(!e||typeof e!="string")throw new Error("Invalid input: must be a non-empty string");let r=e.trim().match(/^(\d+(?:\.\d+)?)\s*([KkMmGgTt][Bb]?)?$/);if(!r)throw new Error(`Invalid format: ${e}. Expected format: <number>[unit] (e.g., 2G, 500MB, 1T)`);let o=parseFloat(r[1]),n=(r[2]||t).toUpperCase().replace("B",""),s={K:1024,M:1024*1024,G:1024*1024*1024,T:1024*1024*1024*1024,"":1};if(!(n in s))throw new Error(`Unsupported unit: ${n}. Supported units: B, K/KB, M/MB, G/GB, T/TB`);return Math.round(o*s[n])}function ln(e){let t=Cm(e,"MB"),r=Math.round(t/(1024*1024));if(r%1024!==0)throw new Error(`Memory must be a multiple of 1GB (1024MB). Got: ${r}MB`);return r}function dn(e){let t=Cm(e,"GB"),r=Math.round(t/(1024*1024*1024));if(r%1!==0)throw new Error(`Disk size must be a multiple of 1GB. Got: ${r}GB`);let o=250;if(r>o)throw new Error(`Maximum disk size is ${o}GB. Got: ${r}GB`);return r}import vs from"fs-extra";import ws from"node:path";import km from"inquirer";async function vu(e){if(!e.name)if(e.interactive){let g=ws.basename(process.cwd()).toLowerCase().replace(/[^a-z0-9_-]/g,"-"),{name:x}=await km.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",default:g,validate:b=>b.trim()?b.trim().length>20?"CVM name must be less than 20 characters":b.trim().length<3?"CVM name must be at least 3 characters":/^[a-zA-Z0-9_-]+$/.test(b)?!0:"CVM name must contain only letters, numbers, underscores, and hyphens":"CVM name is required"}]);e.name=x}else{let g=ws.basename(process.cwd()).toLowerCase().replace(/[^a-z0-9_-]/g,"-");e.name=g}if(!e.compose)if(!e.interactive)a.error("Docker Compose file is required. Use --compose or --interactive to select it"),process.exit(1);else{let x=we(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e.compose=await R("Enter the path to your Docker Compose file:",x,"file")}let t=ws.resolve(e.compose);if(!vs.existsSync(t))throw new Error(`Docker Compose file not found: ${t}`);let r=vs.readFileSync(t,"utf8"),o=[],n=[];if(!e.skipEnv){let g=e.envFile;if(!g){let x=[".env.production",".env.prod",".env"];for(let b of x)if(vs.existsSync(b)){g=b,a.info(`Using environment file: ${g}`);break}g||(e.interactive?g=await R("Enter the path to your environment file:",".env","file"):(a.error("Environment file is required. Use --env-file to select it"),process.exit(1)))}if(g)try{o=z([],g),n=o.map(x=>x.key),n.length>0?(a.info(`Using environment variables from ${g}`),a.debug(`Allowed environment variables: ${n.join(", ")}`)):a.warn(`No environment variables found in ${g}`)}catch(x){a.error(`Error reading environment file ${g}:`,x)}}let s=a.startSpinner("Fetching available Nodes"),i=await be();if(s.stop(!0),i.nodes.length===0)throw new Error("No Nodes available.");let c=i.nodes.filter(g=>e.kmsId?g.support_onchain_kms:!g.support_onchain_kms);if(c.length===0){let g=e.kmsId?"No Nodes available that support on-chain KMS.":"No Nodes available that does not support on-chain KMS.";throw new Error(g)}let p,m;if(e.kmsId){if(p=(i.kms_list||[]).find(x=>x.id===e.kmsId),!p)throw new Error(`No KMS found with ID: ${e.kmsId} in the available Nodes`);m=p.kms_contract_address,a.info(`Using KMS contract address: ${m} from KMS ID: ${e.kmsId}`)}let l;if(e.nodeId){if(l=c.find(g=>g.teepod_id===Number(e.nodeId)),!l)throw new Error(`Selected Node with ID ${e.nodeId} is not available or does not support on-chain KMS.`)}else if(!e.interactive)a.error("Node is required. Use --node-id to select it"),process.exit(1);else{let{node:g}=await km.prompt([{type:"list",name:"node",message:"Select a Node to use:",choices:c.map(x=>({name:`${x.name} (Region: ${x.region_identifier})`,value:x}))}]);l=g}let f;if(e.image){if(f=l.images?.find(g=>g.name===e.image),!f)throw new Error(`Failed to find selected image '${e.image}' for the selected Node.`)}else{if(f=l.images?.[0],!f)throw new Error("No images found for the selected Node.");a.info(`Using image: ${f.name}`)}let u={docker_compose_file:r,allowed_envs:n,features:["kms","tproxy-net"],kms_enabled:!0,manifest_version:2,name:e.name,public_logs:!0,public_sysinfo:!0,tproxy_enabled:!0};e.preLaunchScript&&(u.pre_launch_script=e.preLaunchScript);let d=ce;if(e.memory)try{d=ln(e.memory),a.info(`Using memory: ${d}MB (parsed from: ${e.memory})`)}catch{a.warn(`Invalid memory format '${e.memory}'. Using default: ${ce}MB`)}let y=me;if(e.diskSize)try{y=dn(e.diskSize),a.info(`Using disk size: ${y}GB (parsed from: ${e.diskSize})`)}catch{a.warn(`Invalid disk size format '${e.diskSize}'. Using default: ${me}GB`)}let h={teepod_id:l.teepod_id,name:e.name,image:f.name,vcpu:Number(e.vcpu)||Pe,memory:d,disk_size:y,listed:!1};return e.kmsId?h.compose_file=u:h.compose_manifest=u,{vmConfig:h,envs:o,teepods:i,kmsContractAddress:m}}async function wu(e,t){let r=a.startSpinner("Provisioning CVM for on-chain KMS..."),o=await Ar(e);if(r.stop(!0),!o)throw new Error("Failed to provision CVM for on-chain KMS");return t.json!==!1?console.log(JSON.stringify({success:!0,data:{app_id:o.app_id,device_id:o.device_id,compose_hash:o.compose_hash,os_image_hash:o.os_image_hash,raw:o}},null,2)):(a.success("CVM provisioned successfully!"),a.keyValueTable({"App ID":o.app_id,"Device ID":o.device_id,"Compose Hash":o.compose_hash,"OS Image Hash":o.os_image_hash})),o}async function Eu(e,t,r){let o=a.startSpinner("Getting public key from CVM"),n=await Me(e);if(o.stop(!0),!n)throw new Error("Failed to get public key from CVM");let s=a.startSpinner("Encrypting environment variables"),i=await bu(t,n.app_env_encrypt_pubkey);s.stop(!0);let c=a.startSpinner("Provisioning CVM"),p=await Re({...e,encrypted_env:i,app_env_encrypt_pubkey:n.app_env_encrypt_pubkey,app_id_salt:n.app_id_salt});if(c.stop(!0),!p)throw new Error("Failed to create CVM");if(r.json!==!1){let m={success:!0,data:{cvm_id:p.vm_uuid.replace(/-/g,""),app_id:p.app_id,name:p.name,status:p.status,endpoint:`${_}/dashboard/cvms/${p.vm_uuid.replace(/-/g,"")}`,created_at:p.created_at,raw:p}};p.kms_contract_address&&(m.data.kms_contract_address=p.kms_contract_address),p.kms_owner_address&&(m.data.kms_owner_address=p.kms_owner_address),console.log(JSON.stringify(m,null,2))}else{a.success("CVM created successfully"),a.break();let m={"CVM ID":p.vm_uuid.replace(/-/g,""),"App ID":p.app_id,Name:p.name,Status:p.status,Endpoint:`${_}/dashboard/cvms/${p.vm_uuid.replace(/-/g,"")}`,"Created At":new Date(p.created_at).toLocaleString()};p.kms_contract_address&&(m["KMS Contract Address"]=p.kms_contract_address),p.kms_owner_address&&(m["KMS Owner Address"]=p.kms_owner_address),a.keyValueTable(m)}}var Am=new yu().name("provision").description("Provision a new CVM, with optional on-chain KMS integration.").option("-n, --name <name>","Name of the CVM").option("-c, --compose <compose>","Path to Docker Compose file").option("--vcpu <vcpu>",`Number of vCPUs, default is ${Pe}`).option("--memory <memory>",`Memory with optional unit (e.g., 2G, 500MB, 1024), default is ${ce}MB`).option("--disk-size <diskSize>",`Disk size with optional unit (e.g., 50G, 1T, 100), default is ${me}GB`).option("--image <image>","Version of dstack image to use").option("--node-id <nodeId>","Node ID to use").option("-e, --env-file <envFile>","Path to environment file").option("--skip-env","Skip environment variable prompt",!1).option("-i, --interactive","Enable interactive mode for required parameters",!1).option("--kms-id <kmsId>","KMS ID to use.").option("--pre-launch-script <preLaunchScript>","Path to pre-launch script").option("--json","Output in JSON format (default: true)",!0).option("--no-json","Disable JSON output format").action(async e=>{try{a.info("Step 1: Preparing CVM configuration...");let{vmConfig:t,envs:r}=await vu(e);if(!e.kmsId){a.info(`
67
+ Step 2: Creating CVM...`),await Eu(t,r,e);return}a.info(`
68
+ Step 2: Provisioning CVM...`),await wu(t,e)}catch(t){let r=t instanceof Error?t.message:String(t);e.json!==!1?console.error(JSON.stringify({success:!1,error:r,stack:e.debug&&t instanceof Error?t.stack:void 0},null,2)):a.error(`Failed to create CVM: ${r}`),process.exit(1)}});import{Command as Cu}from"commander";import Sm from"fs-extra";import Im from"inquirer";import{encryptEnvVars as ku}from"@phala/dstack-sdk/encrypt-env-vars";async function Au(e,t){if(!e)if(!t.interactive)a.error("CVM ID is required. Use --app-id to enter it"),process.exit(1);else{let{id:i}=await Im.prompt([{type:"input",name:"id",message:"Enter the CVM ID to update:"}]);e=i}let r=a.startSpinner(`Fetching current configuration for CVM ${e}`),o=await ye(e);if(r.stop(!0),o||(a.error(`CVM with CVM ID ${e} not found`),process.exit(1)),!t.compose)if(!t.interactive)a.error("Docker Compose file is required. Use --compose to select it"),process.exit(1);else{let c=we(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");t.compose=await R("Enter the path to your new Docker Compose file:",c,"file")}let n=[],s=[];if(!t.skipEnv){let i=t.envFile;if(!i){let c=[".env.production",".env.prod",".env"];for(let p of c)if(Sm.existsSync(p)){i=p,a.info(`Using environment file: ${i}`);break}i||t.interactive&&(i=await R("Enter the path to your environment file:",".env","file"))}if(i)try{n=z([],i),s=n.map(c=>c.key),s.length>0?(a.info(`Using environment variables from ${i}`),a.debug(`Allowed environment variables: ${s.join(", ")}`)):a.warn(`No environment variables found in ${i}`)}catch(c){a.error(`Error reading environment file ${i}:`,c)}}return{...t,cvmId:o.vm_uuid.replace(/-/g,""),currentCvm:o,allowedEnvs:s}}async function Su(e,t){let r=Sm.readFileSync(e.compose,"utf8"),o="",n=[];if(e.envFile)try{n=z([],e.envFile)}catch(s){a.error(`Failed to process environment file: ${s instanceof Error?s.message:String(s)}`),process.exit(1)}else if(e.interactive){let{useEnvFile:s}=await Im.prompt([{type:"confirm",name:"useEnvFile",message:"Do you want to use an environment file?",default:!1}]);if(s){let i=await R("Enter the path to your environment file:",".env","file");n=z([],i)}}return n.length>0&&(t.encrypted_env_pubkey||(a.error("Could not find public key to encrypt environment variables for this CVM."),process.exit(1)),o=await ku(n,t.encrypted_env_pubkey)),{composeString:r,encryptedEnv:o}}var Tm=new Cu().name("upgrade-provision").description("Provision a CVM upgrade with a new compose file").argument("<cvm-id>","ID of the CVM to upgrade").option("-c, --compose <compose>","Path to new Docker Compose file").option("-e, --env-file <envFile>","Path to environment file").option("--skip-env","Skip environment variable prompt",!1).option("--debug","Enable debug logging",!1).option("-i, --interactive","Enable interactive mode",!1).option("--json","Output in JSON format (default: true)",!0).option("--no-json","Disable JSON output format").action(async(e,t)=>{try{let{cvmId:r,currentCvm:o,...n}=await Au(e,t),{composeString:s,encryptedEnv:i}=await Su(n,o),c=a.startSpinner(`Updating CVM ${r}`),p=await kr(r);p.docker_compose_file=s,p.allowed_envs=n.allowedEnvs;let m=await Ir(r,p);c.stop(!0),(!m||!m.compose_hash)&&(a.error("Failed to initiate CVM update or get compose hash."),process.exit(1)),a.info(`CVM UUID: ${o.vm_uuid.replace(/-/g,"")}`),a.info(`App ID: ${o.app_id}`),t.json!==!1?console.log(JSON.stringify({success:!0,data:{cvm_id:o.vm_uuid.replace(/-/g,""),app_id:r,compose_hash:m.compose_hash,dashboard_url:`${_}/dashboard/cvms/${o.vm_uuid.replace(/-/g,"")}`,raw:m}},null,2)):(a.success(`CVM update has been provisioned. New compose hash: ${m.compose_hash}`),a.info(`Dashboard: ${_}/dashboard/cvms/${o.vm_uuid.replace(/-/g,"")}`))}catch(r){let o=`Failed to provision CVM upgrade: ${r instanceof Error?r.message:String(r)}`;t.json!==!1?console.error(JSON.stringify({success:!1,error:o,stack:t.debug&&r instanceof Error?r.stack:void 0},null,2)):a.error(o),process.exit(1)}});import{Command as Iu}from"commander";import{encryptEnvVars as Tu}from"@phala/dstack-sdk/encrypt-env-vars";import Pu from"inquirer";async function _u(e,t,r,o={}){let n=a.startSpinner("Applying update...");try{let i=await Tr(e,{compose_hash:t,encrypted_env:r});if(i===null)n.stop(!0),o&&o.json!==!1?console.log(JSON.stringify({success:!0,data:{cvm_id:e,message:"Update applied successfully",dashboard_url:`${_}/dashboard/cvms/${e.replace(/-/g,"")}`}},null,2)):(a.success("Update applied successfully!"),a.info(`Dashboard: ${_}/dashboard/cvms/${e.replace(/-/g,"")}`));else{n.stop(!1);let c=`Failed to apply update: ${JSON.stringify(i.detail,null,2)}`;o&&o.json!==!1?console.error(JSON.stringify({success:!1,error:c},null,2)):a.error(c),process.exit(1)}}catch(s){throw n.stop(!1),s}}async function Bu(e,t){let r="",o=[];if(e.envFile)try{o=z([],e.envFile)}catch(n){a.error(`Failed to process environment file: ${n instanceof Error?n.message:String(n)}`),process.exit(1)}else if(e.interactive){let{useEnvFile:n}=await Pu.prompt([{type:"confirm",name:"useEnvFile",message:"Do you want to use an environment file?",default:!1}]);if(n){let s=await R("Enter the path to your environment file:",".env","file");o=z([],s)}}return o.length>0&&(t.encrypted_env_pubkey||(a.error("Could not find public key to encrypt environment variables for this CVM."),process.exit(1)),r=await Tu(o,t.encrypted_env_pubkey)),{encryptedEnv:r}}var Pm=new Iu().name("upgrade-commit").description("Commit a provisioned CVM upgrade").argument("<cvm-id>","ID of the CVM to upgrade").requiredOption("--compose-hash <composeHash>","Compose hash from the provision step").option("-e, --env-file <envFile>","Path to environment file").option("--skip-env","Skip environment variable prompt",!1).option("--json","Output in JSON format (default: true)",!0).option("--no-json","Disable JSON output format").action(async(e,t)=>{try{let r=a.startSpinner(`Fetching current configuration for CVM ${e}`),o=await ye(e);a.info(`
69
+ CVM UUID: ${o.vm_uuid.replace(/-/g,"")}`),a.info(`App ID: ${o.app_id}`),r.stop(!0),o||(a.error(`CVM with CVM ID ${e} not found`),process.exit(1));let{encryptedEnv:n}=await Bu(t,o);await _u(o.vm_uuid.replace(/-/g,""),t.composeHash,n,t)}catch(r){let o=`Failed to commit CVM upgrade: ${r instanceof Error?r.message:String(r)}`;t.json!==!1?console.error(JSON.stringify({success:!1,error:o,stack:t.debug&&r instanceof Error?r.stack:void 0},null,2)):a.error(o),process.exit(1)}});var _m=new Fu().name("cvms").description("Manage Phala Confidential Virtual Machines (CVMs)").addCommand(ea).addCommand(na).addCommand(sa).addCommand(Yi).addCommand(Ji).addCommand(Zi).addCommand(Qi).addCommand(ym).addCommand(Xi).addCommand(xm).addCommand(vm).addCommand(Em).addCommand(Am).addCommand(Tm).addCommand(Pm);import{Command as Du}from"commander";import{execSync as vr}from"node:child_process";import*as Fm from"node:os";function $u(e){let t=Fm.platform();try{switch(t){case"darwin":vr(`open "${e}"`);break;case"win32":vr(`start "" "${e}"`);break;case"linux":try{vr(`xdg-open "${e}"`)}catch{try{vr(`gnome-open "${e}"`)}catch{vr(`kde-open "${e}"`)}}break;default:throw new Error(`Unsupported platform: ${t}`)}a.success(`Opened URL in your default browser: ${e}`)}catch(r){a.error(`Failed to open URL: ${r instanceof Error?r.message:String(r)}`),a.info(`Please manually open this URL in your browser: ${e}`)}}function Bm(e){return new Promise(t=>setTimeout(t,e))}var Dm=new Du().name("join").alias("free").description("Join Phala Cloud! Get an account and deploy a CVM for FREE").action(async()=>{try{let e="https://cloud.phala.network/register?invite=beta",t=a.startSpinner("Brewing a fresh cup of TEE \u{1F375}");await Bm(2e3),t.stop(!0),a.break(),a.break(),console.log(Wr),a.info("TEE is served! Opening Phala Cloud registration page..."),await Bm(1e3),a.break(),$u(e)}catch(e){a.error(`Error: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}});import{Command as Ru}from"commander";var Nu=`version: '3'
65
70
  services:
66
71
  jupyter:
67
72
  image: quay.io/jupyter/base-notebook
@@ -73,14 +78,17 @@ services:
73
78
  - GRANT_SUDO=yes
74
79
  user: root
75
80
  command: "start-notebook.sh --NotebookApp.token=\${TOKEN}"
76
- `,Cr=`version: '3'
81
+ `,Mu=`version: '3'
77
82
  services:
78
83
  httpbin:
79
84
  image: kennethreitz/httpbin:latest
80
85
  ports:
81
86
  - "80:80"
82
- `,kt={jupyter:{compose:vr,name:"Jupyter Notebook"},httpbin:{compose:Cr,name:"HTTPBin"}};import{encryptEnvVars as wr}from"@phala/dstack-sdk/encrypt-env-vars";import wt from"inquirer";import br from"node:crypto";var bt=new kr().name("demo").description("Demo commands to launch a demo on Phala Cloud").action(async()=>{try{await W()||(e.error("You need to be logged in to use the demo command"),e.info("Please login with: phala auth login"),process.exit(1));try{let y=e.startSpinner("Verifying your credentials"),d=await A();y.stop(!0),e.success(`Logged in as ${d.username}`)}catch{e.error("Authentication failed. Your API key may be invalid or expired."),e.info("Please set a new API key with: phala auth login"),process.exit(1)}let t=Object.values(kt);t.length===0&&(e.error("No template files found in the templates directory"),process.exit(1));let{selectedTemplate:r}=await wt.prompt([{type:"list",name:"selectedTemplate",message:"Select a template to deploy:",choices:t.map(y=>({name:y.name,value:y}))}]),i=r.compose;e.success(`Selected template: ${r.name}`);let n=br.randomBytes(16).toString("hex"),m=M([`TOKEN=${n}`],""),{cvmName:a}=await wt.prompt([{type:"input",name:"cvmName",message:"Enter a name for your CVM:",default:`${r.name.replace(" ","-")}`,validate:y=>y.trim()?!0:"CVM name is required"}]);e.info("Preparing to deploy your CVM...");let c={teepod_id:3,name:a,image:O,vcpu:2,memory:2048,disk_size:20,compose_manifest:{docker_compose_file:i,docker_config:{url:"",username:"",password:""},features:["kms","tproxy-net"],kms_enabled:!0,manifest_version:2,name:a,public_logs:!0,public_sysinfo:!0,tproxy_enabled:!0},listed:!1},l=e.startSpinner("Preparing CVM configuration"),s=await J(c);l.stop(!0),s||(e.error("Failed to prepare CVM configuration"),process.exit(1));let f=await wr(m,s.app_env_encrypt_pubkey);e.debug("Public key:",s.app_env_encrypt_pubkey),e.debug("Encrypted environment variables:",f);let g=e.startSpinner("Creating your demo CVM"),p=await Q({...c,encrypted_env:f,app_env_encrypt_pubkey:s.app_env_encrypt_pubkey,app_id_salt:s.app_id_salt});g.stop(!0),p||(e.error("Failed to create demo CVM"),process.exit(1)),e.success("Demo CVM created successfully! \u{1F389}"),e.break();let u={"CVM ID":p.id,Name:p.name,Status:p.status,"App ID":`app_${p.app_id}`,"App URL":p.app_url?p.app_url:`${h}/dashboard/cvms/app_${p.app_id}`,Template:r.name,Resources:"2 vCPUs, 2GB RAM, 20GB Storage"};r.name.includes("Jupyter Notebook")&&(u["Jupyter Token"]=n,u["Access Instructions"]="Access your Jupyter notebook using the token above. Go to 'Network' tab to see the public URL."),e.keyValueTable(u,{borderStyle:"rounded"}),e.break(),e.success(`Your demo is being created. You can check its status with:
83
- phala cvms get app_${p.app_id}`)}catch(o){e.error(`Failed to launch demo: ${o instanceof Error?o.message:String(o)}`),process.exit(1)}});import{Command as St}from"commander";async function ge(){try{let{nodes:o,kms_list:t}=await N();if(o.length===0){e.info("No available nodes found.");return}e.info("Available Nodes:"),o.forEach(r=>{e.info("----------------------------------------"),e.info(` ID: ${r.teepod_id}`),e.info(` Name: ${r.name}`),e.info(` Region: ${r.region_identifier}`),e.info(` FMSPC: ${r.fmspc||"N/A"}`),e.info(` Device ID: ${r.device_id||"N/A"}`),e.info(` Support Onchain KMS: ${r.support_onchain_kms}`),e.info(" Images:"),r.images&&r.images.length>0?r.images.forEach(i=>{e.info(` - ${i.name}`),e.info(` Hash: ${i.os_image_hash||"N/A"}`)}):e.info(" N/A")}),t&&t.length>0&&(e.info(`
84
- Available KMS Instances:`),t.forEach(r=>{e.info("----------------------------------------"),e.info(` ID: ${r.id}`),e.info(` URL: ${r.url}`),e.info(` Version: ${r.version}`),e.info(` Chain ID: ${r.chain_id}`),e.info(` Contract Address: ${r.kms_contract_address}`),e.info(` Gateway App ID: ${r.gateway_app_id}`)}))}catch(o){throw e.error(`Failed to list available nodes: ${o instanceof Error?o.message:String(o)}`),o}}var _t=new St().name("nodes").description("List and manage TEE nodes").action(ge).addCommand(new St("list").description("List all available worker nodes").alias("ls").action(ge));process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function _r(){new Sr().name("phala").alias("pha").description(`${X}
85
- Phala Cloud CLI - Manage your Phala Cloud Deployments`).version("v1.0.15").addCommand(Ve).addCommand(ht).addCommand(Je).addCommand(Xe).addCommand(bt).addCommand(Ct).addCommand(_t).parse(process.argv)}_r().catch(o=>{e.error("An error occurred:",o),process.exit(1)});
87
+ `,$m={jupyter:{compose:Nu,name:"Jupyter Notebook"},httpbin:{compose:Mu,name:"HTTPBin"}};import{encryptEnvVars as Uu}from"@phala/dstack-sdk/encrypt-env-vars";import Nm from"inquirer";import zu from"node:crypto";var Mm=new Ru().name("demo").description("Demo commands to launch a demo on Phala Cloud").action(async()=>{try{await Er()||(a.error("You need to be logged in to use the demo command"),a.info("Please login with: phala auth login"),process.exit(1));try{let y=a.startSpinner("Verifying your credentials"),h=await tt();y.stop(!0),a.success(`Logged in as ${h.username}`)}catch{a.error("Authentication failed. Your API key may be invalid or expired."),a.info("Please set a new API key with: phala auth login"),process.exit(1)}let t=Object.values($m);t.length===0&&(a.error("No template files found in the templates directory"),process.exit(1));let{selectedTemplate:r}=await Nm.prompt([{type:"list",name:"selectedTemplate",message:"Select a template to deploy:",choices:t.map(y=>({name:y.name,value:y}))}]),o=r.compose;a.success(`Selected template: ${r.name}`);let n=zu.randomBytes(16).toString("hex"),s=z([`TOKEN=${n}`],""),{cvmName:i}=await Nm.prompt([{type:"input",name:"cvmName",message:"Enter a name for your CVM:",default:`${r.name.replace(" ","-")}`,validate:y=>y.trim()?!0:"CVM name is required"}]);a.info("Preparing to deploy your CVM...");let c={teepod_id:3,name:i,image:Yt,vcpu:2,memory:2048,disk_size:20,compose_manifest:{docker_compose_file:o,docker_config:{url:"",username:"",password:""},features:["kms","tproxy-net"],kms_enabled:!0,manifest_version:2,name:i,public_logs:!0,public_sysinfo:!0,tproxy_enabled:!0},listed:!1},p=a.startSpinner("Preparing CVM configuration"),m=await Me(c);p.stop(!0),m||(a.error("Failed to prepare CVM configuration"),process.exit(1));let l=await Uu(s,m.app_env_encrypt_pubkey);a.debug("Public key:",m.app_env_encrypt_pubkey),a.debug("Encrypted environment variables:",l);let f=a.startSpinner("Creating your demo CVM"),u=await Re({...c,encrypted_env:l,app_env_encrypt_pubkey:m.app_env_encrypt_pubkey,app_id_salt:m.app_id_salt});f.stop(!0),u||(a.error("Failed to create demo CVM"),process.exit(1)),a.success("Demo CVM created successfully! \u{1F389}"),a.break();let d={"CVM ID":u.id,Name:u.name,Status:u.status,"App ID":`app_${u.app_id}`,"App URL":u.app_url?u.app_url:`${_}/dashboard/cvms/app_${u.app_id}`,Template:r.name,Resources:"2 vCPUs, 2GB RAM, 20GB Storage"};r.name.includes("Jupyter Notebook")&&(d["Jupyter Token"]=n,d["Access Instructions"]="Access your Jupyter notebook using the token above. Go to 'Network' tab to see the public URL."),a.keyValueTable(d,{borderStyle:"rounded"}),a.break(),a.success(`Your demo is being created. You can check its status with:
88
+ phala cvms get app_${u.app_id}`)}catch(e){a.error(`Failed to launch demo: ${e instanceof Error?e.message:String(e)}`),process.exit(1)}});import{Command as Rm}from"commander";async function Es(){try{let{nodes:e,kms_list:t}=await be();if(e.length===0){a.info("No available nodes found.");return}a.info("Available Nodes:"),e.forEach(r=>{a.info("----------------------------------------"),a.info(` ID: ${r.teepod_id}`),a.info(` Name: ${r.name}`),a.info(` Region: ${r.region_identifier}`),a.info(` FMSPC: ${r.fmspc||"N/A"}`),a.info(` Device ID: ${r.device_id||"N/A"}`),a.info(` Support Onchain KMS: ${r.support_onchain_kms}`),a.info(" Images:"),r.images&&r.images.length>0?r.images.forEach(o=>{a.info(` - ${o.name}`),a.info(` Hash: ${o.os_image_hash||"N/A"}`)}):a.info(" N/A")}),t&&t.length>0&&(a.info(`
89
+ Available KMS Instances:`),t.forEach(r=>{a.info("----------------------------------------"),a.info(` ID: ${r.id}`),a.info(` URL: ${r.url}`),a.info(` Version: ${r.version}`),a.info(` Chain ID: ${r.chain_id}`),a.info(` Contract Address: ${r.kms_contract_address}`),a.info(` Gateway App ID: ${r.gateway_app_id}`)}))}catch(e){throw a.error(`Failed to list available nodes: ${e instanceof Error?e.message:String(e)}`),e}}var Um=new Rm().name("nodes").description("List and manage TEE nodes").action(Es).addCommand(new Rm("list").description("List all available worker nodes").alias("ls").action(Es));import{Command as Ou}from"commander";import{Command as Hu}from"commander";import Lu from"inquirer";import{ethers as Vu}from"ethers";var zm=new Hu().name("deploy").description("Deploy or register an AppAuth contract for on-chain KMS.").option("--kms-contract-address <kmsContractAddress>","Address of the main KmsAuth contract.").option("--private-key <privateKey>","Private key for signing transactions.").option("--network <network>","The network to deploy to (e.g., hardhat, phala, sepolia, test)").option("--rpc-url <rpcUrl>","RPC URL for the blockchain.").option("--app-auth-address <appAuthAddress>","Register a pre-deployed AppAuth contract.").option("--app-auth-contract-path <appAuthContractPath>","Path to a custom AppAuth contract file.").option("--use-default-app-auth","Deploy the default AppAuth contract via factory.",!1).option("--deployer-address <deployerAddress>","Address of the owner for the new AppAuth instance.").option("--initial-device-id <initialDeviceId>","Initial device ID for the new AppAuth instance.").option("--compose-hash <composeHash>","Initial compose hash for the new AppAuth instance.").action(async e=>{try{if([e.appAuthAddress,e.appAuthContractPath,e.useDefaultAppAuth].filter(Boolean).length>1)throw new Error("Cannot use --app-auth-address, --app-auth-contract-path, and --use-default-app-auth at the same time.");let{wallet:r,...o}=await Qe(e),n={...e,...o};if(!n.kmsContractAddress){let{addr:s}=await Lu.prompt([{type:"input",name:"addr",message:"Enter the address of the main KmsAuth contract:",validate:i=>Vu.isAddress(i)||"Please enter a valid Ethereum address."}]);n.kmsContractAddress=s}await fn(n,r)}catch(t){a.error(`An error occurred: ${t instanceof Error?t.message:String(t)}`),t.stack&&process.env.DEBUG&&a.error(t.stack),process.exit(1)}});var Hm=new Ou().name("kms").description("Manage On-Chain Key Management Service (KMS) components.").addCommand(zm);import{Command as Gu}from"commander";import{encryptEnvVars as Vm}from"@phala/dstack-sdk/encrypt-env-vars";import{ethers as Cs}from"ethers";import ks from"fs-extra";import As from"node:path";import Lm from"inquirer";async function qu(e){if(!e.name)if(e.interactive){let g=As.basename(process.cwd()).toLowerCase().replace(/[^a-z0-9_-]/g,"-"),{name:x}=await Lm.prompt([{type:"input",name:"name",message:"Enter a name for the CVM:",default:g,validate:b=>b.trim()?b.trim().length>20?"CVM name must be less than 20 characters":b.trim().length<3?"CVM name must be at least 3 characters":/^[a-zA-Z0-9_-]+$/.test(b)?!0:"CVM name must contain only letters, numbers, underscores, and hyphens":"CVM name is required"}]);e.name=x}else{let g=As.basename(process.cwd()).toLowerCase().replace(/[^a-z0-9_-]/g,"-");e.name=g}if(!e.compose)if(!e.interactive)a.error("Docker Compose file is required. Use --compose or --interactive to select it"),process.exit(1);else{let x=we(["docker-compose.yml","docker-compose.yaml"],"Detected docker compose file: {path}");e.compose=await R("Enter the path to your Docker Compose file:",x,"file")}let t=As.resolve(e.compose);if(!ks.existsSync(t))throw new Error(`Docker Compose file not found: ${t}`);let r=ks.readFileSync(t,"utf8"),o=[],n=[];if(!e.skipEnv){let g=e.envFile;if(!g){let x=[".env.production",".env.prod",".env"];for(let b of x)if(ks.existsSync(b)){g=b,a.info(`Using environment file: ${g}`);break}g||(e.interactive?g=await R("Enter the path to your environment file:",".env","file"):(a.error("Environment file is required. Use --env-file to select it"),process.exit(1)))}if(g)try{o=z([],g),n=o.map(x=>x.key),n.length>0?(a.info(`Using environment variables from ${g}`),a.debug(`Allowed environment variables: ${n.join(", ")}`)):a.warn(`No environment variables found in ${g}`)}catch(x){a.error(`Error reading environment file ${g}:`,x)}}let s=a.startSpinner("Fetching available Nodes"),i=await be();if(s.stop(!0),i.nodes.length===0)throw new Error("No Nodes available.");let c=i.nodes.filter(g=>e.kmsId?g.support_onchain_kms:!g.support_onchain_kms);if(c.length===0){let g=e.kmsId?"No Nodes available that support on-chain KMS.":"No Nodes available that does not support on-chain KMS.";throw new Error(g)}let p,m;if(e.kmsId){if(p=(i.kms_list||[]).find(x=>x.id===e.kmsId),!p)throw new Error(`No KMS found with ID: ${e.kmsId} in the available Nodes`);m=p.kms_contract_address,a.info(`Using KMS contract address: ${m} from KMS ID: ${e.kmsId}`)}let l;if(e.nodeId){if(l=c.find(g=>g.teepod_id===Number(e.nodeId)),!l)throw new Error(`Selected Node with ID ${e.nodeId} is not available or does not support on-chain KMS.`)}else if(!e.interactive)a.error("Node is required. Use --node-id to select it"),process.exit(1);else{let{node:g}=await Lm.prompt([{type:"list",name:"node",message:"Select a Node to use:",choices:c.map(x=>({name:`${x.name} (Region: ${x.region_identifier})`,value:x}))}]);l=g}let f;if(e.image){if(f=l.images?.find(g=>g.name===e.image),!f)throw new Error(`Failed to find selected image '${e.image}' for the selected Node.`)}else{if(f=l.images?.[0],!f)throw new Error("No images found for the selected Node.");a.info(`Using image: ${f.name}`)}let u={docker_compose_file:r,allowed_envs:n,features:["kms","tproxy-net"],kms_enabled:!0,manifest_version:2,name:e.name,public_logs:!0,public_sysinfo:!0,tproxy_enabled:!0};e.preLaunchScript&&(u.pre_launch_script=e.preLaunchScript);let d=ce;if(e.memory)try{d=ln(e.memory),a.info(`Using memory: ${d}MB (parsed from: ${e.memory})`)}catch{a.warn(`Invalid memory format '${e.memory}'. Using default: ${ce}MB`)}let y=me;if(e.diskSize)try{y=dn(e.diskSize),a.info(`Using disk size: ${y}GB (parsed from: ${e.diskSize})`)}catch{a.warn(`Invalid disk size format '${e.diskSize}'. Using default: ${me}GB`)}return{vmConfig:{teepod_id:l.teepod_id,name:e.name,image:f.name,vcpu:Number(e.vcpu)||Pe,memory:d,disk_size:y,compose_file:u,listed:!1},envs:o,teepods:i,kmsContractAddress:m}}async function ju(e,t={}){let r=a.startSpinner("Provisioning CVM for on-chain KMS..."),o=await Ar(e);if(r.stop(!0),!o)throw new Error("Failed to provision CVM for on-chain KMS");return t?.json!==!1?console.log(JSON.stringify({success:!0,data:{app_id:o.app_id,device_id:o.device_id,compose_hash:o.compose_hash,os_image_hash:o.os_image_hash,raw:o}},null,2)):(a.success("CVM provisioned successfully!"),a.keyValueTable({"App ID":o.app_id,"Device ID":o.device_id,"Compose Hash":o.compose_hash,"OS Image Hash":o.os_image_hash})),o}async function Ku(e,t,r,o,n){a.info(`
90
+ Step 4: Encrypting environment variables and creating final CVM...`);let s="",i=o.kms_list[0].id;n.kmsId&&(i=n.kmsId,a.info(`Using custom KMS ID: ${i}`));let c=n.customAppId?n.customAppId:e.appId;if(n.customAppId&&a.info(`Using custom App ID: ${c}`),r.length>0){let f=a.startSpinner("Fetching public key from KMS..."),{public_key:u}=await un(i,c);if(f.stop(!0),u){let d=a.startSpinner("Encrypting environment variables...");s=await Vm(r,u),d.stop(!0)}}let p={app_id:dt(c),compose_hash:t.compose_hash,contract_address:dt(e.proxyAddress),deployer_address:e.deployerAddress?dt(e.deployerAddress):"",encrypted_env:s,kms_id:i},m=a.startSpinner("Creating final CVM..."),l=await Sr(p);if(m.stop(!0),!l)throw new Error("Failed to create CVM");n?.json!==!1?console.log(JSON.stringify({success:!0,data:{vm_uuid:l.vm_uuid.replace(/-/g,""),name:l.name,status:l.status,app_id:l.app_id,endpoint:`${_}/dashboard/cvms/${l.vm_uuid.replace(/-/g,"")}`,raw:l}},null,2)):(a.success("CVM created successfully!"),a.break(),a.keyValueTable({"CVM ID":l.vm_uuid.replace(/-/g,""),Name:l.name,Status:l.status,"App ID":l.app_id,Endpoint:`${_}/dashboard/cvms/${l.vm_uuid.replace(/-/g,"")}`}))}async function Wu(e,t,r={}){let o=a.startSpinner("Getting public key from CVM"),n=await Me(e);if(o.stop(!0),!n)throw new Error("Failed to get public key from CVM");let s=a.startSpinner("Encrypting environment variables"),i=await Vm(t,n.app_env_encrypt_pubkey);s.stop(!0);let c=a.startSpinner("Provisioning CVM"),p=await Re({...e,encrypted_env:i,app_env_encrypt_pubkey:n.app_env_encrypt_pubkey,app_id_salt:n.app_id_salt});if(c.stop(!0),!p)throw new Error("Failed to create CVM");if(r?.json!==!1){let m={success:!0,data:{cvm_id:p.vm_uuid.replace(/-/g,""),app_id:p.app_id,name:p.name,status:p.status,endpoint:`${_}/dashboard/cvms/${p.vm_uuid.replace(/-/g,"")}`,created_at:p.created_at,raw:p}};p.kms_contract_address&&(m.data.kms_contract_address=p.kms_contract_address),p.kms_owner_address&&(m.data.kms_owner_address=p.kms_owner_address),console.log(JSON.stringify(m,null,2))}else{a.success("CVM created successfully"),a.break();let m={"CVM ID":p.vm_uuid.replace(/-/g,""),"App ID":p.app_id,Name:p.name,Status:p.status,Endpoint:`${_}/dashboard/cvms/${p.vm_uuid.replace(/-/g,"")}`,"Created At":new Date(p.created_at).toLocaleString()};p.kms_contract_address&&(m["KMS Contract Address"]=p.kms_contract_address),p.kms_owner_address&&(m["KMS Owner Address"]=p.kms_owner_address),a.keyValueTable(m)}}var Om=new Gu().command("deploy").description("Create a new CVM with on-chain KMS in one step.").option("--json","Output in JSON format (default: true)",!0).option("--no-json","Disable JSON output format").option("--debug","Enable debug logging",!1).option("-n, --name <name>","Name of the CVM").option("-c, --compose <compose>","Path to Docker Compose file").option("--vcpu <vcpu>",`Number of vCPUs, default is ${Pe}`).option("--memory <memory>",`Memory with optional unit (e.g., 2G, 500MB, 1024), default is ${ce}MB`).option("--disk-size <diskSize>",`Disk size with optional unit (e.g., 50G, 1T, 100), default is ${me}GB`).option("--image <image>","Version of dstack image to use").option("--node-id <nodeId>","Node ID to use").option("-e, --env-file <envFile>","Path to environment file").option("--skip-env","Skip environment variable prompt",!1).option("-i, --interactive","Enable interactive mode for required parameters",!1).option("--kms-id <kmsId>","KMS ID to use.").option("--custom-app-id <customAppId>","Custom App ID to use.").option("--pre-launch-script <preLaunchScript>","Path to pre-launch script").option("--private-key <privateKey>","Private key for signing transactions.").option("--rpc-url <rpcUrl>","RPC URL for the blockchain.").action(async e=>{try{a.info("Step 1: Preparing CVM configuration...");let{vmConfig:t,envs:r,teepods:o,kmsContractAddress:n}=await qu(e);if(!e.kmsId){await Wu(t,r,{json:e.json,debug:e.debug});return}a.info(`
91
+ Step 2: Provisioning CVM...`);let s=await ju(t);a.info(`
92
+ Step 3: Configuring network and setting up AppAuth...`);let i=null;if(!e.customAppId){let m=e.privateKey||process.env.PRIVATE_KEY;if(!m)throw new Error("Private key is required for on-chain KMS operations if no custom app ID is provided. Please provide it via --private-key or PRIVATE_KEY environment variable");i=(await Qe({privateKey:m,rpcUrl:e.rpcUrl},o.kms_list[0].chain_id)).wallet,e.json===!1&&a.info(`Using wallet: ${i.address}`)}let c={...e,initialDeviceId:s.device_id,composeHash:s.compose_hash};console.log("deployOptions",c);let p;if(e.customAppId){e.json===!1&&a.info(`Using custom App ID: ${e.customAppId}, fetching AppAuth details from KMS...`);let m=o.kms_list?.[0];if(!m)throw new Error("No KMS available");let{rpcUrl:l}=await Qe({rpcUrl:e.rpcUrl},m.chain_id),f=gt(m.chain_id),u=lt({chain:f,transport:mt(l)}),d=[{inputs:[{name:"app",type:"address"}],name:"apps",outputs:[{name:"isRegistered",type:"bool"},{name:"controller",type:"address"}],stateMutability:"view",type:"function"}];try{if(!Cs.isAddress(n))throw new Error(`Invalid KMS contract address: ${n}`);if(!Cs.isAddress(e.customAppId))throw new Error(`Invalid custom App ID: ${e.customAppId}`);let y=e.customAppId.startsWith("0x")?e.customAppId:`0x${e.customAppId}`,[h,g]=await u.readContract({address:n,abi:d,functionName:"apps",args:[y]});if(!h)throw new Error(`App ${e.customAppId} is not registered in KMS contract ${n}`);if(!g||g===Cs.ZeroAddress)throw new Error(`Invalid controller address for app ${e.customAppId}`);e.json===!1&&a.info(`Successfully verified AppAuth contract at ${g}`),p={appId:e.customAppId,proxyAddress:g,deployerAddress:""}}catch(y){throw new Error(`Failed to verify custom App ID: ${y instanceof Error?y.message:String(y)}`)}}else{if(!i)throw new Error("Wallet is required when not using a custom App ID");p=await fn(c,i,n)}await Ku(p,s,r,o,e)}catch(t){let r=`Failed to create CVM: ${t instanceof Error?t.message:String(t)}`;e.json!==!1?console.error(JSON.stringify({success:!1,error:r,stack:e.debug&&t instanceof Error?t.stack:void 0},null,2)):a.error(r),process.exit(1)}});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Yu(){let e=new Ju().name("phala").alias("pha").description(`${Wr}
93
+ Phala Cloud CLI - Manage your Phala Cloud Deployments`).version("v1.0.15").option("--api-key <key>","API key to use for the command").addCommand(_i).addCommand(_m).addCommand(qi).addCommand(Wi).addCommand(Mm).addCommand(Dm).addCommand(Hm).addCommand(Um).addCommand(Om);e.hook("preAction",t=>{let r=t.opts();r.apiKey&&Is(r.apiKey)}),e.parse(process.argv)}Yu().catch(e=>{a.error("An error occurred:",e),process.exit(1)});
86
94
  //# sourceMappingURL=index.js.map