From 88991bbd0f69a9f13c69bb3b018c80ae204480b5 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier Date: Mon, 13 Jul 2026 19:42:15 +0200 Subject: [PATCH] rwa: new category, tokenized-stock-peg moves in, 11 equity logos + registry pages --- benchmarks/tokenized-stock-peg.yml | 2 +- public/logos/aapl.svg | 1 + public/logos/amd.svg | 1 + public/logos/amzn.png | Bin 0 -> 6589 bytes public/logos/googl.svg | 1 + public/logos/meta.svg | 1 + public/logos/msft.svg | 1 + public/logos/mu.png | Bin 0 -> 1521 bytes public/logos/nvda.svg | 1 + public/logos/pltr.svg | 1 + public/logos/spy.svg | 35 ++++++++++++++++++ public/logos/tsla.svg | 1 + src/components/provider-logo.tsx | 2 ++ src/data/provider-registry.ts | 55 +++++++++++++++++++++++++++++ src/lib/categories.ts | 10 +++++- src/lib/category-colors.ts | 2 ++ src/lib/logo-manifest.ts | 11 ++++++ src/lib/spec-schema.ts | 1 + src/types/benchmark.ts | 2 +- 19 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 public/logos/aapl.svg create mode 100644 public/logos/amd.svg create mode 100644 public/logos/amzn.png create mode 100644 public/logos/googl.svg create mode 100644 public/logos/meta.svg create mode 100644 public/logos/msft.svg create mode 100644 public/logos/mu.png create mode 100644 public/logos/nvda.svg create mode 100644 public/logos/pltr.svg create mode 100644 public/logos/spy.svg create mode 100644 public/logos/tsla.svg diff --git a/benchmarks/tokenized-stock-peg.yml b/benchmarks/tokenized-stock-peg.yml index 3a4f6206..df9691c0 100644 --- a/benchmarks/tokenized-stock-peg.yml +++ b/benchmarks/tokenized-stock-peg.yml @@ -7,7 +7,7 @@ seo_title: "Tokenized stock price tracker 2026" seo_description: "Do tokenized stocks track the real market? AAPL, TSLA, NVDA and 8 more on Robinhood Chain vs their Nasdaq price, deviation in bps, live and keyless." subtitle: "Absolute deviation between each tokenized equity's Uniswap v4 pool price on Robinhood Chain and its real market reference price, in basis points, labeled by market session. The only live public measurement of whether onchain stocks actually track their underlying." -category: Trading +category: RWA status: live metric: Price deviation unit: bps diff --git a/public/logos/aapl.svg b/public/logos/aapl.svg new file mode 100644 index 00000000..915e8909 --- /dev/null +++ b/public/logos/aapl.svg @@ -0,0 +1 @@ +Apple \ No newline at end of file diff --git a/public/logos/amd.svg b/public/logos/amd.svg new file mode 100644 index 00000000..ae3de073 --- /dev/null +++ b/public/logos/amd.svg @@ -0,0 +1 @@ +AMD \ No newline at end of file diff --git a/public/logos/amzn.png b/public/logos/amzn.png new file mode 100644 index 0000000000000000000000000000000000000000..d466c7923d8987b70668899fbe25d8aad867d5e8 GIT binary patch literal 6589 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 L&4mhcbmIR5E(C>_ literal 0 HcmV?d00001 diff --git a/public/logos/googl.svg b/public/logos/googl.svg new file mode 100644 index 00000000..088288fa --- /dev/null +++ b/public/logos/googl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/meta.svg b/public/logos/meta.svg new file mode 100644 index 00000000..385fb0a1 --- /dev/null +++ b/public/logos/meta.svg @@ -0,0 +1 @@ +Meta \ No newline at end of file diff --git a/public/logos/msft.svg b/public/logos/msft.svg new file mode 100644 index 00000000..5334aa7c --- /dev/null +++ b/public/logos/msft.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/mu.png b/public/logos/mu.png new file mode 100644 index 0000000000000000000000000000000000000000..f8f9a2946a00db91ec70b25b4a256e9430a04e8d GIT binary patch literal 1521 zcmeAS@N?(olHy`uVBq!ia0y~yU|a&i985rwk9x$eC8vmO{P8a>(VyNluxw-&I>P56V6EUdJUQE5GS*Cc{(8o|53|=5&!2Z- z`G?`@Pk1D@9FNMbVm@%Yk{&6FUMUydo(;bIJ2t+)vs^vkOO5Ph;k=WZhj}svMsLNM xt;@_A_RLMEUx9%h>~txm=xgaAe_-kT|G%`C$o^Zi3ZDWw44$rjF6*2UngEJ<>LLID literal 0 HcmV?d00001 diff --git a/public/logos/nvda.svg b/public/logos/nvda.svg new file mode 100644 index 00000000..e427e2ce --- /dev/null +++ b/public/logos/nvda.svg @@ -0,0 +1 @@ +NVIDIA \ No newline at end of file diff --git a/public/logos/pltr.svg b/public/logos/pltr.svg new file mode 100644 index 00000000..6bb694d7 --- /dev/null +++ b/public/logos/pltr.svg @@ -0,0 +1 @@ +Palantir \ No newline at end of file diff --git a/public/logos/spy.svg b/public/logos/spy.svg new file mode 100644 index 00000000..d3d540a1 --- /dev/null +++ b/public/logos/spy.svg @@ -0,0 +1,35 @@ + + + diff --git a/public/logos/tsla.svg b/public/logos/tsla.svg new file mode 100644 index 00000000..e990fab5 --- /dev/null +++ b/public/logos/tsla.svg @@ -0,0 +1 @@ +Tesla \ No newline at end of file diff --git a/src/components/provider-logo.tsx b/src/components/provider-logo.tsx index db7f1af0..8f52e362 100644 --- a/src/components/provider-logo.tsx +++ b/src/components/provider-logo.tsx @@ -80,6 +80,8 @@ export function ProviderLogo({ // hairline shadow so they pop on both light and dark page backgrounds. const NEEDS_LIGHT_CHIP = new Set([ "aptos", + "aapl", + "pltr", "leorpc", "blinklabs", "mobula", diff --git a/src/data/provider-registry.ts b/src/data/provider-registry.ts index a10cc7c8..e63a1ed6 100644 --- a/src/data/provider-registry.ts +++ b/src/data/provider-registry.ts @@ -225,6 +225,61 @@ export const PROVIDER_REGISTRY: Record = { description: "LeoRPC is a community Solana RPC operation exposing a publicly documented FREE tier through a query key, one of the few remaining keyless ways to read Solana mainnet.", }, + aapl: { + url: "https://www.apple.com", + description: + "Apple tokenized equity issued by Robinhood on Robinhood Chain (contract 0xaF3D76f1834A1d425780943C99Ea8A608f8a93f9), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + nvda: { + url: "https://www.nvidia.com", + description: + "Nvidia tokenized equity issued by Robinhood on Robinhood Chain (contract 0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + googl: { + url: "https://abc.xyz", + description: + "Alphabet tokenized equity issued by Robinhood on Robinhood Chain (contract 0x2e0847E8910a9732eB3fb1bb4b70a580ADAD4FE3), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + tsla: { + url: "https://www.tesla.com", + description: + "Tesla tokenized equity issued by Robinhood on Robinhood Chain (contract 0x322F0929c4625eD5bAd873c95208D54E1c003b2d), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + pltr: { + url: "https://www.palantir.com", + description: + "Palantir tokenized equity issued by Robinhood on Robinhood Chain (contract 0x894E1EC2D74FFE5AEF8Dc8A9e84686acCB964F2A), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + meta: { + url: "https://www.meta.com", + description: + "Meta Platforms tokenized equity issued by Robinhood on Robinhood Chain (contract 0xc0D6457C16Cc70d6790Dd43521C899C87ce02f35), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + amd: { + url: "https://www.amd.com", + description: + "AMD tokenized equity issued by Robinhood on Robinhood Chain (contract 0x86923f96303D656E4aa86D9d42D1e57ad2023fdC), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + msft: { + url: "https://www.microsoft.com", + description: + "Microsoft tokenized equity issued by Robinhood on Robinhood Chain (contract 0xe93237C50D904957Cf27E7B1133b510C669c2e74), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + amzn: { + url: "https://www.amazon.com", + description: + "Amazon tokenized equity issued by Robinhood on Robinhood Chain (contract 0x12f190a9F9d7D37a250758b26824B97CE941bF54), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + spy: { + url: "https://www.ssga.com", + description: + "SPDR S&P 500 ETF (State Street) tokenized equity issued by Robinhood on Robinhood Chain (contract 0x117cc2133c37B721F49dE2A7a74833232B3B4C0C), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, + mu: { + url: "https://www.micron.com", + description: + "Micron Technology tokenized equity issued by Robinhood on Robinhood Chain (contract 0xfF080c8ce2E5feadaCa0Da81314Ae59D232d4afD), trading against USDG on Uniswap v4 around the clock. OpenChainBench measures its live price deviation from the real market on the tokenized stock peg benchmark.", + }, bloxroute: { url: "https://bloxroute.com", description: diff --git a/src/lib/categories.ts b/src/lib/categories.ts index d432767f..091bde4e 100644 --- a/src/lib/categories.ts +++ b/src/lib/categories.ts @@ -30,7 +30,8 @@ export type Category = | "Wallets" | "RPCs" | "NFT APIs" - | "Explorers"; + | "Explorers" + | "RWA"; export type CategoryEntry = { /** URL slug. Lowercase, kebab-case, ASCII. */ @@ -93,6 +94,13 @@ export const CATEGORIES: readonly CategoryEntry[] = [ description: "Live measurements for block explorer APIs. Compare how many chains each family actually serves with a working indexer, probe-verified daily against the vendors' own registries.", }, + { + slug: "rwa", + label: "RWA", + heading: "RWA benchmarks", + description: + "Live measurements for tokenized real world assets. How closely tokenized stocks and treasuries track their underlying market price, measured onchain around the clock, including nights and weekends when the real markets are closed.", + }, { slug: "nft-apis", label: "NFT APIs", diff --git a/src/lib/category-colors.ts b/src/lib/category-colors.ts index e06035d5..6cf03306 100644 --- a/src/lib/category-colors.ts +++ b/src/lib/category-colors.ts @@ -18,4 +18,6 @@ export const CATEGORY_COLOR: Record = { // in use. Picks up OpenSea/Alchemy/Moralis brand palettes which all // cluster around blues/purples. "NFT APIs": "#6366f1", + // RWA: teal, the tradfi-meets-onchain lane gets its own hue. + RWA: "#0d9488", }; diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts index 0b15d77e..757247cc 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -165,6 +165,17 @@ const RAW: Record = { astralane: "/logos/astralane.svg", solanavibestation: "/logos/solanavibestation.png", leorpc: "/logos/leorpc.png", + aapl: "/logos/aapl.svg", + nvda: "/logos/nvda.svg", + googl: "/logos/googl.svg", + tsla: "/logos/tsla.svg", + pltr: "/logos/pltr.svg", + meta: "/logos/meta.svg", + amd: "/logos/amd.svg", + msft: "/logos/msft.svg", + amzn: "/logos/amzn.png", + spy: "/logos/spy.svg", + mu: "/logos/mu.png", // ─── Buyback audit (bench 018) ─── sky: "/logos/sky.svg", diff --git a/src/lib/spec-schema.ts b/src/lib/spec-schema.ts index 47fc2eeb..75535ac0 100644 --- a/src/lib/spec-schema.ts +++ b/src/lib/spec-schema.ts @@ -158,6 +158,7 @@ export const Category = z.enum([ "RPCs", "NFT APIs", "Explorers", + "RWA", ]); // Em-dash (—) and en-dash (–) are the classic "AI tells" that hurt our brand diff --git a/src/types/benchmark.ts b/src/types/benchmark.ts index c213c3ef..47d29a00 100644 --- a/src/types/benchmark.ts +++ b/src/types/benchmark.ts @@ -215,7 +215,7 @@ export type Benchmark = { kind?: { value: string; label: string }[]; venue?: { value: string; label: string }[]; }; - category: "Aggregators" | "Bridges" | "Blockchains" | "Trading" | "Wallets" | "RPCs" | "NFT APIs" | "Explorers"; + category: "Aggregators" | "Bridges" | "Blockchains" | "Trading" | "Wallets" | "RPCs" | "NFT APIs" | "Explorers" | "RWA"; results: ProviderResult[]; /** Per-chain leader, computed only on the unfiltered ("All chains") view * when the spec declares `dimensions.chain`. Key = chain slug from the