From c50fb1655ff5da340942b6fe9f7fd139714e8b70 Mon Sep 17 00:00:00 2001 From: yoyoismee Date: Wed, 14 Dec 2022 00:12:51 +0700 Subject: [PATCH 1/2] feat: add gen-deploy cli to generate deploy.json --- packages/cli/src/commands/gen-deploy.ts | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 packages/cli/src/commands/gen-deploy.ts diff --git a/packages/cli/src/commands/gen-deploy.ts b/packages/cli/src/commands/gen-deploy.ts new file mode 100644 index 0000000000..fd9371f2d7 --- /dev/null +++ b/packages/cli/src/commands/gen-deploy.ts @@ -0,0 +1,54 @@ +import type { Arguments, CommandBuilder } from "yargs"; +import { spawnSync } from "node:child_process"; +import fs from 'fs'; +import path from 'path'; + +import {readdirSync} from 'fs'; +type Options = { + components: string; + systems: string; + outdir: string; +}; + +export const command = "gen-deploy"; +export const desc = + "generate deploy.json from smart contracts"; + +export const builder: CommandBuilder = (yargs) => + yargs.options({ + components: { type: "string", default: "./src/components", desc: "path to components dir" }, + systems: { type: "string", default: "./src/systems", desc: "path to systems dir" }, + outdir: { type: "string", default: "./deploy.json",desc: "output path" }, + }); + +export const handler = async (args: Arguments): Promise => { + const depployJson:any= {}; + const { components, systems, outdir } = args; + console.log("procesing..."); + const comp = readdirSync(components); + + const comps = comp.map(function(e) { + e = e.replace('.sol',''); + return e; + }); + depployJson.components = comps + + const sys = readdirSync(systems).filter(c => c.includes(".sol")); + const syss = sys.map(function(e) { + const route = path.resolve(systems, e); + const out = spawnSync("forge",["flatten" ,route]); + const flatCode = out.stdout.toString() + const used = comps.filter(c => flatCode.includes(c)) + return { + "name": e.replace(".sol",""), + "writeAccess": used + }; + }); + depployJson.systems = syss + + const deployJsonStr = JSON.stringify(depployJson, undefined, 4); + fs.writeFileSync(outdir, deployJsonStr, 'utf8'); + console.log("write output to", outdir) + + process.exit(0); +}; \ No newline at end of file From c58650ba4f391363bc80d4f373ff0bbb10731b2f Mon Sep 17 00:00:00 2001 From: "yoyismee.eth" Date: Wed, 14 Dec 2022 15:56:42 +0700 Subject: [PATCH 2/2] add waring for gen-deploy necessary write access --- packages/cli/src/commands/gen-deploy.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/commands/gen-deploy.ts b/packages/cli/src/commands/gen-deploy.ts index fd9371f2d7..ec0ae66570 100644 --- a/packages/cli/src/commands/gen-deploy.ts +++ b/packages/cli/src/commands/gen-deploy.ts @@ -2,6 +2,7 @@ import type { Arguments, CommandBuilder } from "yargs"; import { spawnSync } from "node:child_process"; import fs from 'fs'; import path from 'path'; +import chalk from "chalk"; import {readdirSync} from 'fs'; type Options = { @@ -36,6 +37,7 @@ export const handler = async (args: Arguments): Promise => { const sys = readdirSync(systems).filter(c => c.includes(".sol")); const syss = sys.map(function(e) { const route = path.resolve(systems, e); + // give write access to any components that each system touch. even if it not actaully write const out = spawnSync("forge",["flatten" ,route]); const flatCode = out.stdout.toString() const used = comps.filter(c => flatCode.includes(c)) @@ -49,6 +51,6 @@ export const handler = async (args: Arguments): Promise => { const deployJsonStr = JSON.stringify(depployJson, undefined, 4); fs.writeFileSync(outdir, deployJsonStr, 'utf8'); console.log("write output to", outdir) - + console.warn(chalk.yellow.bold("Warning: this function may grant more write access than necessary. It is recommended to manually remove any unnecessary permissions.")) process.exit(0); -}; \ No newline at end of file +};