@0xobelisk/sui-cli 0.5.26 → 0.5.27

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/dubhe.js CHANGED
@@ -1,46 +1,51 @@
1
1
  #!/usr/bin/env node
2
- import bo from"yargs";import{hideBin as _o}from"yargs/helpers";import{Dubhe as De}from"@0xobelisk/sui-client";import{Transaction as Y}from"@mysten/sui/transactions";import{getFullnodeUrl as Re,SuiClient as Fe}from"@mysten/sui/client";import{execSync as Oe}from"child_process";import S from"chalk";import D from"chalk";import{ZodError as ve}from"zod";import{fromZodError as we,ValidationError as Ce}from"zod-validation-error";var H=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"},_=class extends Error{name="DubheCliError"},O=class extends Error{name="UpgradeError"},A=class extends Error{name="FsIibError"};function E(e){if(e instanceof Ce)console.log(D.redBright(e.message));else if(e instanceof ve){let o=we(e,{prefixSeparator:`
2
+ import ko from"yargs";import{hideBin as So}from"yargs/helpers";import{Dubhe as Ue}from"@0xobelisk/sui-client";import{Transaction as W}from"@mysten/sui/transactions";import{getFullnodeUrl as Le,SuiClient as Ke}from"@mysten/sui/client";import{execSync as je}from"child_process";import $ from"chalk";import R from"chalk";import{ZodError as Se}from"zod";import{fromZodError as Ie,ValidationError as $e}from"zod-validation-error";var J=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"},w=class extends Error{name="DubheCliError"},T=class extends Error{name="UpgradeError"},V=class extends Error{name="FsIibError"};function D(e){if(e instanceof $e)console.log(R.redBright(e.message));else if(e instanceof Se){let o=Ie(e,{prefixSeparator:`
3
3
  - `,issueSeparator:`
4
- - `});console.log(D.redBright(o.message))}else e instanceof H?(console.log(D.red(e.message)),console.log(""),console.log(D.blue("To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk"))):e instanceof _?console.log(D.red(e)):console.log(e)}import*as W from"fs/promises";import{mkdirSync as Pe,writeFileSync as $e}from"fs";import{dirname as Ee}from"path";import{SUI_PRIVATE_KEY_PREFIX as Ne}from"@mysten/sui/cryptography";import{execSync as xe,spawn as ke}from"child_process";import f from"chalk";function Se(){try{let e=process.platform==="win32"?'tasklist /FI "IMAGENAME eq sui.exe" /FO CSV /NH':'pgrep -f "sui start"',o=xe(e).toString().trim();return process.platform==="win32"?o.toLowerCase().includes("sui.exe"):o.length>0}catch{return!1}}async function T(e=!1){if(console.log(`
5
- \u{1F50D} Checking Local Node Status...`),console.log(" \u251C\u2500 Scanning running processes"),Se()){console.log(f.yellow(`
6
- \u26A0\uFE0F Warning: Local Node Already Running`)),console.log(f.yellow(" \u251C\u2500 Cannot start a new instance")),console.log(f.yellow(" \u2514\u2500 Please stop the existing process first"));return}console.log(`
7
- \u{1F680} Starting Local Node...`),console.log(" \u251C\u2500 Mode: "+(e?"Background":"Foreground")),console.log(" \u251C\u2500 Faucet: Enabled"),console.log(" \u2514\u2500 Force Regenesis: Yes");try{let o=ke("sui",["start","--with-faucet","--force-regenesis"],{env:{...process.env,RUST_LOG:"off,sui_node=info"},stdio:e?"ignore":"inherit",detached:e});o.on("error",t=>{console.error(f.red(`
8
- \u274C Failed to Start Local Node`)),console.error(f.red(` \u2514\u2500 Error: ${t.message}`))}),e?(o.unref(),console.log(f.green(`
4
+ - `});console.log(R.redBright(o.message))}else e instanceof J?(console.log(R.red(e.message)),console.log(""),console.log(R.blue("To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk"))):e instanceof w?console.log(R.red(e)):console.log(e)}import*as Z from"fs/promises";import{mkdirSync as Me,writeFileSync as Fe}from"fs";import{dirname as Re}from"path";import{SUI_PRIVATE_KEY_PREFIX as Oe}from"@mysten/sui/cryptography";import{execSync as Ee,spawn as Pe}from"child_process";import y from"chalk";function De(){try{let e=process.platform==="win32"?'tasklist /FI "IMAGENAME eq sui.exe" /FO CSV /NH':'pgrep -f "sui start"',o=Ee(e).toString().trim();return process.platform==="win32"?o.toLowerCase().includes("sui.exe"):o.length>0}catch{return!1}}async function U(e=!1){if(console.log(`
5
+ \u{1F50D} Checking Local Node Status...`),console.log(" \u251C\u2500 Scanning running processes"),De()){console.log(y.yellow(`
6
+ \u26A0\uFE0F Warning: Local Node Already Running`)),console.log(y.yellow(" \u251C\u2500 Cannot start a new instance")),console.log(y.yellow(" \u2514\u2500 Please stop the existing process first"));return}console.log(`
7
+ \u{1F680} Starting Local Node...`),console.log(" \u251C\u2500 Mode: "+(e?"Background":"Foreground")),console.log(" \u251C\u2500 Faucet: Enabled"),console.log(" \u2514\u2500 Force Regenesis: Yes");try{let o=Pe("sui",["start","--with-faucet","--force-regenesis"],{env:{...process.env,RUST_LOG:"off,sui_node=info"},stdio:e?"ignore":"inherit",detached:e});o.on("error",t=>{console.error(y.red(`
8
+ \u274C Failed to Start Local Node`)),console.error(y.red(` \u2514\u2500 Error: ${t.message}`))}),e?(o.unref(),console.log(y.green(`
9
9
  \u2705 Local Node Started in Background`)),process.platform==="win32"?(console.log(`
10
10
  \u{1F4A1} Helpful Commands:`),console.log(" \u251C\u2500 Check Process: tasklist | findstr sui.exe"),console.log(" \u2514\u2500 Stop Node: taskkill /PID <process_id> /F")):(console.log(`
