@bgd-labs/cli 0.0.48 → 0.0.50

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/index.js CHANGED
@@ -7,7 +7,7 @@ import { Command as Command6 } from "@commander-js/extra-typings";
7
7
  // package.json
8
8
  var package_default = {
9
9
  name: "@bgd-labs/cli",
10
- version: "0.0.48",
10
+ version: "0.0.50",
11
11
  main: "./dist/index.mjs",
12
12
  sideEffects: false,
13
13
  license: "MIT",
@@ -117,13 +117,16 @@ import {
117
117
  } from "@bgd-labs/toolbox";
118
118
  import { checkbox, select, Separator, input } from "@inquirer/prompts";
119
119
  import * as addresses from "@bgd-labs/aave-address-book";
120
+ import { parseAbi, zeroAddress } from "viem";
121
+ import { readContract } from "viem/actions";
122
+ import { toAccount } from "viem/accounts";
120
123
  function registerAaveVNet(program2) {
121
124
  program2.command("aave-vnet").description("creates a tenderly virtual testnet and execute payloads").addOption(new Option2("-c,--chainId <number>").makeOptionMandatory()).addOption(
122
125
  new Option2(
123
126
  "-t, --tenderlyAccessToken <string>",
124
127
  "defaults to env.TENDERLY_ACCESS_TOKEN"
125
128
  )
126
- ).addOption(
129
+ ).addOption(new Option2("--pc, --payloadsController <address>")).addOption(
127
130
  new Option2(
128
131
  "-a, --tenderlyAccountSlug <string>",
129
132
  "defaults to env.TENDERLY_ACCOUNT_SLUG"
@@ -136,6 +139,7 @@ function registerAaveVNet(program2) {
136
139
  ).action(
137
140
  async ({
138
141
  chainId,
142
+ payloadsController,
139
143
  tenderlyAccessToken,
140
144
  tenderlyAccountSlug,
141
145
  tenderlyProjectSlug
@@ -155,7 +159,7 @@ function registerAaveVNet(program2) {
155
159
  );
156
160
  console.info("Virtual testnet created!");
157
161
  console.info("RPC:", vnet.vnet.rpcs[0].url);
158
- const controllerAddress = findPayloadsController(Number(chainId));
162
+ const controllerAddress = payloadsController ? payloadsController : findPayloadsController(Number(chainId));
159
163
  const controllerContract = getPayloadsController(
160
164
  vnet.walletClient,
161
165
  controllerAddress
@@ -215,18 +219,32 @@ function registerAaveVNet(program2) {
215
219
  message: "Enter the payload address"
216
220
  });
217
221
  const currentId = await controllerContract.read.getPayloadsCount();
222
+ let sender = zeroAddress;
223
+ try {
224
+ sender = await readContract(vnet.testClient, {
225
+ address: controllerContract.address,
226
+ abi: parseAbi([
227
+ "function payloadsManager() external view returns (address)"
228
+ ]),
229
+ functionName: "payloadsManager"
230
+ });
231
+ } catch (e) {
232
+ }
218
233
  await controllerContract.write.createPayload([
219
234
  [
220
235
  {
221
236
  target: address,
222
237
  accessLevel: 1,
223
- callData: "",
238
+ callData: "0x",
224
239
  withDelegateCall: true,
225
240
  signature: "execute()",
226
- value: 0
241
+ value: 0n
227
242
  }
228
243
  ]
229
- ]);
244
+ ], {
245
+ account: toAccount(sender),
246
+ chain: vnet.walletClient.chain
247
+ });
230
248
  await makePayloadExecutableOnTestClient(
231
249
  vnet.testClient,
232
250
  controllerAddress,
@@ -352,13 +370,13 @@ import { Option as Option5 } from "@commander-js/extra-typings";
352
370
  import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2 } from "node:fs";
353
371
  import {
354
372
  encodeFunctionData,
355
- parseAbi,
356
- zeroAddress
373
+ parseAbi as parseAbi2,
374
+ zeroAddress as zeroAddress2
357
375
  } from "viem";
358
- import { toAccount } from "viem/accounts";
359
- import { readContract } from "viem/actions";
376
+ import { toAccount as toAccount2 } from "viem/accounts";
377
+ import { readContract as readContract2 } from "viem/actions";
360
378
  function registerSeatbeltReport(program2) {
361
- program2.command("seatbelt-report").description("generates a seatbelt report for the payload").addOption(new Option5("-c,--chainId <number>").makeOptionMandatory()).addOption(new Option5("--pi,--payloadId <number>")).addOption(new Option5("--pa, --payloadAddress <address>")).addOption(new Option5("--pb,--payloadBytecode <hex>")).addOption(
379
+ program2.command("seatbelt-report").description("generates a seatbelt report for the payload").addOption(new Option5("-c,--chainId <number>").makeOptionMandatory()).addOption(new Option5("--pi,--payloadId <number>")).addOption(new Option5("--pa, --payloadAddress <address>")).addOption(new Option5("--pb,--payloadBytecode <hex>")).addOption(new Option5("--pcd,--payloadCalldata <hex>")).addOption(
362
380
  new Option5("--pc, --payloadsController <address>").makeOptionMandatory()
363
381
  ).addOption(
364
382
  new Option5("-o, --output <output path>").default("./reports/seatbelt/")
@@ -392,6 +410,7 @@ function registerSeatbeltReport(program2) {
392
410
  payloadId,
393
411
  payloadAddress,
394
412
  payloadBytecode,
413
+ payloadCalldata,
395
414
  payloadsController
396
415
  }) => {
397
416
  const vnet = await tenderly_createVnet2(
@@ -412,11 +431,11 @@ function registerSeatbeltReport(program2) {
412
431
  payloadsController
413
432
  );
414
433
  let currentId = 0;
415
- let sender = zeroAddress;
434
+ let sender = zeroAddress2;
416
435
  try {
417
- sender = await readContract(vnet.testClient, {
436
+ sender = await readContract2(vnet.testClient, {
418
437
  address: controllerContract.address,
419
- abi: parseAbi([
438
+ abi: parseAbi2([
420
439
  "function payloadsManager() external view returns (address)"
421
440
  ]),
422
441
  functionName: "payloadsManager"
@@ -433,6 +452,15 @@ function registerSeatbeltReport(program2) {
433
452
  });
434
453
  payloadAddress = "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8";
435
454
  }
455
+ if (payloadCalldata) {
456
+ currentId = await controllerContract.read.getPayloadsCount();
457
+ await vnet.walletClient.sendTransaction({
458
+ account: toAccount2(sender),
459
+ chain: vnet.walletClient.chain,
460
+ to: payloadsController,
461
+ data: payloadCalldata
462
+ });
463
+ }
436
464
  if (payloadAddress) {
437
465
  currentId = await controllerContract.read.getPayloadsCount();
438
466
  const payload = {
@@ -444,7 +472,7 @@ function registerSeatbeltReport(program2) {
444
472
  value: 0n
445
473
  };
446
474
  await controllerContract.write.createPayload([[payload]], {
447
- account: toAccount(sender),
475
+ account: toAccount2(sender),
448
476
  chain: vnet.walletClient.chain
449
477
  });
450
478
  }
@@ -473,7 +501,7 @@ function registerSeatbeltReport(program2) {
473
501
  source: "dashboard"
474
502
  });
475
503
  await controllerContract.write.executePayload([currentId], {
476
- account: toAccount(sender),
504
+ account: toAccount2(sender),
477
505
  chain: vnet.walletClient.chain
478
506
  });
479
507
  const report = await renderTenderlyReport({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json","../src/tasks/code-diff.ts","../src/tasks/aave-vnet.ts","../src/tasks/storage-diff.ts","../src/tasks/rpcs.ts","../src/tasks/protocol.ts","../src/tasks/seatbelt-report.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport packageJson from \"../package.json\";\nimport { registerCodeDiff } from \"./tasks/code-diff\";\nimport { registerAaveVNet } from \"./tasks/aave-vnet\";\nimport { registerStorageDiff } from \"./tasks/storage-diff\";\nimport { registerRpcs } from \"./tasks/rpcs\";\nimport { registerProtocol } from \"./tasks/protocol\";\nimport { registerSeatbeltReport } from \"./tasks/seatbelt-report.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"@bgd-labs/cli\")\n .description(\"A cli to help with web3 / solidity tasks\")\n .version(packageJson.version)\n .showHelpAfterError();\n\nregisterCodeDiff(program);\nregisterAaveVNet(program);\nregisterStorageDiff(program);\nregisterRpcs(program);\nregisterProtocol(program);\nregisterSeatbeltReport(program);\n\nprogram.parse();\n","{\n \"name\": \"@bgd-labs/cli\",\n \"version\": \"0.0.48\",\n \"main\": \"./dist/index.mjs\",\n \"sideEffects\": false,\n \"license\": \"MIT\",\n \"files\": [\n \"dist/**\",\n \"README.md\"\n ],\n \"type\": \"module\",\n \"bin\": {\n \"cli\": \"dist/index.js\"\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts\",\n \"dev\": \"tsup src/index.ts --watch\",\n \"start\": \"node dist/index.js\",\n \"clean\": \"rm -rf .turbo && rm -rf node_modules && rm -rf dist\"\n },\n \"devDependencies\": {\n \"@types/node\": \"catalog:\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@bgd-labs/aave-address-book\": \"^4.26.0\",\n \"@bgd-labs/toolbox\": \"workspace:*\",\n \"@commander-js/extra-typings\": \"^13.1.0\",\n \"@inquirer/prompts\": \"^7.3.2\",\n \"dotenv\": \"^16.4.7\",\n \"viem\": \"catalog:\"\n }\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n BlockscoutStyleSourceCode,\n diffCode,\n getSourceCode,\n parseBlockscoutStyleSourceCode,\n parseEtherscanStyleSourceCode,\n StandardJsonInput,\n} from \"@bgd-labs/toolbox\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\n\nexport function registerCodeDiff(program: Command) {\n program\n .command(\"codeDiff\")\n .description(\"generated the diff between any two addresses\")\n .addOption(new Option(\"--address1 <address>\").makeOptionMandatory())\n .addOption(new Option(\"--chainId1 <number>\").makeOptionMandatory())\n .addOption(new Option(\"--address2 <address>\").makeOptionMandatory())\n .addOption(new Option(\"--chainId2 <number>\").makeOptionMandatory())\n .addOption(new Option(\"-f, --flatten\"))\n .addOption(\n new Option(\"-o, --output <format>\")\n .choices([\"stdout\", \"file\"])\n .default(\"stdout\"),\n )\n .addOption(new Option(\"-p, --path <path>\").default(\"./diffs/code\"))\n .action(\n async ({\n address1,\n address2,\n chainId1,\n chainId2,\n flatten,\n output,\n path,\n }) => {\n const sources = await Promise.all([\n getSourceCode({\n chainId: Number(chainId1),\n address: address1 as any,\n apiKey: process.env.ETHERSCAN_API_KEY,\n }),\n getSourceCode({\n chainId: Number(chainId2),\n address: address2 as any,\n apiKey: process.env.ETHERSCAN_API_KEY,\n }),\n ]);\n const source1: StandardJsonInput = (\n sources[0] as BlockscoutStyleSourceCode\n ).AdditionalSources\n ? parseBlockscoutStyleSourceCode(\n sources[0] as BlockscoutStyleSourceCode,\n )\n : parseEtherscanStyleSourceCode(sources[0].SourceCode);\n const source2: StandardJsonInput = (\n sources[0] as BlockscoutStyleSourceCode\n ).AdditionalSources\n ? parseBlockscoutStyleSourceCode(\n sources[1] as BlockscoutStyleSourceCode,\n )\n : parseEtherscanStyleSourceCode(sources[1].SourceCode);\n const diff = await diffCode(source1, source2);\n if (flatten || output === \"stdout\") {\n const flat = Object.keys(diff).reduce((acc, key) => {\n acc += diff[key];\n return acc;\n }, \"\");\n if (output === \"stdout\") {\n console.log(flat);\n } else {\n const filePath = `${path}/${chainId1}`;\n mkdirSync(filePath, { recursive: true });\n writeFileSync(`${filePath}/${address1}_${address2}.patch`, flat);\n }\n } else {\n const filePath = `${path}/${chainId1}/${address1}_${address2}`;\n mkdirSync(filePath, { recursive: true });\n Object.keys(diff).map((file) => {\n writeFileSync(`${filePath}/${file}.patch`, diff[file]);\n });\n }\n },\n );\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n getNonFinalizedPayloads,\n getPayloadsController,\n makePayloadExecutableOnTestClient,\n tenderly_createVnet,\n} from \"@bgd-labs/toolbox\";\nimport { checkbox, select, Separator, input } from \"@inquirer/prompts\";\nimport * as addresses from \"@bgd-labs/aave-address-book\";\nimport { Address } from \"viem\";\n\nenum DialogOptions {\n PAYLOAD_ID,\n PAYLOAD_ADDRESS,\n PAYLOAD_ARTIFACT,\n EXIT,\n DELETE,\n}\n\nexport function registerAaveVNet(program: Command) {\n program\n .command(\"aave-vnet\")\n .description(\"creates a tenderly virtual testnet and execute payloads\")\n .addOption(new Option(\"-c,--chainId <number>\").makeOptionMandatory())\n .addOption(\n new Option(\n \"-t, --tenderlyAccessToken <string>\",\n \"defaults to env.TENDERLY_ACCESS_TOKEN\",\n ),\n )\n .addOption(\n new Option(\n \"-a, --tenderlyAccountSlug <string>\",\n \"defaults to env.TENDERLY_ACCOUNT_SLUG\",\n ),\n )\n .addOption(\n new Option(\n \"-p, --tenderlyProjectSlug <string>\",\n \"defaults to env.TENDERLY_PROJECT_SLUG\",\n ),\n )\n .action(\n async ({\n chainId,\n tenderlyAccessToken,\n tenderlyAccountSlug,\n tenderlyProjectSlug,\n }) => {\n const vnet = await tenderly_createVnet(\n {\n baseChainId: Number(chainId),\n forkChainId: 3030,\n slug: `${Math.floor(Math.random() * 1000)}acli-bgd-labs-vnet-${chainId}`,\n displayName: \"bgd-labs cli vnet\",\n },\n {\n accessToken:\n tenderlyAccessToken || process.env.TENDERLY_ACCESS_TOKEN!,\n accountSlug:\n tenderlyAccountSlug || process.env.TENDERLY_ACCOUNT_SLUG!,\n projectSlug:\n tenderlyProjectSlug || process.env.TENDERLY_PROJECT_SLUG!,\n },\n );\n console.info(\"Virtual testnet created!\");\n console.info(\"RPC:\", vnet.vnet.rpcs[0].url);\n const controllerAddress = findPayloadsController(Number(chainId))!;\n const controllerContract = getPayloadsController(\n vnet.walletClient,\n controllerAddress,\n );\n while (true) {\n const answer = await select({\n message: \"What do you want to do?\",\n choices: [\n {\n name: \"Execute a registered payload\",\n value: DialogOptions.PAYLOAD_ID,\n },\n {\n name: \"Execute a deployed (but not registered) payload\",\n value: DialogOptions.PAYLOAD_ADDRESS,\n },\n {\n name: \"Execute a local payload.\",\n value: DialogOptions.PAYLOAD_ARTIFACT,\n },\n new Separator(),\n {\n name: \"Exit (this will keep the vnet open - you can delete it via tenderly ui)\",\n value: DialogOptions.EXIT,\n },\n {\n name: \"Exit and delete\",\n value: DialogOptions.DELETE,\n },\n ],\n });\n switch (answer) {\n case DialogOptions.PAYLOAD_ID:\n const payloadIds = await getNonFinalizedPayloads(\n vnet.testClient,\n controllerAddress,\n );\n const answer = await checkbox({\n message: \"Select the payloads you want to execute\",\n choices: payloadIds.map((id) => ({\n name: String(id),\n value: String(id),\n })),\n });\n for (const id of answer) {\n await makePayloadExecutableOnTestClient(\n vnet.testClient,\n controllerAddress,\n Number(id),\n );\n await controllerContract.write.executePayload([Number(id)]);\n console.info(`Payload ${id} executed`);\n }\n break;\n case DialogOptions.PAYLOAD_ADDRESS:\n const address = await input({\n message: \"Enter the payload address\",\n });\n const currentId =\n await controllerContract.read.getPayloadsCount();\n await controllerContract.write.createPayload([\n [\n {\n target: address as Address,\n accessLevel: 1,\n callData: \"\",\n withDelegateCall: true,\n signature: \"execute()\",\n value: 0,\n },\n ],\n ]);\n await makePayloadExecutableOnTestClient(\n vnet.testClient,\n controllerAddress,\n currentId,\n );\n await controllerContract.write.executePayload([currentId]);\n break;\n case DialogOptions.EXIT:\n process.exit(0);\n case DialogOptions.DELETE:\n await vnet.delete();\n console.info(\"Virtual testnet deleted!\");\n process.exit(0);\n }\n }\n },\n );\n}\n\nexport function findPayloadsController(chainId: number): Address | void {\n const key = Object.keys(addresses).find(\n (key) =>\n (addresses[key as keyof typeof addresses] as any).CHAIN_ID === chainId &&\n (addresses[key as keyof typeof addresses] as any).PAYLOADS_CONTROLLER,\n );\n if (key)\n return (addresses[key as keyof typeof addresses] as any)\n .PAYLOADS_CONTROLLER;\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n diffFoundryStorageLayout,\n foundry_getStorageLayout,\n} from \"@bgd-labs/toolbox\";\n\nexport function registerStorageDiff(program: Command) {\n program\n .command(\"storageDiff\")\n .description(\"generated the storage diff between any two files\")\n .addOption(new Option(\"--contract1 <Contract|path>\").makeOptionMandatory())\n .addOption(new Option(\"--contract2 <Contract|path>\").makeOptionMandatory())\n .action(async ({ contract1, contract2 }) => {\n const storage1 = foundry_getStorageLayout(contract1);\n const storage2 = foundry_getStorageLayout(contract2);\n const result = diffFoundryStorageLayout(storage1, storage2);\n console.log(result);\n });\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport { ChainId, getNetworkEnv, getRPCUrl } from \"@bgd-labs/toolbox\";\n\n/**\n * Logs a list of rpcs to be used in your foundry project\n * @param program\n */\nexport function registerRpcs(program: Command) {\n program\n .command(\"rpcs\")\n .description(\"generate a list of rpcs to be used in foundry projects\")\n .addOption(\n new Option(\"--alchemyApiKey <string>\", \"defaults to env.ALCHEMY_API_KEY\"),\n )\n .addOption(\n new Option(\n \"--quicknodeToken <string>\",\n \"defaults to env.QUICKNODE_TOKEN\",\n ),\n )\n .addOption(\n new Option(\n \"--quicknodeEndpointName <string>\",\n \"defaults to env.QUICKNODE_ENDPOINT_NAME\",\n ),\n )\n .action(\n async ({ alchemyApiKey, quicknodeToken, quicknodeEndpointName }) => {\n let env = \"\";\n let toml = \"\";\n Object.entries(ChainId).map(([key, chainId]) => {\n const networkEnv = getNetworkEnv(chainId);\n const rpc = getRPCUrl(chainId, {\n alchemyKey: alchemyApiKey || process.env.ALCHEMY_API_KEY,\n quicknodeToken: quicknodeToken || process.env.QUICKNODE_TOKEN,\n quicknodeEndpointName:\n quicknodeEndpointName || process.env.QUICKNODE_ENDPOINT_NAME,\n });\n env += `${networkEnv}=${rpc || \"\"}\\n`;\n toml += `${key}=\"\\${${networkEnv}}\"\\n`;\n });\n\n console.log(\"### .env ###\");\n console.log(env);\n\n console.log(\"### foundry toml ###\");\n console.log(toml);\n },\n );\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n fetchPoolAddresses,\n getClient,\n getReserveTokens,\n getReserveConfigurations,\n} from \"@bgd-labs/toolbox\";\nimport { AaveV3Ethereum } from \"@bgd-labs/aave-address-book\";\n\nexport function registerProtocol(program: Command) {\n program\n .command(\"protocol\")\n .description(\"generated the storage diff between any two files\")\n .action(async () => {\n const mainnetClient = getClient(1, {\n providerConfig: { alchemyKey: process.env.ALCHEMY_API_KEY },\n });\n const contracts = await fetchPoolAddresses(\n mainnetClient,\n AaveV3Ethereum.POOL_ADDRESSES_PROVIDER,\n );\n const reserveTokens = await getReserveTokens(\n mainnetClient,\n contracts.pool,\n );\n const reserveConfigs = await getReserveConfigurations(\n mainnetClient,\n contracts.pool,\n reserveTokens,\n );\n console.log(reserveConfigs);\n });\n}\n","import { IPayloadsControllerCore_ABI } from \"@bgd-labs/aave-address-book/abis\";\nimport { getAddressBookReferences } from \"@bgd-labs/aave-address-book/utils\";\nimport {\n getMdContractName,\n getPayloadsController,\n makePayloadExecutableOnTestClient,\n renderTenderlyReport,\n tenderly_createVnet,\n} from \"@bgd-labs/toolbox\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport {\n Address,\n encodeFunctionData,\n Hex,\n isAddress,\n parseAbi,\n zeroAddress,\n} from \"viem\";\nimport { toAccount } from \"viem/accounts\";\nimport { readContract } from \"viem/actions\";\n\nexport function registerSeatbeltReport(program: Command) {\n program\n .command(\"seatbelt-report\")\n .description(\"generates a seatbelt report for the payload\")\n .addOption(new Option(\"-c,--chainId <number>\").makeOptionMandatory())\n .addOption(new Option(\"--pi,--payloadId <number>\"))\n .addOption(new Option(\"--pa, --payloadAddress <address>\"))\n .addOption(new Option(\"--pb,--payloadBytecode <hex>\"))\n .addOption(\n new Option(\"--pc, --payloadsController <address>\").makeOptionMandatory(),\n )\n .addOption(\n new Option(\"-o, --output <output path>\").default(\"./reports/seatbelt/\"),\n )\n .addOption(\n new Option(\n \"-t, --tenderlyAccessToken <string>\",\n \"defaults to env.TENDERLY_ACCESS_TOKEN\",\n ),\n )\n .addOption(\n new Option(\n \"-a, --tenderlyAccountSlug <string>\",\n \"defaults to env.TENDERLY_ACCOUNT_SLUG\",\n ),\n )\n .addOption(\n new Option(\n \"-p, --tenderlyProjectSlug <string>\",\n \"defaults to env.TENDERLY_PROJECT_SLUG\",\n ),\n )\n .addOption(\n new Option(\n \"-e, --etherscanApiKey <string>\",\n \"defaults to env.ETHERSCAN_API_KEY\",\n ),\n )\n .action(\n async ({\n chainId,\n tenderlyAccessToken,\n tenderlyAccountSlug,\n tenderlyProjectSlug,\n output,\n payloadId,\n payloadAddress,\n payloadBytecode,\n payloadsController,\n }) => {\n const vnet = await tenderly_createVnet(\n {\n baseChainId: Number(chainId),\n forkChainId: 3030,\n slug: `${Math.floor(Math.random() * 1000)}acli-bgd-labs-vnet-${chainId}`,\n displayName: \"seatbelt\",\n },\n {\n accessToken:\n tenderlyAccessToken || process.env.TENDERLY_ACCESS_TOKEN!,\n accountSlug:\n tenderlyAccountSlug || process.env.TENDERLY_ACCOUNT_SLUG!,\n projectSlug:\n tenderlyProjectSlug || process.env.TENDERLY_PROJECT_SLUG!,\n },\n );\n const controllerContract = getPayloadsController(\n vnet.walletClient,\n payloadsController as Address,\n );\n\n // the current \"count\" will be the id after creation\n let currentId: number = 0;\n\n // in case the controller is permissioned we fetch the manager\n let sender: Address = zeroAddress;\n try {\n sender = await readContract(vnet.testClient, {\n address: controllerContract.address,\n abi: parseAbi([\n \"function payloadsManager() external view returns (address)\",\n ]),\n functionName: \"payloadsManager\",\n });\n } catch (e) {}\n if (payloadId) {\n currentId = Number(payloadId);\n }\n if (payloadBytecode) {\n vnet.testClient.setCode({\n address: \"0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8\",\n bytecode: payloadBytecode as Hex,\n });\n payloadAddress = \"0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8\";\n }\n if (payloadAddress) {\n currentId = await controllerContract.read.getPayloadsCount();\n const payload = {\n target: payloadAddress as Address,\n accessLevel: 1,\n callData: \"0x\",\n withDelegateCall: true,\n signature: \"execute()\",\n value: 0n,\n } as const;\n await controllerContract.write.createPayload([[payload]], {\n account: toAccount(sender),\n chain: vnet.walletClient.chain,\n });\n }\n\n await makePayloadExecutableOnTestClient(\n vnet.testClient,\n payloadsController as Address,\n currentId as number,\n );\n\n // simulate executing the payload\n const simResult = await vnet.simulate({\n network_id: chainId.toString(),\n from: sender,\n to: payloadsController,\n input: encodeFunctionData({\n abi: IPayloadsControllerCore_ABI,\n functionName: \"executePayload\",\n args: [currentId],\n }),\n block_number: null,\n transaction_index: 0,\n gas: 30_000_000,\n gas_price: \"0\",\n value: \"0\",\n access_list: [],\n generate_access_list: true,\n save: true,\n source: \"dashboard\",\n });\n\n // after we simulate the execution, we also execute it\n // this way when we query the chain, we can access data as if it was already executed\n await controllerContract.write.executePayload([currentId], {\n account: toAccount(sender),\n chain: vnet.walletClient.chain,\n });\n\n const report = await renderTenderlyReport({\n client: vnet.walletClient,\n sim: simResult,\n payloadId: currentId,\n payload: await controllerContract.read.getPayloadById([currentId]),\n onchainLogs: {} as any,\n config: {\n etherscanApiKey: process.env.ETHERSCAN_API_KEY!,\n },\n getContractName: (sim, address) => {\n const references = getAddressBookReferences(\n address,\n Number(sim.simulation.network_id),\n );\n if (references.length > 0)\n return flagAsKnown(\n getMdContractName(sim.contracts, address),\n references[0],\n );\n return getMdContractName(sim.contracts, address);\n },\n });\n\n const filePath = `${output}/${chainId}_${payloadsController}`;\n mkdirSync(filePath, { recursive: true });\n writeFileSync(`${filePath}/${currentId}.md`, report.report);\n // await vnet.delete();\n },\n );\n}\n\nfunction flagAsKnown(value: string, reference: string) {\n return `${value} [:ghost:](https://github.com/bgd-labs/aave-address-book \"${reference}\")`;\n}\n"],"mappings":"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","names":["Command","program","Option","program","Option","answer","key","Option","program","Option","program","program","getPayloadsController","makePayloadExecutableOnTestClient","tenderly_createVnet","Option","mkdirSync","writeFileSync","program","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../src/tasks/code-diff.ts","../src/tasks/aave-vnet.ts","../src/tasks/storage-diff.ts","../src/tasks/rpcs.ts","../src/tasks/protocol.ts","../src/tasks/seatbelt-report.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport packageJson from \"../package.json\";\nimport { registerCodeDiff } from \"./tasks/code-diff\";\nimport { registerAaveVNet } from \"./tasks/aave-vnet\";\nimport { registerStorageDiff } from \"./tasks/storage-diff\";\nimport { registerRpcs } from \"./tasks/rpcs\";\nimport { registerProtocol } from \"./tasks/protocol\";\nimport { registerSeatbeltReport } from \"./tasks/seatbelt-report.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"@bgd-labs/cli\")\n .description(\"A cli to help with web3 / solidity tasks\")\n .version(packageJson.version)\n .showHelpAfterError();\n\nregisterCodeDiff(program);\nregisterAaveVNet(program);\nregisterStorageDiff(program);\nregisterRpcs(program);\nregisterProtocol(program);\nregisterSeatbeltReport(program);\n\nprogram.parse();\n","{\n \"name\": \"@bgd-labs/cli\",\n \"version\": \"0.0.50\",\n \"main\": \"./dist/index.mjs\",\n \"sideEffects\": false,\n \"license\": \"MIT\",\n \"files\": [\n \"dist/**\",\n \"README.md\"\n ],\n \"type\": \"module\",\n \"bin\": {\n \"cli\": \"dist/index.js\"\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts\",\n \"dev\": \"tsup src/index.ts --watch\",\n \"start\": \"node dist/index.js\",\n \"clean\": \"rm -rf .turbo && rm -rf node_modules && rm -rf dist\"\n },\n \"devDependencies\": {\n \"@types/node\": \"catalog:\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"@bgd-labs/aave-address-book\": \"^4.26.0\",\n \"@bgd-labs/toolbox\": \"workspace:*\",\n \"@commander-js/extra-typings\": \"^13.1.0\",\n \"@inquirer/prompts\": \"^7.3.2\",\n \"dotenv\": \"^16.4.7\",\n \"viem\": \"catalog:\"\n }\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n BlockscoutStyleSourceCode,\n diffCode,\n getSourceCode,\n parseBlockscoutStyleSourceCode,\n parseEtherscanStyleSourceCode,\n StandardJsonInput,\n} from \"@bgd-labs/toolbox\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\n\nexport function registerCodeDiff(program: Command) {\n program\n .command(\"codeDiff\")\n .description(\"generated the diff between any two addresses\")\n .addOption(new Option(\"--address1 <address>\").makeOptionMandatory())\n .addOption(new Option(\"--chainId1 <number>\").makeOptionMandatory())\n .addOption(new Option(\"--address2 <address>\").makeOptionMandatory())\n .addOption(new Option(\"--chainId2 <number>\").makeOptionMandatory())\n .addOption(new Option(\"-f, --flatten\"))\n .addOption(\n new Option(\"-o, --output <format>\")\n .choices([\"stdout\", \"file\"])\n .default(\"stdout\"),\n )\n .addOption(new Option(\"-p, --path <path>\").default(\"./diffs/code\"))\n .action(\n async ({\n address1,\n address2,\n chainId1,\n chainId2,\n flatten,\n output,\n path,\n }) => {\n const sources = await Promise.all([\n getSourceCode({\n chainId: Number(chainId1),\n address: address1 as any,\n apiKey: process.env.ETHERSCAN_API_KEY,\n }),\n getSourceCode({\n chainId: Number(chainId2),\n address: address2 as any,\n apiKey: process.env.ETHERSCAN_API_KEY,\n }),\n ]);\n const source1: StandardJsonInput = (\n sources[0] as BlockscoutStyleSourceCode\n ).AdditionalSources\n ? parseBlockscoutStyleSourceCode(\n sources[0] as BlockscoutStyleSourceCode,\n )\n : parseEtherscanStyleSourceCode(sources[0].SourceCode);\n const source2: StandardJsonInput = (\n sources[0] as BlockscoutStyleSourceCode\n ).AdditionalSources\n ? parseBlockscoutStyleSourceCode(\n sources[1] as BlockscoutStyleSourceCode,\n )\n : parseEtherscanStyleSourceCode(sources[1].SourceCode);\n const diff = await diffCode(source1, source2);\n if (flatten || output === \"stdout\") {\n const flat = Object.keys(diff).reduce((acc, key) => {\n acc += diff[key];\n return acc;\n }, \"\");\n if (output === \"stdout\") {\n console.log(flat);\n } else {\n const filePath = `${path}/${chainId1}`;\n mkdirSync(filePath, { recursive: true });\n writeFileSync(`${filePath}/${address1}_${address2}.patch`, flat);\n }\n } else {\n const filePath = `${path}/${chainId1}/${address1}_${address2}`;\n mkdirSync(filePath, { recursive: true });\n Object.keys(diff).map((file) => {\n writeFileSync(`${filePath}/${file}.patch`, diff[file]);\n });\n }\n },\n );\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n getNonFinalizedPayloads,\n getPayloadsController,\n makePayloadExecutableOnTestClient,\n tenderly_createVnet,\n} from \"@bgd-labs/toolbox\";\nimport { checkbox, select, Separator, input } from \"@inquirer/prompts\";\nimport * as addresses from \"@bgd-labs/aave-address-book\";\nimport { Address, parseAbi, zeroAddress } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport { toAccount } from \"viem/accounts\";\n\nenum DialogOptions {\n PAYLOAD_ID,\n PAYLOAD_ADDRESS,\n PAYLOAD_ARTIFACT,\n EXIT,\n DELETE,\n}\n\nexport function registerAaveVNet(program: Command) {\n program\n .command(\"aave-vnet\")\n .description(\"creates a tenderly virtual testnet and execute payloads\")\n .addOption(new Option(\"-c,--chainId <number>\").makeOptionMandatory())\n .addOption(\n new Option(\n \"-t, --tenderlyAccessToken <string>\",\n \"defaults to env.TENDERLY_ACCESS_TOKEN\",\n ),\n )\n .addOption(new Option(\"--pc, --payloadsController <address>\"))\n .addOption(\n new Option(\n \"-a, --tenderlyAccountSlug <string>\",\n \"defaults to env.TENDERLY_ACCOUNT_SLUG\",\n ),\n )\n .addOption(\n new Option(\n \"-p, --tenderlyProjectSlug <string>\",\n \"defaults to env.TENDERLY_PROJECT_SLUG\",\n ),\n )\n .action(\n async ({\n chainId,\n payloadsController,\n tenderlyAccessToken,\n tenderlyAccountSlug,\n tenderlyProjectSlug,\n }) => {\n const vnet = await tenderly_createVnet(\n {\n baseChainId: Number(chainId),\n forkChainId: 3030,\n slug: `${Math.floor(Math.random() * 1000)}acli-bgd-labs-vnet-${chainId}`,\n displayName: \"bgd-labs cli vnet\",\n },\n {\n accessToken:\n tenderlyAccessToken || process.env.TENDERLY_ACCESS_TOKEN!,\n accountSlug:\n tenderlyAccountSlug || process.env.TENDERLY_ACCOUNT_SLUG!,\n projectSlug:\n tenderlyProjectSlug || process.env.TENDERLY_PROJECT_SLUG!,\n },\n );\n console.info(\"Virtual testnet created!\");\n console.info(\"RPC:\", vnet.vnet.rpcs[0].url);\n const controllerAddress = payloadsController\n ? (payloadsController as Address)\n : findPayloadsController(Number(chainId))!;\n const controllerContract = getPayloadsController(\n vnet.walletClient,\n controllerAddress,\n );\n while (true) {\n const answer = await select({\n message: \"What do you want to do?\",\n choices: [\n {\n name: \"Execute a registered payload\",\n value: DialogOptions.PAYLOAD_ID,\n },\n {\n name: \"Execute a deployed (but not registered) payload\",\n value: DialogOptions.PAYLOAD_ADDRESS,\n },\n {\n name: \"Execute a local payload.\",\n value: DialogOptions.PAYLOAD_ARTIFACT,\n },\n new Separator(),\n {\n name: \"Exit (this will keep the vnet open - you can delete it via tenderly ui)\",\n value: DialogOptions.EXIT,\n },\n {\n name: \"Exit and delete\",\n value: DialogOptions.DELETE,\n },\n ],\n });\n switch (answer) {\n case DialogOptions.PAYLOAD_ID:\n const payloadIds = await getNonFinalizedPayloads(\n vnet.testClient,\n controllerAddress,\n );\n const answer = await checkbox({\n message: \"Select the payloads you want to execute\",\n choices: payloadIds.map((id) => ({\n name: String(id),\n value: String(id),\n })),\n });\n for (const id of answer) {\n await makePayloadExecutableOnTestClient(\n vnet.testClient,\n controllerAddress,\n Number(id),\n );\n await controllerContract.write.executePayload([Number(id)]);\n console.info(`Payload ${id} executed`);\n }\n break;\n case DialogOptions.PAYLOAD_ADDRESS:\n const address = await input({\n message: \"Enter the payload address\",\n });\n const currentId =\n await controllerContract.read.getPayloadsCount();\n\n // in case the controller is permissioned we fetch the manager\n let sender: Address = zeroAddress;\n try {\n sender = await readContract(vnet.testClient, {\n address: controllerContract.address,\n abi: parseAbi([\n \"function payloadsManager() external view returns (address)\",\n ]),\n functionName: \"payloadsManager\",\n });\n } catch (e) {}\n\n await controllerContract.write.createPayload([\n [\n {\n target: address as Address,\n accessLevel: 1,\n callData: \"0x\",\n withDelegateCall: true,\n signature: \"execute()\",\n value: 0n,\n },\n ],\n ], {\n account: toAccount(sender),\n chain: vnet.walletClient.chain,\n });\n await makePayloadExecutableOnTestClient(\n vnet.testClient,\n controllerAddress,\n currentId,\n );\n await controllerContract.write.executePayload([currentId]);\n break;\n case DialogOptions.EXIT:\n process.exit(0);\n case DialogOptions.DELETE:\n await vnet.delete();\n console.info(\"Virtual testnet deleted!\");\n process.exit(0);\n }\n }\n },\n );\n}\n\nexport function findPayloadsController(chainId: number): Address | void {\n const key = Object.keys(addresses).find(\n (key) =>\n (addresses[key as keyof typeof addresses] as any).CHAIN_ID === chainId &&\n (addresses[key as keyof typeof addresses] as any).PAYLOADS_CONTROLLER,\n );\n if (key)\n return (addresses[key as keyof typeof addresses] as any)\n .PAYLOADS_CONTROLLER;\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n diffFoundryStorageLayout,\n foundry_getStorageLayout,\n} from \"@bgd-labs/toolbox\";\n\nexport function registerStorageDiff(program: Command) {\n program\n .command(\"storageDiff\")\n .description(\"generated the storage diff between any two files\")\n .addOption(new Option(\"--contract1 <Contract|path>\").makeOptionMandatory())\n .addOption(new Option(\"--contract2 <Contract|path>\").makeOptionMandatory())\n .action(async ({ contract1, contract2 }) => {\n const storage1 = foundry_getStorageLayout(contract1);\n const storage2 = foundry_getStorageLayout(contract2);\n const result = diffFoundryStorageLayout(storage1, storage2);\n console.log(result);\n });\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport { ChainId, getNetworkEnv, getRPCUrl } from \"@bgd-labs/toolbox\";\n\n/**\n * Logs a list of rpcs to be used in your foundry project\n * @param program\n */\nexport function registerRpcs(program: Command) {\n program\n .command(\"rpcs\")\n .description(\"generate a list of rpcs to be used in foundry projects\")\n .addOption(\n new Option(\"--alchemyApiKey <string>\", \"defaults to env.ALCHEMY_API_KEY\"),\n )\n .addOption(\n new Option(\n \"--quicknodeToken <string>\",\n \"defaults to env.QUICKNODE_TOKEN\",\n ),\n )\n .addOption(\n new Option(\n \"--quicknodeEndpointName <string>\",\n \"defaults to env.QUICKNODE_ENDPOINT_NAME\",\n ),\n )\n .action(\n async ({ alchemyApiKey, quicknodeToken, quicknodeEndpointName }) => {\n let env = \"\";\n let toml = \"\";\n Object.entries(ChainId).map(([key, chainId]) => {\n const networkEnv = getNetworkEnv(chainId);\n const rpc = getRPCUrl(chainId, {\n alchemyKey: alchemyApiKey || process.env.ALCHEMY_API_KEY,\n quicknodeToken: quicknodeToken || process.env.QUICKNODE_TOKEN,\n quicknodeEndpointName:\n quicknodeEndpointName || process.env.QUICKNODE_ENDPOINT_NAME,\n });\n env += `${networkEnv}=${rpc || \"\"}\\n`;\n toml += `${key}=\"\\${${networkEnv}}\"\\n`;\n });\n\n console.log(\"### .env ###\");\n console.log(env);\n\n console.log(\"### foundry toml ###\");\n console.log(toml);\n },\n );\n}\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n fetchPoolAddresses,\n getClient,\n getReserveTokens,\n getReserveConfigurations,\n} from \"@bgd-labs/toolbox\";\nimport { AaveV3Ethereum } from \"@bgd-labs/aave-address-book\";\n\nexport function registerProtocol(program: Command) {\n program\n .command(\"protocol\")\n .description(\"generated the storage diff between any two files\")\n .action(async () => {\n const mainnetClient = getClient(1, {\n providerConfig: { alchemyKey: process.env.ALCHEMY_API_KEY },\n });\n const contracts = await fetchPoolAddresses(\n mainnetClient,\n AaveV3Ethereum.POOL_ADDRESSES_PROVIDER,\n );\n const reserveTokens = await getReserveTokens(\n mainnetClient,\n contracts.pool,\n );\n const reserveConfigs = await getReserveConfigurations(\n mainnetClient,\n contracts.pool,\n reserveTokens,\n );\n console.log(reserveConfigs);\n });\n}\n","import { IPayloadsControllerCore_ABI } from \"@bgd-labs/aave-address-book/abis\";\nimport { getAddressBookReferences } from \"@bgd-labs/aave-address-book/utils\";\nimport {\n getMdContractName,\n getPayloadsController,\n makePayloadExecutableOnTestClient,\n renderTenderlyReport,\n tenderly_createVnet,\n} from \"@bgd-labs/toolbox\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport {\n Address,\n encodeFunctionData,\n Hex,\n isAddress,\n parseAbi,\n zeroAddress,\n} from \"viem\";\nimport { toAccount } from \"viem/accounts\";\nimport { readContract } from \"viem/actions\";\n\nexport function registerSeatbeltReport(program: Command) {\n program\n .command(\"seatbelt-report\")\n .description(\"generates a seatbelt report for the payload\")\n .addOption(new Option(\"-c,--chainId <number>\").makeOptionMandatory())\n .addOption(new Option(\"--pi,--payloadId <number>\"))\n .addOption(new Option(\"--pa, --payloadAddress <address>\"))\n .addOption(new Option(\"--pb,--payloadBytecode <hex>\"))\n .addOption(new Option(\"--pcd,--payloadCalldata <hex>\"))\n .addOption(\n new Option(\"--pc, --payloadsController <address>\").makeOptionMandatory(),\n )\n .addOption(\n new Option(\"-o, --output <output path>\").default(\"./reports/seatbelt/\"),\n )\n .addOption(\n new Option(\n \"-t, --tenderlyAccessToken <string>\",\n \"defaults to env.TENDERLY_ACCESS_TOKEN\",\n ),\n )\n .addOption(\n new Option(\n \"-a, --tenderlyAccountSlug <string>\",\n \"defaults to env.TENDERLY_ACCOUNT_SLUG\",\n ),\n )\n .addOption(\n new Option(\n \"-p, --tenderlyProjectSlug <string>\",\n \"defaults to env.TENDERLY_PROJECT_SLUG\",\n ),\n )\n .addOption(\n new Option(\n \"-e, --etherscanApiKey <string>\",\n \"defaults to env.ETHERSCAN_API_KEY\",\n ),\n )\n .action(\n async ({\n chainId,\n tenderlyAccessToken,\n tenderlyAccountSlug,\n tenderlyProjectSlug,\n output,\n payloadId,\n payloadAddress,\n payloadBytecode,\n payloadCalldata,\n payloadsController,\n }) => {\n const vnet = await tenderly_createVnet(\n {\n baseChainId: Number(chainId),\n forkChainId: 3030,\n slug: `${Math.floor(Math.random() * 1000)}acli-bgd-labs-vnet-${chainId}`,\n displayName: \"seatbelt\",\n },\n {\n accessToken:\n tenderlyAccessToken || process.env.TENDERLY_ACCESS_TOKEN!,\n accountSlug:\n tenderlyAccountSlug || process.env.TENDERLY_ACCOUNT_SLUG!,\n projectSlug:\n tenderlyProjectSlug || process.env.TENDERLY_PROJECT_SLUG!,\n },\n );\n const controllerContract = getPayloadsController(\n vnet.walletClient,\n payloadsController as Address,\n );\n\n // the current \"count\" will be the id after creation\n let currentId: number = 0;\n\n // in case the controller is permissioned we fetch the manager\n let sender: Address = zeroAddress;\n try {\n sender = await readContract(vnet.testClient, {\n address: controllerContract.address,\n abi: parseAbi([\n \"function payloadsManager() external view returns (address)\",\n ]),\n functionName: \"payloadsManager\",\n });\n } catch (e) {}\n if (payloadId) {\n currentId = Number(payloadId);\n }\n if (payloadBytecode) {\n vnet.testClient.setCode({\n address: \"0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8\",\n bytecode: payloadBytecode as Hex,\n });\n payloadAddress = \"0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8\";\n }\n if (payloadCalldata) {\n currentId = await controllerContract.read.getPayloadsCount();\n await vnet.walletClient.sendTransaction({\n account: toAccount(sender),\n chain: vnet.walletClient.chain,\n to: payloadsController as Address,\n data: payloadCalldata as Hex\n });\n }\n if (payloadAddress) {\n currentId = await controllerContract.read.getPayloadsCount();\n const payload = {\n target: payloadAddress as Address,\n accessLevel: 1,\n callData: \"0x\",\n withDelegateCall: true,\n signature: \"execute()\",\n value: 0n,\n } as const;\n await controllerContract.write.createPayload([[payload]], {\n account: toAccount(sender),\n chain: vnet.walletClient.chain,\n });\n }\n\n await makePayloadExecutableOnTestClient(\n vnet.testClient,\n payloadsController as Address,\n currentId as number,\n );\n\n // simulate executing the payload\n const simResult = await vnet.simulate({\n network_id: chainId.toString(),\n from: sender,\n to: payloadsController,\n input: encodeFunctionData({\n abi: IPayloadsControllerCore_ABI,\n functionName: \"executePayload\",\n args: [currentId],\n }),\n block_number: null,\n transaction_index: 0,\n gas: 30_000_000,\n gas_price: \"0\",\n value: \"0\",\n access_list: [],\n generate_access_list: true,\n save: true,\n source: \"dashboard\",\n });\n\n // after we simulate the execution, we also execute it\n // this way when we query the chain, we can access data as if it was already executed\n await controllerContract.write.executePayload([currentId], {\n account: toAccount(sender),\n chain: vnet.walletClient.chain,\n });\n\n const report = await renderTenderlyReport({\n client: vnet.walletClient,\n sim: simResult,\n payloadId: currentId,\n payload: await controllerContract.read.getPayloadById([currentId]),\n onchainLogs: {} as any,\n config: {\n etherscanApiKey: process.env.ETHERSCAN_API_KEY!,\n },\n getContractName: (sim, address) => {\n const references = getAddressBookReferences(\n address,\n Number(sim.simulation.network_id),\n );\n if (references.length > 0)\n return flagAsKnown(\n getMdContractName(sim.contracts, address),\n references[0],\n );\n return getMdContractName(sim.contracts, address);\n },\n });\n\n const filePath = `${output}/${chainId}_${payloadsController}`;\n mkdirSync(filePath, { recursive: true });\n writeFileSync(`${filePath}/${currentId}.md`, report.report);\n // await vnet.delete();\n },\n );\n}\n\nfunction flagAsKnown(value: string, reference: string) {\n return `${value} [:ghost:](https://github.com/bgd-labs/aave-address-book \"${reference}\")`;\n}\n"],"mappings":"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","names":["Command","program","Option","program","Option","answer","key","Option","program","Option","program","program","getPayloadsController","makePayloadExecutableOnTestClient","tenderly_createVnet","Option","mkdirSync","writeFileSync","parseAbi","zeroAddress","toAccount","readContract","program","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgd-labs/cli",
3
- "version": "0.0.48",
3
+ "version": "0.0.50",
4
4
  "main": "./dist/index.mjs",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",
@@ -26,7 +26,7 @@
26
26
  "@inquirer/prompts": "^7.3.2",
27
27
  "dotenv": "^16.4.7",
28
28
  "viem": "^2.30.0",
29
- "@bgd-labs/toolbox": "0.0.39"
29
+ "@bgd-labs/toolbox": "0.0.40"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsup src/index.ts",