From fabbafa789dc72587fc792e4f25c2d545ef64679 Mon Sep 17 00:00:00 2001 From: sakulstra Date: Mon, 25 Sep 2023 15:42:42 +0200 Subject: [PATCH] feat: add eMode updates --- generator/features/eModesUpdates.ts | 81 +++++++++++++++++++++++++ generator/features/priceFeedsUpdates.ts | 2 +- generator/generator.ts | 6 +- generator/prompts.ts | 21 +++++++ 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 generator/features/eModesUpdates.ts diff --git a/generator/features/eModesUpdates.ts b/generator/features/eModesUpdates.ts new file mode 100644 index 00000000..5d514097 --- /dev/null +++ b/generator/features/eModesUpdates.ts @@ -0,0 +1,81 @@ +import {CodeArtifact, DEPENDENCIES, FeatureModule, PoolIdentifier} from '../types'; +import {NumberInputValues, addressInput, eModesSelect, percentInput, stringInput} from '../prompts'; +import {Hex} from 'viem'; + +async function subCli(pool: PoolIdentifier) { + console.log(`Fetching information for PriceFeeds on ${pool}`); + const eModeCategories = await eModesSelect({ + message: 'Select the eModes you want to amend', + pool, + }); + const answers: EmodeUpdates = []; + for (const eModeCategory of eModeCategories) { + console.log(`collecting info for ${eModeCategory}`); + answers.push({ + eModeCategory, + ltv: await percentInput({ + message: 'ltv', + }), + liqThreshold: await percentInput({ + message: 'liqThreshold', + }), + liqBonus: await percentInput({ + message: 'liqBonus', + }), + priceSource: await addressInput({ + message: 'Price Source', + }), + label: await stringInput({message: 'label'}), + }); + } + return answers; +} + +type EmodeUpdate = { + eModeCategory: string; + ltv: NumberInputValues; + liqThreshold: NumberInputValues; + liqBonus: NumberInputValues; + priceSource: Hex; + label: string; +}; + +type EmodeUpdates = EmodeUpdate[]; + +export const eModeUpdates: FeatureModule = { + value: 'eModeCategoriesUpdates (altering eModes)', + async cli(opt, pool) { + const response: EmodeUpdates = await subCli(pool); + return response; + }, + build(opt, pool, cfg) { + const response: CodeArtifact = { + code: { + dependencies: [DEPENDENCIES.Assets, DEPENDENCIES.Engine], + fn: [ + `function eModeCategoriesUpdates() public pure override returns (IEngine.EModeCategoryUpdate[] memory) { + IEngine.EModeCategoryUpdate[] memory eModeUpdates = new IEngine.EModeCategoryUpdate[](${ + cfg.length + }); + + ${cfg + .map( + (cfg, ix) => `eModeUpdates[${ix}] = IEngine.EModeCategoryUpdate({ + eModeCategory: ${cfg.eModeCategory}, + ltv: ${cfg.ltv}, + liqThreshold: ${cfg.liqThreshold}, + liqBonus: ${cfg.liqBonus}, + priceSource: ${cfg.priceSource}, + label: ${cfg.label} + });` + ) + .join('\n')} + + return eModeUpdates; + }`, + ], + }, + }; + return response; + }, +}; diff --git a/generator/features/priceFeedsUpdates.ts b/generator/features/priceFeedsUpdates.ts index 0bdeef25..fe16dae5 100644 --- a/generator/features/priceFeedsUpdates.ts +++ b/generator/features/priceFeedsUpdates.ts @@ -27,7 +27,7 @@ type PriceFeedUpdate = { type PriceFeedUpdates = PriceFeedUpdate[]; -export const capsUpdates: FeatureModule = { +export const priceFeedsUpdates: FeatureModule = { value: 'PriceFeedsUpdates (replacing priceFeeds)', async cli(opt, pool) { const response: PriceFeedUpdates = await subCli(pool); diff --git a/generator/generator.ts b/generator/generator.ts index 5d9736bc..ccab36d4 100644 --- a/generator/generator.ts +++ b/generator/generator.ts @@ -22,6 +22,8 @@ import {generateScript} from './templates/script.template'; import {generateAIP} from './templates/aip.template'; import {collateralsUpdates} from './features/collateralsUpdates'; import {borrowsUpdates} from './features/borrowsUpdates'; +import {eModeUpdates} from './features/eModesUpdates'; +import {priceFeedsUpdates} from './features/priceFeedsUpdates'; const prettierSolCfg = await prettier.resolveConfig('foo.sol'); const prettierMDCfg = await prettier.resolveConfig('foo.md'); @@ -108,6 +110,8 @@ const FEATURE_MODULES_V3 = [ collateralsUpdates, borrowsUpdates, flashBorrower, + priceFeedsUpdates, + eModeUpdates, { value: 'Something different supported by config engine(but not the generator, yet)', cli: async (opt, pool) => { @@ -133,7 +137,7 @@ for (const pool of options.pools) { }); let artifacts: CodeArtifact[] = []; for (const feature of features) { - const module: FeatureModule = v2 + const module: FeatureModule = v2 ? FEATURE_MODULES_V2.find((m) => m.value === feature)! : FEATURE_MODULES_V3.find((m) => m.value === feature)!; if (module.cli) { diff --git a/generator/prompts.ts b/generator/prompts.ts index 327ab9a1..1cefec40 100644 --- a/generator/prompts.ts +++ b/generator/prompts.ts @@ -94,6 +94,7 @@ export async function addressInput({message, disableKeepCurrent}: GenericPrompt) const value = await input({ message, validate: (value) => (isAddress(value) ? true : 'Must be a valid address'), + ...(disableKeepCurrent ? {} : {default: ENGINE_FLAGS.KEEP_CURRENT_ADDRESS}), }); return getAddress(value); } @@ -124,3 +125,23 @@ export async function eModeSelect({message, disableKeepCurrent, pool}: EModeSele }); return translateJsNumberToSol(eMode); } + +export async function eModesSelect({message, pool}: EModeSelectPrompt) { + const eModes = getEModes(pool as any); + const eMode = await checkbox({ + message, + choices: [ + ...Object.keys(eModes) + .map((eMode) => ({name: eMode, value: eModes[eMode]})) + .filter((e) => e.value != 0), + ], + }); + return eMode.map((eMode) => translateJsNumberToSol(eMode)); +} + +export async function stringInput({message, disableKeepCurrent}: GenericPrompt) { + return input({ + message, + ...(disableKeepCurrent ? {} : {default: ENGINE_FLAGS.KEEP_CURRENT_STRING}), + }); +}