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 */} +
+
+ + + + + + + + + + {feeds.map((feed, index) => { + const formattedParams = formatUpdateParams( + feed.updateParameters + ); + const isDefault = formattedParams === defaultParams; + + return ( + + + + + + ); + })} + +
+ Name + + Price Feed Id + + Update Parameters +
+ + {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; +}