Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
ee65afb
current dev
MishaShWoof Jul 25, 2025
7e08ec9
fix: working dev
MishaShWoof Jul 25, 2025
2bb3587
fix: scenarios
MishaShWoof Jul 28, 2025
9f5564c
fix
MishaShWoof Jul 28, 2025
88fe803
fix
MishaShWoof Jul 28, 2025
8b5ee76
Update index.ts
MishaShWoof Jul 28, 2025
700a4c6
Update DeploymentManager.ts
MishaShWoof Jul 29, 2025
4cbf863
fix: unit tests
MishaShWoof Aug 14, 2025
2bc2dbf
fix: working linea scenarios and prepare workflow fix
MishaShWoof Aug 20, 2025
0313418
Merge branch 'main' of github.com:woof-software/comet into develop
MishaShWoof Sep 16, 2025
688d515
fix: remove linea markets from dev
MishaShWoof Sep 16, 2025
df8d724
fix: remove localhost deployment
MishaShWoof Sep 19, 2025
0001bd6
fix: unify import
MishaShWoof Sep 22, 2025
d04a40d
Merge branch 'main' of github.com:woof-software/comet into develop
MishaShWoof Sep 25, 2025
2621df6
Merge branch 'main' of github.com:woof-software/comet into develop
MishaShWoof Nov 11, 2025
aceaf43
fixes from recent prs
MishaShWoof Nov 11, 2025
3f9caef
fix: change base rpc
MishaShWoof Nov 12, 2025
68f6aab
fix: change rpc
MishaShWoof Nov 14, 2025
d2801ea
fix: replace ankr with quicknode
MishaShWoof Nov 17, 2025
001b60c
Merge branch 'main' of github.com:woof-software/comet into develop
MishaShWoof Nov 24, 2025
38a9d9e
fix: working tests
MishaShWoof Nov 24, 2025
525e5a8
fix: working forge test
MishaShWoof Nov 24, 2025
d73df39
Update run-forge-tests.yaml
MishaShWoof Nov 24, 2025
640d956
Update run-forge-tests.yaml
MishaShWoof Nov 24, 2025
49ac136
Update run-scenarios.yaml
MishaShWoof Nov 27, 2025
a16813a
fix: env in scenario
MishaShWoof Nov 27, 2025
0407aa6
fix: use different keys for etherscan
MishaShWoof Nov 27, 2025
1a368d4
fix: strict order
MishaShWoof Nov 27, 2025
a34434f
fix: pass the prepared state
MishaShWoof Nov 27, 2025
9d6c077
fix: remove matrix
MishaShWoof Nov 27, 2025
58ed478
fix: pass node modules
MishaShWoof Nov 27, 2025
0e67e92
fix: add contracts to cache before scenario run
MishaShWoof Nov 28, 2025
bc0871e
fix: cache path fix
MishaShWoof Nov 28, 2025
5f4fc6f
fix: use hidden files
MishaShWoof Nov 28, 2025
5a77147
fix: fuji
MishaShWoof Nov 28, 2025
b287ff2
feat: rotate apikeys and some arbitrum fixes
MishaShWoof Dec 2, 2025
070fda2
Merge pull request #279 from woof-software/speed-up-scenarios
MishaShWoof Dec 3, 2025
98e6783
fix: working arbitrum scenarios
MishaShWoof Dec 3, 2025
b2b05a2
fix: teth symbol fix
MishaShWoof Dec 3, 2025
a0fdad7
fix: add debug for spider
MishaShWoof Dec 3, 2025
0cf69cd
Merge branch 'main' of github.com:woof-software/comet into develop
MishaShWoof Dec 22, 2025
e7f8ce6
fix: ronin and forge test fixes
MishaShWoof Dec 22, 2025
b3456da
fix: working arbitrum scenarios
MishaShWoof Dec 24, 2025
8b2ea24
new fixes
MishaShWoof Feb 23, 2026
73cb01d
fix
MishaShWoof Feb 23, 2026
7d4a913
fix: precision fix
MishaShWoof Feb 23, 2026
f3ebdba
fix: change scroll rpc
MishaShWoof Apr 9, 2026
9a5d94c
feat: simulation for proposal, that target multiple l2 chains
MishaShWoof Apr 24, 2026
ccc4855
fix: update relations and cctp addresses
MishaShWoof Apr 24, 2026
5f6c765
Merge branch 'develop' of github.com:woof-software/comet into feat/mu…
MishaShWoof Apr 24, 2026
56096fc
fix: clean up
MishaShWoof Apr 24, 2026
e5144db
fix
MishaShWoof Apr 24, 2026
c980175
fix: handle max gaslimit per tx
MishaShWoof May 1, 2026
750ede2
fix: slither
MishaShWoof May 1, 2026
e02ba0d
fix: change capo branch
MishaShWoof May 13, 2026
954a635
Merge branch 'develop' of github.com:woof-software/comet into feat/mu…
MishaShWoof May 14, 2026
cb19c8f
feat: tenderly simulations for multiple messages for one network
MishaShWoof May 14, 2026
e18d7a8
fix: supply and withdraw scenario fixes
MishaShWoof May 19, 2026
a9747c9
feat: recent proposals
MishaShWoof May 21, 2026
c1c411a
fix: speed up gas tests
MishaShWoof May 21, 2026
2c7d198
fix: set enacted to true
MishaShWoof May 21, 2026
7b738e5
fix: remove redundant migrations
MishaShWoof May 22, 2026
eadf6f4
fix: undo delition
MishaShWoof May 22, 2026
65bf0e4
feat: migration
MishaShWoof May 22, 2026
3fa95dd
fix: update seacrest commit
MishaShWoof May 22, 2026
02fa203
fix: update seacrest commit
MishaShWoof May 25, 2026
112f54d
fix: add whale
MishaShWoof May 25, 2026
ce56ef7
Merge branch 'feat/multichain-proposal-simulation' of github.com:woof…
MishaShWoof May 25, 2026
00b3620
fix: update tenderly simulation for multiple proposals on 1 L2 network
MishaShWoof May 25, 2026
d84fbdd
fix: increase accepted spread to $400
MishaShWoof May 25, 2026
feef68f
Merge branch 'main' of github.com:woof-software/comet into develop
MishaShWoof Jun 1, 2026
3f6b31f
Merge branch 'main' of github.com:woof-software/comet into feat/multi…
MishaShWoof Jun 1, 2026
af80295
Merge branch 'develop' of github.com:woof-software/comet into feat/mu…
MishaShWoof Jun 1, 2026
8bea7de
Next Develop Update (#433)
MishaShWoof Jun 1, 2026
e24f281
fix: remove Comet.sol, drop Sepolia and Fuji deployments, and update …
MishaShWoof Jun 1, 2026
877935b
fix: remove deleted param from deploy scripts
MishaShWoof Jun 1, 2026
f4d74bd
Delete ScrollComet.sol
MishaShWoof Jun 1, 2026
38e68d9
fix: revert multichain proposal simulation from develop
VladyslavBudiukWOOF Jun 8, 2026
b214eb1
Merge branch 'main' of github.com:woof-software/comet into develop
MishaShWoof Jul 2, 2026
ae44f19
Merge branch 'main' of github.com:woof-software/comet into woof-softw…
MishaShWoof Jul 8, 2026
5ec5166
fix: merge duplication fix
MishaShWoof Jul 8, 2026
0566f89
fix: configurator scenario fix
MishaShWoof Jul 8, 2026
5f7fd8e
fix: Use env variables for tenderly
MishaShWoof Jul 8, 2026
bda487a
Merge branch 'develop' of github.com:woof-software/comet into woof-so…
MishaShWoof Jul 8, 2026
efbec0e
Merge branch 'feat/multichain-proposal-simulation' of github.com:woof…
MishaShWoof Jul 8, 2026
cecd20c
fix: type fix
MishaShWoof Jul 8, 2026
8f5ab91
Modified migration from GitHub Actions
Jul 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
279 changes: 279 additions & 0 deletions deployments/base/aero/migrations/1779459694_update_cbbtc_to_svr.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
import { expect } from 'chai';
import { DeploymentManager } from '../../../../plugins/deployment_manager/DeploymentManager';
import { migration } from '../../../../plugins/deployment_manager/Migration';
import { calldata, exp, proposal } from '../../../../src/deploy';
import { utils, Contract } from 'ethers';

const CBBTC_USD_SVR_PRICE_FEED_ADDRESS = '0x2231aEdEf63Bef7F32fA1cEc5851C5CD72746263';
const ETH_USD_SVR_PRICE_FEED_ADDRESS = '0x1428C9E908e32dD2839F99D63C242c91329A58C0';

const AERO_COMET_ADDRESS = '0x784efeB622244d2348d4F2522f8860B96fbEcE89';
const USDC_COMET_ADDRESS = '0xb125E6687d4313864e53df431d5425969c15Eb2F';
const USDS_COMET_ADDRESS = '0x2c776041CCFe903071AF44aa147368a9c8EEA518';
const WETH_COMET_ADDRESS = '0x46e6b214b524310239732D51387075E0e70970bf';

const abi = [
'function getAssetInfoByAddress(address asset) public view returns((uint8 offset, address asset, address priceFeed, uint64 scale, uint64 borrowCollateralFactor, uint64 liquidateCollateralFactor, uint64 liquidationFactor, uint128 supplyCap))',
'function getPrice(address priceFeed) public view returns (uint256)'
];

let newCbEthToUsdPriceFeed: string;
let newCbEthToEthPriceFeed: string;

let oldAeroCbBTCToUsdPriceFeed: string;
let oldUsdcCbBTCToUsdPriceFeed: string;
let oldUsdsCbBTCToUsdPriceFeed: string;
let oldWethCbBTCToEthPriceFeed: string;

export default migration('1779459694_update_cbbtc_to_svr', {
async prepare(deploymentManager: DeploymentManager) {
const cbBTCToUsdPriceFeed = await deploymentManager.deploy(
'cbBTC:priceFeed',
'pricefeeds/ScalingPriceFeedWithCustomDescription.sol',
[
CBBTC_USD_SVR_PRICE_FEED_ADDRESS, // BTC / USD price feed
8, // decimals
'cbBTC / USD SVR price feed', // description
],
true
);

const cbBTCToEthPriceFeed = await deploymentManager.deploy(
'cbBTC:priceFeed',
'pricefeeds/ReverseMultiplicativePriceFeed.sol',
[
CBBTC_USD_SVR_PRICE_FEED_ADDRESS, // cbBTC / USD price feed
ETH_USD_SVR_PRICE_FEED_ADDRESS, // USD / ETH price feed
8, // decimals
'cbBTC / ETH SVR price feed', // description
],
true
);

return {
cbBTCToUsdPriceFeed: cbBTCToUsdPriceFeed.address,
cbBTCToEthPriceFeed: cbBTCToEthPriceFeed.address
};
},

enact: async (
deploymentManager: DeploymentManager,
govDeploymentManager: DeploymentManager,
{
cbBTCToUsdPriceFeed,
cbBTCToEthPriceFeed,
}
) => {
const trace = deploymentManager.tracer();

const {
bridgeReceiver,
cbBTC,
cometAdmin,
configurator,
} = await deploymentManager.getContracts();

const { governor, baseL1CrossDomainMessenger } = await govDeploymentManager.getContracts();

newCbEthToUsdPriceFeed = cbBTCToUsdPriceFeed;
newCbEthToEthPriceFeed = cbBTCToEthPriceFeed;

const updateAssetPriceFeedCalldataAero = await calldata(
configurator.populateTransaction.updateAssetPriceFeed(
AERO_COMET_ADDRESS,
cbBTC.address,
cbBTCToUsdPriceFeed
)
);
const deployAndUpgradeToCalldataAero = utils.defaultAbiCoder.encode(
['address', 'address'],
[configurator.address, AERO_COMET_ADDRESS]
);

const updateAssetPriceFeedCalldataWeth = await calldata(
configurator.populateTransaction.updateAssetPriceFeed(
WETH_COMET_ADDRESS,
cbBTC.address,
cbBTCToEthPriceFeed
)
);
const deployAndUpgradeToCalldataWeth = utils.defaultAbiCoder.encode(
['address', 'address'],
[configurator.address, WETH_COMET_ADDRESS]
);

const l2ProposalDataPart1 = utils.defaultAbiCoder.encode(
['address[]', 'uint256[]', 'string[]', 'bytes[]'],
[
[
configurator.address, cometAdmin.address, // AERO
configurator.address, cometAdmin.address, // WETH
],
[
0, 0, // AERO
0, 0, // WETH
],
[
'updateAssetPriceFeed(address,address,address)', 'deployAndUpgradeTo(address,address)', // AERO
'updateAssetPriceFeed(address,address,address)', 'deployAndUpgradeTo(address,address)', // WETH
],
[
updateAssetPriceFeedCalldataAero, deployAndUpgradeToCalldataAero, // AERO
updateAssetPriceFeedCalldataWeth, deployAndUpgradeToCalldataWeth, // WETH
],
]
);

const updateAssetPriceFeedCalldataUsdc = await calldata(
configurator.populateTransaction.updateAssetPriceFeed(
USDC_COMET_ADDRESS,
cbBTC.address,
cbBTCToUsdPriceFeed
)
);
const deployAndUpgradeToCalldataUsdc = utils.defaultAbiCoder.encode(
['address', 'address'],
[configurator.address, USDC_COMET_ADDRESS]
);

const updateAssetPriceFeedCalldataUsds = await calldata(
configurator.populateTransaction.updateAssetPriceFeed(
USDS_COMET_ADDRESS,
cbBTC.address,
cbBTCToUsdPriceFeed
)
);
const deployAndUpgradeToCalldataUsds = utils.defaultAbiCoder.encode(
['address', 'address'],
[configurator.address, USDS_COMET_ADDRESS]
);

const l2ProposalDataPart2 = utils.defaultAbiCoder.encode(
['address[]', 'uint256[]', 'string[]', 'bytes[]'],
[
[
configurator.address, cometAdmin.address, // USDC
configurator.address, cometAdmin.address, // USDS
],
[
0, 0, // USDC
0, 0, // USDS
],
[
'updateAssetPriceFeed(address,address,address)', 'deployAndUpgradeTo(address,address)', // USDC
'updateAssetPriceFeed(address,address,address)', 'deployAndUpgradeTo(address,address)', // USDS
],
[
updateAssetPriceFeedCalldataUsdc, deployAndUpgradeToCalldataUsdc, // USDC
updateAssetPriceFeedCalldataUsds, deployAndUpgradeToCalldataUsds, // USDS
],
]
);

const aeroComet = new Contract(AERO_COMET_ADDRESS, abi, await deploymentManager.getSigner());
const usdcComet = new Contract(USDC_COMET_ADDRESS, abi, await deploymentManager.getSigner());
const usdsComet = new Contract(USDS_COMET_ADDRESS, abi, await deploymentManager.getSigner());
const wethComet = new Contract(WETH_COMET_ADDRESS, abi, await deploymentManager.getSigner());

const cbBTCAssetInfoAero = await aeroComet.getAssetInfoByAddress(cbBTC.address);
const cbBTCAssetInfoUsdc = await usdcComet.getAssetInfoByAddress(cbBTC.address);
const cbBTCAssetInfoUsds = await usdsComet.getAssetInfoByAddress(cbBTC.address);
const cbBTCAssetInfoWeth = await wethComet.getAssetInfoByAddress(cbBTC.address);

oldAeroCbBTCToUsdPriceFeed = cbBTCAssetInfoAero.priceFeed;
oldUsdcCbBTCToUsdPriceFeed = cbBTCAssetInfoUsdc.priceFeed;
oldUsdsCbBTCToUsdPriceFeed = cbBTCAssetInfoUsds.priceFeed;
oldWethCbBTCToEthPriceFeed = cbBTCAssetInfoWeth.priceFeed;

const mainnetActions = [
// 1. Update price feed for cbBTC in AERO and WETH markets
{
contract: baseL1CrossDomainMessenger,
signature: 'sendMessage(address,bytes,uint32)',
args: [bridgeReceiver.address, l2ProposalDataPart1, 3_000_000]
},
// 2. Update price feed for cbBTC in USDC and USDS markets
{
contract: baseL1CrossDomainMessenger,
signature: 'sendMessage(address,bytes,uint32)',
args: [bridgeReceiver.address, l2ProposalDataPart2, 3_000_000]
},
];

const description = `# Update cbBTC price feeds on Base to SVR

## Proposal summary

This proposal updates the cbBTC price feeds in the Compound III AERO, USDC, USDS, and WETH markets on Base to use the new SVR price feeds.

Further detailed information can be found on the corresponding [proposal pull request](https://github.com/compound-finance/comet/pull/1129) and [forum discussion for SVR](https://www.comp.xyz/t/request-for-proposal-rfp-oracle-extractable-value-oev-solution-for-compound-protocol/6786).

### SVR fee recipient

SVR generates revenue from liquidators and Compound DAO will receive that revenue as part of the protocol fee. The fee recipient for SVR on Base is set to Compound DAO multisig: 0xb3e79c7cac540ca833015e63d96d3032ba0c4129.

## Proposal Actions

The first action updates the cbBTC price feeds in the AERO and WETH markets.

The second action updates the cbBTC price feeds in the USDC and USDS markets.`;

const txn = await govDeploymentManager.retry(async () =>
trace(
await governor.propose(...(await proposal(mainnetActions, description)))
), 0, 300_000
);

const event = txn.events.find(
(event: { event: string }) => event.event === 'ProposalCreated'
);
const [proposalId] = event.args;
trace(`Created proposal ${proposalId}.`);
},

async enacted(): Promise<boolean> {
return false;
},

async verify(deploymentManager: DeploymentManager) {
const {
cbBTC,
} = await deploymentManager.getContracts();

const aeroComet = new Contract(AERO_COMET_ADDRESS, abi, await deploymentManager.getSigner());
const usdcComet = new Contract(USDC_COMET_ADDRESS, abi, await deploymentManager.getSigner());
const usdsComet = new Contract(USDS_COMET_ADDRESS, abi, await deploymentManager.getSigner());
const wethComet = new Contract(WETH_COMET_ADDRESS, abi, await deploymentManager.getSigner());

const cbBTCAssetInfoAero = await aeroComet.getAssetInfoByAddress(cbBTC.address);
const cbBTCAssetInfoUsdc = await usdcComet.getAssetInfoByAddress(cbBTC.address);
const cbBTCAssetInfoUsds = await usdsComet.getAssetInfoByAddress(cbBTC.address);
const cbBTCAssetInfoWeth = await wethComet.getAssetInfoByAddress(cbBTC.address);

expect(cbBTCAssetInfoAero.priceFeed).to.equal(newCbEthToUsdPriceFeed);
expect(cbBTCAssetInfoUsdc.priceFeed).to.equal(newCbEthToUsdPriceFeed);
expect(cbBTCAssetInfoUsds.priceFeed).to.equal(newCbEthToUsdPriceFeed);
expect(cbBTCAssetInfoWeth.priceFeed).to.equal(newCbEthToEthPriceFeed);

expect(cbBTCAssetInfoAero.priceFeed).to.not.equal(oldAeroCbBTCToUsdPriceFeed);
expect(cbBTCAssetInfoUsdc.priceFeed).to.not.equal(oldUsdcCbBTCToUsdPriceFeed);
expect(cbBTCAssetInfoUsds.priceFeed).to.not.equal(oldUsdsCbBTCToUsdPriceFeed);
expect(cbBTCAssetInfoWeth.priceFeed).to.not.equal(oldWethCbBTCToEthPriceFeed);

const oldPriceCbBTCToUsdAero = await aeroComet.getPrice(oldAeroCbBTCToUsdPriceFeed);
const newPriceCbBTCToUsdAero = await aeroComet.getPrice(newCbEthToUsdPriceFeed);
expect(oldPriceCbBTCToUsdAero).to.be.closeTo(newPriceCbBTCToUsdAero, exp(400, 8)); // within $400

const oldPriceCbBTCToUsdUsdc = await usdcComet.getPrice(oldUsdcCbBTCToUsdPriceFeed);
const newPriceCbBTCToUsdUsdc = await usdcComet.getPrice(newCbEthToUsdPriceFeed);
expect(oldPriceCbBTCToUsdUsdc).to.be.closeTo(newPriceCbBTCToUsdUsdc, exp(400, 8)); // within $400

const oldPriceCbBTCToUsdUsds = await usdsComet.getPrice(oldUsdsCbBTCToUsdPriceFeed);
const newPriceCbBTCToUsdUsds = await usdsComet.getPrice(newCbEthToUsdPriceFeed);
expect(oldPriceCbBTCToUsdUsds).to.be.closeTo(newPriceCbBTCToUsdUsds, exp(400, 8)); // within $400

const oldPriceCbBTCToEthWeth = await wethComet.getPrice(oldWethCbBTCToEthPriceFeed);
const newPriceCbBTCToEthWeth = await wethComet.getPrice(newCbEthToEthPriceFeed);
expect(oldPriceCbBTCToEthWeth).to.be.closeTo(newPriceCbBTCToEthWeth, exp(0.188, 8)); // within 0.188 ETH ~ $400
},
});
Loading