@0xobelisk/sui-cli 0.5.34 ā 0.5.35
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 +46 -46
- package/dist/dubhe.js.map +1 -1
- package/package.json +4 -4
- package/src/utils/publishHandler.ts +1 -53
- package/src/utils/upgradeHandler.ts +2 -4
- package/src/utils/utils.ts +0 -11
package/dist/dubhe.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
2
|
+
import Ht from"yargs";import{hideBin as Jt}from"yargs/helpers";import{execSync as Xe,spawn as ce}from"child_process";import w from"chalk";import Oe from"chalk";function T(){console.log(Oe.yellow(`
|
|
3
3
|
Welcome to Dubhe
|
|
4
4
|
--from team@obelisk
|
|
5
5
|
________ ___ ___ ________ ___ ___ _______
|
|
@@ -10,65 +10,65 @@ Welcome to Dubhe
|
|
|
10
10
|
\\ \\_______\\ \\_______\\ \\_______\\ \\__\\ \\__\\ \\_______\\
|
|
11
11
|
\\|_______|\\|_______|\\|_______|\\|__|\\|__|\\|_______|
|
|
12
12
|
|
|
13
|
-
`))}import{Dubhe as
|
|
13
|
+
`))}import{Dubhe as Le}from"@0xobelisk/sui-client";import{Transaction as H}from"@mysten/sui/transactions";import{getFullnodeUrl as ze,SuiClient as He}from"@mysten/sui/client";import{execSync as Je}from"child_process";import $ from"chalk";import O from"chalk";import{ZodError as Ke}from"zod";import{fromZodError as Re,ValidationError as Te}from"zod-validation-error";var z=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"},g=class extends Error{name="DubheCliError"},N=class extends Error{name="UpgradeError"},j=class extends Error{name="FsIibError"};function A(e){if(e instanceof Te)console.log(O.redBright(e.message));else if(e instanceof Ke){let t=Re(e,{prefixSeparator:`
|
|
14
14
|
- `,issueSeparator:`
|
|
15
|
-
- `});console.log(
|
|
15
|
+
- `});console.log(O.redBright(t.message))}else e instanceof z?(console.log(O.red(e.message)),console.log(""),console.log(O.blue("To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk"))):e instanceof g?console.log(O.red(e)):console.log(e)}import*as X from"fs/promises";import{mkdirSync as Ne,writeFileSync as je}from"fs";import{dirname as Ue}from"path";import{SUI_PRIVATE_KEY_PREFIX as Ve}from"@mysten/sui/cryptography";import*as U from"fs";import E from"chalk";import{spawn as Ye}from"child_process";function k(e){if(e.startsWith(Ve))return e.length===70?e:!1;if(e.startsWith("0x")){let t=e.slice(2);return t.length===64?t:!1}else return e.length===64?e:!1}async function V(e,t){try{let o=await X.readFile(`${e}/.history/sui_${t}/latest.json`,"utf8");return JSON.parse(o)}catch{throw new j("Fs read deployment file failed.")}}async function Q(e,t){return(await V(e,t)).schemas}async function ee(e,t){return(await V(e,t)).version}async function te(e,t){return(await V(e,t)).packageId}async function oe(e,t){return(await V(e,t)).upgradeCap}function K(e,t,o,r,n,s){let i={projectName:e,network:t,packageId:o,schemas:s,upgradeCap:r,version:n},c=process.cwd(),d=JSON.stringify(i,null,2);qe(d,`${c}/contracts/${e}/.history/sui_${t}/latest.json`,"Update deploy log")}async function qe(e,t,o){Ne(Ue(t),{recursive:!0}),je(t,e),o!==void 0&&console.log(`${o}: ${t}`)}function Be(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 Y(e,t){let o=U.readFileSync(e,"utf-8"),r=Be(t),n=o.replace(/Dubhe = \{.*\}/,r);U.writeFileSync(e,n,"utf-8"),console.log(`Updated Dubhe dependency in ${e} for ${t}.`)}async function F(e){try{return new Promise((t,o)=>{let r=Ye("sui",["client","switch","--env",e],{env:{...process.env},stdio:"pipe"});r.stdout.on("data",n=>{console.log(E.green(`${n.toString()}`))}),r.stderr.on("data",n=>{console.error(E.red(`
|
|
16
16
|
\u274C Failed to Switch Env`)),console.error(E.red(` Error: ${n.toString()}`))}),r.on("error",n=>{console.error(E.red(`
|
|
17
17
|
\u274C Failed to Switch Env`)),console.error(E.red(` Error: ${n.message}`)),o(n)}),r.on("exit",n=>{n!==0?(console.error(E.red(`
|
|
18
18
|
\u274C Process exited with code: ${n}`)),o(new Error(`Process exited with code: ${n}`))):t()})})}catch(t){console.error(E.red(`
|
|
19
|
-
\u274C Failed to Switch Env`)),console.error(E.red(` \u2514\u2500 Error: ${t}`))}}var
|
|
20
|
-
`),d=c.findIndex(
|
|
19
|
+
\u274C Failed to Switch Env`)),console.error(E.red(` \u2514\u2500 Error: ${t}`))}}var R=e=>new Promise(t=>setTimeout(t,e));import*as I from"fs";import*as ne from"path";function re(e,t){if(!I.existsSync(e))return;let o=I.readFileSync(e,"utf-8"),r=new RegExp(`\\[env\\.${t}\\][\\s\\S]*?(?=\\[|$)`,"g"),n=o.replace(r,"");I.writeFileSync(e,n,"utf-8")}function se(e,t,o,r,n){let s=ne.resolve(e),i=I.readFileSync(s,"utf-8"),c=i.split(`
|
|
20
|
+
`),d=c.findIndex(m=>m.trim()===`[env.${t}]`),a={chainId:r,originalPublishedId:"",latestPublishedId:"",publishedVersion:0};if(d===-1)if(o==="publish")a.originalPublishedId=n,a.latestPublishedId=n,a.publishedVersion=1;else throw new Error(`Network type [env.${t}] not found in the file and cannot upgrade.`);else{for(let m=d+1;m<c.length;m++){let _=c[m].trim();if(_.startsWith("["))break;let[y,b]=_.split("=").map(p=>p.trim().replace(/"/g,""));switch(y){case"original-published-id":a.originalPublishedId=b;break;case"latest-published-id":a.latestPublishedId=b;break;case"published-version":a.publishedVersion=parseInt(b,10);break}}o==="publish"?(a.originalPublishedId=n,a.latestPublishedId=n,a.publishedVersion=1):o==="upgrade"&&(a.latestPublishedId=n,a.publishedVersion+=1)}let u=`
|
|
21
21
|
[env.${t}]
|
|
22
|
-
chain-id = "${
|
|
23
|
-
original-published-id = "${
|
|
24
|
-
latest-published-id = "${
|
|
25
|
-
published-version = "${
|
|
26
|
-
`,
|
|
27
|
-
`)+u;
|
|
28
|
-
\u{1F680} Starting Contract Publication...`),console.log(` \u251C\u2500 Project: ${n}`),console.log(` \u251C\u2500 Network: ${r}`),console.log(` \u251C\u2500 ChainId: ${
|
|
29
|
-
\u{1F4E6} Building Contract...`);let[
|
|
30
|
-
\u{1F504} Publishing Contract...`);let
|
|
31
|
-
\u26A1 Executing Deploy Hook...`),await
|
|
32
|
-
\u{1F4CB} Created Schemas:`),
|
|
22
|
+
chain-id = "${a.chainId}"
|
|
23
|
+
original-published-id = "${a.originalPublishedId}"
|
|
24
|
+
latest-published-id = "${a.latestPublishedId}"
|
|
25
|
+
published-version = "${a.publishedVersion}"
|
|
26
|
+
`,h=d===-1?i+u:c.slice(0,d).join(`
|
|
27
|
+
`)+u;I.writeFileSync(s,h,"utf-8")}function Ge(e){return e.split("_").map((t,o)=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function We(e){let t=e.split("::");return t.length>0?t[t.length-1]:""}function ie(e){let t,o;try{let r=JSON.parse(Je(`sui move build --dump-bytecode-as-base64 --path ${e}`,{encoding:"utf-8",stdio:"pipe"}));t=r.modules,o=r.dependencies,console.log(" \u2514\u2500 Build successful")}catch(r){console.error($.red(" \u2514\u2500 Build failed")),console.error(r.stdout),process.exit(1)}return[t,o]}async function Ze(e,t,o,r,n,s){let i=await e.getChainIdentifier();re(`${n}/Move.lock`,r),console.log(`
|
|
28
|
+
\u{1F680} Starting Contract Publication...`),console.log(` \u251C\u2500 Project: ${n}`),console.log(` \u251C\u2500 Network: ${r}`),console.log(` \u251C\u2500 ChainId: ${i}`),console.log(" \u251C\u2500 Validating Environment...");let c=t.getKeypair();console.log(` \u2514\u2500 Account: ${c.toSuiAddress()}`),console.log(`
|
|
29
|
+
\u{1F4E6} Building Contract...`);let[d,a]=ie(n);console.log(`
|
|
30
|
+
\u{1F504} Publishing Contract...`);let u=new H;s&&u.setGasBudget(s);let[h]=u.publish({modules:d,dependencies:a});u.transferObjects([h],c.toSuiAddress());let m;try{m=await e.signAndExecuteTransaction({signer:c,transaction:u,options:{showObjectChanges:!0}})}catch(l){console.error($.red(" \u2514\u2500 Publication failed")),console.error(l.message),process.exit(1)}m.effects?.status.status==="failure"&&(console.log($.red(" \u2514\u2500 Publication failed")),process.exit(1)),console.log(" \u251C\u2500 Processing publication results...");let _=1,y="",b=[],p="";m.objectChanges.map(l=>{l.type==="published"&&(console.log(` \u251C\u2500 Package ID: ${l.packageId}`),y=l.packageId),l.type==="created"&&l.objectType==="0x2::package::UpgradeCap"&&(console.log(` \u251C\u2500 Upgrade Cap: ${l.objectId}`),p=l.objectId)}),console.log(` \u2514\u2500 Transaction: ${m.digest}`),se(`${n}/Move.lock`,r,"publish",i,y),console.log(`
|
|
31
|
+
\u26A1 Executing Deploy Hook...`),await R(5e3);let x=new H;x.moveCall({target:`${y}::deploy_hook::run`,arguments:[x.object("0x6")]});let v;try{v=await e.signAndExecuteTransaction({signer:c,transaction:x,options:{showEffects:!0,showObjectChanges:!0}})}catch(l){console.error($.red(" \u2514\u2500 Deploy hook execution failed")),console.error(l.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(`
|
|
32
|
+
\u{1F4CB} Created Schemas:`),v.objectChanges?.map(l=>{if(l.type==="created"&&l.objectType.includes("_schema")&&!l.objectType.includes("dynamic_field")){console.log(` \u251C\u2500 ${l.objectType}`),console.log(` \u2514\u2500 ID: ${l.objectId}`);let D={};for(let C in o.schemas)Ge(C)===We(l.objectType)&&(D=o.schemas[C].structure);b.push({name:l.objectType,objectId:l.objectId,structure:D})}}),K(o.name,r,y,p,_,b),console.log(`
|
|
33
33
|
\u2705 Contract Publication Complete
|
|
34
|
-
`)):(console.log(
|
|
35
|
-
\u{1F680} Starting Contract Publication...`),console.log(` \u251C\u2500 Project: ${n}`),console.log(` \u251C\u2500 Network: ${o}`),console.log(` \u251C\u2500 ChainId: ${s}`),console.log(" \u251C\u2500 Validating Environment...");let
|
|
36
|
-
\u{1F4E6} Building Contract...`);let[c,d]=
|
|
37
|
-
\u{1F504} Publishing Contract...`);let
|
|
34
|
+
`)):(console.log($.yellow(" \u2514\u2500 Deploy hook execution failed")),console.log($.yellow(" Please republish or manually call deploy_hook::run")),console.log($.yellow(" Please check the transaction digest:")),console.log($.yellow(` ${v.digest}`)),process.exit(1))}async function J(e,t,o){let n=`${process.cwd()}/contracts/dubhe-framework`,s=await e.getChainIdentifier();console.log(` \u2514\u2500 Chain ID: ${s}`),re(`${n}/Move.lock`,o),console.log(`
|
|
35
|
+
\u{1F680} Starting Contract Publication...`),console.log(` \u251C\u2500 Project: ${n}`),console.log(` \u251C\u2500 Network: ${o}`),console.log(` \u251C\u2500 ChainId: ${s}`),console.log(" \u251C\u2500 Validating Environment...");let i=t.getKeypair();console.log(` \u2514\u2500 Account: ${i.toSuiAddress()}`),console.log(`
|
|
36
|
+
\u{1F4E6} Building Contract...`);let[c,d]=ie(n);console.log(`
|
|
37
|
+
\u{1F504} Publishing Contract...`);let a=new H,[u]=a.publish({modules:c,dependencies:d});a.transferObjects([u],i.toSuiAddress());let h;try{h=await e.signAndExecuteTransaction({signer:i,transaction:a,options:{showObjectChanges:!0}})}catch(p){console.error($.red(" \u2514\u2500 Publication failed")),console.error(p.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 m=1,_="",y=[],b="";h.objectChanges.map(p=>{p.type==="published"&&(console.log(` \u251C\u2500 Package ID: ${p.packageId}`),_=p.packageId),p.type==="created"&&p.objectType==="0x2::package::UpgradeCap"&&(console.log(` \u251C\u2500 Upgrade Cap: ${p.objectId}`),b=p.objectId)}),console.log(` \u2514\u2500 Transaction: ${h.digest}`),se(`${n}/Move.lock`,o,"publish",s,_),K("dubhe-framework",o,_,b,m,y)}async function ae(e,t,o,r){await F(t);let n=process.env.PRIVATE_KEY;if(!n)throw new g(`Missing PRIVATE_KEY environment variable.
|
|
38
38
|
Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
|
|
39
|
-
in your contracts directory to use the default sui private key.`);let s
|
|
40
|
-
\u26A0\uFE0F Warning: Local Node Already Running`)),console.log(
|
|
41
|
-
\u274C Failed to Start Local Node`)),console.error(
|
|
42
|
-
\u{1F514} Stopping Local Node...`)),e&&(e.kill(),console.log(
|
|
43
|
-
\u274C Failed to Start Local Node`)),console.error(
|
|
39
|
+
in your contracts directory to use the default sui private key.`);let s=k(n);if(s===!1)throw new g("Please check your privateKey.");let i=new Le({secretKey:s}),c=new He({url:ze(t)});if(o=="dubhe-framework")await J(c,i,t);else{let a=`${process.cwd()}/contracts/${e.name}`;Y(`${a}/Move.toml`,t),await Ze(c,i,e,t,a,r)}}import{Dubhe as le}from"@0xobelisk/sui-client";import{getFullnodeUrl as Qe,SuiClient as et}from"@mysten/sui/client";function tt(){try{let e=process.platform==="win32"?'tasklist /FI "IMAGENAME eq sui.exe" /FO CSV /NH':'pgrep -f "sui start"',t=Xe(e).toString().trim();return process.platform==="win32"?t.toLowerCase().includes("sui.exe"):t.length>0}catch{return!1}}async function ot(){let e=["suiprivkey1qq3ez3dje66l8pypgxynr7yymwps6uhn7vyczespj84974j3zya0wdpu76v","suiprivkey1qp6vcyg8r2x88fllmjmxtpzjl95gd9dugqrgz7xxf50w6rqdqzetg7x4d7s","suiprivkey1qpy3a696eh3m55fwa8h38ss063459u4n2dm9t24w2hlxxzjp2x34q8sdsnc","suiprivkey1qzxwp29favhzrjd95f6uj9nskjwal6nh9g509jpun395y6g72d6jqlmps4c","suiprivkey1qzhq4lv38sesah4uzsqkkmeyjx860xqjdz8qgw36tmrdd5tnle3evxpng57","suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c"];console.log("\u{1F4DD}Accounts"),console.log("=========="),e.forEach((t,o)=>{let n=new le({secretKey:t}).getKeypair();ce("curl",["--location","--request","POST","http://127.0.0.1:9123/gas","--header","Content-Type: application/json","--data-raw",`{"FixedAmountRequest": {"recipient": "${n.toSuiAddress()}"}}`],{env:{...process.env},stdio:"ignore",detached:!0}),console.log(` \u250C\u2500 Account #${o}: ${n.toSuiAddress()}(1000 SUI)`),console.log(` \u2514\u2500 Private Key: ${t}`)}),console.log("=========="),console.log(w.yellow("\u26A0\uFE0FWARNING: These accounts, and their private keys, are publicly known.")),console.log(w.yellow("Any funds sent to them on Mainnet or any other live network WILL BE LOST."))}async function de(){if(tt()){console.log(w.yellow(`
|
|
40
|
+
\u26A0\uFE0F Warning: Local Node Already Running`)),console.log(w.yellow(" \u251C\u2500 Cannot start a new instance")),console.log(w.yellow(" \u2514\u2500 Please stop the existing process first"));return}T(),console.log("\u{1F680} Starting Local Node...");try{let e=ce("sui",["start","--with-faucet","--force-regenesis"],{env:{...process.env,RUST_LOG:"off,sui_node=info"},stdio:"ignore",detached:!0});e.on("error",s=>{console.error(w.red(`
|
|
41
|
+
\u274C Failed to Start Local Node`)),console.error(w.red(` \u2514\u2500 Error: ${s.message}`))}),await R(5e3),console.log(" \u251C\u2500 Faucet: Enabled"),console.log(" \u2514\u2500 Force Regenesis: Yes"),console.log(" \u2514\u2500 HTTP server: http://127.0.0.1:9000/"),console.log(" \u2514\u2500 Faucet server: http://127.0.0.1:9123/"),await ot(),await R(2e3);let t=k("suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c");if(t===!1)throw new g("Please check your privateKey.");let o=new le({secretKey:t}),r=new et({url:Qe("localnet")}),n=console.log;console.log=()=>{},await J(r,o,"localnet"),console.log=n,process.on("SIGINT",()=>{console.log(w.yellow(`
|
|
42
|
+
\u{1F514} Stopping Local Node...`)),e&&(e.kill(),console.log(w.green("\u2705 Local Node Stopped"))),process.exit()})}catch(e){console.error(w.red(`
|
|
43
|
+
\u274C Failed to Start Local Node`)),console.error(w.red(` \u2514\u2500 Error: ${e.message}`))}}var nt={command:"node",describe:"Manage local Sui node",builder(e){return e},async handler(){try{await de()}catch(e){console.error("Error executing command:",e),process.exit(1)}}},pe=nt;import{Dubhe as rt}from"@0xobelisk/sui-client";import{requestSuiFromFaucetV0 as st,getFaucetHost as it}from"@mysten/sui/faucet";import{SuiClient as at,getFullnodeUrl as ct}from"@mysten/sui/client";var lt={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:t}){let o="";if(t===void 0){let i=process.env.PRIVATE_KEY;if(!i)throw new g(`Missing PRIVATE_KEY environment variable.
|
|
44
44
|
Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
|
|
45
|
-
in your contracts directory to use the default sui private key.`);let c
|
|
46
|
-
\u{1F30A} Starting Faucet Operation...`),console.log(` \u251C\u2500 Network: ${e}`),t===void 0?(console.log(" \u251C\u2500 Using Environment PrivateKey"),console.log(` \u251C\u2500 Generated Address: ${o}`)):console.log(` \u251C\u2500 Using Provided Address: ${o}`),console.log(" \u251C\u2500 Requesting funds from faucet..."),await
|
|
45
|
+
in your contracts directory to use the default sui private key.`);let c=k(i);if(c===!1)throw new g("Please check your PRIVATE_KEY.");o=new rt({secretKey:c}).getKeypair().toSuiAddress()}else o=t;console.log(`
|
|
46
|
+
\u{1F30A} Starting Faucet Operation...`),console.log(` \u251C\u2500 Network: ${e}`),t===void 0?(console.log(" \u251C\u2500 Using Environment PrivateKey"),console.log(` \u251C\u2500 Generated Address: ${o}`)):console.log(` \u251C\u2500 Using Provided Address: ${o}`),console.log(" \u251C\u2500 Requesting funds from faucet..."),await st({host:it(e),recipient:o}),console.log(" \u2514\u2500 Checking balance...");let r=new at({url:ct(e)}),n={owner:o},s=await r.getBalance(n);console.log(`
|
|
47
47
|
\u{1F4B0} Account Summary`),console.log(` \u251C\u2500 Address: ${o}`),console.log(` \u2514\u2500 Balance: ${(Number(s.totalBalance)/1e9).toFixed(4)} SUI`),console.log(`
|
|
48
48
|
\u2705 Faucet Operation Complete
|
|
49
|
-
`),process.exit(0)}},
|
|
50
|
-
public fun migrate(${o.schemaName}: &mut ${
|
|
51
|
-
${o.fields.map(d=>{let
|
|
49
|
+
`),process.exit(0)}},ue=lt;import{schemaGen as dt,loadConfig as pt}from"@0xobelisk/sui-common";import ut from"chalk";var gt={command:"schemagen",describe:"Autogenerate Dubhe schemas based on the config file",builder:{"config-path":{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)"},"framework-id":{type:"string",desc:"Framework Package ID"}},async handler({"config-path":e,network:t,"framework-id":o}){try{let r=await pt(e);await dt(r,void 0,t,o),process.exit(0)}catch(r){console.log(ut.red("Schemagen failed!")),console.error(r.message)}}},ge=gt;import{loadConfig as mt}from"@0xobelisk/sui-common";var ft={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)"},"config-path":{type:"string",default:"dubhe.config.ts",desc:"Configuration file path"},"contract-name":{type:"string",desc:"Optional contract name in contracts/ directory"},"gas-budget":{type:"number",desc:"Optional gas budget for the transaction",optional:!0}})},async handler({network:e,"config-path":t,"contract-name":o,"gas-budget":r}){try{let n=await mt(t);await ae(n,e,o,r)}catch(n){A(n),process.exit(1)}process.exit(0)}},me=ft;import{Dubhe as ht}from"@0xobelisk/sui-client";import{Transaction as yt,UpgradePolicy as bt}from"@mysten/sui/transactions";import{getFullnodeUrl as vt,SuiClient as wt}from"@mysten/sui/client";import{execSync as _t}from"child_process";import q from"chalk";import*as M from"fs";import*as fe from"path";function xt(e,t){t.forEach(o=>{let r=`${e}/sources/codegen/schemas/${o.schemaName}.move`,n=M.readFileSync(r,"utf-8"),s=new RegExp(`public fun migrate\\(_${o.schemaName}: &mut ${G(o.schemaName)}, _cap: &UpgradeCap\\) {[^}]*}`),i=`
|
|
50
|
+
public fun migrate(${o.schemaName}: &mut ${G(o.schemaName)}, _cap: &UpgradeCap) {
|
|
51
|
+
${o.fields.map(d=>{let a="";return d.type.includes("StorageValue")?a="storage_value::new()":d.type.includes("StorageMap")?a="storage_map::new()":d.type.includes("StorageDoubleMap")&&(a="storage_double_map::new()"),`storage_migration::add_field<${d.type}>(&mut ${o.schemaName}.id, b"${d.name}", ${a});`}).join("")}
|
|
52
52
|
}
|
|
53
|
-
`,c=n.replace(s,
|
|
54
|
-
`),c=
|
|
55
|
-
`);
|
|
53
|
+
`,c=n.replace(s,i);M.writeFileSync(r,c,"utf-8")})}function G(e){return e.split("_").map((t,o)=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Ct(e){let t=e.split("::");return t.length>0?t[t.length-1]:""}function B(e,t,o,r){let n=fe.resolve(e),i=M.readFileSync(n,"utf-8").split(`
|
|
54
|
+
`),c=i.findIndex(u=>u.trim()===`[env.${t}]`);if(c===-1)return console.log(`Network type [env.${t}] not found in the file.`),"";let d=-1,a="";for(let u=c+1;u<i.length;u++){let h=i[u].trim();if(h.startsWith("["))break;if(h.startsWith(o)){d=u,a=h.split("=")[1].trim().replace(/"/g,"");break}}if(d!==-1){i[d]=`${o} = "${r}"`;let u=i.join(`
|
|
55
|
+
`);M.writeFileSync(n,u,"utf-8")}else console.log(`${o} not found for [env.${t}].`);return a}async function he(e,t,o){await F(o);let r=process.cwd(),n=`${r}/contracts/${t}`,s=process.env.PRIVATE_KEY;if(!s)throw new g(`Missing PRIVATE_KEY environment variable.
|
|
56
56
|
Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
|
|
57
|
-
in your contracts directory to use the default sui private key.`);let
|
|
58
|
-
\u{1F680} Starting Migration for ${p.schemaName}...`),console.log("\u{1F4CB} Migration Fields:",p.fields)})
|
|
59
|
-
\u{1F680} Starting Upgrade Process...`),console.log("\u{1F4CB} OldPackageId:",
|
|
60
|
-
`)));let o=process.cwd(),r;if(e){let c=new
|
|
57
|
+
in your contracts directory to use the default sui private key.`);let i=k(s);if(i===!1)throw new g("Please check your privateKey.");let d=new ht({secretKey:i}).getKeypair(),a=new wt({url:vt(o)}),u=Number(await ee(n,o)),h=await te(n,o),m=await oe(n,o),_=B(`${n}/Move.lock`,o,"original-published-id","0x0000000000000000000000000000000000000000000000000000000000000000"),y=[],b=await Q(n,o);for(let p in e.schemas)b.forEach(x=>{if(G(p)==Ct(x.name)){let v={schemaName:"",fields:[]},l=[],D=!1;for(let C in e.schemas[p].structure)C in x.structure||(D=!0,l.push({name:C,type:e.schemas[p].structure[C]}),x.structure[C]=e.schemas[p].structure[C]);D&&(v.schemaName=p,v.fields=l,y.push(v))}});y.forEach(p=>{console.log(`
|
|
58
|
+
\u{1F680} Starting Migration for ${p.schemaName}...`),console.log("\u{1F4CB} Migration Fields:",p.fields)}),xt(n,y);try{let p,x,v;try{let{modules:P,dependencies:Fe,digest:Me}=JSON.parse(_t(`sui move build --dump-bytecode-as-base64 --path ${r}/contracts/${t}`,{encoding:"utf-8"}));p=P,x=Fe,v=Me}catch(P){throw new N(P.stdout)}console.log(`
|
|
59
|
+
\u{1F680} Starting Upgrade Process...`),console.log("\u{1F4CB} OldPackageId:",h),console.log("\u{1F4CB} UpgradeCap Object Id:",m),console.log("\u{1F4CB} OldVersion:",u);let l=new yt,D=l.moveCall({target:"0x2::package::authorize_upgrade",arguments:[l.object(m),l.pure.u8(bt.COMPATIBLE),l.pure.vector("u8",v)]}),C=l.upgrade({modules:p,dependencies:x,package:h,ticket:D});l.moveCall({target:"0x2::package::commit_upgrade",arguments:[l.object(m),C]});let Z=await a.signAndExecuteTransaction({signer:d,transaction:l,options:{showObjectChanges:!0}}),L="";Z.objectChanges.map(P=>{P.type==="published"&&(console.log(q.blue(`${t} PackageId: ${P.packageId}`)),console.log(q.blue(`${t} Version: ${u+1}`)),L=P.packageId)}),B(`${n}/Move.lock`,o,"original-published-id",_),B(`${n}/Move.lock`,o,"latest-published-id",L),B(`${n}/Move.lock`,o,"published-version",u+1+""),console.log(q.green(`Upgrade Transaction Digest: ${Z.digest}`)),K(t,o,L,m,u+1,b)}catch(p){console.log(q.red("Upgrade failed!")),console.error(p.message)}}import{loadConfig as kt}from"@0xobelisk/sui-common";var $t={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)"},"config-path":{type:"string",default:"dubhe.config.ts",decs:"Path to the config file"}})},async handler({network:e,"config-path":t}){try{let o=await kt(t);await he(o,o.name,e)}catch(o){A(o),process.exit(1)}process.exit(0)}},ye=$t;import{execSync as St}from"child_process";import Et from"chalk";import{loadConfig as It}from"@0xobelisk/sui-common";var Dt={command:"test",describe:"Run tests in Dubhe contracts",builder(e){return e.options({"config-path":{type:"string",default:"dubhe.config.ts",description:"Options to pass to forge test"},test:{type:"string",desc:"Run a specific test"}})},async handler({"config-path":e,test:t}){try{console.log("\u{1F680} Running move test");let o=await It(e),s=`sui move test --path ${`${process.cwd()}/contracts/${o.name}`} ${t?` --test ${t}`:""}`,i=St(s,{encoding:"utf-8"});console.log(i)}catch(o){console.error(Et.red("Error executing sui move test:")),console.log(o.stdout),process.exit(0)}}},be=Dt;import{execSync as Pt}from"child_process";import At from"chalk";import{loadConfig as Ft}from"@0xobelisk/sui-common";var Mt={command:"build",describe:"Run tests in Dubhe contracts",builder(e){return e.options({"config-path":{type:"string",default:"dubhe.config.ts",description:"Options to pass to forge test"},network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Node network (mainnet/testnet/devnet/localnet)"},"dump-bytecode-as-base64":{type:"boolean",default:!1,desc:"Dump bytecode as base64"}})},async handler({"config-path":e,network:t,"dump-bytecode-as-base64":o}){try{console.log("\u{1F680} Running move build");let r=await Ft(e),s=`${process.cwd()}/contracts/${r.name}`;await F(t),Y(s+"/Move.toml",t);let i=`sui move build --path ${s} ${o?" --dump-bytecode-as-base64":""}`,c=Pt(i,{encoding:"utf-8"});console.log(c)}catch(r){console.error(At.red("Error executing sui move build:")),console.log(r.stdout),process.exit(0)}}},ve=Mt;var Ot={command:"hello",describe:"hello, dubhe",builder(e){return e},async handler(){T()}},we=Ot;import{Dubhe as W}from"@0xobelisk/sui-client";import*as f from"fs";import S from"chalk";async function _e(e=!1,t){t&&(console.log(S.blue("Note: The generated account will be stored in the .env file and the TypeScript file specified by the --output-ts-path option.")),console.log(S.yellow(`Warning: Do not expose the key file. It is intended for local testing only.
|
|
60
|
+
`)));let o=process.cwd(),r;if(e){let c=new W().getKeypair();if(r=c.getSecretKey(),f.writeFileSync(`${o}/.env`,`PRIVATE_KEY=${r}`),console.log(S.green(`File created at: ${o}/.env`)),t){let d=t.substring(0,t.lastIndexOf("/"));f.existsSync(d)||f.mkdirSync(d,{recursive:!0}),f.writeFileSync(t,`export const PRIVATEKEY = '${r}';
|
|
61
61
|
export const ACCOUNT = '${c.toSuiAddress()}';
|
|
62
|
-
`),console.log(
|
|
63
|
-
`))}console.log(
|
|
64
|
-
export const ACCOUNT = '${
|
|
65
|
-
`),console.log(
|
|
66
|
-
`))}console.log(
|
|
62
|
+
`),console.log(S.green(`File created at: ${t}
|
|
63
|
+
`))}console.log(S.blue(`Force generate new Account: ${c.toSuiAddress()}`));return}try{let c=f.readFileSync(`${o}/.env`,"utf8").match(/PRIVATE_KEY=(.+)/);if(c&&c[1]){r=c[1];let a=new W({secretKey:r}).getKeypair();if(t){let u=t.substring(0,t.lastIndexOf("/"));f.existsSync(u)||f.mkdirSync(u,{recursive:!0}),f.writeFileSync(t,`export const PRIVATEKEY = '${r}';
|
|
64
|
+
export const ACCOUNT = '${a.toSuiAddress()}';
|
|
65
|
+
`),console.log(S.green(`File created at: ${t}
|
|
66
|
+
`))}console.log(S.blue(`Using existing Account: ${a.toSuiAddress()}`));return}}catch{}let s=new W().getKeypair();if(r=s.getSecretKey(),f.writeFileSync(`${o}/.env`,`PRIVATE_KEY=${r}`),console.log(S.green(`File created at: ${o}/.env`)),t){let i=t.substring(0,t.lastIndexOf("/"));f.existsSync(i)||f.mkdirSync(i,{recursive:!0}),f.writeFileSync(t,`export const PRIVATEKEY = '${r}';
|
|
67
67
|
export const ACCOUNT = '${s.toSuiAddress()}';
|
|
68
|
-
`),console.log(
|
|
69
|
-
`))}console.log(
|
|
68
|
+
`),console.log(S.green(`File created at: ${t}
|
|
69
|
+
`))}console.log(S.blue(`Generate new Account: ${s.toSuiAddress()}`))}var Kt={command:"generate-key",describe:"Generate a new account key pair and save it to a .env file, with an option to output to a TypeScript file.",builder:{force:{type:"boolean",default:!1,desc:"Force generate a new key pair"},"output-ts-path":{type:"string",desc:"Specify the path to output the TypeScript file containing the key pair (e.g., ./src/config/key.ts)"}},async handler({force:e,"output-ts-path":t}){try{await _e(e,t)}catch(o){console.error("Error generating account:",o),process.exit(1)}process.exit(0)}},xe=Kt;import{Dubhe as Rt}from"@0xobelisk/sui-client";import Ce from"chalk";import Tt from"dotenv";Tt.config();async function ke(e,t=2){try{console.log(Ce.blue("Note: You need at least 2 SUI for transaction fees and staking, and registering a Dapp will reserve 1 SUI for Dubhe Dapp Staking, which can be retrieved upon unregistering."));let o=process.env.PRIVATE_KEY;if(!o)throw new g(`Missing PRIVATE_KEY environment variable.
|
|
70
70
|
Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
|
|
71
|
-
in your contracts directory to use the default sui private key.`);if(
|
|
71
|
+
in your contracts directory to use the default sui private key.`);if(k(o)===!1)throw new g("Please check your privateKey.");let s=await new Rt({secretKey:process.env.PRIVATE_KEY,networkType:e}).getBalance(),i=Number(s.totalBalance)/1e9;if(i<t)throw new g(`Your account balance ${i.toFixed(4)} SUI is less than ${t} SUI. Please get more SUI.`);console.log(Ce.green(`Current account balance: ${i.toFixed(4)} SUI`))}catch(o){throw new g("Failed to check balance: "+o)}}var Nt={command:"check-balance",describe:"Check the balance of the account",builder:{network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Network to check balance on"},amount:{type:"number",default:2,desc:"Amount of SUI to check balance for"}},async handler({network:e,amount:t}){try{await ke(e,t)}catch(o){console.error("Error checking balance:",o),process.exit(1)}process.exit(0)}},$e=Nt;import*as Se from"fs/promises";import{mkdirSync as jt,writeFileSync as Ut}from"fs";import{dirname as Vt}from"path";async function Yt(e,t){try{let o=await Se.readFile(`${e}/.history/sui_${t}/latest.json`,"utf8");return JSON.parse(o)}catch(o){throw new Error(`read .history/sui_${t}/latest.json failed. ${o}`)}}function qt(e,t,o,r){let n=`type NetworkType = 'testnet' | 'mainnet' | 'devnet' | 'localnet';
|
|
72
72
|
|
|
73
73
|
export const NETWORK: NetworkType = '${e}';
|
|
74
74
|
|
|
@@ -76,5 +76,5 @@ export const PACKAGE_ID = '${t}'
|
|
|
76
76
|
|
|
77
77
|
${o.map(s=>`export const ${s.name.split("::")[2]}_Object_Id = '${s.objectId}'`).join(`
|
|
78
78
|
`)}
|
|
79
|
-
`;Bt(n,r,"storeConfig")}async function Bt(e,t,o){
|
|
79
|
+
`;Bt(n,r,"storeConfig")}async function Bt(e,t,o){jt(Vt(t),{recursive:!0}),Ut(t,e),o!==void 0&&console.log(`${o}: ${t}`)}async function Ee(e,t,o){let n=`${process.cwd()}/contracts/${e.name}`,s=await Yt(n,t);qt(s.network,s.packageId,s.schemas,o)}import{loadConfig as Lt}from"@0xobelisk/sui-common";var zt={command:"config-store",describe:"Store configuration for the Dubhe project",builder:{"config-path":{type:"string",default:"dubhe.config.ts",desc:"Path to the config file"},network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Network to store config for"},"output-ts-path":{type:"string",desc:"Specify the output path for the generated TypeScript configuration file (e.g., ./src/config/generated.ts)"}},async handler({"config-path":e,network:t,"output-ts-path":o}){try{let r=await Lt(e);await Ee(r,t,o)}catch(r){console.error("Error storing config:",r),process.exit(1)}process.exit(0)}},Ie=zt;var De=[me,pe,ue,ge,ye,be,ve,we,xe,$e,Ie];import*as Ae from"dotenv";import Pe from"chalk";Ae.config();Ht(Jt(process.argv)).scriptName("dubhe").command(De).strict().fail((e,t)=>{console.error(Pe.red(e)),e.includes("Missing required argument")&&console.log(Pe.yellow(`Run 'pnpm dubhe ${process.argv[2]} --help' for a list of available and required arguments.`)),console.log(""),A(t),console.log(""),process.exit(1)}).alias({h:"help"}).argv;
|
|
80
80
|
//# sourceMappingURL=dubhe.js.map
|
package/dist/dubhe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dubhe.ts","../src/utils/startNode.ts","../src/utils/printDubhe.ts","../src/utils/publishHandler.ts","../src/utils/errors.ts","../src/utils/utils.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/build.ts","../src/commands/hello.ts","../src/utils/generateAccount.ts","../src/commands/generateKey.ts","../src/utils/checkBalance.ts","../src/commands/checkBalance.ts","../src/utils/storeConfig.ts","../src/commands/configStore.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 { execSync, spawn } from 'child_process';\nimport chalk from 'chalk';\nimport { printDubhe } from './printDubhe';\nimport { delay, DubheCliError, publishDubheFramework, validatePrivateKey } from '../utils';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport { getFullnodeUrl, SuiClient } from '@mysten/sui/client';\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\nasync function printAccounts() {\n\t// These private keys are used for testing purposes only, do not use them in production.\n\tconst privateKeys = [\n\t\t\"suiprivkey1qq3ez3dje66l8pypgxynr7yymwps6uhn7vyczespj84974j3zya0wdpu76v\",\n\t\t\"suiprivkey1qp6vcyg8r2x88fllmjmxtpzjl95gd9dugqrgz7xxf50w6rqdqzetg7x4d7s\",\n\t\t\"suiprivkey1qpy3a696eh3m55fwa8h38ss063459u4n2dm9t24w2hlxxzjp2x34q8sdsnc\",\n\t\t\"suiprivkey1qzxwp29favhzrjd95f6uj9nskjwal6nh9g509jpun395y6g72d6jqlmps4c\",\n\t\t\"suiprivkey1qzhq4lv38sesah4uzsqkkmeyjx860xqjdz8qgw36tmrdd5tnle3evxpng57\",\n\t\t\"suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c\",\n\t]\n\tconsole.log(\"šAccounts\")\n\tconsole.log(\"==========\")\n\tprivateKeys.forEach((privateKey, index) => {\n\t\tconst dubhe = new Dubhe({ secretKey: privateKey });\n\t\tconst keypair = dubhe.getKeypair();\n\t\tspawn(\n\t\t\t'curl',\n\t\t\t['--location', '--request', 'POST', 'http://127.0.0.1:9123/gas', '--header', 'Content-Type: application/json', '--data-raw', `{\"FixedAmountRequest\": {\"recipient\": \"${keypair.toSuiAddress()}\"}}`],\n\t\t\t{\n\t\t\t\tenv: { ...process.env },\n\t\t\t\tstdio: 'ignore',\n\t\t\t\tdetached: true,\n\t\t\t}\n\t\t\t)\n\t\tconsole.log(` āā Account #${index}: ${keypair.toSuiAddress()}(1000 SUI)`);\n\t\tconsole.log(` āā Private Key: ${privateKey}`);\n\t});\n\tconsole.log(\"==========\")\n\tconsole.log(chalk.yellow(\"ā ļøWARNING: These accounts, and their private keys, are publicly known.\"));\n\tconsole.log(chalk.yellow(\"Any funds sent to them on Mainnet or any other live network WILL BE LOST.\"));\n}\n\texport async function startLocalNode() {\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\tprintDubhe();\n\tconsole.log('š Starting Local Node...');\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: 'ignore',\n\t\t\t\tdetached: true,\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\t\tawait delay(5000);\n\t\tconsole.log(' āā Faucet: Enabled');\n\t\tconsole.log(' āā Force Regenesis: Yes');\n\t\tconsole.log(' āā HTTP server: http://127.0.0.1:9000/');\n\t\tconsole.log(' āā Faucet server: http://127.0.0.1:9123/');\n\n\t\tawait printAccounts();\n\n\t\tawait delay(2000);\n\n\t\tconst privateKeyFormat = validatePrivateKey(\"suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c\");\n\t\tif (privateKeyFormat === false) {\n\t\t\tthrow new DubheCliError(`Please check your privateKey.`);\n\t\t}\n\n\t\tconst dubhe = new Dubhe({ secretKey: privateKeyFormat });\n\t\tconst client = new SuiClient({ url: getFullnodeUrl('localnet') });\n\t\tconst originalLog = console.log;\n\n\t\tconsole.log = () => {};\n\t\tawait publishDubheFramework(client, dubhe, 'localnet');\n\t\tconsole.log = originalLog;\n\n\t\tprocess.on('SIGINT', () => {\n\t\t\tconsole.log(chalk.yellow('\\nš Stopping Local Node...'));\n\t\t\tif (suiProcess) {\n\t\t\t\tsuiProcess.kill();\n\t\t\t\tconsole.log(chalk.green('ā
Local Node Stopped'));\n\t\t\t}\n\t\t\tprocess.exit();\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 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 { 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,\n\tgetSchemaHub,\n\tupdateDubheDependency,\n\tswitchEnv,\n\tdelay,\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(\n\t\t\t\t`${path}/contracts/dubhe-framework`,\n\t\t\t\tnetwork\n\t\t\t);\n\t\t}\n\t\tcase 'testnet':\n\t\t\treturn '0x8dbf8d28ac027ba214c9e0951b09f6842843be6cb87242b7d9a326a2677cd47a';\n\t\tdefault:\n\t\t\treturn '0x8dbf8d28ac027ba214c9e0951b09f6842843be6cb87242b7d9a326a2677cd47a';\n\t}\n}\n\nfunction removeEnvContent(\n\tfilePath: string,\n\tnetworkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): void {\n\tif (!fs.existsSync(filePath)) {\n\t\treturn;\n\t}\n\tconst content = fs.readFileSync(filePath, 'utf-8');\n\tconst regex = new RegExp(\n\t\t`\\\\[env\\\\.${networkType}\\\\][\\\\s\\\\S]*?(?=\\\\[|$)`,\n\t\t'g'\n\t);\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(\n\tfilePath: string,\n\tnetworkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\toperation: 'publish' | 'upgrade',\n\tchainId: string,\n\tpublishedId: string\n): 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(\n\t\tline => line.trim() === `[env.${networkType}]`\n\t);\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(\n\t\t\t\t`Network type [env.${networkType}] not found in the file and cannot upgrade.`\n\t\t\t);\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\n\t\t\t\t.split('=')\n\t\t\t\t.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 =\n\t\tnetworkSectionIndex === -1\n\t\t\t? envContent + updatedSection\n\t\t\t: envLines.slice(0, networkSectionIndex).join('\\n') +\n\t\t\t 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\tstdio: 'pipe',\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\tgasBudget?: number\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\tif (gasBudget) {\n\t\ttx.setGasBudget(gasBudget);\n\t}\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(\n\t\t`${projectPath}/Move.lock`,\n\t\tnetwork,\n\t\t'publish',\n\t\tchainId,\n\t\tpackageId\n\t);\n\n\tconsole.log('\\nā” Executing Deploy Hook...');\n\tawait delay(5000);\n\n\tconst deployHookTx = new Transaction();\n\tif (gasBudget) {\n\t\tdeployHookTx.setGasBudget(gasBudget);\n\t}\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') &&\n\t\t\t\t!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 (\n\t\t\t\t\t\tcapitalizeAndRemoveUnderscores(schemaKey) ===\n\t\t\t\t\t\tgetLastSegment(object.objectType)\n\t\t\t\t\t) {\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\tconsole.log(chalk.yellow(' Please check the transaction digest:'));\n\t\tconsole.log(chalk.yellow(` ${deployHookResult.digest}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nexport async 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\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 (object.type === 'created' && object.objectType.includes('dapps')) {\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(\n\t\t`${projectPath}/Move.lock`,\n\t\tnetwork,\n\t\t'publish',\n\t\tchainId,\n\t\tpackageId\n\t);\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\tgasBudget?: number\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(\n\t\t\tclient,\n\t\t\tdubhe,\n\t\t\tdubheConfig,\n\t\t\tnetwork,\n\t\t\tprojectPath,\n\t\t\tgasBudget\n\t\t);\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\tname = 'NotInsideProjectError';\n\tmessage = 'You are not inside a Dubhe project';\n}\n\nexport class DubheCliError extends Error {\n\tname = 'DubheCliError';\n}\n\nexport class UpgradeError extends Error {\n\tname = 'UpgradeError';\n}\n\nexport class FsIibError extends Error {\n\tname = 'FsIibError';\n}\n\nexport function logError(error: unknown) {\n\tif (error instanceof ValidationError) {\n\t\tconsole.log(chalk.redBright(error.message));\n\t} else if (error instanceof ZodError) {\n\t\t// TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n\t\tconst validationError = fromZodError(error, {\n\t\t\tprefixSeparator: '\\n- ',\n\t\t\tissueSeparator: '\\n- ',\n\t\t});\n\t\tconsole.log(chalk.redBright(validationError.message));\n\t} else if (error instanceof NotInsideProjectError) {\n\t\tconsole.log(chalk.red(error.message));\n\t\tconsole.log('');\n\t\t// TODO add docs to the website and update the link to the specific page\n\t\tconsole.log(\n\t\t\tchalk.blue(\n\t\t\t\t`To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk`\n\t\t\t)\n\t\t);\n\t} else if (error instanceof DubheCliError) {\n\t\tconsole.log(chalk.red(error));\n\t} else {\n\t\tconsole.log(error);\n\t}\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';\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\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 type { CommandModule } from 'yargs';\nimport { startLocalNode } from '../utils/startNode';\n\nconst commandModule: CommandModule = {\n\tcommand: 'node',\n\n\tdescribe: 'Manage local Sui node',\n\n\tbuilder(yargs) {\n\t\treturn yargs\n\t},\n\n\tasync handler() {\n\t\ttry {\n\t\t\tawait startLocalNode();\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\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\t'config-path'?: string;\n\tnetwork?: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\t'framework-id'?: 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\t'config-path': {\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\t'framework-id': {\n\t\t\ttype: 'string',\n\t\t\tdesc: 'Framework Package ID',\n\t\t},\n\t},\n\n\tasync handler({\n\t\t'config-path': configPath,\n\t\tnetwork,\n\t\t'framework-id': frameworkId,\n\t}) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(configPath)) 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\t'config-path': string;\n\t'contract-name'?: string;\n\t'gas-budget'?: number;\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\t'config-path': {\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\t'contract-name': {\n\t\t\t\ttype: 'string',\n\t\t\t\tdesc: 'Optional contract name in contracts/ directory',\n\t\t\t},\n\t\t\t'gas-budget': {\n\t\t\t\ttype: 'number',\n\t\t\t\tdesc: 'Optional gas budget for the transaction',\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t});\n\t},\n\n\tasync handler({\n\t\tnetwork,\n\t\t'config-path': configPath,\n\t\t'contract-name': contractName,\n\t\t'gas-budget': gasBudget,\n\t}) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\t\t\tawait publishHandler(dubheConfig, network, contractName, gasBudget);\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\tnetwork: any;\n\t'config-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'upgrade',\n\n\tdescribe: 'Upgrade your move contracts',\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: 'Network of the node (mainnet/testnet/devnet/localnet)',\n\t\t\t},\n\t\t\t'config-path': {\n\t\t\t\ttype: 'string',\n\t\t\t\tdefault: 'dubhe.config.ts',\n\t\t\t\tdecs: 'Path to the config file',\n\t\t\t},\n\t\t});\n\t},\n\n\tasync handler({ network, 'config-path': configPath }) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\t\t\tawait upgradeHandler(dubheConfig, dubheConfig.name, network);\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 type { CommandModule } from \"yargs\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n 'config-path': string;\n 'test'?: 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 'config-path': {\n type: \"string\",\n default: \"dubhe.config.ts\",\n description: \"Options to pass to forge test\",\n },\n test: {\n type: 'string',\n desc: 'Run a specific test',\n },\n });\n },\n\n async handler({ 'config-path': configPath, test }) {\n // Start an internal anvil process if no world address is provided\n try {\n console.log('š Running move test');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n const command = `sui move test --path ${projectPath} ${test ? ` --test ${test}` : ''}`;\n const output = execSync(command, { encoding: \"utf-8\" });\n console.log(output);\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 { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\nimport { switchEnv, updateDubheDependency } from '../utils';\n\ntype Options = {\n 'config-path': string;\n network: any;\n 'dump-bytecode-as-base64'?: boolean;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"build\",\n describe: \"Run tests in Dubhe contracts\",\n builder(yargs) {\n return yargs.options({\n 'config-path': {\n type: \"string\",\n default: \"dubhe.config.ts\",\n description: \"Options to pass to forge test\",\n },\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n desc: 'Node network (mainnet/testnet/devnet/localnet)',\n },\n 'dump-bytecode-as-base64': {\n type: 'boolean',\n default: false,\n desc: 'Dump bytecode as base64',\n },\n });\n },\n\n async handler({ 'config-path': configPath, network, 'dump-bytecode-as-base64': dumpBytecodeAsBase64 }) {\n // Start an internal anvil process if no world address is provided\n try {\n console.log('š Running move build');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n await switchEnv(network);\n updateDubheDependency(projectPath+'/Move.toml', network);\n const command = `sui move build --path ${projectPath} ${dumpBytecodeAsBase64 ? ` --dump-bytecode-as-base64` : ''}`;\n const output = execSync(command, { encoding: \"utf-8\" });\n console.log(output);\n } catch (error: any) {\n console.error(chalk.red(\"Error executing sui move build:\"));\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 { Dubhe } from '@0xobelisk/sui-client';\nimport * as fs from 'fs';\nimport chalk from 'chalk';\n\nexport async function generateAccountHandler(\n\tforce: boolean = false,\n\toutputTsPath?: string\n) {\n\tif (outputTsPath) {\n\t\tconsole.log(\n\t\t\tchalk.blue(\n\t\t\t\t'Note: The generated account will be stored in the .env file and the TypeScript file specified by the --output-ts-path option.'\n\t\t\t)\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t'Warning: Do not expose the key file. It is intended for local testing only.\\n'\n\t\t\t)\n\t\t);\n\t}\n\tconst path = process.cwd();\n\tlet privateKey: string;\n\n\tif (force) {\n\t\tconst dubhe = new Dubhe();\n\t\tconst keypair = dubhe.getKeypair();\n\t\tprivateKey = keypair.getSecretKey();\n\n\t\tfs.writeFileSync(`${path}/.env`, `PRIVATE_KEY=${privateKey}`);\n\t\tconsole.log(chalk.green(`File created at: ${path}/.env`));\n\n\t\tif (outputTsPath) {\n\t\t\tconst dir = outputTsPath.substring(\n\t\t\t\t0,\n\t\t\t\toutputTsPath.lastIndexOf('/')\n\t\t\t);\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t\tfs.writeFileSync(\n\t\t\t\toutputTsPath,\n\t\t\t\t`export const PRIVATEKEY = '${privateKey}';\nexport const ACCOUNT = '${keypair.toSuiAddress()}';\n`\n\t\t\t);\n\t\t\tconsole.log(chalk.green(`File created at: ${outputTsPath}\\n`));\n\t\t}\n\n\t\tconsole.log(\n\t\t\tchalk.blue(`Force generate new Account: ${keypair.toSuiAddress()}`)\n\t\t);\n\t\treturn;\n\t}\n\n\t// Check if .env file exists and has content\n\ttry {\n\t\tconst envContent = fs.readFileSync(`${path}/.env`, 'utf8');\n\t\tconst match = envContent.match(/PRIVATE_KEY=(.+)/);\n\t\tif (match && match[1]) {\n\t\t\tprivateKey = match[1];\n\t\t\tconst dubhe = new Dubhe({ secretKey: privateKey });\n\t\t\tconst keypair = dubhe.getKeypair();\n\n\t\t\tif (outputTsPath) {\n\t\t\t\tconst dir = outputTsPath.substring(\n\t\t\t\t\t0,\n\t\t\t\t\toutputTsPath.lastIndexOf('/')\n\t\t\t\t);\n\t\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t\t}\n\t\t\t\tfs.writeFileSync(\n\t\t\t\t\toutputTsPath,\n\t\t\t\t\t`export const PRIVATEKEY = '${privateKey}';\nexport const ACCOUNT = '${keypair.toSuiAddress()}';\n`\n\t\t\t\t);\n\t\t\t\tconsole.log(chalk.green(`File created at: ${outputTsPath}\\n`));\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\tchalk.blue(`Using existing Account: ${keypair.toSuiAddress()}`)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t} catch (error) {\n\t\t// .env file doesn't exist or failed to read, continue to generate new account\n\t}\n\n\t// If no existing private key, generate new account\n\tconst dubhe = new Dubhe();\n\tconst keypair = dubhe.getKeypair();\n\tprivateKey = keypair.getSecretKey();\n\tfs.writeFileSync(`${path}/.env`, `PRIVATE_KEY=${privateKey}`);\n\tconsole.log(chalk.green(`File created at: ${path}/.env`));\n\n\tif (outputTsPath) {\n\t\tconst dir = outputTsPath.substring(0, outputTsPath.lastIndexOf('/'));\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.writeFileSync(\n\t\t\toutputTsPath,\n\t\t\t`export const PRIVATEKEY = '${privateKey}';\nexport const ACCOUNT = '${keypair.toSuiAddress()}';\n`\n\t\t);\n\t\tconsole.log(chalk.green(`File created at: ${outputTsPath}\\n`));\n\t}\n\n\tconsole.log(chalk.blue(`Generate new Account: ${keypair.toSuiAddress()}`));\n}\n","import type { CommandModule } from 'yargs';\nimport { generateAccountHandler } from '../utils/generateAccount';\n\ntype Options = {\n\tforce?: boolean;\n\t'output-ts-path'?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'generate-key',\n\tdescribe:\n\t\t'Generate a new account key pair and save it to a .env file, with an option to output to a TypeScript file.',\n\tbuilder: {\n\t\tforce: {\n\t\t\ttype: 'boolean',\n\t\t\tdefault: false,\n\t\t\tdesc: 'Force generate a new key pair',\n\t\t},\n\t\t'output-ts-path': {\n\t\t\ttype: 'string',\n\t\t\tdesc: 'Specify the path to output the TypeScript file containing the key pair (e.g., ./src/config/key.ts)',\n\t\t},\n\t},\n\tasync handler({ force, 'output-ts-path': outputTsPath }) {\n\t\ttry {\n\t\t\tawait generateAccountHandler(force, outputTsPath);\n\t\t} catch (error) {\n\t\t\tconsole.error('Error generating account:', 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, NetworkType } from '@0xobelisk/sui-client';\nimport chalk from 'chalk';\nimport dotenv from 'dotenv';\nimport { validatePrivateKey } from './utils';\nimport { DubheCliError } from './errors';\ndotenv.config();\n\nexport async function checkBalanceHandler(\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tamount: number = 2\n) {\n\ttry {\n\t\tconsole.log(\n\t\t\tchalk.blue(\n\t\t\t\t`Note: You need at least 2 SUI for transaction fees and staking, and registering a Dapp will reserve 1 SUI for Dubhe Dapp Staking, which can be retrieved upon unregistering.`\n\t\t\t)\n\t\t);\n\n\t\tconst privateKey = process.env.PRIVATE_KEY;\n\t\tif (!privateKey) {\n\t\t\tthrow new DubheCliError(\n\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);\n\t\t}\n\t\tconst privateKeyFormat = validatePrivateKey(privateKey);\n\t\tif (privateKeyFormat === false) {\n\t\t\tthrow new DubheCliError(`Please check your privateKey.`);\n\t\t}\n\n\t\tconst dubhe = new Dubhe({\n\t\t\tsecretKey: process.env.PRIVATE_KEY,\n\t\t\tnetworkType: network as NetworkType,\n\t\t});\n\n\t\tconst balance = await dubhe.getBalance();\n\t\tconst balanceInSUI = Number(balance.totalBalance) / 1_000_000_000;\n\n\t\tif (balanceInSUI < amount) {\n\t\t\t// console.log(chalk.yellow(`Account balance is less than 2 SUI.`));\n\t\t\tthrow new DubheCliError(\n\t\t\t\t`Your account balance ${balanceInSUI.toFixed(\n\t\t\t\t\t4\n\t\t\t\t)} SUI is less than ${amount} SUI. Please get more SUI.`\n\t\t\t);\n\t\t}\n\n\t\tconsole.log(\n\t\t\tchalk.green(\n\t\t\t\t`Current account balance: ${balanceInSUI.toFixed(4)} SUI`\n\t\t\t)\n\t\t);\n\t} catch (error) {\n\t\tthrow new DubheCliError('Failed to check balance: ' + error);\n\t}\n}\n","import type { CommandModule } from 'yargs';\nimport { checkBalanceHandler } from '../utils/checkBalance';\n\ntype Options = {\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\tamount: number;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'check-balance',\n\tdescribe: 'Check the balance of the account',\n\tbuilder: {\n\t\tnetwork: {\n\t\t\ttype: 'string',\n\t\t\tchoices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n\t\t\tdesc: 'Network to check balance on',\n\t\t},\n\t\tamount: {\n\t\t\ttype: 'number',\n\t\t\tdefault: 2,\n\t\t\tdesc: 'Amount of SUI to check balance for',\n\t\t},\n\t},\n\tasync handler({ network, amount }) {\n\t\ttry {\n\t\t\tawait checkBalanceHandler(network, amount);\n\t\t} catch (error) {\n\t\t\tconsole.error('Error checking balance:', error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprocess.exit(0);\n\t},\n};\n\nexport default commandModule;\n","import * as fsAsync from 'fs/promises';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { exit } from 'process';\nimport { dirname } from 'path';\nimport { DeploymentJsonType, schema } from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\n\nasync function getDeploymentJson(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<DeploymentJsonType> {\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 (error) {\n\t\tthrow new Error(\n\t\t\t`read .history/sui_${network}/latest.json failed. ${error}`\n\t\t);\n\t}\n}\n\nfunction storeConfig(\n\tnetwork: string,\n\tpackageId: string,\n\tschemas: schema[],\n\toutputPath: string\n) {\n\tlet code = `type NetworkType = 'testnet' | 'mainnet' | 'devnet' | 'localnet';\n\nexport const NETWORK: NetworkType = '${network}';\n\nexport const PACKAGE_ID = '${packageId}'\n\n${schemas\n\t.map(\n\t\tschema =>\n\t\t\t`export const ${schema.name.split('::')[2]}_Object_Id = '${\n\t\t\t\tschema.objectId\n\t\t\t}'`\n\t)\n\t.join('\\n')}\n`;\n\t// if (outputPath) {\n\twriteOutput(code, outputPath, 'storeConfig');\n\t// writeOutput(code, `${path}/src/chain/config.ts`, 'storeConfig');\n\t// }\n}\n\nasync 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\nexport async function storeConfigHandler(\n\tdubheConfig: DubheConfig,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\toutputPath: string\n) {\n\tconst path = process.cwd();\n\tconst contractPath = `${path}/contracts/${dubheConfig.name}`;\n\tconst deployment = await getDeploymentJson(contractPath, network);\n\tstoreConfig(\n\t\tdeployment.network,\n\t\tdeployment.packageId,\n\t\tdeployment.schemas,\n\t\toutputPath\n\t);\n}\n","import type { CommandModule } from 'yargs';\nimport { storeConfigHandler } from '../utils/storeConfig';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n\t'config-path': string;\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\t'output-ts-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'config-store',\n\n\tdescribe: 'Store configuration for the Dubhe project',\n\n\tbuilder: {\n\t\t'config-path': {\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'],\n\t\t\tdesc: 'Network to store config for',\n\t\t},\n\t\t'output-ts-path': {\n\t\t\ttype: 'string',\n\t\t\tdesc: 'Specify the output path for the generated TypeScript configuration file (e.g., ./src/config/generated.ts)',\n\t\t},\n\t},\n\tasync handler({\n\t\t'config-path': configPath,\n\t\tnetwork,\n\t\t'output-ts-path': outputTsPath,\n\t}) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\t\t\tawait storeConfigHandler(dubheConfig, network, outputTsPath);\n\t\t} catch (error) {\n\t\t\tconsole.error('Error storing config:', error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprocess.exit(0);\n\t},\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 build from './build';\nimport hello from './hello';\nimport generateKey from './generateKey';\nimport checkBalance from './checkBalance';\nimport configStore from './configStore';\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\tbuild,\n\thello,\n\tgenerateKey,\n\tcheckBalance,\n\tconfigStore,\n];\n"],"mappings":"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","names":["yargs","hideBin","execSync","spawn","chalk","chalk","printDubhe","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","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","gasBudget","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","Dubhe","getFullnodeUrl","SuiClient","isSuiStartRunning","cmd","result","execSync","printAccounts","privateKeys","privateKey","index","keypair","spawn","chalk","startLocalNode","printDubhe","suiProcess","error","delay","privateKeyFormat","validatePrivateKey","DubheCliError","dubhe","client","originalLog","publishDubheFramework","commandModule","yargs","startLocalNode","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","gasBudget","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","loadConfig","commandModule","yargs","configPath","test","dubheConfig","command","output","error","test_default","execSync","chalk","loadConfig","commandModule","yargs","configPath","network","dumpBytecodeAsBase64","dubheConfig","loadConfig","projectPath","switchEnv","updateDubheDependency","command","output","execSync","error","chalk","build_default","commandModule","yargs","printDubhe","hello_default","Dubhe","fs","chalk","generateAccountHandler","force","outputTsPath","path","privateKey","keypair","dir","match","commandModule","force","outputTsPath","generateAccountHandler","error","generateKey_default","Dubhe","chalk","dotenv","dotenv","checkBalanceHandler","network","amount","chalk","privateKey","DubheCliError","validatePrivateKey","balance","Dubhe","balanceInSUI","error","commandModule","network","amount","checkBalanceHandler","error","checkBalance_default","fsAsync","mkdirSync","writeFileSync","dirname","getDeploymentJson","projectPath","network","data","error","storeConfig","packageId","schemas","outputPath","code","schema","writeOutput","output","fullOutputPath","logPrefix","storeConfigHandler","dubheConfig","contractPath","deployment","loadConfig","commandModule","configPath","network","outputTsPath","dubheConfig","storeConfigHandler","error","configStore_default","commands","publish_default","localnode_default","faucet_default","schemagen_default","upgrade_default","test_default","build_default","hello_default","generateKey_default","checkBalance_default","configStore_default","dotenv","chalk","yargs","hideBin","commands","msg","err","logError"]}
|
|
1
|
+
{"version":3,"sources":["../src/dubhe.ts","../src/utils/startNode.ts","../src/utils/printDubhe.ts","../src/utils/publishHandler.ts","../src/utils/errors.ts","../src/utils/utils.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/build.ts","../src/commands/hello.ts","../src/utils/generateAccount.ts","../src/commands/generateKey.ts","../src/utils/checkBalance.ts","../src/commands/checkBalance.ts","../src/utils/storeConfig.ts","../src/commands/configStore.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 { execSync, spawn } from 'child_process';\nimport chalk from 'chalk';\nimport { printDubhe } from './printDubhe';\nimport { delay, DubheCliError, publishDubheFramework, validatePrivateKey } from '../utils';\nimport { Dubhe } from '@0xobelisk/sui-client';\nimport { getFullnodeUrl, SuiClient } from '@mysten/sui/client';\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\nasync function printAccounts() {\n\t// These private keys are used for testing purposes only, do not use them in production.\n\tconst privateKeys = [\n\t\t\"suiprivkey1qq3ez3dje66l8pypgxynr7yymwps6uhn7vyczespj84974j3zya0wdpu76v\",\n\t\t\"suiprivkey1qp6vcyg8r2x88fllmjmxtpzjl95gd9dugqrgz7xxf50w6rqdqzetg7x4d7s\",\n\t\t\"suiprivkey1qpy3a696eh3m55fwa8h38ss063459u4n2dm9t24w2hlxxzjp2x34q8sdsnc\",\n\t\t\"suiprivkey1qzxwp29favhzrjd95f6uj9nskjwal6nh9g509jpun395y6g72d6jqlmps4c\",\n\t\t\"suiprivkey1qzhq4lv38sesah4uzsqkkmeyjx860xqjdz8qgw36tmrdd5tnle3evxpng57\",\n\t\t\"suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c\",\n\t]\n\tconsole.log(\"šAccounts\")\n\tconsole.log(\"==========\")\n\tprivateKeys.forEach((privateKey, index) => {\n\t\tconst dubhe = new Dubhe({ secretKey: privateKey });\n\t\tconst keypair = dubhe.getKeypair();\n\t\tspawn(\n\t\t\t'curl',\n\t\t\t['--location', '--request', 'POST', 'http://127.0.0.1:9123/gas', '--header', 'Content-Type: application/json', '--data-raw', `{\"FixedAmountRequest\": {\"recipient\": \"${keypair.toSuiAddress()}\"}}`],\n\t\t\t{\n\t\t\t\tenv: { ...process.env },\n\t\t\t\tstdio: 'ignore',\n\t\t\t\tdetached: true,\n\t\t\t}\n\t\t\t)\n\t\tconsole.log(` āā Account #${index}: ${keypair.toSuiAddress()}(1000 SUI)`);\n\t\tconsole.log(` āā Private Key: ${privateKey}`);\n\t});\n\tconsole.log(\"==========\")\n\tconsole.log(chalk.yellow(\"ā ļøWARNING: These accounts, and their private keys, are publicly known.\"));\n\tconsole.log(chalk.yellow(\"Any funds sent to them on Mainnet or any other live network WILL BE LOST.\"));\n}\n\texport async function startLocalNode() {\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\tprintDubhe();\n\tconsole.log('š Starting Local Node...');\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: 'ignore',\n\t\t\t\tdetached: true,\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\t\tawait delay(5000);\n\t\tconsole.log(' āā Faucet: Enabled');\n\t\tconsole.log(' āā Force Regenesis: Yes');\n\t\tconsole.log(' āā HTTP server: http://127.0.0.1:9000/');\n\t\tconsole.log(' āā Faucet server: http://127.0.0.1:9123/');\n\n\t\tawait printAccounts();\n\n\t\tawait delay(2000);\n\n\t\tconst privateKeyFormat = validatePrivateKey(\"suiprivkey1qzez45sjjsepjgtksqvpq6jw7dzw3zq0dx7a4sulfypd73acaynw5jl9x2c\");\n\t\tif (privateKeyFormat === false) {\n\t\t\tthrow new DubheCliError(`Please check your privateKey.`);\n\t\t}\n\n\t\tconst dubhe = new Dubhe({ secretKey: privateKeyFormat });\n\t\tconst client = new SuiClient({ url: getFullnodeUrl('localnet') });\n\t\tconst originalLog = console.log;\n\n\t\tconsole.log = () => {};\n\t\tawait publishDubheFramework(client, dubhe, 'localnet');\n\t\tconsole.log = originalLog;\n\n\t\tprocess.on('SIGINT', () => {\n\t\t\tconsole.log(chalk.yellow('\\nš Stopping Local Node...'));\n\t\t\tif (suiProcess) {\n\t\t\t\tsuiProcess.kill();\n\t\t\t\tconsole.log(chalk.green('ā
Local Node Stopped'));\n\t\t\t}\n\t\t\tprocess.exit();\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 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 { 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,\n\tupdateDubheDependency,\n\tswitchEnv,\n\tdelay,\n} from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nfunction removeEnvContent(\n\tfilePath: string,\n\tnetworkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): void {\n\tif (!fs.existsSync(filePath)) {\n\t\treturn;\n\t}\n\tconst content = fs.readFileSync(filePath, 'utf-8');\n\tconst regex = new RegExp(\n\t\t`\\\\[env\\\\.${networkType}\\\\][\\\\s\\\\S]*?(?=\\\\[|$)`,\n\t\t'g'\n\t);\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\nfunction updateEnvFile(\n\tfilePath: string,\n\tnetworkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\toperation: 'publish' | 'upgrade',\n\tchainId: string,\n\tpublishedId: string\n): 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(\n\t\tline => line.trim() === `[env.${networkType}]`\n\t);\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(\n\t\t\t\t`Network type [env.${networkType}] not found in the file and cannot upgrade.`\n\t\t\t);\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\n\t\t\t\t.split('=')\n\t\t\t\t.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 =\n\t\tnetworkSectionIndex === -1\n\t\t\t? envContent + updatedSection\n\t\t\t: envLines.slice(0, networkSectionIndex).join('\\n') +\n\t\t\t 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\tstdio: 'pipe',\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\tgasBudget?: number\n) {\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\tif (gasBudget) {\n\t\ttx.setGasBudget(gasBudget);\n\t}\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\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});\n\n\tconsole.log(` āā Transaction: ${result.digest}`);\n\n\tupdateEnvFile(\n\t\t`${projectPath}/Move.lock`,\n\t\tnetwork,\n\t\t'publish',\n\t\tchainId,\n\t\tpackageId\n\t);\n\n\tconsole.log('\\nā” Executing Deploy Hook...');\n\tawait delay(5000);\n\n\tconst deployHookTx = new Transaction();\n\tdeployHookTx.moveCall({\n\t\ttarget: `${packageId}::deploy_hook::run`,\n\t\targuments: [ deployHookTx.object('0x6') ],\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') &&\n\t\t\t\t!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 (\n\t\t\t\t\t\tcapitalizeAndRemoveUnderscores(schemaKey) ===\n\t\t\t\t\t\tgetLastSegment(object.objectType)\n\t\t\t\t\t) {\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\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\tconsole.log(chalk.yellow(' Please check the transaction digest:'));\n\t\tconsole.log(chalk.yellow(` ${deployHookResult.digest}`));\n\t\tprocess.exit(1);\n\t}\n}\n\nexport async 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\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\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});\n\n\tconsole.log(` āā Transaction: ${result.digest}`);\n\n\tupdateEnvFile(\n\t\t`${projectPath}/Move.lock`,\n\t\tnetwork,\n\t\t'publish',\n\t\tchainId,\n\t\tpackageId\n\t);\n\n\tsaveContractData(\n\t\t'dubhe-framework',\n\t\tnetwork,\n\t\tpackageId,\n\t\tupgradeCapId,\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\tgasBudget?: number\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(\n\t\t\tclient,\n\t\t\tdubhe,\n\t\t\tdubheConfig,\n\t\t\tnetwork,\n\t\t\tprojectPath,\n\t\t\tgasBudget\n\t\t);\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\tname = 'NotInsideProjectError';\n\tmessage = 'You are not inside a Dubhe project';\n}\n\nexport class DubheCliError extends Error {\n\tname = 'DubheCliError';\n}\n\nexport class UpgradeError extends Error {\n\tname = 'UpgradeError';\n}\n\nexport class FsIibError extends Error {\n\tname = 'FsIibError';\n}\n\nexport function logError(error: unknown) {\n\tif (error instanceof ValidationError) {\n\t\tconsole.log(chalk.redBright(error.message));\n\t} else if (error instanceof ZodError) {\n\t\t// TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n\t\tconst validationError = fromZodError(error, {\n\t\t\tprefixSeparator: '\\n- ',\n\t\t\tissueSeparator: '\\n- ',\n\t\t});\n\t\tconsole.log(chalk.redBright(validationError.message));\n\t} else if (error instanceof NotInsideProjectError) {\n\t\tconsole.log(chalk.red(error.message));\n\t\tconsole.log('');\n\t\t// TODO add docs to the website and update the link to the specific page\n\t\tconsole.log(\n\t\t\tchalk.blue(\n\t\t\t\t`To learn more about Dubhe's configuration, please go to https://github.com/0xobelisk`\n\t\t\t)\n\t\t);\n\t} else if (error instanceof DubheCliError) {\n\t\tconsole.log(chalk.red(error));\n\t} else {\n\t\tconsole.log(error);\n\t}\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';\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\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 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\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\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\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 type { CommandModule } from 'yargs';\nimport { startLocalNode } from '../utils/startNode';\n\nconst commandModule: CommandModule = {\n\tcommand: 'node',\n\n\tdescribe: 'Manage local Sui node',\n\n\tbuilder(yargs) {\n\t\treturn yargs\n\t},\n\n\tasync handler() {\n\t\ttry {\n\t\t\tawait startLocalNode();\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\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\t'config-path'?: string;\n\tnetwork?: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\t'framework-id'?: 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\t'config-path': {\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\t'framework-id': {\n\t\t\ttype: 'string',\n\t\t\tdesc: 'Framework Package ID',\n\t\t},\n\t},\n\n\tasync handler({\n\t\t'config-path': configPath,\n\t\tnetwork,\n\t\t'framework-id': frameworkId,\n\t}) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(configPath)) 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\t'config-path': string;\n\t'contract-name'?: string;\n\t'gas-budget'?: number;\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\t'config-path': {\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\t'contract-name': {\n\t\t\t\ttype: 'string',\n\t\t\t\tdesc: 'Optional contract name in contracts/ directory',\n\t\t\t},\n\t\t\t'gas-budget': {\n\t\t\t\ttype: 'number',\n\t\t\t\tdesc: 'Optional gas budget for the transaction',\n\t\t\t\toptional: true,\n\t\t\t},\n\t\t});\n\t},\n\n\tasync handler({\n\t\tnetwork,\n\t\t'config-path': configPath,\n\t\t'contract-name': contractName,\n\t\t'gas-budget': gasBudget,\n\t}) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\t\t\tawait publishHandler(dubheConfig, network, contractName, gasBudget);\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, 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_migration::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 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\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\tnetwork: any;\n\t'config-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'upgrade',\n\n\tdescribe: 'Upgrade your move contracts',\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: 'Network of the node (mainnet/testnet/devnet/localnet)',\n\t\t\t},\n\t\t\t'config-path': {\n\t\t\t\ttype: 'string',\n\t\t\t\tdefault: 'dubhe.config.ts',\n\t\t\t\tdecs: 'Path to the config file',\n\t\t\t},\n\t\t});\n\t},\n\n\tasync handler({ network, 'config-path': configPath }) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\t\t\tawait upgradeHandler(dubheConfig, dubheConfig.name, network);\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 type { CommandModule } from \"yargs\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n 'config-path': string;\n 'test'?: 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 'config-path': {\n type: \"string\",\n default: \"dubhe.config.ts\",\n description: \"Options to pass to forge test\",\n },\n test: {\n type: 'string',\n desc: 'Run a specific test',\n },\n });\n },\n\n async handler({ 'config-path': configPath, test }) {\n // Start an internal anvil process if no world address is provided\n try {\n console.log('š Running move test');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n const command = `sui move test --path ${projectPath} ${test ? ` --test ${test}` : ''}`;\n const output = execSync(command, { encoding: \"utf-8\" });\n console.log(output);\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 { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport { DubheConfig, loadConfig } from '@0xobelisk/sui-common';\nimport { switchEnv, updateDubheDependency } from '../utils';\n\ntype Options = {\n 'config-path': string;\n network: any;\n 'dump-bytecode-as-base64'?: boolean;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"build\",\n describe: \"Run tests in Dubhe contracts\",\n builder(yargs) {\n return yargs.options({\n 'config-path': {\n type: \"string\",\n default: \"dubhe.config.ts\",\n description: \"Options to pass to forge test\",\n },\n network: {\n type: 'string',\n choices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n desc: 'Node network (mainnet/testnet/devnet/localnet)',\n },\n 'dump-bytecode-as-base64': {\n type: 'boolean',\n default: false,\n desc: 'Dump bytecode as base64',\n },\n });\n },\n\n async handler({ 'config-path': configPath, network, 'dump-bytecode-as-base64': dumpBytecodeAsBase64 }) {\n // Start an internal anvil process if no world address is provided\n try {\n console.log('š Running move build');\n const dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n const path = process.cwd();\n const projectPath = `${path}/contracts/${dubheConfig.name}`;\n await switchEnv(network);\n updateDubheDependency(projectPath+'/Move.toml', network);\n const command = `sui move build --path ${projectPath} ${dumpBytecodeAsBase64 ? ` --dump-bytecode-as-base64` : ''}`;\n const output = execSync(command, { encoding: \"utf-8\" });\n console.log(output);\n } catch (error: any) {\n console.error(chalk.red(\"Error executing sui move build:\"));\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 { Dubhe } from '@0xobelisk/sui-client';\nimport * as fs from 'fs';\nimport chalk from 'chalk';\n\nexport async function generateAccountHandler(\n\tforce: boolean = false,\n\toutputTsPath?: string\n) {\n\tif (outputTsPath) {\n\t\tconsole.log(\n\t\t\tchalk.blue(\n\t\t\t\t'Note: The generated account will be stored in the .env file and the TypeScript file specified by the --output-ts-path option.'\n\t\t\t)\n\t\t);\n\t\tconsole.log(\n\t\t\tchalk.yellow(\n\t\t\t\t'Warning: Do not expose the key file. It is intended for local testing only.\\n'\n\t\t\t)\n\t\t);\n\t}\n\tconst path = process.cwd();\n\tlet privateKey: string;\n\n\tif (force) {\n\t\tconst dubhe = new Dubhe();\n\t\tconst keypair = dubhe.getKeypair();\n\t\tprivateKey = keypair.getSecretKey();\n\n\t\tfs.writeFileSync(`${path}/.env`, `PRIVATE_KEY=${privateKey}`);\n\t\tconsole.log(chalk.green(`File created at: ${path}/.env`));\n\n\t\tif (outputTsPath) {\n\t\t\tconst dir = outputTsPath.substring(\n\t\t\t\t0,\n\t\t\t\toutputTsPath.lastIndexOf('/')\n\t\t\t);\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t\tfs.writeFileSync(\n\t\t\t\toutputTsPath,\n\t\t\t\t`export const PRIVATEKEY = '${privateKey}';\nexport const ACCOUNT = '${keypair.toSuiAddress()}';\n`\n\t\t\t);\n\t\t\tconsole.log(chalk.green(`File created at: ${outputTsPath}\\n`));\n\t\t}\n\n\t\tconsole.log(\n\t\t\tchalk.blue(`Force generate new Account: ${keypair.toSuiAddress()}`)\n\t\t);\n\t\treturn;\n\t}\n\n\t// Check if .env file exists and has content\n\ttry {\n\t\tconst envContent = fs.readFileSync(`${path}/.env`, 'utf8');\n\t\tconst match = envContent.match(/PRIVATE_KEY=(.+)/);\n\t\tif (match && match[1]) {\n\t\t\tprivateKey = match[1];\n\t\t\tconst dubhe = new Dubhe({ secretKey: privateKey });\n\t\t\tconst keypair = dubhe.getKeypair();\n\n\t\t\tif (outputTsPath) {\n\t\t\t\tconst dir = outputTsPath.substring(\n\t\t\t\t\t0,\n\t\t\t\t\toutputTsPath.lastIndexOf('/')\n\t\t\t\t);\n\t\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t\t}\n\t\t\t\tfs.writeFileSync(\n\t\t\t\t\toutputTsPath,\n\t\t\t\t\t`export const PRIVATEKEY = '${privateKey}';\nexport const ACCOUNT = '${keypair.toSuiAddress()}';\n`\n\t\t\t\t);\n\t\t\t\tconsole.log(chalk.green(`File created at: ${outputTsPath}\\n`));\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\tchalk.blue(`Using existing Account: ${keypair.toSuiAddress()}`)\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t} catch (error) {\n\t\t// .env file doesn't exist or failed to read, continue to generate new account\n\t}\n\n\t// If no existing private key, generate new account\n\tconst dubhe = new Dubhe();\n\tconst keypair = dubhe.getKeypair();\n\tprivateKey = keypair.getSecretKey();\n\tfs.writeFileSync(`${path}/.env`, `PRIVATE_KEY=${privateKey}`);\n\tconsole.log(chalk.green(`File created at: ${path}/.env`));\n\n\tif (outputTsPath) {\n\t\tconst dir = outputTsPath.substring(0, outputTsPath.lastIndexOf('/'));\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.writeFileSync(\n\t\t\toutputTsPath,\n\t\t\t`export const PRIVATEKEY = '${privateKey}';\nexport const ACCOUNT = '${keypair.toSuiAddress()}';\n`\n\t\t);\n\t\tconsole.log(chalk.green(`File created at: ${outputTsPath}\\n`));\n\t}\n\n\tconsole.log(chalk.blue(`Generate new Account: ${keypair.toSuiAddress()}`));\n}\n","import type { CommandModule } from 'yargs';\nimport { generateAccountHandler } from '../utils/generateAccount';\n\ntype Options = {\n\tforce?: boolean;\n\t'output-ts-path'?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'generate-key',\n\tdescribe:\n\t\t'Generate a new account key pair and save it to a .env file, with an option to output to a TypeScript file.',\n\tbuilder: {\n\t\tforce: {\n\t\t\ttype: 'boolean',\n\t\t\tdefault: false,\n\t\t\tdesc: 'Force generate a new key pair',\n\t\t},\n\t\t'output-ts-path': {\n\t\t\ttype: 'string',\n\t\t\tdesc: 'Specify the path to output the TypeScript file containing the key pair (e.g., ./src/config/key.ts)',\n\t\t},\n\t},\n\tasync handler({ force, 'output-ts-path': outputTsPath }) {\n\t\ttry {\n\t\t\tawait generateAccountHandler(force, outputTsPath);\n\t\t} catch (error) {\n\t\t\tconsole.error('Error generating account:', 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, NetworkType } from '@0xobelisk/sui-client';\nimport chalk from 'chalk';\nimport dotenv from 'dotenv';\nimport { validatePrivateKey } from './utils';\nimport { DubheCliError } from './errors';\ndotenv.config();\n\nexport async function checkBalanceHandler(\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tamount: number = 2\n) {\n\ttry {\n\t\tconsole.log(\n\t\t\tchalk.blue(\n\t\t\t\t`Note: You need at least 2 SUI for transaction fees and staking, and registering a Dapp will reserve 1 SUI for Dubhe Dapp Staking, which can be retrieved upon unregistering.`\n\t\t\t)\n\t\t);\n\n\t\tconst privateKey = process.env.PRIVATE_KEY;\n\t\tif (!privateKey) {\n\t\t\tthrow new DubheCliError(\n\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);\n\t\t}\n\t\tconst privateKeyFormat = validatePrivateKey(privateKey);\n\t\tif (privateKeyFormat === false) {\n\t\t\tthrow new DubheCliError(`Please check your privateKey.`);\n\t\t}\n\n\t\tconst dubhe = new Dubhe({\n\t\t\tsecretKey: process.env.PRIVATE_KEY,\n\t\t\tnetworkType: network as NetworkType,\n\t\t});\n\n\t\tconst balance = await dubhe.getBalance();\n\t\tconst balanceInSUI = Number(balance.totalBalance) / 1_000_000_000;\n\n\t\tif (balanceInSUI < amount) {\n\t\t\t// console.log(chalk.yellow(`Account balance is less than 2 SUI.`));\n\t\t\tthrow new DubheCliError(\n\t\t\t\t`Your account balance ${balanceInSUI.toFixed(\n\t\t\t\t\t4\n\t\t\t\t)} SUI is less than ${amount} SUI. Please get more SUI.`\n\t\t\t);\n\t\t}\n\n\t\tconsole.log(\n\t\t\tchalk.green(\n\t\t\t\t`Current account balance: ${balanceInSUI.toFixed(4)} SUI`\n\t\t\t)\n\t\t);\n\t} catch (error) {\n\t\tthrow new DubheCliError('Failed to check balance: ' + error);\n\t}\n}\n","import type { CommandModule } from 'yargs';\nimport { checkBalanceHandler } from '../utils/checkBalance';\n\ntype Options = {\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\tamount: number;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'check-balance',\n\tdescribe: 'Check the balance of the account',\n\tbuilder: {\n\t\tnetwork: {\n\t\t\ttype: 'string',\n\t\t\tchoices: ['mainnet', 'testnet', 'devnet', 'localnet'],\n\t\t\tdesc: 'Network to check balance on',\n\t\t},\n\t\tamount: {\n\t\t\ttype: 'number',\n\t\t\tdefault: 2,\n\t\t\tdesc: 'Amount of SUI to check balance for',\n\t\t},\n\t},\n\tasync handler({ network, amount }) {\n\t\ttry {\n\t\t\tawait checkBalanceHandler(network, amount);\n\t\t} catch (error) {\n\t\t\tconsole.error('Error checking balance:', error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprocess.exit(0);\n\t},\n};\n\nexport default commandModule;\n","import * as fsAsync from 'fs/promises';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { exit } from 'process';\nimport { dirname } from 'path';\nimport { DeploymentJsonType, schema } from './utils';\nimport { DubheConfig } from '@0xobelisk/sui-common';\n\nasync function getDeploymentJson(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<DeploymentJsonType> {\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 (error) {\n\t\tthrow new Error(\n\t\t\t`read .history/sui_${network}/latest.json failed. ${error}`\n\t\t);\n\t}\n}\n\nfunction storeConfig(\n\tnetwork: string,\n\tpackageId: string,\n\tschemas: schema[],\n\toutputPath: string\n) {\n\tlet code = `type NetworkType = 'testnet' | 'mainnet' | 'devnet' | 'localnet';\n\nexport const NETWORK: NetworkType = '${network}';\n\nexport const PACKAGE_ID = '${packageId}'\n\n${schemas\n\t.map(\n\t\tschema =>\n\t\t\t`export const ${schema.name.split('::')[2]}_Object_Id = '${\n\t\t\t\tschema.objectId\n\t\t\t}'`\n\t)\n\t.join('\\n')}\n`;\n\t// if (outputPath) {\n\twriteOutput(code, outputPath, 'storeConfig');\n\t// writeOutput(code, `${path}/src/chain/config.ts`, 'storeConfig');\n\t// }\n}\n\nasync 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\nexport async function storeConfigHandler(\n\tdubheConfig: DubheConfig,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\toutputPath: string\n) {\n\tconst path = process.cwd();\n\tconst contractPath = `${path}/contracts/${dubheConfig.name}`;\n\tconst deployment = await getDeploymentJson(contractPath, network);\n\tstoreConfig(\n\t\tdeployment.network,\n\t\tdeployment.packageId,\n\t\tdeployment.schemas,\n\t\toutputPath\n\t);\n}\n","import type { CommandModule } from 'yargs';\nimport { storeConfigHandler } from '../utils/storeConfig';\nimport { loadConfig, DubheConfig } from '@0xobelisk/sui-common';\n\ntype Options = {\n\t'config-path': string;\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\t'output-ts-path': string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n\tcommand: 'config-store',\n\n\tdescribe: 'Store configuration for the Dubhe project',\n\n\tbuilder: {\n\t\t'config-path': {\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'],\n\t\t\tdesc: 'Network to store config for',\n\t\t},\n\t\t'output-ts-path': {\n\t\t\ttype: 'string',\n\t\t\tdesc: 'Specify the output path for the generated TypeScript configuration file (e.g., ./src/config/generated.ts)',\n\t\t},\n\t},\n\tasync handler({\n\t\t'config-path': configPath,\n\t\tnetwork,\n\t\t'output-ts-path': outputTsPath,\n\t}) {\n\t\ttry {\n\t\t\tconst dubheConfig = (await loadConfig(configPath)) as DubheConfig;\n\t\t\tawait storeConfigHandler(dubheConfig, network, outputTsPath);\n\t\t} catch (error) {\n\t\t\tconsole.error('Error storing config:', error);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tprocess.exit(0);\n\t},\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 build from './build';\nimport hello from './hello';\nimport generateKey from './generateKey';\nimport checkBalance from './checkBalance';\nimport configStore from './configStore';\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\tbuild,\n\thello,\n\tgenerateKey,\n\tcheckBalance,\n\tconfigStore,\n];\n"],"mappings":"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","names":["yargs","hideBin","execSync","spawn","chalk","chalk","printDubhe","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","fs","chalk","spawn","validatePrivateKey","privateKey","SUI_PRIVATE_KEY_PREFIX","strippedPrivateKey","getDeploymentJson","projectPath","network","data","FsIibError","getOnchainSchemas","getVersion","getOldPackageId","projectPath","network","getDeploymentJson","getUpgradeCap","saveContractData","projectName","network","packageId","upgradeCap","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","removeEnvContent","filePath","networkType","content","regex","updatedContent","updateEnvFile","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","gasBudget","keypair","tx","Transaction","upgradeCap","result","version","packageId","schemas","upgradeCapId","object","delay","deployHookTx","deployHookResult","structure","schemaKey","saveContractData","publishDubheFramework","publishHandler","contractName","switchEnv","privateKey","DubheCliError","privateKeyFormat","validatePrivateKey","Dubhe","SuiClient","getFullnodeUrl","updateDubheDependency","Dubhe","getFullnodeUrl","SuiClient","isSuiStartRunning","cmd","result","execSync","printAccounts","privateKeys","privateKey","index","keypair","spawn","chalk","startLocalNode","printDubhe","suiProcess","error","delay","privateKeyFormat","validatePrivateKey","DubheCliError","dubhe","client","originalLog","publishDubheFramework","commandModule","yargs","startLocalNode","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","gasBudget","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","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","loadConfig","commandModule","yargs","configPath","test","dubheConfig","command","output","error","test_default","execSync","chalk","loadConfig","commandModule","yargs","configPath","network","dumpBytecodeAsBase64","dubheConfig","loadConfig","projectPath","switchEnv","updateDubheDependency","command","output","execSync","error","chalk","build_default","commandModule","yargs","printDubhe","hello_default","Dubhe","fs","chalk","generateAccountHandler","force","outputTsPath","path","privateKey","keypair","dir","match","commandModule","force","outputTsPath","generateAccountHandler","error","generateKey_default","Dubhe","chalk","dotenv","dotenv","checkBalanceHandler","network","amount","chalk","privateKey","DubheCliError","validatePrivateKey","balance","Dubhe","balanceInSUI","error","commandModule","network","amount","checkBalanceHandler","error","checkBalance_default","fsAsync","mkdirSync","writeFileSync","dirname","getDeploymentJson","projectPath","network","data","error","storeConfig","packageId","schemas","outputPath","code","schema","writeOutput","output","fullOutputPath","logPrefix","storeConfigHandler","dubheConfig","contractPath","deployment","loadConfig","commandModule","configPath","network","outputTsPath","dubheConfig","storeConfigHandler","error","configStore_default","commands","publish_default","localnode_default","faucet_default","schemagen_default","upgrade_default","test_default","build_default","hello_default","generateKey_default","checkBalance_default","configStore_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.
|
|
3
|
+
"version": "0.5.35",
|
|
4
4
|
"description": "Tookit for interacting with move eps framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sui",
|
|
@@ -31,8 +31,6 @@
|
|
|
31
31
|
"dubhe": "./dist/dubhe.js"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@0xobelisk/sui-client": "^0.5.28",
|
|
35
|
-
"@0xobelisk/sui-common": "^0.5.23",
|
|
36
34
|
"@mysten/sui": "^1.7.0",
|
|
37
35
|
"chalk": "^5.0.1",
|
|
38
36
|
"child_process": "^1.0.2",
|
|
@@ -46,7 +44,9 @@
|
|
|
46
44
|
"typescript": "5.1.6",
|
|
47
45
|
"yargs": "^17.7.1",
|
|
48
46
|
"zod": "^3.22.3",
|
|
49
|
-
"zod-validation-error": "^1.3.0"
|
|
47
|
+
"zod-validation-error": "^1.3.0",
|
|
48
|
+
"@0xobelisk/sui-common": "0.5.24",
|
|
49
|
+
"@0xobelisk/sui-client": "0.5.30"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/ejs": "^3.1.1",
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
saveContractData,
|
|
14
14
|
validatePrivateKey,
|
|
15
15
|
schema,
|
|
16
|
-
getSchemaHub,
|
|
17
16
|
updateDubheDependency,
|
|
18
17
|
switchEnv,
|
|
19
18
|
delay,
|
|
@@ -22,24 +21,6 @@ import { DubheConfig } from '@0xobelisk/sui-common';
|
|
|
22
21
|
import * as fs from 'fs';
|
|
23
22
|
import * as path from 'path';
|
|
24
23
|
|
|
25
|
-
async function getDappsObjectId(
|
|
26
|
-
network: 'mainnet' | 'testnet' | 'devnet' | 'localnet'
|
|
27
|
-
) {
|
|
28
|
-
switch (network) {
|
|
29
|
-
case 'localnet': {
|
|
30
|
-
const path = process.cwd();
|
|
31
|
-
return await getSchemaHub(
|
|
32
|
-
`${path}/contracts/dubhe-framework`,
|
|
33
|
-
network
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
case 'testnet':
|
|
37
|
-
return '0x8dbf8d28ac027ba214c9e0951b09f6842843be6cb87242b7d9a326a2677cd47a';
|
|
38
|
-
default:
|
|
39
|
-
return '0x8dbf8d28ac027ba214c9e0951b09f6842843be6cb87242b7d9a326a2677cd47a';
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
24
|
function removeEnvContent(
|
|
44
25
|
filePath: string,
|
|
45
26
|
networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet'
|
|
@@ -63,12 +44,6 @@ interface EnvConfig {
|
|
|
63
44
|
publishedVersion: number;
|
|
64
45
|
}
|
|
65
46
|
|
|
66
|
-
const chainIds: { [key: string]: string } = {
|
|
67
|
-
localnet: 'dfa7bb83',
|
|
68
|
-
testnet: '4c78adac',
|
|
69
|
-
mainnet: '35834a8a',
|
|
70
|
-
};
|
|
71
|
-
|
|
72
47
|
function updateEnvFile(
|
|
73
48
|
filePath: string,
|
|
74
49
|
networkType: 'mainnet' | 'testnet' | 'devnet' | 'localnet',
|
|
@@ -195,8 +170,6 @@ async function publishContract(
|
|
|
195
170
|
projectPath: string,
|
|
196
171
|
gasBudget?: number
|
|
197
172
|
) {
|
|
198
|
-
const dappsObjectId = await getDappsObjectId(network);
|
|
199
|
-
console.log('dappsObjectId', dappsObjectId);
|
|
200
173
|
const chainId = await client.getChainIdentifier();
|
|
201
174
|
removeEnvContent(`${projectPath}/Move.lock`, network);
|
|
202
175
|
console.log('\nš Starting Contract Publication...');
|
|
@@ -242,7 +215,6 @@ async function publishContract(
|
|
|
242
215
|
let packageId = '';
|
|
243
216
|
let schemas: schema[] = [];
|
|
244
217
|
let upgradeCapId = '';
|
|
245
|
-
let schemaHubId = '';
|
|
246
218
|
|
|
247
219
|
result.objectChanges!.map(object => {
|
|
248
220
|
if (object.type === 'published') {
|
|
@@ -256,13 +228,6 @@ async function publishContract(
|
|
|
256
228
|
console.log(` āā Upgrade Cap: ${object.objectId}`);
|
|
257
229
|
upgradeCapId = object.objectId;
|
|
258
230
|
}
|
|
259
|
-
if (
|
|
260
|
-
object.type === 'created' &&
|
|
261
|
-
object.objectType.includes('schema_hub')
|
|
262
|
-
) {
|
|
263
|
-
console.log(` āā Schema Hub: ${object.objectId}`);
|
|
264
|
-
schemaHubId = object.objectId;
|
|
265
|
-
}
|
|
266
231
|
});
|
|
267
232
|
|
|
268
233
|
console.log(` āā Transaction: ${result.digest}`);
|
|
@@ -279,19 +244,9 @@ async function publishContract(
|
|
|
279
244
|
await delay(5000);
|
|
280
245
|
|
|
281
246
|
const deployHookTx = new Transaction();
|
|
282
|
-
if (gasBudget) {
|
|
283
|
-
deployHookTx.setGasBudget(gasBudget);
|
|
284
|
-
}
|
|
285
|
-
const [txCoin] = deployHookTx.splitCoins(deployHookTx.gas, ['1000000000']);
|
|
286
247
|
deployHookTx.moveCall({
|
|
287
248
|
target: `${packageId}::deploy_hook::run`,
|
|
288
|
-
arguments: [
|
|
289
|
-
deployHookTx.object(schemaHubId),
|
|
290
|
-
deployHookTx.object(dappsObjectId),
|
|
291
|
-
deployHookTx.object(upgradeCapId),
|
|
292
|
-
deployHookTx.object('0x6'),
|
|
293
|
-
txCoin,
|
|
294
|
-
],
|
|
249
|
+
arguments: [ deployHookTx.object('0x6') ],
|
|
295
250
|
});
|
|
296
251
|
|
|
297
252
|
let deployHookResult: SuiTransactionBlockResponse;
|
|
@@ -344,7 +299,6 @@ async function publishContract(
|
|
|
344
299
|
network,
|
|
345
300
|
packageId,
|
|
346
301
|
upgradeCapId,
|
|
347
|
-
schemaHubId,
|
|
348
302
|
version,
|
|
349
303
|
schemas
|
|
350
304
|
);
|
|
@@ -412,7 +366,6 @@ export async function publishDubheFramework(
|
|
|
412
366
|
let packageId = '';
|
|
413
367
|
let schemas: schema[] = [];
|
|
414
368
|
let upgradeCapId = '';
|
|
415
|
-
let schemaHubId = '';
|
|
416
369
|
|
|
417
370
|
result.objectChanges!.map(object => {
|
|
418
371
|
if (object.type === 'published') {
|
|
@@ -426,10 +379,6 @@ export async function publishDubheFramework(
|
|
|
426
379
|
console.log(` āā Upgrade Cap: ${object.objectId}`);
|
|
427
380
|
upgradeCapId = object.objectId;
|
|
428
381
|
}
|
|
429
|
-
if (object.type === 'created' && object.objectType.includes('dapps')) {
|
|
430
|
-
console.log(` āā Dapps: ${object.objectId}`);
|
|
431
|
-
schemaHubId = object.objectId;
|
|
432
|
-
}
|
|
433
382
|
});
|
|
434
383
|
|
|
435
384
|
console.log(` āā Transaction: ${result.digest}`);
|
|
@@ -447,7 +396,6 @@ export async function publishDubheFramework(
|
|
|
447
396
|
network,
|
|
448
397
|
packageId,
|
|
449
398
|
upgradeCapId,
|
|
450
|
-
schemaHubId,
|
|
451
399
|
version,
|
|
452
400
|
schemas
|
|
453
401
|
);
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
getVersion,
|
|
11
11
|
getUpgradeCap,
|
|
12
12
|
saveContractData,
|
|
13
|
-
validatePrivateKey, getOnchainSchemas,
|
|
13
|
+
validatePrivateKey, getOnchainSchemas, switchEnv, delay,
|
|
14
14
|
} from './utils';
|
|
15
15
|
import * as fs from 'fs';
|
|
16
16
|
import * as path from 'path';
|
|
@@ -51,7 +51,7 @@ ${migration.fields.map((field) => {
|
|
|
51
51
|
) {
|
|
52
52
|
storage_type = `storage_double_map::new()`;
|
|
53
53
|
}
|
|
54
|
-
return `
|
|
54
|
+
return `storage_migration::add_field<${field.type}>(&mut ${migration.schemaName}.id, b"${field.name}", ${storage_type});`;
|
|
55
55
|
}).join('')}
|
|
56
56
|
}
|
|
57
57
|
`;
|
|
@@ -150,7 +150,6 @@ in your contracts directory to use the default sui private key.`,
|
|
|
150
150
|
|
|
151
151
|
let oldVersion = Number(await getVersion(projectPath, network));
|
|
152
152
|
let oldPackageId = await getOldPackageId(projectPath, network);
|
|
153
|
-
let schemaHub = await getSchemaHub(projectPath, network);
|
|
154
153
|
let upgradeCap = await getUpgradeCap(projectPath, network);
|
|
155
154
|
|
|
156
155
|
const original_published_id = replaceEnvField(`${projectPath}/Move.lock`, network, 'original-published-id', "0x0000000000000000000000000000000000000000000000000000000000000000");
|
|
@@ -273,7 +272,6 @@ in your contracts directory to use the default sui private key.`,
|
|
|
273
272
|
network,
|
|
274
273
|
newPackageId,
|
|
275
274
|
upgradeCap,
|
|
276
|
-
schemaHub,
|
|
277
275
|
oldVersion + 1,
|
|
278
276
|
schemas,
|
|
279
277
|
);
|
package/src/utils/utils.ts
CHANGED
|
@@ -18,7 +18,6 @@ export type DeploymentJsonType = {
|
|
|
18
18
|
network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';
|
|
19
19
|
packageId: string;
|
|
20
20
|
upgradeCap: string;
|
|
21
|
-
schemaHub: string;
|
|
22
21
|
version: number;
|
|
23
22
|
schemas: schema[];
|
|
24
23
|
};
|
|
@@ -119,14 +118,6 @@ export async function getUpgradeCap(
|
|
|
119
118
|
return deployment.upgradeCap;
|
|
120
119
|
}
|
|
121
120
|
|
|
122
|
-
export async function getSchemaHub(
|
|
123
|
-
projectPath: string,
|
|
124
|
-
network: string
|
|
125
|
-
): Promise<string> {
|
|
126
|
-
const deployment = await getDeploymentJson(projectPath, network);
|
|
127
|
-
return deployment.schemaHub;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
121
|
export async function getObjectIdBySchemaName(
|
|
131
122
|
projectPath: string,
|
|
132
123
|
network: string,
|
|
@@ -142,7 +133,6 @@ export function saveContractData(
|
|
|
142
133
|
network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',
|
|
143
134
|
packageId: string,
|
|
144
135
|
upgradeCap: string,
|
|
145
|
-
schemaHub: string,
|
|
146
136
|
version: number,
|
|
147
137
|
schemas: schema[],
|
|
148
138
|
) {
|
|
@@ -152,7 +142,6 @@ export function saveContractData(
|
|
|
152
142
|
packageId,
|
|
153
143
|
schemas,
|
|
154
144
|
upgradeCap,
|
|
155
|
-
schemaHub,
|
|
156
145
|
version,
|
|
157
146
|
};
|
|
158
147
|
|