diff --git a/main.ts b/main.ts index 6a499ea..f50ceaf 100644 --- a/main.ts +++ b/main.ts @@ -12,6 +12,7 @@ import { getForkParameters, } from "./src/tenderly"; import { + createCalldataProposal, createProposal, deployPayload, passAndExecuteProposal, @@ -46,6 +47,8 @@ type CommonOptions = { payloadAddress?: string; enterArtifactPath: boolean; artifactPath?: string; + enterCalldata: boolean; + calldata?: string; // pool: string; userAddress?: string; @@ -180,7 +183,7 @@ const questions: { [key: string]: InquirerQuestion | YargsQuestion } = { message: "Enter the deployed payload address", describe: "The payload address to execute", type: "string", - when: (args) => args.enterPayloadAddress === true && !args.proposalId, + when: (args) => args.enterPayloadAddress === true, }, enterArtifactPath: { message: "Do you want to deploy and execute a local payload?", @@ -193,10 +196,20 @@ const questions: { [key: string]: InquirerQuestion | YargsQuestion } = { itemType: "file", message: "Path to artifact.json", describe: "The path to the artifact to execute", + when: (args) => args.enterArtifactPath === true, + }, + enterCalldata: { + message: "Do you want to create and execute raw calldata?", + inquirerOnly: true, + type: "confirm", when: (args) => - args.enterArtifactPath === true && - !args.proposalId && - !args.payloadAddress, + !args.proposalId && !args.payloadAddress && !args.artifactPath, + }, + calldata: { + message: "Enter the proposal creation calldata", + describe: "Proposal creation calldata", + type: "string", + when: (args) => args.enterCalldata === true, }, // get the correct acl pool: { @@ -353,6 +366,18 @@ function getName(options: Options) { proposalId: Number(argv.proposalId), provider: fork.provider, }); + } else if (argv.calldata) { + // for now only supports mainnet + if (Number(argv.networkId) === ChainId.mainnet) { + const proposalId = await createCalldataProposal({ + calldata: argv.calldata, + provider: fork.provider, + }); + await passAndExecuteProposal({ + proposalId: proposalId, + provider: fork.provider, + }); + } } else if (argv.payloadAddress) { if (Number(argv.networkId) === ChainId.mainnet) { const proposalId = await createProposal({ diff --git a/package.json b/package.json index 56a9d00..401dde6 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "scripts": { "start": "yarn build && node dist/index.js", "build": "ncc build ./main.ts -o dist --minify", - "publish:local": "yarn build && npm pack && npm i -g bgd-labs-aave-tenderly-cli-0.0.9.tgz && rm bgd-labs-aave-tenderly-cli-0.0.9.tgz", + "publish:local": "yarn build && npm pack && npm i -g bgd-labs-aave-tenderly-cli-0.0.10.tgz && rm bgd-labs-aave-tenderly-cli-0.0.10.tgz", "ci:publish": "yarn build && npm publish --access=public" }, "repository": { diff --git a/src/governance.ts b/src/governance.ts index b2d41f3..fe087b3 100644 --- a/src/governance.ts +++ b/src/governance.ts @@ -35,6 +35,31 @@ export async function deployPayload({ filePath, provider }: DeployPayload) { interface CreateProposal extends DefaultInterface { payloadAddress: string; } + +interface CreateCalldataProposal extends DefaultInterface { + calldata: string; +} + +/** + * + * @param {*} param0 + * @returns proposalId + */ +export async function createCalldataProposal({ + calldata, + provider, +}: CreateCalldataProposal) { + // Create the proposal + const governance = new Contract(GOV, GOV_ABI, provider.getSigner(AAVE_WHALE)); + await provider + .getSigner(AAVE_WHALE) + .sendTransaction({ to: GOV, data: calldata }); + + const proposalId = (await governance.getProposalsCount()) - 1; + console.log(`Proposal created: ${proposalId}`); + return proposalId; +} + /** * * @param {*} param0