From 385d1ce7a3d491d98da770da926c17163643975c Mon Sep 17 00:00:00 2001 From: Julian R Date: Thu, 4 Dec 2025 13:08:16 -0300 Subject: [PATCH 01/10] rtoken oracle checks --- tasks/validation/proposal-validator.ts | 30 +++++++++++++++--- tasks/validation/utils/constants.ts | 2 ++ tasks/validation/utils/oracles.ts | 44 ++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/tasks/validation/proposal-validator.ts b/tasks/validation/proposal-validator.ts index 21e9102be..026b220a8 100644 --- a/tasks/validation/proposal-validator.ts +++ b/tasks/validation/proposal-validator.ts @@ -9,7 +9,12 @@ import { MAX_UINT256, TradeKind } from '#/common/constants' import { formatEther, formatUnits } from 'ethers/lib/utils' import { recollateralize, redeemRTokens } from './utils/rtokens' import { processRevenue } from './utils/rewards' -import { pushOraclesForward } from './utils/oracles' +import { + pushOraclesForward, + getRTokenOracle, + getRTokenOraclePrice, + validateRTokenOraclePriceChange, +} from './utils/oracles' import { passProposal, executeProposal, @@ -60,13 +65,30 @@ task('proposal-validator', 'Runs a proposal and confirms can fully rebalance + r console.log(`Network Block: ${await getLatestBlockNumber(hre)}`) + const proposalData = JSON.parse( + fs.readFileSync(`./tasks/validation/proposals/proposal-${params.proposalid}.json`, 'utf-8') + ) + + // Get RToken oracle (if exists) for price validation + const rtokenOracleAddress = getRTokenOracle(proposalData.rtoken) + let priceBefore + if (rtokenOracleAddress) { + console.log(`\nšŸ”® RToken oracle found: ${rtokenOracleAddress}`) + priceBefore = await getRTokenOraclePrice(hre, rtokenOracleAddress) + console.log(`Price (before): ${priceBefore.toString()}`) + } + await hre.run('propose', { pid: params.proposalid, }) - const proposalData = JSON.parse( - fs.readFileSync(`./tasks/validation/proposals/proposal-${params.proposalid}.json`, 'utf-8') - ) + // Validate RToken oracle + if (rtokenOracleAddress && priceBefore) { + const priceAfter = await getRTokenOraclePrice(hre, rtokenOracleAddress) + console.log(`\nšŸ”® RToken Price (after): ${priceAfter.toString()}`) + validateRTokenOraclePriceChange(priceBefore, priceAfter, proposalData.rtoken) + } + await hre.run('recollateralize', { rtoken: proposalData.rtoken, governor: proposalData.governor, diff --git a/tasks/validation/utils/constants.ts b/tasks/validation/utils/constants.ts index 703d43607..c77bf00ab 100644 --- a/tasks/validation/utils/constants.ts +++ b/tasks/validation/utils/constants.ts @@ -49,6 +49,7 @@ export interface RTokenDeployment { rToken: string governor: string timelock: string + oracle?: string // Optional (RToken oracle) } export const MAINNET_DEPLOYMENTS: RTokenDeployment[] = [ @@ -61,6 +62,7 @@ export const MAINNET_DEPLOYMENTS: RTokenDeployment[] = [ rToken: '0xE72B141DF173b999AE7c1aDcbF60Cc9833Ce56a8', // ETH+ governor: '0x868Fe81C276d730A1995Dc84b642E795dFb8F753', timelock: '0x5d8A7DC9405F08F14541BA918c1Bf7eb2dACE556', + oracle: '0xf87d2F4d42856f0B6Eae140Aaf78bF0F777e9936', // ETH+ Oracle }, /*{ rToken: '0xaCdf0DBA4B9839b96221a8487e9ca660a48212be', // hyUSD (mainnet) diff --git a/tasks/validation/utils/oracles.ts b/tasks/validation/utils/oracles.ts index c4bd3dfdc..1e8df6788 100644 --- a/tasks/validation/utils/oracles.ts +++ b/tasks/validation/utils/oracles.ts @@ -6,6 +6,7 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types' import { BigNumber } from 'ethers' import { AggregatorV3Interface } from '@typechain/index' import { ONE_ADDRESS } from '../../../common/constants' +import { MAINNET_DEPLOYMENTS, BASE_DEPLOYMENTS, RTokenDeployment } from './constants' export const overrideOracle = async ( hre: HardhatRuntimeEnvironment, @@ -268,3 +269,46 @@ export const setOraclePrice = async ( await oracle.updateAnswer(value) } + +export const getRTokenOracle = (rTokenAddress: string): string | undefined => { + const allDeployments: RTokenDeployment[] = [...MAINNET_DEPLOYMENTS, ...BASE_DEPLOYMENTS] + const deployment = allDeployments.find( + (d) => d.rToken.toLowerCase() === rTokenAddress.toLowerCase() + ) + return deployment?.oracle +} + +export const getRTokenOraclePrice = async ( + hre: HardhatRuntimeEnvironment, + oracleAddress: string +): Promise => { + const oracle = await hre.ethers.getContractAt('AggregatorV3Interface', oracleAddress) + const roundData = await oracle.latestRoundData() + return roundData.answer +} + +export const validateRTokenOraclePriceChange = ( + priceBefore: BigNumber, + priceAfter: BigNumber, + rTokenAddress: string +): void => { + if (priceBefore.isZero()) { + throw new Error(`Invalid price for RToken ${rTokenAddress}`) + } + + // Check price is within 0.1% range + const lowerBound = priceBefore.mul(999).div(1000) + const upperBound = priceBefore.mul(1001).div(1000) + + if (priceAfter.lt(lowerBound) || priceAfter.gt(upperBound)) { + throw new Error( + `RToken Oracle price outside allowed 0.1% range.\n` + + ` Price before: ${priceBefore.toString()}\n` + + ` Price after: ${priceAfter.toString()}\n` + + ` Allowed range: ${lowerBound.toString()} - ${upperBound.toString()}\n` + + ` RToken: ${rTokenAddress}` + ) + } + + console.log(`āœ… RToken Oracle price validation passed!\n`) +} From cbdecfa335d200ab50e613c2c715e55a832be2b3 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Thu, 4 Dec 2025 19:03:54 -0500 Subject: [PATCH 02/10] new AssetRegistry/Deployer/FacadeWrite addresses --- .openzeppelin/mainnet.json | 210 ++++++++++++++++++ scripts/addresses/1-tmp-deployments.json | 8 +- scripts/addresses/8453-tmp-deployments.json | 8 +- .../base-4.2.0/8453-tmp-deployments.json | 8 +- .../mainnet-4.2.0/1-tmp-deployments.json | 8 +- 5 files changed, 226 insertions(+), 16 deletions(-) diff --git a/.openzeppelin/mainnet.json b/.openzeppelin/mainnet.json index fd2467d44..bddb3ee99 100644 --- a/.openzeppelin/mainnet.json +++ b/.openzeppelin/mainnet.json @@ -17216,6 +17216,216 @@ } } } + }, + "ab77ffbf0905993ac1da6b6222b4fdf56c0a725a1d6d69f2067345c21fdd5553": { + "address": "0xF683e671a7Bd91257A32079ca219Cc8398088AEc", + "txHash": "0x01b6309750672ad9cbb96448110825410decede5dc0f2a09f32dd93a97076905", + "layout": { + "solcVersion": "0.8.28", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:169" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:111" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)13539", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:87" + }, + { + "label": "basketHandler", + "offset": 0, + "slot": "201", + "type": "t_contract(IBasketHandler)12448", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:20" + }, + { + "label": "backingManager", + "offset": 0, + "slot": "202", + "type": "t_contract(IBackingManager)12176", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:21" + }, + { + "label": "_erc20s", + "offset": 0, + "slot": "203", + "type": "t_struct(AddressSet)11009_storage", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:24" + }, + { + "label": "assets", + "offset": 0, + "slot": "205", + "type": "t_mapping(t_contract(IERC20)7392,t_contract(IAsset)11781)", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:27" + }, + { + "label": "lastRefresh", + "offset": 0, + "slot": "206", + "type": "t_uint48", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:31" + }, + { + "label": "__gap", + "offset": 0, + "slot": "207", + "type": "t_array(t_uint256)46_storage", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:308" + } + ], + "types": { + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)46_storage": { + "label": "uint256[46]", + "numberOfBytes": "1472" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IAsset)11781": { + "label": "contract IAsset", + "numberOfBytes": "20" + }, + "t_contract(IBackingManager)12176": { + "label": "contract IBackingManager", + "numberOfBytes": "20" + }, + "t_contract(IBasketHandler)12448": { + "label": "contract IBasketHandler", + "numberOfBytes": "20" + }, + "t_contract(IERC20)7392": { + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IMain)13539": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_contract(IERC20)7392,t_contract(IAsset)11781)": { + "label": "mapping(contract IERC20 => contract IAsset)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)11009_storage": { + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)10694_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Set)10694_storage": { + "label": "struct EnumerableSet.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_indexes", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } } } } diff --git a/scripts/addresses/1-tmp-deployments.json b/scripts/addresses/1-tmp-deployments.json index f88b7008a..f8fef0528 100644 --- a/scripts/addresses/1-tmp-deployments.json +++ b/scripts/addresses/1-tmp-deployments.json @@ -13,10 +13,10 @@ "revenueFacet": "0x69c21f4828c57D3BB5Eb5fEEa6C5c1432e193510", "tradeHelperFacet": "0x9c09e506e00ac87E2413b7501702fAcA690201Fb" }, - "facadeWriteLib": "0xe4DB7DA0b89365A6eD954594638D21Fb19661EB6", + "facadeWriteLib": "0xE8F9df9Fa0a7d40F75e26105aA0f748ea17C9dfe", "basketLib": "0x2fdD94F363644FEDE5106B22b1706E45D4dD9bea", - "facadeWrite": "0x46CF884c423e35947b27440fc0Bc77d968C74F49", - "deployer": "0x08638a2efE63d3A4E5056860E4292B6C059D3BaD", + "facadeWrite": "0xA8Ea6cF7beAB5E4395D437AE37D696E007739357", + "deployer": "0xd5fcf4795877Ad0084FFc554b71D61bb660255AC", "rsrAsset": "0xbCb71eE9c3372f3444cBBe3E1b263204967EdBE3", "implementations": { "main": "0xc5bf686CfB85786fcFfF557297D4afF8F4e15e44", @@ -25,7 +25,7 @@ "dutchTrade": "0xCC3Cb888dEA5948bbEB7747Aed31128b71b7689D" }, "components": { - "assetRegistry": "0xcB7e10000De0DAcE5A79c620191Cab2517693637", + "assetRegistry": "0xF683e671a7Bd91257A32079ca219Cc8398088AEc", "backingManager": "0xc501c9074CE15A4B00dd0B51B3c372518e6D3BA2", "basketHandler": "0x54A8fa5217970e2040590DDD7c16f72B1fb57a3C", "broker": "0x63c61086418406eBB062c5C6dF80F46c6d052d4c", diff --git a/scripts/addresses/8453-tmp-deployments.json b/scripts/addresses/8453-tmp-deployments.json index f45da9937..861ed9619 100644 --- a/scripts/addresses/8453-tmp-deployments.json +++ b/scripts/addresses/8453-tmp-deployments.json @@ -13,10 +13,10 @@ "revenueFacet": "0x4c2FCA94163355a5B81F4D924Bce8cCbACc15406", "tradeHelperFacet": "0xC1E16AD7844Da1AEFFa6c3932AD02b823DE12d3F" }, - "facadeWriteLib": "0x79190AD7Bb1aE9C25F3Fe7aBCfCEce52a8f34A0a", + "facadeWriteLib": "0x1103851D1FCDD3f88096fbed812c8FF01949cF9d", "basketLib": "0x3700b22C742980be9D22740933d4a041A64f7314", - "facadeWrite": "0x5Fb4E33e7952ED4b1dc6C08966D797c61BBFF021", - "deployer": "0x5574eD38ceAFB537b274E3562414DCA057d8Ff41", + "facadeWrite": "0x7F946356C26043326Aeb2597703a8aE05561D8C8", + "deployer": "0x25a99457FBE10e21ffF9f722dd873cA882CFBA99", "rsrAsset": "0x22018D85BFdA9e2673FB4101e957562a1e952Cdf", "implementations": { "main": "0x6D05CB2CB647B58189FA16f81784C05B4bcd4fe9", @@ -25,7 +25,7 @@ "dutchTrade": "0x8A9F74d40c5323E73B63a80c4282658fD43F3AA2" }, "components": { - "assetRegistry": "0xaBd7E7a5C846eD497681a590feBED99e7157B6a3", + "assetRegistry": "0x29F2EB4A0D3dC211BB488E9aBe12740cafBCc49C", "backingManager": "0xF73EB45d83AC86f8a6F75a6252ca1a59a9A3aED3", "basketHandler": "0x5c83CA710E72D130E3B74aEC5b739676ef5737c2", "broker": "0x714341800AD1913B5FCCBFd5d136553Ad1C314d6", diff --git a/scripts/addresses/base-4.2.0/8453-tmp-deployments.json b/scripts/addresses/base-4.2.0/8453-tmp-deployments.json index 275c298b3..b65b89e31 100644 --- a/scripts/addresses/base-4.2.0/8453-tmp-deployments.json +++ b/scripts/addresses/base-4.2.0/8453-tmp-deployments.json @@ -13,10 +13,10 @@ "revenueFacet": "0x4c2FCA94163355a5B81F4D924Bce8cCbACc15406", "tradeHelperFacet": "0xC1E16AD7844Da1AEFFa6c3932AD02b823DE12d3F" }, - "facadeWriteLib": "0x79190AD7Bb1aE9C25F3Fe7aBCfCEce52a8f34A0a", + "facadeWriteLib": "0x1103851D1FCDD3f88096fbed812c8FF01949cF9d", "basketLib": "0x3700b22C742980be9D22740933d4a041A64f7314", - "facadeWrite": "0x5Fb4E33e7952ED4b1dc6C08966D797c61BBFF021", - "deployer": "0x5574eD38ceAFB537b274E3562414DCA057d8Ff41", + "facadeWrite": "0x7F946356C26043326Aeb2597703a8aE05561D8C8", + "deployer": "0x25a99457FBE10e21ffF9f722dd873cA882CFBA99", "rsrAsset": "0x22018D85BFdA9e2673FB4101e957562a1e952Cdf", "implementations": { "main": "0x6D05CB2CB647B58189FA16f81784C05B4bcd4fe9", @@ -25,7 +25,7 @@ "dutchTrade": "0x8A9F74d40c5323E73B63a80c4282658fD43F3AA2" }, "components": { - "assetRegistry": "0xaBd7E7a5C846eD497681a590feBED99e7157B6a3", + "assetRegistry": "0x29F2EB4A0D3dC211BB488E9aBe12740cafBCc49C", "backingManager": "0xF73EB45d83AC86f8a6F75a6252ca1a59a9A3aED3", "basketHandler": "0x5c83CA710E72D130E3B74aEC5b739676ef5737c2", "broker": "0x714341800AD1913B5FCCBFd5d136553Ad1C314d6", diff --git a/scripts/addresses/mainnet-4.2.0/1-tmp-deployments.json b/scripts/addresses/mainnet-4.2.0/1-tmp-deployments.json index c77f710d0..15e7403c1 100644 --- a/scripts/addresses/mainnet-4.2.0/1-tmp-deployments.json +++ b/scripts/addresses/mainnet-4.2.0/1-tmp-deployments.json @@ -13,10 +13,10 @@ "revenueFacet": "0x69c21f4828c57D3BB5Eb5fEEa6C5c1432e193510", "tradeHelperFacet": "0x9c09e506e00ac87E2413b7501702fAcA690201Fb" }, - "facadeWriteLib": "0xe4DB7DA0b89365A6eD954594638D21Fb19661EB6", + "facadeWriteLib": "0xE8F9df9Fa0a7d40F75e26105aA0f748ea17C9dfe", "basketLib": "0x2fdD94F363644FEDE5106B22b1706E45D4dD9bea", - "facadeWrite": "0x46CF884c423e35947b27440fc0Bc77d968C74F49", - "deployer": "0x08638a2efE63d3A4E5056860E4292B6C059D3BaD", + "facadeWrite": "0xA8Ea6cF7beAB5E4395D437AE37D696E007739357", + "deployer": "0xd5fcf4795877Ad0084FFc554b71D61bb660255AC", "rsrAsset": "0xbCb71eE9c3372f3444cBBe3E1b263204967EdBE3", "implementations": { "main": "0xc5bf686CfB85786fcFfF557297D4afF8F4e15e44", @@ -25,7 +25,7 @@ "dutchTrade": "0xCC3Cb888dEA5948bbEB7747Aed31128b71b7689D" }, "components": { - "assetRegistry": "0xcB7e10000De0DAcE5A79c620191Cab2517693637", + "assetRegistry": "0xF683e671a7Bd91257A32079ca219Cc8398088AEc", "backingManager": "0xc501c9074CE15A4B00dd0B51B3c372518e6D3BA2", "basketHandler": "0x54A8fa5217970e2040590DDD7c16f72B1fb57a3C", "broker": "0x63c61086418406eBB062c5C6dF80F46c6d052d4c", From 6c502d97bd844bc31fbddaeb05a2b5135c97c364 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Thu, 4 Dec 2025 19:13:42 -0500 Subject: [PATCH 03/10] deploy new registries --- common/registries.ts | 8 +++--- contracts/spells/4_2_0.sol | 57 +++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/common/registries.ts b/common/registries.ts index 7d340f2a1..47575d4c6 100644 --- a/common/registries.ts +++ b/common/registries.ts @@ -24,8 +24,8 @@ export const registryConfig: Record = { }, registries: { roleRegistry: '0xE1eC57C8EE970280f237863910B606059e9641C9', - versionRegistry: '0xBA8CD83f793aA046Fe5Ab7bA01f855742F2D6a30', - assetPluginRegistry: '0x6cf05Ea2A94a101CE6A44Ec2a2995b43F1b0958f', + versionRegistry: '0x121c34FbedcC125cc13782008e2530a5610C5676', + assetPluginRegistry: '0x4a818c41131CB9FE65BadF2Bb8671dDE4D117135', daoFeeRegistry: '0xec716deD4eABa060937D1a915F166E237039342B', trustedFillerRegistry: '0x279ccF56441fC74f1aAC39E7faC165Dec5A88B3A', }, @@ -37,8 +37,8 @@ export const registryConfig: Record = { }, registries: { roleRegistry: '0xE1eC57C8EE970280f237863910B606059e9641C9', - versionRegistry: '0x3BECE5EC596331033726E5C6C188c313Ff4E3fE5', - assetPluginRegistry: '0x87A959e0377C68A50b08a91ae5ab3aFA7F41ACA4', + versionRegistry: '0x7CD9CA6401f743b38B3B16eA314BbaB8e9c1aC51', + assetPluginRegistry: '0x7Ac954307356301A10adDb0dB4f61b4a475d3551', daoFeeRegistry: '0x3513D2c7D2F51c678889CeC083E7D7Ae27b219aD', trustedFillerRegistry: '0x72DB5f49D0599C314E2f2FEDf6Fe33E1bA6C7A18', }, diff --git a/contracts/spells/4_2_0.sol b/contracts/spells/4_2_0.sol index 4e6416acc..760ab7716 100644 --- a/contracts/spells/4_2_0.sol +++ b/contracts/spells/4_2_0.sol @@ -58,23 +58,22 @@ contract Upgrade4_2_0 is Versioned { // 4.2.0 Assets (mainnet) Asset[54] MAINNET_ASSETS = [ - Asset(0xbCb71eE9c3372f3444cBBe3E1b263204967EdBE3), // RSR Asset(0xFDE702794298DB19e2a235782B82aD88053F7335), // stkAAVE Asset(0xA32a92073fEB7ed31081656DeFF34518FB5194b9), // COMP Asset(0x69841bA9E09019acA0d16Ae9c9724D25d51F6956), // CRV Asset(0x2635c3B92c8451F9D1e75BD61FCF87D1eCdf0ad0), // CVX - Asset(0x7504ED02f3f151Df241ec2eb0bF1a9601fcb012a), // DAI - Asset(0xBBF50a582cC03cbbC7E228dc3196091301348B0e), // USDC - Asset(0xBC0DC981001B6673F615978B63818fD1F6B0FF98), // USDT - Asset(0x9ea621376455B88E4022633399bcd1FfD7844210), // aDAI - Asset(0x1645Dd4B47D7FbbFdF876061a9e7fE0eb3C72Eb1), // aUSDC - Asset(0x695980209248264Ff7FcD19f7Cc217376FEaE163), // aUSDT - Asset(0xf8b09C5b3a1eacd095627fb1354665432DC1D077), // cDAI - Asset(0x7A58646a44Dc460fe627f2fd76142b99832F0de6), // cUSDC - Asset(0xD3F81Fc6c575CE44283Fd48dA7f0337d8d3d24FB), // cUSDT - Asset(0x32Ab9216188F24434Dc629Acfa1554ab7623f300), // cWBTC - Asset(0x07b2b41037d89F91DC91aD1DDCCA3e8515FF049E), // cETH - Asset(0xCab9805b012460C4E176Fb6b521c20d7bc43419F), // WBTC + Asset(0x8A782e182EeE2299B3DB733659ea764A5a97AdC5), // DAI + Asset(0xDB665809eF5e2D8015c05504c242DDc2932AcDee), // USDC + Asset(0xd717d722074C8dBfd0a29F73E4638cCc49C7D53D), // USDT + Asset(0x4615C29BbA8b2Fa32906A594e922285a09301f42), // aDAI + Asset(0x0D346E98CECa2Fd7DE7BE3F53737D82BDE932117), // aUSDC + Asset(0x7B0E0081bf89E3307b3734d821D4297B33911C44), // aUSDT + Asset(0x6394FE4995D03a2a463bae2C3A4406043dF760E8), // cDAI + Asset(0x0072118C321181168E6643919074a0B518488637), // cUSDC + Asset(0xcAF032D20d09CEa9727Aa1dDf6F4E4367155d05e), // cUSDT + Asset(0xa58053D343299BD8818A70D5bfea0318Ca5ebEC5), // cWBTC + Asset(0x00a07ac1b3f9C5f7aD4C6935b1Cb2028DebB6555), // cETH + Asset(0x7437047523dAe8116a94EF5FFAAB3A657e5dC60E), // WBTC Asset(0x90c26f98cBE23666ED1E59186e1e4888512BE58d), // WETH Asset(0xF156B8b44941C6f9c1Fd4825b0C6e50ecFDECfC7), // wstETH Asset(0x81283be7aD5A6d6C4A085b4D694B127Ccf7E652E), // rETH @@ -82,7 +81,7 @@ contract Upgrade4_2_0 is Versioned { Asset(0x169544B6422C6690457931259FAd8C0A76540A2E), // fUSDT Asset(0x79ed64e67B846E483594C496F05B25835e53c614), // fDAI Asset(0xBb7B4CAA808C9FA262095221299dbc873071CAF4), // fFRAX - Asset(0x309e7D2DF4fc528f8Fd58bE6ecF73293dd2e7e7f), // cUSDCv3 + Asset(0x4D6F9A0F0F57A8179A146f37dD93D558073b814f), // cUSDCv3 Asset(0xa52F93E61EdF1B77B2D680945F3EA4E84Bb825D3), // cUSDTv3 Asset(0xE898cd20696fFE17489955101B97F3f9103B83aC), // cvx3Pool Asset(0xFDe02d56dec895f7769dC0505D98706f029738D2), // cvxPayPool @@ -111,21 +110,21 @@ contract Upgrade4_2_0 is Versioned { Asset(0x403623175656ED0CDF1F9efE54867761F1EBf1D8), // sUSDe Asset(0x4FD189996b5344Eb4CF9c749b97C7424D399d24e), // sUSDS Asset(0xBFAc3e99263B7aE9704eC1c879f7c0a57C6b53e1), // wOETH - Asset(0x9A65173df5D5B86E26300Cc9cA5Ff378be6DAeA5) // pyUSD + Asset(0x9A65173df5D5B86E26300Cc9cA5Ff378be6DAeA5), // pyUSD + Asset(0xb1e61f452CFcF6609C2F4088EC36B4c8dd1806b5) // saEthRLUSD ]; // 4.2.0 Assets (base) - Asset[20] BASE_ASSETS = [ - Asset(0x22018D85BFdA9e2673FB4101e957562a1e952Cdf), // RSR + Asset[19] BASE_ASSETS = [ Asset(0xC9c37FC53682207844B058026024853A9C0b8c7B), // COMP - Asset(0xe0E1d3c6f09DA01399e84699722B11308607BBfC), // STG Asset(0x7f7B77e49d5b30445f222764a794AFE14af062eB), // AERO - Asset(0xD31eEc6679Dd18D5D42A92F32f01Ed98d4e91941), // DAI - Asset(0x18a26902126154437322fe01fBa04A36b093906f), // USDC - Asset(0x27F672aAf061cb0b2640a4DFCCBd799cD1a7309A), // USDbC - Asset(0x6a0Fc14d21247D4fDf7E12Ebe22307687b7750fb), // WETH + Asset(0x3962695aCce0Efce11cFf997890f3D1D7467ec40), // STG + Asset(0x49A44d50d3B1E098DAC9402c4aF8D0C0E499F250), // DAI + Asset(0x33E840e5711549358f6d4D11F9Ab2896B36E9822), // USDC + Asset(0xf003b8A8200F14db13f5F712EC8e76c41e7e9A7A), // USDbC + Asset(0x2387C22727ACb91519b80A15AEf393ad40dFdb2F), // WETH Asset(0x14c443d8BdbE9A65F3a23FA4e199d8741D5B38Fa), // cbETH - Asset(0xdEBe74dc2A415e00bE8B4b9d1e6e0007153D006a), // cUSDCv3 + Asset(0x41edAFFB50CA1c2FEC86C629F845b8490ced8A2c), // cUSDCv3 Asset(0xa9F0eca90B5d4f213f8119834E0920785bb70F46), // saBasUSDC Asset(0x9b2A9bAeB8F1930fC2AF9b7Fa473edF2B8c3B549), // wstETH Asset(0x97F9d5ed17A0C99B279887caD5254d15fb1B619B), // aeroUSDCeUSD @@ -172,12 +171,12 @@ contract Upgrade4_2_0 is Versioned { if (_mainnet) { // 4.2.0 deployer (mainnet) - deployer = IDeployer(0x08638a2efE63d3A4E5056860E4292B6C059D3BaD); + deployer = IDeployer(0xd5fcf4795877Ad0084FFc554b71D61bb660255AC); // DAO registries (mainnet) registries = IDeployer.Registries( - VersionRegistry(0xBA8CD83f793aA046Fe5Ab7bA01f855742F2D6a30), // TODO - AssetPluginRegistry(0x6cf05Ea2A94a101CE6A44Ec2a2995b43F1b0958f), // TODO + VersionRegistry(0x121c34FbedcC125cc13782008e2530a5610C5676), + AssetPluginRegistry(0x4a818c41131CB9FE65BadF2Bb8671dDE4D117135), DAOFeeRegistry(0xec716deD4eABa060937D1a915F166E237039342B), ITrustedFillerRegistry(0x279ccF56441fC74f1aAC39E7faC165Dec5A88B3A) ); @@ -195,12 +194,12 @@ contract Upgrade4_2_0 is Versioned { } } else { // 4.2.0 deployer (base) - deployer = IDeployer(0x5574eD38ceAFB537b274E3562414DCA057d8Ff41); + deployer = IDeployer(0x25a99457FBE10e21ffF9f722dd873cA882CFBA99); // DAO registries (base) registries = IDeployer.Registries( - VersionRegistry(0x3BECE5EC596331033726E5C6C188c313Ff4E3fE5), // TODO - AssetPluginRegistry(0x87A959e0377C68A50b08a91ae5ab3aFA7F41ACA4), // TODO + VersionRegistry(0x7CD9CA6401f743b38B3B16eA314BbaB8e9c1aC51), + AssetPluginRegistry(0x7Ac954307356301A10adDb0dB4f61b4a475d3551), DAOFeeRegistry(0x3513D2c7D2F51c678889CeC083E7D7Ae27b219aD), ITrustedFillerRegistry(0x72DB5f49D0599C314E2f2FEDf6Fe33E1bA6C7A18) ); From ddfc9f690da71126acec2fbc65bffc64e5f93893 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Wed, 10 Dec 2025 22:23:05 -0500 Subject: [PATCH 04/10] add missing RSR assets --- contracts/spells/4_2_0.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/spells/4_2_0.sol b/contracts/spells/4_2_0.sol index 760ab7716..848b6785a 100644 --- a/contracts/spells/4_2_0.sol +++ b/contracts/spells/4_2_0.sol @@ -57,7 +57,8 @@ contract Upgrade4_2_0 is Versioned { // ====================================================================================== // 4.2.0 Assets (mainnet) - Asset[54] MAINNET_ASSETS = [ + Asset[55] MAINNET_ASSETS = [ + Asset(0xbCb71eE9c3372f3444cBBe3E1b263204967EdBE3), // RSR Asset(0xFDE702794298DB19e2a235782B82aD88053F7335), // stkAAVE Asset(0xA32a92073fEB7ed31081656DeFF34518FB5194b9), // COMP Asset(0x69841bA9E09019acA0d16Ae9c9724D25d51F6956), // CRV @@ -115,7 +116,8 @@ contract Upgrade4_2_0 is Versioned { ]; // 4.2.0 Assets (base) - Asset[19] BASE_ASSETS = [ + Asset[20] BASE_ASSETS = [ + Asset(0x22018D85BFdA9e2673FB4101e957562a1e952Cdf), // RSR Asset(0xC9c37FC53682207844B058026024853A9C0b8c7B), // COMP Asset(0x7f7B77e49d5b30445f222764a794AFE14af062eB), // AERO Asset(0x3962695aCce0Efce11cFf997890f3D1D7467ec40), // STG From 650ea95b92b7c1e82a1b9b5a0a04a506b38c82b1 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Wed, 10 Dec 2025 23:06:15 -0500 Subject: [PATCH 05/10] rebalance simulator to passing --- tasks/validation/utils/constants.ts | 10 +++++----- tasks/validation/utils/oracles.ts | 3 ++- tasks/validation/whales/whales_1.json | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tasks/validation/utils/constants.ts b/tasks/validation/utils/constants.ts index 703d43607..4d4bdd1a8 100644 --- a/tasks/validation/utils/constants.ts +++ b/tasks/validation/utils/constants.ts @@ -72,11 +72,11 @@ export const MAINNET_DEPLOYMENTS: RTokenDeployment[] = [ governor: '0x441808e20E625e0094b01B40F84af89436229279', timelock: '0x12e4F043c6464984A45173E0444105058b6C3c7B', }, - { - rToken: '0x005f893ecd7bf9667195642f7649da8163e23658', // dgnETH - governor: '0xb7cB3880564A1F8698018ECDc78972F93b2615e6', - timelock: '0x05623fcEe6FB48b7C8058022C48A72dbce09878e', - }, + // { + // rToken: '0x005f893ecd7bf9667195642f7649da8163e23658', // dgnETH + // governor: '0xb7cB3880564A1F8698018ECDc78972F93b2615e6', + // timelock: '0x05623fcEe6FB48b7C8058022C48A72dbce09878e', + // }, ] export const BASE_DEPLOYMENTS: RTokenDeployment[] = [ diff --git a/tasks/validation/utils/oracles.ts b/tasks/validation/utils/oracles.ts index c4bd3dfdc..8bbb72506 100644 --- a/tasks/validation/utils/oracles.ts +++ b/tasks/validation/utils/oracles.ts @@ -223,7 +223,8 @@ export const pushOracleForward = async ( // Aerodrome Pools (Base) if ( asset == '0x9216CD5cA133aBBd23cc6F873bB4a95A78032db0' || - asset == '0x1cCa3FBB11C4b734183f997679d52DeFA74b613A' + asset == '0x1cCa3FBB11C4b734183f997679d52DeFA74b613A' || + asset == '0x97F9d5ed17A0C99B279887caD5254d15fb1B619B' ) { const aeroPoolTokens = await hre.ethers.getContractAt('AerodromePoolTokens', asset) const feed0 = await hre.ethers.getContractAt( diff --git a/tasks/validation/whales/whales_1.json b/tasks/validation/whales/whales_1.json index 6414bfbdb..1ee4358c0 100644 --- a/tasks/validation/whales/whales_1.json +++ b/tasks/validation/whales/whales_1.json @@ -65,7 +65,7 @@ "0xe72b141df173b999ae7c1adcbf60cc9833ce56a8": "0x778aC5d0EE062502fADaa2d300a51dE0869f7995", "0xacdf0dba4b9839b96221a8487e9ca660a48212be": "0xB912549A2b525cC35F8Ba14813112C81cf79F624", "0xfc0b1eef20e4c68b3dcf36c4537cfa7ce46ca70b": "0xF2B25362a03f6EACCa8De8d5350A9f37944c1e59", - "0x0d86883faf4ffd7aeb116390af37746f45b6f378": "0xB5a47e677206Bc81dF3CA2ed1812AA437aad8F0b", + "0x0d86883faf4ffd7aeb116390af37746f45b6f378": "0xC6625129C9df3314a4dd604845488f4bA62F9dB8", "0x78da5799cf427fee11e9996982f4150ece7a99a7": "0x3154Cf16ccdb4C6d922629664174b904d80F2C35", "0x73968b9a57c6e53d41345fd57a6e6ae27d6cdb2f": "0x0C30476f66034E11782938DF8e4384970B6c9e8a", "0x48c3399719b582dd63eb5aadf12a40b4c3f52fa2": "0xF0d99D5d1D5E06CdAd4766503Cb82213B5E1d1bE", From 7b5c6e0fd1aa0b5f0cb9a714056860dcbfb8d327 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Wed, 10 Dec 2025 23:06:55 -0500 Subject: [PATCH 06/10] 0.5% --- tasks/validation/utils/oracles.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasks/validation/utils/oracles.ts b/tasks/validation/utils/oracles.ts index 1e8df6788..23e52ffc2 100644 --- a/tasks/validation/utils/oracles.ts +++ b/tasks/validation/utils/oracles.ts @@ -296,13 +296,13 @@ export const validateRTokenOraclePriceChange = ( throw new Error(`Invalid price for RToken ${rTokenAddress}`) } - // Check price is within 0.1% range - const lowerBound = priceBefore.mul(999).div(1000) - const upperBound = priceBefore.mul(1001).div(1000) + // Check price is within 0.5% range + const lowerBound = priceBefore.mul(995).div(1000) + const upperBound = priceBefore.mul(1005).div(1000) if (priceAfter.lt(lowerBound) || priceAfter.gt(upperBound)) { throw new Error( - `RToken Oracle price outside allowed 0.1% range.\n` + + `RToken Oracle price outside allowed 0.5% range.\n` + ` Price before: ${priceBefore.toString()}\n` + ` Price after: ${priceAfter.toString()}\n` + ` Allowed range: ${lowerBound.toString()} - ${upperBound.toString()}\n` + From 495c6da391c9e326a422d628e480c49e0301dac2 Mon Sep 17 00:00:00 2001 From: Taylor Brent Date: Wed, 10 Dec 2025 23:14:31 -0500 Subject: [PATCH 07/10] bump fork block --- test/integration/fork-block-numbers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/fork-block-numbers.ts b/test/integration/fork-block-numbers.ts index 7206dfdb2..03f81bbc1 100644 --- a/test/integration/fork-block-numbers.ts +++ b/test/integration/fork-block-numbers.ts @@ -11,7 +11,7 @@ const forkBlockNumber = { 'mainnet-3.4.0': 20328530, // Ethereum // TODO add all the block numbers we fork from to benefit from caching - default: 23828026, // Ethereum + default: 23986857, // Ethereum } export default forkBlockNumber From 928748331a682d4770fdcb1b572096d74b55b3ad Mon Sep 17 00:00:00 2001 From: Julian R Date: Thu, 11 Dec 2025 10:05:26 -0300 Subject: [PATCH 08/10] add bsdeth oracle check --- tasks/validation/utils/constants.ts | 1 + tasks/validation/utils/oracles.ts | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tasks/validation/utils/constants.ts b/tasks/validation/utils/constants.ts index b743849ef..aa24c8c98 100644 --- a/tasks/validation/utils/constants.ts +++ b/tasks/validation/utils/constants.ts @@ -91,5 +91,6 @@ export const BASE_DEPLOYMENTS: RTokenDeployment[] = [ rToken: '0xCb327b99fF831bF8223cCEd12B1338FF3aA322Ff', // bsdETH governor: '0x21fBa52dA03e1F964fa521532f8B8951fC212055', timelock: '0xe664d294824C2A8C952A10c4034e1105d2907F46', + oracle: '0xD41310aCF5fA54CDd1970155ac32D708B376Dff6', // bsdETH Oracle }, ] diff --git a/tasks/validation/utils/oracles.ts b/tasks/validation/utils/oracles.ts index 17f0fa497..cb1f673b8 100644 --- a/tasks/validation/utils/oracles.ts +++ b/tasks/validation/utils/oracles.ts @@ -283,9 +283,19 @@ export const getRTokenOraclePrice = async ( hre: HardhatRuntimeEnvironment, oracleAddress: string ): Promise => { - const oracle = await hre.ethers.getContractAt('AggregatorV3Interface', oracleAddress) - const roundData = await oracle.latestRoundData() - return roundData.answer + // Try Chainlink interface first + try { + const oracle = await hre.ethers.getContractAt('AggregatorV3Interface', oracleAddress) + const roundData = await oracle.latestRoundData() + return roundData.answer + } catch { + // Fallback to price() interface + const oracle = await hre.ethers.getContractAt( + ['function price() external view returns (uint256)'], + oracleAddress + ) + return await oracle.price() + } } export const validateRTokenOraclePriceChange = ( From fee471edefeb6c4e46fa6c8429ed1429ed3d5134 Mon Sep 17 00:00:00 2001 From: Julian R Date: Thu, 11 Dec 2025 14:04:17 -0300 Subject: [PATCH 09/10] set threshold per token --- tasks/validation/proposal-validator.ts | 23 +++++++++++++++-------- tasks/validation/utils/constants.ts | 17 ++++++++++++++--- tasks/validation/utils/oracles.ts | 17 ++++++++++------- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/tasks/validation/proposal-validator.ts b/tasks/validation/proposal-validator.ts index 026b220a8..3cfe9f1c4 100644 --- a/tasks/validation/proposal-validator.ts +++ b/tasks/validation/proposal-validator.ts @@ -69,12 +69,14 @@ task('proposal-validator', 'Runs a proposal and confirms can fully rebalance + r fs.readFileSync(`./tasks/validation/proposals/proposal-${params.proposalid}.json`, 'utf-8') ) - // Get RToken oracle (if exists) for price validation - const rtokenOracleAddress = getRTokenOracle(proposalData.rtoken) + // Get RToken oracle config (if exists) for price validation + const oracleConfig = getRTokenOracle(proposalData.rtoken) let priceBefore - if (rtokenOracleAddress) { - console.log(`\nšŸ”® RToken oracle found: ${rtokenOracleAddress}`) - priceBefore = await getRTokenOraclePrice(hre, rtokenOracleAddress) + if (oracleConfig) { + console.log( + `\nšŸ”® RToken oracle found: ${oracleConfig.address} (threshold: ${oracleConfig.threshold}%)` + ) + priceBefore = await getRTokenOraclePrice(hre, oracleConfig.address) console.log(`Price (before): ${priceBefore.toString()}`) } @@ -83,10 +85,15 @@ task('proposal-validator', 'Runs a proposal and confirms can fully rebalance + r }) // Validate RToken oracle - if (rtokenOracleAddress && priceBefore) { - const priceAfter = await getRTokenOraclePrice(hre, rtokenOracleAddress) + if (oracleConfig && priceBefore) { + const priceAfter = await getRTokenOraclePrice(hre, oracleConfig.address) console.log(`\nšŸ”® RToken Price (after): ${priceAfter.toString()}`) - validateRTokenOraclePriceChange(priceBefore, priceAfter, proposalData.rtoken) + validateRTokenOraclePriceChange( + priceBefore, + priceAfter, + proposalData.rtoken, + oracleConfig.threshold + ) } await hre.run('recollateralize', { diff --git a/tasks/validation/utils/constants.ts b/tasks/validation/utils/constants.ts index aa24c8c98..47e373f5b 100644 --- a/tasks/validation/utils/constants.ts +++ b/tasks/validation/utils/constants.ts @@ -45,11 +45,16 @@ export const collateralToUnderlying: { [key: string]: string } = { networkConfig['1'].tokens.aEthUSDC!.toLowerCase(), } +export interface OracleConfig { + address: string + threshold: number // Allowed deviation percentage (e.g., 0.5 = 0.5%) +} + export interface RTokenDeployment { rToken: string governor: string timelock: string - oracle?: string // Optional (RToken oracle) + oracle?: OracleConfig // Optional (RToken oracle) } export const MAINNET_DEPLOYMENTS: RTokenDeployment[] = [ @@ -62,7 +67,10 @@ export const MAINNET_DEPLOYMENTS: RTokenDeployment[] = [ rToken: '0xE72B141DF173b999AE7c1aDcbF60Cc9833Ce56a8', // ETH+ governor: '0x868Fe81C276d730A1995Dc84b642E795dFb8F753', timelock: '0x5d8A7DC9405F08F14541BA918c1Bf7eb2dACE556', - oracle: '0xf87d2F4d42856f0B6Eae140Aaf78bF0F777e9936', // ETH+ Oracle + oracle: { + address: '0xf87d2F4d42856f0B6Eae140Aaf78bF0F777e9936', + threshold: 0.5, + }, }, /*{ rToken: '0xaCdf0DBA4B9839b96221a8487e9ca660a48212be', // hyUSD (mainnet) @@ -91,6 +99,9 @@ export const BASE_DEPLOYMENTS: RTokenDeployment[] = [ rToken: '0xCb327b99fF831bF8223cCEd12B1338FF3aA322Ff', // bsdETH governor: '0x21fBa52dA03e1F964fa521532f8B8951fC212055', timelock: '0xe664d294824C2A8C952A10c4034e1105d2907F46', - oracle: '0xD41310aCF5fA54CDd1970155ac32D708B376Dff6', // bsdETH Oracle + oracle: { + address: '0xD41310aCF5fA54CDd1970155ac32D708B376Dff6', + threshold: 1.25, + }, }, ] diff --git a/tasks/validation/utils/oracles.ts b/tasks/validation/utils/oracles.ts index cb1f673b8..f632737b7 100644 --- a/tasks/validation/utils/oracles.ts +++ b/tasks/validation/utils/oracles.ts @@ -6,7 +6,7 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types' import { BigNumber } from 'ethers' import { AggregatorV3Interface } from '@typechain/index' import { ONE_ADDRESS } from '../../../common/constants' -import { MAINNET_DEPLOYMENTS, BASE_DEPLOYMENTS, RTokenDeployment } from './constants' +import { MAINNET_DEPLOYMENTS, BASE_DEPLOYMENTS, RTokenDeployment, OracleConfig } from './constants' export const overrideOracle = async ( hre: HardhatRuntimeEnvironment, @@ -271,7 +271,7 @@ export const setOraclePrice = async ( await oracle.updateAnswer(value) } -export const getRTokenOracle = (rTokenAddress: string): string | undefined => { +export const getRTokenOracle = (rTokenAddress: string): OracleConfig | undefined => { const allDeployments: RTokenDeployment[] = [...MAINNET_DEPLOYMENTS, ...BASE_DEPLOYMENTS] const deployment = allDeployments.find( (d) => d.rToken.toLowerCase() === rTokenAddress.toLowerCase() @@ -301,19 +301,22 @@ export const getRTokenOraclePrice = async ( export const validateRTokenOraclePriceChange = ( priceBefore: BigNumber, priceAfter: BigNumber, - rTokenAddress: string + rTokenAddress: string, + threshold: number ): void => { if (priceBefore.isZero()) { throw new Error(`Invalid price for RToken ${rTokenAddress}`) } - // Check price is within 0.5% range - const lowerBound = priceBefore.mul(995).div(1000) - const upperBound = priceBefore.mul(1005).div(1000) + // Calculate bounds (e.g., 0.5% -> 9950/10000, 1.25% -> 9875/10000) + const lowerMultiplier = 10000 - threshold * 100 + const upperMultiplier = 10000 + threshold * 100 + const lowerBound = priceBefore.mul(lowerMultiplier).div(10000) + const upperBound = priceBefore.mul(upperMultiplier).div(10000) if (priceAfter.lt(lowerBound) || priceAfter.gt(upperBound)) { throw new Error( - `RToken Oracle price outside allowed 0.5% range.\n` + + `RToken Oracle price outside allowed ${threshold}% range.\n` + ` Price before: ${priceBefore.toString()}\n` + ` Price after: ${priceAfter.toString()}\n` + ` Allowed range: ${lowerBound.toString()} - ${upperBound.toString()}\n` + From 65fbbbfb1391bbd57a770f5a846e5a0eea33c6b5 Mon Sep 17 00:00:00 2001 From: Julian R Date: Thu, 11 Dec 2025 14:24:45 -0300 Subject: [PATCH 10/10] add comment for bsdeth oracle --- tasks/validation/utils/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/validation/utils/constants.ts b/tasks/validation/utils/constants.ts index 47e373f5b..f3cc79405 100644 --- a/tasks/validation/utils/constants.ts +++ b/tasks/validation/utils/constants.ts @@ -101,7 +101,7 @@ export const BASE_DEPLOYMENTS: RTokenDeployment[] = [ timelock: '0xe664d294824C2A8C952A10c4034e1105d2907F46', oracle: { address: '0xD41310aCF5fA54CDd1970155ac32D708B376Dff6', - threshold: 1.25, + threshold: 1.25, // Higher threshold to account for melting and time elapsed }, }, ]