From e641f95be678b3384b7eb575605ed33b496265f5 Mon Sep 17 00:00:00 2001 From: Mikhailo Shabodyash Date: Fri, 13 Dec 2024 13:43:11 +0200 Subject: [PATCH 1/5] fix: no network issue resolved --- hardhat.config.ts | 15 +++++--- plugins/scenario/Runner.ts | 55 +++++++++++++++++++++++----- plugins/scenario/World.ts | 10 +++-- plugins/scenario/utils/hreForBase.ts | 16 +++++--- tasks/deployment_manager/task.ts | 14 +++---- tasks/scenario/task.ts | 2 +- 6 files changed, 80 insertions(+), 32 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index f7a92ce4b..2e474d544 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -112,11 +112,16 @@ interface NetworkConfig { } const networkConfigs: NetworkConfig[] = [ - { network: 'mainnet', chainId: 1 }, - { network: 'ropsten', chainId: 3 }, - { network: 'rinkeby', chainId: 4 }, - { network: 'goerli', chainId: 5 }, - { network: 'sepolia', chainId: 11155111 }, + { + network: 'mainnet', + chainId: 1, + url: `https://rpc.ankr.com/eth/${ANKR_KEY}`, + }, + { + network: 'sepolia', + chainId: 11155111, + url: `https://rpc.ankr.com/eth_sepolia/${ANKR_KEY}`, + }, { network: 'polygon', chainId: 137, diff --git a/plugins/scenario/Runner.ts b/plugins/scenario/Runner.ts index da19c4ebc..1791e3198 100644 --- a/plugins/scenario/Runner.ts +++ b/plugins/scenario/Runner.ts @@ -153,6 +153,37 @@ export class Runner { } } + +async function retry(fn: () => Promise, retries: number = 10, timeLimit?: number, wait: number = 100) { + try { + return await asyncCallWithTimeout(fn(), timeLimit); + } catch (e) { + if (retries === 0) throw e; + if(e.reason !== 'could not detect network') + throw e; + + console.warn(`Retrying in ${wait}ms...`); + + await new Promise(ok => setTimeout(ok, wait)); + return retry(fn, retries - 1, timeLimit, wait >= 10000 ? 10000 : wait * 2); + } +} +async function asyncCallWithTimeout(asyncPromise: Promise, timeLimit: number = 5000_000) { + let timeoutHandle: string | number | NodeJS.Timeout; + + const timeoutPromise = new Promise((_resolve, reject) => { + timeoutHandle = setTimeout( + () => reject(new Error('Async call timeout limit reached')), + timeLimit + ); + }); + + return Promise.race([asyncPromise, timeoutPromise]).then(result => { + clearTimeout(timeoutHandle); + return result; + }); +} + export async function runScenarios(bases: ForkSpec[]) { const loader = await Loader.load(); const [runningScenarios, skippedScenarios] = loader.splitScenarios(); @@ -161,16 +192,20 @@ export async function runScenarios(bases: ForkSpec[]) { const results: Result[] = []; for (const base of bases) { - const world = new World(base), dm = world.deploymentManager; - const delta = await dm.runDeployScript({ allMissing: true }); - console.log(`[${base.name}] Deployed ${dm.counter} contracts, spent ${dm.spent} to initialize world 🗺`); - console.log(`[${base.name}]\n${dm.diffDelta(delta)}`); - - if (world.auxiliaryDeploymentManager) { - await world.auxiliaryDeploymentManager.spider(); - } - - const runner = new Runner(base, world); + let runner: Runner; + await retry(async () => { + const world = new World(base); + await world.initialize(base); + const dm = world.deploymentManager; + const delta = await dm.runDeployScript({ allMissing: true }); + console.log(`[${base.name}] Deployed ${dm.counter} contracts, spent ${dm.spent} to initialize world 🗺`); + console.log(`[${base.name}]\n${dm.diffDelta(delta)}`); + + if (world.auxiliaryDeploymentManager) { + await world.auxiliaryDeploymentManager.spider(); + } + runner = new Runner(base, world); + }); // NB: contexts are (still) a bit awkward // they prob dont even really need to get passed through here currently diff --git a/plugins/scenario/World.ts b/plugins/scenario/World.ts index ffc8bdb10..35c0b53c6 100644 --- a/plugins/scenario/World.ts +++ b/plugins/scenario/World.ts @@ -28,15 +28,17 @@ export class World { snapshotAuxiliaryDeploymentManager?: DeploymentManager; constructor(base: ForkSpec) { - // Q: should we really need to fork/snapshot the deployment manager? - const hre = hreForBase(base); this.base = base; + } + + async initialize(base: ForkSpec) { + const hre = await hreForBase(base); this.deploymentManager = new DeploymentManager(base.network, base.deployment, hre); + // Q: should we really need to fork/snapshot the deployment manager? this.snapshotDeploymentManager = this.deploymentManager; - if (this.base.auxiliaryBase) { const auxiliaryBase = hre.config.scenario.bases.find(b => b.name === this.base.auxiliaryBase); - this.auxiliaryDeploymentManager = new DeploymentManager(auxiliaryBase.network, auxiliaryBase.deployment, hreForBase(auxiliaryBase)); + this.auxiliaryDeploymentManager = new DeploymentManager(auxiliaryBase.network, auxiliaryBase.deployment, await hreForBase(auxiliaryBase)); this.snapshotAuxiliaryDeploymentManager = this.auxiliaryDeploymentManager; } } diff --git a/plugins/scenario/utils/hreForBase.ts b/plugins/scenario/utils/hreForBase.ts index 5609d9572..454af84e3 100644 --- a/plugins/scenario/utils/hreForBase.ts +++ b/plugins/scenario/utils/hreForBase.ts @@ -1,4 +1,4 @@ -import type { ethers } from 'ethers'; +import { ethers } from 'ethers'; import type { HardhatEthersHelpers } from '@nomiclabs/hardhat-ethers/types'; import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { HardhatContext } from 'hardhat/internal/context'; @@ -36,7 +36,7 @@ declare module 'hardhat/internal/core/runtime-environment' { } } -export function nonForkedHreForBase(base: ForkSpec): HardhatRuntimeEnvironment { +export async function nonForkedHreForBase(base: ForkSpec): Promise { const ctx: HardhatContext = HardhatContext.getHardhatContext(); const hardhatArguments = getEnvHardhatArguments( @@ -61,7 +61,7 @@ export function nonForkedHreForBase(base: ForkSpec): HardhatRuntimeEnvironment { ); } -export function forkedHreForBase(base: ForkSpec): HardhatRuntimeEnvironment { +export async function forkedHreForBase(base: ForkSpec): Promise { const ctx: HardhatContext = HardhatContext.getHardhatContext(); const hardhatArguments = getEnvHardhatArguments(HARDHAT_PARAM_DEFINITIONS, process.env); @@ -73,6 +73,12 @@ export function forkedHreForBase(base: ForkSpec): HardhatRuntimeEnvironment { const baseNetwork = networks[base.network] as HttpNetworkUserConfig; + const provider = new ethers.providers.JsonRpcProvider(baseNetwork.url); + + // noNetwork otherwise + if(!base.blockNumber) + base.blockNumber = await provider.getBlockNumber() - 210; // arbitrary number of blocks to go back, about 1 hour + if (!baseNetwork) { throw new Error(`cannot find network config for network: ${base.network}`); } @@ -96,7 +102,7 @@ export function forkedHreForBase(base: ForkSpec): HardhatRuntimeEnvironment { defaultNetwork: 'hardhat', networks: { hardhat: forkedNetwork, - localhost + localhost: localhost }, }, }; @@ -111,7 +117,7 @@ export function forkedHreForBase(base: ForkSpec): HardhatRuntimeEnvironment { ); } -export default function hreForBase(base: ForkSpec, fork = true): HardhatRuntimeEnvironment { +export default async function hreForBase(base: ForkSpec, fork = true): Promise { if (fork) { return forkedHreForBase(base); } else { diff --git a/tasks/deployment_manager/task.ts b/tasks/deployment_manager/task.ts index 5e08b7e37..1a7d84997 100644 --- a/tasks/deployment_manager/task.ts +++ b/tasks/deployment_manager/task.ts @@ -7,12 +7,12 @@ import { impersonateAddress } from '../../plugins/scenario/utils'; import hreForBase from '../../plugins/scenario/utils/hreForBase'; // TODO: Don't depend on scenario's hreForBase -function getForkEnv(env: HardhatRuntimeEnvironment, deployment: string): HardhatRuntimeEnvironment { +async function getForkEnv(env: HardhatRuntimeEnvironment, deployment: string): Promise { const base = env.config.scenario.bases.find(b => b.network == env.network.name && b.deployment == deployment); if (!base) { throw new Error(`No fork spec for ${env.network.name}`); } - return hreForBase(base); + return await hreForBase(base); } function getDefaultDeployment(config: HardhatConfig, network: string): string { @@ -65,7 +65,7 @@ task('deploy', 'Deploys market') .addFlag('overwrite', 'overwrites cache') .addParam('deployment', 'The deployment to deploy') .setAction(async ({ simulate, noDeploy, noVerify, noVerifyImpl, overwrite, deployment }, env) => { - const maybeForkEnv = simulate ? getForkEnv(env, deployment) : env; + const maybeForkEnv = simulate ? await getForkEnv(env, deployment) : env; const network = env.network.name; const tag = `${network}/${deployment}`; const dm = new DeploymentManager( @@ -174,7 +174,7 @@ task('migrate', 'Runs migration') .addFlag('overwrite', 'overwrites artifact if exists, fails otherwise') .setAction( async ({ migration: migrationName, prepare, enact, noEnacted, simulate, overwrite, deployment, impersonate }, env) => { - const maybeForkEnv = simulate ? getForkEnv(env, deployment) : env; + const maybeForkEnv = simulate ? await getForkEnv(env, deployment) : env; const network = env.network.name; const dm = new DeploymentManager( network, @@ -193,7 +193,7 @@ task('migrate', 'Runs migration') const governanceBase = isBridgedDeployment ? env.config.scenario.bases.find(b => b.name === base.auxiliaryBase) : undefined; if (governanceBase) { - const governanceEnv = hreForBase(governanceBase, simulate); + const governanceEnv = await hreForBase(governanceBase, simulate); governanceDm = new DeploymentManager( governanceBase.network, governanceBase.deployment, @@ -246,7 +246,7 @@ task('deploy_and_migrate', 'Runs deploy and migration') .addParam('deployment', 'The deployment to deploy') .setAction( async ({ migration: migrationName, prepare, enact, noEnacted, simulate, overwrite, deployment, impersonate, noDeploy, noVerify, noVerifyImpl }, env) => { - const maybeForkEnv = simulate ? getForkEnv(env, deployment) : env; + const maybeForkEnv = simulate ? await getForkEnv(env, deployment) : env; const network = env.network.name; const tag = `${network}/${deployment}`; const dm = new DeploymentManager( @@ -314,7 +314,7 @@ task('deploy_and_migrate', 'Runs deploy and migration') const governanceBase = isBridgedDeployment ? env.config.scenario.bases.find(b => b.name === base.auxiliaryBase) : undefined; if (governanceBase) { - const governanceEnv = hreForBase(governanceBase, simulate); + const governanceEnv = await hreForBase(governanceBase, simulate); governanceDm = new DeploymentManager( governanceBase.network, governanceBase.deployment, diff --git a/tasks/scenario/task.ts b/tasks/scenario/task.ts index 658623144..36ddc1c1b 100644 --- a/tasks/scenario/task.ts +++ b/tasks/scenario/task.ts @@ -39,7 +39,7 @@ task('scenario:spider', 'Runs spider in preparation for scenarios') const bases: ForkSpec[] = getBasesFromTaskArgs(taskArgs.bases, env); await Promise.all(bases.map(async (base) => { if (base.network !== 'hardhat') { - let hre = hreForBase(base); + let hre = await hreForBase(base); let dm = new DeploymentManager( base.name, base.deployment, From ba685b6e05030721fb396332388fc2aedbb22c0e Mon Sep 17 00:00:00 2001 From: Mikhailo Shabodyash Date: Fri, 13 Dec 2024 19:19:55 +0200 Subject: [PATCH 2/5] Create 1733936182_add_fbtc_collateral.ts --- .../1733936182_add_fbtc_collateral.ts | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts diff --git a/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts b/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts new file mode 100644 index 000000000..900088251 --- /dev/null +++ b/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts @@ -0,0 +1,130 @@ +import { expect } from 'chai'; +import { DeploymentManager } from '../../../../plugins/deployment_manager/DeploymentManager'; +import { migration } from '../../../../plugins/deployment_manager/Migration'; +import { exp, proposal } from '../../../../src/deploy'; + +const FBTC_ADDRESS = '0xC96dE26018A54D51c097160568752c4E3BD6C364'; +const FBTC_TO_BTC_PRICE_FEED = '0xe5346a4Fd329768A99455d969724768a00CA63FB'; +const BTC_TO_USD_PRICE_FEED = '0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c'; + +let newPriceFeedAddress: string; + +export default migration('1733936182_add_fbtc_collateral', { + async prepare(deploymentManager: DeploymentManager) { + const FBTCMultiplicativePriceFeed = await deploymentManager.deploy( + 'FBTC:priceFeed', + 'pricefeeds/MultiplicativePriceFeed.sol', + [ + FBTC_TO_BTC_PRICE_FEED, // FBTC / BTC price feed + BTC_TO_USD_PRICE_FEED, // BTC / USD price feed + 8, // decimals + 'FBTC / USD price feed' // description + ] + ); + return { FBTCPriceFeedAddress: FBTCMultiplicativePriceFeed.address }; + }, + + async enact(deploymentManager: DeploymentManager, _, { FBTCPriceFeedAddress }) { + + const trace = deploymentManager.tracer(); + + const FBTC = await deploymentManager.existing( + 'FBTC', + FBTC_ADDRESS, + 'mainnet', + 'contracts/ERC20.sol:ERC20' + ); + const FBTCPriceFeed = await deploymentManager.existing( + 'FBTC:priceFeed', + FBTCPriceFeedAddress, + 'mainnet' + ); + + newPriceFeedAddress = FBTCPriceFeedAddress; + + const { + governor, + comet, + cometAdmin, + configurator, + } = await deploymentManager.getContracts(); + + const FBTCAssetConfig = { + asset: FBTC.address, + priceFeed: FBTCPriceFeed.address, + decimals: await FBTC.decimals(), + borrowCollateralFactor: exp(0.8, 18), + liquidateCollateralFactor: exp(0.85, 18), + liquidationFactor: exp(0.9, 18), + supplyCap: exp(90, 8), + }; + + const mainnetActions = [ + // 1. Add FBTC as asset + { + contract: configurator, + signature: 'addAsset(address,(address,address,uint8,uint64,uint64,uint64,uint128))', + args: [comet.address, FBTCAssetConfig], + }, + // 2. Deploy and upgrade to a new version of Comet + { + contract: cometAdmin, + signature: 'deployAndUpgradeTo(address,address)', + args: [configurator.address, comet.address], + }, + ]; + + const description = '# Add FBTC as collateral into cUSDCv3 on Mainnet\n\n## Proposal summary\n\nCompound Growth Program [AlphaGrowth] proposes to add FBTC into cUSDCv3 on Ethereum network. This proposal takes the governance steps recommended and necessary to update a Compound III USDC market on Ethereum. Simulations have confirmed the market’s readiness, as much as possible, using the [Comet scenario suite](https://github.com/compound-finance/comet/tree/main/scenario). The new parameters include setting the risk parameters based on the [recommendations from Gauntlet](https://www.comp.xyz/t/add-collateral-fbtc-on-eth-usdt-usdc-markets-on-mainnet/5936/2).\n\nFurther detailed information can be found on the corresponding [proposal pull request](https://github.com/compound-finance/comet/pull/951) and [forum discussion](https://www.comp.xyz/t/add-collateral-fbtc-on-eth-usdt-usdc-markets-on-mainnet/5936).\n\n\n## Proposal Actions\n\nThe first action adds FBTC asset as collateral with corresponding configurations.\n\nThe second action deploys and upgrades Comet to a new version.'; + const txn = await deploymentManager.retry(async () => + trace( + await governor.propose(...(await proposal(mainnetActions, description))) + ) + ); + + const event = txn.events.find( + (event) => event.event === 'ProposalCreated' + ); + const [proposalId] = event.args; + trace(`Created proposal ${proposalId}.`); + }, + + async enacted(): Promise { + return false; + }, + + async verify(deploymentManager: DeploymentManager) { + const { comet, configurator } = await deploymentManager.getContracts(); + + const FBTCAssetIndex = Number(await comet.numAssets()) - 1; + + const FBTCAssetConfig = { + asset: FBTC_ADDRESS, + priceFeed: newPriceFeedAddress, + decimals: 8, + borrowCollateralFactor: exp(0.8, 18), + liquidateCollateralFactor: exp(0.85, 18), + liquidationFactor: exp(0.9, 18), + supplyCap: exp(90, 8), + }; + + // 1. Compare FBTC asset config with Comet and Configurator asset info + const cometFBTCAssetInfo = await comet.getAssetInfoByAddress(FBTC_ADDRESS); + expect(FBTCAssetIndex).to.be.equal(cometFBTCAssetInfo.offset); + expect(FBTCAssetConfig.asset).to.be.equal(cometFBTCAssetInfo.asset); + expect(FBTCAssetConfig.priceFeed).to.be.equal(cometFBTCAssetInfo.priceFeed); + expect(exp(1, FBTCAssetConfig.decimals)).to.be.equal(cometFBTCAssetInfo.scale); + expect(FBTCAssetConfig.borrowCollateralFactor).to.be.equal(cometFBTCAssetInfo.borrowCollateralFactor); + expect(FBTCAssetConfig.liquidateCollateralFactor).to.be.equal(cometFBTCAssetInfo.liquidateCollateralFactor); + expect(FBTCAssetConfig.liquidationFactor).to.be.equal(cometFBTCAssetInfo.liquidationFactor); + expect(FBTCAssetConfig.supplyCap).to.be.equal(cometFBTCAssetInfo.supplyCap); + + const configuratorFBTCAssetConfig = (await configurator.getConfiguration(comet.address)).assetConfigs[FBTCAssetIndex]; + expect(FBTCAssetConfig.asset).to.be.equal(configuratorFBTCAssetConfig.asset); + expect(FBTCAssetConfig.priceFeed).to.be.equal(configuratorFBTCAssetConfig.priceFeed); + expect(FBTCAssetConfig.decimals).to.be.equal(configuratorFBTCAssetConfig.decimals); + expect(FBTCAssetConfig.borrowCollateralFactor).to.be.equal(configuratorFBTCAssetConfig.borrowCollateralFactor); + expect(FBTCAssetConfig.liquidateCollateralFactor).to.be.equal(configuratorFBTCAssetConfig.liquidateCollateralFactor); + expect(FBTCAssetConfig.liquidationFactor).to.be.equal(configuratorFBTCAssetConfig.liquidationFactor); + expect(FBTCAssetConfig.supplyCap).to.be.equal(configuratorFBTCAssetConfig.supplyCap); + }, +}); \ No newline at end of file From e205cb8fcce85703c30f60f6e9c97083a4cc5d66 Mon Sep 17 00:00:00 2001 From: Mikhailo Shabodyash Date: Fri, 13 Dec 2024 22:11:42 +0200 Subject: [PATCH 3/5] fix: add token holders --- src/deploy/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/deploy/index.ts b/src/deploy/index.ts index fde711912..26c2abb79 100644 --- a/src/deploy/index.ts +++ b/src/deploy/index.ts @@ -92,7 +92,9 @@ export const WHALES = { '0x426c4966fC76Bf782A663203c023578B744e4C5E', // wUSDM whale '0x88a1493366D48225fc3cEFbdae9eBb23E323Ade3', // USDe whale '0x43594da5d6A03b2137a04DF5685805C676dEf7cB', // rsETH whale - '0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b' + '0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b', + '0x83F8E5Bdc5953276DfDDc0FcC6A7C11Bf9242764', // FBTC whale + '0x4ADF44961a7CBe8EE46B2bf04E7198e879677825', // FBTC whale ], polygon: [ '0x2093b4281990a568c9d588b8bce3bfd7a1557ebd', // WETH whale @@ -115,7 +117,8 @@ export const WHALES = { '0xee3273f6d29ddfff08ffd9d513cff314734f01a2', // COMP whale '0x9e786a8fc88ee74b758b125071d45853356024c3', // COMP whale '0xd93f76944e870900779c09ddf1c46275f9d8bf9b', // COMP whale - '0xe68ee8a12c611fd043fb05d65e1548dc1383f2b9' // native USDC whale + '0xe68ee8a12c611fd043fb05d65e1548dc1383f2b9', // native USDC whale + '0x1c6b5795be43ddff8812b3e577ac752764635bc5', // native COMP whale ], base: [ '0x6D3c5a4a7aC4B1428368310E4EC3bB1350d01455', // USDbC whale From 687ba54dc447e31cba5fc982aa4318d2adbfa1bd Mon Sep 17 00:00:00 2001 From: Mikhailo Shabodyash Date: Tue, 17 Dec 2024 13:35:21 +0200 Subject: [PATCH 4/5] fix: pr link --- .../mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts b/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts index 900088251..625f5612c 100644 --- a/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts +++ b/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts @@ -74,7 +74,7 @@ export default migration('1733936182_add_fbtc_collateral', { }, ]; - const description = '# Add FBTC as collateral into cUSDCv3 on Mainnet\n\n## Proposal summary\n\nCompound Growth Program [AlphaGrowth] proposes to add FBTC into cUSDCv3 on Ethereum network. This proposal takes the governance steps recommended and necessary to update a Compound III USDC market on Ethereum. Simulations have confirmed the market’s readiness, as much as possible, using the [Comet scenario suite](https://github.com/compound-finance/comet/tree/main/scenario). The new parameters include setting the risk parameters based on the [recommendations from Gauntlet](https://www.comp.xyz/t/add-collateral-fbtc-on-eth-usdt-usdc-markets-on-mainnet/5936/2).\n\nFurther detailed information can be found on the corresponding [proposal pull request](https://github.com/compound-finance/comet/pull/951) and [forum discussion](https://www.comp.xyz/t/add-collateral-fbtc-on-eth-usdt-usdc-markets-on-mainnet/5936).\n\n\n## Proposal Actions\n\nThe first action adds FBTC asset as collateral with corresponding configurations.\n\nThe second action deploys and upgrades Comet to a new version.'; + const description = '# Add FBTC as collateral into cUSDCv3 on Mainnet\n\n## Proposal summary\n\nCompound Growth Program [AlphaGrowth] proposes to add FBTC into cUSDCv3 on Ethereum network. This proposal takes the governance steps recommended and necessary to update a Compound III USDC market on Ethereum. Simulations have confirmed the market’s readiness, as much as possible, using the [Comet scenario suite](https://github.com/compound-finance/comet/tree/main/scenario). The new parameters include setting the risk parameters based on the [recommendations from Gauntlet](https://www.comp.xyz/t/add-collateral-fbtc-on-eth-usdt-usdc-markets-on-mainnet/5936/2).\n\nFurther detailed information can be found on the corresponding [proposal pull request](https://github.com/compound-finance/comet/pull/952) and [forum discussion](https://www.comp.xyz/t/add-collateral-fbtc-on-eth-usdt-usdc-markets-on-mainnet/5936).\n\n\n## Proposal Actions\n\nThe first action adds FBTC asset as collateral with corresponding configurations.\n\nThe second action deploys and upgrades Comet to a new version.'; const txn = await deploymentManager.retry(async () => trace( await governor.propose(...(await proposal(mainnetActions, description))) From dadfe556e1e38b0e8b7b43d23d7a9b3646198e01 Mon Sep 17 00:00:00 2001 From: Dmitriy Babenko <159453675+dmitriy-woof-software@users.noreply.github.com> Date: Mon, 13 Jan 2025 23:36:08 -0600 Subject: [PATCH 5/5] Trigger to run actions --- .../mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts b/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts index 625f5612c..18f316c9a 100644 --- a/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts +++ b/deployments/mainnet/usdc/migrations/1733936182_add_fbtc_collateral.ts @@ -107,7 +107,7 @@ export default migration('1733936182_add_fbtc_collateral', { supplyCap: exp(90, 8), }; - // 1. Compare FBTC asset config with Comet and Configurator asset info + // 1. Compare FBTC asset config with Comet and Configurator asset info const cometFBTCAssetInfo = await comet.getAssetInfoByAddress(FBTC_ADDRESS); expect(FBTCAssetIndex).to.be.equal(cometFBTCAssetInfo.offset); expect(FBTCAssetConfig.asset).to.be.equal(cometFBTCAssetInfo.asset); @@ -127,4 +127,4 @@ export default migration('1733936182_add_fbtc_collateral', { expect(FBTCAssetConfig.liquidationFactor).to.be.equal(configuratorFBTCAssetConfig.liquidationFactor); expect(FBTCAssetConfig.supplyCap).to.be.equal(configuratorFBTCAssetConfig.supplyCap); }, -}); \ No newline at end of file +});