11
- \u{1F4A1} Helpful Commands:`),console.log(" \u251C\u2500 Check Process: pgrep -f 'sui start'"),console.log(" \u2514\u2500 Stop Node: kill <process_id>"))):(o.on("exit",t=>{t===0?(console.log(f.green(`
12
- \u2705 Local Node Stopped`)),console.log(f.green(" \u2514\u2500 Exit Status: Normal"))):(console.error(f.red(`
13
- \u274C Local Node Crashed`)),console.error(f.red(` \u2514\u2500 Exit Code: ${t}`)))}),console.log(f.cyan(`
14
- \u{1F4E1} Local Node Running`)),console.log(f.cyan(" \u2514\u2500 Press Ctrl+C to stop")),await new Promise(()=>{}))}catch(o){console.error(f.red(`
15
- \u274C Failed to Start Local Node`)),console.error(f.red(` \u2514\u2500 Error: ${o.message}`))}}import{execSync as Ie}from"child_process";import x from"chalk";async function B(){console.log(`
16
- \u{1F50D} Checking Local Node Status...`);try{let e=process.platform==="win32"?'tasklist /FI "IMAGENAME eq sui.exe" /FO CSV /NH':"ps aux | grep '[s]ui start --with-faucet --force-regenesis'",o=Ie(e,{encoding:"utf8"});(process.platform==="win32"?o.toLowerCase().includes("sui.exe"):o.split(`
17
- `).filter(Boolean).length>0)?(console.log(x.green(`
18
- \u2705 Node Status: Running`)),console.log(x.gray(`
19
- \u{1F4CA} Process Details:`)),console.log(x.gray(` \u2514\u2500 ${o.trim()}`))):(console.log(x.red(`
20
- \u274C Node Status: Not Running`)),console.log(x.yellow(`
21
- \u{1F4A1} Quick Start:`)),console.log(x.yellow(" \u2514\u2500 Run `dubhe localnode start`")))}catch{console.log(x.red(`
22
- \u274C Node Status: Not Running`)),console.log(x.yellow(`
23
- \u{1F4A1} Quick Start:`)),console.log(x.yellow(" \u2514\u2500 Run `dubhe localnode start`"))}}import{execSync as q}from"child_process";async function V(){console.log("Stopping local node...");try{let e=process.platform==="win32"?'tasklist /FI "IMAGENAME eq sui.exe" /FO CSV /NH':"ps aux | grep '[s]ui start --with-faucet --force-regenesis'",o=q(e,{encoding:"utf8"});if(!o){console.log("No running local node process found");return}let t;if(process.platform==="win32"){let n=o.match(/"sui\.exe",["']?(\d+)/i);t=n?n[1]:null}else t=o.toString().split(/\s+/)[1];if(!t){console.log("No running local node process found");return}process.platform==="win32"?q(`taskkill /PID ${t} /F`):process.kill(Number(t)),console.log("\u2705 Local node stopped successfully")}catch(e){e.code==="ESRCH"||e.message.includes("no running tasks")?console.log("No running local node process found"):console.error("\u274C Error stopping local node:",e.message)}}function N(e){if(e.startsWith(Ne))return e.length===70?e:!1;if(e.startsWith("0x")){let o=e.slice(2);return o.length===64?o:!1}else return e.length===64?e:!1}async function R(e,o){try{let t=await W.readFile(`${e}/.history/sui_${o}/latest.json`,"utf8");return JSON.parse(t)}catch{throw new A("Fs read deployment file failed.")}}async function z(e,o){return(await R(e,o)).schemas}async function Q(e,o){return(await R(e,o)).version}async function Z(e,o){return(await R(e,o)).packageId}async function X(e,o){return(await R(e,o)).upgradeCap}async function U(e,o){return(await R(e,o)).schemaHub}function F(e,o,t,n,a,c,i){let u={projectName:e,network:o,packageId:t,schemas:i,upgradeCap:n,schemaHub:a,version:c},s=process.cwd(),l=JSON.stringify(u,null,2);Me(l,`${s}/contracts/${e}/.history/sui_${o}/latest.json`,"Update deploy log")}async function Me(e,o,t){Pe(Ee(o),{recursive:!0}),$e(o,e),t!==void 0&&console.log(`${t}: ${o}`)}import*as I from"fs";import*as ee from"path";async function Ae(e){switch(e){case"localnet":{let o=process.cwd();return await U(`${o}/contracts/dubhe-framework`,e)}case"testnet":return"0x181befc40b3dafe2740b41d5a970e49bed2cca20205506ee6be2cfb73ff2d3e9";default:return"0x181befc40b3dafe2740b41d5a970e49bed2cca20205506ee6be2cfb73ff2d3e9"}}function oe(e,o){if(!I.existsSync(e))return;let t=I.readFileSync(e,"utf-8"),n=new RegExp(`\\[env\\.${o}\\][\\s\\S]*?(?=\\[|$)`,"g"),a=t.replace(n,"");I.writeFileSync(e,a,"utf-8")}var Te={localnet:"dfa7bb83",testnet:"4c78adac",mainnet:"35834a8a"};function te(e,o,t,n){let a=ee.resolve(e),c=I.readFileSync(a,"utf-8"),i=c.split(`
24
- `),u=i.findIndex(m=>m.trim()===`[env.${o}]`),s={chainId:Te[o]||"",originalPublishedId:"",latestPublishedId:"",publishedVersion:0};if(u===-1)if(t==="publish")s.originalPublishedId=n,s.latestPublishedId=n,s.publishedVersion=1;else throw new Error(`Network type [env.${o}] not found in the file and cannot upgrade.`);else{for(let m=u+1;m<i.length;m++){let w=i[m].trim();if(w.startsWith("["))break;let[h,y]=w.split("=").map(b=>b.trim().replace(/"/g,""));switch(h){case"chain-id":s.chainId=y;break;case"original-published-id":s.originalPublishedId=y;break;case"latest-published-id":s.latestPublishedId=y;break;case"published-version":s.publishedVersion=parseInt(y,10);break}}t==="publish"?(s.originalPublishedId=n,s.latestPublishedId=n,s.publishedVersion=1):t==="upgrade"&&(s.latestPublishedId=n,s.publishedVersion+=1)}let l=`
11
+ \u{1F4A1} Helpful Commands:`),console.log(" \u251C\u2500 Check Process: pgrep -f 'sui start'"),console.log(" \u2514\u2500 Stop Node: kill <process_id>"))):(o.on("exit",t=>{t===0?(console.log(y.green(`
12
+ \u2705 Local Node Stopped`)),console.log(y.green(" \u2514\u2500 Exit Status: Normal"))):(console.error(y.red(`
13
+ \u274C Local Node Crashed`)),console.error(y.red(` \u2514\u2500 Exit Code: ${t}`)))}),console.log(y.cyan(`
14
+ \u{1F4E1} Local Node Running`)),console.log(y.cyan(" \u2514\u2500 Press Ctrl+C to stop")),await new Promise(()=>{}))}catch(o){console.error(y.red(`
15
+ \u274C Failed to Start Local Node`)),console.error(y.red(` \u2514\u2500 Error: ${o.message}`))}}import{execSync as Ne}from"child_process";import k from"chalk";async function q(){console.log(`
16
+ \u{1F50D} Checking Local Node Status...`);try{let e=process.platform==="win32"?'tasklist /FI "IMAGENAME eq sui.exe" /FO CSV /NH':"ps aux | grep '[s]ui start --with-faucet --force-regenesis'",o=Ne(e,{encoding:"utf8"});(process.platform==="win32"?o.toLowerCase().includes("sui.exe"):o.split(`
17
+ `).filter(Boolean).length>0)?(console.log(k.green(`
18
+ \u2705 Node Status: Running`)),console.log(k.gray(`
19
+ \u{1F4CA} Process Details:`)),console.log(k.gray(` \u2514\u2500 ${o.trim()}`))):(console.log(k.red(`
20
+ \u274C Node Status: Not Running`)),console.log(k.yellow(`
21
+ \u{1F4A1} Quick Start:`)),console.log(k.yellow(" \u2514\u2500 Run `dubhe localnode start`")))}catch{console.log(k.red(`
22
+ \u274C Node Status: Not Running`)),console.log(k.yellow(`
23
+ \u{1F4A1} Quick Start:`)),console.log(k.yellow(" \u2514\u2500 Run `dubhe localnode start`"))}}import{execSync as Q}from"child_process";async function L(){console.log("Stopping local node...");try{let e=process.platform==="win32"?'tasklist /FI "IMAGENAME eq sui.exe" /FO CSV /NH':"ps aux | grep '[s]ui start --with-faucet --force-regenesis'",o=Q(e,{encoding:"utf8"});if(!o){console.log("No running local node process found");return}let t;if(process.platform==="win32"){let s=o.match(/"sui\.exe",["']?(\d+)/i);t=s?s[1]:null}else t=o.toString().split(/\s+/)[1];if(!t){console.log("No running local node process found");return}process.platform==="win32"?Q(`taskkill /PID ${t} /F`):process.kill(Number(t)),console.log("\u2705 Local node stopped successfully")}catch(e){e.code==="ESRCH"||e.message.includes("no running tasks")?console.log("No running local node process found"):console.error("\u274C Error stopping local node:",e.message)}}import*as K from"fs";import S from"chalk";import{spawn as Ae}from"child_process";function N(e){if(e.startsWith(Oe))return e.length===70?e:!1;if(e.startsWith("0x")){let o=e.slice(2);return o.length===64?o:!1}else return e.length===64?e:!1}async function O(e,o){try{let t=await Z.readFile(`${e}/.history/sui_${o}/latest.json`,"utf8");return JSON.parse(t)}catch{throw new V("Fs read deployment file failed.")}}async function X(e,o){return(await O(e,o)).schemas}async function ee(e,o){return(await O(e,o)).version}async function oe(e,o){return(await O(e,o)).packageId}async function te(e,o){return(await O(e,o)).upgradeCap}async function j(e,o){return(await O(e,o)).schemaHub}function A(e,o,t,s,n,u,c){let d={projectName:e,network:o,packageId:t,schemas:c,upgradeCap:s,schemaHub:n,version:u},l=process.cwd(),r=JSON.stringify(d,null,2);Te(r,`${l}/contracts/${e}/.history/sui_${o}/latest.json`,"Update deploy log")}async function Te(e,o,t){Me(Re(o),{recursive:!0}),Fe(o,e),t!==void 0&&console.log(`${t}: ${o}`)}function Ve(e){switch(e){case"localnet":return'Dubhe = { local = "../dubhe-framework" }';case"testnet":return'Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "dubhe-testnet-v1.0.0" }';case"mainnet":return'Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "dubhe-mainnet-v1.0.0" }';default:throw new Error(`Unsupported network: ${e}`)}}function ne(e,o){let t=K.readFileSync(e,"utf-8"),s=Ve(o),n=t.replace(/Dubhe = \{.*\}/,s);K.writeFileSync(e,n,"utf-8"),console.log(`Updated Dubhe dependency in ${e} for ${o}.`)}async function H(e){try{return new Promise((o,t)=>{let s=Ae("sui",["client","switch","--env",e],{env:{...process.env},stdio:"pipe"});s.stdout.on("data",n=>{console.log(S.green(`${n.toString()}`))}),s.stderr.on("data",n=>{console.error(S.red(`
24
+ \u274C Failed to Switch Env`)),console.error(S.red(` Error: ${n.toString()}`))}),s.on("error",n=>{console.error(S.red(`
25
+ \u274C Failed to Switch Env`)),console.error(S.red(` Error: ${n.message}`)),t(n)}),s.on("exit",n=>{n!==0?(console.error(S.red(`
26
+ \u274C Process exited with code: ${n}`)),t(new Error(`Process exited with code: ${n}`))):(console.log(S.green(`
27
+ \u2705 Environment switched successfully.`)),o())})})}catch(o){console.error(S.red(`
28
+ \u274C Failed to Switch Env`)),console.error(S.red(` \u2514\u2500 Error: ${o}`))}}var se=e=>new Promise(o=>setTimeout(o,e));import*as E from"fs";import*as re from"path";async function He(e){switch(e){case"localnet":{let o=process.cwd();return await j(`${o}/contracts/dubhe-framework`,e)}case"testnet":return"0x181befc40b3dafe2740b41d5a970e49bed2cca20205506ee6be2cfb73ff2d3e9";default:return"0x181befc40b3dafe2740b41d5a970e49bed2cca20205506ee6be2cfb73ff2d3e9"}}function ae(e,o){if(!E.existsSync(e))return;let t=E.readFileSync(e,"utf-8"),s=new RegExp(`\\[env\\.${o}\\][\\s\\S]*?(?=\\[|$)`,"g"),n=t.replace(s,"");E.writeFileSync(e,n,"utf-8")}function ie(e,o,t,s,n){let u=re.resolve(e),c=E.readFileSync(u,"utf-8"),d=c.split(`
29
+ `),l=d.findIndex(h=>h.trim()===`[env.${o}]`),r={chainId:s,originalPublishedId:"",latestPublishedId:"",publishedVersion:0};if(l===-1)if(t==="publish")r.originalPublishedId=n,r.latestPublishedId=n,r.publishedVersion=1;else throw new Error(`Network type [env.${o}] not found in the file and cannot upgrade.`);else{for(let h=l+1;h<d.length;h++){let b=d[h].trim();if(b.startsWith("["))break;let[C,_]=b.split("=").map(v=>v.trim().replace(/"/g,""));switch(C){case"original-published-id":r.originalPublishedId=_;break;case"latest-published-id":r.latestPublishedId=_;break;case"published-version":r.publishedVersion=parseInt(_,10);break}}t==="publish"?(r.originalPublishedId=n,r.latestPublishedId=n,r.publishedVersion=1):t==="upgrade"&&(r.latestPublishedId=n,r.publishedVersion+=1)}let p=`
25
30
  [env.${o}]
26
- chain-id = "${s.chainId}"
27
- original-published-id = "${s.originalPublishedId}"
28
- latest-published-id = "${s.latestPublishedId}"
29
- published-version = "${s.publishedVersion}"
30
- `,p=u===-1?c+l:i.slice(0,u).join(`
31
- `)+l;I.writeFileSync(a,p,"utf-8")}function Ve(e){return e.split("_").map((o,t)=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join("")}function Ue(e){let o=e.split("::");return o.length>0?o[o.length-1]:""}function ne(e){let o,t;try{let n=JSON.parse(Oe(`sui move build --dump-bytecode-as-base64 --path ${e}`,{encoding:"utf-8"}));o=n.modules,t=n.dependencies,console.log(" \u2514\u2500 Build successful")}catch(n){console.error(S.red(" \u2514\u2500 Build failed")),console.error(n.stdout),process.exit(1)}return[o,t]}async function Le(e,o,t,n,a){let c=await Ae(n);console.log("dappsObjectId",c),oe(`${a}/Move.lock`,n),console.log(`
32
- \u{1F680} Starting Contract Publication...`),console.log(` \u251C\u2500 Project: ${a}`),console.log(` \u251C\u2500 Network: ${n}`),console.log(" \u251C\u2500 Validating Environment...");let i=o.getKeypair();console.log(` \u2514\u2500 Account: ${i.toSuiAddress()}`),console.log(`
33
- \u{1F4E6} Building Contract...`);let[u,s]=ne(a);console.log(`
34
- \u{1F504} Publishing Contract...`);let l=new Y,[p]=l.publish({modules:u,dependencies:s});l.transferObjects([p],i.toSuiAddress());let m;try{m=await e.signAndExecuteTransaction({signer:i,transaction:l,options:{showObjectChanges:!0}})}catch(r){console.error(S.red(" \u2514\u2500 Publication failed")),console.error(r.message),process.exit(1)}m.effects?.status.status==="failure"&&(console.log(S.red(" \u2514\u2500 Publication failed")),process.exit(1)),console.log(" \u251C\u2500 Processing publication results...");let w=1,h="",y=[],b="",g="";m.objectChanges.map(r=>{r.type==="published"&&(console.log(` \u251C\u2500 Package ID: ${r.packageId}`),h=r.packageId),r.type==="created"&&r.objectType==="0x2::package::UpgradeCap"&&(console.log(` \u251C\u2500 Upgrade Cap: ${r.objectId}`),b=r.objectId),r.type==="created"&&r.objectType.includes("schema_hub")&&(console.log(` \u251C\u2500 Schema Hub: ${r.objectId}`),g=r.objectId)}),console.log(` \u2514\u2500 Transaction: ${m.digest}`),te(`${a}/Move.lock`,n,"publish",h),console.log(`
35
- \u26A1 Executing Deploy Hook...`),await new Promise(r=>setTimeout(r,5e3));let d=new Y;d.setGasBudget(2e9);let[k]=d.splitCoins(d.gas,["1000000000"]);d.moveCall({target:`${h}::deploy_hook::run`,arguments:[d.object(g),d.object(c),d.object(b),d.object("0x6"),k]});let v;try{v=await e.signAndExecuteTransaction({signer:i,transaction:d,options:{showEffects:!0,showObjectChanges:!0}})}catch(r){console.error(S.red(" \u2514\u2500 Deploy hook execution failed")),console.error(r.message),process.exit(1)}v.effects?.status.status==="success"?(console.log(" \u251C\u2500 Hook execution successful"),console.log(` \u251C\u2500 Transaction: ${v.digest}`),console.log(`
36
- \u{1F4CB} Created Schemas:`),v.objectChanges?.map(r=>{if(r.type==="created"&&r.objectType.includes("_schema")&&!r.objectType.includes("dynamic_field")){console.log(` \u251C\u2500 ${r.objectType}`),console.log(` \u2514\u2500 ID: ${r.objectId}`);let P={};for(let C in t.schemas)Ve(C)===Ue(r.objectType)&&(P=t.schemas[C].structure);y.push({name:r.objectType,objectId:r.objectId,structure:P})}}),F(t.name,n,h,b,g,w,y),console.log(`
31
+ chain-id = "${r.chainId}"
32
+ original-published-id = "${r.originalPublishedId}"
33
+ latest-published-id = "${r.latestPublishedId}"
34
+ published-version = "${r.publishedVersion}"
35
+ `,f=l===-1?c+p:d.slice(0,l).join(`
36
+ `)+p;E.writeFileSync(u,f,"utf-8")}function Be(e){return e.split("_").map((o,t)=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join("")}function Ye(e){let o=e.split("::");return o.length>0?o[o.length-1]:""}function ce(e){let o,t;try{let s=JSON.parse(je(`sui move build --dump-bytecode-as-base64 --path ${e}`,{encoding:"utf-8"}));o=s.modules,t=s.dependencies,console.log(" \u2514\u2500 Build successful")}catch(s){console.error($.red(" \u2514\u2500 Build failed")),console.error(s.stdout),process.exit(1)}return[o,t]}async function Ge(e,o,t,s,n){let u=await He(s);console.log("dappsObjectId",u);let c=await e.getChainIdentifier();ae(`${n}/Move.lock`,s),console.log(`
37
+ \u{1F680} Starting Contract Publication...`),console.log(` \u251C\u2500 Project: ${n}`),console.log(` \u251C\u2500 Network: ${s}`),console.log(` \u251C\u2500 ChainId: ${c}`),console.log(" \u251C\u2500 Validating Environment...");let d=o.getKeypair();console.log(` \u2514\u2500 Account: ${d.toSuiAddress()}`),console.log(`
38
+ \u{1F4E6} Building Contract...`);let[l,r]=ce(n);console.log(`
39
+ \u{1F504} Publishing Contract...`);let p=new W,[f]=p.publish({modules:l,dependencies:r});p.transferObjects([f],d.toSuiAddress());let h;try{h=await e.signAndExecuteTransaction({signer:d,transaction:p,options:{showObjectChanges:!0}})}catch(i){console.error($.red(" \u2514\u2500 Publication failed")),console.error(i.message),process.exit(1)}h.effects?.status.status==="failure"&&(console.log($.red(" \u2514\u2500 Publication failed")),process.exit(1)),console.log(" \u251C\u2500 Processing publication results...");let b=1,C="",_=[],v="",a="";h.objectChanges.map(i=>{i.type==="published"&&(console.log(` \u251C\u2500 Package ID: ${i.packageId}`),C=i.packageId),i.type==="created"&&i.objectType==="0x2::package::UpgradeCap"&&(console.log(` \u251C\u2500 Upgrade Cap: ${i.objectId}`),v=i.objectId),i.type==="created"&&i.objectType.includes("schema_hub")&&(console.log(` \u251C\u2500 Schema Hub: ${i.objectId}`),a=i.objectId)}),console.log(` \u2514\u2500 Transaction: ${h.digest}`),ie(`${n}/Move.lock`,s,"publish",c,C),console.log(`
40
+ \u26A1 Executing Deploy Hook...`),await se(5e3);let g=new W;g.setGasBudget(2e9);let[I]=g.splitCoins(g.gas,["1000000000"]);g.moveCall({target:`${C}::deploy_hook::run`,arguments:[g.object(a),g.object(u),g.object(v),g.object("0x6"),I]});let m;try{m=await e.signAndExecuteTransaction({signer:d,transaction:g,options:{showEffects:!0,showObjectChanges:!0}})}catch(i){console.error($.red(" \u2514\u2500 Deploy hook execution failed")),console.error(i.message),process.exit(1)}m.effects?.status.status==="success"?(console.log(" \u251C\u2500 Hook execution successful"),console.log(` \u251C\u2500 Transaction: ${m.digest}`),console.log(`
41
+ \u{1F4CB} Created Schemas:`),m.objectChanges?.map(i=>{if(i.type==="created"&&i.objectType.includes("_schema")&&!i.objectType.includes("dynamic_field")){console.log(` \u251C\u2500 ${i.objectType}`),console.log(` \u2514\u2500 ID: ${i.objectId}`);let x={};for(let F in t.schemas)Be(F)===Ye(i.objectType)&&(x=t.schemas[F].structure);_.push({name:i.objectType,objectId:i.objectId,structure:x})}}),A(t.name,s,C,v,a,b,_),console.log(`
37
42
  \u2705 Contract Publication Complete
38
- `)):(console.log(S.yellow(" \u2514\u2500 Deploy hook execution failed")),console.log(S.yellow(" Please republish or manually call deploy_hook::run")))}async function Ke(e,o,t){let a=`${process.cwd()}/contracts/dubhe-framework`;oe(`${a}/Move.lock`,t),console.log(`
39
- \u{1F680} Starting Contract Publication...`),console.log(` \u251C\u2500 Project: ${a}`),console.log(` \u251C\u2500 Network: ${t}`),console.log(" \u251C\u2500 Validating Environment...");let c=o.getKeypair();console.log(` \u2514\u2500 Account: ${c.toSuiAddress()}`),console.log(`
40
- \u{1F4E6} Building Contract...`);let[i,u]=ne(a);console.log(`
41
- \u{1F504} Publishing Contract...`);let s=new Y,[l]=s.publish({modules:i,dependencies:u});s.transferObjects([l],c.toSuiAddress());let p;try{p=await e.signAndExecuteTransaction({signer:c,transaction:s,options:{showObjectChanges:!0}})}catch(g){console.error(S.red(" \u2514\u2500 Publication failed")),console.error(g.message),process.exit(1)}p.effects?.status.status==="failure"&&(console.log(S.red(" \u2514\u2500 Publication failed")),process.exit(1)),console.log(" \u251C\u2500 Processing publication results...");let m=1,w="",h=[],y="",b="";p.objectChanges.map(g=>{g.type==="published"&&(console.log(` \u251C\u2500 Package ID: ${g.packageId}`),w=g.packageId),g.type==="created"&&g.objectType==="0x2::package::UpgradeCap"&&(console.log(` \u251C\u2500 Upgrade Cap: ${g.objectId}`),y=g.objectId),g.type==="created"&&g.objectType.includes("dapps")&&(console.log(` \u251C\u2500 Dapps: ${g.objectId}`),b=g.objectId)}),console.log(` \u2514\u2500 Transaction: ${p.digest}`),te(`${a}/Move.lock`,t,"publish",w),F("dubhe-framework",t,w,y,b,m,h)}async function se(e,o,t){let n=process.env.PRIVATE_KEY;if(!n)throw new _(`Missing PRIVATE_KEY environment variable.
43
+ `)):(console.log($.yellow(" \u2514\u2500 Deploy hook execution failed")),console.log($.yellow(" Please republish or manually call deploy_hook::run")))}async function Je(e,o,t){let n=`${process.cwd()}/contracts/dubhe-framework`,u=await e.getChainIdentifier();console.log(` \u2514\u2500 Chain ID: ${u}`),ae(`${n}/Move.lock`,t),console.log(`
44
+ \u{1F680} Starting Contract Publication...`),console.log(` \u251C\u2500 Project: ${n}`),console.log(` \u251C\u2500 Network: ${t}`),console.log(` \u251C\u2500 ChainId: ${u}`),console.log(" \u251C\u2500 Validating Environment...");let c=o.getKeypair();console.log(` \u2514\u2500 Account: ${c.toSuiAddress()}`),console.log(`
45
+ \u{1F4E6} Building Contract...`);let[d,l]=ce(n);console.log(`
46
+ \u{1F504} Publishing Contract...`);let r=new W,[p]=r.publish({modules:d,dependencies:l});r.transferObjects([p],c.toSuiAddress());let f;try{f=await e.signAndExecuteTransaction({signer:c,transaction:r,options:{showObjectChanges:!0}})}catch(a){console.error($.red(" \u2514\u2500 Publication failed")),console.error(a.message),process.exit(1)}f.effects?.status.status==="failure"&&(console.log($.red(" \u2514\u2500 Publication failed")),process.exit(1)),console.log(" \u251C\u2500 Processing publication results...");let h=1,b="",C=[],_="",v="";f.objectChanges.map(a=>{a.type==="published"&&(console.log(` \u251C\u2500 Package ID: ${a.packageId}`),b=a.packageId),a.type==="created"&&a.objectType==="0x2::package::UpgradeCap"&&(console.log(` \u251C\u2500 Upgrade Cap: ${a.objectId}`),_=a.objectId),a.type==="created"&&a.objectType.includes("dapps")&&(console.log(` \u251C\u2500 Dapps: ${a.objectId}`),v=a.objectId)}),console.log(` \u2514\u2500 Transaction: ${f.digest}`),ie(`${n}/Move.lock`,t,"publish",u,b),A("dubhe-framework",t,b,_,v,h,C)}async function le(e,o,t){await H(o);let s=process.env.PRIVATE_KEY;if(!s)throw new w(`Missing PRIVATE_KEY environment variable.
42
47
  Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
43
- in your contracts directory to use the default sui private key.`);let a=N(n);if(a===!1)throw new _("Please check your privateKey.");let c=new De({secretKey:a}),i=c.getKeypair();console.log(` \u2514\u2500 Account: ${i.toSuiAddress()}`);let u=new Fe({url:Re(o)});if(t=="dubhe-framework")await Ke(u,c,o);else{let l=`${process.cwd()}/contracts/${e.name}`;await Le(u,c,e,o,l)}}import je from"chalk";function re(){console.log(je.yellow(`
48
+ in your contracts directory to use the default sui private key.`);let n=N(s);if(n===!1)throw new w("Please check your privateKey.");let u=new Ue({secretKey:n}),c=new Ke({url:Le(o)});if(t=="dubhe-framework")await Je(c,u,o);else{let l=`${process.cwd()}/contracts/${e.name}`;ne(`${l}/Move.toml`,o),await Ge(c,u,e,o,l)}}import qe from"chalk";function de(){console.log(qe.yellow(`
44
49
  Welcome to Dubhe
45
50
  --from team@obelisk
46
51
  ________ ___ ___ ________ ___ ___ _______
@@ -51,21 +56,21 @@ Welcome to Dubhe
51
56
  \\ \\_______\\ \\_______\\ \\_______\\ \\__\\ \\__\\ \\_______\\
52
57
  \\|_______|\\|_______|\\|_______|\\|__|\\|__|\\|_______|
53
58
 
54
- `))}var He={command:"localnode <action>",describe:"Manage local Sui node",builder(e){return e.positional("action",{describe:"Action to perform",choices:["start","stop","status","restart"],type:"string",demandOption:!0}).option("background",{alias:"b",type:"boolean",description:"Run node in background",default:!1})},async handler(e){let{action:o,background:t}=e;try{switch(o){case"start":await T(t);break;case"stop":await V();break;case"status":await B();break;case"restart":await Be(t);break}}catch(n){console.error("Error executing command:",n),process.exit(1)}}};async function Be(e){console.log("Restarting local Sui node..."),await V(),await T(e),console.log("Local node has been restarted")}var ae=He;import{Dubhe as Ye}from"@0xobelisk/sui-client";import{requestSuiFromFaucetV0 as Ge,getFaucetHost as Je}from"@mysten/sui/faucet";import{SuiClient as qe,getFullnodeUrl as We}from"@mysten/sui/client";var ze={command:"faucet",describe:"Interact with a Dubhe faucet",builder(e){return e.options({network:{type:"string",desc:"URL of the Dubhe faucet",choices:["testnet","devnet","localnet"],default:"localnet"},recipient:{type:"string",desc:"Sui address to fund"}})},async handler({network:e,recipient:o}){let t="";if(o===void 0){let i=process.env.PRIVATE_KEY;if(!i)throw new _(`Missing PRIVATE_KEY environment variable.
59
+ `))}var We={command:"localnode <action>",describe:"Manage local Sui node",builder(e){return e.positional("action",{describe:"Action to perform",choices:["start","stop","status","restart"],type:"string",demandOption:!0}).option("background",{alias:"b",type:"boolean",description:"Run node in background",default:!1})},async handler(e){let{action:o,background:t}=e;try{switch(o){case"start":await U(t);break;case"stop":await L();break;case"status":await q();break;case"restart":await ze(t);break}}catch(s){console.error("Error executing command:",s),process.exit(1)}}};async function ze(e){console.log("Restarting local Sui node..."),await L(),await U(e),console.log("Local node has been restarted")}var ue=We;import{Dubhe as Qe}from"@0xobelisk/sui-client";import{requestSuiFromFaucetV0 as Ze,getFaucetHost as Xe}from"@mysten/sui/faucet";import{SuiClient as eo,getFullnodeUrl as oo}from"@mysten/sui/client";var to={command:"faucet",describe:"Interact with a Dubhe faucet",builder(e){return e.options({network:{type:"string",desc:"URL of the Dubhe faucet",choices:["testnet","devnet","localnet"],default:"localnet"},recipient:{type:"string",desc:"Sui address to fund"}})},async handler({network:e,recipient:o}){let t="";if(o===void 0){let c=process.env.PRIVATE_KEY;if(!c)throw new w(`Missing PRIVATE_KEY environment variable.
55
60
  Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
56
- in your contracts directory to use the default sui private key.`);let u=N(i);if(u===!1)throw new _("Please check your PRIVATE_KEY.");t=new Ye({secretKey:u}).getKeypair().toSuiAddress()}else t=o;console.log(`
57
- \u{1F30A} Starting Faucet Operation...`),console.log(` \u251C\u2500 Network: ${e}`),o===void 0?(console.log(" \u251C\u2500 Using Environment PrivateKey"),console.log(` \u251C\u2500 Generated Address: ${t}`)):console.log(` \u251C\u2500 Using Provided Address: ${t}`),console.log(" \u251C\u2500 Requesting funds from faucet..."),await Ge({host:Je(e),recipient:t}),console.log(" \u2514\u2500 Checking balance...");let n=new qe({url:We(e)}),a={owner:t},c=await n.getBalance(a);console.log(`
58
- \u{1F4B0} Account Summary`),console.log(` \u251C\u2500 Address: ${t}`),console.log(` \u2514\u2500 Balance: ${(Number(c.totalBalance)/1e9).toFixed(4)} SUI`),console.log(`
61
+ in your contracts directory to use the default sui private key.`);let d=N(c);if(d===!1)throw new w("Please check your PRIVATE_KEY.");t=new Qe({secretKey:d}).getKeypair().toSuiAddress()}else t=o;console.log(`
62
+ \u{1F30A} Starting Faucet Operation...`),console.log(` \u251C\u2500 Network: ${e}`),o===void 0?(console.log(" \u251C\u2500 Using Environment PrivateKey"),console.log(` \u251C\u2500 Generated Address: ${t}`)):console.log(` \u251C\u2500 Using Provided Address: ${t}`),console.log(" \u251C\u2500 Requesting funds from faucet..."),await Ze({host:Xe(e),recipient:t}),console.log(" \u2514\u2500 Checking balance...");let s=new eo({url:oo(e)}),n={owner:t},u=await s.getBalance(n);console.log(`
63
+ \u{1F4B0} Account Summary`),console.log(` \u251C\u2500 Address: ${t}`),console.log(` \u2514\u2500 Balance: ${(Number(u.totalBalance)/1e9).toFixed(4)} SUI`),console.log(`
59
64
  \u2705 Faucet Operation Complete
60
- `),process.exit(0)}},ie=ze;import{schemaGen as Qe,loadConfig as Ze}from"@0xobelisk/sui-common";import Xe from"chalk";var eo={command:"schemagen",describe:"Autogenerate Dubhe schemas based on the config file",builder:{configPath:{type:"string",default:"dubhe.config.ts",desc:"Path to the config file"},network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Node network (mainnet/testnet/devnet/localnet)"},frameworkId:{type:"string",desc:"Framework Package ID"}},async handler({configPath:e,network:o,frameworkId:t}){try{let n=await Ze(e);await Qe(n,void 0,o,t),process.exit(0)}catch(n){console.log(Xe.red("Schemagen failed!")),console.error(n.message)}}},ce=eo;import{loadConfig as oo}from"@0xobelisk/sui-common";var to={command:"publish",describe:"Publish dubhe move contract",builder(e){return e.options({network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Node network (mainnet/testnet/devnet/localnet)"},configPath:{type:"string",default:"dubhe.config.ts",desc:"Configuration file path"},contractName:{type:"string",desc:"Optional contract name"}})},async handler({network:e,configPath:o,contractName:t}){try{let n=await oo(o);await se(n,e,t)}catch(n){E(n),process.exit(1)}process.exit(0)}},le=to;import{Dubhe as no}from"@0xobelisk/sui-client";import{Transaction as so,UpgradePolicy as ro}from"@mysten/sui/transactions";import{getFullnodeUrl as ao,SuiClient as io}from"@mysten/sui/client";import{execSync as co}from"child_process";import L from"chalk";import*as M from"fs";import*as de from"path";function lo(e,o){o.forEach(t=>{let n=`${e}/sources/codegen/schemas/${t.schemaName}.move`,a=M.readFileSync(n,"utf-8"),c=new RegExp(`public fun migrate\\(_${t.schemaName}: &mut ${G(t.schemaName)}, _cap: &UpgradeCap\\) {[^}]*}`),i=`
61
- public fun migrate(${t.schemaName}: &mut ${G(t.schemaName)}, _cap: &UpgradeCap) {
62
- ${t.fields.map(s=>{let l="";return s.type.includes("StorageValue")?l="storage_value::new()":s.type.includes("StorageMap")?l="storage_map::new()":s.type.includes("StorageDoubleMap")&&(l="storage_double_map::new()"),`storage_migrate::add_field<${s.type}>(&mut ${t.schemaName}.id, b"${s.name}", ${l});`}).join("")}
65
+ `),process.exit(0)}},pe=to;import{schemaGen as no,loadConfig as so}from"@0xobelisk/sui-common";import ro from"chalk";var ao={command:"schemagen",describe:"Autogenerate Dubhe schemas based on the config file",builder:{configPath:{type:"string",default:"dubhe.config.ts",desc:"Path to the config file"},network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Node network (mainnet/testnet/devnet/localnet)"},frameworkId:{type:"string",desc:"Framework Package ID"}},async handler({configPath:e,network:o,frameworkId:t}){try{let s=await so(e);await no(s,void 0,o,t),process.exit(0)}catch(s){console.log(ro.red("Schemagen failed!")),console.error(s.message)}}},ge=ao;import{loadConfig as io}from"@0xobelisk/sui-common";var co={command:"publish",describe:"Publish dubhe move contract",builder(e){return e.options({network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Node network (mainnet/testnet/devnet/localnet)"},configPath:{type:"string",default:"dubhe.config.ts",desc:"Configuration file path"},contractName:{type:"string",desc:"Optional contract name"}})},async handler({network:e,configPath:o,contractName:t}){try{let s=await io(o);await le(s,e,t)}catch(s){D(s),process.exit(1)}process.exit(0)}},me=co;import{Dubhe as lo}from"@0xobelisk/sui-client";import{Transaction as uo,UpgradePolicy as po}from"@mysten/sui/transactions";import{getFullnodeUrl as go,SuiClient as mo}from"@mysten/sui/client";import{execSync as fo}from"child_process";import B from"chalk";import*as M from"fs";import*as fe from"path";function ho(e,o){o.forEach(t=>{let s=`${e}/sources/codegen/schemas/${t.schemaName}.move`,n=M.readFileSync(s,"utf-8"),u=new RegExp(`public fun migrate\\(_${t.schemaName}: &mut ${z(t.schemaName)}, _cap: &UpgradeCap\\) {[^}]*}`),c=`
66
+ public fun migrate(${t.schemaName}: &mut ${z(t.schemaName)}, _cap: &UpgradeCap) {
67
+ ${t.fields.map(l=>{let r="";return l.type.includes("StorageValue")?r="storage_value::new()":l.type.includes("StorageMap")?r="storage_map::new()":l.type.includes("StorageDoubleMap")&&(r="storage_double_map::new()"),`storage_migrate::add_field<${l.type}>(&mut ${t.schemaName}.id, b"${l.name}", ${r});`}).join("")}
63
68
  }
64
- `,u=a.replace(c,i);M.writeFileSync(n,u,"utf-8")})}function G(e){return e.split("_").map((o,t)=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join("")}function uo(e){let o=e.split("::");return o.length>0?o[o.length-1]:""}function K(e,o,t,n){let a=de.resolve(e),i=M.readFileSync(a,"utf-8").split(`
65
- `),u=i.findIndex(p=>p.trim()===`[env.${o}]`);if(u===-1)return console.log(`Network type [env.${o}] not found in the file.`),"";let s=-1,l="";for(let p=u+1;p<i.length;p++){let m=i[p].trim();if(m.startsWith("["))break;if(m.startsWith(t)){s=p,l=m.split("=")[1].trim().replace(/"/g,"");break}}if(s!==-1){i[s]=`${t} = "${n}"`;let p=i.join(`
66
- `);M.writeFileSync(a,p,"utf-8"),console.log(`${t} for [env.${o}] replaced successfully.`)}else console.log(`${t} not found for [env.${o}].`);return l}async function ue(e,o,t){let n=process.cwd(),a=`${n}/contracts/${o}`,c=process.env.PRIVATE_KEY;if(!c)throw new _(`Missing PRIVATE_KEY environment variable.
69
+ `,d=n.replace(u,c);M.writeFileSync(s,d,"utf-8")})}function z(e){return e.split("_").map((o,t)=>o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()).join("")}function yo(e){let o=e.split("::");return o.length>0?o[o.length-1]:""}function Y(e,o,t,s){let n=fe.resolve(e),c=M.readFileSync(n,"utf-8").split(`
70
+ `),d=c.findIndex(p=>p.trim()===`[env.${o}]`);if(d===-1)return console.log(`Network type [env.${o}] not found in the file.`),"";let l=-1,r="";for(let p=d+1;p<c.length;p++){let f=c[p].trim();if(f.startsWith("["))break;if(f.startsWith(t)){l=p,r=f.split("=")[1].trim().replace(/"/g,"");break}}if(l!==-1){c[l]=`${t} = "${s}"`;let p=c.join(`
71
+ `);M.writeFileSync(n,p,"utf-8")}else console.log(`${t} not found for [env.${o}].`);return r}async function he(e,o,t){await H(t);let s=process.cwd(),n=`${s}/contracts/${o}`,u=process.env.PRIVATE_KEY;if(!u)throw new w(`Missing PRIVATE_KEY environment variable.
67
72
  Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
68
- in your contracts directory to use the default sui private key.`);let i=N(c);if(i===!1)throw new _("Please check your privateKey.");let s=new no({secretKey:i}).getKeypair(),l=new io({url:ao(t)}),p=Number(await Q(a,t)),m=await Z(a,t),w=await U(a,t),h=await X(a,t),y=K(`${a}/Move.lock`,t,"original-published-id","0x0000000000000000000000000000000000000000000000000000000000000000"),b=[],g=await z(a,t);for(let d in e.schemas)g.forEach(k=>{if(G(d)==uo(k.name)){let v={schemaName:"",fields:[]},r=[],P=!1;for(let C in e.schemas[d].structure)C in k.structure||(P=!0,r.push({name:C,type:e.schemas[d].structure[C]}),k.structure[C]=e.schemas[d].structure[C]);P&&(v.schemaName=d,v.fields=r,b.push(v))}});b.forEach(d=>{console.log(`
69
- \u{1F680} Starting Migration for ${d.schemaName}...`),console.log("\u{1F4CB} Migration Fields:",d.fields)}),lo(a,b);try{let d,k,v;try{let{modules:$,dependencies:be,digest:_e}=JSON.parse(co(`sui move build --dump-bytecode-as-base64 --path ${n}/contracts/${o}`,{encoding:"utf-8"}));d=$,k=be,v=_e}catch($){throw new O($.stdout)}console.log(`
70
- \u{1F680} Starting Upgrade Process...`),console.log("\u{1F4CB} OldPackageId:",m),console.log("\u{1F4CB} UpgradeCap Object Id:",h),console.log("\u{1F4CB} OldVersion:",p);let r=new so,P=r.moveCall({target:"0x2::package::authorize_upgrade",arguments:[r.object(h),r.pure.u8(ro.COMPATIBLE),r.pure.vector("u8",v)]}),C=r.upgrade({modules:d,dependencies:k,package:m,ticket:P});r.moveCall({target:"0x2::package::commit_upgrade",arguments:[r.object(h),C]});let J=await l.signAndExecuteTransaction({signer:s,transaction:r,options:{showObjectChanges:!0}}),j="";J.objectChanges.map($=>{$.type==="published"&&(console.log(L.blue(`${o} PackageId: ${$.packageId}`)),console.log(L.blue(`${o} Version: ${p+1}`)),j=$.packageId)}),K(`${a}/Move.lock`,t,"original-published-id",y),K(`${a}/Move.lock`,t,"latest-published-id",j),K(`${a}/Move.lock`,t,"published-version",p+1+""),console.log(L.green(`Upgrade Transaction Digest: ${J.digest}`)),F(o,t,j,h,w,p+1,g)}catch(d){console.log(L.red("Upgrade failed!")),console.error(d.message)}}import{loadConfig as po}from"@0xobelisk/sui-common";var go={command:"upgrade",describe:"Upgrade your move contracts",builder(e){return e.options({network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Network of the node (mainnet/testnet/devnet/localnet)"},configPath:{type:"string",default:"dubhe.config.ts",decs:"Path to the config file"}})},async handler({network:e,configPath:o}){try{let t=await po(o);await ue(t,t.name,e)}catch(t){E(t),process.exit(1)}process.exit(0)}},pe=go;import{execSync as mo}from"child_process";import fo from"chalk";var ho={command:"test",describe:"Run tests in Dubhe contracts",builder(e){return e.options({packagePath:{type:"string",default:".",description:"Options to pass to forge test"}})},async handler({packagePath:e}){try{mo(`sui move test --path ${e}`,{encoding:"utf-8"})}catch(o){console.error(fo.red("Error executing sui move test:")),console.log(o.stdout),process.exit(0)}}},ge=ho;var yo={command:"hello",describe:"hello, dubhe",builder(e){return e},async handler(){re()}},me=yo;var fe=[le,ae,ie,ce,pe,ge,me];import*as ye from"dotenv";import he from"chalk";ye.config();bo(_o(process.argv)).scriptName("dubhe").command(fe).strict().fail((e,o)=>{console.error(he.red(e)),e.includes("Missing required argument")&&console.log(he.yellow(`Run 'pnpm dubhe ${process.argv[2]} --help' for a list of available and required arguments.`)),console.log(""),E(o),console.log(""),process.exit(1)}).alias({h:"help"}).argv;
73
+ in your contracts directory to use the default sui private key.`);let c=N(u);if(c===!1)throw new w("Please check your privateKey.");let l=new lo({secretKey:c}).getKeypair(),r=new mo({url:go(t)}),p=Number(await ee(n,t)),f=await oe(n,t),h=await j(n,t),b=await te(n,t),C=Y(`${n}/Move.lock`,t,"original-published-id","0x0000000000000000000000000000000000000000000000000000000000000000"),_=[],v=await X(n,t);for(let a in e.schemas)v.forEach(g=>{if(z(a)==yo(g.name)){let I={schemaName:"",fields:[]},m=[],i=!1;for(let x in e.schemas[a].structure)x in g.structure||(i=!0,m.push({name:x,type:e.schemas[a].structure[x]}),g.structure[x]=e.schemas[a].structure[x]);i&&(I.schemaName=a,I.fields=m,_.push(I))}});_.forEach(a=>{console.log(`
74
+ \u{1F680} Starting Migration for ${a.schemaName}...`),console.log("\u{1F4CB} Migration Fields:",a.fields)}),ho(n,_);try{let a,g,I;try{let{modules:P,dependencies:xe,digest:ke}=JSON.parse(fo(`sui move build --dump-bytecode-as-base64 --path ${s}/contracts/${o}`,{encoding:"utf-8"}));a=P,g=xe,I=ke}catch(P){throw new T(P.stdout)}console.log(`
75
+ \u{1F680} Starting Upgrade Process...`),console.log("\u{1F4CB} OldPackageId:",f),console.log("\u{1F4CB} UpgradeCap Object Id:",b),console.log("\u{1F4CB} OldVersion:",p);let m=new uo,i=m.moveCall({target:"0x2::package::authorize_upgrade",arguments:[m.object(b),m.pure.u8(po.COMPATIBLE),m.pure.vector("u8",I)]}),x=m.upgrade({modules:a,dependencies:g,package:f,ticket:i});m.moveCall({target:"0x2::package::commit_upgrade",arguments:[m.object(b),x]});let F=await r.signAndExecuteTransaction({signer:l,transaction:m,options:{showObjectChanges:!0}}),G="";F.objectChanges.map(P=>{P.type==="published"&&(console.log(B.blue(`${o} PackageId: ${P.packageId}`)),console.log(B.blue(`${o} Version: ${p+1}`)),G=P.packageId)}),Y(`${n}/Move.lock`,t,"original-published-id",C),Y(`${n}/Move.lock`,t,"latest-published-id",G),Y(`${n}/Move.lock`,t,"published-version",p+1+""),console.log(B.green(`Upgrade Transaction Digest: ${F.digest}`)),A(o,t,G,b,h,p+1,v)}catch(a){console.log(B.red("Upgrade failed!")),console.error(a.message)}}import{loadConfig as bo}from"@0xobelisk/sui-common";var _o={command:"upgrade",describe:"Upgrade your move contracts",builder(e){return e.options({network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Network of the node (mainnet/testnet/devnet/localnet)"},configPath:{type:"string",default:"dubhe.config.ts",decs:"Path to the config file"}})},async handler({network:e,configPath:o}){try{let t=await bo(o);await he(t,t.name,e)}catch(t){D(t),process.exit(1)}process.exit(0)}},ye=_o;import{execSync as wo}from"child_process";import vo from"chalk";var Co={command:"test",describe:"Run tests in Dubhe contracts",builder(e){return e.options({packagePath:{type:"string",default:".",description:"Options to pass to forge test"}})},async handler({packagePath:e}){try{wo(`sui move test --path ${e}`,{encoding:"utf-8"})}catch(o){console.error(vo.red("Error executing sui move test:")),console.log(o.stdout),process.exit(0)}}},be=Co;var xo={command:"hello",describe:"hello, dubhe",builder(e){return e},async handler(){de()}},_e=xo;var we=[me,ue,pe,ge,ye,be,_e];import*as Ce from"dotenv";import ve from"chalk";Ce.config();ko(So(process.argv)).scriptName("dubhe").command(we).strict().fail((e,o)=>{console.error(ve.red(e)),e.includes("Missing required argument")&&console.log(ve.yellow(`Run 'pnpm dubhe ${process.argv[2]} --help' for a list of available and required arguments.`)),console.log(""),D(o),console.log(""),process.exit(1)}).alias({h:"help"}).argv;
71
76
  //# sourceMappingURL=dubhe.js.map
package/dist/dubhe.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dubhe.ts","../src/utils/publishHandler.ts","../src/utils/errors.ts","../src/utils/utils.ts","../src/utils/localnode/start.ts","../src/utils/localnode/status.ts","../src/utils/localnode/stop.ts","../src/utils/printDubhe.ts","../src/commands/localnode.ts","../src/commands/faucet.ts","../src/commands/schemagen.ts","../src/commands/publish.ts","../src/utils/upgradeHandler.ts","../src/commands/upgrade.ts","../src/commands/test.ts","../src/commands/hello.ts","../src/commands/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { commands } from \"./commands\";\nimport { logError } from \"./utils/errors\";\n\n// Load .env file into process.env\nimport * as dotenv from \"dotenv\";\nimport chalk from \"chalk\";\ndotenv.config();\n\nyargs(hideBin(process.argv))\n // Explicit name to display in help (by default it's the entry file, which may not be \"dubhe\" for e.g. ts-node)\n .scriptName(\"dubhe\")\n // Use the commands directory to scaffold\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- command array overload isn't typed, see https://github.com/yargs/yargs/blob/main/docs/advanced.md#esm-hierarchy\n .command(commands as any)\n // Enable strict mode.\n .strict()\n // Custom error handler\n .fail((msg, err) => {\n console.error(chalk.red(msg));\n if (msg.includes(\"Missing required argument\")) {\n console.log(\n chalk.yellow(`Run 'pnpm dubhe ${process.argv[2]} --help' for a list of available and required arguments.`)\n );\n }\n console.log(\"\");\n logError(err);\n console.log(\"\");\n\n process.exit(1);\n })\n // Useful aliases.\n .alias({ h: \"help\" }).argv;\n","import { Dubhe } from '@0xobelisk/sui-client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n\tgetFullnodeUrl,\n\tSuiClient,\n\tSuiTransactionBlockResponse,\n} from '@mysten/sui/client';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport { DubheCliError } from './errors';\nimport {\n\tupdateVersionInFile,\n\tsaveContractData,\n\tvalidatePrivateKey,\n\tschema, getSchemaHub,\n} from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nasync function getDappsObjectId(\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n\tswitch (network) {\n\t\tcase \"localnet\": {\n\t\t\tconst path = process.cwd();\n\t\t\treturn await getSchemaHub(`${path}/contracts/dubhe-framework`, network)\n\t\t}\n\t\tcase 'testnet':\n\t\t\treturn '0x181befc40b3dafe2740b41d5a970e49bed2cca20205506ee6be2cfb73ff2d3e9';\n\t\tdefault:\n\t\t\treturn '0x181befc40b3dafe2740b41d5a970e49bed2cca20205506ee6be2cfb73ff2d3e9';\n\t}\n}\n\nfunction removeEnvContent(filePath: string, networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet'): void {\n\tif (!fs.existsSync(filePath)) {\n\t\treturn;\n\t}\n\tconst content = fs.readFileSync(filePath, 'utf-8');\n\tconst regex = new RegExp(`\\\\[env\\\\.${networkType}\\\\][\\\\s\\\\S]*?(?=\\\\[|$)`, 'g');\n\tconst updatedContent = content.replace(regex, '');\n\tfs.writeFileSync(filePath, updatedContent, 'utf-8');\n}\n\ninterface EnvConfig {\n\tchainId: string;\n\toriginalPublishedId: string;\n\tlatestPublishedId: string;\n\tpublishedVersion: number;\n}\n\nconst chainIds: { [key: string]: string } = {\n\tlocalnet: 'dfa7bb83',\n\ttestnet: '4c78adac',\n\tmainnet: '35834a8a',\n};\n\nfunction updateEnvFile(filePath: string, networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet', operation: 'publish' | 'upgrade', publishedId: string): void {\n\tconst envFilePath = path.resolve(filePath);\n\tconst envContent = fs.readFileSync(envFilePath, 'utf-8');\n\tconst envLines = envContent.split('\\n');\n\n\tconst networkSectionIndex = envLines.findIndex(line => line.trim() === `[env.${networkType}]`);\n\tconst config: EnvConfig = {\n\t\tchainId: chainIds[networkType] || '',\n\t\toriginalPublishedId: '',\n\t\tlatestPublishedId: '',\n\t\tpublishedVersion: 0,\n\t};\n\n\tif (networkSectionIndex === -1) {\n\t\t// If network section is not found, add a new section\n\t\tif (operation === 'publish') {\n\t\t\tconfig.originalPublishedId = publishedId;\n\t\t\tconfig.latestPublishedId = publishedId;\n\t\t\tconfig.publishedVersion = 1;\n\t\t} else {\n\t\t\tthrow new Error(`Network type [env.${networkType}] not found in the file and cannot upgrade.`);\n\t\t}\n\t} else {\n\t\tfor (let i = networkSectionIndex + 1; i < envLines.length; i++) {\n\t\t\tconst line = envLines[i].trim();\n\t\t\tif (line.startsWith('[')) break; // End of the current network section\n\n\t\t\tconst [key, value] = line.split('=').map(part => part.trim().replace(/\"/g, ''));\n\t\t\tswitch (key) {\n\t\t\t\tcase 'chain-id':\n\t\t\t\t\tconfig.chainId = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'original-published-id':\n\t\t\t\t\tconfig.originalPublishedId = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'latest-published-id':\n\t\t\t\t\tconfig.latestPublishedId = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'published-version':\n\t\t\t\t\tconfig.publishedVersion = parseInt(value, 10);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'publish') {\n\t\t\tconfig.originalPublishedId = publishedId;\n\t\t\tconfig.latestPublishedId = publishedId;\n\t\t\tconfig.publishedVersion = 1;\n\t\t} else if (operation === 'upgrade') {\n\t\t\tconfig.latestPublishedId = publishedId;\n\t\t\tconfig.publishedVersion += 1;\n\t\t}\n\t}\n\n\tconst updatedSection = `\n[env.${networkType}]\nchain-id = \"${config.chainId}\"\noriginal-published-id = \"${config.originalPublishedId}\"\nlatest-published-id = \"${config.latestPublishedId}\"\npublished-version = \"${config.publishedVersion}\"\n`;\n\n\tconst newEnvContent = networkSectionIndex === -1\n\t\t? envContent + updatedSection\n\t\t: envLines.slice(0, networkSectionIndex).join('\\n') + updatedSection;\n\n\tfs.writeFileSync(envFilePath, newEnvContent, 'utf-8');\n}\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction getLastSegment(input: string): string {\n\tconst segments = input.split('::');\n\treturn segments.length > 0 ? segments[segments.length - 1] : '';\n}\n\nfunction buildContract(projectPath: string): string[][] {\n\tlet modules: any, dependencies: any;\n\ttry {\n\t\tconst buildResult = JSON.parse(\n\t\t\texecSync(\n\t\t\t\t`sui move build --dump-bytecode-as-base64 --path ${projectPath}`,\n\t\t\t\t{\n\t\t\t\t\tencoding: 'utf-8',\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t\tmodules = buildResult.modules;\n\t\tdependencies = buildResult.dependencies;\n\t\tconsole.log(' └─ Build successful');\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red(' └─ Build failed'));\n\t\tconsole.error(error.stdout);\n\t\tprocess.exit(1);\n\t}\n\treturn [modules, dependencies];\n}\n\nasync function publishContract(\n\tclient: SuiClient,\n\tdubhe: Dubhe,\n\tdubheConfig: DubheConfig,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tprojectPath: string\n) {\n\n\tconst dappsObjectId = await getDappsObjectId(network);\n\tconsole.log(\"dappsObjectId\", dappsObjectId);\n\n\tremoveEnvContent(`${projectPath}/Move.lock`, network);\n\tconsole.log('\\n🚀 Starting Contract Publication...');\n\tconsole.log(` ├─ Project: ${projectPath}`);\n\tconsole.log(` ├─ Network: ${network}`);\n\tconsole.log(' ├─ Validating Environment...');\n\n\tconst keypair = dubhe.getKeypair();\n\tconsole.log(` └─ Account: ${keypair.toSuiAddress()}`);\n\n\tconsole.log('\\n📦 Building Contract...');\n\tconst [modules, dependencies] = buildContract(projectPath);\n\n\tconsole.log('\\n🔄 Publishing Contract...');\n\tconst tx = new Transaction();\n\tconst [upgradeCap] = tx.publish({ modules, dependencies });\n\ttx.transferObjects([upgradeCap], keypair.toSuiAddress());\n\n\tlet result: SuiTransactionBlockResponse;\n\ttry {\n\t\tresult = await client.signAndExecuteTransaction({\n\t\t\tsigner: keypair,\n\t\t\ttransaction: tx,\n\t\t\toptions: { showObjectChanges: true },\n\t\t});\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red(' └─ Publication failed'));\n\t\tconsole.error(error.message);\n\t\tprocess.exit(1);\n\t}\n\n\tif (result.effects?.status.status === 'failure') {\n\t\tconsole.log(chalk.red(' └─ Publication failed'));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(' ├─ Processing publication results...');\n\tlet version = 1;\n\tlet packageId = '';\n\tlet schemas: schema[] = [];\n\tlet upgradeCapId = '';\n\tlet schemaHubId = '';\n\n\tresult.objectChanges!.map(object => {\n\t\tif (object.type === 'published') {\n\t\t\tconsole.log(` ├─ Package ID: ${object.packageId}`);\n\t\t\tpackageId = object.packageId;\n\t\t}\n\t\tif (\n\t\t\tobject.type === 'created' &&\n\t\t\tobject.objectType === '0x2::package::UpgradeCap'\n\t\t) {\n\t\t\tconsole.log(` ├─ Upgrade Cap: ${object.objectId}`);\n\t\t\tupgradeCapId = object.objectId;\n\t\t}\n\t\tif (\n\t\t\tobject.type === 'created' &&\n\t\t\tobject.objectType.includes(\"schema_hub\")\n\t\t) {\n\t\t\tconsole.log(` ├─ Schema Hub: ${object.objectId}`);\n\t\t\tschemaHubId = object.objectId;\n\t\t}\n\t});\n\n\tconsole.log(` └─ Transaction: ${result.digest}`);\n\n\tupdateEnvFile(`${projectPath}/Move.lock`, network, 'publish', packageId);\n\n\tconsole.log('\\n⚡ Executing Deploy Hook...');\n\tawait new Promise(resolve => setTimeout(resolve, 5000));\n\n\tconst deployHookTx = new Transaction();\n\tdeployHookTx.setGasBudget(2000000000);\n\tconst [txCoin] = deployHookTx.splitCoins(deployHookTx.gas, [\"1000000000\"]);\n\tdeployHookTx.moveCall({\n\t\ttarget: `${packageId}::deploy_hook::run`,\n\t\targuments: [\n\t\t\tdeployHookTx.object(schemaHubId),\n\t\t\tdeployHookTx.object(dappsObjectId),\n\t\t\tdeployHookTx.object(upgradeCapId),\n\t\t\tdeployHookTx.object('0x6'),\n\t\t\ttxCoin\n\t\t],\n\t});\n\n\tlet deployHookResult: SuiTransactionBlockResponse;\n\ttry {\n\t\tdeployHookResult = await client.signAndExecuteTransaction({\n\t\t\tsigner: keypair,\n\t\t\ttransaction: deployHookTx,\n\t\t\toptions: { showEffects: true, showObjectChanges: true },\n\t\t});\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red(' └─ Deploy hook execution failed'));\n\t\tconsole.error(error.message);\n\t\tprocess.exit(1);\n\t}\n\n\tif (deployHookResult.effects?.status.status === 'success') {\n\t\tconsole.log(' ├─ Hook execution successful');\n\t\tconsole.log(` ├─ Transaction: ${deployHookResult.digest}`);\n\n\t\tconsole.log('\\n📋 Created Schemas:');\n\t\tdeployHookResult.objectChanges?.map(object => {\n\t\t\tif (\n\t\t\t\tobject.type === 'created' &&\n\t\t\t\tobject.objectType.includes('_schema') && !object.objectType.includes(\"dynamic_field\")\n\t\t\t) {\n\t\t\t\tconsole.log(` ├─ ${object.objectType}`);\n\t\t\t\tconsole.log(` └─ ID: ${object.objectId}`);\n\n\t\t\t\tlet structure: Record<string, string> = {};\n\t\t\t\tfor (let schemaKey in dubheConfig.schemas) {\n\t\t\t\t\tif (capitalizeAndRemoveUnderscores(schemaKey) === getLastSegment(object.objectType)) {\n\t\t\t\t\t\tstructure = dubheConfig.schemas[schemaKey].structure;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tschemas.push({\n\t\t\t\t\tname: object.objectType,\n\t\t\t\t\tobjectId: object.objectId,\n\t\t\t\t\tstructure,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tsaveContractData(\n\t\t\tdubheConfig.name,\n\t\t\tnetwork,\n\t\t\tpackageId,\n\t\t\tupgradeCapId,\n\t\t\tschemaHubId,\n\t\t\tversion,\n\t\t\tschemas,\n\t\t);\n\t\tconsole.log('\\n✅ Contract Publication Complete\\n');\n\t} else {\n\t\tconsole.log(chalk.yellow(' └─ Deploy hook execution failed'));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t' Please republish or manually call deploy_hook::run'\n\t\t\t)\n\t\t);\n\t}\n}\n\nasync function publishDubheFramework(\n\tclient: SuiClient,\n\tdubhe: Dubhe,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n) {\n\tconst path = process.cwd();\n\tconst projectPath = `${path}/contracts/dubhe-framework`;\n\n\tremoveEnvContent(`${projectPath}/Move.lock`, network);\n\tconsole.log('\\n🚀 Starting Contract Publication...');\n\tconsole.log(` ├─ Project: ${projectPath}`);\n\tconsole.log(` ├─ Network: ${network}`);\n\tconsole.log(' ├─ Validating Environment...');\n\n\tconst keypair = dubhe.getKeypair();\n\tconsole.log(` └─ Account: ${keypair.toSuiAddress()}`);\n\n\n\tconsole.log('\\n📦 Building Contract...');\n\tconst [modules, dependencies] = buildContract(projectPath);\n\n\tconsole.log('\\n🔄 Publishing Contract...');\n\tconst tx = new Transaction();\n\tconst [upgradeCap] = tx.publish({ modules, dependencies });\n\ttx.transferObjects([upgradeCap], keypair.toSuiAddress());\n\n\tlet result: SuiTransactionBlockResponse;\n\ttry {\n\t\tresult = await client.signAndExecuteTransaction({\n\t\t\tsigner: keypair,\n\t\t\ttransaction: tx,\n\t\t\toptions: { showObjectChanges: true },\n\t\t});\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red(' └─ Publication failed'));\n\t\tconsole.error(error.message);\n\t\tprocess.exit(1);\n\t}\n\n\tif (result.effects?.status.status === 'failure') {\n\t\tconsole.log(chalk.red(' └─ Publication failed'));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(' ├─ Processing publication results...');\n\tlet version = 1;\n\tlet packageId = '';\n\tlet schemas: schema[] = [];\n\tlet upgradeCapId = '';\n\tlet schemaHubId = '';\n\n\tresult.objectChanges!.map(object => {\n\t\tif (object.type === 'published') {\n\t\t\tconsole.log(` ├─ Package ID: ${object.packageId}`);\n\t\t\tpackageId = object.packageId;\n\t\t}\n\t\tif (\n\t\t\tobject.type === 'created' &&\n\t\t\tobject.objectType === '0x2::package::UpgradeCap'\n\t\t) {\n\t\t\tconsole.log(` ├─ Upgrade Cap: ${object.objectId}`);\n\t\t\tupgradeCapId = object.objectId;\n\t\t}\n\t\tif (\n\t\t\tobject.type === 'created' &&\n\t\t\tobject.objectType.includes(\"dapps\")\n\t\t) {\n\t\t\tconsole.log(` ├─ Dapps: ${object.objectId}`);\n\t\t\tschemaHubId = object.objectId;\n\t\t}\n\t});\n\n\tconsole.log(` └─ Transaction: ${result.digest}`);\n\n\tupdateEnvFile(`${projectPath}/Move.lock`, network, 'publish', packageId);\n\n\tsaveContractData(\n\t\t\"dubhe-framework\",\n\t\tnetwork,\n\t\tpackageId,\n\t\tupgradeCapId,\n\t\tschemaHubId,\n\t\tversion,\n\t\tschemas,\n\t);\n}\n\nexport async function publishHandler(\n\tdubheConfig: DubheConfig,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tcontractName?: string,\n) {\n\tconst privateKey = process.env.PRIVATE_KEY;\n\tif (!privateKey) {\n\t\tthrow new DubheCliError(\n\t\t\t`Missing PRIVATE_KEY environment variable.\nRun 'echo \"PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\nin your contracts directory to use the default sui private key.`\n\t\t);\n\t}\n\tconst privateKeyFormat = validatePrivateKey(privateKey);\n\tif (privateKeyFormat === false) {\n\t\tthrow new DubheCliError(`Please check your privateKey.`);\n\t}\n\n\tconst dubhe = new Dubhe({ secretKey: privateKeyFormat });\n\tconst keypair = dubhe.getKeypair();\n\tconsole.log(` └─ Account: ${keypair.toSuiAddress()}`);\n\n\tconst client = new SuiClient({ url: getFullnodeUrl(network) });\n\n\tif (contractName == \"dubhe-framework\") {\n\t\tawait publishDubheFramework(client, dubhe, network);\n\t} else {\n\t\tconst path = process.cwd();\n\t\tconst projectPath = `${path}/contracts/${dubheConfig.name}`;\n\t\tawait publishContract(client, dubhe, dubheConfig, network, projectPath);\n\t}\n}\n","import chalk from \"chalk\";\nimport { ZodError } from \"zod\";\nimport { fromZodError, ValidationError } from \"zod-validation-error\";\n\nexport class NotInsideProjectError extends Error {\n name = \"NotInsideProjectError\";\n message = \"You are not inside a Dubhe project\";\n}\n\nexport class DubheCliError extends Error {\n name = \"DubheCliError\";\n}\n\nexport class UpgradeError extends Error {\n name = \"UpgradeError\";\n}\n\nexport class FsIibError extends Error {\n name = \"FsIibError\";\n}\n\nexport function logError(error: unknown) {\n if (error instanceof ValidationError) {\n console.log(chalk.redBright(error.message));\n } else if (error instanceof ZodError) {\n // TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n const validationError = fromZodError(error, {\n prefixSeparator: \"\\n- \",\n issueSeparator: \"\\n- \",\n });\n console.log(chalk.redBright(validationError.message));\n } else if (error instanceof NotInsideProjectError) {\n console.log(chalk.red(error.message));\n console.log(\"\");\n // TODO add docs to the website and update the link to the specific page\n console.log(\n chalk.blue(\n `To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk`\n )\n );\n } else if (error instanceof DubheCliError) {\n console.log(chalk.red(error));\n } else {\n console.log(error);\n }\n}\n","import * as fsAsync from 'fs/promises';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { SUI_PRIVATE_KEY_PREFIX } from '@mysten/sui/cryptography';\nimport { FsIibError } from './errors';\nexport * from './localnode';\n\nexport type schema = {\n\tname: string;\n\tobjectId: string;\n\tstructure: Record<string, string>\n};\n\nexport type DeploymentJsonType = {\n\tprojectName: string;\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\tpackageId: string;\n\tupgradeCap: string;\n\tschemaHub: string;\n\tversion: number;\n\tschemas: schema[];\n};\n\nexport function validatePrivateKey(privateKey: string): false | string {\n\tif (privateKey.startsWith(SUI_PRIVATE_KEY_PREFIX)) {\n\t\tif (privateKey.length === 70) {\n\t\t\treturn privateKey;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else if (privateKey.startsWith('0x')) {\n\t\tconst strippedPrivateKey = privateKey.slice(2);\n\t\tif (strippedPrivateKey.length === 64) {\n\t\t\treturn strippedPrivateKey;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tif (privateKey.length === 64) {\n\t\t\treturn privateKey;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nexport async function updateVersionInFile(\n\tprojectPath: string,\n\tnewVersion: string\n) {\n\ttry {\n\t\tconst filePath = `${projectPath}/sources/script/migrate.move`;\n\t\tconst data = await fsAsync.readFile(filePath, 'utf8');\n\n\t\t// update version data\n\t\tconst updatedData = data.replace(\n\t\t\t/const VERSION: u64 = \\d+;/,\n\t\t\t`const VERSION: u64 = ${newVersion};`\n\t\t);\n\n\t\t// write new version\n\t\twriteOutput(updatedData, filePath, 'Update package version');\n\t} catch {\n\t\tthrow new FsIibError('Fs update version failed.');\n\t}\n}\n\nasync function getDeploymentJson(projectPath: string, network: string) {\n\ttry {\n\t\tconst data = await fsAsync.readFile(\n\t\t\t`${projectPath}/.history/sui_${network}/latest.json`,\n\t\t\t'utf8'\n\t\t);\n\t\treturn JSON.parse(data) as DeploymentJsonType;\n\t} catch {\n\t\tthrow new FsIibError('Fs read deployment file failed.');\n\t}\n}\n\nexport async function getOnchainSchemas(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<schema[]> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.schemas;\n}\n\nexport async function getVersion(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<number> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.version;\n}\n\nexport async function getNetwork(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<'mainnet' | 'testnet' | 'devnet' | 'localnet'> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.network;\n}\n\nexport async function getOldPackageId(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<string> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.packageId;\n}\n\nexport async function getUpgradeCap(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<string> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.upgradeCap;\n}\n\nexport async function getSchemaHub(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<string> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.schemaHub;\n}\n\nexport async function getObjectIdBySchemaName(\n\tprojectPath: string,\n\tnetwork: string,\n\tschemaName: string\n): Promise<string | undefined> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.schemas.find(schema => schema.name.includes(schemaName))\n\t\t?.objectId;\n}\n\nexport function saveContractData(\n\tprojectName: string,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tpackageId: string,\n\tupgradeCap: string,\n\tschemaHub: string,\n\tversion: number,\n schemas: schema[],\n) {\n\tconst DeploymentData: DeploymentJsonType = {\n\t\tprojectName,\n\t\tnetwork,\n\t\tpackageId,\n\t\tschemas,\n\t\tupgradeCap,\n\t\tschemaHub,\n\t\tversion,\n\t};\n\n\tconst path = process.cwd();\n\tconst storeDeploymentData = JSON.stringify(DeploymentData, null, 2);\n\twriteOutput(\n\t\tstoreDeploymentData,\n\t\t`${path}/contracts/${projectName}/.history/sui_${network}/latest.json`,\n\t\t'Update deploy log'\n\t);\n}\n\nexport async function writeOutput(\n\toutput: string,\n\tfullOutputPath: string,\n\tlogPrefix?: string\n): Promise<void> {\n\tmkdirSync(dirname(fullOutputPath), { recursive: true });\n\n\twriteFileSync(fullOutputPath, output);\n\tif (logPrefix !== undefined) {\n\t\tconsole.log(`${logPrefix}: ${fullOutputPath}`);\n\t}\n}\n","import { execSync, spawn } from 'child_process';\nimport chalk from 'chalk';\n\nfunction isSuiStartRunning(): boolean {\n\ttry {\n\t\tconst cmd =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? `tasklist /FI \"IMAGENAME eq sui.exe\" /FO CSV /NH`\n\t\t\t\t: 'pgrep -f \"sui start\"';\n\n\t\tconst result = execSync(cmd).toString().trim();\n\t\treturn process.platform === 'win32'\n\t\t\t? result.toLowerCase().includes('sui.exe')\n\t\t\t: result.length > 0;\n\t} catch (error) {\n\t\treturn false;\n\t}\n}\n\nexport async function startLocalnode(background: boolean = false) {\n\tconsole.log('\\n🔍 Checking Local Node Status...');\n\tconsole.log(' ├─ Scanning running processes');\n\n\tif (isSuiStartRunning()) {\n\t\tconsole.log(chalk.yellow('\\n⚠️ Warning: Local Node Already Running'));\n\t\tconsole.log(chalk.yellow(' ├─ Cannot start a new instance'));\n\t\tconsole.log(\n\t\t\tchalk.yellow(' └─ Please stop the existing process first')\n\t\t);\n\t\treturn;\n\t}\n\n\tconsole.log('\\n🚀 Starting Local Node...');\n\tconsole.log(' ├─ Mode: ' + (background ? 'Background' : 'Foreground'));\n\tconsole.log(' ├─ Faucet: Enabled');\n\tconsole.log(' └─ Force Regenesis: Yes');\n\n\ttry {\n\t\tconst suiProcess = spawn(\n\t\t\t'sui',\n\t\t\t['start', '--with-faucet', '--force-regenesis'],\n\t\t\t{\n\t\t\t\tenv: { ...process.env, RUST_LOG: 'off,sui_node=info' },\n\t\t\t\tstdio: background ? 'ignore' : 'inherit',\n\t\t\t\tdetached: background,\n\t\t\t}\n\t\t);\n\n\t\tsuiProcess.on('error', error => {\n\t\t\tconsole.error(chalk.red('\\n❌ Failed to Start Local Node'));\n\t\t\tconsole.error(chalk.red(` └─ Error: ${error.message}`));\n\t\t});\n\n\t\tif (!background) {\n\t\t\tsuiProcess.on('exit', code => {\n\t\t\t\tif (code === 0) {\n\t\t\t\t\tconsole.log(chalk.green('\\n✅ Local Node Stopped'));\n\t\t\t\t\tconsole.log(chalk.green(' └─ Exit Status: Normal'));\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(chalk.red('\\n❌ Local Node Crashed'));\n\t\t\t\t\tconsole.error(chalk.red(` └─ Exit Code: ${code}`));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconsole.log(chalk.cyan('\\n📡 Local Node Running'));\n\t\t\tconsole.log(chalk.cyan(' └─ Press Ctrl+C to stop'));\n\n\t\t\tawait new Promise(() => {});\n\t\t} else {\n\t\t\tsuiProcess.unref();\n\t\t\tconsole.log(chalk.green('\\n✅ Local Node Started in Background'));\n\n\t\t\tif (process.platform === 'win32') {\n\t\t\t\tconsole.log('\\n💡 Helpful Commands:');\n\t\t\t\tconsole.log(' ├─ Check Process: tasklist | findstr sui.exe');\n\t\t\t\tconsole.log(' └─ Stop Node: taskkill /PID <process_id> /F');\n\t\t\t} else {\n\t\t\t\tconsole.log('\\n💡 Helpful Commands:');\n\t\t\t\tconsole.log(\" ├─ Check Process: pgrep -f 'sui start'\");\n\t\t\t\tconsole.log(' └─ Stop Node: kill <process_id>');\n\t\t\t}\n\t\t}\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red('\\n❌ Failed to Start Local Node'));\n\t\tconsole.error(chalk.red(` └─ Error: ${error.message}`));\n\t}\n}\n","import { execSync } from 'child_process';\nimport chalk from 'chalk';\n\nexport async function checkLocalNodeStatus() {\n\tconsole.log('\\n🔍 Checking Local Node Status...');\n\n\ttry {\n\t\tconst cmd =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? `tasklist /FI \"IMAGENAME eq sui.exe\" /FO CSV /NH`\n\t\t\t\t: \"ps aux | grep '[s]ui start --with-faucet --force-regenesis'\";\n\n\t\tconst output = execSync(cmd, {\n\t\t\tencoding: 'utf8',\n\t\t});\n\n\t\tconst isRunning =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? output.toLowerCase().includes('sui.exe')\n\t\t\t\t: output.split('\\n').filter(Boolean).length > 0;\n\n\t\tif (isRunning) {\n\t\t\tconsole.log(chalk.green('\\n✅ Node Status: Running'));\n\t\t\tconsole.log(chalk.gray('\\n📊 Process Details:'));\n\t\t\tconsole.log(chalk.gray(` └─ ${output.trim()}`));\n\t\t} else {\n\t\t\tconsole.log(chalk.red('\\n❌ Node Status: Not Running'));\n\t\t\tconsole.log(chalk.yellow('\\n💡 Quick Start:'));\n\t\t\tconsole.log(chalk.yellow(' └─ Run `dubhe localnode start`'));\n\t\t}\n\t} catch (error) {\n\t\tconsole.log(chalk.red('\\n❌ Node Status: Not Running'));\n\t\tconsole.log(chalk.yellow('\\n💡 Quick Start:'));\n\t\tconsole.log(chalk.yellow(' └─ Run `dubhe localnode start`'));\n\t}\n}\n\n// checkLocalNodeStatus();\n","import { execSync } from 'child_process';\n\nexport async function stopLocalnode() {\n\tconsole.log('Stopping local node...');\n\n\ttry {\n\t\t// Choose different commands based on the operating system\n\t\tconst cmd =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? `tasklist /FI \"IMAGENAME eq sui.exe\" /FO CSV /NH`\n\t\t\t\t: \"ps aux | grep '[s]ui start --with-faucet --force-regenesis'\";\n\n\t\tconst output = execSync(cmd, {\n\t\t\tencoding: 'utf8',\n\t\t});\n\n\t\tif (!output) {\n\t\t\tconsole.log('No running local node process found');\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse process ID based on the operating system\n\t\tlet pid;\n\t\tif (process.platform === 'win32') {\n\t\t\t// Windows output format: \"sui.exe\",\"1234\",... (CSV format)\n\t\t\tconst match = output.match(/\"sui\\.exe\",[\"']?(\\d+)/i);\n\t\t\tpid = match ? match[1] : null;\n\t\t} else {\n\t\t\t// Unix system output format: user pid %cpu ...\n\t\t\tpid = output.toString().split(/\\s+/)[1];\n\t\t}\n\n\t\tif (!pid) {\n\t\t\tconsole.log('No running local node process found');\n\t\t\treturn;\n\t\t}\n\n\t\t// Choose the command to terminate the process based on the operating system\n\t\tif (process.platform === 'win32') {\n\t\t\texecSync(`taskkill /PID ${pid} /F`);\n\t\t} else {\n\t\t\tprocess.kill(Number(pid));\n\t\t}\n\n\t\tconsole.log('✅ Local node stopped successfully');\n\t} catch (error: any) {\n\t\tif (\n\t\t\terror.code === 'ESRCH' ||\n\t\t\terror.message.includes('no running tasks')\n\t\t) {\n\t\t\tconsole.log('No running local node process found');\n\t\t} else {\n\t\t\tconsole.error('❌ Error stopping local node:', error.message);\n\t\t}\n\t}\n}\n\n// stopLocalnode();\n","import chalk from \"chalk\";\n\nexport function printDubhe() {\n console.log(\n chalk.yellow(`\nWelcome to Dubhe\n\\t\\t\\t --from team@obelisk\n ________ ___ ___ ________ ___ ___ _______ \n |\\\\ ___ \\\\|\\\\ \\\\|\\\\ \\\\|\\\\ __ \\\\|\\\\ \\\\|\\\\ \\\\|\\\\ ___ \\\\ \n \\\\ \\\\ \\\\_|\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ /\\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __/| \n \\\\ \\\\ \\\\ \\\\\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __ \\\\ \\\\ __ \\\\ \\\\ \\\\_|/__ \n \\\\ \\\\ \\\\_\\\\\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\_|\\\\ \\\\ \n \\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\__\\\\ \\\\__\\\\ \\\\_______\\\\\n \\\\|_______|\\\\|_______|\\\\|_______|\\\\|__|\\\\|__|\\\\|_______| \n \n`)\n );\n}\n","import type { CommandModule } from 'yargs';\nimport { startLocalnode, stopLocalnode, checkLocalNodeStatus } from '../utils';\n\nconst commandModule: CommandModule = {\n\tcommand: 'localnode <action>',\n\n\tdescribe: 'Manage local Sui node',\n\n\tbuilder(yargs) {\n\t\treturn yargs\n\t\t\t.positional('action', {\n\t\t\t\tdescribe: 'Action to perform',\n\t\t\t\tchoices: ['start', 'stop', 'status', 'restart'],\n\t\t\t\ttype: 'string',\n\t\t\t\tdemandOption: true,\n\t\t\t})\n\t\t\t.option('background', {\n\t\t\t\talias: 'b',\n\t\t\t\ttype: 'boolean',\n\t\t\t\tdescription: 'Run node in background',\n\t\t\t\tdefault: false,\n\t\t\t});\n\t},\n\n\tasync handler(argv) {\n\t\tconst { action, background } = argv;\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'start':\n\t\t\t\t\tawait startLocalnode(background as boolean);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'stop':\n\t\t\t\t\tawait stopLocalnode();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'status':\n\t\t\t\t\tawait checkLocalNodeStatus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'restart':\n\t\t\t\t\tawait restartNode(background as boolean);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Error executing command:', error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t},\n};\n\nasync function restartNode(background: boolean) {\n\tconsole.log('Restarting local Sui node...');\n\tawait stopLocalnode();\n\tawait startLocalnode(background);\n\tconsole.log('Local node has been restarted');\n}\n\nexport default commandModule;\n","import { Dubhe } from '@0xobelisk/sui-client';\nimport type { CommandModule } from 'yargs';\nimport { requestSuiFromFaucetV0, getFaucetHost } from '@mysten/sui/faucet';\nimport {\n\tSuiClient,\n\tgetFullnodeUrl,\n\tGetBalanceParams,\n} from '@mysten/sui/client';\nimport { validatePrivateKey, DubheCliError } from '../utils';\n\ntype Options = {\n\tnetwork: any;\n\trecipient?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'faucet',\n\n\tdescribe: 'Interact with a Dubhe faucet',\n\n\tbuilder(yargs) {\n\t\treturn yargs.options({\n\t\t\tnetwork: {\n\t\t\t\ttype: 'string',\n\t\t\t\tdesc: 'URL of the Dubhe faucet',\n\t\t\t\tchoices: ['testnet', 'devnet', 'localnet'],\n\t\t\t\tdefault: 'localnet',\n\t\t\t},\n\t\t\trecipient: {\n\t\t\t\ttype: 'string',\n\t\t\t\tdesc: 'Sui address to fund',\n\t\t\t},\n\t\t});\n\t},\n\n\tasync handler({ network, recipient }) {\n\t\tlet faucet_address = '';\n\t\tif (recipient === undefined) {\n\t\t\tconst privateKey = process.env.PRIVATE_KEY;\n\t\t\tif (!privateKey)\n\t\t\t\tthrow new DubheCliError(\n\t\t\t\t\t`Missing PRIVATE_KEY environment variable.\n Run 'echo \"PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\n in your contracts directory to use the default sui private key.`\n\t\t\t\t);\n\n\t\t\tconst privateKeyFormat = validatePrivateKey(privateKey);\n\t\t\tif (privateKeyFormat === false) {\n\t\t\t\tthrow new DubheCliError(`Please check your PRIVATE_KEY.`);\n\t\t\t}\n\t\t\tconst dubhe = new Dubhe({\n\t\t\t\tsecretKey: privateKeyFormat,\n\t\t\t});\n\t\t\tconst keypair = dubhe.getKeypair();\n\t\t\tfaucet_address = keypair.toSuiAddress();\n\t\t} else {\n\t\t\tfaucet_address = recipient;\n\t\t}\n\n\t\tconsole.log('\\n🌊 Starting Faucet Operation...');\n\t\tconsole.log(` ├─ Network: ${network}`);\n\n\t\tif (recipient === undefined) {\n\t\t\tconsole.log(' ├─ Using Environment PrivateKey');\n\t\t\tconsole.log(` ├─ Generated Address: ${faucet_address}`);\n\t\t} else {\n\t\t\tconsole.log(` ├─ Using Provided Address: ${faucet_address}`);\n\t\t}\n\n\t\tconsole.log(' ├─ Requesting funds from faucet...');\n\t\tawait requestSuiFromFaucetV0({\n\t\t\thost: getFaucetHost(network),\n\t\t\trecipient: faucet_address,\n\t\t});\n\n\t\tconsole.log(' └─ Checking balance...');\n\t\tconst client = new SuiClient({ url: getFullnodeUrl(network) });\n\t\tlet params = {\n\t\t\towner: faucet_address,\n\t\t} as GetBalanceParams;\n\n\t\tconst balance = await client.getBalance(params);\n\n\t\tconsole.log('\\n💰 Account Summary');\n\t\tconsole.log(` ├─ Address: ${faucet_address}`);\n\t\tconsole.log(\n\t\t\t` └─ Balance: ${(\n\t\t\t\tNumber(balance.totalBalance) / 1_000_000_000\n\t\t\t).toFixed(4)} SUI`\n\t\t);\n\n\t\tconsole.log('\\n✅ Faucet Operation Complete\\n');\n\t\tprocess.exit(0);\n\t},\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { schemaGen, loadConfig, DubheConfig } from '@0xobelisk/sui-common';\nimport chalk from 'chalk';\n\ntype Options = {\n\tconfigPath?: string;\n\tnetwork?: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\tframeworkId?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'schemagen',\n\n\tdescribe: 'Autogenerate Dubhe schemas based on the config file',\n\n\tbuilder: {\n\t\tconfigPath: {\n\t\t\ttype: 'string',\n\t\t\tdefault: 'dubhe.config.ts',\n\t\t\tdesc: 'Path to the config file',\n\t\t},\n\t\tnetwork: {\n\t\t\ttype: 'string',\n\t\t\tchoices: ['mainnet', 'testnet', 'devnet', 'localnet'] as const,\n\t\t\tdesc: 'Node network (mainnet/testnet/devnet/localnet)',\n\t\t},\n\t\tframeworkId: {\n\t\t\ttype: 'string',\n\t\t\tdesc: 'Framework Package ID',\n\t\t},\n\t},\n\n\tasync handler({ configPath, network, frameworkId }) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(\n\t\t\t\tconfigPath\n\t\t\t)) as DubheConfig;\n\t\t\tawait schemaGen(dubheConfig, undefined, network, frameworkId);\n\t\t\tprocess.exit(0);\n\t\t} catch (error: any) {\n\t\t\tconsole.log(chalk.red('Schemagen failed!'));\n\t\t\tconsole.error(error.message);\n\t\t}\n\t},\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { publishHandler } from '../utils';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n\tnetwork: any;\n\tconfigPath: string;\n\tcontractName?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'publish',\n\n\tdescribe: 'Publish dubhe move contract',\n\n\tbuilder(yargs) {\n\t\treturn yargs.options({\n\t\t\tnetwork: {\n\t\t\t\ttype: 'string',\n\t\t\t\tchoices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n\t\t\t\tdesc: 'Node network (mainnet/testnet/devnet/localnet)',\n\t\t\t},\n\t\t\tconfigPath: {\n\t\t\t\ttype: 'string',\n\t\t\t\tdefault: 'dubhe.config.ts',\n\t\t\t\tdesc: 'Configuration file path',\n\t\t\t},\n\t\t\tcontractName: {\n\t\t\t\ttype: 'string',\n\t\t\t\tdesc: 'Optional contract name',\n\t\t\t},\n\t\t});\n\t},\n\n\tasync handler({ network, configPath, contractName }) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(\n\t\t\t\tconfigPath\n\t\t\t)) as DubheConfig;\n\t\t\tawait publishHandler(dubheConfig, network, contractName);\n\t\t} catch (error: any) {\n\t\t\tlogError(error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprocess.exit(0);\n\t},\n};\n\nexport default commandModule;\n","import { Dubhe } from '@0xobelisk/sui-client';\nimport { Transaction, UpgradePolicy } from '@mysten/sui/transactions';\nimport { getFullnodeUrl, SuiClient } from '@mysten/sui/client';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport { DubheCliError, UpgradeError } from './errors';\nimport {\n\tupdateVersionInFile,\n\tgetOldPackageId,\n\tgetVersion,\n\tgetUpgradeCap,\n\tsaveContractData,\n\tvalidatePrivateKey, getOnchainSchemas, getSchemaHub,\n} from './utils';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { DubheConfig } from '@0xobelisk/sui-common';\n\ntype ObjectContent = {\n\ttype: string;\n\tfields: Record<string, any>;\n\thasPublicTransfer: boolean;\n\tdataType: string;\n};\n\ntype Field = {\n\tname: string;\n\ttype: string;\n}\n\ntype Migration = {\n\tschemaName: string;\n\tfields: Field[];\n};\n\nfunction updateMigrateMethod(projectPath: string, migrations: Migration[]): void {\n\tmigrations.forEach((migration) => {\n\t\tlet filePath = `${projectPath}/sources/codegen/schemas/${migration.schemaName}.move`;\n\t\tconst fileContent = fs.readFileSync(filePath, 'utf-8');\n\t\tconst migrateMethodRegex = new RegExp(`public fun migrate\\\\(_${migration.schemaName}: &mut ${capitalizeAndRemoveUnderscores(migration.schemaName)}, _cap: &UpgradeCap\\\\) {[^}]*}`);\n\t\tconst newMigrateMethod = `\npublic fun migrate(${migration.schemaName}: &mut ${capitalizeAndRemoveUnderscores(migration.schemaName)}, _cap: &UpgradeCap) {\n${migration.fields.map((field) => {\n\t\t\tlet storage_type = '';\n\t\t\tif (field.type.includes('StorageValue')) {\n\t\t\t\tstorage_type = `storage_value::new()`;\n\t\t\t} else if (field.type.includes('StorageMap')) {\n\t\t\t\tstorage_type = `storage_map::new()`;\n\t\t\t} else if (\n\t\t\t\tfield.type.includes('StorageDoubleMap')\n\t\t\t) {\n\t\t\t\tstorage_type = `storage_double_map::new()`;\n\t\t\t}\n\t\t\treturn `storage_migrate::add_field<${field.type}>(&mut ${migration.schemaName}.id, b\"${field.name}\", ${storage_type});`;\n\t\t}).join('')}\n}\n`;\n\n\t\tconst updatedContent = fileContent.replace(migrateMethodRegex, newMigrateMethod);\n\t\tfs.writeFileSync(filePath, updatedContent, 'utf-8');\n\t});\n\n\n}\n\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction getLastSegment(input: string): string {\n\tconst segments = input.split('::');\n\treturn segments.length > 0 ? segments[segments.length - 1] : '';\n}\n\nfunction replaceEnvField(\n\tfilePath: string,\n\tnetworkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tfield: 'original-published-id' | 'latest-published-id' | 'published-version',\n\tnewValue: string\n): string {\n\tconst envFilePath = path.resolve(filePath);\n\tconst envContent = fs.readFileSync(envFilePath, 'utf-8');\n\tconst envLines = envContent.split('\\n');\n\n\tconst networkSectionIndex = envLines.findIndex(line => line.trim() === `[env.${networkType}]`);\n\tif (networkSectionIndex === -1) {\n\t\tconsole.log(`Network type [env.${networkType}] not found in the file.`);\n\t\treturn \"\";\n\t}\n\n\tlet fieldIndex = -1;\n\tlet previousValue: string = \"\";\n\tfor (let i = networkSectionIndex + 1; i < envLines.length; i++) {\n\t\tconst line = envLines[i].trim();\n\t\tif (line.startsWith('[')) break; // End of the current network section\n\n\t\tif (line.startsWith(field)) {\n\t\t\tfieldIndex = i;\n\t\t\tpreviousValue = line.split('=')[1].trim().replace(/\"/g, '');\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (fieldIndex !== -1) {\n\t\tenvLines[fieldIndex] = `${field} = \"${newValue}\"`;\n\t\tconst newEnvContent = envLines.join('\\n');\n\t\tfs.writeFileSync(envFilePath, newEnvContent, 'utf-8');\n\t\tconsole.log(`${field} for [env.${networkType}] replaced successfully.`);\n\t} else {\n\t\tconsole.log(`${field} not found for [env.${networkType}].`);\n\t}\n\n\treturn previousValue;\n}\nexport async function upgradeHandler(\n\tconfig: DubheConfig,\n\tname: string,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n) {\n\tconst path = process.cwd();\n\tconst projectPath = `${path}/contracts/${name}`;\n\tconst privateKey = process.env.PRIVATE_KEY;\n\tif (!privateKey)\n\t\tthrow new DubheCliError(\n\t\t\t`Missing PRIVATE_KEY environment variable.\nRun 'echo \"PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\nin your contracts directory to use the default sui private key.`,\n\t\t);\n\n\tconst privateKeyFormat = validatePrivateKey(privateKey);\n\tif (privateKeyFormat === false) {\n\t\tthrow new DubheCliError(`Please check your privateKey.`);\n\t}\n\tconst dubhe = new Dubhe({\n\t\tsecretKey: privateKeyFormat,\n\t});\n\tconst keypair = dubhe.getKeypair();\n\n\tconst client = new SuiClient({\n\t\turl: getFullnodeUrl(network),\n\t});\n\n\tlet oldVersion = Number(await getVersion(projectPath, network));\n\tlet oldPackageId = await getOldPackageId(projectPath, network);\n\tlet schemaHub = await getSchemaHub(projectPath, network);\n\tlet upgradeCap = await getUpgradeCap(projectPath, network);\n\n\tconst original_published_id = replaceEnvField(`${projectPath}/Move.lock`, network, 'original-published-id', \"0x0000000000000000000000000000000000000000000000000000000000000000\");\n\n\tlet pendingMigration: Migration[] = [];\n\tlet schemas = await getOnchainSchemas(projectPath, network);\n\tfor (let schemaKey in config.schemas) {\n\t\tschemas.forEach((schema) => {\n\t\t\tif (capitalizeAndRemoveUnderscores(schemaKey) == getLastSegment(schema.name)) {\n\t\t\t\tlet migrate: Migration = { schemaName: '', fields: [] };\n\t\t\t\tlet fields: Field[] = [];\n\t\t\t\tlet isMigration = false;\n\t\t\t\tfor (const key in config.schemas[schemaKey].structure) {\n\t\t\t\t\tif (!(key in schema.structure)) {\n\t\t\t\t\t\tisMigration = true;\n\t\t\t\t\t\tfields.push({\n\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\ttype: config.schemas[schemaKey].structure[key],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tschema.structure[key] = config.schemas[schemaKey].structure[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isMigration) {\n\t\t\t\t\tmigrate.schemaName = schemaKey;\n\t\t\t\t\tmigrate.fields = fields;\n\t\t\t\t\tpendingMigration.push(migrate);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\n\tpendingMigration.forEach((migration) => {\n\t\tconsole.log(`\\n🚀 Starting Migration for ${migration.schemaName}...`);\n\t\tconsole.log('📋 Migration Fields:', migration.fields);\n\t});\n\tupdateMigrateMethod(projectPath, pendingMigration);\n\n\ttry {\n\t\tlet modules: any, dependencies: any, digest: any;\n\t\ttry {\n\t\t\tconst {\n\t\t\t\tmodules: extractedModules,\n\t\t\t\tdependencies: extractedDependencies,\n\t\t\t\tdigest: extractedDigest,\n\t\t\t} = JSON.parse(\n\t\t\t\texecSync(\n\t\t\t\t\t`sui move build --dump-bytecode-as-base64 --path ${path}/contracts/${name}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tencoding: 'utf-8',\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tmodules = extractedModules;\n\t\t\tdependencies = extractedDependencies;\n\t\t\tdigest = extractedDigest;\n\t\t} catch (error: any) {\n\t\t\tthrow new UpgradeError(error.stdout);\n\t\t}\n\n\t\tconsole.log('\\n🚀 Starting Upgrade Process...');\n\t\tconsole.log('📋 OldPackageId:', oldPackageId);\n\t\tconsole.log('📋 UpgradeCap Object Id:', upgradeCap);\n\t\tconsole.log('📋 OldVersion:', oldVersion);\n\n\t\tconst tx = new Transaction();\n\t\tconst ticket = tx.moveCall({\n\t\t\ttarget: '0x2::package::authorize_upgrade',\n\t\t\targuments: [\n\t\t\t\ttx.object(upgradeCap),\n\t\t\t\ttx.pure.u8(UpgradePolicy.COMPATIBLE),\n\t\t\t\ttx.pure.vector('u8', digest),\n\t\t\t],\n\t\t});\n\n\t\tconst receipt = tx.upgrade({\n\t\t\tmodules,\n\t\t\tdependencies,\n\t\t\tpackage: oldPackageId,\n\t\t\tticket,\n\t\t});\n\n\t\ttx.moveCall({\n\t\t\ttarget: '0x2::package::commit_upgrade',\n\t\t\targuments: [tx.object(upgradeCap), receipt],\n\t\t});\n\n\t\tconst result = await client.signAndExecuteTransaction({\n\t\t\tsigner: keypair,\n\t\t\ttransaction: tx,\n\t\t\toptions: {\n\t\t\t\tshowObjectChanges: true,\n\t\t\t},\n\t\t});\n\n\t\tlet newPackageId = '';\n\t\tresult.objectChanges!.map(object => {\n\t\t\tif (object.type === 'published') {\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.blue(`${name} PackageId: ${object.packageId}`),\n\t\t\t\t);\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.blue(`${name} Version: ${oldVersion + 1}`),\n\t\t\t\t);\n\t\t\t\tnewPackageId = object.packageId;\n\t\t\t}\n\t\t});\n\n\t\treplaceEnvField(`${projectPath}/Move.lock`, network, 'original-published-id', original_published_id);\n\t\treplaceEnvField(`${projectPath}/Move.lock`, network, 'latest-published-id', newPackageId);\n\t\treplaceEnvField(`${projectPath}/Move.lock`, network, 'published-version', (oldVersion + 1) + \"\");\n\n\t\tconsole.log(\n\t\t\tchalk.green(`Upgrade Transaction Digest: ${result.digest}`),\n\t\t);\n\n\t\tsaveContractData(\n\t\t\tname,\n\t\t\tnetwork,\n\t\t\tnewPackageId,\n\t\t\tupgradeCap,\n\t\t\tschemaHub,\n\t\t\toldVersion + 1,\n\t\t\tschemas,\n\t\t);\n\n\t} catch (error: any) {\n\t\tconsole.log(chalk.red('Upgrade failed!'));\n\t\tconsole.error(error.message);\n\t}\n}\n","import type { CommandModule } from \"yargs\";\nimport { logError } from \"../utils/errors\";\nimport { upgradeHandler } from \"../utils/upgradeHandler\";\nimport { DubheConfig, loadConfig } from \"@0xobelisk/sui-common\";\n\ntype Options = {\n network: any;\n configPath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"upgrade\",\n\n describe: \"Upgrade your move contracts\",\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: \"string\",\n choices: [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"],\n desc: \"Network of the node (mainnet/testnet/devnet/localnet)\",\n },\n configPath: {\n type: \"string\",\n default: \"dubhe.config.ts\",\n decs: \"Path to the config file\",\n },\n });\n },\n\n async handler({ network, configPath }) {\n try {\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await upgradeHandler(dubheConfig, dubheConfig.name, network);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\ntype Options = {\n packagePath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"test\",\n\n describe: \"Run tests in Dubhe contracts\",\n\n builder(yargs) {\n return yargs.options({\n packagePath: {\n type: \"string\",\n default: \".\",\n description: \"Options to pass to forge test\",\n },\n });\n },\n\n async handler({ packagePath }) {\n // Start an internal anvil process if no world address is provided\n try {\n execSync(`sui move test --path ${packagePath}`, {\n encoding: \"utf-8\",\n });\n } catch (error: any) {\n console.error(chalk.red(\"Error executing sui move test:\"));\n console.log(error.stdout);\n process.exit(0);\n }\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { printDubhe } from \"../utils\";\n\nconst commandModule: CommandModule = {\n command: \"hello\",\n\n describe: \"hello, dubhe\",\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n printDubhe();\n },\n};\n\nexport default commandModule;\n","import { CommandModule } from 'yargs';\n\nimport localnode from './localnode';\nimport faucet from './faucet';\nimport schemagen from './schemagen';\nimport publish from './publish';\nimport upgrade from \"./upgrade\";\nimport test from './test';\nimport hello from './hello';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Each command has different options\nexport const commands: CommandModule<any, any>[] = [\n\tpublish,\n\tlocalnode,\n\tfaucet,\n\tschemagen,\n\tupgrade,\n\ttest,\n\thello,\n];\n"],"mappings":"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","names":["yargs","hideBin","Dubhe","Transaction","getFullnodeUrl","SuiClient","execSync","chalk","chalk","ZodError","fromZodError","ValidationError","NotInsideProjectError","DubheCliError","UpgradeError","FsIibError","logError","error","validationError","fsAsync","mkdirSync","writeFileSync","dirname","SUI_PRIVATE_KEY_PREFIX","execSync","spawn","chalk","isSuiStartRunning","cmd","result","startLocalnode","background","suiProcess","error","code","execSync","chalk","checkLocalNodeStatus","cmd","output","execSync","stopLocalnode","cmd","output","pid","match","error","validatePrivateKey","privateKey","SUI_PRIVATE_KEY_PREFIX","strippedPrivateKey","getDeploymentJson","projectPath","network","data","FsIibError","getOnchainSchemas","getVersion","getOldPackageId","projectPath","network","getDeploymentJson","getUpgradeCap","getSchemaHub","saveContractData","projectName","network","packageId","upgradeCap","schemaHub","version","schemas","DeploymentData","path","storeDeploymentData","writeOutput","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","fs","path","getDappsObjectId","network","getSchemaHub","removeEnvContent","filePath","networkType","content","regex","updatedContent","chainIds","updateEnvFile","operation","publishedId","envFilePath","envContent","envLines","networkSectionIndex","line","config","i","key","value","part","updatedSection","newEnvContent","capitalizeAndRemoveUnderscores","input","word","index","getLastSegment","segments","buildContract","projectPath","modules","dependencies","buildResult","execSync","error","chalk","publishContract","client","dubhe","dubheConfig","dappsObjectId","keypair","tx","Transaction","upgradeCap","result","version","packageId","schemas","upgradeCapId","schemaHubId","object","resolve","deployHookTx","txCoin","deployHookResult","structure","schemaKey","saveContractData","publishDubheFramework","publishHandler","contractName","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","Dubhe","SuiClient","getFullnodeUrl","chalk","printDubhe","commandModule","yargs","argv","action","background","startLocalnode","stopLocalnode","checkLocalNodeStatus","restartNode","error","localnode_default","Dubhe","requestSuiFromFaucetV0","getFaucetHost","SuiClient","getFullnodeUrl","commandModule","yargs","network","recipient","faucet_address","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","Dubhe","requestSuiFromFaucetV0","getFaucetHost","client","SuiClient","getFullnodeUrl","params","balance","faucet_default","schemaGen","loadConfig","chalk","commandModule","configPath","network","frameworkId","dubheConfig","error","schemagen_default","loadConfig","commandModule","yargs","network","configPath","contractName","dubheConfig","publishHandler","error","logError","publish_default","Dubhe","Transaction","UpgradePolicy","getFullnodeUrl","SuiClient","execSync","chalk","fs","path","updateMigrateMethod","projectPath","migrations","migration","filePath","fileContent","migrateMethodRegex","capitalizeAndRemoveUnderscores","newMigrateMethod","field","storage_type","updatedContent","input","word","index","getLastSegment","segments","replaceEnvField","networkType","newValue","envFilePath","envLines","networkSectionIndex","line","fieldIndex","previousValue","i","newEnvContent","upgradeHandler","config","name","network","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","keypair","Dubhe","client","SuiClient","getFullnodeUrl","oldVersion","getVersion","oldPackageId","getOldPackageId","schemaHub","getSchemaHub","upgradeCap","getUpgradeCap","original_published_id","pendingMigration","schemas","getOnchainSchemas","schemaKey","schema","migrate","fields","isMigration","key","modules","dependencies","digest","extractedModules","extractedDependencies","extractedDigest","execSync","error","UpgradeError","tx","Transaction","ticket","UpgradePolicy","receipt","result","newPackageId","object","chalk","saveContractData","loadConfig","commandModule","yargs","network","configPath","dubheConfig","upgradeHandler","error","logError","upgrade_default","execSync","chalk","commandModule","yargs","packagePath","error","test_default","commandModule","yargs","printDubhe","hello_default","commands","publish_default","localnode_default","faucet_default","schemagen_default","upgrade_default","test_default","hello_default","dotenv","chalk","yargs","hideBin","commands","msg","err","logError"]}
1
+ {"version":3,"sources":["../src/dubhe.ts","../src/utils/publishHandler.ts","../src/utils/errors.ts","../src/utils/utils.ts","../src/utils/localnode/start.ts","../src/utils/localnode/status.ts","../src/utils/localnode/stop.ts","../src/utils/printDubhe.ts","../src/commands/localnode.ts","../src/commands/faucet.ts","../src/commands/schemagen.ts","../src/commands/publish.ts","../src/utils/upgradeHandler.ts","../src/commands/upgrade.ts","../src/commands/test.ts","../src/commands/hello.ts","../src/commands/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { commands } from \"./commands\";\nimport { logError } from \"./utils/errors\";\n\n// Load .env file into process.env\nimport * as dotenv from \"dotenv\";\nimport chalk from \"chalk\";\ndotenv.config();\n\nyargs(hideBin(process.argv))\n // Explicit name to display in help (by default it's the entry file, which may not be \"dubhe\" for e.g. ts-node)\n .scriptName(\"dubhe\")\n // Use the commands directory to scaffold\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- command array overload isn't typed, see https://github.com/yargs/yargs/blob/main/docs/advanced.md#esm-hierarchy\n .command(commands as any)\n // Enable strict mode.\n .strict()\n // Custom error handler\n .fail((msg, err) => {\n console.error(chalk.red(msg));\n if (msg.includes(\"Missing required argument\")) {\n console.log(\n chalk.yellow(`Run 'pnpm dubhe ${process.argv[2]} --help' for a list of available and required arguments.`)\n );\n }\n console.log(\"\");\n logError(err);\n console.log(\"\");\n\n process.exit(1);\n })\n // Useful aliases.\n .alias({ h: \"help\" }).argv;\n","import { Dubhe } from '@0xobelisk/sui-client';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n\tgetFullnodeUrl,\n\tSuiClient,\n\tSuiTransactionBlockResponse,\n} from '@mysten/sui/client';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport { DubheCliError } from './errors';\nimport {\n\tupdateVersionInFile,\n\tsaveContractData,\n\tvalidatePrivateKey,\n\tschema, getSchemaHub, updateDubheDependency, switchEnv, delay,\n} from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nasync function getDappsObjectId(\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n\tswitch (network) {\n\t\tcase \"localnet\": {\n\t\t\tconst path = process.cwd();\n\t\t\treturn await getSchemaHub(`${path}/contracts/dubhe-framework`, network)\n\t\t}\n\t\tcase 'testnet':\n\t\t\treturn '0x181befc40b3dafe2740b41d5a970e49bed2cca20205506ee6be2cfb73ff2d3e9';\n\t\tdefault:\n\t\t\treturn '0x181befc40b3dafe2740b41d5a970e49bed2cca20205506ee6be2cfb73ff2d3e9';\n\t}\n}\n\nfunction removeEnvContent(filePath: string, networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet'): void {\n\tif (!fs.existsSync(filePath)) {\n\t\treturn;\n\t}\n\tconst content = fs.readFileSync(filePath, 'utf-8');\n\tconst regex = new RegExp(`\\\\[env\\\\.${networkType}\\\\][\\\\s\\\\S]*?(?=\\\\[|$)`, 'g');\n\tconst updatedContent = content.replace(regex, '');\n\tfs.writeFileSync(filePath, updatedContent, 'utf-8');\n}\n\ninterface EnvConfig {\n\tchainId: string;\n\toriginalPublishedId: string;\n\tlatestPublishedId: string;\n\tpublishedVersion: number;\n}\n\nconst chainIds: { [key: string]: string } = {\n\tlocalnet: 'dfa7bb83',\n\ttestnet: '4c78adac',\n\tmainnet: '35834a8a',\n};\n\nfunction updateEnvFile(filePath: string, networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet', operation: 'publish' | 'upgrade', chainId: string, publishedId: string): void {\n\tconst envFilePath = path.resolve(filePath);\n\tconst envContent = fs.readFileSync(envFilePath, 'utf-8');\n\tconst envLines = envContent.split('\\n');\n\n\tconst networkSectionIndex = envLines.findIndex(line => line.trim() === `[env.${networkType}]`);\n\tconst config: EnvConfig = {\n\t\tchainId: chainId,\n\t\toriginalPublishedId: '',\n\t\tlatestPublishedId: '',\n\t\tpublishedVersion: 0,\n\t};\n\n\tif (networkSectionIndex === -1) {\n\t\t// If network section is not found, add a new section\n\t\tif (operation === 'publish') {\n\t\t\tconfig.originalPublishedId = publishedId;\n\t\t\tconfig.latestPublishedId = publishedId;\n\t\t\tconfig.publishedVersion = 1;\n\t\t} else {\n\t\t\tthrow new Error(`Network type [env.${networkType}] not found in the file and cannot upgrade.`);\n\t\t}\n\t} else {\n\t\tfor (let i = networkSectionIndex + 1; i < envLines.length; i++) {\n\t\t\tconst line = envLines[i].trim();\n\t\t\tif (line.startsWith('[')) break; // End of the current network section\n\n\t\t\tconst [key, value] = line.split('=').map(part => part.trim().replace(/\"/g, ''));\n\t\t\tswitch (key) {\n\t\t\t\tcase 'original-published-id':\n\t\t\t\t\tconfig.originalPublishedId = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'latest-published-id':\n\t\t\t\t\tconfig.latestPublishedId = value;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'published-version':\n\t\t\t\t\tconfig.publishedVersion = parseInt(value, 10);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (operation === 'publish') {\n\t\t\tconfig.originalPublishedId = publishedId;\n\t\t\tconfig.latestPublishedId = publishedId;\n\t\t\tconfig.publishedVersion = 1;\n\t\t} else if (operation === 'upgrade') {\n\t\t\tconfig.latestPublishedId = publishedId;\n\t\t\tconfig.publishedVersion += 1;\n\t\t}\n\t}\n\n\tconst updatedSection = `\n[env.${networkType}]\nchain-id = \"${config.chainId}\"\noriginal-published-id = \"${config.originalPublishedId}\"\nlatest-published-id = \"${config.latestPublishedId}\"\npublished-version = \"${config.publishedVersion}\"\n`;\n\n\tconst newEnvContent = networkSectionIndex === -1\n\t\t? envContent + updatedSection\n\t\t: envLines.slice(0, networkSectionIndex).join('\\n') + updatedSection;\n\n\tfs.writeFileSync(envFilePath, newEnvContent, 'utf-8');\n}\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction getLastSegment(input: string): string {\n\tconst segments = input.split('::');\n\treturn segments.length > 0 ? segments[segments.length - 1] : '';\n}\n\nfunction buildContract(projectPath: string): string[][] {\n\tlet modules: any, dependencies: any;\n\ttry {\n\t\tconst buildResult = JSON.parse(\n\t\t\texecSync(\n\t\t\t\t`sui move build --dump-bytecode-as-base64 --path ${projectPath}`,\n\t\t\t\t{\n\t\t\t\t\tencoding: 'utf-8',\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t\tmodules = buildResult.modules;\n\t\tdependencies = buildResult.dependencies;\n\t\tconsole.log(' └─ Build successful');\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red(' └─ Build failed'));\n\t\tconsole.error(error.stdout);\n\t\tprocess.exit(1);\n\t}\n\treturn [modules, dependencies];\n}\n\nasync function publishContract(\n\tclient: SuiClient,\n\tdubhe: Dubhe,\n\tdubheConfig: DubheConfig,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tprojectPath: string\n) {\n\tconst dappsObjectId = await getDappsObjectId(network);\n\tconsole.log(\"dappsObjectId\", dappsObjectId);\n\tconst chainId = await client.getChainIdentifier();\n\tremoveEnvContent(`${projectPath}/Move.lock`, network);\n\tconsole.log('\\n🚀 Starting Contract Publication...');\n\tconsole.log(` ├─ Project: ${projectPath}`);\n\tconsole.log(` ├─ Network: ${network}`);\n\tconsole.log(` ├─ ChainId: ${chainId}`);\n\tconsole.log(' ├─ Validating Environment...');\n\n\tconst keypair = dubhe.getKeypair();\n\tconsole.log(` └─ Account: ${keypair.toSuiAddress()}`);\n\n\tconsole.log('\\n📦 Building Contract...');\n\tconst [modules, dependencies] = buildContract(projectPath);\n\n\tconsole.log('\\n🔄 Publishing Contract...');\n\tconst tx = new Transaction();\n\tconst [upgradeCap] = tx.publish({ modules, dependencies });\n\ttx.transferObjects([upgradeCap], keypair.toSuiAddress());\n\n\tlet result: SuiTransactionBlockResponse;\n\ttry {\n\t\tresult = await client.signAndExecuteTransaction({\n\t\t\tsigner: keypair,\n\t\t\ttransaction: tx,\n\t\t\toptions: { showObjectChanges: true },\n\t\t});\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red(' └─ Publication failed'));\n\t\tconsole.error(error.message);\n\t\tprocess.exit(1);\n\t}\n\n\tif (result.effects?.status.status === 'failure') {\n\t\tconsole.log(chalk.red(' └─ Publication failed'));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(' ├─ Processing publication results...');\n\tlet version = 1;\n\tlet packageId = '';\n\tlet schemas: schema[] = [];\n\tlet upgradeCapId = '';\n\tlet schemaHubId = '';\n\n\tresult.objectChanges!.map(object => {\n\t\tif (object.type === 'published') {\n\t\t\tconsole.log(` ├─ Package ID: ${object.packageId}`);\n\t\t\tpackageId = object.packageId;\n\t\t}\n\t\tif (\n\t\t\tobject.type === 'created' &&\n\t\t\tobject.objectType === '0x2::package::UpgradeCap'\n\t\t) {\n\t\t\tconsole.log(` ├─ Upgrade Cap: ${object.objectId}`);\n\t\t\tupgradeCapId = object.objectId;\n\t\t}\n\t\tif (\n\t\t\tobject.type === 'created' &&\n\t\t\tobject.objectType.includes(\"schema_hub\")\n\t\t) {\n\t\t\tconsole.log(` ├─ Schema Hub: ${object.objectId}`);\n\t\t\tschemaHubId = object.objectId;\n\t\t}\n\t});\n\n\tconsole.log(` └─ Transaction: ${result.digest}`);\n\n\tupdateEnvFile(`${projectPath}/Move.lock`, network, 'publish', chainId, packageId);\n\n\tconsole.log('\\n⚡ Executing Deploy Hook...');\n\tawait delay(5000);\n\n\tconst deployHookTx = new Transaction();\n\tdeployHookTx.setGasBudget(2000000000);\n\tconst [txCoin] = deployHookTx.splitCoins(deployHookTx.gas, [\"1000000000\"]);\n\tdeployHookTx.moveCall({\n\t\ttarget: `${packageId}::deploy_hook::run`,\n\t\targuments: [\n\t\t\tdeployHookTx.object(schemaHubId),\n\t\t\tdeployHookTx.object(dappsObjectId),\n\t\t\tdeployHookTx.object(upgradeCapId),\n\t\t\tdeployHookTx.object('0x6'),\n\t\t\ttxCoin\n\t\t],\n\t});\n\n\tlet deployHookResult: SuiTransactionBlockResponse;\n\ttry {\n\t\tdeployHookResult = await client.signAndExecuteTransaction({\n\t\t\tsigner: keypair,\n\t\t\ttransaction: deployHookTx,\n\t\t\toptions: { showEffects: true, showObjectChanges: true },\n\t\t});\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red(' └─ Deploy hook execution failed'));\n\t\tconsole.error(error.message);\n\t\tprocess.exit(1);\n\t}\n\n\tif (deployHookResult.effects?.status.status === 'success') {\n\t\tconsole.log(' ├─ Hook execution successful');\n\t\tconsole.log(` ├─ Transaction: ${deployHookResult.digest}`);\n\n\t\tconsole.log('\\n📋 Created Schemas:');\n\t\tdeployHookResult.objectChanges?.map(object => {\n\t\t\tif (\n\t\t\t\tobject.type === 'created' &&\n\t\t\t\tobject.objectType.includes('_schema') && !object.objectType.includes(\"dynamic_field\")\n\t\t\t) {\n\t\t\t\tconsole.log(` ├─ ${object.objectType}`);\n\t\t\t\tconsole.log(` └─ ID: ${object.objectId}`);\n\n\t\t\t\tlet structure: Record<string, string> = {};\n\t\t\t\tfor (let schemaKey in dubheConfig.schemas) {\n\t\t\t\t\tif (capitalizeAndRemoveUnderscores(schemaKey) === getLastSegment(object.objectType)) {\n\t\t\t\t\t\tstructure = dubheConfig.schemas[schemaKey].structure;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tschemas.push({\n\t\t\t\t\tname: object.objectType,\n\t\t\t\t\tobjectId: object.objectId,\n\t\t\t\t\tstructure,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tsaveContractData(\n\t\t\tdubheConfig.name,\n\t\t\tnetwork,\n\t\t\tpackageId,\n\t\t\tupgradeCapId,\n\t\t\tschemaHubId,\n\t\t\tversion,\n\t\t\tschemas,\n\t\t);\n\t\tconsole.log('\\n✅ Contract Publication Complete\\n');\n\t} else {\n\t\tconsole.log(chalk.yellow(' └─ Deploy hook execution failed'));\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t' Please republish or manually call deploy_hook::run'\n\t\t\t)\n\t\t);\n\t}\n}\n\nasync function publishDubheFramework(\n\tclient: SuiClient,\n\tdubhe: Dubhe,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n) {\n\tconst path = process.cwd();\n\tconst projectPath = `${path}/contracts/dubhe-framework`;\n\tconst chainId = await client.getChainIdentifier();\n\tconsole.log(` └─ Chain ID: ${chainId}`);\n\tremoveEnvContent(`${projectPath}/Move.lock`, network);\n\tconsole.log('\\n🚀 Starting Contract Publication...');\n\tconsole.log(` ├─ Project: ${projectPath}`);\n\tconsole.log(` ├─ Network: ${network}`);\n\tconsole.log(` ├─ ChainId: ${chainId}`);\n\tconsole.log(' ├─ Validating Environment...');\n\n\tconst keypair = dubhe.getKeypair();\n\tconsole.log(` └─ Account: ${keypair.toSuiAddress()}`);\n\n\n\tconsole.log('\\n📦 Building Contract...');\n\tconst [modules, dependencies] = buildContract(projectPath);\n\n\tconsole.log('\\n🔄 Publishing Contract...');\n\tconst tx = new Transaction();\n\tconst [upgradeCap] = tx.publish({ modules, dependencies });\n\ttx.transferObjects([upgradeCap], keypair.toSuiAddress());\n\n\tlet result: SuiTransactionBlockResponse;\n\ttry {\n\t\tresult = await client.signAndExecuteTransaction({\n\t\t\tsigner: keypair,\n\t\t\ttransaction: tx,\n\t\t\toptions: { showObjectChanges: true },\n\t\t});\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red(' └─ Publication failed'));\n\t\tconsole.error(error.message);\n\t\tprocess.exit(1);\n\t}\n\n\tif (result.effects?.status.status === 'failure') {\n\t\tconsole.log(chalk.red(' └─ Publication failed'));\n\t\tprocess.exit(1);\n\t}\n\n\tconsole.log(' ├─ Processing publication results...');\n\tlet version = 1;\n\tlet packageId = '';\n\tlet schemas: schema[] = [];\n\tlet upgradeCapId = '';\n\tlet schemaHubId = '';\n\n\tresult.objectChanges!.map(object => {\n\t\tif (object.type === 'published') {\n\t\t\tconsole.log(` ├─ Package ID: ${object.packageId}`);\n\t\t\tpackageId = object.packageId;\n\t\t}\n\t\tif (\n\t\t\tobject.type === 'created' &&\n\t\t\tobject.objectType === '0x2::package::UpgradeCap'\n\t\t) {\n\t\t\tconsole.log(` ├─ Upgrade Cap: ${object.objectId}`);\n\t\t\tupgradeCapId = object.objectId;\n\t\t}\n\t\tif (\n\t\t\tobject.type === 'created' &&\n\t\t\tobject.objectType.includes(\"dapps\")\n\t\t) {\n\t\t\tconsole.log(` ├─ Dapps: ${object.objectId}`);\n\t\t\tschemaHubId = object.objectId;\n\t\t}\n\t});\n\n\tconsole.log(` └─ Transaction: ${result.digest}`);\n\n\tupdateEnvFile(`${projectPath}/Move.lock`, network, 'publish', chainId, packageId);\n\n\tsaveContractData(\n\t\t\"dubhe-framework\",\n\t\tnetwork,\n\t\tpackageId,\n\t\tupgradeCapId,\n\t\tschemaHubId,\n\t\tversion,\n\t\tschemas,\n\t);\n}\n\nexport async function publishHandler(\n\tdubheConfig: DubheConfig,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tcontractName?: string,\n) {\n\tawait switchEnv(network);\n\n\tconst privateKey = process.env.PRIVATE_KEY;\n\tif (!privateKey) {\n\t\tthrow new DubheCliError(\n\t\t\t`Missing PRIVATE_KEY environment variable.\nRun 'echo \"PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\nin your contracts directory to use the default sui private key.`\n\t\t);\n\t}\n\tconst privateKeyFormat = validatePrivateKey(privateKey);\n\tif (privateKeyFormat === false) {\n\t\tthrow new DubheCliError(`Please check your privateKey.`);\n\t}\n\n\tconst dubhe = new Dubhe({ secretKey: privateKeyFormat });\n\tconst client = new SuiClient({ url: getFullnodeUrl(network) });\n\n\tif (contractName == \"dubhe-framework\") {\n\t\tawait publishDubheFramework(client, dubhe, network);\n\t} else {\n\t\tconst path = process.cwd();\n\t\tconst projectPath = `${path}/contracts/${dubheConfig.name}`;\n\t\tupdateDubheDependency(`${projectPath}/Move.toml`, network);\n\t\tawait publishContract(client, dubhe, dubheConfig, network, projectPath);\n\t}\n}\n","import chalk from \"chalk\";\nimport { ZodError } from \"zod\";\nimport { fromZodError, ValidationError } from \"zod-validation-error\";\n\nexport class NotInsideProjectError extends Error {\n name = \"NotInsideProjectError\";\n message = \"You are not inside a Dubhe project\";\n}\n\nexport class DubheCliError extends Error {\n name = \"DubheCliError\";\n}\n\nexport class UpgradeError extends Error {\n name = \"UpgradeError\";\n}\n\nexport class FsIibError extends Error {\n name = \"FsIibError\";\n}\n\nexport function logError(error: unknown) {\n if (error instanceof ValidationError) {\n console.log(chalk.redBright(error.message));\n } else if (error instanceof ZodError) {\n // TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n const validationError = fromZodError(error, {\n prefixSeparator: \"\\n- \",\n issueSeparator: \"\\n- \",\n });\n console.log(chalk.redBright(validationError.message));\n } else if (error instanceof NotInsideProjectError) {\n console.log(chalk.red(error.message));\n console.log(\"\");\n // TODO add docs to the website and update the link to the specific page\n console.log(\n chalk.blue(\n `To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk`\n )\n );\n } else if (error instanceof DubheCliError) {\n console.log(chalk.red(error));\n } else {\n console.log(error);\n }\n}\n","import * as fsAsync from 'fs/promises';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { SUI_PRIVATE_KEY_PREFIX } from '@mysten/sui/cryptography';\nimport { FsIibError } from './errors';\nexport * from './localnode';\nimport * as fs from 'fs';\nimport chalk from 'chalk';\nimport { spawn } from 'child_process';\n\nexport type schema = {\n\tname: string;\n\tobjectId: string;\n\tstructure: Record<string, string>\n};\n\nexport type DeploymentJsonType = {\n\tprojectName: string;\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\tpackageId: string;\n\tupgradeCap: string;\n\tschemaHub: string;\n\tversion: number;\n\tschemas: schema[];\n};\n\nexport function validatePrivateKey(privateKey: string): false | string {\n\tif (privateKey.startsWith(SUI_PRIVATE_KEY_PREFIX)) {\n\t\tif (privateKey.length === 70) {\n\t\t\treturn privateKey;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else if (privateKey.startsWith('0x')) {\n\t\tconst strippedPrivateKey = privateKey.slice(2);\n\t\tif (strippedPrivateKey.length === 64) {\n\t\t\treturn strippedPrivateKey;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tif (privateKey.length === 64) {\n\t\t\treturn privateKey;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nexport async function updateVersionInFile(\n\tprojectPath: string,\n\tnewVersion: string\n) {\n\ttry {\n\t\tconst filePath = `${projectPath}/sources/script/migrate.move`;\n\t\tconst data = await fsAsync.readFile(filePath, 'utf8');\n\n\t\t// update version data\n\t\tconst updatedData = data.replace(\n\t\t\t/const VERSION: u64 = \\d+;/,\n\t\t\t`const VERSION: u64 = ${newVersion};`\n\t\t);\n\n\t\t// write new version\n\t\twriteOutput(updatedData, filePath, 'Update package version');\n\t} catch {\n\t\tthrow new FsIibError('Fs update version failed.');\n\t}\n}\n\nasync function getDeploymentJson(projectPath: string, network: string) {\n\ttry {\n\t\tconst data = await fsAsync.readFile(\n\t\t\t`${projectPath}/.history/sui_${network}/latest.json`,\n\t\t\t'utf8'\n\t\t);\n\t\treturn JSON.parse(data) as DeploymentJsonType;\n\t} catch {\n\t\tthrow new FsIibError('Fs read deployment file failed.');\n\t}\n}\n\nexport async function getOnchainSchemas(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<schema[]> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.schemas;\n}\n\nexport async function getVersion(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<number> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.version;\n}\n\nexport async function getNetwork(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<'mainnet' | 'testnet' | 'devnet' | 'localnet'> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.network;\n}\n\nexport async function getOldPackageId(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<string> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.packageId;\n}\n\nexport async function getUpgradeCap(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<string> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.upgradeCap;\n}\n\nexport async function getSchemaHub(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<string> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.schemaHub;\n}\n\nexport async function getObjectIdBySchemaName(\n\tprojectPath: string,\n\tnetwork: string,\n\tschemaName: string\n): Promise<string | undefined> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.schemas.find(schema => schema.name.includes(schemaName))\n\t\t?.objectId;\n}\n\nexport function saveContractData(\n\tprojectName: string,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tpackageId: string,\n\tupgradeCap: string,\n\tschemaHub: string,\n\tversion: number,\n schemas: schema[],\n) {\n\tconst DeploymentData: DeploymentJsonType = {\n\t\tprojectName,\n\t\tnetwork,\n\t\tpackageId,\n\t\tschemas,\n\t\tupgradeCap,\n\t\tschemaHub,\n\t\tversion,\n\t};\n\n\tconst path = process.cwd();\n\tconst storeDeploymentData = JSON.stringify(DeploymentData, null, 2);\n\twriteOutput(\n\t\tstoreDeploymentData,\n\t\t`${path}/contracts/${projectName}/.history/sui_${network}/latest.json`,\n\t\t'Update deploy log'\n\t);\n}\n\nexport async function writeOutput(\n\toutput: string,\n\tfullOutputPath: string,\n\tlogPrefix?: string\n): Promise<void> {\n\tmkdirSync(dirname(fullOutputPath), { recursive: true });\n\n\twriteFileSync(fullOutputPath, output);\n\tif (logPrefix !== undefined) {\n\t\tconsole.log(`${logPrefix}: ${fullOutputPath}`);\n\t}\n}\n\nfunction getDubheDependency(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'): string {\n\tswitch (network) {\n\t\tcase 'localnet':\n\t\t\treturn 'Dubhe = { local = \"../dubhe-framework\" }';\n\t\tcase 'testnet':\n\t\t\treturn 'Dubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"dubhe-testnet-v1.0.0\" }';\n\t\tcase 'mainnet':\n\t\t\treturn 'Dubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"dubhe-mainnet-v1.0.0\" }';\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported network: ${network}`);\n\t}\n}\n\nexport function updateDubheDependency(filePath: string, network: 'mainnet' | 'testnet' | 'devnet' | 'localnet') {\n\tconst fileContent = fs.readFileSync(filePath, 'utf-8');\n\tconst newDependency = getDubheDependency(network);\n\tconst updatedContent = fileContent.replace(/Dubhe = \\{.*\\}/, newDependency);\n\tfs.writeFileSync(filePath, updatedContent, 'utf-8');\n\tconsole.log(`Updated Dubhe dependency in ${filePath} for ${network}.`);\n}\nexport async function switchEnv(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet') {\n\ttry {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst suiProcess = spawn(\n\t\t\t\t'sui',\n\t\t\t\t['client', 'switch', '--env', network],\n\t\t\t\t{\n\t\t\t\t\tenv: { ...process.env },\n\t\t\t\t\tstdio: 'pipe'\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tsuiProcess.stdout.on('data', data => {\n\t\t\t\tconsole.log(chalk.green(`${data.toString()}`));\n\t\t\t});\n\n\t\t\tsuiProcess.stderr.on('data', data => {\n\t\t\t\tconsole.error(chalk.red('\\n❌ Failed to Switch Env'));\n\t\t\t\tconsole.error(chalk.red(` Error: ${data.toString()}`));\n\t\t\t});\n\n\t\t\tsuiProcess.on('error', error => {\n\t\t\t\tconsole.error(chalk.red('\\n❌ Failed to Switch Env'));\n\t\t\t\tconsole.error(chalk.red(` Error: ${error.message}`));\n\t\t\t\treject(error); // Reject promise on error\n\t\t\t});\n\n\t\t\tsuiProcess.on('exit', (code) => {\n\t\t\t\tif (code !== 0) {\n\t\t\t\t\tconsole.error(chalk.red(`\\n❌ Process exited with code: ${code}`));\n\t\t\t\t\treject(new Error(`Process exited with code: ${code}`));\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(chalk.green('\\n✅ Environment switched successfully.'));\n\t\t\t\t\tresolve(); // Resolve promise on successful exit\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} catch (error) {\n\t\tconsole.error(chalk.red('\\n❌ Failed to Switch Env'));\n\t\tconsole.error(chalk.red(` └─ Error: ${error}`));\n\t}\n}\n\nexport const delay = (ms: number) =>\n\tnew Promise(resolve => setTimeout(resolve, ms));\n","import { execSync, spawn } from 'child_process';\nimport chalk from 'chalk';\n\nfunction isSuiStartRunning(): boolean {\n\ttry {\n\t\tconst cmd =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? `tasklist /FI \"IMAGENAME eq sui.exe\" /FO CSV /NH`\n\t\t\t\t: 'pgrep -f \"sui start\"';\n\n\t\tconst result = execSync(cmd).toString().trim();\n\t\treturn process.platform === 'win32'\n\t\t\t? result.toLowerCase().includes('sui.exe')\n\t\t\t: result.length > 0;\n\t} catch (error) {\n\t\treturn false;\n\t}\n}\n\nexport async function startLocalnode(background: boolean = false) {\n\tconsole.log('\\n🔍 Checking Local Node Status...');\n\tconsole.log(' ├─ Scanning running processes');\n\n\tif (isSuiStartRunning()) {\n\t\tconsole.log(chalk.yellow('\\n⚠️ Warning: Local Node Already Running'));\n\t\tconsole.log(chalk.yellow(' ├─ Cannot start a new instance'));\n\t\tconsole.log(\n\t\t\tchalk.yellow(' └─ Please stop the existing process first')\n\t\t);\n\t\treturn;\n\t}\n\n\tconsole.log('\\n🚀 Starting Local Node...');\n\tconsole.log(' ├─ Mode: ' + (background ? 'Background' : 'Foreground'));\n\tconsole.log(' ├─ Faucet: Enabled');\n\tconsole.log(' └─ Force Regenesis: Yes');\n\n\ttry {\n\t\tconst suiProcess = spawn(\n\t\t\t'sui',\n\t\t\t['start', '--with-faucet', '--force-regenesis'],\n\t\t\t{\n\t\t\t\tenv: { ...process.env, RUST_LOG: 'off,sui_node=info' },\n\t\t\t\tstdio: background ? 'ignore' : 'inherit',\n\t\t\t\tdetached: background,\n\t\t\t}\n\t\t);\n\n\t\tsuiProcess.on('error', error => {\n\t\t\tconsole.error(chalk.red('\\n❌ Failed to Start Local Node'));\n\t\t\tconsole.error(chalk.red(` └─ Error: ${error.message}`));\n\t\t});\n\n\t\tif (!background) {\n\t\t\tsuiProcess.on('exit', code => {\n\t\t\t\tif (code === 0) {\n\t\t\t\t\tconsole.log(chalk.green('\\n✅ Local Node Stopped'));\n\t\t\t\t\tconsole.log(chalk.green(' └─ Exit Status: Normal'));\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(chalk.red('\\n❌ Local Node Crashed'));\n\t\t\t\t\tconsole.error(chalk.red(` └─ Exit Code: ${code}`));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconsole.log(chalk.cyan('\\n📡 Local Node Running'));\n\t\t\tconsole.log(chalk.cyan(' └─ Press Ctrl+C to stop'));\n\n\t\t\tawait new Promise(() => {});\n\t\t} else {\n\t\t\tsuiProcess.unref();\n\t\t\tconsole.log(chalk.green('\\n✅ Local Node Started in Background'));\n\n\t\t\tif (process.platform === 'win32') {\n\t\t\t\tconsole.log('\\n💡 Helpful Commands:');\n\t\t\t\tconsole.log(' ├─ Check Process: tasklist | findstr sui.exe');\n\t\t\t\tconsole.log(' └─ Stop Node: taskkill /PID <process_id> /F');\n\t\t\t} else {\n\t\t\t\tconsole.log('\\n💡 Helpful Commands:');\n\t\t\t\tconsole.log(\" ├─ Check Process: pgrep -f 'sui start'\");\n\t\t\t\tconsole.log(' └─ Stop Node: kill <process_id>');\n\t\t\t}\n\t\t}\n\t} catch (error: any) {\n\t\tconsole.error(chalk.red('\\n❌ Failed to Start Local Node'));\n\t\tconsole.error(chalk.red(` └─ Error: ${error.message}`));\n\t}\n}\n","import { execSync } from 'child_process';\nimport chalk from 'chalk';\n\nexport async function checkLocalNodeStatus() {\n\tconsole.log('\\n🔍 Checking Local Node Status...');\n\n\ttry {\n\t\tconst cmd =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? `tasklist /FI \"IMAGENAME eq sui.exe\" /FO CSV /NH`\n\t\t\t\t: \"ps aux | grep '[s]ui start --with-faucet --force-regenesis'\";\n\n\t\tconst output = execSync(cmd, {\n\t\t\tencoding: 'utf8',\n\t\t});\n\n\t\tconst isRunning =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? output.toLowerCase().includes('sui.exe')\n\t\t\t\t: output.split('\\n').filter(Boolean).length > 0;\n\n\t\tif (isRunning) {\n\t\t\tconsole.log(chalk.green('\\n✅ Node Status: Running'));\n\t\t\tconsole.log(chalk.gray('\\n📊 Process Details:'));\n\t\t\tconsole.log(chalk.gray(` └─ ${output.trim()}`));\n\t\t} else {\n\t\t\tconsole.log(chalk.red('\\n❌ Node Status: Not Running'));\n\t\t\tconsole.log(chalk.yellow('\\n💡 Quick Start:'));\n\t\t\tconsole.log(chalk.yellow(' └─ Run `dubhe localnode start`'));\n\t\t}\n\t} catch (error) {\n\t\tconsole.log(chalk.red('\\n❌ Node Status: Not Running'));\n\t\tconsole.log(chalk.yellow('\\n💡 Quick Start:'));\n\t\tconsole.log(chalk.yellow(' └─ Run `dubhe localnode start`'));\n\t}\n}\n\n// checkLocalNodeStatus();\n","import { execSync } from 'child_process';\n\nexport async function stopLocalnode() {\n\tconsole.log('Stopping local node...');\n\n\ttry {\n\t\t// Choose different commands based on the operating system\n\t\tconst cmd =\n\t\t\tprocess.platform === 'win32'\n\t\t\t\t? `tasklist /FI \"IMAGENAME eq sui.exe\" /FO CSV /NH`\n\t\t\t\t: \"ps aux | grep '[s]ui start --with-faucet --force-regenesis'\";\n\n\t\tconst output = execSync(cmd, {\n\t\t\tencoding: 'utf8',\n\t\t});\n\n\t\tif (!output) {\n\t\t\tconsole.log('No running local node process found');\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse process ID based on the operating system\n\t\tlet pid;\n\t\tif (process.platform === 'win32') {\n\t\t\t// Windows output format: \"sui.exe\",\"1234\",... (CSV format)\n\t\t\tconst match = output.match(/\"sui\\.exe\",[\"']?(\\d+)/i);\n\t\t\tpid = match ? match[1] : null;\n\t\t} else {\n\t\t\t// Unix system output format: user pid %cpu ...\n\t\t\tpid = output.toString().split(/\\s+/)[1];\n\t\t}\n\n\t\tif (!pid) {\n\t\t\tconsole.log('No running local node process found');\n\t\t\treturn;\n\t\t}\n\n\t\t// Choose the command to terminate the process based on the operating system\n\t\tif (process.platform === 'win32') {\n\t\t\texecSync(`taskkill /PID ${pid} /F`);\n\t\t} else {\n\t\t\tprocess.kill(Number(pid));\n\t\t}\n\n\t\tconsole.log('✅ Local node stopped successfully');\n\t} catch (error: any) {\n\t\tif (\n\t\t\terror.code === 'ESRCH' ||\n\t\t\terror.message.includes('no running tasks')\n\t\t) {\n\t\t\tconsole.log('No running local node process found');\n\t\t} else {\n\t\t\tconsole.error('❌ Error stopping local node:', error.message);\n\t\t}\n\t}\n}\n\n// stopLocalnode();\n","import chalk from \"chalk\";\n\nexport function printDubhe() {\n console.log(\n chalk.yellow(`\nWelcome to Dubhe\n\\t\\t\\t --from team@obelisk\n ________ ___ ___ ________ ___ ___ _______ \n |\\\\ ___ \\\\|\\\\ \\\\|\\\\ \\\\|\\\\ __ \\\\|\\\\ \\\\|\\\\ \\\\|\\\\ ___ \\\\ \n \\\\ \\\\ \\\\_|\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ /\\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __/| \n \\\\ \\\\ \\\\ \\\\\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __ \\\\ \\\\ __ \\\\ \\\\ \\\\_|/__ \n \\\\ \\\\ \\\\_\\\\\\\\ \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\_|\\\\ \\\\ \n \\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\__\\\\ \\\\__\\\\ \\\\_______\\\\\n \\\\|_______|\\\\|_______|\\\\|_______|\\\\|__|\\\\|__|\\\\|_______| \n \n`)\n );\n}\n","import type { CommandModule } from 'yargs';\nimport { startLocalnode, stopLocalnode, checkLocalNodeStatus } from '../utils';\n\nconst commandModule: CommandModule = {\n\tcommand: 'localnode <action>',\n\n\tdescribe: 'Manage local Sui node',\n\n\tbuilder(yargs) {\n\t\treturn yargs\n\t\t\t.positional('action', {\n\t\t\t\tdescribe: 'Action to perform',\n\t\t\t\tchoices: ['start', 'stop', 'status', 'restart'],\n\t\t\t\ttype: 'string',\n\t\t\t\tdemandOption: true,\n\t\t\t})\n\t\t\t.option('background', {\n\t\t\t\talias: 'b',\n\t\t\t\ttype: 'boolean',\n\t\t\t\tdescription: 'Run node in background',\n\t\t\t\tdefault: false,\n\t\t\t});\n\t},\n\n\tasync handler(argv) {\n\t\tconst { action, background } = argv;\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase 'start':\n\t\t\t\t\tawait startLocalnode(background as boolean);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'stop':\n\t\t\t\t\tawait stopLocalnode();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'status':\n\t\t\t\t\tawait checkLocalNodeStatus();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'restart':\n\t\t\t\t\tawait restartNode(background as boolean);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Error executing command:', error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t},\n};\n\nasync function restartNode(background: boolean) {\n\tconsole.log('Restarting local Sui node...');\n\tawait stopLocalnode();\n\tawait startLocalnode(background);\n\tconsole.log('Local node has been restarted');\n}\n\nexport default commandModule;\n","import { Dubhe } from '@0xobelisk/sui-client';\nimport type { CommandModule } from 'yargs';\nimport { requestSuiFromFaucetV0, getFaucetHost } from '@mysten/sui/faucet';\nimport {\n\tSuiClient,\n\tgetFullnodeUrl,\n\tGetBalanceParams,\n} from '@mysten/sui/client';\nimport { validatePrivateKey, DubheCliError } from '../utils';\n\ntype Options = {\n\tnetwork: any;\n\trecipient?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'faucet',\n\n\tdescribe: 'Interact with a Dubhe faucet',\n\n\tbuilder(yargs) {\n\t\treturn yargs.options({\n\t\t\tnetwork: {\n\t\t\t\ttype: 'string',\n\t\t\t\tdesc: 'URL of the Dubhe faucet',\n\t\t\t\tchoices: ['testnet', 'devnet', 'localnet'],\n\t\t\t\tdefault: 'localnet',\n\t\t\t},\n\t\t\trecipient: {\n\t\t\t\ttype: 'string',\n\t\t\t\tdesc: 'Sui address to fund',\n\t\t\t},\n\t\t});\n\t},\n\n\tasync handler({ network, recipient }) {\n\t\tlet faucet_address = '';\n\t\tif (recipient === undefined) {\n\t\t\tconst privateKey = process.env.PRIVATE_KEY;\n\t\t\tif (!privateKey)\n\t\t\t\tthrow new DubheCliError(\n\t\t\t\t\t`Missing PRIVATE_KEY environment variable.\n Run 'echo \"PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\n in your contracts directory to use the default sui private key.`\n\t\t\t\t);\n\n\t\t\tconst privateKeyFormat = validatePrivateKey(privateKey);\n\t\t\tif (privateKeyFormat === false) {\n\t\t\t\tthrow new DubheCliError(`Please check your PRIVATE_KEY.`);\n\t\t\t}\n\t\t\tconst dubhe = new Dubhe({\n\t\t\t\tsecretKey: privateKeyFormat,\n\t\t\t});\n\t\t\tconst keypair = dubhe.getKeypair();\n\t\t\tfaucet_address = keypair.toSuiAddress();\n\t\t} else {\n\t\t\tfaucet_address = recipient;\n\t\t}\n\n\t\tconsole.log('\\n🌊 Starting Faucet Operation...');\n\t\tconsole.log(` ├─ Network: ${network}`);\n\n\t\tif (recipient === undefined) {\n\t\t\tconsole.log(' ├─ Using Environment PrivateKey');\n\t\t\tconsole.log(` ├─ Generated Address: ${faucet_address}`);\n\t\t} else {\n\t\t\tconsole.log(` ├─ Using Provided Address: ${faucet_address}`);\n\t\t}\n\n\t\tconsole.log(' ├─ Requesting funds from faucet...');\n\t\tawait requestSuiFromFaucetV0({\n\t\t\thost: getFaucetHost(network),\n\t\t\trecipient: faucet_address,\n\t\t});\n\n\t\tconsole.log(' └─ Checking balance...');\n\t\tconst client = new SuiClient({ url: getFullnodeUrl(network) });\n\t\tlet params = {\n\t\t\towner: faucet_address,\n\t\t} as GetBalanceParams;\n\n\t\tconst balance = await client.getBalance(params);\n\n\t\tconsole.log('\\n💰 Account Summary');\n\t\tconsole.log(` ├─ Address: ${faucet_address}`);\n\t\tconsole.log(\n\t\t\t` └─ Balance: ${(\n\t\t\t\tNumber(balance.totalBalance) / 1_000_000_000\n\t\t\t).toFixed(4)} SUI`\n\t\t);\n\n\t\tconsole.log('\\n✅ Faucet Operation Complete\\n');\n\t\tprocess.exit(0);\n\t},\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { schemaGen, loadConfig, DubheConfig } from '@0xobelisk/sui-common';\nimport chalk from 'chalk';\n\ntype Options = {\n\tconfigPath?: string;\n\tnetwork?: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\tframeworkId?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'schemagen',\n\n\tdescribe: 'Autogenerate Dubhe schemas based on the config file',\n\n\tbuilder: {\n\t\tconfigPath: {\n\t\t\ttype: 'string',\n\t\t\tdefault: 'dubhe.config.ts',\n\t\t\tdesc: 'Path to the config file',\n\t\t},\n\t\tnetwork: {\n\t\t\ttype: 'string',\n\t\t\tchoices: ['mainnet', 'testnet', 'devnet', 'localnet'] as const,\n\t\t\tdesc: 'Node network (mainnet/testnet/devnet/localnet)',\n\t\t},\n\t\tframeworkId: {\n\t\t\ttype: 'string',\n\t\t\tdesc: 'Framework Package ID',\n\t\t},\n\t},\n\n\tasync handler({ configPath, network, frameworkId }) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(\n\t\t\t\tconfigPath\n\t\t\t)) as DubheConfig;\n\t\t\tawait schemaGen(dubheConfig, undefined, network, frameworkId);\n\t\t\tprocess.exit(0);\n\t\t} catch (error: any) {\n\t\t\tconsole.log(chalk.red('Schemagen failed!'));\n\t\t\tconsole.error(error.message);\n\t\t}\n\t},\n};\n\nexport default commandModule;\n","import type { CommandModule } from 'yargs';\nimport { logError } from '../utils/errors';\nimport { publishHandler } from '../utils';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n\tnetwork: any;\n\tconfigPath: string;\n\tcontractName?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'publish',\n\n\tdescribe: 'Publish dubhe move contract',\n\n\tbuilder(yargs) {\n\t\treturn yargs.options({\n\t\t\tnetwork: {\n\t\t\t\ttype: 'string',\n\t\t\t\tchoices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n\t\t\t\tdesc: 'Node network (mainnet/testnet/devnet/localnet)',\n\t\t\t},\n\t\t\tconfigPath: {\n\t\t\t\ttype: 'string',\n\t\t\t\tdefault: 'dubhe.config.ts',\n\t\t\t\tdesc: 'Configuration file path',\n\t\t\t},\n\t\t\tcontractName: {\n\t\t\t\ttype: 'string',\n\t\t\t\tdesc: 'Optional contract name',\n\t\t\t},\n\t\t});\n\t},\n\n\tasync handler({ network, configPath, contractName }) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(\n\t\t\t\tconfigPath\n\t\t\t)) as DubheConfig;\n\t\t\tawait publishHandler(dubheConfig, network, contractName);\n\t\t} catch (error: any) {\n\t\t\tlogError(error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprocess.exit(0);\n\t},\n};\n\nexport default commandModule;\n","import { Dubhe } from '@0xobelisk/sui-client';\nimport { Transaction, UpgradePolicy } from '@mysten/sui/transactions';\nimport { getFullnodeUrl, SuiClient } from '@mysten/sui/client';\nimport { execSync } from 'child_process';\nimport chalk from 'chalk';\nimport { DubheCliError, UpgradeError } from './errors';\nimport {\n\tupdateVersionInFile,\n\tgetOldPackageId,\n\tgetVersion,\n\tgetUpgradeCap,\n\tsaveContractData,\n\tvalidatePrivateKey, getOnchainSchemas, getSchemaHub, switchEnv, delay,\n} from './utils';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { DubheConfig } from '@0xobelisk/sui-common';\n\ntype ObjectContent = {\n\ttype: string;\n\tfields: Record<string, any>;\n\thasPublicTransfer: boolean;\n\tdataType: string;\n};\n\ntype Field = {\n\tname: string;\n\ttype: string;\n}\n\ntype Migration = {\n\tschemaName: string;\n\tfields: Field[];\n};\n\nfunction updateMigrateMethod(projectPath: string, migrations: Migration[]): void {\n\tmigrations.forEach((migration) => {\n\t\tlet filePath = `${projectPath}/sources/codegen/schemas/${migration.schemaName}.move`;\n\t\tconst fileContent = fs.readFileSync(filePath, 'utf-8');\n\t\tconst migrateMethodRegex = new RegExp(`public fun migrate\\\\(_${migration.schemaName}: &mut ${capitalizeAndRemoveUnderscores(migration.schemaName)}, _cap: &UpgradeCap\\\\) {[^}]*}`);\n\t\tconst newMigrateMethod = `\npublic fun migrate(${migration.schemaName}: &mut ${capitalizeAndRemoveUnderscores(migration.schemaName)}, _cap: &UpgradeCap) {\n${migration.fields.map((field) => {\n\t\t\tlet storage_type = '';\n\t\t\tif (field.type.includes('StorageValue')) {\n\t\t\t\tstorage_type = `storage_value::new()`;\n\t\t\t} else if (field.type.includes('StorageMap')) {\n\t\t\t\tstorage_type = `storage_map::new()`;\n\t\t\t} else if (\n\t\t\t\tfield.type.includes('StorageDoubleMap')\n\t\t\t) {\n\t\t\t\tstorage_type = `storage_double_map::new()`;\n\t\t\t}\n\t\t\treturn `storage_migrate::add_field<${field.type}>(&mut ${migration.schemaName}.id, b\"${field.name}\", ${storage_type});`;\n\t\t}).join('')}\n}\n`;\n\n\t\tconst updatedContent = fileContent.replace(migrateMethodRegex, newMigrateMethod);\n\t\tfs.writeFileSync(filePath, updatedContent, 'utf-8');\n\t});\n\n\n}\n\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction getLastSegment(input: string): string {\n\tconst segments = input.split('::');\n\treturn segments.length > 0 ? segments[segments.length - 1] : '';\n}\n\nfunction replaceEnvField(\n\tfilePath: string,\n\tnetworkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tfield: 'original-published-id' | 'latest-published-id' | 'published-version',\n\tnewValue: string\n): string {\n\tconst envFilePath = path.resolve(filePath);\n\tconst envContent = fs.readFileSync(envFilePath, 'utf-8');\n\tconst envLines = envContent.split('\\n');\n\n\tconst networkSectionIndex = envLines.findIndex(line => line.trim() === `[env.${networkType}]`);\n\tif (networkSectionIndex === -1) {\n\t\tconsole.log(`Network type [env.${networkType}] not found in the file.`);\n\t\treturn \"\";\n\t}\n\n\tlet fieldIndex = -1;\n\tlet previousValue: string = \"\";\n\tfor (let i = networkSectionIndex + 1; i < envLines.length; i++) {\n\t\tconst line = envLines[i].trim();\n\t\tif (line.startsWith('[')) break; // End of the current network section\n\n\t\tif (line.startsWith(field)) {\n\t\t\tfieldIndex = i;\n\t\t\tpreviousValue = line.split('=')[1].trim().replace(/\"/g, '');\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (fieldIndex !== -1) {\n\t\tenvLines[fieldIndex] = `${field} = \"${newValue}\"`;\n\t\tconst newEnvContent = envLines.join('\\n');\n\t\tfs.writeFileSync(envFilePath, newEnvContent, 'utf-8');\n\t} else {\n\t\tconsole.log(`${field} not found for [env.${networkType}].`);\n\t}\n\n\treturn previousValue;\n}\nexport async function upgradeHandler(\n\tconfig: DubheConfig,\n\tname: string,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n) {\n\tawait switchEnv(network);\n\n\tconst path = process.cwd();\n\tconst projectPath = `${path}/contracts/${name}`;\n\tconst privateKey = process.env.PRIVATE_KEY;\n\tif (!privateKey)\n\t\tthrow new DubheCliError(\n\t\t\t`Missing PRIVATE_KEY environment variable.\nRun 'echo \"PRIVATE_KEY=YOUR_PRIVATE_KEY\" > .env'\nin your contracts directory to use the default sui private key.`,\n\t\t);\n\n\tconst privateKeyFormat = validatePrivateKey(privateKey);\n\tif (privateKeyFormat === false) {\n\t\tthrow new DubheCliError(`Please check your privateKey.`);\n\t}\n\tconst dubhe = new Dubhe({\n\t\tsecretKey: privateKeyFormat,\n\t});\n\tconst keypair = dubhe.getKeypair();\n\n\tconst client = new SuiClient({\n\t\turl: getFullnodeUrl(network),\n\t});\n\n\tlet oldVersion = Number(await getVersion(projectPath, network));\n\tlet oldPackageId = await getOldPackageId(projectPath, network);\n\tlet schemaHub = await getSchemaHub(projectPath, network);\n\tlet upgradeCap = await getUpgradeCap(projectPath, network);\n\n\tconst original_published_id = replaceEnvField(`${projectPath}/Move.lock`, network, 'original-published-id', \"0x0000000000000000000000000000000000000000000000000000000000000000\");\n\n\tlet pendingMigration: Migration[] = [];\n\tlet schemas = await getOnchainSchemas(projectPath, network);\n\tfor (let schemaKey in config.schemas) {\n\t\tschemas.forEach((schema) => {\n\t\t\tif (capitalizeAndRemoveUnderscores(schemaKey) == getLastSegment(schema.name)) {\n\t\t\t\tlet migrate: Migration = { schemaName: '', fields: [] };\n\t\t\t\tlet fields: Field[] = [];\n\t\t\t\tlet isMigration = false;\n\t\t\t\tfor (const key in config.schemas[schemaKey].structure) {\n\t\t\t\t\tif (!(key in schema.structure)) {\n\t\t\t\t\t\tisMigration = true;\n\t\t\t\t\t\tfields.push({\n\t\t\t\t\t\t\tname: key,\n\t\t\t\t\t\t\ttype: config.schemas[schemaKey].structure[key],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tschema.structure[key] = config.schemas[schemaKey].structure[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isMigration) {\n\t\t\t\t\tmigrate.schemaName = schemaKey;\n\t\t\t\t\tmigrate.fields = fields;\n\t\t\t\t\tpendingMigration.push(migrate);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\n\tpendingMigration.forEach((migration) => {\n\t\tconsole.log(`\\n🚀 Starting Migration for ${migration.schemaName}...`);\n\t\tconsole.log('📋 Migration Fields:', migration.fields);\n\t});\n\tupdateMigrateMethod(projectPath, pendingMigration);\n\n\ttry {\n\t\tlet modules: any, dependencies: any, digest: any;\n\t\ttry {\n\t\t\tconst {\n\t\t\t\tmodules: extractedModules,\n\t\t\t\tdependencies: extractedDependencies,\n\t\t\t\tdigest: extractedDigest,\n\t\t\t} = JSON.parse(\n\t\t\t\texecSync(\n\t\t\t\t\t`sui move build --dump-bytecode-as-base64 --path ${path}/contracts/${name}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tencoding: 'utf-8',\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tmodules = extractedModules;\n\t\t\tdependencies = extractedDependencies;\n\t\t\tdigest = extractedDigest;\n\t\t} catch (error: any) {\n\t\t\tthrow new UpgradeError(error.stdout);\n\t\t}\n\n\t\tconsole.log('\\n🚀 Starting Upgrade Process...');\n\t\tconsole.log('📋 OldPackageId:', oldPackageId);\n\t\tconsole.log('📋 UpgradeCap Object Id:', upgradeCap);\n\t\tconsole.log('📋 OldVersion:', oldVersion);\n\n\t\tconst tx = new Transaction();\n\t\tconst ticket = tx.moveCall({\n\t\t\ttarget: '0x2::package::authorize_upgrade',\n\t\t\targuments: [\n\t\t\t\ttx.object(upgradeCap),\n\t\t\t\ttx.pure.u8(UpgradePolicy.COMPATIBLE),\n\t\t\t\ttx.pure.vector('u8', digest),\n\t\t\t],\n\t\t});\n\n\t\tconst receipt = tx.upgrade({\n\t\t\tmodules,\n\t\t\tdependencies,\n\t\t\tpackage: oldPackageId,\n\t\t\tticket,\n\t\t});\n\n\t\ttx.moveCall({\n\t\t\ttarget: '0x2::package::commit_upgrade',\n\t\t\targuments: [tx.object(upgradeCap), receipt],\n\t\t});\n\n\t\tconst result = await client.signAndExecuteTransaction({\n\t\t\tsigner: keypair,\n\t\t\ttransaction: tx,\n\t\t\toptions: {\n\t\t\t\tshowObjectChanges: true,\n\t\t\t},\n\t\t});\n\n\t\tlet newPackageId = '';\n\t\tresult.objectChanges!.map(object => {\n\t\t\tif (object.type === 'published') {\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.blue(`${name} PackageId: ${object.packageId}`),\n\t\t\t\t);\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.blue(`${name} Version: ${oldVersion + 1}`),\n\t\t\t\t);\n\t\t\t\tnewPackageId = object.packageId;\n\t\t\t}\n\t\t});\n\n\t\treplaceEnvField(`${projectPath}/Move.lock`, network, 'original-published-id', original_published_id);\n\t\treplaceEnvField(`${projectPath}/Move.lock`, network, 'latest-published-id', newPackageId);\n\t\treplaceEnvField(`${projectPath}/Move.lock`, network, 'published-version', (oldVersion + 1) + \"\");\n\n\t\tconsole.log(\n\t\t\tchalk.green(`Upgrade Transaction Digest: ${result.digest}`),\n\t\t);\n\n\t\tsaveContractData(\n\t\t\tname,\n\t\t\tnetwork,\n\t\t\tnewPackageId,\n\t\t\tupgradeCap,\n\t\t\tschemaHub,\n\t\t\toldVersion + 1,\n\t\t\tschemas,\n\t\t);\n\n\t} catch (error: any) {\n\t\tconsole.log(chalk.red('Upgrade failed!'));\n\t\tconsole.error(error.message);\n\t}\n}\n","import type { CommandModule } from \"yargs\";\nimport { logError } from \"../utils/errors\";\nimport { upgradeHandler } from \"../utils/upgradeHandler\";\nimport { DubheConfig, loadConfig } from \"@0xobelisk/sui-common\";\n\ntype Options = {\n network: any;\n configPath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"upgrade\",\n\n describe: \"Upgrade your move contracts\",\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: \"string\",\n choices: [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"],\n desc: \"Network of the node (mainnet/testnet/devnet/localnet)\",\n },\n configPath: {\n type: \"string\",\n default: \"dubhe.config.ts\",\n decs: \"Path to the config file\",\n },\n });\n },\n\n async handler({ network, configPath }) {\n try {\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n await upgradeHandler(dubheConfig, dubheConfig.name, network);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\ntype Options = {\n packagePath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"test\",\n\n describe: \"Run tests in Dubhe contracts\",\n\n builder(yargs) {\n return yargs.options({\n packagePath: {\n type: \"string\",\n default: \".\",\n description: \"Options to pass to forge test\",\n },\n });\n },\n\n async handler({ packagePath }) {\n // Start an internal anvil process if no world address is provided\n try {\n execSync(`sui move test --path ${packagePath}`, {\n encoding: \"utf-8\",\n });\n } catch (error: any) {\n console.error(chalk.red(\"Error executing sui move test:\"));\n console.log(error.stdout);\n process.exit(0);\n }\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { printDubhe } from \"../utils\";\n\nconst commandModule: CommandModule = {\n command: \"hello\",\n\n describe: \"hello, dubhe\",\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n printDubhe();\n },\n};\n\nexport default commandModule;\n","import { CommandModule } from 'yargs';\n\nimport localnode from './localnode';\nimport faucet from './faucet';\nimport schemagen from './schemagen';\nimport publish from './publish';\nimport upgrade from \"./upgrade\";\nimport test from './test';\nimport hello from './hello';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Each command has different options\nexport const commands: CommandModule<any, any>[] = [\n\tpublish,\n\tlocalnode,\n\tfaucet,\n\tschemagen,\n\tupgrade,\n\ttest,\n\thello,\n];\n"],"mappings":"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","names":["yargs","hideBin","Dubhe","Transaction","getFullnodeUrl","SuiClient","execSync","chalk","chalk","ZodError","fromZodError","ValidationError","NotInsideProjectError","DubheCliError","UpgradeError","FsIibError","logError","error","validationError","fsAsync","mkdirSync","writeFileSync","dirname","SUI_PRIVATE_KEY_PREFIX","execSync","spawn","chalk","isSuiStartRunning","cmd","result","startLocalnode","background","suiProcess","error","code","execSync","chalk","checkLocalNodeStatus","cmd","output","execSync","stopLocalnode","cmd","output","pid","match","error","fs","chalk","spawn","validatePrivateKey","privateKey","SUI_PRIVATE_KEY_PREFIX","strippedPrivateKey","getDeploymentJson","projectPath","network","data","FsIibError","getOnchainSchemas","getVersion","getOldPackageId","projectPath","network","getDeploymentJson","getUpgradeCap","getSchemaHub","saveContractData","projectName","network","packageId","upgradeCap","schemaHub","version","schemas","DeploymentData","path","storeDeploymentData","writeOutput","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","getDubheDependency","updateDubheDependency","filePath","fileContent","newDependency","updatedContent","switchEnv","resolve","reject","suiProcess","spawn","data","chalk","error","code","delay","ms","fs","path","getDappsObjectId","network","getSchemaHub","removeEnvContent","filePath","networkType","content","regex","updatedContent","updateEnvFile","filePath","networkType","operation","chainId","publishedId","envFilePath","envContent","envLines","networkSectionIndex","line","config","i","key","value","part","updatedSection","newEnvContent","capitalizeAndRemoveUnderscores","input","word","index","getLastSegment","segments","buildContract","projectPath","modules","dependencies","buildResult","execSync","error","chalk","publishContract","client","dubhe","dubheConfig","network","dappsObjectId","getDappsObjectId","removeEnvContent","keypair","tx","Transaction","upgradeCap","result","version","packageId","schemas","upgradeCapId","schemaHubId","object","delay","deployHookTx","txCoin","deployHookResult","structure","schemaKey","saveContractData","publishDubheFramework","publishHandler","contractName","switchEnv","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","Dubhe","SuiClient","getFullnodeUrl","updateDubheDependency","chalk","printDubhe","commandModule","yargs","argv","action","background","startLocalnode","stopLocalnode","checkLocalNodeStatus","restartNode","error","localnode_default","Dubhe","requestSuiFromFaucetV0","getFaucetHost","SuiClient","getFullnodeUrl","commandModule","yargs","network","recipient","faucet_address","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","Dubhe","requestSuiFromFaucetV0","getFaucetHost","client","SuiClient","getFullnodeUrl","params","balance","faucet_default","schemaGen","loadConfig","chalk","commandModule","configPath","network","frameworkId","dubheConfig","error","schemagen_default","loadConfig","commandModule","yargs","network","configPath","contractName","dubheConfig","publishHandler","error","logError","publish_default","Dubhe","Transaction","UpgradePolicy","getFullnodeUrl","SuiClient","execSync","chalk","fs","path","updateMigrateMethod","projectPath","migrations","migration","filePath","fileContent","migrateMethodRegex","capitalizeAndRemoveUnderscores","newMigrateMethod","field","storage_type","updatedContent","input","word","index","getLastSegment","segments","replaceEnvField","networkType","newValue","envFilePath","envLines","networkSectionIndex","line","fieldIndex","previousValue","i","newEnvContent","upgradeHandler","config","name","network","switchEnv","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","keypair","Dubhe","client","SuiClient","getFullnodeUrl","oldVersion","getVersion","oldPackageId","getOldPackageId","schemaHub","getSchemaHub","upgradeCap","getUpgradeCap","original_published_id","pendingMigration","schemas","getOnchainSchemas","schemaKey","schema","migrate","fields","isMigration","key","modules","dependencies","digest","extractedModules","extractedDependencies","extractedDigest","execSync","error","UpgradeError","tx","Transaction","ticket","UpgradePolicy","receipt","result","newPackageId","object","chalk","saveContractData","loadConfig","commandModule","yargs","network","configPath","dubheConfig","upgradeHandler","error","logError","upgrade_default","execSync","chalk","commandModule","yargs","packagePath","error","test_default","commandModule","yargs","printDubhe","hello_default","commands","publish_default","localnode_default","faucet_default","schemagen_default","upgrade_default","test_default","hello_default","dotenv","chalk","yargs","hideBin","commands","msg","err","logError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xobelisk/sui-cli",
3
- "version": "0.5.26",
3
+ "version": "0.5.27",
4
4
  "description": "Tookit for interacting with move eps framework",
5
5
  "keywords": [
6
6
  "sui",
@@ -12,7 +12,7 @@ import {
12
12
  updateVersionInFile,
13
13
  saveContractData,
14
14
  validatePrivateKey,
15
- schema, getSchemaHub,
15
+ schema, getSchemaHub, updateDubheDependency, switchEnv, delay,
16
16
  } from './utils';
17
17
  import { DubheConfig } from '@0xobelisk/sui-common';
18
18
  import * as fs from 'fs';
@@ -56,14 +56,14 @@ const chainIds: { [key: string]: string } = {
56
56
  mainnet: '35834a8a',
57
57
  };
58
58
 
59
- function updateEnvFile(filePath: string, networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet', operation: 'publish' | 'upgrade', publishedId: string): void {
59
+ function updateEnvFile(filePath: string, networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet', operation: 'publish' | 'upgrade', chainId: string, publishedId: string): void {
60
60
  const envFilePath = path.resolve(filePath);
61
61
  const envContent = fs.readFileSync(envFilePath, 'utf-8');
62
62
  const envLines = envContent.split('\n');
63
63
 
64
64
  const networkSectionIndex = envLines.findIndex(line => line.trim() === `[env.${networkType}]`);
65
65
  const config: EnvConfig = {
66
- chainId: chainIds[networkType] || '',
66
+ chainId: chainId,
67
67
  originalPublishedId: '',
68
68
  latestPublishedId: '',
69
69
  publishedVersion: 0,
@@ -85,9 +85,6 @@ function updateEnvFile(filePath: string, networkType: 'mainnet' | 'testnet' | 'd
85
85
 
86
86
  const [key, value] = line.split('=').map(part => part.trim().replace(/"/g, ''));
87
87
  switch (key) {
88
- case 'chain-id':
89
- config.chainId = value;
90
- break;
91
88
  case 'original-published-id':
92
89
  config.originalPublishedId = value;
93
90
  break;
@@ -169,14 +166,14 @@ async function publishContract(
169
166
  network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',
170
167
  projectPath: string
171
168
  ) {
172
-
173
169
  const dappsObjectId = await getDappsObjectId(network);
174
170
  console.log("dappsObjectId", dappsObjectId);
175
-
171
+ const chainId = await client.getChainIdentifier();
176
172
  removeEnvContent(`${projectPath}/Move.lock`, network);
177
173
  console.log('\n🚀 Starting Contract Publication...');
178
174
  console.log(` ├─ Project: ${projectPath}`);
179
175
  console.log(` ├─ Network: ${network}`);
176
+ console.log(` ├─ ChainId: ${chainId}`);
180
177
  console.log(' ├─ Validating Environment...');
181
178
 
182
179
  const keypair = dubhe.getKeypair();
@@ -238,10 +235,10 @@ async function publishContract(
238
235
 
239
236
  console.log(` └─ Transaction: ${result.digest}`);
240
237
 
241
- updateEnvFile(`${projectPath}/Move.lock`, network, 'publish', packageId);
238
+ updateEnvFile(`${projectPath}/Move.lock`, network, 'publish', chainId, packageId);
242
239
 
243
240
  console.log('\n⚡ Executing Deploy Hook...');
244
- await new Promise(resolve => setTimeout(resolve, 5000));
241
+ await delay(5000);
245
242
 
246
243
  const deployHookTx = new Transaction();
247
244
  deployHookTx.setGasBudget(2000000000);
@@ -325,11 +322,13 @@ async function publishDubheFramework(
325
322
  ) {
326
323
  const path = process.cwd();
327
324
  const projectPath = `${path}/contracts/dubhe-framework`;
328
-
325
+ const chainId = await client.getChainIdentifier();
326
+ console.log(` └─ Chain ID: ${chainId}`);
329
327
  removeEnvContent(`${projectPath}/Move.lock`, network);
330
328
  console.log('\n🚀 Starting Contract Publication...');
331
329
  console.log(` ├─ Project: ${projectPath}`);
332
330
  console.log(` ├─ Network: ${network}`);
331
+ console.log(` ├─ ChainId: ${chainId}`);
333
332
  console.log(' ├─ Validating Environment...');
334
333
 
335
334
  const keypair = dubhe.getKeypair();
@@ -392,7 +391,7 @@ async function publishDubheFramework(
392
391
 
393
392
  console.log(` └─ Transaction: ${result.digest}`);
394
393
 
395
- updateEnvFile(`${projectPath}/Move.lock`, network, 'publish', packageId);
394
+ updateEnvFile(`${projectPath}/Move.lock`, network, 'publish', chainId, packageId);
396
395
 
397
396
  saveContractData(
398
397
  "dubhe-framework",
@@ -410,6 +409,8 @@ export async function publishHandler(
410
409
  network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',
411
410
  contractName?: string,
412
411
  ) {
412
+ await switchEnv(network);
413
+
413
414
  const privateKey = process.env.PRIVATE_KEY;
414
415
  if (!privateKey) {
415
416
  throw new DubheCliError(
@@ -424,9 +425,6 @@ in your contracts directory to use the default sui private key.`
424
425
  }
425
426
 
426
427
  const dubhe = new Dubhe({ secretKey: privateKeyFormat });
427
- const keypair = dubhe.getKeypair();
428
- console.log(` └─ Account: ${keypair.toSuiAddress()}`);
429
-
430
428
  const client = new SuiClient({ url: getFullnodeUrl(network) });
431
429
 
432
430
  if (contractName == "dubhe-framework") {
@@ -434,6 +432,7 @@ in your contracts directory to use the default sui private key.`
434
432
  } else {
435
433
  const path = process.cwd();
436
434
  const projectPath = `${path}/contracts/${dubheConfig.name}`;
435
+ updateDubheDependency(`${projectPath}/Move.toml`, network);
437
436
  await publishContract(client, dubhe, dubheConfig, network, projectPath);
438
437
  }
439
438
  }
@@ -10,7 +10,7 @@ import {
10
10
  getVersion,
11
11
  getUpgradeCap,
12
12
  saveContractData,
13
- validatePrivateKey, getOnchainSchemas, getSchemaHub,
13
+ validatePrivateKey, getOnchainSchemas, getSchemaHub, switchEnv, delay,
14
14
  } from './utils';
15
15
  import * as fs from 'fs';
16
16
  import * as path from 'path';
@@ -112,7 +112,6 @@ function replaceEnvField(
112
112
  envLines[fieldIndex] = `${field} = "${newValue}"`;
113
113
  const newEnvContent = envLines.join('\n');
114
114
  fs.writeFileSync(envFilePath, newEnvContent, 'utf-8');
115
- console.log(`${field} for [env.${networkType}] replaced successfully.`);
116
115
  } else {
117
116
  console.log(`${field} not found for [env.${networkType}].`);
118
117
  }
@@ -124,6 +123,8 @@ export async function upgradeHandler(
124
123
  name: string,
125
124
  network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',
126
125
  ) {
126
+ await switchEnv(network);
127
+
127
128
  const path = process.cwd();
128
129
  const projectPath = `${path}/contracts/${name}`;
129
130
  const privateKey = process.env.PRIVATE_KEY;
@@ -4,6 +4,9 @@ import { dirname } from 'path';
4
4
  import { SUI_PRIVATE_KEY_PREFIX } from '@mysten/sui/cryptography';
5
5
  import { FsIibError } from './errors';
6
6
  export * from './localnode';
7
+ import * as fs from 'fs';
8
+ import chalk from 'chalk';
9
+ import { spawn } from 'child_process';
7
10
 
8
11
  export type schema = {
9
12
  name: string;
@@ -175,3 +178,69 @@ export async function writeOutput(
175
178
  console.log(`${logPrefix}: ${fullOutputPath}`);
176
179
  }
177
180
  }
181
+
182
+ function getDubheDependency(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'): string {
183
+ switch (network) {
184
+ case 'localnet':
185
+ return 'Dubhe = { local = "../dubhe-framework" }';
186
+ case 'testnet':
187
+ return 'Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "dubhe-testnet-v1.0.0" }';
188
+ case 'mainnet':
189
+ return 'Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "dubhe-mainnet-v1.0.0" }';
190
+ default:
191
+ throw new Error(`Unsupported network: ${network}`);
192
+ }
193
+ }
194
+
195
+ export function updateDubheDependency(filePath: string, network: 'mainnet' | 'testnet' | 'devnet' | 'localnet') {
196
+ const fileContent = fs.readFileSync(filePath, 'utf-8');
197
+ const newDependency = getDubheDependency(network);
198
+ const updatedContent = fileContent.replace(/Dubhe = \{.*\}/, newDependency);
199
+ fs.writeFileSync(filePath, updatedContent, 'utf-8');
200
+ console.log(`Updated Dubhe dependency in ${filePath} for ${network}.`);
201
+ }
202
+ export async function switchEnv(network: 'mainnet' | 'testnet' | 'devnet' | 'localnet') {
203
+ try {
204
+ return new Promise<void>((resolve, reject) => {
205
+ const suiProcess = spawn(
206
+ 'sui',
207
+ ['client', 'switch', '--env', network],
208
+ {
209
+ env: { ...process.env },
210
+ stdio: 'pipe'
211
+ }
212
+ );
213
+
214
+ suiProcess.stdout.on('data', data => {
215
+ console.log(chalk.green(`${data.toString()}`));
216
+ });
217
+
218
+ suiProcess.stderr.on('data', data => {
219
+ console.error(chalk.red('\n❌ Failed to Switch Env'));
220
+ console.error(chalk.red(` Error: ${data.toString()}`));
221
+ });
222
+
223
+ suiProcess.on('error', error => {
224
+ console.error(chalk.red('\n❌ Failed to Switch Env'));
225
+ console.error(chalk.red(` Error: ${error.message}`));
226
+ reject(error); // Reject promise on error
227
+ });
228
+
229
+ suiProcess.on('exit', (code) => {
230
+ if (code !== 0) {
231
+ console.error(chalk.red(`\n❌ Process exited with code: ${code}`));
232
+ reject(new Error(`Process exited with code: ${code}`));
233
+ } else {
234
+ console.log(chalk.green('\n✅ Environment switched successfully.'));
235
+ resolve(); // Resolve promise on successful exit
236
+ }
237
+ });
238
+ });
239
+ } catch (error) {
240
+ console.error(chalk.red('\n❌ Failed to Switch Env'));
241
+ console.error(chalk.red(` └─ Error: ${error}`));
242
+ }
243
+ }
244
+
245
+ export const delay = (ms: number) =>
246
+ new Promise(resolve => setTimeout(resolve, ms));