diff --git a/components/SponsoredFeedsTable.tsx b/components/SponsoredFeedsTable.tsx
new file mode 100644
index 00000000..87c6ee82
--- /dev/null
+++ b/components/SponsoredFeedsTable.tsx
@@ -0,0 +1,175 @@
+import { useState } from "react";
+import CopyIcon from "./icons/CopyIcon";
+import { mapValues } from "../utils/ObjectHelpers";
+
+interface UpdateParameters {
+ heartbeatLength: number;
+ heartbeatUnit: "second" | "minute" | "hour";
+ priceDeviation: number;
+}
+
+interface SponsoredFeed {
+ name: string;
+ priceFeedId: string;
+ updateParameters: UpdateParameters;
+}
+
+interface SponsoredFeedsTableProps {
+ feeds: SponsoredFeed[];
+ networkName: string;
+}
+
+/**
+ * Helper functions
+ */
+
+// Format update parameters as a string for grouping
+const formatUpdateParams = (params: UpdateParameters): string => {
+ return `${params.heartbeatLength} ${params.heartbeatUnit} heartbeat / ${params.priceDeviation}% price deviation`;
+};
+
+// Render update parameters with proper styling
+const renderUpdateParams = (params: UpdateParameters, isDefault: boolean) => (
+
+
+
+ {params.heartbeatLength} {params.heartbeatUnit} heartbeat
+
+ {params.priceDeviation}% price deviation
+
+
+);
+
+export const SponsoredFeedsTable = ({
+ feeds,
+ networkName,
+}: SponsoredFeedsTableProps) => {
+ const [copiedId, setCopiedId] = useState(null);
+
+ const copyToClipboard = (text: string) => {
+ navigator.clipboard.writeText(text).then(() => {
+ setCopiedId(text);
+ setTimeout(() => setCopiedId(null), 2000);
+ });
+ };
+
+ // Calculate parameter statistics
+ const paramCounts = mapValues(
+ Object.groupBy(feeds, (feed) => formatUpdateParams(feed.updateParameters)),
+ (feeds: SponsoredFeed[]) => feeds.length
+ );
+
+ const defaultParams = Object.entries(paramCounts).sort(
+ ([, a], [, b]) => b - a
+ )[0][0];
+
+ return (
+
+
+ The price feeds listed in the table below are currently sponsored in{" "}
+ {networkName}.
+
+
+
+ {/* Summary bar */}
+
+
+
+
+
Default:
+
{defaultParams}
+
+ ({paramCounts[defaultParams]})
+
+
+ {Object.entries(paramCounts)
+ .filter(([params]) => params !== defaultParams)
+ .map(([params, count]) => (
+
+
+
Exception:
+
{params}
+
({count})
+
+ ))}
+
+
+
+ {/* Table */}
+
+
+
+
+
+ |
+ Name
+ |
+
+ Price Feed Id
+ |
+
+ Update Parameters
+ |
+
+
+
+ {feeds.map((feed, index) => {
+ const formattedParams = formatUpdateParams(
+ feed.updateParameters
+ );
+ const isDefault = formattedParams === defaultParams;
+
+ return (
+
+ |
+
+ {feed.name}
+
+ |
+
+
+
+ {feed.priceFeedId}
+
+
+
+ |
+
+ {renderUpdateParams(feed.updateParameters, isDefault)}
+ |
+
+ );
+ })}
+
+
+
+
+
+
+ );
+};
diff --git a/package-lock.json b/package-lock.json
index 3b048d2e..50ed570b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -54,7 +54,7 @@
"solc": "^0.8.20",
"tailwindcss": "^3.4.3",
"ts-node": "^10.9.1",
- "typescript": "^5.1.6"
+ "typescript": "^5.8.3"
}
},
"node_modules/@adobe/css-tools": {
@@ -742,6 +742,7 @@
},
"node_modules/@clack/prompts/node_modules/is-unicode-supported": {
"version": "1.3.0",
+ "extraneous": true,
"inBundle": true,
"license": "MIT",
"engines": {
@@ -26614,9 +26615,10 @@
"integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g=="
},
"node_modules/typescript": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
- "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -28356,7 +28358,8 @@
"dependencies": {
"is-unicode-supported": {
"version": "1.3.0",
- "bundled": true
+ "bundled": true,
+ "extraneous": true
}
}
},
@@ -46729,9 +46732,9 @@
"integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g=="
},
"typescript": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
- "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA=="
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="
},
"ufo": {
"version": "1.3.2",
diff --git a/package.json b/package.json
index c320111f..c00a3e26 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,6 @@
"solc": "^0.8.20",
"tailwindcss": "^3.4.3",
"ts-node": "^10.9.1",
- "typescript": "^5.1.6"
+ "typescript": "^5.8.3"
}
}
diff --git a/pages/price-feeds/sponsored-feeds/evm.mdx b/pages/price-feeds/sponsored-feeds/evm.mdx
index a69c9e67..355cd551 100644
--- a/pages/price-feeds/sponsored-feeds/evm.mdx
+++ b/pages/price-feeds/sponsored-feeds/evm.mdx
@@ -1,3 +1,5 @@
+import { SponsoredFeedsTable } from "../../../components/SponsoredFeedsTable";
+
# Sponsored Feeds on EVM
The following EVM chains have sponsored price feeds:
@@ -14,222 +16,1462 @@ The following EVM chains have sponsored price feeds:
## Ethereum Mainnet
-The price feeds listed in the table below are currently sponsored in **Ethereum mainnet**.
-
-Update Parameters for BOLD: **1 hour heartbeat or 0.5% price deviation**
-
-Update Parameters for the other assets: **1 hour heartbeat or 2% price deviation**
-
-| Name | Price Feed Id |
-| ---------- | ------------------------------------------------------------------ |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| UNI/USD | `78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501` |
-| PYTH/USD | `0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff` |
-| USR/USD | `10b013adec14c0fe839ca0fe54cec9e4d0b6c1585ac6d7e70010dac015e57f9c` |
-| WSTUSR/USR | `b74c2bc175c2dab850ce5a5451608501c293fe8410cb4aba7449dd1c355ab706` |
-| USDTB/NAV | `967549f1ff4869f41cb354a7116b9e5a9a3091bebe0b2640eeed745ca1f7f90b` |
-| BOLD/USD | `d6134dbb0427240f901e3e596d6e63f7d85088f96cd4cd4ae2f89c0819b5d623` |
+
## Base Mainnet
-The price feeds listed in the table below are currently sponsored in **Base mainnet**.
-
-Update Parameters: **1 hour heartbeat or 1% price deviation**
-
-| Name | Price Feed Id |
-| ------------- | ------------------------------------------------------------------ |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| ETH/USD | `ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
-| WETH/USD | `9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6` |
-| PUFETH/USD | `e5801530292c348f322b7b4a48c1c0d59ab629846cce1c816fc27aee2054b560` |
-| WEETH/USD | `9ee4e7c60b940440a261eb54b6d8149c23b580ed7da3139f7f08f4ea29dad395` |
-| EZETH/USD | `06c217a791f5c4f988b36629af4cb88fad827b2485400a358f3b02886b54de92` |
-| CBETH/USD | `15ecddd26d49e1a8f1de9376ebebc03916ede873447c1255d2d5891b92ce5717` |
-| WSTETH/USD | `6df640f3b8963d8f8358f791f352b8364513f6ab1cca5ed3f1f7b5448980e784` |
-| RSETH/USD | `0caec284d34d836ca325cf7b3256c078c597bc052fbd3c0283d52b581d68d71f` |
-| PYTH/USD | `0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff` |
-| SUI/USD | `23d7315113f5b1d3ba7a83604c44b94d79f4fd69af77f804fc7f920a6dc65744` |
-| XRP/USD | `ec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8` |
-| USR/USD | `10b013adec14c0fe839ca0fe54cec9e4d0b6c1585ac6d7e70010dac015e57f9c` |
-| USR/USD.RR | `512a79cc65f49531f0bbb72956353e79ecdc1e4a6e5241847196c1f9a11d8a52` |
-| RLP/USD | `7265d5cf8ee0e7b5266f75ff19c42c5b7697a9756c9304aa78b6be4fbb8d823d` |
-| RLP/USD.RR | `796bcb684fdfbba2b071c165251511ab61f08c8949afd9e05665a26f69d9a839` |
-| WSTUSR/USR.RR | `b74c2bc175c2dab850ce5a5451608501c293fe8410cb4aba7449dd1c355ab706` |
+
## Berachain Mainnet
-The price feeds listed in the table below are currently sponsored in **Berachain mainnet**.
-
-Update Parameters: **1 hour heartbeat or 1% price deviation**
-
-| Name | Price Feed Id |
-| --------------------- | ------------------------------------------------------------------ |
-| BERA/USD | `962088abcfdbdb6e30db2e340c8cf887d9efb311b1f2f17b155a63dbb6d40265` |
-| BERASTONE/USD | `950fe827fa92b73e81cd49043673e9132a8424b24e35989156606073f2385e21` |
-| BERASTONE/ETH.RR | `b8004b055f64f9e13468e0bff616bb87232c241a962cdf87c7a781ec31194803` |
-| BTC/USD | `e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43` |
-| ETH/USD | `ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
-| LIQUIDBERABTC/WBTC.RR | `c869104c9feab6b6b303add2d48fa7443fc119493f8d8cafd4df23890659ed78` |
-| LIQUIDBERAETH/ETH.RR | `bedaf537ab909117259282b9463b0f54d67dd575d64dcd564bfbdbfc0f57f99d` |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| USDT/USD | `2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b` |
-| PYUSD/USD | `c1da1b73d7f01e7ddd54b3766cf7fcd644395ad14f70aa706ec5384c59e76692` |
-| SUSDE/USDE.RR | `271c64ce459937abf721d42552035713b6c58f80eeceab716a624607fda4b10f` |
-| HONEY/USD | `f67b033925d73d43ba4401e00308d9b0f26ab4fbd1250e8b5407b9eaade7e1f4` |
-| RSETH/USD | `0caec284d34d836ca325cf7b3256c078c597bc052fbd3c0283d52b581d68d71f` |
-| RSETH/ETH.RR | `56e9b5eb08e62dd4b445f29e4ec7d3b3d49617d64f2d331d36a2101d4904e3c4` |
-| IBGT/USD | `c929105a1af143cbfc887c4573947f54422a9ca88a9e622d151b8abdf5c2962f` |
-| STBGT/USD | `ffd5448b844f5e7eeafbf36c47c7d4791a3cb86f5cefe02a7ba7864b22d81137` |
-| HENLO/USD | `d90813d7fc7f4f5d786f3a6a35701aff4f628db0ecd998de66be0ff8264c67a2` |
-| IBERA/USD | `eb943c0b5c9e02a529f799ac91070c3b7046f9412f3e5b0a90ba00267b838f34` |
-| NECT/USD | `ddf0dd319060db4561b5aa8f84a94816d33579f8dc2af2d8f74583bce20cd260` |
-| HONEY/USD.RR | `8bb3695875f9c33594097b0e0a1daa881aa81290088f0eac3a07b700fc7612ba` |
+
## HyperEVM Mainnet
-The price feeds listed in the table below are currently sponsored in **HyperEVM mainnet**.
-
-Update Parameters: **1 hour heartbeat or 1% price deviation**
-
-| Name | Price Feed Id |
-| ----------------- | ------------------------------------------------------------------ |
-| BTC/USD | `e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43` |
-| ETH/USD | `ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| USDT/USD | `2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b` |
-| HYPE/USD | `4279e31cc369bbcc2faf022b382b080e32a8e689ff20fbc530d2a603eb6cd98b` |
-| HFUN/USD | `61db931fcfd322223fb84dc4bfc9c6481bd5610a31403782bc396df213e3ce12` |
-| PURR/USD | `e0154bf4dfbcf835fad3428c0d8c1078b83f687e4d6afafb827f7f9af70ec326` |
-| SOL/USD | `ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d` |
-| WSTETH/USD | `6df640f3b8963d8f8358f791f352b8364513f6ab1cca5ed3f1f7b5448980e784` |
-| WSTETH/STETH.RR | `f59ead01ed0faba85332a1e2feae8ddb14a1c94ebac259f1c982c92fc7ce333e` |
-| WEETH/USD | `9ee4e7c60b940440a261eb54b6d8149c23b580ed7da3139f7f08f4ea29dad395` |
-| WEETH/EETH.RR | `343558e79f587e098c321218ecb34d031ba709ab3e84133126f3c98511b91f64` |
-| LBTC/USD | `8f257aab6e7698bb92b15511915e593d6f8eae914452f781874754b03d0c612b` |
-| LBTC/BTC.RR | `bade5c63f281d36a13dbb64ed0ae1c532a434b6771b11885f396a41f56cc3bd0` |
-| CBBTC/USD | `2817d7bfe5c64b8ea956e9a26f573ef64e72e4d7891f2d6af9bcc93f7aff9a97` |
-| WBTC/USD | `c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33` |
-| WETH/USD | `9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6` |
-| USDE/USD | `6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d` |
-| SUSDE/USD | `ca3ba9a619a4b3755c10ac7d5e760275aa95e9823d38a84fedd416856cdba37c` |
-| SUSDE/USDE.RR | `271c64ce459937abf721d42552035713b6c58f80eeceab716a624607fda4b10f` |
-| WSTHYPE/STHYPE.RR | `1a78b5829a99f1d2897917dae2a02266c0210535a995a2e9d0692613bbc89e27` |
-| LHYPE/USD | `9e3cadc2a8a0ebfd765b34d5ee5de77a4add3114672fc0b8d3ad09ac56940069` |
-| FHYPE/HYPE.RR | `8f749681c078ce4ef65cd220994f25735b80264fca4386dd57b31eacf7e4610b` |
-| USDXL/USD | `e10593860e9ee1c204e4f9569e877502f098dd1a4d84cc5bad06f23f77dcbfe2` |
-| MHYPE/HYPE.RR | `e35aebd2d35795acaa2b0e59f3b498510e8ef334986d151d1502adb9e26234f7` |
-| FEUSD/USD | `7f2e9a7365eb634c543e9ca72683a9cf778cdc16ee5b8bca73abe6d08c1410d5` |
-| MHYPE/USD | `a7fb4cdafed5130e8731b8da7c9208881f24e9b671bb92438b1fbf361d578112` |
-| STHYPE/USD | `068cd0617cbdd1dda615ed2b5ab4fe07d2e9f46347f5e785484844aa10d22dc5` |
-| UETH/USD | `08c73e187b45ecb2ab8375b975865d3c4a225fef1ccc7f326ad6eec66a24567a` |
-| UBTC/USD | `42bfb26778f3504a9f359a92c731f77d0c24aed9b7745276e3ad0c2d840b74c2` |
-| CMETH/METH.RR | `cef5ad3be493afef85e77267cb0c07d048f3d54055409a34782996607e48cf0a` |
-| METH/ETH.RR | `ee279eeb2fec830e3f535ad4d6524eb35eb1c6890cb1afc0b64554d08c88727e` |
-| USR/USD.RR | `512a79cc65f49531f0bbb72956353e79ecdc1e4a6e5241847196c1f9a11d8a52` |
-| USOL/USD | `974c7a77dbace44d229be17fc176975e06404b004476aeaff37641818cb0c55a` |
-| BUDDY/USD | `ac2adf4571a391da22a2d39e8c5eb32ceecd6ab38c386a9194d669deece74dee` |
-| XAU/USD | `765d2ba906dbc32ca17cc11f5310a89e9ee1f6420508c63861f2f8ba4ee34bb2` |
-| USDHL/USD | `1497fb795ae65533d36d147b1b88c8b7226866a201589904c13acd314f694799` |
-| UFART/USD | `a210f55ff119d315002b5dc4f763b4e4114197028e45d6aca16498ab1433fb6d` |
-| USH/USD | `eaa30c1ef2d9f4fde45d6e699bfda5187b3de200ea4cbab25d676b260ab728c1` |
-| HWHLP/USDC | `d136d4fd8d5f41c42339bcaf79954cfc2d50a33b129a990f8a2087d73cadade9` |
-| WHLP/USDC | `b94c49af07479932872c63126f6bdee78140be7a953435e3815c8e1b204a0a04` |
-| STLOOP/LOOP | `1d99073631da1f959284bae0be4d027cfd41c98f4b6a95d20ccf4208a3a4b1f1` |
-| HLP0/USDC.RR | `aa388e24e74d5dd12145f74fad3180266f78ed08c0a2f47c60583fdb612587ba` |
-| KHYPE/HYPE.RR | `983b7cabc6fab548e15a5b05500da9b99c1682107b3e2ff289344116c10ac02c` |
-| WSTUSR/USR.RR | `b74c2bc175c2dab850ce5a5451608501c293fe8410cb4aba7449dd1c355ab706` |
-| RLP/USD.RR | `796bcb684fdfbba2b071c165251511ab61f08c8949afd9e05665a26f69d9a839` |
+
## Kraken Mainnet
-The price feeds listed in the table below are currently sponsored in **Kraken mainnet**.
-
-Update Parameters: **1 hour heartbeat or 1% price deviation**
-
-| Name | Price Feed Id |
-| ---------- | ------------------------------------------------------------------ |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| USDT/USD | `2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b` |
-| ETH/USD | `ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
-| WETH/USD | `9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6` |
-| WSTETH/USD | `6df640f3b8963d8f8358f791f352b8364513f6ab1cca5ed3f1f7b5448980e784` |
-| BTC/USD | `e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43` |
+
## Unichain Mainnet
-The price feeds listed in the table below are currently sponsored in **Unichain mainnet**.
-
-Update Parameters: **1 hour heartbeat or 1% price deviation**
-
-| Name | Price Feed Id |
-| -------- | ------------------------------------------------------------------ |
-| BTC/USD | `e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43` |
-| ETH/USD | `ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
-| UNI/USD | `78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501` |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| USDT/USD | `2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b` |
-| PYTH/USD | `0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff` |
-| ETH/BTC | `c96458d393fe9deb7a7d63a0ac41e2898a67a7750dbd166673279e06c868df0a` |
+
## Sonic Mainnet
-The price feeds listed in the table below are currently sponsored in **Sonic mainnet**.
-
-Update Parameters: **1 hour heartbeat or 1% price deviation**
-
-| Name | Price Feed Id |
-| ------------------ | ------------------------------------------------------------------ |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| ETH/USD | `ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
-| WETH/USD | `9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6` |
-| WBTC/USD | `c9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33` |
-| BTC/USD | `e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43` |
-| USDT/USD | `2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b` |
-| S/USD | `f490b178d0c85683b7a0f2388b40af2e6f7c90cbe0f96b31f315f08d0e5a2d6d` |
-| SCUSD/USD | `316b1536978bee10c47b3c74c0b3995aabae973a3351621680a2aa383aca77b8` |
-| SCETH/USD | `8bb5e69ed1ab19642a0e7e851b1ed7b3579d0548bc8ddd1077b0d9476bb1dabc` |
-| WSTKSCETH/SCETH.RR | `b680422b70915df562e4802bd8679112ff0f6b0a29ec2c3762ae2720eda01e58` |
-| WSTKSCUSD/SCUSD.RR | `caed0964240861da425cf03fae9737473f6f031fb80cbbd73c3fb8cddd7a2204` |
-| STS/S.RR | `3b14bd355f182fa3a3feeea6824228e1f71e7c221a37bc91e8307280aee6a803` |
-| ANON/USD | `7a36855b8a4a6efd701ed82688694bbf67602de9faae509ae28f91065013cb82` |
-| OS/USD | `2bcd65e3c1b4580a5f59755ef30e11077238217dd418d301dd7ee4d252987675` |
-| GOGLZ/USD | `82465d1155ddbb2c73bf3491457163000f8e8d02dea90c548b1b7e56ae9fe4b1` |
-| SHADOW/USD | `6f02ad2b8a307411fc3baedb9876e83efe9fa9f5b752aab8c99f4742c9e5f5d5` |
-| WANS/ANS.RR | `940b0948d828c46bff5fc3a3204fc032092b5b4239ef9364f33e01d37437ba65` |
-| STS/USD | `19f463beb47cb398cf2e2c8037f1d0073583cf18209c91a636f051d755ce0662` |
-| HLP0/USDC.RR | `aa388e24e74d5dd12145f74fad3180266f78ed08c0a2f47c60583fdb612587ba` |
+
## Optimism Sepolia
-The price feeds listed in the table below are currently sponsored in **Optimism Sepolia**.
-
-Update Parameters: **30 seconds heartbeat or 1% price deviation**
-
-| Name | Price Feed Id |
-| -------- | ------------------------------------------------------------------ |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| ETH/USD | `ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
+
## Unichain Sepolia
-The price feeds listed in the table below are currently sponsored in **Unichain Sepolia**.
-
-Update Parameters: **1 hour heartbeat or 1% price deviation**
-
-| Name | Price Feed Id |
-| ---------- | ------------------------------------------------------------------ |
-| BTC/USD | `e62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43` |
-| ETH/USD | `ff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace` |
-| STETH/USD | `3af6a3098c56f58ff47cc46dee4a5b1910e5c157f7f0b665952445867470d61f` |
-| UNI/USD | `78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501` |
-| USDC/USD | `eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a` |
-| USDT/USD | `2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b` |
-| WSTETH/USD | `6df640f3b8963d8f8358f791f352b8364513f6ab1cca5ed3f1f7b5448980e784` |
-| WETH/USD | `9d4294bbcd1174d6f2003ec365831e64cc31d9f6f15a2b85399db8d5000960f6` |
-| AVAX/USD | `93da3352f9f1d105fdfe4971cfa80e9dd777bfc5d0f683ebb6e1294b92137bb7` |
-| POL/USD | `ffd11c5a1cfd42f80afb2df4d9f264c15f956d68153335374ec10722edd70472` |
-| DOGE/USD | `dcef50dd0a4cd2dcc17e45df1676dcb336a11a61c69df7a0299b0150c672d25c` |
-| SHIB/USD | `f0d57deca57b3da2fe63a493f4c25925fdfd8edf834b20f93e1f84dbd1504d4a` |
-| DAI/USD | `b0948a5e5313200c632b51bb5ca32f6de0d36e9950a942d19751e833f70dabfd` |
-| OP/USD | `385f64d993f7b77d8182ed5003d97c60aa3361f3cecfe711544d2d59165e9bdf` |
-| PYTH/USD | `0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff` |
+
diff --git a/utils/ObjectHelpers.tsx b/utils/ObjectHelpers.tsx
new file mode 100644
index 00000000..7db85ca2
--- /dev/null
+++ b/utils/ObjectHelpers.tsx
@@ -0,0 +1,17 @@
+/**
+ * Maps over object values while preserving keys, similar to Array.map but for objects.
+ * Handles both regular objects and Partial objects (like Object.groupBy results).
+ * Filters out undefined values automatically.
+ */
+export function mapValues(
+ obj: Record | Partial>,
+ fn: (value: T, key: string) => U
+): Record {
+ const result: Record = {};
+ for (const [key, value] of Object.entries(obj)) {
+ if (value !== undefined) {
+ result[key] = fn(value, key);
+ }
+ }
+ return result;
+}