Skip to content

Commit 56a02c5

Browse files
committed
Fix Base oracle migration from eOracle to Chainlink and enable Lisk liquidations
- Switch USDC, wstETH, ezETH, weETH, msUSD from broken eOracle to ChainlinkPriceOracleV2 on Base - Add Safe batch transactions for dead feed rerouting (OGN, USD+, USDz) and fBOMB oracle/pause fix - Register IonicUniV3Liquidator in AddressesProvider on Lisk to unblock permissionless liquidations - Add lisk:open-liquidations task with Step 0 for AddressesProvider registration
1 parent 1d4f3af commit 56a02c5

12 files changed

Lines changed: 386 additions & 31 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,4 @@ packages/contracts/cache/
4444
packages/contracts/cache_hardhat/
4545
packages/contracts/transactions.json
4646
notes.md
47+
.playwright-mcp/

packages/chains/src/base/assets.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ export const assets: SupportedAsset[] = [
6161
underlying: USDC,
6262
name: "USD Coin",
6363
decimals: 6,
64-
oracle: OracleTypes.eOracle,
64+
oracle: OracleTypes.ChainlinkPriceOracleV2,
6565
oracleSpecificParams: {
66-
aggregator: "0x4ba73879B0C073Db595aBE9Ba27104D83f024286",
66+
aggregator: "0x7e860098F58bBFC8648a4311b374B1D669a2bc6B",
6767
feedBaseCurrency: ChainlinkFeedBaseCurrency.USD
6868
},
6969
extraDocs: defaultDocs("https://basescan.org", USDC)
@@ -73,9 +73,9 @@ export const assets: SupportedAsset[] = [
7373
underlying: wstETH,
7474
name: "Wrapped Staked ETH",
7575
decimals: 18,
76-
oracle: OracleTypes.eOracle,
76+
oracle: OracleTypes.ChainlinkPriceOracleV2,
7777
oracleSpecificParams: {
78-
aggregator: "0xDB5d5dE97eD9125283ADa3560FE4f11e996041ab",
78+
aggregator: "0xa669E5272E60f78299F4824495cE01a3923f4380",
7979
feedBaseCurrency: ChainlinkFeedBaseCurrency.USD
8080
},
8181
extraDocs: defaultDocs("https://basescan.org", wstETH)
@@ -97,9 +97,9 @@ export const assets: SupportedAsset[] = [
9797
underlying: ezETH,
9898
name: "Renzo Restaked ETH",
9999
decimals: 18,
100-
oracle: OracleTypes.eOracle,
100+
oracle: OracleTypes.ChainlinkPriceOracleV2,
101101
oracleSpecificParams: {
102-
aggregator: "0xb1E7Db061e58Fa039c5C38a7f96e9476c2cfC78a",
102+
aggregator: "0xC4300B7CF0646F0Fe4C5B2ACFCCC4dCA1346f5d8",
103103
feedBaseCurrency: ChainlinkFeedBaseCurrency.USD
104104
},
105105
extraDocs: defaultDocs("https://basescan.org", ezETH)
@@ -145,9 +145,9 @@ export const assets: SupportedAsset[] = [
145145
underlying: weETH,
146146
name: "Wrapped eETH",
147147
decimals: 18,
148-
oracle: OracleTypes.eOracle,
148+
oracle: OracleTypes.ChainlinkPriceOracleV2,
149149
oracleSpecificParams: {
150-
aggregator: "0x15a3694998DDb14815536B8a5F74130CA8f5236A",
150+
aggregator: "0xFC1415403EbB0c693f9a7844b92aD2Ff24775C65",
151151
feedBaseCurrency: ChainlinkFeedBaseCurrency.USD
152152
},
153153
initialCf: "0.70",
@@ -472,9 +472,9 @@ export const assets: SupportedAsset[] = [
472472
underlying: msUSD,
473473
name: "Metronome Synth USD",
474474
decimals: 18,
475-
oracle: OracleTypes.eOracle,
475+
oracle: OracleTypes.ChainlinkPriceOracleV2,
476476
oracleSpecificParams: {
477-
aggregator: "0x4ba73879B0C073Db595aBE9Ba27104D83f024286",
477+
aggregator: "0x7e860098F58bBFC8648a4311b374B1D669a2bc6B",
478478
feedBaseCurrency: ChainlinkFeedBaseCurrency.USD
479479
},
480480
initialCf: "0.10",

packages/contracts/chainDeploy/mainnets/base.ts

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -146,25 +146,6 @@ export const deploy = async ({
146146
chainId
147147
});
148148

149-
const eOracleAssets = base.assets
150-
.filter((asset) => asset.oracle === OracleTypes.eOracle)
151-
.map((asset) => ({
152-
aggregator: (asset.oracleSpecificParams as ChainlinkSpecificParams).aggregator as Hex,
153-
feedBaseCurrency: (asset.oracleSpecificParams as ChainlinkSpecificParams).feedBaseCurrency,
154-
symbol: asset.symbol
155-
}));
156-
await deployChainlinkOracle({
157-
run,
158-
viem,
159-
getNamedAccounts,
160-
deployments,
161-
deployConfig: { ...deployConfig, nativeTokenUsdChainlinkFeed: "0x75DfcbeDF377f99898535AeE7Fa1Cd1D1e8E41b0" },
162-
assets: base.assets,
163-
chainlinkAssets: eOracleAssets,
164-
namePostfix: "eOracle",
165-
chainId
166-
});
167-
168149
const diaAssets = base.assets
169150
.filter((asset) => asset.oracle === OracleTypes.DiaPriceOracle)
170151
.map((asset) => ({
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"version": "1.0",
3+
"chainId": "8453",
4+
"createdAt": 1771238902,
5+
"meta": {
6+
"name": "Fix Dead Oracle Feeds: Reroute OGN, USD+, USDz to SimplePriceOracle",
7+
"description": "Switch MasterPriceOracle to use SimplePriceOracle for OGN, USD+, USDz. Prices must already be set on SimplePriceOracle via deployer EOA before executing this batch. wUSD+ auto-fixes via ERC4626Oracle cascade. Execute from Safe 0x9eC25b8063De13d478Ba8121b964A339A1BB0ebB",
8+
"txBuilderVersion": "1.16.5"
9+
},
10+
"transactions": [
11+
{
12+
"to": "0x1D89E5ba287E67AC0046D2218Be5fE1382cE47b4",
13+
"value": "0",
14+
"data": "0x9c9192c6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000030000000000000000000000007002458b1df59eccb57387bc79ffc7c29e22e6f7000000000000000000000000b79dd08ea68a908a97220c76d19a6aa9cbde437600000000000000000000000004d5ddf5f3a8939889f11e97f8c4bb48317f19380000000000000000000000000000000000000000000000000000000000000003000000000000000000000000bbdca7858ac2417b06636f7ba35e7d9ea39402ea000000000000000000000000bbdca7858ac2417b06636f7ba35e7d9ea39402ea000000000000000000000000bbdca7858ac2417b06636f7ba35e7d9ea39402ea",
15+
"contractMethod": {
16+
"name": "add",
17+
"inputs": [
18+
{ "name": "underlyings", "type": "address[]", "internalType": "address[]" },
19+
{ "name": "_oracles", "type": "address[]", "internalType": "contract BasePriceOracle[]" }
20+
],
21+
"payable": false
22+
},
23+
"contractInputsValues": {
24+
"underlyings": "[0x7002458B1DF59EccB57387bC79fFc7C29E22e6f7,0xB79DD08EA68A908A97220C76d19A6aA9cBDE4376,0x04D5ddf5f3a8939889F11E97f8c4BB48317F1938]",
25+
"_oracles": "[0xBbDcA7858ac2417b06636F7BA35e7d9EA39402ea,0xBbDcA7858ac2417b06636F7BA35e7d9EA39402ea,0xBbDcA7858ac2417b06636F7BA35e7d9EA39402ea]"
26+
}
27+
}
28+
]
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"version": "1.0",
3+
"chainId": "8453",
4+
"createdAt": 1771227157,
5+
"meta": {
6+
"name": "Fix Broken eOracle - Switch 5 Assets to ChainlinkPriceOracleV2",
7+
"description": "Switch USDC, wstETH, ezETH, weETH, and msUSD from broken eOracle (0x37dBb29E2e12b9Da8008C9E3aCC95adD650d1F6A) to standard ChainlinkPriceOracleV2 (0xb0033576a9E444Dd801d5B69e1b63DBC459A6115) in MasterPriceOracle. Prerequisite: msUSD feed must first be added to ChainlinkPriceOracleV2 via deployer key. Execute from Safe 0x9eC25b8063De13d478Ba8121b964A339A1BB0ebB",
8+
"txBuilderVersion": "1.16.5"
9+
},
10+
"transactions": [
11+
{
12+
"to": "0x1D89E5ba287E67AC0046D2218Be5fE1382cE47b4",
13+
"value": "0",
14+
"data": "0x9c9192c6000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000c1cba3fcea344f92d9239c08c0568f6f2f0ee4520000000000000000000000002416092f143378750bb29b79ed961ab195cceea500000000000000000000000004c0599ae5a44757c0af6f9ec3b93da8976c150a000000000000000000000000526728dbc96689597f85ae4cd716d4f7fccbae9d0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000b0033576a9e444dd801d5b69e1b63dbc459a6115000000000000000000000000b0033576a9e444dd801d5b69e1b63dbc459a6115000000000000000000000000b0033576a9e444dd801d5b69e1b63dbc459a6115000000000000000000000000b0033576a9e444dd801d5b69e1b63dbc459a6115000000000000000000000000b0033576a9e444dd801d5b69e1b63dbc459a6115",
15+
"contractMethod": {
16+
"name": "add",
17+
"inputs": [
18+
{ "name": "underlyings", "type": "address[]", "internalType": "address[]" },
19+
{ "name": "_oracles", "type": "address[]", "internalType": "contract BasePriceOracle[]" }
20+
],
21+
"payable": false
22+
},
23+
"contractInputsValues": {
24+
"underlyings": "[0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913,0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452,0x2416092f143378750bb29b79eD961ab195CcEea5,0x04C0599Ae5A44757c0af6F9eC3b93da8976c150A,0x526728DBc96689597F85ae4cd716d4f7fCcBAE9d]",
25+
"_oracles": "[0xb0033576a9E444Dd801d5B69e1b63DBC459A6115,0xb0033576a9E444Dd801d5B69e1b63DBC459A6115,0xb0033576a9E444Dd801d5B69e1b63DBC459A6115,0xb0033576a9E444Dd801d5B69e1b63DBC459A6115,0xb0033576a9E444Dd801d5B69e1b63DBC459A6115]"
26+
}
27+
}
28+
]
29+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"version": "1.0",
3+
"chainId": "8453",
4+
"createdAt": 1766747281,
5+
"meta": {
6+
"name": "Fix fBOMB Oracle and Pause Market (Combined)",
7+
"description": "Step 2: Update MasterPriceOracle to use SimplePriceOracle for fBOMB. Step 3: Pause fBOMB market mint and borrow via FeeDistributor._callPool(). Execute from Safe 0x9eC25b8063De13d478Ba8121b964A339A1BB0ebB",
8+
"txBuilderVersion": "1.16.5"
9+
},
10+
"transactions": [
11+
{
12+
"to": "0x1D89E5ba287E67AC0046D2218Be5fE1382cE47b4",
13+
"value": "0",
14+
"data": "0x9c9192c600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000074ccbe53f77b08632ce0cb91d3a545bf6b8e09790000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bbdca7858ac2417b06636f7ba35e7d9ea39402ea",
15+
"contractMethod": {
16+
"name": "add",
17+
"inputs": [
18+
{ "name": "underlyings", "type": "address[]", "internalType": "address[]" },
19+
{ "name": "_oracles", "type": "address[]", "internalType": "contract BasePriceOracle[]" }
20+
],
21+
"payable": false
22+
},
23+
"contractInputsValues": {
24+
"underlyings": "[0x74ccbe53F77b08632ce0CB91D3A545bF6B8E0979]",
25+
"_oracles": "[0xBbDcA7858ac2417b06636F7BA35e7d9EA39402ea]"
26+
}
27+
},
28+
{
29+
"to": "0x9BAD1f7685f33ad855AE81089dFe79040864E2F6",
30+
"value": "0",
31+
"data": "0x2acbff39000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000005c9c6417f246600f8f5f49fca9ee991bff73d1300000000000000000000000005c9c6417f246600f8f5f49fca9ee991bff73d130000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000443bcf7ec1000000000000000000000000d333681242f376f9005d1208ff946c3ee73ed659000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004418c882a5000000000000000000000000d333681242f376f9005d1208ff946c3ee73ed659000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000",
32+
"contractMethod": {
33+
"name": "_callPool",
34+
"inputs": [
35+
{ "name": "targets", "type": "address[]", "internalType": "address[]" },
36+
{ "name": "data", "type": "bytes[]", "internalType": "bytes[]" }
37+
],
38+
"payable": false
39+
},
40+
"contractInputsValues": {
41+
"targets": "[0x05c9C6417F246600f8f5f49fcA9Ee991bfF73D13, 0x05c9C6417F246600f8f5f49fcA9Ee991bfF73D13]",
42+
"data": "[0x3bcf7ec1000000000000000000000000d333681242f376f9005d1208ff946c3ee73ed6590000000000000000000000000000000000000000000000000000000000000001, 0x18c882a5000000000000000000000000d333681242f376f9005d1208ff946c3ee73ed6590000000000000000000000000000000000000000000000000000000000000001]"
43+
}
44+
}
45+
]
46+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"version": "1.0",
3+
"chainId": "8453",
4+
"createdAt": 1766747281,
5+
"meta": {
6+
"name": "Update MasterPriceOracle to use SimplePriceOracle for fBOMB",
7+
"description": "Point fBOMB to SimplePriceOracle instead of the stale Redstone ChainlinkPriceOracleV2. This is step 2 of 3 to fix the fBOMB market oracle issue.",
8+
"txBuilderVersion": "1.16.5"
9+
},
10+
"transactions": [
11+
{
12+
"to": "0x1D89E5ba287E67AC0046D2218Be5fE1382cE47b4",
13+
"value": "0",
14+
"data": "0x9c9192c600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000074ccbe53f77b08632ce0cb91d3a545bf6b8e09790000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bbdca7858ac2417b06636f7ba35e7d9ea39402ea",
15+
"contractMethod": {
16+
"name": "add",
17+
"inputs": [
18+
{ "name": "underlyings", "type": "address[]", "internalType": "address[]" },
19+
{ "name": "_oracles", "type": "address[]", "internalType": "contract BasePriceOracle[]" }
20+
],
21+
"payable": false
22+
},
23+
"contractInputsValues": {
24+
"underlyings": "[0x74ccbe53F77b08632ce0CB91D3A545bF6B8E0979]",
25+
"_oracles": "[0xBbDcA7858ac2417b06636F7BA35e7d9EA39402ea]"
26+
}
27+
}
28+
]
29+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"version": "1.0",
3+
"chainId": "8453",
4+
"createdAt": 1766747281,
5+
"meta": {
6+
"name": "Pause fBOMB Market (Mint and Borrow)",
7+
"description": "Pause the fBOMB market to prevent new supply and borrow operations while the oracle is using a fixed price. This is step 3 of 3 to fix the fBOMB market oracle issue.",
8+
"txBuilderVersion": "1.16.5"
9+
},
10+
"transactions": [
11+
{
12+
"to": "0x05c9C6417F246600f8f5f49fcA9Ee991bfF73D13",
13+
"value": "0",
14+
"data": "0x3bcf7ec1000000000000000000000000d333681242f376f9005d1208ff946c3ee73ed6590000000000000000000000000000000000000000000000000000000000000001",
15+
"contractMethod": {
16+
"name": "_setMintPaused",
17+
"inputs": [
18+
{ "name": "cToken", "type": "address", "internalType": "contract ICErc20" },
19+
{ "name": "state", "type": "bool", "internalType": "bool" }
20+
],
21+
"payable": false
22+
},
23+
"contractInputsValues": {
24+
"cToken": "0xd333681242F376f9005d1208ff946C3EE73eD659",
25+
"state": "true"
26+
}
27+
},
28+
{
29+
"to": "0x05c9C6417F246600f8f5f49fcA9Ee991bfF73D13",
30+
"value": "0",
31+
"data": "0x18c882a5000000000000000000000000d333681242f376f9005d1208ff946c3ee73ed6590000000000000000000000000000000000000000000000000000000000000001",
32+
"contractMethod": {
33+
"name": "_setBorrowPaused",
34+
"inputs": [
35+
{ "name": "cToken", "type": "address", "internalType": "contract ICErc20" },
36+
{ "name": "state", "type": "bool", "internalType": "bool" }
37+
],
38+
"payable": false
39+
},
40+
"contractInputsValues": {
41+
"cToken": "0xd333681242F376f9005d1208ff946C3EE73eD659",
42+
"state": "true"
43+
}
44+
}
45+
]
46+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"version": "1.0",
3+
"chainId": "8453",
4+
"createdAt": 1766747281,
5+
"meta": {
6+
"name": "Set fBOMB Fixed Price in SimplePriceOracle",
7+
"description": "Set a fixed price for fBOMB (~$0.02 USD) in SimplePriceOracle to prevent oracle reverts. This is step 1 of 3 to fix the fBOMB market oracle issue.",
8+
"txBuilderVersion": "1.16.5"
9+
},
10+
"transactions": [
11+
{
12+
"to": "0xBbDcA7858ac2417b06636F7BA35e7d9EA39402ea",
13+
"value": "0",
14+
"data": "0x09a8acb000000000000000000000000074ccbe53f77b08632ce0cb91d3a545bf6b8e097900000000000000000000000000000000000000000000000000000620f0c62ecf",
15+
"contractMethod": {
16+
"name": "setDirectPrice",
17+
"inputs": [
18+
{ "name": "asset", "type": "address", "internalType": "address" },
19+
{ "name": "_price", "type": "uint256", "internalType": "uint256" }
20+
],
21+
"payable": false
22+
},
23+
"contractInputsValues": {
24+
"asset": "0x74ccbe53F77b08632ce0CB91D3A545bF6B8E0979",
25+
"_price": "6738548240079"
26+
}
27+
}
28+
]
29+
}

packages/contracts/tasks/chain-specific/base/oracle.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
11
import { task } from "hardhat/config";
2-
import { Address } from "viem";
2+
import { Address, Hex } from "viem";
33
import { base } from "@ionicprotocol/chains";
4-
import { assetSymbols } from "@ionicprotocol/types";
4+
import { assetSymbols, ChainlinkFeedBaseCurrency } from "@ionicprotocol/types";
55

66
import { addUnderlyingsToMpo } from "../../../chainDeploy/helpers/oracles/utils";
77
import { deployErc4626PriceOracle } from "../../../chainDeploy/helpers";
88

9+
task("base:oracle:set-msusd-feed", "Adds msUSD feed to ChainlinkPriceOracleV2 using USDC/USD Chainlink feed").setAction(
10+
async (_, { viem }) => {
11+
const chainlinkV2 = await viem.getContractAt(
12+
"ChainlinkPriceOracleV2",
13+
"0xb0033576a9E444Dd801d5B69e1b63DBC459A6115" as Address
14+
);
15+
16+
const msUSD = "0x526728DBc96689597F85ae4cd716d4f7fCcBAE9d" as Address;
17+
const usdcUsdFeed = "0x7e860098F58bBFC8648a4311b374B1D669a2bc6B" as Hex;
18+
19+
console.log("Setting msUSD price feed on ChainlinkPriceOracleV2...");
20+
const tx = await chainlinkV2.write.setPriceFeeds(
21+
[[msUSD], [usdcUsdFeed], ChainlinkFeedBaseCurrency.USD]
22+
);
23+
console.log("setPriceFeeds tx:", tx);
24+
}
25+
);
26+
927
task("base:oracle:add:superoethb", "Adds SuperOETHb to the MasterPriceOracle").setAction(
1028
async (_, { viem, getNamedAccounts, deployments, run }) => {
1129
const { deployer } = await getNamedAccounts();

0 commit comments

Comments
 (0)