@0xobelisk/sui-cli 0.5.7 → 0.5.8
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/obelisk.js +9 -9
- package/dist/obelisk.js.map +1 -1
- package/package.json +1 -1
- package/src/utils/utils.ts +118 -108
package/dist/obelisk.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
gracefully shutting down from SIGINT (Crtl-C)`),e.kill(),process.exit()}),await e}},
|
|
2
|
+
import Le from"yargs";import{hideBin as Ze}from"yargs/helpers";import{execa as me}from"execa";var ge={command:"localnode",describe:"Start a local Sui node for development",builder(e){return e},async handler(){console.log("Clearing localnode history"),console.log("Running: sui-test-validator");let e=me("sui-test-validator");process.on("SIGINT",()=>{console.log(`
|
|
3
|
+
gracefully shutting down from SIGINT (Crtl-C)`),e.kill(),process.exit()}),await e}},W=ge;import{requestSuiFromFaucetV0 as Se,getFaucetHost as Re}from"@mysten/sui.js/faucet";import{Ed25519Keypair as Ke}from"@mysten/sui.js/keypairs/ed25519";import{SuiClient as Ae,getFullnodeUrl as Me}from"@mysten/sui.js/client";import{TransactionBlock as z}from"@mysten/sui.js/transactions";import{Ed25519Keypair as ke}from"@mysten/sui.js/keypairs/ed25519";import{getFullnodeUrl as xe,SuiClient as ve}from"@mysten/sui.js/client";import{execSync as Ce}from"child_process";import c from"chalk";import S from"chalk";import{ZodError as ue}from"zod";import{fromZodError as fe,ValidationError as _e}from"zod-validation-error";var D=class extends Error{name="NotInsideProjectError";message="You are not inside a Obelisk project"},l=class extends Error{name="ObeliskCliError"},B=class extends Error{name="UpgradeError"},R=class extends Error{name="FsIibError"};function P(e){if(e instanceof _e)console.log(S.redBright(e.message));else if(e instanceof ue){let t=fe(e,{prefixSeparator:`
|
|
4
4
|
- `,issueSeparator:`
|
|
5
|
-
- `});console.log(S.redBright(t.message))}else e instanceof D?(console.log(S.red(e.message)),console.log(""),console.log(S.blue("To learn more about Obelisk's configuration, please go to https://github.com/0xobelisk"))):e instanceof
|
|
5
|
+
- `});console.log(S.redBright(t.message))}else e instanceof D?(console.log(S.red(e.message)),console.log(""),console.log(S.blue("To learn more about Obelisk's configuration, please go to https://github.com/0xobelisk"))):e instanceof l?console.log(S.red(e)):console.log(e)}import*as Y from"fs/promises";import{mkdirSync as ye,writeFileSync as he}from"fs";import{dirname as be}from"path";import{SUI_PRIVATE_KEY_PREFIX as we}from"@mysten/sui.js/cryptography";function O(e){if(e.startsWith(we))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 K(e,t){try{let o=`${e}/sources/codegen/eps/world.move`,n=(await Y.readFile(o,"utf8")).replace(/const VERSION: u64 = \d+;/,`const VERSION: u64 = ${t};`);Z(n,o,"Update package version")}catch{throw new R("Fs update version failed.")}}async function A(e,t){try{let o=await Y.readFile(`${e}/.history/sui_${t}/latest.json`,"utf8");return JSON.parse(o)}catch{throw new R("Fs read deployment file failed.")}}async function H(e,t){return(await A(e,t)).version}async function J(e,t){return(await A(e,t)).packageId}async function q(e,t){return(await A(e,t)).worldId}async function G(e,t){return(await A(e,t)).upgradeCap}async function L(e,t){return(await A(e,t)).adminCap}function M(e,t,o,a,n,d,g){let p={projectName:e,network:t,packageId:o,worldId:a,upgradeCap:n,adminCap:d,version:g},u=process.cwd(),y=JSON.stringify(p,null,2);Z(y,`${u}/contracts/${e}/.history/sui_${t}/latest.json`,"Update deploy log")}async function Z(e,t,o){ye(be(t),{recursive:!0}),he(t,e),o!==void 0&&console.log(`${o}: ${t}`)}async function X(e,t){let a=`${process.cwd()}/contracts/${e}`,n=process.env.PRIVATE_KEY;if(!n)throw new l(`Missing PRIVATE_KEY environment variable.
|
|
6
6
|
Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
|
|
7
|
-
in your contracts directory to use the default sui private key.`);let d=
|
|
7
|
+
in your contracts directory to use the default sui private key.`);let d=O(n);if(d===!1)throw new l("Please check your privateKey.");let g=Buffer.from(d,"hex"),p=ke.fromSecretKey(g),u=new ve({url:xe(t)});await K(a,"1");let y,x;try{let{modules:r,dependencies:_}=JSON.parse(Ce(`sui move build --dump-bytecode-as-base64 --path ${a}`,{encoding:"utf-8"}));y=r,x=_}catch(r){console.error(c.red("Error executing sui move build:")),console.error(r.stdout),process.exit(1)}console.log(c.blue(`Account: ${p.toSuiAddress()}`));let h=new z,[b]=h.publish({modules:y,dependencies:x});h.transferObjects([b],h.pure(p.getPublicKey().toSuiAddress()));let m;try{m=await u.signAndExecuteTransactionBlock({signer:p,transactionBlock:h,options:{showObjectChanges:!0}})}catch(r){console.error(c.red("Failed to execute publish, please republish")),console.error(r.message),process.exit(1)}m.effects?.status.status==="failure"&&(console.log(c.red("Failed to execute publish, please republish")),process.exit(1));let C=1,f="",w="",$="",E="";m.objectChanges.map(r=>{r.type==="published"&&(console.log(c.blue(`${e} PackageId: ${r.packageId}`)),f=r.packageId),r.type==="created"&&r.objectType.endsWith("::world::World")&&(console.log(c.blue(`${e} WorldId: ${r.objectId}`)),w=r.objectId),r.type==="created"&&r.objectType==="0x2::package::UpgradeCap"&&(console.log(c.blue(`${e} UpgradeCap: ${r.objectId}`)),$=r.objectId),r.type==="created"&&r.objectType.endsWith("::world::AdminCap")&&(console.log(c.blue(`${e} AdminCapId: ${r.objectId}`)),E=r.objectId)}),console.log(c.green(`Publish transaction digest: ${m.digest}`)),M(e,t,f,w,$,E,C),console.log("Executing the deployHook: "),await(r=>new Promise(_=>setTimeout(_,r)))(5e3);let I=new z;I.moveCall({target:`${f}::deploy_hook::run`,arguments:[I.object(w),I.object(E)]});let T;try{T=await u.signAndExecuteTransactionBlock({signer:p,transactionBlock:I,options:{showEffects:!0}})}catch(r){console.error(c.red("Failed to execute deployHook, please republish or manually call deploy_hook::run")),console.error(r.message),process.exit(1)}T.effects?.status.status==="success"?console.log(c.green(`Successful auto-execution of deployHook, please check the transaction digest: ${T.digest}`)):console.log(c.yellow("Failed to execute deployHook, please republish or manually call deploy_hook::run"))}import{TransactionBlock as Q,UpgradePolicy as Ee}from"@mysten/sui.js/transactions";import{Ed25519Keypair as Ie}from"@mysten/sui.js/keypairs/ed25519";import{getFullnodeUrl as Pe,SuiClient as Oe}from"@mysten/sui.js/client";import{execSync as $e}from"child_process";import k from"chalk";async function ee(e,t,o){let a=process.cwd(),n=`${a}/contracts/${e}`,d=process.env.PRIVATE_KEY;if(!d)throw new l(`Missing PRIVATE_KEY environment variable.
|
|
8
8
|
Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
|
|
9
|
-
in your contracts directory to use the default sui private key.`);let g=
|
|
10
|
-
Executing the migrate: `),await(s=>new Promise(j=>setTimeout(j,s)))(5e3);let v=new
|
|
11
|
-
${e} world schemas is ${V.fields.schema_names}`))):console.log(k.red(`${e} migrate world failed, world version is: ${V.fields.version}, package version is ${f}`))}catch(w){console.log(k.red("Upgrade failed!")),console.error(w.message),M(e,t,h,b,m,C,x),await K(n,x.toString())}}import
|
|
9
|
+
in your contracts directory to use the default sui private key.`);let g=O(d);if(g===!1)throw new l("Please check your privateKey.");let p=Buffer.from(g,"hex"),u=Ie.fromSecretKey(p),y=new Oe({url:Pe(t)}),x=Number(await H(n,t)),h=await J(n,t),b=await q(n,t),m=await G(n,t),C=await L(n,t),f=x+1;await K(n,f.toString());try{let w,$,E;try{let{modules:s,dependencies:j,digest:pe}=JSON.parse($e(`sui move build --dump-bytecode-as-base64 --path ${a}/contracts/${e}`,{encoding:"utf-8"}));w=s,$=j,E=pe}catch(s){throw new B(s.stdout)}let i=new Q,I=i.moveCall({target:"0x2::package::authorize_upgrade",arguments:[i.object(m),i.pure(Ee.COMPATIBLE),i.pure(E)]}),T=i.upgrade({modules:w,dependencies:$,packageId:h,ticket:I});i.moveCall({target:"0x2::package::commit_upgrade",arguments:[i.object(m),T]}),i.transferObjects([i.object(m)],i.pure(u.getPublicKey().toSuiAddress()));let r=await y.signAndExecuteTransactionBlock({signer:u,transactionBlock:i,options:{showObjectChanges:!0}});console.log(""),console.log(`${e} WorldId: ${b}`);let _="",F="";r.objectChanges.map(s=>{s.type==="published"&&(console.log(k.blue(`${e} PackageId: ${s.packageId}`)),_=s.packageId),s.type==="mutated"&&s.objectType==="0x2::package::UpgradeCap"&&(console.log(k.blue(`${e} UpgradeCap: ${s.objectId}`)),F=s.objectId)}),console.log(k.green(`Upgrade Transaction Digest: ${r.digest}`)),M(e,t,_,b,F,C,f),h=_,m=F,x=f,console.log(`
|
|
10
|
+
Executing the migrate: `),await(s=>new Promise(j=>setTimeout(j,s)))(5e3);let v=new Q;v.moveCall({target:`${_}::world::migrate`,arguments:[v.object(b),v.object(C)]});let V=(await y.getObject({id:b,options:{showContent:!0,showDisplay:!0,showType:!0,showOwner:!0}})).data.content,N=o.filter(s=>!V.fields.schema_names.includes(s));console.log("new schema:",N);let U=[];for(let s of N)v.moveCall({target:`${_}::${s}_schema::register`,arguments:[v.object(b),v.object(C)]}),U.push(`${s}_schema`);(await y.signAndExecuteTransactionBlock({signer:u,transactionBlock:v,options:{showEffects:!0}})).effects?.status.status==="success"?(console.log(k.green(`${e} migrate world success, new world version is: ${V.fields.version}, package version is ${f}`)),U.length!==0&&console.log(k.green(`new schema: ${U.toString()} register success.`)),console.log(k.blue(`
|
|
11
|
+
${e} world schemas is ${V.fields.schema_names}`))):console.log(k.red(`${e} migrate world failed, world version is: ${V.fields.version}, package version is ${f}`))}catch(w){console.log(k.red("Upgrade failed!")),console.error(w.message),M(e,t,h,b,m,C,x),await K(n,x.toString())}}import Te from"chalk";function te(){console.log(Te.yellow(`
|
|
12
12
|
Welcome to obelisk world
|
|
13
13
|
--from team@obelisk
|
|
14
14
|
________ ________ _______ ___ ___ ________ ___ __
|
|
@@ -21,7 +21,7 @@ Welcome to obelisk world
|
|
|
21
21
|
\\|_________|
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
`))}var
|
|
24
|
+
`))}var Ve={command:"faucet",describe:"Interact with a Obelisk faucet",builder(e){return e.options({network:{type:"string",desc:"URL of the Obelisk 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 d=process.env.PRIVATE_KEY;if(!d)throw new l(`Missing PRIVATE_KEY environment variable.
|
|
25
25
|
Run 'echo "PRIVATE_KEY=YOUR_PRIVATE_KEY" > .env'
|
|
26
|
-
in your contracts directory to use the default sui private key.`);let g=
|
|
26
|
+
in your contracts directory to use the default sui private key.`);let g=O(d);if(g===!1)throw new l("Please check your privateKey.");let p=Buffer.from(g,"hex");o=Ke.fromSecretKey(p).toSuiAddress()}else o=t;await Se({host:Re(e),recipient:o});let a=new Ae({url:Me(e)}),n={owner:o};console.log(`Account: ${o}`),console.log(await a.getBalance(n)),process.exit(0)}},oe=Ve;import{worldgen as Be,loadConfig as Fe}from"@0xobelisk/sui-common";import Ue from"chalk";var je={command:"schemagen <configPath>",describe:"Autogenerate Obelisk schemas based on the config file",builder(e){return e.options({configPath:{type:"string",desc:"Path to the config file"}})},async handler({configPath:e}){try{let t=await Fe(e);Be(t),process.exit(0)}catch(t){console.log(Ue.red("Schemagen failed!")),console.error(t.message)}}},re=je;import{loadConfig as De}from"@0xobelisk/sui-common";var Ye={command:"publish",describe:"Publish obelisk move contracts",builder(e){return e.options({network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Network of the node (mainnet/testnet/devnet/localnet)"},configPath:{type:"string",default:"obelisk.config.ts",decs:"Path to the config file"}})},async handler({network:e,configPath:t}){try{let o=await De(t);await X(o.name,e)}catch(o){P(o),process.exit(1)}process.exit(0)}},ne=Ye;import{loadConfig as Ne}from"@0xobelisk/sui-common";var We={command:"upgrade",describe:"Upgrade your move contracts",builder(e){return e.options({network:{type:"string",choices:["mainnet","testnet","devnet","localnet"],desc:"Network of the node (mainnet/testnet/devnet/localnet)"},configPath:{type:"string",default:"obelisk.config.ts",decs:"Path to the config file"}})},async handler({network:e,configPath:t}){try{let o=await Ne(t),a=Object.keys(o.schemas).filter(n=>!(typeof o.schemas=="object"&&"ephemeral"in o.schemas&&o.schemas[n].ephemeral));await ee(o.name,e,a)}catch(o){P(o),process.exit(1)}process.exit(0)}},se=We;import{execSync as He}from"child_process";import Je from"chalk";var qe={command:"test",describe:"Run tests in Obelisk contracts",builder(e){return e.options({packagePath:{type:"string",default:".",description:"Options to pass to forge test"}})},async handler({packagePath:e}){try{He(`sui move test --path ${e}`,{encoding:"utf-8"})}catch(t){console.error(Je.red("Error executing sui move test:")),console.log(t.stdout),process.exit(0)}}},ae=qe;var Ge={command:"hello",describe:"hello, obelisk",builder(e){return e},async handler(){te()}},ie=Ge;var le=[ne,W,oe,re,se,ae,ie];import*as de from"dotenv";import ce from"chalk";de.config();Le(Ze(process.argv)).scriptName("obelisk").command(le).strict().fail((e,t)=>{console.error(ce.red(e)),e.includes("Missing required argument")&&console.log(ce.yellow(`Run 'pnpm obelisk ${process.argv[2]} --help' for a list of available and required arguments.`)),console.log(""),P(t),console.log(""),process.exit(1)}).alias({h:"help"}).argv;
|
|
27
27
|
//# sourceMappingURL=obelisk.js.map
|
package/dist/obelisk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/obelisk.ts","../src/commands/localnode.ts","../src/commands/faucet.ts","../src/utils/publishHandler.ts","../src/utils/errors.ts","../src/utils/utils.ts","../src/utils/upgradeHandler.ts","../src/utils/printObelisk.ts","../src/commands/schemagen.ts","../src/commands/publish.ts","../src/commands/upgrade.ts","../src/commands/test.ts","../src/commands/hello.ts","../src/commands/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { commands } from \"./commands\";\nimport { logError } from \"./utils/errors\";\n\n// Load .env file into process.env\nimport * as dotenv from \"dotenv\";\nimport chalk from \"chalk\";\ndotenv.config();\n\nyargs(hideBin(process.argv))\n // Explicit name to display in help (by default it's the entry file, which may not be \"obelisk\" for e.g. ts-node)\n .scriptName(\"obelisk\")\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 obelisk ${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 type { CommandModule } from \"yargs\";\nimport { execa } from \"execa\";\n\nconst commandModule: CommandModule = {\n command: \"localnode\",\n\n describe: \"Start a local Sui node for development\",\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n console.log(\"Clearing localnode history\");\n\n console.log(`Running: sui-test-validator`);\n const child = execa(\"sui-test-validator\");\n\n process.on(\"SIGINT\", () => {\n console.log(\"\\ngracefully shutting down from SIGINT (Crtl-C)\");\n child.kill();\n process.exit();\n });\n await child;\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { requestSuiFromFaucetV0, getFaucetHost } from \"@mysten/sui.js/faucet\";\n\nimport { Ed25519Keypair } from \"@mysten/sui.js/keypairs/ed25519\";\n\nimport {\n SuiClient,\n getFullnodeUrl,\n GetBalanceParams,\n} from \"@mysten/sui.js/client\";\nimport { validatePrivateKey, ObeliskCliError } from \"../utils\";\n\ntype Options = {\n network: any;\n recipient?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"faucet\",\n\n describe: \"Interact with a Obelisk faucet\",\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: \"string\",\n desc: \"URL of the Obelisk faucet\",\n choices: [\"testnet\", \"devnet\", \"localnet\"],\n default: \"localnet\",\n },\n recipient: {\n type: \"string\",\n desc: \"Sui address to fund\",\n },\n });\n },\n\n async handler({ network, recipient }) {\n let faucet_address = \"\";\n if (recipient === undefined) {\n const privateKey = process.env.PRIVATE_KEY;\n if (!privateKey)\n throw new ObeliskCliError(\n `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 );\n\n const privateKeyFormat = validatePrivateKey(privateKey);\n if (privateKeyFormat === false) {\n throw new ObeliskCliError(`Please check your privateKey.`);\n }\n const privateKeyRaw = Buffer.from(privateKeyFormat as string, \"hex\");\n const keypair = Ed25519Keypair.fromSecretKey(privateKeyRaw);\n faucet_address = keypair.toSuiAddress();\n } else {\n faucet_address = recipient;\n }\n await requestSuiFromFaucetV0({\n host: getFaucetHost(network),\n recipient: faucet_address,\n });\n const client = new SuiClient({ url: getFullnodeUrl(network) });\n let params = {\n owner: faucet_address,\n } as GetBalanceParams;\n console.log(`Account: ${faucet_address}`);\n console.log(await client.getBalance(params));\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import { TransactionBlock } from \"@mysten/sui.js/transactions\";\nimport { Ed25519Keypair } from \"@mysten/sui.js/keypairs/ed25519\";\nimport {\n getFullnodeUrl,\n SuiClient,\n SuiTransactionBlockResponse,\n} from \"@mysten/sui.js/client\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport { ObeliskCliError } from \"./errors\";\nimport {\n updateVersionInFile,\n saveContractData,\n validatePrivateKey,\n} from \"./utils\";\n\nexport async function publishHandler(\n name: string,\n network: \"mainnet\" | \"testnet\" | \"devnet\" | \"localnet\"\n) {\n const path = process.cwd();\n const projectPath = `${path}/contracts/${name}`;\n\n const privateKey = process.env.PRIVATE_KEY;\n if (!privateKey)\n throw new ObeliskCliError(\n `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 );\n\n const privateKeyFormat = validatePrivateKey(privateKey);\n if (privateKeyFormat === false) {\n throw new ObeliskCliError(`Please check your privateKey.`);\n }\n const privateKeyRaw = Buffer.from(privateKeyFormat as string, \"hex\");\n const keypair = Ed25519Keypair.fromSecretKey(privateKeyRaw);\n const client = new SuiClient({\n url: getFullnodeUrl(network),\n });\n\n // Set version 1\n await updateVersionInFile(projectPath, \"1\");\n let modules: any, dependencies: any;\n try {\n const { modules: extractedModules, dependencies: extractedDependencies } =\n JSON.parse(\n execSync(\n `sui move build --dump-bytecode-as-base64 --path ${projectPath}`,\n {\n encoding: \"utf-8\",\n }\n )\n );\n modules = extractedModules;\n dependencies = extractedDependencies;\n } catch (error: any) {\n console.error(chalk.red(\"Error executing sui move build:\"));\n console.error(error.stdout);\n process.exit(1); // You might want to exit with a non-zero status code to indicate an error\n }\n\n console.log(chalk.blue(`Account: ${keypair.toSuiAddress()}`));\n\n const tx = new TransactionBlock();\n const [upgradeCap] = tx.publish({\n modules,\n dependencies,\n });\n tx.transferObjects(\n [upgradeCap],\n tx.pure(keypair.getPublicKey().toSuiAddress())\n );\n\n let result: SuiTransactionBlockResponse;\n try {\n result = await client.signAndExecuteTransactionBlock({\n signer: keypair,\n transactionBlock: tx,\n options: {\n showObjectChanges: true,\n },\n });\n } catch (error: any) {\n console.error(chalk.red(`Failed to execute publish, please republish`));\n console.error(error.message);\n process.exit(1);\n }\n\n if (result.effects?.status.status === \"failure\") {\n console.log(chalk.red(`Failed to execute publish, please republish`));\n process.exit(1);\n }\n\n let version = 1;\n let packageId = \"\";\n let worldId = \"\";\n let upgradeCapId = \"\";\n let adminCapId = \"\";\n result.objectChanges!.map((object) => {\n if (object.type === \"published\") {\n console.log(chalk.blue(`${name} PackageId: ${object.packageId}`));\n packageId = object.packageId;\n }\n if (\n object.type === \"created\" &&\n object.objectType.endsWith(\"::world::World\")\n ) {\n console.log(chalk.blue(`${name} WorldId: ${object.objectId}`));\n worldId = object.objectId;\n }\n if (\n object.type === \"created\" &&\n object.objectType === \"0x2::package::UpgradeCap\"\n ) {\n console.log(chalk.blue(`${name} UpgradeCap: ${object.objectId}`));\n upgradeCapId = object.objectId;\n }\n if (\n object.type === \"created\" &&\n object.objectType.endsWith(\"::world::AdminCap\")\n ) {\n console.log(chalk.blue(`${name} AdminCapId: ${object.objectId}`));\n adminCapId = object.objectId;\n }\n });\n\n console.log(chalk.green(`Publish transaction digest: ${result.digest}`));\n\n saveContractData(\n name,\n network,\n packageId,\n worldId,\n upgradeCapId,\n adminCapId,\n version\n );\n\n console.log(\"Executing the deployHook: \");\n const delay = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n await delay(5000);\n\n const deployHookTx = new TransactionBlock();\n\n deployHookTx.moveCall({\n target: `${packageId}::deploy_hook::run`,\n arguments: [deployHookTx.object(worldId), deployHookTx.object(adminCapId)],\n });\n\n let deployHookResult: SuiTransactionBlockResponse;\n try {\n deployHookResult = await client.signAndExecuteTransactionBlock({\n signer: keypair,\n transactionBlock: deployHookTx,\n options: {\n showEffects: true,\n },\n });\n } catch (error: any) {\n console.error(\n chalk.red(\n `Failed to execute deployHook, please republish or manually call deploy_hook::run`\n )\n );\n console.error(error.message);\n process.exit(1);\n }\n\n if (deployHookResult.effects?.status.status === \"success\") {\n console.log(\n chalk.green(\n `Successful auto-execution of deployHook, please check the transaction digest: ${deployHookResult.digest}`\n )\n );\n } else {\n console.log(\n chalk.yellow(\n `Failed to execute deployHook, please republish or manually call deploy_hook::run`\n )\n );\n }\n}\n","import chalk from \"chalk\";\nimport { ZodError } from \"zod\";\nimport { fromZodError, ValidationError } from \"zod-validation-error\";\n\nexport class NotInsideProjectError extends Error {\n name = \"NotInsideProjectError\";\n message = \"You are not inside a Obelisk project\";\n}\n\nexport class ObeliskCliError extends Error {\n name = \"ObeliskCliError\";\n}\n\nexport class UpgradeError extends Error {\n name = \"UpgradeError\";\n}\n\nexport class FsIibError extends Error {\n name = \"FsIibError\";\n}\n\nexport function logError(error: unknown) {\n if (error instanceof ValidationError) {\n console.log(chalk.redBright(error.message));\n } else if (error instanceof ZodError) {\n // TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n const validationError = fromZodError(error, {\n prefixSeparator: \"\\n- \",\n issueSeparator: \"\\n- \",\n });\n console.log(chalk.redBright(validationError.message));\n } else if (error instanceof NotInsideProjectError) {\n console.log(chalk.red(error.message));\n console.log(\"\");\n // TODO add docs to the website and update the link to the specific page\n console.log(\n chalk.blue(\n `To learn more about Obelisk's configuration, please go to https://github.com/0xobelisk`\n )\n );\n } else if (error instanceof ObeliskCliError) {\n console.log(chalk.red(error));\n } else {\n console.log(error);\n }\n}\n","import * as fsAsync from \"fs/promises\";\nimport { mkdirSync, writeFileSync } from \"fs\";\nimport { dirname } from \"path\";\nimport { FsIibError } from \"./errors\";\n\nexport type DeploymentJsonType = {\n projectName: string;\n network: \"mainnet\" | \"testnet\" | \"devnet\" | \"localnet\";\n packageId: string;\n worldId: string;\n upgradeCap: string;\n adminCap: string;\n version: number;\n};\n\nexport function validatePrivateKey(privateKey: string): boolean | string {\n if (privateKey.startsWith(\"0x\")) {\n const strippedPrivateKey = privateKey.slice(2);\n if (strippedPrivateKey.length === 64) {\n return strippedPrivateKey;\n } else {\n return false;\n }\n } else {\n if (privateKey.length === 64) {\n return privateKey;\n } else {\n return false;\n }\n }\n}\n\nexport async function updateVersionInFile(\n projectPath: string,\n newVersion: string\n) {\n try {\n const filePath = `${projectPath}/sources/codegen/eps/world.move`;\n const data = await fsAsync.readFile(filePath, \"utf8\");\n\n // update version data\n const updatedData = data.replace(\n /const VERSION: u64 = \\d+;/,\n `const VERSION: u64 = ${newVersion};`\n );\n\n // write new version\n writeOutput(updatedData, filePath, \"Update package version\");\n } catch {\n throw new FsIibError(\"Fs update version failed.\");\n }\n}\n\nasync function getDeploymentJson(projectPath: string, network: string) {\n try {\n const data = await fsAsync.readFile(\n `${projectPath}/.history/sui_${network}/latest.json`,\n \"utf8\"\n );\n return JSON.parse(data) as DeploymentJsonType;\n } catch {\n throw new FsIibError(\"Fs read deployment file failed.\");\n }\n}\n\nexport async function getVersion(\n projectPath: string,\n network: string\n): Promise<number> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.version;\n}\n\nexport async function getNetwork(\n projectPath: string,\n network: string\n): Promise<\"mainnet\" | \"testnet\" | \"devnet\" | \"localnet\"> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.network;\n}\n\nexport async function getOldPackageId(\n projectPath: string,\n network: string\n): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.packageId;\n}\n\nexport async function getWorldId(\n projectPath: string,\n network: string\n): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.worldId;\n}\n\nexport async function getUpgradeCap(\n projectPath: string,\n network: string\n): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.upgradeCap;\n}\n\nexport async function getAdminCap(\n projectPath: string,\n network: string\n): Promise<string> {\n const deployment = await getDeploymentJson(projectPath, network);\n return deployment.adminCap;\n}\n\nexport function saveContractData(\n projectName: string,\n network: \"mainnet\" | \"testnet\" | \"devnet\" | \"localnet\",\n packageId: string,\n worldId: string,\n upgradeCap: string,\n adminCap: string,\n version: number\n) {\n const DeploymentData: DeploymentJsonType = {\n projectName,\n network,\n packageId,\n worldId,\n upgradeCap,\n adminCap,\n version,\n };\n\n const path = process.cwd();\n const storeDeploymentData = JSON.stringify(DeploymentData, null, 2);\n writeOutput(\n storeDeploymentData,\n `${path}/contracts/${projectName}/.history/sui_${network}/latest.json`,\n \"Update deploy log\"\n );\n}\n\nexport async function writeOutput(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n mkdirSync(dirname(fullOutputPath), { recursive: true });\n\n writeFileSync(fullOutputPath, output);\n if (logPrefix !== undefined) {\n console.log(`${logPrefix}: ${fullOutputPath}`);\n }\n}\n","import { TransactionBlock, UpgradePolicy } from \"@mysten/sui.js/transactions\";\nimport { Ed25519Keypair } from \"@mysten/sui.js/keypairs/ed25519\";\nimport { getFullnodeUrl, SuiClient } from \"@mysten/sui.js/client\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport { ObeliskCliError, UpgradeError } from \"./errors\";\nimport {\n updateVersionInFile,\n getOldPackageId,\n getVersion,\n getWorldId,\n getUpgradeCap,\n saveContractData,\n validatePrivateKey,\n getAdminCap,\n} from \"./utils\";\n\ntype ObjectContent = {\n type: string;\n fields: Record<string, any>;\n hasPublicTransfer: boolean;\n dataType: string;\n};\n\nexport async function upgradeHandler(\n name: string,\n network: \"mainnet\" | \"testnet\" | \"devnet\" | \"localnet\",\n schemaNames: string[]\n) {\n const path = process.cwd();\n const projectPath = `${path}/contracts/${name}`;\n const privateKey = process.env.PRIVATE_KEY;\n if (!privateKey)\n throw new ObeliskCliError(\n `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 );\n\n const privateKeyFormat = validatePrivateKey(privateKey);\n if (privateKeyFormat === false) {\n throw new ObeliskCliError(`Please check your privateKey.`);\n }\n const privateKeyRaw = Buffer.from(privateKeyFormat as string, \"hex\");\n const keypair = Ed25519Keypair.fromSecretKey(privateKeyRaw);\n\n const client = new SuiClient({\n url: getFullnodeUrl(network),\n });\n\n let oldVersion = Number(await getVersion(projectPath, network));\n let oldPackageId = await getOldPackageId(projectPath, network);\n let worldId = await getWorldId(projectPath, network);\n let upgradeCap = await getUpgradeCap(projectPath, network);\n let adminCap = await getAdminCap(projectPath, network);\n\n const newVersion = oldVersion + 1;\n await updateVersionInFile(projectPath, newVersion.toString());\n\n try {\n let modules: any, dependencies: any, digest: any;\n try {\n const {\n modules: extractedModules,\n dependencies: extractedDependencies,\n digest: extractedDigest,\n } = JSON.parse(\n execSync(\n `sui move build --dump-bytecode-as-base64 --path ${path}/contracts/${name}`,\n {\n encoding: \"utf-8\",\n }\n )\n );\n\n modules = extractedModules;\n dependencies = extractedDependencies;\n digest = extractedDigest;\n } catch (error: any) {\n throw new UpgradeError(error.stdout);\n }\n\n const tx = new TransactionBlock();\n const ticket = tx.moveCall({\n target: \"0x2::package::authorize_upgrade\",\n arguments: [\n tx.object(upgradeCap),\n tx.pure(UpgradePolicy.COMPATIBLE),\n tx.pure(digest),\n ],\n });\n\n const receipt = tx.upgrade({\n modules,\n dependencies,\n packageId: oldPackageId,\n ticket,\n });\n\n tx.moveCall({\n target: \"0x2::package::commit_upgrade\",\n arguments: [tx.object(upgradeCap), receipt],\n });\n\n tx.transferObjects(\n [tx.object(upgradeCap)],\n tx.pure(keypair.getPublicKey().toSuiAddress())\n );\n\n const result = await client.signAndExecuteTransactionBlock({\n signer: keypair,\n transactionBlock: tx,\n options: {\n showObjectChanges: true,\n },\n });\n\n console.log(\"\");\n console.log(`${name} WorldId: ${worldId}`);\n\n let newPackageId = \"\";\n let newUpgradeCap = \"\";\n result.objectChanges!.map((object) => {\n if (object.type === \"published\") {\n console.log(chalk.blue(`${name} PackageId: ${object.packageId}`));\n newPackageId = object.packageId;\n }\n if (\n object.type === \"mutated\" &&\n object.objectType === \"0x2::package::UpgradeCap\"\n ) {\n console.log(chalk.blue(`${name} UpgradeCap: ${object.objectId}`));\n newUpgradeCap = object.objectId;\n }\n });\n\n console.log(chalk.green(`Upgrade Transaction Digest: ${result.digest}`));\n\n saveContractData(\n name,\n network,\n newPackageId,\n worldId,\n newUpgradeCap,\n adminCap,\n newVersion\n );\n\n oldPackageId = newPackageId;\n upgradeCap = newUpgradeCap;\n oldVersion = newVersion;\n\n console.log(\"\\nExecuting the migrate: \");\n const delay = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n await delay(5000);\n\n const migrateTx = new TransactionBlock();\n migrateTx.moveCall({\n target: `${newPackageId}::world::migrate`,\n arguments: [migrateTx.object(worldId), migrateTx.object(adminCap)],\n });\n\n let newWorldObject = await client.getObject({\n id: worldId,\n options: {\n showContent: true,\n showDisplay: true,\n showType: true,\n showOwner: true,\n },\n });\n let newObjectContent = newWorldObject.data!.content as ObjectContent;\n\n const uniqueSchema: string[] = schemaNames.filter(\n (item) => !newObjectContent.fields[\"schema_names\"].includes(item)\n );\n\n console.log(\"new schema:\", uniqueSchema);\n let needRegisterSchema = [];\n for (const newSchema of uniqueSchema) {\n migrateTx.moveCall({\n target: `${newPackageId}::${newSchema}_schema::register`,\n arguments: [migrateTx.object(worldId), migrateTx.object(adminCap)],\n });\n needRegisterSchema.push(`${newSchema}_schema`);\n }\n const migrateResult = await client.signAndExecuteTransactionBlock({\n signer: keypair,\n transactionBlock: migrateTx,\n options: {\n showEffects: true,\n },\n });\n\n if (migrateResult.effects?.status.status === \"success\") {\n console.log(\n chalk.green(\n `${name} migrate world success, new world version is: ${newObjectContent.fields[\"version\"]}, package version is ${newVersion}`\n )\n );\n if (needRegisterSchema.length !== 0) {\n console.log(\n chalk.green(\n `new schema: ${needRegisterSchema.toString()} register success.`\n )\n );\n }\n\n console.log(\n chalk.blue(\n `\\n${name} world schemas is ${newObjectContent.fields[\"schema_names\"]}`\n )\n );\n } else {\n console.log(\n chalk.red(\n `${name} migrate world failed, world version is: ${newObjectContent.fields[\"version\"]}, package version is ${newVersion}`\n )\n );\n }\n } catch (error: any) {\n console.log(chalk.red(\"Upgrade failed!\"));\n console.error(error.message);\n\n saveContractData(\n name,\n network,\n oldPackageId,\n worldId,\n upgradeCap,\n adminCap,\n oldVersion\n );\n await updateVersionInFile(projectPath, oldVersion.toString());\n }\n}\n","import chalk from \"chalk\";\n\nexport function printObelisk() {\n console.log(\n chalk.yellow(`\nWelcome to obelisk world\n\\t\\t\\t --from team@obelisk\n ________ ________ _______ ___ ___ ________ ___ __ \n|\\\\ __ \\\\|\\\\ __ \\\\|\\\\ ___ \\\\ |\\\\ \\\\ |\\\\ \\\\|\\\\ ____\\\\|\\\\ \\\\|\\\\ \\\\ \n\\\\ \\\\ \\\\|\\\\ \\\\ \\\\ \\\\|\\\\ /\\\\ \\\\ __/|\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\___|\\\\ \\\\ \\\\/ /|_ \n \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __ \\\\ \\\\ \\\\_|/_\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\_____ \\\\ \\\\ ___ \\\\ \n \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ \\\\ \\\\ \\\\_|\\\\ \\\\ \\\\ \\\\____\\\\ \\\\ \\\\|____|\\\\ \\\\ \\\\ \\\\\\\\ \\\\ \\\\ \n \\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\__\\\\____\\\\_\\\\ \\\\ \\\\__\\\\\\\\ \\\\__\\\\\n \\\\|_______|\\\\|_______|\\\\|_______|\\\\|_______|\\\\|__|\\\\_________\\\\|__| \\\\|__|\n \\\\|_________| \n \n \n`)\n );\n}\n","import type { CommandModule } from \"yargs\";\nimport { worldgen, loadConfig, ObeliskConfig } from \"@0xobelisk/sui-common\";\nimport chalk from \"chalk\";\n\ntype Options = {\n configPath?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"schemagen <configPath>\",\n\n describe: \"Autogenerate Obelisk schemas based on the config file\",\n\n builder(yargs) {\n return yargs.options({\n configPath: { type: \"string\", desc: \"Path to the config file\" },\n });\n },\n\n async handler({ configPath }) {\n try {\n const obeliskConfig = (await loadConfig(configPath)) as ObeliskConfig;\n worldgen(obeliskConfig);\n process.exit(0);\n } catch (error: any) {\n console.log(chalk.red(\"Schemagen failed!\"));\n console.error(error.message);\n }\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { logError } from \"../utils/errors\";\nimport { publishHandler } from \"../utils\";\nimport { loadConfig, ObeliskConfig } from \"@0xobelisk/sui-common\";\n\ntype Options = {\n network: any;\n configPath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"publish\",\n\n describe: \"Publish obelisk move contracts\",\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: \"string\",\n choices: [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"],\n desc: \"Network of the node (mainnet/testnet/devnet/localnet)\",\n },\n configPath: {\n type: \"string\",\n default: \"obelisk.config.ts\",\n decs: \"Path to the config file\",\n },\n });\n },\n\n async handler({ network, configPath }) {\n try {\n const obeliskConfig = (await loadConfig(configPath)) as ObeliskConfig;\n await publishHandler(obeliskConfig.name, network);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { logError } from \"../utils/errors\";\nimport { upgradeHandler } from \"../utils\";\nimport { ObeliskConfig, loadConfig, ValueType } from \"@0xobelisk/sui-common\";\n\ntype Options = {\n network: any;\n configPath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"upgrade\",\n\n describe: \"Upgrade your move contracts\",\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: \"string\",\n choices: [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"],\n desc: \"Network of the node (mainnet/testnet/devnet/localnet)\",\n },\n configPath: {\n type: \"string\",\n default: \"obelisk.config.ts\",\n decs: \"Path to the config file\",\n },\n });\n },\n\n async handler({ network, configPath }) {\n try {\n const obeliskConfig = (await loadConfig(configPath)) as ObeliskConfig;\n\n let schemaNames = Object.keys(obeliskConfig.schemas).filter(\n (key) =>\n !(\n typeof obeliskConfig.schemas === \"object\" &&\n \"ephemeral\" in obeliskConfig.schemas &&\n (obeliskConfig.schemas[key] as ValueType).ephemeral\n )\n );\n\n await upgradeHandler(obeliskConfig.name, network, schemaNames);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\ntype Options = {\n packagePath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"test\",\n\n describe: \"Run tests in Obelisk contracts\",\n\n builder(yargs) {\n return yargs.options({\n packagePath: {\n type: \"string\",\n default: \".\",\n description: \"Options to pass to forge test\",\n },\n });\n },\n\n async handler({ packagePath }) {\n // Start an internal anvil process if no world address is provided\n try {\n execSync(`sui move test --path ${packagePath}`, {\n encoding: \"utf-8\",\n });\n } catch (error: any) {\n console.error(chalk.red(\"Error executing sui move test:\"));\n console.log(error.stdout);\n process.exit(0);\n }\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { printObelisk } from \"../utils\";\n\nconst commandModule: CommandModule = {\n command: \"hello\",\n\n describe: \"hello, obelisk\",\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n printObelisk();\n },\n};\n\nexport default commandModule;\n","import { CommandModule } from \"yargs\";\n\nimport localnode from \"./localnode\";\nimport faucet from \"./faucet\";\nimport schemagen from \"./schemagen\";\nimport publish from \"./publish\";\nimport upgrade from \"./upgrade\";\nimport test from \"./test\";\nimport hello from \"./hello\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Each command has different options\nexport const commands: CommandModule<any, any>[] = [\n publish,\n localnode,\n faucet,\n schemagen,\n upgrade,\n test,\n hello,\n];\n"],"mappings":";AAEA,OAAOA,OAAW,QAClB,OAAS,WAAAC,OAAe,gBCFxB,OAAS,SAAAC,OAAa,QAEtB,IAAMC,GAA+B,CACnC,QAAS,YAET,SAAU,yCAEV,QAAQC,EAAO,CACb,OAAOA,CACT,EAEA,MAAM,SAAU,CACd,QAAQ,IAAI,4BAA4B,EAExC,QAAQ,IAAI,6BAA6B,EACzC,IAAMC,EAAQH,GAAM,oBAAoB,EAExC,QAAQ,GAAG,SAAU,IAAM,CACzB,QAAQ,IAAI;AAAA,8CAAiD,EAC7DG,EAAM,KAAK,EACX,QAAQ,KAAK,CACf,CAAC,EACD,MAAMA,CACR,CACF,EAEOC,EAAQH,GC1Bf,OAAS,0BAAAI,GAAwB,iBAAAC,OAAqB,wBAEtD,OAAS,kBAAAC,OAAsB,kCAE/B,OACE,aAAAC,GACA,kBAAAC,OAEK,wBCTP,OAAS,oBAAAC,MAAwB,8BACjC,OAAS,kBAAAC,OAAsB,kCAC/B,OACE,kBAAAC,GACA,aAAAC,OAEK,wBACP,OAAS,YAAAC,OAAgB,gBACzB,OAAOC,MAAW,QCRlB,OAAOC,MAAW,QAClB,OAAS,YAAAC,OAAgB,MACzB,OAAS,gBAAAC,GAAc,mBAAAC,OAAuB,uBAEvC,IAAMC,EAAN,cAAoC,KAAM,CAC/C,KAAO,wBACP,QAAU,sCACZ,EAEaC,EAAN,cAA8B,KAAM,CACzC,KAAO,iBACT,EAEaC,EAAN,cAA2B,KAAM,CACtC,KAAO,cACT,EAEaC,EAAN,cAAyB,KAAM,CACpC,KAAO,YACT,EAEO,SAASC,EAASC,EAAgB,CACvC,GAAIA,aAAiBN,GACnB,QAAQ,IAAIH,EAAM,UAAUS,EAAM,OAAO,CAAC,UACjCA,aAAiBR,GAAU,CAEpC,IAAMS,EAAkBR,GAAaO,EAAO,CAC1C,gBAAiB;AAAA,IACjB,eAAgB;AAAA,GAClB,CAAC,EACD,QAAQ,IAAIT,EAAM,UAAUU,EAAgB,OAAO,CAAC,OAC3CD,aAAiBL,GAC1B,QAAQ,IAAIJ,EAAM,IAAIS,EAAM,OAAO,CAAC,EACpC,QAAQ,IAAI,EAAE,EAEd,QAAQ,IACNT,EAAM,KACJ,wFACF,CACF,GACSS,aAAiBJ,EAC1B,QAAQ,IAAIL,EAAM,IAAIS,CAAK,CAAC,EAE5B,QAAQ,IAAIA,CAAK,CAErB,CC7CA,UAAYE,MAAa,cACzB,OAAS,aAAAC,GAAW,iBAAAC,OAAqB,KACzC,OAAS,WAAAC,OAAe,OAajB,SAASC,EAAmBC,EAAsC,CACvE,GAAIA,EAAW,WAAW,IAAI,EAAG,CAC/B,IAAMC,EAAqBD,EAAW,MAAM,CAAC,EAC7C,OAAIC,EAAmB,SAAW,GACzBA,EAEA,OAGT,QAAID,EAAW,SAAW,GACjBA,EAEA,EAGb,CAEA,eAAsBE,EACpBC,EACAC,EACA,CACA,GAAI,CACF,IAAMC,EAAW,GAAGF,mCAIdG,GAHO,MAAc,WAASD,EAAU,MAAM,GAG3B,QACvB,4BACA,wBAAwBD,IAC1B,EAGAG,EAAYD,EAAaD,EAAU,wBAAwB,CAC7D,MAAE,CACA,MAAM,IAAIG,EAAW,2BAA2B,CAClD,CACF,CAEA,eAAeC,EAAkBN,EAAqBO,EAAiB,CACrE,GAAI,CACF,IAAMC,EAAO,MAAc,WACzB,GAAGR,kBAA4BO,gBAC/B,MACF,EACA,OAAO,KAAK,MAAMC,CAAI,CACxB,MAAE,CACA,MAAM,IAAIH,EAAW,iCAAiC,CACxD,CACF,CAEA,eAAsBI,EACpBT,EACAO,EACiB,CAEjB,OADmB,MAAMD,EAAkBN,EAAaO,CAAO,GAC7C,OACpB,CAUA,eAAsBG,EACpBC,EACAC,EACiB,CAEjB,OADmB,MAAMC,EAAkBF,EAAaC,CAAO,GAC7C,SACpB,CAEA,eAAsBE,EACpBH,EACAC,EACiB,CAEjB,OADmB,MAAMC,EAAkBF,EAAaC,CAAO,GAC7C,OACpB,CAEA,eAAsBG,EACpBJ,EACAC,EACiB,CAEjB,OADmB,MAAMC,EAAkBF,EAAaC,CAAO,GAC7C,UACpB,CAEA,eAAsBI,EAClBL,EACAC,EACe,CAEjB,OADmB,MAAMC,EAAkBF,EAAaC,CAAO,GAC7C,QACpB,CAEO,SAASK,EACdC,EACAN,EACAO,EACAC,EACAC,EACAC,EACAC,EACA,CACA,IAAMC,EAAqC,CACzC,YAAAN,EACA,QAAAN,EACA,UAAAO,EACA,QAAAC,EACA,WAAAC,EACA,SAAAC,EACA,QAAAC,CACF,EAEME,EAAO,QAAQ,IAAI,EACnBC,EAAsB,KAAK,UAAUF,EAAgB,KAAM,CAAC,EAClEG,EACED,EACA,GAAGD,eAAkBP,kBAA4BN,gBACjD,mBACF,CACF,CAEA,eAAsBe,EACpBC,EACAC,EACAC,EACe,CACfC,GAAUC,GAAQH,CAAc,EAAG,CAAE,UAAW,EAAK,CAAC,EAEtDI,GAAcJ,EAAgBD,CAAM,EAChCE,IAAc,QAChB,QAAQ,IAAI,GAAGA,MAAcD,GAAgB,CAEjD,CFxIA,eAAsBK,EACpBC,EACAC,EACA,CAEA,IAAMC,EAAc,GADP,QAAQ,IAAI,eACgBF,IAEnCG,EAAa,QAAQ,IAAI,YAC/B,GAAI,CAACA,EACH,MAAM,IAAIC,EACR;AAAA;AAAA,gEAGF,EAEF,IAAMC,EAAmBC,EAAmBH,CAAU,EACtD,GAAIE,IAAqB,GACvB,MAAM,IAAID,EAAgB,+BAA+B,EAE3D,IAAMG,EAAgB,OAAO,KAAKF,EAA4B,KAAK,EAC7DG,EAAUC,GAAe,cAAcF,CAAa,EACpDG,EAAS,IAAIC,GAAU,CAC3B,IAAKC,GAAeX,CAAO,CAC7B,CAAC,EAGD,MAAMY,EAAoBX,EAAa,GAAG,EAC1C,IAAIY,EAAcC,EAClB,GAAI,CACF,GAAM,CAAE,QAASC,EAAkB,aAAcC,CAAsB,EACrE,KAAK,MACHC,GACE,mDAAmDhB,IACnD,CACE,SAAU,OACZ,CACF,CACF,EACFY,EAAUE,EACVD,EAAeE,CACjB,OAASE,EAAP,CACA,QAAQ,MAAMC,EAAM,IAAI,iCAAiC,CAAC,EAC1D,QAAQ,MAAMD,EAAM,MAAM,EAC1B,QAAQ,KAAK,CAAC,CAChB,CAEA,QAAQ,IAAIC,EAAM,KAAK,YAAYZ,EAAQ,aAAa,GAAG,CAAC,EAE5D,IAAMa,EAAK,IAAIC,EACT,CAACC,CAAU,EAAIF,EAAG,QAAQ,CAC9B,QAAAP,EACA,aAAAC,CACF,CAAC,EACDM,EAAG,gBACD,CAACE,CAAU,EACXF,EAAG,KAAKb,EAAQ,aAAa,EAAE,aAAa,CAAC,CAC/C,EAEA,IAAIgB,EACJ,GAAI,CACFA,EAAS,MAAMd,EAAO,+BAA+B,CACnD,OAAQF,EACR,iBAAkBa,EAClB,QAAS,CACP,kBAAmB,EACrB,CACF,CAAC,CACH,OAASF,EAAP,CACA,QAAQ,MAAMC,EAAM,IAAI,6CAA6C,CAAC,EACtE,QAAQ,MAAMD,EAAM,OAAO,EAC3B,QAAQ,KAAK,CAAC,CAChB,CAEIK,EAAO,SAAS,OAAO,SAAW,YACpC,QAAQ,IAAIJ,EAAM,IAAI,6CAA6C,CAAC,EACpE,QAAQ,KAAK,CAAC,GAGhB,IAAIK,EAAU,EACVC,EAAY,GACZC,EAAU,GACVC,EAAe,GACfC,EAAa,GACjBL,EAAO,cAAe,IAAKM,GAAW,CAChCA,EAAO,OAAS,cAClB,QAAQ,IAAIV,EAAM,KAAK,GAAGpB,gBAAmB8B,EAAO,WAAW,CAAC,EAChEJ,EAAYI,EAAO,WAGnBA,EAAO,OAAS,WAChBA,EAAO,WAAW,SAAS,gBAAgB,IAE3C,QAAQ,IAAIV,EAAM,KAAK,GAAGpB,cAAiB8B,EAAO,UAAU,CAAC,EAC7DH,EAAUG,EAAO,UAGjBA,EAAO,OAAS,WAChBA,EAAO,aAAe,6BAEtB,QAAQ,IAAIV,EAAM,KAAK,GAAGpB,iBAAoB8B,EAAO,UAAU,CAAC,EAChEF,EAAeE,EAAO,UAGtBA,EAAO,OAAS,WAChBA,EAAO,WAAW,SAAS,mBAAmB,IAE9C,QAAQ,IAAIV,EAAM,KAAK,GAAGpB,iBAAoB8B,EAAO,UAAU,CAAC,EAChED,EAAaC,EAAO,SAExB,CAAC,EAED,QAAQ,IAAIV,EAAM,MAAM,+BAA+BI,EAAO,QAAQ,CAAC,EAEvEO,EACE/B,EACAC,EACAyB,EACAC,EACAC,EACAC,EACAJ,CACF,EAEA,QAAQ,IAAI,4BAA4B,EAGxC,MAFeO,GACb,IAAI,QAASC,GAAY,WAAWA,EAASD,CAAE,CAAC,GACtC,GAAI,EAEhB,IAAME,EAAe,IAAIZ,EAEzBY,EAAa,SAAS,CACpB,OAAQ,GAAGR,sBACX,UAAW,CAACQ,EAAa,OAAOP,CAAO,EAAGO,EAAa,OAAOL,CAAU,CAAC,CAC3E,CAAC,EAED,IAAIM,EACJ,GAAI,CACFA,EAAmB,MAAMzB,EAAO,+BAA+B,CAC7D,OAAQF,EACR,iBAAkB0B,EAClB,QAAS,CACP,YAAa,EACf,CACF,CAAC,CACH,OAASf,EAAP,CACA,QAAQ,MACNC,EAAM,IACJ,kFACF,CACF,EACA,QAAQ,MAAMD,EAAM,OAAO,EAC3B,QAAQ,KAAK,CAAC,CAChB,CAEIgB,EAAiB,SAAS,OAAO,SAAW,UAC9C,QAAQ,IACNf,EAAM,MACJ,iFAAiFe,EAAiB,QACpG,CACF,EAEA,QAAQ,IACNf,EAAM,OACJ,kFACF,CACF,CAEJ,CGvLA,OAAS,oBAAAgB,EAAkB,iBAAAC,OAAqB,8BAChD,OAAS,kBAAAC,OAAsB,kCAC/B,OAAS,kBAAAC,GAAgB,aAAAC,OAAiB,wBAC1C,OAAS,YAAAC,OAAgB,gBACzB,OAAOC,MAAW,QAoBlB,eAAsBC,GACpBC,EACAC,EACAC,EACA,CACA,IAAMC,EAAO,QAAQ,IAAI,EACnBC,EAAc,GAAGD,eAAkBH,IACnCK,EAAa,QAAQ,IAAI,YAC/B,GAAI,CAACA,EACH,MAAM,IAAIC,EACR;AAAA;AAAA,gEAGF,EAEF,IAAMC,EAAmBC,EAAmBH,CAAU,EACtD,GAAIE,IAAqB,GACvB,MAAM,IAAID,EAAgB,+BAA+B,EAE3D,IAAMG,EAAgB,OAAO,KAAKF,EAA4B,KAAK,EAC7DG,EAAUC,GAAe,cAAcF,CAAa,EAEpDG,EAAS,IAAIC,GAAU,CAC3B,IAAKC,GAAeb,CAAO,CAC7B,CAAC,EAEGc,EAAa,OAAO,MAAMC,EAAWZ,EAAaH,CAAO,CAAC,EAC1DgB,EAAe,MAAMC,EAAgBd,EAAaH,CAAO,EACzDkB,EAAU,MAAMC,EAAWhB,EAAaH,CAAO,EAC/CoB,EAAa,MAAMC,EAAclB,EAAaH,CAAO,EACrDsB,EAAW,MAAMC,EAAYpB,EAAaH,CAAO,EAE/CwB,EAAaV,EAAa,EAChC,MAAMW,EAAoBtB,EAAaqB,EAAW,SAAS,CAAC,EAE5D,GAAI,CACF,IAAIE,EAAcC,EAAmBC,EACrC,GAAI,CACF,GAAM,CACJ,QAASC,EACT,aAAcC,EACd,OAAQC,EACV,EAAI,KAAK,MACPC,GACE,mDAAmD9B,eAAkBH,IACrE,CACE,SAAU,OACZ,CACF,CACF,EAEA2B,EAAUG,EACVF,EAAeG,EACfF,EAASG,EACX,OAASE,EAAP,CACA,MAAM,IAAIC,EAAaD,EAAM,MAAM,CACrC,CAEA,IAAME,EAAK,IAAIC,EACTC,EAASF,EAAG,SAAS,CACzB,OAAQ,kCACR,UAAW,CACTA,EAAG,OAAOf,CAAU,EACpBe,EAAG,KAAKG,GAAc,UAAU,EAChCH,EAAG,KAAKP,CAAM,CAChB,CACF,CAAC,EAEKW,EAAUJ,EAAG,QAAQ,CACzB,QAAAT,EACA,aAAAC,EACA,UAAWX,EACX,OAAAqB,CACF,CAAC,EAEDF,EAAG,SAAS,CACV,OAAQ,+BACR,UAAW,CAACA,EAAG,OAAOf,CAAU,EAAGmB,CAAO,CAC5C,CAAC,EAEDJ,EAAG,gBACD,CAACA,EAAG,OAAOf,CAAU,CAAC,EACtBe,EAAG,KAAK1B,EAAQ,aAAa,EAAE,aAAa,CAAC,CAC/C,EAEA,IAAM+B,EAAS,MAAM7B,EAAO,+BAA+B,CACzD,OAAQF,EACR,iBAAkB0B,EAClB,QAAS,CACP,kBAAmB,EACrB,CACF,CAAC,EAED,QAAQ,IAAI,EAAE,EACd,QAAQ,IAAI,GAAGpC,cAAiBmB,GAAS,EAEzC,IAAIuB,EAAe,GACfC,EAAgB,GACpBF,EAAO,cAAe,IAAKG,GAAW,CAChCA,EAAO,OAAS,cAClB,QAAQ,IAAIC,EAAM,KAAK,GAAG7C,gBAAmB4C,EAAO,WAAW,CAAC,EAChEF,EAAeE,EAAO,WAGtBA,EAAO,OAAS,WAChBA,EAAO,aAAe,6BAEtB,QAAQ,IAAIC,EAAM,KAAK,GAAG7C,iBAAoB4C,EAAO,UAAU,CAAC,EAChED,EAAgBC,EAAO,SAE3B,CAAC,EAED,QAAQ,IAAIC,EAAM,MAAM,+BAA+BJ,EAAO,QAAQ,CAAC,EAEvEK,EACE9C,EACAC,EACAyC,EACAvB,EACAwB,EACApB,EACAE,CACF,EAEAR,EAAeyB,EACfrB,EAAasB,EACb5B,EAAaU,EAEb,QAAQ,IAAI;AAAA,wBAA2B,EAGvC,MAFesB,GACb,IAAI,QAASC,GAAY,WAAWA,EAASD,CAAE,CAAC,GACtC,GAAI,EAEhB,IAAME,EAAY,IAAIZ,EACtBY,EAAU,SAAS,CACjB,OAAQ,GAAGP,oBACX,UAAW,CAACO,EAAU,OAAO9B,CAAO,EAAG8B,EAAU,OAAO1B,CAAQ,CAAC,CACnE,CAAC,EAWD,IAAI2B,GATiB,MAAMtC,EAAO,UAAU,CAC1C,GAAIO,EACJ,QAAS,CACP,YAAa,GACb,YAAa,GACb,SAAU,GACV,UAAW,EACb,CACF,CAAC,GACqC,KAAM,QAEtCgC,EAAyBjD,EAAY,OACxCkD,GAAS,CAACF,EAAiB,OAAO,aAAgB,SAASE,CAAI,CAClE,EAEA,QAAQ,IAAI,cAAeD,CAAY,EACvC,IAAIE,EAAqB,CAAC,EAC1B,QAAWC,KAAaH,EACtBF,EAAU,SAAS,CACjB,OAAQ,GAAGP,MAAiBY,qBAC5B,UAAW,CAACL,EAAU,OAAO9B,CAAO,EAAG8B,EAAU,OAAO1B,CAAQ,CAAC,CACnE,CAAC,EACD8B,EAAmB,KAAK,GAAGC,UAAkB,GAEzB,MAAM1C,EAAO,+BAA+B,CAChE,OAAQF,EACR,iBAAkBuC,EAClB,QAAS,CACP,YAAa,EACf,CACF,CAAC,GAEiB,SAAS,OAAO,SAAW,WAC3C,QAAQ,IACNJ,EAAM,MACJ,GAAG7C,kDAAqDkD,EAAiB,OAAO,+BAAkCzB,GACpH,CACF,EACI4B,EAAmB,SAAW,GAChC,QAAQ,IACNR,EAAM,MACJ,eAAeQ,EAAmB,SAAS,qBAC7C,CACF,EAGF,QAAQ,IACNR,EAAM,KACJ;AAAA,EAAK7C,sBAAyBkD,EAAiB,OAAO,cACxD,CACF,GAEA,QAAQ,IACNL,EAAM,IACJ,GAAG7C,6CAAgDkD,EAAiB,OAAO,+BAAkCzB,GAC/G,CACF,CAEJ,OAASS,EAAP,CACA,QAAQ,IAAIW,EAAM,IAAI,iBAAiB,CAAC,EACxC,QAAQ,MAAMX,EAAM,OAAO,EAE3BY,EACE9C,EACAC,EACAgB,EACAE,EACAE,EACAE,EACAR,CACF,EACA,MAAMW,EAAoBtB,EAAaW,EAAW,SAAS,CAAC,CAC9D,CACF,CC5OA,OAAOwC,OAAW,QAEX,SAASC,IAAe,CAC7B,QAAQ,IACND,GAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAahB,CACC,CACF,CLFA,IAAME,GAAiD,CACrD,QAAS,SAET,SAAU,iCAEV,QAAQC,EAAO,CACb,OAAOA,EAAM,QAAQ,CACnB,QAAS,CACP,KAAM,SACN,KAAM,4BACN,QAAS,CAAC,UAAW,SAAU,UAAU,EACzC,QAAS,UACX,EACA,UAAW,CACT,KAAM,SACN,KAAM,qBACR,CACF,CAAC,CACH,EAEA,MAAM,QAAQ,CAAE,QAAAC,EAAS,UAAAC,CAAU,EAAG,CACpC,IAAIC,EAAiB,GACrB,GAAID,IAAc,OAAW,CAC3B,IAAME,EAAa,QAAQ,IAAI,YAC/B,GAAI,CAACA,EACH,MAAM,IAAIC,EACR;AAAA;AAAA,oEAGF,EAEF,IAAMC,EAAmBC,EAAmBH,CAAU,EACtD,GAAIE,IAAqB,GACvB,MAAM,IAAID,EAAgB,+BAA+B,EAE3D,IAAMG,EAAgB,OAAO,KAAKF,EAA4B,KAAK,EAEnEH,EADgBM,GAAe,cAAcD,CAAa,EACjC,aAAa,OAEtCL,EAAiBD,EAEnB,MAAMQ,GAAuB,CAC3B,KAAMC,GAAcV,CAAO,EAC3B,UAAWE,CACb,CAAC,EACD,IAAMS,EAAS,IAAIC,GAAU,CAAE,IAAKC,GAAeb,CAAO,CAAE,CAAC,EACzDc,EAAS,CACX,MAAOZ,CACT,EACA,QAAQ,IAAI,YAAYA,GAAgB,EACxC,QAAQ,IAAI,MAAMS,EAAO,WAAWG,CAAM,CAAC,EAC3C,QAAQ,KAAK,CAAC,CAChB,CACF,EAEOC,GAAQjB,GMvEf,OAAS,YAAAkB,GAAU,cAAAC,OAAiC,wBACpD,OAAOC,OAAW,QAMlB,IAAMC,GAAiD,CACrD,QAAS,yBAET,SAAU,wDAEV,QAAQC,EAAO,CACb,OAAOA,EAAM,QAAQ,CACnB,WAAY,CAAE,KAAM,SAAU,KAAM,yBAA0B,CAChE,CAAC,CACH,EAEA,MAAM,QAAQ,CAAE,WAAAC,CAAW,EAAG,CAC5B,GAAI,CACF,IAAMC,EAAiB,MAAML,GAAWI,CAAU,EAClDL,GAASM,CAAa,EACtB,QAAQ,KAAK,CAAC,CAChB,OAASC,EAAP,CACA,QAAQ,IAAIL,GAAM,IAAI,mBAAmB,CAAC,EAC1C,QAAQ,MAAMK,EAAM,OAAO,CAC7B,CACF,CACF,EAEOC,GAAQL,GC5Bf,OAAS,cAAAM,OAAiC,wBAO1C,IAAMC,GAAiD,CACrD,QAAS,UAET,SAAU,iCAEV,QAAQC,EAAO,CACb,OAAOA,EAAM,QAAQ,CACnB,QAAS,CACP,KAAM,SACN,QAAS,CAAC,UAAW,UAAW,SAAU,UAAU,EACpD,KAAM,uDACR,EACA,WAAY,CACV,KAAM,SACN,QAAS,oBACT,KAAM,yBACR,CACF,CAAC,CACH,EAEA,MAAM,QAAQ,CAAE,QAAAC,EAAS,WAAAC,CAAW,EAAG,CACrC,GAAI,CACF,IAAMC,EAAiB,MAAML,GAAWI,CAAU,EAClD,MAAME,EAAeD,EAAc,KAAMF,CAAO,CAClD,OAASI,EAAP,CACAC,EAASD,CAAK,EACd,QAAQ,KAAK,CAAC,CAChB,CACA,QAAQ,KAAK,CAAC,CAChB,CACF,EAEOE,GAAQR,GCvCf,OAAwB,cAAAS,OAA6B,wBAOrD,IAAMC,GAAiD,CACrD,QAAS,UAET,SAAU,8BAEV,QAAQC,EAAO,CACb,OAAOA,EAAM,QAAQ,CACnB,QAAS,CACP,KAAM,SACN,QAAS,CAAC,UAAW,UAAW,SAAU,UAAU,EACpD,KAAM,uDACR,EACA,WAAY,CACV,KAAM,SACN,QAAS,oBACT,KAAM,yBACR,CACF,CAAC,CACH,EAEA,MAAM,QAAQ,CAAE,QAAAC,EAAS,WAAAC,CAAW,EAAG,CACrC,GAAI,CACF,IAAMC,EAAiB,MAAML,GAAWI,CAAU,EAE9CE,EAAc,OAAO,KAAKD,EAAc,OAAO,EAAE,OAClDE,GACC,EACE,OAAOF,EAAc,SAAY,UACjC,cAAeA,EAAc,SAC5BA,EAAc,QAAQE,CAAG,EAAgB,UAEhD,EAEA,MAAMC,GAAeH,EAAc,KAAMF,EAASG,CAAW,CAC/D,OAASG,EAAP,CACAC,EAASD,CAAK,EACd,QAAQ,KAAK,CAAC,CAChB,CACA,QAAQ,KAAK,CAAC,CAChB,CACF,EAEOE,GAAQV,GCnDf,OAAS,YAAAW,OAAgB,gBACzB,OAAOC,OAAW,QAMlB,IAAMC,GAAiD,CACrD,QAAS,OAET,SAAU,iCAEV,QAAQC,EAAO,CACb,OAAOA,EAAM,QAAQ,CACnB,YAAa,CACX,KAAM,SACN,QAAS,IACT,YAAa,+BACf,CACF,CAAC,CACH,EAEA,MAAM,QAAQ,CAAE,YAAAC,CAAY,EAAG,CAE7B,GAAI,CACFJ,GAAS,wBAAwBI,IAAe,CAC9C,SAAU,OACZ,CAAC,CACH,OAASC,EAAP,CACA,QAAQ,MAAMJ,GAAM,IAAI,gCAAgC,CAAC,EACzD,QAAQ,IAAII,EAAM,MAAM,EACxB,QAAQ,KAAK,CAAC,CAChB,CACF,CACF,EAEOC,GAAQJ,GClCf,IAAMK,GAA+B,CACnC,QAAS,QAET,SAAU,iBAEV,QAAQC,EAAO,CACb,OAAOA,CACT,EAEA,MAAM,SAAU,CACdC,GAAa,CACf,CACF,EAEOC,GAAQH,GCNR,IAAMI,GAAsC,CACjDC,GACAC,EACAC,GACAC,GACAC,GACAC,GACAC,EACF,EbXA,UAAYC,OAAY,SACxB,OAAOC,OAAW,QACX,UAAO,EAEdC,GAAMC,GAAQ,QAAQ,IAAI,CAAC,EAExB,WAAW,SAAS,EAGpB,QAAQC,EAAe,EAEvB,OAAO,EAEP,KAAK,CAACC,EAAKC,IAAQ,CAClB,QAAQ,MAAML,GAAM,IAAII,CAAG,CAAC,EACxBA,EAAI,SAAS,2BAA2B,GAC1C,QAAQ,IACNJ,GAAM,OAAO,qBAAqB,QAAQ,KAAK,CAAC,2DAA2D,CAC7G,EAEF,QAAQ,IAAI,EAAE,EACdM,EAASD,CAAG,EACZ,QAAQ,IAAI,EAAE,EAEd,QAAQ,KAAK,CAAC,CAChB,CAAC,EAEA,MAAM,CAAE,EAAG,MAAO,CAAC,EAAE","names":["yargs","hideBin","execa","commandModule","yargs","child","localnode_default","requestSuiFromFaucetV0","getFaucetHost","Ed25519Keypair","SuiClient","getFullnodeUrl","TransactionBlock","Ed25519Keypair","getFullnodeUrl","SuiClient","execSync","chalk","chalk","ZodError","fromZodError","ValidationError","NotInsideProjectError","ObeliskCliError","UpgradeError","FsIibError","logError","error","validationError","fsAsync","mkdirSync","writeFileSync","dirname","validatePrivateKey","privateKey","strippedPrivateKey","updateVersionInFile","projectPath","newVersion","filePath","updatedData","writeOutput","FsIibError","getDeploymentJson","network","data","getVersion","getOldPackageId","projectPath","network","getDeploymentJson","getWorldId","getUpgradeCap","getAdminCap","saveContractData","projectName","packageId","worldId","upgradeCap","adminCap","version","DeploymentData","path","storeDeploymentData","writeOutput","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","publishHandler","name","network","projectPath","privateKey","ObeliskCliError","privateKeyFormat","validatePrivateKey","privateKeyRaw","keypair","Ed25519Keypair","client","SuiClient","getFullnodeUrl","updateVersionInFile","modules","dependencies","extractedModules","extractedDependencies","execSync","error","chalk","tx","TransactionBlock","upgradeCap","result","version","packageId","worldId","upgradeCapId","adminCapId","object","saveContractData","ms","resolve","deployHookTx","deployHookResult","TransactionBlock","UpgradePolicy","Ed25519Keypair","getFullnodeUrl","SuiClient","execSync","chalk","upgradeHandler","name","network","schemaNames","path","projectPath","privateKey","ObeliskCliError","privateKeyFormat","validatePrivateKey","privateKeyRaw","keypair","Ed25519Keypair","client","SuiClient","getFullnodeUrl","oldVersion","getVersion","oldPackageId","getOldPackageId","worldId","getWorldId","upgradeCap","getUpgradeCap","adminCap","getAdminCap","newVersion","updateVersionInFile","modules","dependencies","digest","extractedModules","extractedDependencies","extractedDigest","execSync","error","UpgradeError","tx","TransactionBlock","ticket","UpgradePolicy","receipt","result","newPackageId","newUpgradeCap","object","chalk","saveContractData","ms","resolve","migrateTx","newObjectContent","uniqueSchema","item","needRegisterSchema","newSchema","chalk","printObelisk","commandModule","yargs","network","recipient","faucet_address","privateKey","ObeliskCliError","privateKeyFormat","validatePrivateKey","privateKeyRaw","Ed25519Keypair","requestSuiFromFaucetV0","getFaucetHost","client","SuiClient","getFullnodeUrl","params","faucet_default","worldgen","loadConfig","chalk","commandModule","yargs","configPath","obeliskConfig","error","schemagen_default","loadConfig","commandModule","yargs","network","configPath","obeliskConfig","publishHandler","error","logError","publish_default","loadConfig","commandModule","yargs","network","configPath","obeliskConfig","schemaNames","key","upgradeHandler","error","logError","upgrade_default","execSync","chalk","commandModule","yargs","packagePath","error","test_default","commandModule","yargs","printObelisk","hello_default","commands","publish_default","localnode_default","faucet_default","schemagen_default","upgrade_default","test_default","hello_default","dotenv","chalk","yargs","hideBin","commands","msg","err","logError"]}
|
|
1
|
+
{"version":3,"sources":["../src/obelisk.ts","../src/commands/localnode.ts","../src/commands/faucet.ts","../src/utils/publishHandler.ts","../src/utils/errors.ts","../src/utils/utils.ts","../src/utils/upgradeHandler.ts","../src/utils/printObelisk.ts","../src/commands/schemagen.ts","../src/commands/publish.ts","../src/commands/upgrade.ts","../src/commands/test.ts","../src/commands/hello.ts","../src/commands/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { commands } from \"./commands\";\nimport { logError } from \"./utils/errors\";\n\n// Load .env file into process.env\nimport * as dotenv from \"dotenv\";\nimport chalk from \"chalk\";\ndotenv.config();\n\nyargs(hideBin(process.argv))\n // Explicit name to display in help (by default it's the entry file, which may not be \"obelisk\" for e.g. ts-node)\n .scriptName(\"obelisk\")\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 obelisk ${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 type { CommandModule } from \"yargs\";\nimport { execa } from \"execa\";\n\nconst commandModule: CommandModule = {\n command: \"localnode\",\n\n describe: \"Start a local Sui node for development\",\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n console.log(\"Clearing localnode history\");\n\n console.log(`Running: sui-test-validator`);\n const child = execa(\"sui-test-validator\");\n\n process.on(\"SIGINT\", () => {\n console.log(\"\\ngracefully shutting down from SIGINT (Crtl-C)\");\n child.kill();\n process.exit();\n });\n await child;\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { requestSuiFromFaucetV0, getFaucetHost } from \"@mysten/sui.js/faucet\";\n\nimport { Ed25519Keypair } from \"@mysten/sui.js/keypairs/ed25519\";\n\nimport {\n SuiClient,\n getFullnodeUrl,\n GetBalanceParams,\n} from \"@mysten/sui.js/client\";\nimport { validatePrivateKey, ObeliskCliError } from \"../utils\";\n\ntype Options = {\n network: any;\n recipient?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"faucet\",\n\n describe: \"Interact with a Obelisk faucet\",\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: \"string\",\n desc: \"URL of the Obelisk faucet\",\n choices: [\"testnet\", \"devnet\", \"localnet\"],\n default: \"localnet\",\n },\n recipient: {\n type: \"string\",\n desc: \"Sui address to fund\",\n },\n });\n },\n\n async handler({ network, recipient }) {\n let faucet_address = \"\";\n if (recipient === undefined) {\n const privateKey = process.env.PRIVATE_KEY;\n if (!privateKey)\n throw new ObeliskCliError(\n `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 );\n\n const privateKeyFormat = validatePrivateKey(privateKey);\n if (privateKeyFormat === false) {\n throw new ObeliskCliError(`Please check your privateKey.`);\n }\n const privateKeyRaw = Buffer.from(privateKeyFormat as string, \"hex\");\n const keypair = Ed25519Keypair.fromSecretKey(privateKeyRaw);\n faucet_address = keypair.toSuiAddress();\n } else {\n faucet_address = recipient;\n }\n await requestSuiFromFaucetV0({\n host: getFaucetHost(network),\n recipient: faucet_address,\n });\n const client = new SuiClient({ url: getFullnodeUrl(network) });\n let params = {\n owner: faucet_address,\n } as GetBalanceParams;\n console.log(`Account: ${faucet_address}`);\n console.log(await client.getBalance(params));\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import { TransactionBlock } from \"@mysten/sui.js/transactions\";\nimport { Ed25519Keypair } from \"@mysten/sui.js/keypairs/ed25519\";\nimport {\n getFullnodeUrl,\n SuiClient,\n SuiTransactionBlockResponse,\n} from \"@mysten/sui.js/client\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport { ObeliskCliError } from \"./errors\";\nimport {\n updateVersionInFile,\n saveContractData,\n validatePrivateKey,\n} from \"./utils\";\n\nexport async function publishHandler(\n name: string,\n network: \"mainnet\" | \"testnet\" | \"devnet\" | \"localnet\"\n) {\n const path = process.cwd();\n const projectPath = `${path}/contracts/${name}`;\n\n const privateKey = process.env.PRIVATE_KEY;\n if (!privateKey)\n throw new ObeliskCliError(\n `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 );\n\n const privateKeyFormat = validatePrivateKey(privateKey);\n if (privateKeyFormat === false) {\n throw new ObeliskCliError(`Please check your privateKey.`);\n }\n const privateKeyRaw = Buffer.from(privateKeyFormat as string, \"hex\");\n const keypair = Ed25519Keypair.fromSecretKey(privateKeyRaw);\n const client = new SuiClient({\n url: getFullnodeUrl(network),\n });\n\n // Set version 1\n await updateVersionInFile(projectPath, \"1\");\n let modules: any, dependencies: any;\n try {\n const { modules: extractedModules, dependencies: extractedDependencies } =\n JSON.parse(\n execSync(\n `sui move build --dump-bytecode-as-base64 --path ${projectPath}`,\n {\n encoding: \"utf-8\",\n }\n )\n );\n modules = extractedModules;\n dependencies = extractedDependencies;\n } catch (error: any) {\n console.error(chalk.red(\"Error executing sui move build:\"));\n console.error(error.stdout);\n process.exit(1); // You might want to exit with a non-zero status code to indicate an error\n }\n\n console.log(chalk.blue(`Account: ${keypair.toSuiAddress()}`));\n\n const tx = new TransactionBlock();\n const [upgradeCap] = tx.publish({\n modules,\n dependencies,\n });\n tx.transferObjects(\n [upgradeCap],\n tx.pure(keypair.getPublicKey().toSuiAddress())\n );\n\n let result: SuiTransactionBlockResponse;\n try {\n result = await client.signAndExecuteTransactionBlock({\n signer: keypair,\n transactionBlock: tx,\n options: {\n showObjectChanges: true,\n },\n });\n } catch (error: any) {\n console.error(chalk.red(`Failed to execute publish, please republish`));\n console.error(error.message);\n process.exit(1);\n }\n\n if (result.effects?.status.status === \"failure\") {\n console.log(chalk.red(`Failed to execute publish, please republish`));\n process.exit(1);\n }\n\n let version = 1;\n let packageId = \"\";\n let worldId = \"\";\n let upgradeCapId = \"\";\n let adminCapId = \"\";\n result.objectChanges!.map((object) => {\n if (object.type === \"published\") {\n console.log(chalk.blue(`${name} PackageId: ${object.packageId}`));\n packageId = object.packageId;\n }\n if (\n object.type === \"created\" &&\n object.objectType.endsWith(\"::world::World\")\n ) {\n console.log(chalk.blue(`${name} WorldId: ${object.objectId}`));\n worldId = object.objectId;\n }\n if (\n object.type === \"created\" &&\n object.objectType === \"0x2::package::UpgradeCap\"\n ) {\n console.log(chalk.blue(`${name} UpgradeCap: ${object.objectId}`));\n upgradeCapId = object.objectId;\n }\n if (\n object.type === \"created\" &&\n object.objectType.endsWith(\"::world::AdminCap\")\n ) {\n console.log(chalk.blue(`${name} AdminCapId: ${object.objectId}`));\n adminCapId = object.objectId;\n }\n });\n\n console.log(chalk.green(`Publish transaction digest: ${result.digest}`));\n\n saveContractData(\n name,\n network,\n packageId,\n worldId,\n upgradeCapId,\n adminCapId,\n version\n );\n\n console.log(\"Executing the deployHook: \");\n const delay = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n await delay(5000);\n\n const deployHookTx = new TransactionBlock();\n\n deployHookTx.moveCall({\n target: `${packageId}::deploy_hook::run`,\n arguments: [deployHookTx.object(worldId), deployHookTx.object(adminCapId)],\n });\n\n let deployHookResult: SuiTransactionBlockResponse;\n try {\n deployHookResult = await client.signAndExecuteTransactionBlock({\n signer: keypair,\n transactionBlock: deployHookTx,\n options: {\n showEffects: true,\n },\n });\n } catch (error: any) {\n console.error(\n chalk.red(\n `Failed to execute deployHook, please republish or manually call deploy_hook::run`\n )\n );\n console.error(error.message);\n process.exit(1);\n }\n\n if (deployHookResult.effects?.status.status === \"success\") {\n console.log(\n chalk.green(\n `Successful auto-execution of deployHook, please check the transaction digest: ${deployHookResult.digest}`\n )\n );\n } else {\n console.log(\n chalk.yellow(\n `Failed to execute deployHook, please republish or manually call deploy_hook::run`\n )\n );\n }\n}\n","import chalk from \"chalk\";\nimport { ZodError } from \"zod\";\nimport { fromZodError, ValidationError } from \"zod-validation-error\";\n\nexport class NotInsideProjectError extends Error {\n name = \"NotInsideProjectError\";\n message = \"You are not inside a Obelisk project\";\n}\n\nexport class ObeliskCliError extends Error {\n name = \"ObeliskCliError\";\n}\n\nexport class UpgradeError extends Error {\n name = \"UpgradeError\";\n}\n\nexport class FsIibError extends Error {\n name = \"FsIibError\";\n}\n\nexport function logError(error: unknown) {\n if (error instanceof ValidationError) {\n console.log(chalk.redBright(error.message));\n } else if (error instanceof ZodError) {\n // TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n const validationError = fromZodError(error, {\n prefixSeparator: \"\\n- \",\n issueSeparator: \"\\n- \",\n });\n console.log(chalk.redBright(validationError.message));\n } else if (error instanceof NotInsideProjectError) {\n console.log(chalk.red(error.message));\n console.log(\"\");\n // TODO add docs to the website and update the link to the specific page\n console.log(\n chalk.blue(\n `To learn more about Obelisk's configuration, please go to https://github.com/0xobelisk`\n )\n );\n } else if (error instanceof ObeliskCliError) {\n console.log(chalk.red(error));\n } else {\n console.log(error);\n }\n}\n","import * as fsAsync from 'fs/promises';\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport {\n\tSUI_PRIVATE_KEY_PREFIX,\n\tdecodeSuiPrivateKey,\n} from '@mysten/sui.js/cryptography';\nimport { FsIibError } from './errors';\n\nexport type DeploymentJsonType = {\n\tprojectName: string;\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet';\n\tpackageId: string;\n\tworldId: string;\n\tupgradeCap: string;\n\tadminCap: string;\n\tversion: number;\n};\n\nexport function validatePrivateKey(privateKey: string): boolean | 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/codegen/eps/world.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 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 getWorldId(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<string> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.worldId;\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 getAdminCap(\n\tprojectPath: string,\n\tnetwork: string\n): Promise<string> {\n\tconst deployment = await getDeploymentJson(projectPath, network);\n\treturn deployment.adminCap;\n}\n\nexport function saveContractData(\n\tprojectName: string,\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tpackageId: string,\n\tworldId: string,\n\tupgradeCap: string,\n\tadminCap: string,\n\tversion: number\n) {\n\tconst DeploymentData: DeploymentJsonType = {\n\t\tprojectName,\n\t\tnetwork,\n\t\tpackageId,\n\t\tworldId,\n\t\tupgradeCap,\n\t\tadminCap,\n\t\tversion,\n\t};\n\n\tconst path = process.cwd();\n\tconst storeDeploymentData = JSON.stringify(DeploymentData, null, 2);\n\twriteOutput(\n\t\tstoreDeploymentData,\n\t\t`${path}/contracts/${projectName}/.history/sui_${network}/latest.json`,\n\t\t'Update deploy log'\n\t);\n}\n\nexport async function writeOutput(\n\toutput: string,\n\tfullOutputPath: string,\n\tlogPrefix?: string\n): Promise<void> {\n\tmkdirSync(dirname(fullOutputPath), { recursive: true });\n\n\twriteFileSync(fullOutputPath, output);\n\tif (logPrefix !== undefined) {\n\t\tconsole.log(`${logPrefix}: ${fullOutputPath}`);\n\t}\n}\n","import { TransactionBlock, UpgradePolicy } from \"@mysten/sui.js/transactions\";\nimport { Ed25519Keypair } from \"@mysten/sui.js/keypairs/ed25519\";\nimport { getFullnodeUrl, SuiClient } from \"@mysten/sui.js/client\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\nimport { ObeliskCliError, UpgradeError } from \"./errors\";\nimport {\n updateVersionInFile,\n getOldPackageId,\n getVersion,\n getWorldId,\n getUpgradeCap,\n saveContractData,\n validatePrivateKey,\n getAdminCap,\n} from \"./utils\";\n\ntype ObjectContent = {\n type: string;\n fields: Record<string, any>;\n hasPublicTransfer: boolean;\n dataType: string;\n};\n\nexport async function upgradeHandler(\n name: string,\n network: \"mainnet\" | \"testnet\" | \"devnet\" | \"localnet\",\n schemaNames: string[]\n) {\n const path = process.cwd();\n const projectPath = `${path}/contracts/${name}`;\n const privateKey = process.env.PRIVATE_KEY;\n if (!privateKey)\n throw new ObeliskCliError(\n `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 );\n\n const privateKeyFormat = validatePrivateKey(privateKey);\n if (privateKeyFormat === false) {\n throw new ObeliskCliError(`Please check your privateKey.`);\n }\n const privateKeyRaw = Buffer.from(privateKeyFormat as string, \"hex\");\n const keypair = Ed25519Keypair.fromSecretKey(privateKeyRaw);\n\n const client = new SuiClient({\n url: getFullnodeUrl(network),\n });\n\n let oldVersion = Number(await getVersion(projectPath, network));\n let oldPackageId = await getOldPackageId(projectPath, network);\n let worldId = await getWorldId(projectPath, network);\n let upgradeCap = await getUpgradeCap(projectPath, network);\n let adminCap = await getAdminCap(projectPath, network);\n\n const newVersion = oldVersion + 1;\n await updateVersionInFile(projectPath, newVersion.toString());\n\n try {\n let modules: any, dependencies: any, digest: any;\n try {\n const {\n modules: extractedModules,\n dependencies: extractedDependencies,\n digest: extractedDigest,\n } = JSON.parse(\n execSync(\n `sui move build --dump-bytecode-as-base64 --path ${path}/contracts/${name}`,\n {\n encoding: \"utf-8\",\n }\n )\n );\n\n modules = extractedModules;\n dependencies = extractedDependencies;\n digest = extractedDigest;\n } catch (error: any) {\n throw new UpgradeError(error.stdout);\n }\n\n const tx = new TransactionBlock();\n const ticket = tx.moveCall({\n target: \"0x2::package::authorize_upgrade\",\n arguments: [\n tx.object(upgradeCap),\n tx.pure(UpgradePolicy.COMPATIBLE),\n tx.pure(digest),\n ],\n });\n\n const receipt = tx.upgrade({\n modules,\n dependencies,\n packageId: oldPackageId,\n ticket,\n });\n\n tx.moveCall({\n target: \"0x2::package::commit_upgrade\",\n arguments: [tx.object(upgradeCap), receipt],\n });\n\n tx.transferObjects(\n [tx.object(upgradeCap)],\n tx.pure(keypair.getPublicKey().toSuiAddress())\n );\n\n const result = await client.signAndExecuteTransactionBlock({\n signer: keypair,\n transactionBlock: tx,\n options: {\n showObjectChanges: true,\n },\n });\n\n console.log(\"\");\n console.log(`${name} WorldId: ${worldId}`);\n\n let newPackageId = \"\";\n let newUpgradeCap = \"\";\n result.objectChanges!.map((object) => {\n if (object.type === \"published\") {\n console.log(chalk.blue(`${name} PackageId: ${object.packageId}`));\n newPackageId = object.packageId;\n }\n if (\n object.type === \"mutated\" &&\n object.objectType === \"0x2::package::UpgradeCap\"\n ) {\n console.log(chalk.blue(`${name} UpgradeCap: ${object.objectId}`));\n newUpgradeCap = object.objectId;\n }\n });\n\n console.log(chalk.green(`Upgrade Transaction Digest: ${result.digest}`));\n\n saveContractData(\n name,\n network,\n newPackageId,\n worldId,\n newUpgradeCap,\n adminCap,\n newVersion\n );\n\n oldPackageId = newPackageId;\n upgradeCap = newUpgradeCap;\n oldVersion = newVersion;\n\n console.log(\"\\nExecuting the migrate: \");\n const delay = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n await delay(5000);\n\n const migrateTx = new TransactionBlock();\n migrateTx.moveCall({\n target: `${newPackageId}::world::migrate`,\n arguments: [migrateTx.object(worldId), migrateTx.object(adminCap)],\n });\n\n let newWorldObject = await client.getObject({\n id: worldId,\n options: {\n showContent: true,\n showDisplay: true,\n showType: true,\n showOwner: true,\n },\n });\n let newObjectContent = newWorldObject.data!.content as ObjectContent;\n\n const uniqueSchema: string[] = schemaNames.filter(\n (item) => !newObjectContent.fields[\"schema_names\"].includes(item)\n );\n\n console.log(\"new schema:\", uniqueSchema);\n let needRegisterSchema = [];\n for (const newSchema of uniqueSchema) {\n migrateTx.moveCall({\n target: `${newPackageId}::${newSchema}_schema::register`,\n arguments: [migrateTx.object(worldId), migrateTx.object(adminCap)],\n });\n needRegisterSchema.push(`${newSchema}_schema`);\n }\n const migrateResult = await client.signAndExecuteTransactionBlock({\n signer: keypair,\n transactionBlock: migrateTx,\n options: {\n showEffects: true,\n },\n });\n\n if (migrateResult.effects?.status.status === \"success\") {\n console.log(\n chalk.green(\n `${name} migrate world success, new world version is: ${newObjectContent.fields[\"version\"]}, package version is ${newVersion}`\n )\n );\n if (needRegisterSchema.length !== 0) {\n console.log(\n chalk.green(\n `new schema: ${needRegisterSchema.toString()} register success.`\n )\n );\n }\n\n console.log(\n chalk.blue(\n `\\n${name} world schemas is ${newObjectContent.fields[\"schema_names\"]}`\n )\n );\n } else {\n console.log(\n chalk.red(\n `${name} migrate world failed, world version is: ${newObjectContent.fields[\"version\"]}, package version is ${newVersion}`\n )\n );\n }\n } catch (error: any) {\n console.log(chalk.red(\"Upgrade failed!\"));\n console.error(error.message);\n\n saveContractData(\n name,\n network,\n oldPackageId,\n worldId,\n upgradeCap,\n adminCap,\n oldVersion\n );\n await updateVersionInFile(projectPath, oldVersion.toString());\n }\n}\n","import chalk from \"chalk\";\n\nexport function printObelisk() {\n console.log(\n chalk.yellow(`\nWelcome to obelisk world\n\\t\\t\\t --from team@obelisk\n ________ ________ _______ ___ ___ ________ ___ __ \n|\\\\ __ \\\\|\\\\ __ \\\\|\\\\ ___ \\\\ |\\\\ \\\\ |\\\\ \\\\|\\\\ ____\\\\|\\\\ \\\\|\\\\ \\\\ \n\\\\ \\\\ \\\\|\\\\ \\\\ \\\\ \\\\|\\\\ /\\\\ \\\\ __/|\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\___|\\\\ \\\\ \\\\/ /|_ \n \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ __ \\\\ \\\\ \\\\_|/_\\\\ \\\\ \\\\ \\\\ \\\\ \\\\ \\\\_____ \\\\ \\\\ ___ \\\\ \n \\\\ \\\\ \\\\\\\\\\\\ \\\\ \\\\ \\\\|\\\\ \\\\ \\\\ \\\\_|\\\\ \\\\ \\\\ \\\\____\\\\ \\\\ \\\\|____|\\\\ \\\\ \\\\ \\\\\\\\ \\\\ \\\\ \n \\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\_______\\\\ \\\\__\\\\____\\\\_\\\\ \\\\ \\\\__\\\\\\\\ \\\\__\\\\\n \\\\|_______|\\\\|_______|\\\\|_______|\\\\|_______|\\\\|__|\\\\_________\\\\|__| \\\\|__|\n \\\\|_________| \n \n \n`)\n );\n}\n","import type { CommandModule } from \"yargs\";\nimport { worldgen, loadConfig, ObeliskConfig } from \"@0xobelisk/sui-common\";\nimport chalk from \"chalk\";\n\ntype Options = {\n configPath?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"schemagen <configPath>\",\n\n describe: \"Autogenerate Obelisk schemas based on the config file\",\n\n builder(yargs) {\n return yargs.options({\n configPath: { type: \"string\", desc: \"Path to the config file\" },\n });\n },\n\n async handler({ configPath }) {\n try {\n const obeliskConfig = (await loadConfig(configPath)) as ObeliskConfig;\n worldgen(obeliskConfig);\n process.exit(0);\n } catch (error: any) {\n console.log(chalk.red(\"Schemagen failed!\"));\n console.error(error.message);\n }\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { logError } from \"../utils/errors\";\nimport { publishHandler } from \"../utils\";\nimport { loadConfig, ObeliskConfig } from \"@0xobelisk/sui-common\";\n\ntype Options = {\n network: any;\n configPath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"publish\",\n\n describe: \"Publish obelisk move contracts\",\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: \"string\",\n choices: [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"],\n desc: \"Network of the node (mainnet/testnet/devnet/localnet)\",\n },\n configPath: {\n type: \"string\",\n default: \"obelisk.config.ts\",\n decs: \"Path to the config file\",\n },\n });\n },\n\n async handler({ network, configPath }) {\n try {\n const obeliskConfig = (await loadConfig(configPath)) as ObeliskConfig;\n await publishHandler(obeliskConfig.name, network);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { logError } from \"../utils/errors\";\nimport { upgradeHandler } from \"../utils\";\nimport { ObeliskConfig, loadConfig, ValueType } from \"@0xobelisk/sui-common\";\n\ntype Options = {\n network: any;\n configPath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"upgrade\",\n\n describe: \"Upgrade your move contracts\",\n\n builder(yargs) {\n return yargs.options({\n network: {\n type: \"string\",\n choices: [\"mainnet\", \"testnet\", \"devnet\", \"localnet\"],\n desc: \"Network of the node (mainnet/testnet/devnet/localnet)\",\n },\n configPath: {\n type: \"string\",\n default: \"obelisk.config.ts\",\n decs: \"Path to the config file\",\n },\n });\n },\n\n async handler({ network, configPath }) {\n try {\n const obeliskConfig = (await loadConfig(configPath)) as ObeliskConfig;\n\n let schemaNames = Object.keys(obeliskConfig.schemas).filter(\n (key) =>\n !(\n typeof obeliskConfig.schemas === \"object\" &&\n \"ephemeral\" in obeliskConfig.schemas &&\n (obeliskConfig.schemas[key] as ValueType).ephemeral\n )\n );\n\n await upgradeHandler(obeliskConfig.name, network, schemaNames);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\ntype Options = {\n packagePath: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"test\",\n\n describe: \"Run tests in Obelisk contracts\",\n\n builder(yargs) {\n return yargs.options({\n packagePath: {\n type: \"string\",\n default: \".\",\n description: \"Options to pass to forge test\",\n },\n });\n },\n\n async handler({ packagePath }) {\n // Start an internal anvil process if no world address is provided\n try {\n execSync(`sui move test --path ${packagePath}`, {\n encoding: \"utf-8\",\n });\n } catch (error: any) {\n console.error(chalk.red(\"Error executing sui move test:\"));\n console.log(error.stdout);\n process.exit(0);\n }\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { printObelisk } from \"../utils\";\n\nconst commandModule: CommandModule = {\n command: \"hello\",\n\n describe: \"hello, obelisk\",\n\n builder(yargs) {\n return yargs;\n },\n\n async handler() {\n printObelisk();\n },\n};\n\nexport default commandModule;\n","import { CommandModule } from \"yargs\";\n\nimport localnode from \"./localnode\";\nimport faucet from \"./faucet\";\nimport schemagen from \"./schemagen\";\nimport publish from \"./publish\";\nimport upgrade from \"./upgrade\";\nimport test from \"./test\";\nimport hello from \"./hello\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Each command has different options\nexport const commands: CommandModule<any, any>[] = [\n publish,\n localnode,\n faucet,\n schemagen,\n upgrade,\n test,\n hello,\n];\n"],"mappings":"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","names":["yargs","hideBin","execa","commandModule","yargs","child","localnode_default","requestSuiFromFaucetV0","getFaucetHost","Ed25519Keypair","SuiClient","getFullnodeUrl","TransactionBlock","Ed25519Keypair","getFullnodeUrl","SuiClient","execSync","chalk","chalk","ZodError","fromZodError","ValidationError","NotInsideProjectError","ObeliskCliError","UpgradeError","FsIibError","logError","error","validationError","fsAsync","mkdirSync","writeFileSync","dirname","SUI_PRIVATE_KEY_PREFIX","validatePrivateKey","privateKey","SUI_PRIVATE_KEY_PREFIX","strippedPrivateKey","updateVersionInFile","projectPath","newVersion","filePath","updatedData","writeOutput","FsIibError","getDeploymentJson","network","data","getVersion","getOldPackageId","projectPath","network","getDeploymentJson","getWorldId","getUpgradeCap","getAdminCap","saveContractData","projectName","packageId","worldId","upgradeCap","adminCap","version","DeploymentData","path","storeDeploymentData","writeOutput","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","publishHandler","name","network","projectPath","privateKey","ObeliskCliError","privateKeyFormat","validatePrivateKey","privateKeyRaw","keypair","Ed25519Keypair","client","SuiClient","getFullnodeUrl","updateVersionInFile","modules","dependencies","extractedModules","extractedDependencies","execSync","error","chalk","tx","TransactionBlock","upgradeCap","result","version","packageId","worldId","upgradeCapId","adminCapId","object","saveContractData","ms","resolve","deployHookTx","deployHookResult","TransactionBlock","UpgradePolicy","Ed25519Keypair","getFullnodeUrl","SuiClient","execSync","chalk","upgradeHandler","name","network","schemaNames","path","projectPath","privateKey","ObeliskCliError","privateKeyFormat","validatePrivateKey","privateKeyRaw","keypair","Ed25519Keypair","client","SuiClient","getFullnodeUrl","oldVersion","getVersion","oldPackageId","getOldPackageId","worldId","getWorldId","upgradeCap","getUpgradeCap","adminCap","getAdminCap","newVersion","updateVersionInFile","modules","dependencies","digest","extractedModules","extractedDependencies","extractedDigest","execSync","error","UpgradeError","tx","TransactionBlock","ticket","UpgradePolicy","receipt","result","newPackageId","newUpgradeCap","object","chalk","saveContractData","ms","resolve","migrateTx","newObjectContent","uniqueSchema","item","needRegisterSchema","newSchema","chalk","printObelisk","commandModule","yargs","network","recipient","faucet_address","privateKey","ObeliskCliError","privateKeyFormat","validatePrivateKey","privateKeyRaw","Ed25519Keypair","requestSuiFromFaucetV0","getFaucetHost","client","SuiClient","getFullnodeUrl","params","faucet_default","worldgen","loadConfig","chalk","commandModule","yargs","configPath","obeliskConfig","error","schemagen_default","loadConfig","commandModule","yargs","network","configPath","obeliskConfig","publishHandler","error","logError","publish_default","loadConfig","commandModule","yargs","network","configPath","obeliskConfig","schemaNames","key","upgradeHandler","error","logError","upgrade_default","execSync","chalk","commandModule","yargs","packagePath","error","test_default","commandModule","yargs","printObelisk","hello_default","commands","publish_default","localnode_default","faucet_default","schemagen_default","upgrade_default","test_default","hello_default","dotenv","chalk","yargs","hideBin","commands","msg","err","logError"]}
|
package/package.json
CHANGED
package/src/utils/utils.ts
CHANGED
|
@@ -1,153 +1,163 @@
|
|
|
1
|
-
import * as fsAsync from
|
|
2
|
-
import { mkdirSync, writeFileSync } from
|
|
3
|
-
import { dirname } from
|
|
4
|
-
import {
|
|
1
|
+
import * as fsAsync from 'fs/promises';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'fs';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
import {
|
|
5
|
+
SUI_PRIVATE_KEY_PREFIX,
|
|
6
|
+
decodeSuiPrivateKey,
|
|
7
|
+
} from '@mysten/sui.js/cryptography';
|
|
8
|
+
import { FsIibError } from './errors';
|
|
5
9
|
|
|
6
10
|
export type DeploymentJsonType = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
projectName: string;
|
|
12
|
+
network: 'mainnet' | 'testnet' | 'devnet' | 'localnet';
|
|
13
|
+
packageId: string;
|
|
14
|
+
worldId: string;
|
|
15
|
+
upgradeCap: string;
|
|
16
|
+
adminCap: string;
|
|
17
|
+
version: number;
|
|
14
18
|
};
|
|
15
19
|
|
|
16
20
|
export function validatePrivateKey(privateKey: string): boolean | string {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
if (privateKey.startsWith(SUI_PRIVATE_KEY_PREFIX)) {
|
|
22
|
+
if (privateKey.length === 70) {
|
|
23
|
+
return privateKey;
|
|
24
|
+
} else {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
} else if (privateKey.startsWith('0x')) {
|
|
28
|
+
const strippedPrivateKey = privateKey.slice(2);
|
|
29
|
+
if (strippedPrivateKey.length === 64) {
|
|
30
|
+
return strippedPrivateKey;
|
|
31
|
+
} else {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
if (privateKey.length === 64) {
|
|
36
|
+
return privateKey;
|
|
37
|
+
} else {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
31
41
|
}
|
|
32
42
|
|
|
33
43
|
export async function updateVersionInFile(
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
projectPath: string,
|
|
45
|
+
newVersion: string
|
|
36
46
|
) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
try {
|
|
48
|
+
const filePath = `${projectPath}/sources/codegen/eps/world.move`;
|
|
49
|
+
const data = await fsAsync.readFile(filePath, 'utf8');
|
|
50
|
+
|
|
51
|
+
// update version data
|
|
52
|
+
const updatedData = data.replace(
|
|
53
|
+
/const VERSION: u64 = \d+;/,
|
|
54
|
+
`const VERSION: u64 = ${newVersion};`
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// write new version
|
|
58
|
+
writeOutput(updatedData, filePath, 'Update package version');
|
|
59
|
+
} catch {
|
|
60
|
+
throw new FsIibError('Fs update version failed.');
|
|
61
|
+
}
|
|
52
62
|
}
|
|
53
63
|
|
|
54
64
|
async function getDeploymentJson(projectPath: string, network: string) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
try {
|
|
66
|
+
const data = await fsAsync.readFile(
|
|
67
|
+
`${projectPath}/.history/sui_${network}/latest.json`,
|
|
68
|
+
'utf8'
|
|
69
|
+
);
|
|
70
|
+
return JSON.parse(data) as DeploymentJsonType;
|
|
71
|
+
} catch {
|
|
72
|
+
throw new FsIibError('Fs read deployment file failed.');
|
|
73
|
+
}
|
|
64
74
|
}
|
|
65
75
|
|
|
66
76
|
export async function getVersion(
|
|
67
|
-
|
|
68
|
-
|
|
77
|
+
projectPath: string,
|
|
78
|
+
network: string
|
|
69
79
|
): Promise<number> {
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
const deployment = await getDeploymentJson(projectPath, network);
|
|
81
|
+
return deployment.version;
|
|
72
82
|
}
|
|
73
83
|
|
|
74
84
|
export async function getNetwork(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
): Promise<
|
|
78
|
-
|
|
79
|
-
|
|
85
|
+
projectPath: string,
|
|
86
|
+
network: string
|
|
87
|
+
): Promise<'mainnet' | 'testnet' | 'devnet' | 'localnet'> {
|
|
88
|
+
const deployment = await getDeploymentJson(projectPath, network);
|
|
89
|
+
return deployment.network;
|
|
80
90
|
}
|
|
81
91
|
|
|
82
92
|
export async function getOldPackageId(
|
|
83
|
-
|
|
84
|
-
|
|
93
|
+
projectPath: string,
|
|
94
|
+
network: string
|
|
85
95
|
): Promise<string> {
|
|
86
|
-
|
|
87
|
-
|
|
96
|
+
const deployment = await getDeploymentJson(projectPath, network);
|
|
97
|
+
return deployment.packageId;
|
|
88
98
|
}
|
|
89
99
|
|
|
90
100
|
export async function getWorldId(
|
|
91
|
-
|
|
92
|
-
|
|
101
|
+
projectPath: string,
|
|
102
|
+
network: string
|
|
93
103
|
): Promise<string> {
|
|
94
|
-
|
|
95
|
-
|
|
104
|
+
const deployment = await getDeploymentJson(projectPath, network);
|
|
105
|
+
return deployment.worldId;
|
|
96
106
|
}
|
|
97
107
|
|
|
98
108
|
export async function getUpgradeCap(
|
|
99
|
-
|
|
100
|
-
|
|
109
|
+
projectPath: string,
|
|
110
|
+
network: string
|
|
101
111
|
): Promise<string> {
|
|
102
|
-
|
|
103
|
-
|
|
112
|
+
const deployment = await getDeploymentJson(projectPath, network);
|
|
113
|
+
return deployment.upgradeCap;
|
|
104
114
|
}
|
|
105
115
|
|
|
106
116
|
export async function getAdminCap(
|
|
107
|
-
|
|
108
|
-
|
|
117
|
+
projectPath: string,
|
|
118
|
+
network: string
|
|
109
119
|
): Promise<string> {
|
|
110
|
-
|
|
111
|
-
|
|
120
|
+
const deployment = await getDeploymentJson(projectPath, network);
|
|
121
|
+
return deployment.adminCap;
|
|
112
122
|
}
|
|
113
123
|
|
|
114
124
|
export function saveContractData(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
125
|
+
projectName: string,
|
|
126
|
+
network: 'mainnet' | 'testnet' | 'devnet' | 'localnet',
|
|
127
|
+
packageId: string,
|
|
128
|
+
worldId: string,
|
|
129
|
+
upgradeCap: string,
|
|
130
|
+
adminCap: string,
|
|
131
|
+
version: number
|
|
122
132
|
) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
133
|
+
const DeploymentData: DeploymentJsonType = {
|
|
134
|
+
projectName,
|
|
135
|
+
network,
|
|
136
|
+
packageId,
|
|
137
|
+
worldId,
|
|
138
|
+
upgradeCap,
|
|
139
|
+
adminCap,
|
|
140
|
+
version,
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const path = process.cwd();
|
|
144
|
+
const storeDeploymentData = JSON.stringify(DeploymentData, null, 2);
|
|
145
|
+
writeOutput(
|
|
146
|
+
storeDeploymentData,
|
|
147
|
+
`${path}/contracts/${projectName}/.history/sui_${network}/latest.json`,
|
|
148
|
+
'Update deploy log'
|
|
149
|
+
);
|
|
140
150
|
}
|
|
141
151
|
|
|
142
152
|
export async function writeOutput(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
153
|
+
output: string,
|
|
154
|
+
fullOutputPath: string,
|
|
155
|
+
logPrefix?: string
|
|
146
156
|
): Promise<void> {
|
|
147
|
-
|
|
157
|
+
mkdirSync(dirname(fullOutputPath), { recursive: true });
|
|
148
158
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
159
|
+
writeFileSync(fullOutputPath, output);
|
|
160
|
+
if (logPrefix !== undefined) {
|
|
161
|
+
console.log(`${logPrefix}: ${fullOutputPath}`);
|
|
162
|
+
}
|
|
153
163
|
}
|