From e110c05ae6f3b4a0e0ee24fa8cb8668d7110f684 Mon Sep 17 00:00:00 2001 From: Flotapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Fri, 16 Oct 2026 18:22:47 +0200 Subject: [PATCH] rpc-cost opens on one slider and an archive checkbox Four rows of selectors (cohort, plan band, volume, workload) over a three-volume ledger made the reader assemble the answer. The page now opens on the calculator: slide to a monthly volume, tick archive if the calls read old state, and it names the cheapest plan that serves it, metered or flat rate, then ranks the rest. The archive curve is a new curve-only profile (the dapp mix with every call billed as archive): no gauge, no tab. The curve file now carries the catalogue's plan names, and the catalogue's as_of moves to the Dwellir edit. --- harnesses/rpc-cost/cmd/script/curve.go | 14 +- harnesses/rpc-cost/cmd/script/curve_test.go | 2 +- harnesses/rpc-cost/cmd/script/profiles.go | 23 + harnesses/rpc-cost/pricing/catalogue.yml | 2 +- src/app/benchmarks/[slug]/page.tsx | 16 +- src/components/rpc-cost-slider.tsx | 348 ++- src/data/rpc-cost-curves.json | 2212 ++++++++++++++++++- src/lib/rpc-cost-curve.ts | 5 + 8 files changed, 2333 insertions(+), 289 deletions(-) diff --git a/harnesses/rpc-cost/cmd/script/curve.go b/harnesses/rpc-cost/cmd/script/curve.go index 976edf0b2..69cf64e24 100644 --- a/harnesses/rpc-cost/cmd/script/curve.go +++ b/harnesses/rpc-cost/cmd/script/curve.go @@ -60,6 +60,9 @@ type CurveProvider struct { Cohort string `json:"cohort"` Unit string `json:"unit"` Points []CurvePoint `json:"points"` + // PlanNames maps the plan ids the points carry to the catalogue's own + // names: "bc-t3-large-us-east-1" is a key, not something to show. + PlanNames map[string]string `json:"planNames,omitempty"` } type CurveProfile struct { @@ -240,7 +243,7 @@ func BuildCurves(c *Catalogue) CurveFile { } grid := logGrid(36) - for _, pr := range Profiles { + for _, pr := range append(append([]Profile{}, Profiles...), CurveOnlyProfiles...) { cp := CurveProfile{ID: pr.ID, Label: pr.Label, Chain: pr.Chain} for _, p := range c.Providers { // The slider has to carry exactly the cohort the gauges carry, @@ -295,8 +298,17 @@ func BuildCurves(c *Catalogue) CurveFile { if len(pts) == 0 { continue } + names := map[string]string{} + for _, pt := range pts { + for _, pl := range p.Plans { + if pt.Plan != "" && pl.ID == pt.Plan && pl.Name != "" { + names[pl.ID] = pl.Name + } + } + } cp.Providers = append(cp.Providers, CurveProvider{ Slug: p.Slug, Name: p.Name, Cohort: p.Cohort, Unit: p.Unit, Points: pts, + PlanNames: names, }) } sort.Slice(cp.Providers, func(i, j int) bool { return cp.Providers[i].Slug < cp.Providers[j].Slug }) diff --git a/harnesses/rpc-cost/cmd/script/curve_test.go b/harnesses/rpc-cost/cmd/script/curve_test.go index 5dd87a9fa..1d7079358 100644 --- a/harnesses/rpc-cost/cmd/script/curve_test.go +++ b/harnesses/rpc-cost/cmd/script/curve_test.go @@ -53,7 +53,7 @@ func TestCurveAgreesWithTheModelAtPublishedVolumes(t *testing.T) { checked := 0 for _, cp := range f.Profiles { var pr Profile - for _, cand := range Profiles { + for _, cand := range append(append([]Profile{}, Profiles...), CurveOnlyProfiles...) { if cand.ID == cp.ID { pr = cand } diff --git a/harnesses/rpc-cost/cmd/script/profiles.go b/harnesses/rpc-cost/cmd/script/profiles.go index 6637a67bf..7ea67d1c5 100644 --- a/harnesses/rpc-cost/cmd/script/profiles.go +++ b/harnesses/rpc-cost/cmd/script/profiles.go @@ -97,6 +97,29 @@ var Profiles = []Profile{ }, } +// CurveOnlyProfiles are priced into the slider's curve file and nowhere +// else: no gauge, no tab. The page's archive checkbox needs the dapp mix +// with every call reading state old enough to bill as archive, which is a +// question for one reader's bill, not a fourth ranked workload. +var CurveOnlyProfiles = []Profile{ + { + ID: "dapp-archive", + Label: "Dapp frontend, archive", + Chain: "ethereum", + Archive: true, + Mix: profileByID("dapp").Mix, + }, +} + +func profileByID(id string) Profile { + for _, pr := range Profiles { + if pr.ID == id { + return pr + } + } + panic("no profile " + id) +} + // MixOrder returns this profile's methods in a fixed order. // // Summing a weighted mix by ranging over the map adds the same terms in a diff --git a/harnesses/rpc-cost/pricing/catalogue.yml b/harnesses/rpc-cost/pricing/catalogue.yml index c0e087c08..270271b77 100644 --- a/harnesses/rpc-cost/pricing/catalogue.yml +++ b/harnesses/rpc-cost/pricing/catalogue.yml @@ -4,7 +4,7 @@ # Every number here traces to a wave-2-verified value, or to a wave-1 value wave 2 did not contradict. # Where a figure exists only as an assumption it is null and the assumption is in `note`. version: 1 -as_of: "2026-09-29" +as_of: "2026-10-16" fx: eur_usd: 1.1355 diff --git a/src/app/benchmarks/[slug]/page.tsx b/src/app/benchmarks/[slug]/page.tsx index 8e540ff01..c0c71e10a 100644 --- a/src/app/benchmarks/[slug]/page.tsx +++ b/src/app/benchmarks/[slug]/page.tsx @@ -901,6 +901,14 @@ export default async function BenchmarkPage({ the page to a pasteable quote or a JSON endpoint. */} {!isDraft && } + {/* Bench 282 opens on its calculator instead of the generic body: one + volume slider and an archive checkbox answer "which plan do I buy", + where four rows of selectors (cohort, plan band, volume, workload) + over a three-volume ledger made the reader assemble the answer. + The slider reads a curve the same harness emits through the same + model as the gauges, so the two cannot drift apart. */} + {!isDraft && benchmark.slug === "rpc-cost" && } + {/* Methodology - expanded by default so readers can verify the measurement before reading the numbers. Collapsible for repeat visitors who already know the harness. */} @@ -931,7 +939,7 @@ export default async function BenchmarkPage({ {/* Body: chain tabs + summary + chart + ledger + share. Receives every chain variant pre-fetched server-side. flipping a tab swaps which variant is rendered, instantly, no network round-trip. */} - {!isDraft && ( + {!isDraft && benchmark.slug !== "rpc-cost" && ( } {benchmark.slug === "terminal-execution-quality" && } - {/* Bench 282: the ledger prices 10M, 100M and 1B requests a month, - because a metric needs a fixed label, and most readers are - somewhere else. This prices any volume off a committed curve the - same harness emits through the same model, so the panel and the - ledger cannot drift apart. */} - {!isDraft && benchmark.slug === "rpc-cost" && } {/* SEO-friendly per-chain H2 block. Renders server-side so the long-tail "Ethereum finality time", "Solana finality time" diff --git a/src/components/rpc-cost-slider.tsx b/src/components/rpc-cost-slider.tsx index 956eaa0c3..d5e101337 100644 --- a/src/components/rpc-cost-slider.tsx +++ b/src/components/rpc-cost-slider.tsx @@ -6,7 +6,6 @@ import { hasLogo } from "@/lib/logo-manifest"; import { rpcCostCurves, rpcCostRankAt, - type RpcCostRankedRow, } from "@/lib/rpc-cost-curve"; /** @@ -37,200 +36,195 @@ const PUBLISHED = [ { requests: 1000e6, label: "1B" }, ]; -const COHORTS = [ - { value: "usage", label: "Billed per request" }, - { value: "dedicated", label: "Dedicated capacity" }, -]; - const STEPS = 1000; /** - * The panel opens where the board stands: the bench's headline workload is - * the dapp mix (`kind=all` on the page) at 10M requests a month (`bucket=all`), - * so the slider's first reading is one a reader can check against the ledger - * directly above it rather than one they have to reconcile. + * Two curves, one checkbox. Both are the dapp mix (contract reads, balances, + * receipts, a 5% tail of getLogs and writes); the archive one prices every + * call as reading state old enough to bill as archive, which is where + * Chainstack's 2 RU block-age rule bites and Dwellir's flat 1 credit does + * not, and where plans without archive drop out. The other workloads stay on + * the ledger's methodology; a reader asking "what do I pay" wants one answer, + * and four rows of selectors in front of it was the complaint. */ -const DEFAULT_PROFILE = "dapp"; +const PROFILE = "dapp"; +const PROFILE_ARCHIVE = "dapp-archive"; const DEFAULT_REQUESTS = 10e6; +const SHOWN = 10; export function RpcCostSlider() { const file = rpcCostCurves(); - // The reader returns null when the artifact's schema is one this build does - // not know. Rendering nothing is the honest outcome: `pnpm validate` fails - // on that mismatch, and a slider quoting a shape it misread is worse than - // no slider. - const [profileId, setProfileId] = useState(() => { - const ids = file?.profiles.map((p) => p.id) ?? []; - return ids.includes(DEFAULT_PROFILE) - ? DEFAULT_PROFILE - : (ids[0] ?? ""); - }); - const [cohort, setCohort] = useState("usage"); + const [archive, setArchive] = useState(false); // The volume itself is the state, not the slider's position. Going through // the step would round-trip through a log scale and land 0.5% off: the // "100M" tick would read 99.5M and stop being one of the three volumes the - // table publishes, which is the whole point of marking it. + // ledger publishes. const [requests, setRequests] = useState(DEFAULT_REQUESTS); + const [showAll, setShowAll] = useState(false); + // The reader returns null when the artifact's schema is one this build does + // not know. Rendering nothing is the honest outcome: `pnpm validate` fails + // on that mismatch, and a slider quoting a shape it misread is worse than + // no slider. if (!file || file.profiles.length === 0) return null; const { floor, ceiling } = file; - const { priced, unpriced } = rpcCostRankAt(profileId, requests); - - const inCohort = (r: RpcCostRankedRow) => r.cohort === cohort; - const shown = priced.filter(inCohort); - const missing = unpriced.filter(inCohort); - const leader = shown[0]; + // Both cohorts in one list: past a few hundred million requests a flat-rate + // node beats every meter, and "what is the best plan at my volume" has to + // be allowed to say so. + const { priced, unpriced } = rpcCostRankAt( + archive ? PROFILE_ARCHIVE : PROFILE, + requests, + ); + const leader = priced[0]; + const rest = priced.slice(1); + const visible = showAll ? rest : rest.slice(0, SHOWN - 1); const onPublished = PUBLISHED.find((p) => p.requests === requests); return ( -
-
-
-

Price at your own volume

-

- The leaderboard prices three volumes, because a metric needs a - fixed label. Move the slider to any volume between{" "} - {fmtRequests(floor)} and {fmtRequests(ceiling)} requests a month. - Same pricing model, read between the points it publishes. -

-
-
- {COHORTS.map((c) => ( - setCohort(c.value)} - /> - ))} -
+
+

Cheapest RPC plan for your volume

+

+ Slide to your monthly request count on Ethereum. Every provider's + published plans are priced on a typical dapp mix, and the cheapest plan + that serves it wins, metered or flat rate. +

+ +
+

+ {fmtRequests(requests)} + + requests / month + +

+
-
-

Workload

-
- {file.profiles.map((p) => ( - setProfileId(p.id)} - /> - ))} -
+ + setRequests( + roundRequests(requestsAt(Number(e.target.value), floor, ceiling)), + ) + } + aria-label="Monthly request volume" + aria-valuetext={`${fmtRequests(requests)} requests per month`} + className="mt-3 w-full accent-ink" + /> + + {/* The three volumes the ledger publishes, as buttons: standing exactly + on one has to be possible for the two surfaces to be checkable + against each other. */} +
+ {fmtRequests(floor)} + {PUBLISHED.map((p) => ( + + ))} + {fmtRequests(ceiling)}
-
-
-

- {fmtRequests(requests)} - - requests / month +

+ {archive + ? "Archive: every call reads state older than the last ~128 blocks. Plans without archive drop out, and providers that bill archive higher (Chainstack 2 RU instead of 1) are priced at that rate." + : "No archive: calls read recent state only."} +

+ + {leader ? ( +
+

Best plan

+
+ + {hasLogo(leader.slug) && ( + + )} + + + {brandOf(leader.name)} + + + {leader.planName || planLabel(leader.plan)} + {leader.cohort === "dedicated" ? " · flat rate" : ""} + + -

- {leader ? ( -

- Cheapest:{" "} - {leader.name} at{" "} - + + {fmtUSD(leader.usd)} + /mo - /mo -

- ) : ( -

- No provider in this cohort publishes a price at this volume. -

- )} -
- - - setRequests( - roundRequests(requestsAt(Number(e.target.value), floor, ceiling)), - ) - } - aria-label="Monthly request volume" - aria-valuetext={`${fmtRequests(requests)} requests per month`} - className="mt-3 w-full accent-ink" - /> - - {/* The three volumes the gauges publish, as buttons: they are where - this panel and the ledger above can be checked against each - other, so standing exactly on one has to be possible. */} -
- {fmtRequests(floor)} - {PUBLISHED.map((p) => ( - - ))} - {fmtRequests(ceiling)} + + {fmtUSD(perMillion(leader.usd, requests))} per 1M requests + + +
- -

- {onPublished - ? `${onPublished.label} is one of the three volumes the leaderboard above publishes, so the two should agree here.` - : "Between published volumes. Exact at every plan boundary, linear in between, which is the real shape of a metered bill."} + ) : ( +

+ No provider publishes a plan for this volume.

-
+ )} - {shown.length > 0 && ( -
+ {visible.length > 0 && ( +
- - - - - - - - - {shown.map((row, i) => ( + {visible.map((row, i) => ( - - - ))}
- Provider - - Monthly bill - - Per 1M - - Plan -
- {String(i + 1).padStart(2, "0")} + {String(i + 2).padStart(2, "0")} {hasLogo(row.slug) && ( )} - {row.name} + {brandOf(row.name)} - {fmtUSD(row.usd)} + + {row.planName || planLabel(row.plan)} + {row.cohort === "dedicated" ? " · flat rate" : ""} - {fmtUSD(perMillion(row.usd, requests))} + + {fmtUSD(row.usd)} + /mo {row.plan || "-"}
+ {rest.length > SHOWN - 1 && ( + + )}
)} @@ -238,14 +232,14 @@ export function RpcCostSlider() { plan" is an answer a reader moving the slider wants; a missing price sorted in among the real ones as $0 is the bug this bench shipped once already. */} - {missing.length > 0 && ( + {unpriced.length > 0 && (
- {missing.length} provider{missing.length === 1 ? "" : "s"} quote + {unpriced.length} provider{unpriced.length === 1 ? "" : "s"} quote nothing at {fmtRequests(requests)}
    - {missing.map((row) => ( + {unpriced.map((row) => (
  • {row.name} {row.reason} @@ -256,39 +250,31 @@ export function RpcCostSlider() { )}

    - From the pricing catalogue as of {file.catalogueAsOf}, priced by the - same harness that publishes the leaderboard. A blank is a provider with - no plan for this volume, never a free one. + {onPublished + ? `${onPublished.label} is one of the three volumes the findings below quote, so the two agree here. ` + : "Exact at every plan boundary, linear in between, which is the real shape of a metered bill. "} + Pricing catalogue as of {file.catalogueAsOf}. A free plan wins when it + covers the volume; a blank is a provider with no plan for it, never a + free one.

    -
+
); } -function Chip({ - active, - label, - onClick, -}: { - active: boolean; - label: string; - onClick: () => void; -}) { - const base = - "px-3 py-1.5 text-xs font-medium uppercase tracking-[0.14em] rounded-md transition-colors"; - return ( - - ); +/** + * The flat-rate rows carry their offer in the name ("GetBlock — Dedicated & + * Limitless nodes"); the plan column already says what was bought, so the + * row leads with the brand. + */ +export function brandOf(name: string): string { + return name.split(/ — |, /)[0] ?? name; +} + +/** Plan ids are kebab slugs from the catalogue: "dedicated-eth-archive". */ +export function planLabel(plan: string): string { + if (!plan) return "-"; + const s = plan.replace(/-/g, " "); + return s.charAt(0).toUpperCase() + s.slice(1); } /** @@ -332,7 +318,7 @@ export function fmtUSD(usd: number | null): string { if (usd === 0) return "$0"; if (usd < 0.01) return "<$0.01"; if (usd < 100) - return `$${usd.toFixed(2).replace(/\.00$/, "").replace(/(\.\d)0$/, "$1")}`; + return `$${usd.toFixed(2).replace(/\.00$/, "")}`; return `$${Math.round(usd).toLocaleString("en-US")}`; } diff --git a/src/data/rpc-cost-curves.json b/src/data/rpc-cost-curves.json index c3fb1d517..280fbc491 100644 --- a/src/data/rpc-cost-curves.json +++ b/src/data/rpc-cost-curves.json @@ -1,7 +1,7 @@ { "schema": 1, "catalogueVersion": 1, - "catalogueAsOf": "2026-09-29", + "catalogueAsOf": "2026-10-16", "floor": 100000, "ceiling": 5000000000, "profiles": [ @@ -56,7 +56,10 @@ "usd": null, "why": "published throughput is 30000 cu_per_s, workload needs 38581 sustained" } - ] + ], + "planNames": { + "payg": "Pay As You Go" + } }, { "slug": "allnodes", @@ -74,7 +77,10 @@ "usd": 320, "plan": "eth-advanced" } - ] + ], + "planNames": { + "eth-advanced": "Ethereum full node, Advanced" + } }, { "slug": "ankr", @@ -117,7 +123,11 @@ "usd": 100000, "plan": "payg" } - ] + ], + "planNames": { + "deal": "Premium (Deal)", + "payg": "Premium (Pay-as-you-go)" + } }, { "slug": "aws-amb", @@ -135,7 +145,10 @@ "usd": 15097.82, "plan": "bc-t3-large-us-east-1" } - ] + ], + "planNames": { + "bc-t3-large-us-east-1": "bc.t3.large node, us-east-1" + } }, { "slug": "blockdaemon", @@ -201,7 +214,12 @@ "usd": 14833, "plan": "premium" } - ] + ], + "planNames": { + "elementary": "Elementary", + "payg": "Pay As You Go", + "premium": "Premium" + } }, { "slug": "chainstack", @@ -269,7 +287,13 @@ "usd": 23990, "plan": "enterprise" } - ] + ], + "planNames": { + "business": "Business", + "enterprise": "Enterprise (from)", + "growth": "Growth", + "pro": "Pro" + } }, { "slug": "chainstack-dedicated", @@ -317,7 +341,13 @@ "usd": 1841.5, "plan": "dedicated-eth-full-geth" } - ] + ], + "planNames": { + "dedicated-eth-full-geth": "Dedicated Node, Ethereum full, geth 2-C16-R64-S 2,501 GB (+ Pro $199)", + "unlimited-100": "Unlimited Node add-on, 100 RPS (+ Growth $49)", + "unlimited-25": "Unlimited Node add-on, 25 RPS (+ Growth $49)", + "unlimited-250": "Unlimited Node add-on, 250 RPS (+ Growth $49)" + } }, { "slug": "coinbase-cdp", @@ -353,7 +383,10 @@ "usd": 30000, "plan": "growth" } - ] + ], + "planNames": { + "growth": "Growth (pay-as-you-go)" + } }, { "slug": "dwellir", @@ -406,7 +439,12 @@ "usd": 9999, "plan": "scale" } - ] + ], + "planNames": { + "developer": "Developer", + "growth": "Growth", + "scale": "Scale" + } }, { "slug": "dwellir-unlimited", @@ -474,7 +512,15 @@ "usd": 12600, "plan": "cluster-eth-archive" } - ] + ], + "planNames": { + "cluster-eth-archive": "Dedicated Ethereum archive cluster (list price)", + "unlimited-100": "Unlimited Node, 100 RPS", + "unlimited-1000": "Unlimited Node, 1,000 RPS", + "unlimited-25": "Unlimited Node, 25 RPS", + "unlimited-250": "Unlimited Node, 250 RPS", + "unlimited-500": "Unlimited Node, 500 RPS" + } }, { "slug": "getblock", @@ -597,7 +643,15 @@ "usd": null, "why": "published throughput is 800 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "advanced": "Advanced", + "growth": "Growth", + "premium": "Premium", + "pro": "Pro", + "scale": "Scale", + "starter": "Starter" + } }, { "slug": "getblock-dedicated", @@ -625,7 +679,11 @@ "usd": 1100, "plan": "dedicated-eth-full" } - ] + ], + "planNames": { + "dedicated-eth-full": "Dedicated Ethereum full node (geth/nethermind/reth/reth+prysm/teku+geth)", + "limitless-evm-full-25": "Limitless Node, EVM full, 25 RPS" + } }, { "slug": "google-bne", @@ -643,7 +701,10 @@ "usd": 503.7, "plan": "eth-full" } - ] + ], + "planNames": { + "eth-full": "Ethereum full node (Geth)" + } }, { "slug": "helius", @@ -812,7 +873,11 @@ "usd": null, "why": "published throughput is 40000 credits_per_s, workload needs 154321 sustained" } - ] + ], + "planNames": { + "developer": "Developer", + "team": "Team" + } }, { "slug": "moralis", @@ -930,7 +995,12 @@ "usd": null, "why": "published throughput is 200 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "business": "Business", + "pro": "Pro", + "starter": "Starter" + } }, { "slug": "nownodes", @@ -1008,7 +1078,14 @@ "usd": 28387.5, "plan": "enterprise" } - ] + ], + "planNames": { + "business": "Business", + "business-plus": "Business Plus", + "enterprise": "Enterprise", + "pro": "Pro", + "pro-plus": "Pro Plus" + } }, { "slug": "onfinality", @@ -1096,7 +1173,11 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "growth": "Growth" + } }, { "slug": "quicknode", @@ -1259,7 +1340,16 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "build": "Build", + "business": "Business", + "business-plus-t1": "Business+ Tier 1", + "business-plus-t2": "Business+ Tier 2", + "business-plus-t3": "Business+ Tier 3", + "scale": "Scale" + } }, { "slug": "quicknode-flat-rate", @@ -1352,7 +1442,12 @@ "usd": null, "why": "published throughput is 75 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "evm-150": "Flat Rate RPS, EVM 150 RPS (+ Build $49)", + "evm-250": "Flat Rate RPS, EVM 250 RPS (+ Build $49)", + "evm-75": "Flat Rate RPS, EVM 75 RPS (+ Build $49)" + } }, { "slug": "shyft", @@ -1641,7 +1736,21 @@ "usd": null, "why": "published throughput is 200 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "t10m": "Starter 10M", + "t150m": "Scale 150M", + "t15m": "Pro 15M", + "t200m": "Scale 200M", + "t20m": "Pro 20M", + "t250m": "Scale 250M", + "t300m": "Scale 300M", + "t350m": "Scale 350M", + "t400m": "Scale 400M", + "t40m": "Pro 40M", + "t4m": "Starter 4M", + "t80m": "Pro 80M" + } }, { "slug": "thirdweb", @@ -1694,7 +1803,12 @@ "usd": 30191, "plan": "pro" } - ] + ], + "planNames": { + "growth": "Growth", + "pro": "Pro (from)", + "scale": "Scale" + } }, { "slug": "triton", @@ -1750,7 +1864,10 @@ "usd": 70057.5, "plan": "scale" } - ] + ], + "planNames": { + "scale": "Scale (banded pay-as-you-go)" + } }, { "slug": "zeeve", @@ -1788,7 +1905,12 @@ "usd": 599, "plan": "eth-enterprise" } - ] + ], + "planNames": { + "eth-advance": "Ethereum Advance", + "eth-basic": "Ethereum Basic (dedicated RPC)", + "eth-enterprise": "Ethereum Enterprise" + } } ] }, @@ -1853,7 +1975,10 @@ "usd": null, "why": "published throughput is 30000 cu_per_s, workload needs 47068 sustained" } - ] + ], + "planNames": { + "payg": "Pay As You Go" + } }, { "slug": "allnodes", @@ -1871,7 +1996,10 @@ "usd": 320, "plan": "eth-advanced" } - ] + ], + "planNames": { + "eth-advanced": "Ethereum full node, Advanced" + } }, { "slug": "ankr", @@ -1914,7 +2042,11 @@ "usd": 100000, "plan": "payg" } - ] + ], + "planNames": { + "deal": "Premium (Deal)", + "payg": "Premium (Pay-as-you-go)" + } }, { "slug": "aws-amb", @@ -1932,7 +2064,10 @@ "usd": 15097.82, "plan": "bc-t3-large-us-east-1" } - ] + ], + "planNames": { + "bc-t3-large-us-east-1": "bc.t3.large node, us-east-1" + } }, { "slug": "blockdaemon", @@ -1998,7 +2133,12 @@ "usd": 27333, "plan": "premium" } - ] + ], + "planNames": { + "elementary": "Elementary", + "payg": "Pay As You Go", + "premium": "Premium" + } }, { "slug": "chainstack", @@ -2066,7 +2206,13 @@ "usd": 23990, "plan": "enterprise" } - ] + ], + "planNames": { + "business": "Business", + "enterprise": "Enterprise (from)", + "growth": "Growth", + "pro": "Pro" + } }, { "slug": "chainstack-dedicated", @@ -2114,7 +2260,13 @@ "usd": 1841.5, "plan": "dedicated-eth-full-geth" } - ] + ], + "planNames": { + "dedicated-eth-full-geth": "Dedicated Node, Ethereum full, geth 2-C16-R64-S 2,501 GB (+ Pro $199)", + "unlimited-100": "Unlimited Node add-on, 100 RPS (+ Growth $49)", + "unlimited-25": "Unlimited Node add-on, 25 RPS (+ Growth $49)", + "unlimited-250": "Unlimited Node add-on, 250 RPS (+ Growth $49)" + } }, { "slug": "coinbase-cdp", @@ -2150,7 +2302,10 @@ "usd": 30000, "plan": "growth" } - ] + ], + "planNames": { + "growth": "Growth (pay-as-you-go)" + } }, { "slug": "dwellir", @@ -2203,7 +2358,12 @@ "usd": 9999, "plan": "scale" } - ] + ], + "planNames": { + "developer": "Developer", + "growth": "Growth", + "scale": "Scale" + } }, { "slug": "dwellir-unlimited", @@ -2271,7 +2431,15 @@ "usd": 12600, "plan": "cluster-eth-archive" } - ] + ], + "planNames": { + "cluster-eth-archive": "Dedicated Ethereum archive cluster (list price)", + "unlimited-100": "Unlimited Node, 100 RPS", + "unlimited-1000": "Unlimited Node, 1,000 RPS", + "unlimited-25": "Unlimited Node, 25 RPS", + "unlimited-250": "Unlimited Node, 250 RPS", + "unlimited-500": "Unlimited Node, 500 RPS" + } }, { "slug": "getblock", @@ -2394,7 +2562,15 @@ "usd": null, "why": "published throughput is 800 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "advanced": "Advanced", + "growth": "Growth", + "premium": "Premium", + "pro": "Pro", + "scale": "Scale", + "starter": "Starter" + } }, { "slug": "getblock-dedicated", @@ -2422,7 +2598,11 @@ "usd": 1100, "plan": "dedicated-eth-full" } - ] + ], + "planNames": { + "dedicated-eth-full": "Dedicated Ethereum full node (geth/nethermind/reth/reth+prysm/teku+geth)", + "limitless-evm-full-25": "Limitless Node, EVM full, 25 RPS" + } }, { "slug": "google-bne", @@ -2440,7 +2620,10 @@ "usd": 503.7, "plan": "eth-full" } - ] + ], + "planNames": { + "eth-full": "Ethereum full node (Geth)" + } }, { "slug": "helius", @@ -2604,7 +2787,11 @@ "usd": null, "why": "published throughput is 40000 credits_per_s, workload needs 192419 sustained" } - ] + ], + "planNames": { + "developer": "Developer", + "team": "Team" + } }, { "slug": "moralis", @@ -2722,7 +2909,12 @@ "usd": null, "why": "published throughput is 200 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "business": "Business", + "pro": "Pro", + "starter": "Starter" + } }, { "slug": "nownodes", @@ -2800,7 +2992,14 @@ "usd": 28387.5, "plan": "enterprise" } - ] + ], + "planNames": { + "business": "Business", + "business-plus": "Business Plus", + "enterprise": "Enterprise", + "pro": "Pro", + "pro-plus": "Pro Plus" + } }, { "slug": "onfinality", @@ -2888,7 +3087,11 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "growth": "Growth" + } }, { "slug": "quicknode", @@ -3051,7 +3254,16 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "build": "Build", + "business": "Business", + "business-plus-t1": "Business+ Tier 1", + "business-plus-t2": "Business+ Tier 2", + "business-plus-t3": "Business+ Tier 3", + "scale": "Scale" + } }, { "slug": "quicknode-flat-rate", @@ -3144,7 +3356,12 @@ "usd": null, "why": "published throughput is 75 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "evm-150": "Flat Rate RPS, EVM 150 RPS (+ Build $49)", + "evm-250": "Flat Rate RPS, EVM 250 RPS (+ Build $49)", + "evm-75": "Flat Rate RPS, EVM 75 RPS (+ Build $49)" + } }, { "slug": "shyft", @@ -3433,7 +3650,21 @@ "usd": null, "why": "published throughput is 200 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "t10m": "Starter 10M", + "t150m": "Scale 150M", + "t15m": "Pro 15M", + "t200m": "Scale 200M", + "t20m": "Pro 20M", + "t250m": "Scale 250M", + "t300m": "Scale 300M", + "t350m": "Scale 350M", + "t400m": "Scale 400M", + "t40m": "Pro 40M", + "t4m": "Starter 4M", + "t80m": "Pro 80M" + } }, { "slug": "thirdweb", @@ -3486,7 +3717,12 @@ "usd": 30191, "plan": "pro" } - ] + ], + "planNames": { + "growth": "Growth", + "pro": "Pro (from)", + "scale": "Scale" + } }, { "slug": "triton", @@ -3542,7 +3778,10 @@ "usd": 71807.5, "plan": "scale" } - ] + ], + "planNames": { + "scale": "Scale (banded pay-as-you-go)" + } }, { "slug": "zeeve", @@ -3580,7 +3819,12 @@ "usd": 599, "plan": "eth-enterprise" } - ] + ], + "planNames": { + "eth-advance": "Ethereum Advance", + "eth-basic": "Ethereum Basic (dedicated RPC)", + "eth-enterprise": "Ethereum Enterprise" + } } ] }, @@ -3660,7 +3904,10 @@ "usd": null, "why": "published throughput is 30000 cu_per_s, workload needs 308642 sustained" } - ] + ], + "planNames": { + "payg": "Pay As You Go" + } }, { "slug": "allnodes", @@ -3721,7 +3968,11 @@ "usd": 100000, "plan": "payg" } - ] + ], + "planNames": { + "deal": "Premium (Deal)", + "payg": "Premium (Pay-as-you-go)" + } }, { "slug": "aws-amb", @@ -3805,7 +4056,12 @@ "usd": 87583, "plan": "premium" } - ] + ], + "planNames": { + "elementary": "Elementary", + "payg": "Pay As You Go", + "premium": "Premium" + } }, { "slug": "chainstack", @@ -3873,7 +4129,13 @@ "usd": 48990, "plan": "enterprise" } - ] + ], + "planNames": { + "business": "Business", + "enterprise": "Enterprise (from)", + "growth": "Growth", + "pro": "Pro" + } }, { "slug": "chainstack-dedicated", @@ -3921,7 +4183,13 @@ "usd": 2629.9, "plan": "dedicated-eth-archive-erigon" } - ] + ], + "planNames": { + "dedicated-eth-archive-erigon": "Dedicated Node, Ethereum archive, erigon 3-C32-R128-M 3,652 GB (+ Pro $199)", + "unlimited-100": "Unlimited Node add-on, 100 RPS (+ Growth $49)", + "unlimited-25": "Unlimited Node add-on, 25 RPS (+ Growth $49)", + "unlimited-250": "Unlimited Node add-on, 250 RPS (+ Growth $49)" + } }, { "slug": "coinbase-cdp", @@ -3957,7 +4225,10 @@ "usd": 30000, "plan": "growth" } - ] + ], + "planNames": { + "growth": "Growth (pay-as-you-go)" + } }, { "slug": "dwellir", @@ -4010,7 +4281,12 @@ "usd": 9999, "plan": "scale" } - ] + ], + "planNames": { + "developer": "Developer", + "growth": "Growth", + "scale": "Scale" + } }, { "slug": "dwellir-unlimited", @@ -4078,7 +4354,15 @@ "usd": 12600, "plan": "cluster-eth-archive" } - ] + ], + "planNames": { + "cluster-eth-archive": "Dedicated Ethereum archive cluster (list price)", + "unlimited-100": "Unlimited Node, 100 RPS", + "unlimited-1000": "Unlimited Node, 1,000 RPS", + "unlimited-25": "Unlimited Node, 25 RPS", + "unlimited-250": "Unlimited Node, 250 RPS", + "unlimited-500": "Unlimited Node, 500 RPS" + } }, { "slug": "getblock", @@ -4201,7 +4485,15 @@ "usd": null, "why": "published throughput is 800 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "advanced": "Advanced", + "growth": "Growth", + "premium": "Premium", + "pro": "Pro", + "scale": "Scale", + "starter": "Starter" + } }, { "slug": "getblock-dedicated", @@ -4229,7 +4521,11 @@ "usd": 1300, "plan": "dedicated-eth-archive" } - ] + ], + "planNames": { + "dedicated-eth-archive": "Dedicated Ethereum archive node (erigon / reth)", + "limitless-evm-archive-15": "Limitless Node, EVM archive, 15 RPS" + } }, { "slug": "google-bne", @@ -4247,7 +4543,10 @@ "usd": 2000.2, "plan": "eth-archive" } - ] + ], + "planNames": { + "eth-archive": "Ethereum archive node (Erigon)" + } }, { "slug": "helius", @@ -4451,7 +4750,11 @@ "usd": null, "why": "published throughput is 40000 credits_per_s, workload needs 766783 sustained" } - ] + ], + "planNames": { + "developer": "Developer", + "team": "Team" + } }, { "slug": "moralis", @@ -4569,7 +4872,12 @@ "usd": null, "why": "published throughput is 200 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "business": "Business", + "pro": "Pro", + "starter": "Starter" + } }, { "slug": "nownodes", @@ -4675,7 +4983,11 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "growth": "Growth" + } }, { "slug": "quicknode", @@ -4838,7 +5150,16 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "build": "Build", + "business": "Business", + "business-plus-t1": "Business+ Tier 1", + "business-plus-t2": "Business+ Tier 2", + "business-plus-t3": "Business+ Tier 3", + "scale": "Scale" + } }, { "slug": "quicknode-flat-rate", @@ -4931,7 +5252,12 @@ "usd": null, "why": "published throughput is 75 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "evm-150": "Flat Rate RPS, EVM 150 RPS (+ Build $49)", + "evm-250": "Flat Rate RPS, EVM 250 RPS (+ Build $49)", + "evm-75": "Flat Rate RPS, EVM 75 RPS (+ Build $49)" + } }, { "slug": "shyft", @@ -5157,7 +5483,10 @@ "usd": null, "why": "published throughput is 30000 cu_per_s, workload needs 1172840 sustained" } - ] + ], + "planNames": { + "payg": "Pay As You Go" + } }, { "slug": "allnodes", @@ -5218,7 +5547,11 @@ "usd": 100000, "plan": "payg" } - ] + ], + "planNames": { + "deal": "Premium (Deal)", + "payg": "Premium (Pay-as-you-go)" + } }, { "slug": "aws-amb", @@ -5302,7 +5635,12 @@ "usd": 127233, "plan": "premium" } - ] + ], + "planNames": { + "elementary": "Elementary", + "payg": "Pay As You Go", + "premium": "Premium" + } }, { "slug": "chainstack", @@ -5370,7 +5708,13 @@ "usd": 48990, "plan": "enterprise" } - ] + ], + "planNames": { + "business": "Business", + "enterprise": "Enterprise (from)", + "growth": "Growth", + "pro": "Pro" + } }, { "slug": "chainstack-dedicated", @@ -5418,7 +5762,13 @@ "usd": 2629.9, "plan": "dedicated-eth-archive-erigon" } - ] + ], + "planNames": { + "dedicated-eth-archive-erigon": "Dedicated Node, Ethereum archive, erigon 3-C32-R128-M 3,652 GB (+ Pro $199)", + "unlimited-100": "Unlimited Node add-on, 100 RPS (+ Growth $49)", + "unlimited-25": "Unlimited Node add-on, 25 RPS (+ Growth $49)", + "unlimited-250": "Unlimited Node add-on, 250 RPS (+ Growth $49)" + } }, { "slug": "coinbase-cdp", @@ -5454,7 +5804,10 @@ "usd": 30000, "plan": "growth" } - ] + ], + "planNames": { + "growth": "Growth (pay-as-you-go)" + } }, { "slug": "dwellir", @@ -5507,7 +5860,12 @@ "usd": 9999, "plan": "scale" } - ] + ], + "planNames": { + "developer": "Developer", + "growth": "Growth", + "scale": "Scale" + } }, { "slug": "dwellir-unlimited", @@ -5575,7 +5933,15 @@ "usd": 12600, "plan": "cluster-eth-archive" } - ] + ], + "planNames": { + "cluster-eth-archive": "Dedicated Ethereum archive cluster (list price)", + "unlimited-100": "Unlimited Node, 100 RPS", + "unlimited-1000": "Unlimited Node, 1,000 RPS", + "unlimited-25": "Unlimited Node, 25 RPS", + "unlimited-250": "Unlimited Node, 250 RPS", + "unlimited-500": "Unlimited Node, 500 RPS" + } }, { "slug": "getblock", @@ -5698,7 +6064,15 @@ "usd": null, "why": "published throughput is 800 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "advanced": "Advanced", + "growth": "Growth", + "premium": "Premium", + "pro": "Pro", + "scale": "Scale", + "starter": "Starter" + } }, { "slug": "getblock-dedicated", @@ -5726,7 +6100,11 @@ "usd": 1300, "plan": "dedicated-eth-archive" } - ] + ], + "planNames": { + "dedicated-eth-archive": "Dedicated Ethereum archive node (erigon / reth)", + "limitless-evm-archive-15": "Limitless Node, EVM archive, 15 RPS" + } }, { "slug": "google-bne", @@ -5744,7 +6122,10 @@ "usd": 2000.2, "plan": "eth-archive" } - ] + ], + "planNames": { + "eth-archive": "Ethereum archive node (Erigon)" + } }, { "slug": "helius", @@ -5948,7 +6329,11 @@ "usd": null, "why": "published throughput is 40000 credits_per_s, workload needs 1304013 sustained" } - ] + ], + "planNames": { + "developer": "Developer", + "team": "Team" + } }, { "slug": "moralis", @@ -6072,7 +6457,11 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "growth": "Growth" + } }, { "slug": "quicknode", @@ -6235,7 +6624,16 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "build": "Build", + "business": "Business", + "business-plus-t1": "Business+ Tier 1", + "business-plus-t2": "Business+ Tier 2", + "business-plus-t3": "Business+ Tier 3", + "scale": "Scale" + } }, { "slug": "quicknode-flat-rate", @@ -6328,7 +6726,12 @@ "usd": null, "why": "published throughput is 75 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "evm-150": "Flat Rate RPS, EVM 150 RPS (+ Build $49)", + "evm-250": "Flat Rate RPS, EVM 250 RPS (+ Build $49)", + "evm-75": "Flat Rate RPS, EVM 75 RPS (+ Build $49)" + } }, { "slug": "shyft", @@ -6499,7 +6902,10 @@ "usd": null, "why": "published throughput is 30000 cu_per_s, workload needs 30865 sustained" } - ] + ], + "planNames": { + "payg": "Pay As You Go" + } }, { "slug": "allnodes", @@ -6517,7 +6923,10 @@ "usd": 1920, "plan": "sol-advanced" } - ] + ], + "planNames": { + "sol-advanced": "Solana full node, Advanced" + } }, { "slug": "ankr", @@ -6560,7 +6969,11 @@ "usd": 250000, "plan": "payg" } - ] + ], + "planNames": { + "deal": "Premium (Deal)", + "payg": "Premium (Pay-as-you-go)" + } }, { "slug": "aws-amb", @@ -6644,7 +7057,12 @@ "usd": 64833, "plan": "premium" } - ] + ], + "planNames": { + "elementary": "Elementary", + "payg": "Pay As You Go", + "premium": "Premium" + } }, { "slug": "chainstack", @@ -6712,7 +7130,13 @@ "usd": 23990, "plan": "enterprise" } - ] + ], + "planNames": { + "business": "Business", + "enterprise": "Enterprise (from)", + "growth": "Growth", + "pro": "Pro" + } }, { "slug": "chainstack-dedicated", @@ -6770,7 +7194,14 @@ "usd": 3776, "plan": "dedicated-sol-full" } - ] + ], + "planNames": { + "dedicated-sol-full": "Dedicated Node, Solana full, 6-C128-R1024-M 3,800 GB (+ Pro $199)", + "unlimited-100": "Unlimited Node add-on, 100 RPS (+ Growth $49)", + "unlimited-25": "Unlimited Node add-on, 25 RPS (+ Growth $49)", + "unlimited-250": "Unlimited Node add-on, 250 RPS (+ Growth $49)", + "unlimited-500": "Unlimited Node add-on, 500 RPS (+ Growth $49)" + } }, { "slug": "coinbase-cdp", @@ -6806,7 +7237,10 @@ "usd": 30000, "plan": "growth" } - ] + ], + "planNames": { + "growth": "Growth (pay-as-you-go)" + } }, { "slug": "dwellir", @@ -6965,7 +7399,15 @@ "usd": null, "why": "published throughput is 800 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "advanced": "Advanced", + "growth": "Growth", + "premium": "Premium", + "pro": "Pro", + "scale": "Scale", + "starter": "Starter" + } }, { "slug": "getblock-dedicated", @@ -6993,7 +7435,11 @@ "usd": 2900, "plan": "dedicated-sol-full" } - ] + ], + "planNames": { + "dedicated-sol-full": "Dedicated Solana full node", + "limitless-sol-full-5": "Limitless Node, Solana full, 5 RPS" + } }, { "slug": "google-bne", @@ -7114,7 +7560,12 @@ "usd": null, "why": "price not published (sales-gated)" } - ] + ], + "planNames": { + "business": "Business", + "developer": "Developer", + "professional": "Professional" + } }, { "slug": "helius-dedicated", @@ -7132,7 +7583,10 @@ "usd": 3399, "plan": "mainnet-floor" } - ] + ], + "planNames": { + "mainnet-floor": "Dedicated Solana node, mainnet (+ Business $499)" + } }, { "slug": "infura", @@ -7260,7 +7714,11 @@ "usd": null, "why": "published throughput is 40000 credits_per_s, workload needs 308642 sustained" } - ] + ], + "planNames": { + "developer": "Developer", + "team": "Team" + } }, { "slug": "moralis", @@ -7356,7 +7814,14 @@ "usd": 28387.5, "plan": "enterprise" } - ] + ], + "planNames": { + "business": "Business", + "business-plus": "Business Plus", + "enterprise": "Enterprise", + "pro": "Pro", + "pro-plus": "Pro Plus" + } }, { "slug": "onfinality", @@ -7537,7 +8002,16 @@ "usd": null, "why": "published throughput is 500 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "build": "Build", + "business": "Business", + "business-plus-t1": "Business+ Tier 1", + "business-plus-t2": "Business+ Tier 2", + "business-plus-t3": "Business+ Tier 3", + "scale": "Scale" + } }, { "slug": "quicknode-flat-rate", @@ -7565,7 +8039,10 @@ "usd": null, "why": "plan does not serve solana" } - ] + ], + "planNames": { + "sol-75": "Flat Rate RPS, Solana 75 RPS (+ Build $49)" + } }, { "slug": "shyft", @@ -7628,7 +8105,14 @@ "usd": 1800, "plan": "dedicated" } - ] + ], + "planNames": { + "accelerate": "Accelerate", + "build": "Build", + "dedicated": "Dedicated Solana RPC / gRPC node", + "grow": "Grow", + "legacy-scale": "Legacy Scale (credit-based, still listed)" + } }, { "slug": "syndica", @@ -7696,7 +8180,11 @@ "usd": null, "why": "published throughput is 400 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "calc-1000m": "Calculator: 1,000M calls @ 400 RPS, 5 users", + "calc-200m": "Calculator: 200M calls @ 300 RPS, 5 users" + } }, { "slug": "tatum", @@ -7949,7 +8437,21 @@ "usd": null, "why": "published throughput is 200 rps, workload needs 1930 sustained" } - ] + ], + "planNames": { + "t10m": "Starter 10M", + "t150m": "Scale 150M", + "t15m": "Pro 15M", + "t200m": "Scale 200M", + "t20m": "Pro 20M", + "t250m": "Scale 250M", + "t300m": "Scale 300M", + "t350m": "Scale 350M", + "t400m": "Scale 400M", + "t40m": "Pro 40M", + "t4m": "Starter 4M", + "t80m": "Pro 80M" + } }, { "slug": "thirdweb", @@ -7995,7 +8497,11 @@ "usd": 50010, "plan": "hydrant" } - ] + ], + "planNames": { + "hydrant": "Hydrant deep archive", + "payg": "Pay-as-you-go (prepaid, no tiers)" + } }, { "slug": "validation-cloud", @@ -8033,7 +8539,10 @@ "usd": 52557.5, "plan": "scale" } - ] + ], + "planNames": { + "scale": "Scale (banded pay-as-you-go)" + } }, { "slug": "zeeve", @@ -8061,6 +8570,1513 @@ "usd": null, "why": "plan does not serve solana" } + ], + "planNames": { + "sol-basic": "Solana Basic" + } + } + ] + }, + { + "id": "dapp-archive", + "label": "Dapp frontend, archive", + "chain": "ethereum", + "providers": [ + { + "slug": "alchemy", + "name": "Alchemy", + "cohort": "usage", + "unit": "cu", + "points": [ + { + "r": 100000, + "usd": 1.25, + "plan": "payg" + }, + { + "r": 3186199600, + "usd": 39978.84, + "plan": "payg" + }, + { + "r": 3190012223, + "usd": null, + "why": "published throughput is 30000 cu_per_s, workload needs 30030 sustained" + }, + { + "r": 3197637469, + "usd": null, + "why": "published throughput is 30000 cu_per_s, workload needs 30102 sustained" + }, + { + "r": 3212887961, + "usd": null, + "why": "published throughput is 30000 cu_per_s, workload needs 30245 sustained" + }, + { + "r": 3243388946, + "usd": null, + "why": "published throughput is 30000 cu_per_s, workload needs 30532 sustained" + }, + { + "r": 3304390914, + "usd": null, + "why": "published throughput is 30000 cu_per_s, workload needs 31107 sustained" + }, + { + "r": 3426394850, + "usd": null, + "why": "published throughput is 30000 cu_per_s, workload needs 32255 sustained" + }, + { + "r": 3670402724, + "usd": null, + "why": "published throughput is 30000 cu_per_s, workload needs 34552 sustained" + }, + { + "r": 5000000000, + "usd": null, + "why": "published throughput is 30000 cu_per_s, workload needs 47068 sustained" + } + ], + "planNames": { + "payg": "Pay As You Go" + } + }, + { + "slug": "allnodes", + "name": "Allnodes", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "plan has no archive access" + }, + { + "r": 5000000000, + "usd": null, + "why": "plan has no archive access" + } + ] + }, + { + "slug": "ankr", + "name": "Ankr", + "cohort": "usage", + "unit": "credit", + "points": [ + { + "r": 100000, + "usd": 2, + "plan": "payg" + }, + { + "r": 24986862, + "usd": 499.74, + "plan": "payg" + }, + { + "r": 25013971, + "usd": 500, + "plan": "deal" + }, + { + "r": 30000000, + "usd": 500, + "plan": "deal" + }, + { + "r": 179998807, + "usd": 2999.98, + "plan": "deal" + }, + { + "r": 180234810, + "usd": 3604.7, + "plan": "payg" + }, + { + "r": 5000000000, + "usd": 100000, + "plan": "payg" + } + ], + "planNames": { + "deal": "Premium (Deal)", + "payg": "Premium (Pay-as-you-go)" + } + }, + { + "slug": "aws-amb", + "name": "Amazon Managed Blockchain (AMB) Access — Ethereum", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + }, + { + "r": 5000000000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + } + ] + }, + { + "slug": "blockdaemon", + "name": "Blockdaemon", + "cohort": "usage", + "unit": "cu", + "points": [ + { + "r": 100000, + "usd": null, + "why": "price not published (sales-gated)" + }, + { + "r": 5000000000, + "usd": null, + "why": "price not published (sales-gated)" + } + ] + }, + { + "slug": "blockpi", + "name": "BlockPI", + "cohort": "usage", + "unit": "ru", + "points": [ + { + "r": 100000, + "usd": 0.72, + "plan": "payg" + }, + { + "r": 3426371, + "usd": 24.5, + "plan": "payg" + }, + { + "r": 3430613, + "usd": 24.5, + "plan": "elementary" + }, + { + "r": 6993007, + "usd": 24.5, + "plan": "elementary" + }, + { + "r": 17486642, + "usd": 99.53, + "plan": "elementary" + }, + { + "r": 17506542, + "usd": 99.67, + "plan": "premium" + }, + { + "r": 37296037, + "usd": 99.67, + "plan": "premium" + }, + { + "r": 5000000000, + "usd": 35583, + "plan": "premium" + } + ], + "planNames": { + "elementary": "Elementary", + "payg": "Pay As You Go", + "premium": "Premium" + } + }, + { + "slug": "chainstack", + "name": "Chainstack", + "cohort": "usage", + "unit": "ru", + "points": [ + { + "r": 100000, + "usd": 49, + "plan": "growth" + }, + { + "r": 10000000, + "usd": 49, + "plan": "growth" + }, + { + "r": 14999062, + "usd": 198.97, + "plan": "growth" + }, + { + "r": 15018962, + "usd": 199, + "plan": "pro" + }, + { + "r": 40000000, + "usd": 199, + "plan": "pro" + }, + { + "r": 51994908, + "usd": 498.87, + "plan": "pro" + }, + { + "r": 52063440, + "usd": 499, + "plan": "business" + }, + { + "r": 100000000, + "usd": 499, + "plan": "business" + }, + { + "r": 124510837, + "usd": 989.22, + "plan": "business" + }, + { + "r": 124684082, + "usd": 990, + "plan": "enterprise" + }, + { + "r": 200000000, + "usd": 990, + "plan": "enterprise" + }, + { + "r": 5000000000, + "usd": 48990, + "plan": "enterprise" + } + ], + "planNames": { + "business": "Business", + "enterprise": "Enterprise (from)", + "growth": "Growth", + "pro": "Pro" + } + }, + { + "slug": "chainstack-dedicated", + "name": "Chainstack — Dedicated Node \u0026 Unlimited Node", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": 198, + "plan": "unlimited-25" + }, + { + "r": 64741823, + "usd": 198, + "plan": "unlimited-25" + }, + { + "r": 64810355, + "usd": 698, + "plan": "unlimited-100" + }, + { + "r": 259027340, + "usd": 698, + "plan": "unlimited-100" + }, + { + "r": 259348834, + "usd": 1698, + "plan": "unlimited-250" + }, + { + "r": 647494228, + "usd": 1698, + "plan": "unlimited-250" + }, + { + "r": 648306951, + "usd": 2629.9, + "plan": "dedicated-eth-archive-erigon" + }, + { + "r": 5000000000, + "usd": 2629.9, + "plan": "dedicated-eth-archive-erigon" + } + ], + "planNames": { + "dedicated-eth-archive-erigon": "Dedicated Node, Ethereum archive, erigon 3-C32-R128-M 3,652 GB (+ Pro $199)", + "unlimited-100": "Unlimited Node add-on, 100 RPS (+ Growth $49)", + "unlimited-25": "Unlimited Node add-on, 25 RPS (+ Growth $49)", + "unlimited-250": "Unlimited Node add-on, 250 RPS (+ Growth $49)" + } + }, + { + "slug": "coinbase-cdp", + "name": "Coinbase Developer Platform — CDP Node", + "cohort": "usage", + "unit": "billing_unit", + "points": [ + { + "r": 100000, + "usd": null, + "why": "provider does not price ethereum" + }, + { + "r": 5000000000, + "usd": null, + "why": "provider does not price ethereum" + } + ] + }, + { + "slug": "drpc", + "name": "dRPC", + "cohort": "usage", + "unit": "cu", + "points": [ + { + "r": 100000, + "usd": 0.6, + "plan": "growth" + }, + { + "r": 5000000000, + "usd": 30000, + "plan": "growth" + } + ], + "planNames": { + "growth": "Growth (pay-as-you-go)" + } + }, + { + "slug": "dwellir", + "name": "Dwellir", + "cohort": "usage", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": 49, + "plan": "developer" + }, + { + "r": 25000000, + "usd": 49, + "plan": "developer" + }, + { + "r": 74937699, + "usd": 298.69, + "plan": "developer" + }, + { + "r": 75031057, + "usd": 299, + "plan": "growth" + }, + { + "r": 150000000, + "usd": 299, + "plan": "growth" + }, + { + "r": 383078484, + "usd": 998.24, + "plan": "growth" + }, + { + "r": 383516439, + "usd": 999, + "plan": "scale" + }, + { + "r": 500000000, + "usd": 999, + "plan": "scale" + }, + { + "r": 5000000000, + "usd": 9999, + "plan": "scale" + } + ], + "planNames": { + "developer": "Developer", + "growth": "Growth", + "scale": "Scale" + } + }, + { + "slug": "dwellir-unlimited", + "name": "Dwellir, Unlimited Nodes \u0026 dedicated clusters", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": 119, + "plan": "unlimited-25" + }, + { + "r": 64741823, + "usd": 119, + "plan": "unlimited-25" + }, + { + "r": 64810355, + "usd": 479, + "plan": "unlimited-100" + }, + { + "r": 259027340, + "usd": 479, + "plan": "unlimited-100" + }, + { + "r": 259348834, + "usd": 1199, + "plan": "unlimited-250" + }, + { + "r": 647494228, + "usd": 1199, + "plan": "unlimited-250" + }, + { + "r": 648306951, + "usd": 2399, + "plan": "unlimited-500" + }, + { + "r": 1295075885, + "usd": 2399, + "plan": "unlimited-500" + }, + { + "r": 1296584071, + "usd": 4799, + "plan": "unlimited-1000" + }, + { + "r": 2590816653, + "usd": 4799, + "plan": "unlimited-1000" + }, + { + "r": 2593615425, + "usd": 12600, + "plan": "cluster-eth-archive" + }, + { + "r": 5000000000, + "usd": 12600, + "plan": "cluster-eth-archive" + } + ], + "planNames": { + "cluster-eth-archive": "Dedicated Ethereum archive cluster (list price)", + "unlimited-100": "Unlimited Node, 100 RPS", + "unlimited-1000": "Unlimited Node, 1,000 RPS", + "unlimited-25": "Unlimited Node, 25 RPS", + "unlimited-250": "Unlimited Node, 250 RPS", + "unlimited-500": "Unlimited Node, 500 RPS" + } + }, + { + "slug": "getblock", + "name": "GetBlock", + "cohort": "usage", + "unit": "cu", + "points": [ + { + "r": 100000, + "usd": 49, + "plan": "starter" + }, + { + "r": 2250000, + "usd": 49, + "plan": "starter" + }, + { + "r": 2252922, + "usd": 99, + "plan": "growth" + }, + { + "r": 4625000, + "usd": 99, + "plan": "growth" + }, + { + "r": 4632330, + "usd": 199, + "plan": "advanced" + }, + { + "r": 9625000, + "usd": 199, + "plan": "advanced" + }, + { + "r": 9635920, + "usd": 349, + "plan": "scale" + }, + { + "r": 17500000, + "usd": 349, + "plan": "scale" + }, + { + "r": 17525911, + "usd": 499, + "plan": "pro" + }, + { + "r": 25000000, + "usd": 499, + "plan": "pro" + }, + { + "r": 37498248, + "usd": 698.97, + "plan": "pro" + }, + { + "r": 37567741, + "usd": 699, + "plan": "premium" + }, + { + "r": 40000000, + "usd": 699, + "plan": "premium" + }, + { + "r": 2073043762, + "usd": 29161.61, + "plan": "premium" + }, + { + "r": 2075842534, + "usd": null, + "why": "published throughput is 800 rps, workload needs 801 sustained" + }, + { + "r": 2078641307, + "usd": null, + "why": "published throughput is 800 rps, workload needs 802 sustained" + }, + { + "r": 2089836396, + "usd": null, + "why": "published throughput is 800 rps, workload needs 807 sustained" + }, + { + "r": 2112226575, + "usd": null, + "why": "published throughput is 800 rps, workload needs 815 sustained" + }, + { + "r": 2157006933, + "usd": null, + "why": "published throughput is 800 rps, workload needs 833 sustained" + }, + { + "r": 2336128366, + "usd": null, + "why": "published throughput is 800 rps, workload needs 902 sustained" + }, + { + "r": 2694371231, + "usd": null, + "why": "published throughput is 800 rps, workload needs 1040 sustained" + }, + { + "r": 3670402724, + "usd": null, + "why": "published throughput is 800 rps, workload needs 1417 sustained" + }, + { + "r": 5000000000, + "usd": null, + "why": "published throughput is 800 rps, workload needs 1930 sustained" + } + ], + "planNames": { + "advanced": "Advanced", + "growth": "Growth", + "premium": "Premium", + "pro": "Pro", + "scale": "Scale", + "starter": "Starter" + } + }, + { + "slug": "getblock-dedicated", + "name": "GetBlock — Dedicated \u0026 Limitless nodes", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": 150, + "plan": "limitless-evm-archive-15" + }, + { + "r": 38872760, + "usd": 150, + "plan": "limitless-evm-archive-15" + }, + { + "r": 38923068, + "usd": 1300, + "plan": "dedicated-eth-archive" + }, + { + "r": 5000000000, + "usd": 1300, + "plan": "dedicated-eth-archive" + } + ], + "planNames": { + "dedicated-eth-archive": "Dedicated Ethereum archive node (erigon / reth)", + "limitless-evm-archive-15": "Limitless Node, EVM archive, 15 RPS" + } + }, + { + "slug": "google-bne", + "name": "Google Cloud — Blockchain Node Engine", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": 2000.2, + "plan": "eth-archive" + }, + { + "r": 5000000000, + "usd": 2000.2, + "plan": "eth-archive" + } + ], + "planNames": { + "eth-archive": "Ethereum archive node (Erigon)" + } + }, + { + "slug": "helius", + "name": "Helius", + "cohort": "usage", + "unit": "credit", + "points": [ + { + "r": 100000, + "usd": null, + "why": "provider does not price ethereum" + }, + { + "r": 5000000000, + "usd": null, + "why": "provider does not price ethereum" + } + ] + }, + { + "slug": "helius-dedicated", + "name": "Helius — Dedicated Nodes", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "plan does not serve ethereum" + }, + { + "r": 5000000000, + "usd": null, + "why": "plan does not serve ethereum" + } + ] + }, + { + "slug": "infura", + "name": "Infura (MetaMask Developer)", + "cohort": "usage", + "unit": "credit", + "points": [ + { + "r": 100000, + "usd": 50, + "plan": "developer" + }, + { + "r": 4505760, + "usd": 50, + "plan": "developer" + }, + { + "r": 4511538, + "usd": 225, + "plan": "team" + }, + { + "r": 22546997, + "usd": 225, + "plan": "team" + }, + { + "r": 22574106, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 75058903/day" + }, + { + "r": 22628325, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 75239182/day" + }, + { + "r": 26098356, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 86777033/day" + }, + { + "r": 35552442, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 118211868/day" + }, + { + "r": 48431254, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 161033921/day" + }, + { + "r": 65975396, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 219368190/day" + }, + { + "r": 89874873, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 298833952/day" + }, + { + "r": 122431896, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 407086053/day" + }, + { + "r": 166782646, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 554552299/day" + }, + { + "r": 227199382, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 755437946/day" + }, + { + "r": 309501980, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 1029094084/day" + }, + { + "r": 421618557, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 1401881702/day" + }, + { + "r": 574349177, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 1909711015/day" + }, + { + "r": 782406211, + "usd": null, + "why": "daily cap of 75000000 credit cannot serve 2601500651/day" + }, + { + "r": 1065831558, + "usd": null, + "why": "published throughput is 40000 credits_per_s, workload needs 41018 sustained" + }, + { + "r": 1451927266, + "usd": null, + "why": "published throughput is 40000 credits_per_s, workload needs 55876 sustained" + }, + { + "r": 1977885501, + "usd": null, + "why": "published throughput is 40000 credits_per_s, workload needs 76117 sustained" + }, + { + "r": 2694371231, + "usd": null, + "why": "published throughput is 40000 credits_per_s, workload needs 103690 sustained" + }, + { + "r": 3670402724, + "usd": null, + "why": "published throughput is 40000 credits_per_s, workload needs 141252 sustained" + }, + { + "r": 5000000000, + "usd": null, + "why": "published throughput is 40000 credits_per_s, workload needs 192419 sustained" + } + ], + "planNames": { + "developer": "Developer", + "team": "Team" + } + }, + { + "slug": "moralis", + "name": "Moralis", + "cohort": "usage", + "unit": "cu", + "points": [ + { + "r": 100000, + "usd": 149, + "plan": "starter" + }, + { + "r": 216216, + "usd": 149, + "plan": "starter" + }, + { + "r": 1176051, + "usd": 248.88, + "plan": "starter" + }, + { + "r": 1177283, + "usd": 249, + "plan": "pro" + }, + { + "r": 10810811, + "usd": 249, + "plan": "pro" + }, + { + "r": 21598160, + "usd": 747.91, + "plan": "pro" + }, + { + "r": 21625270, + "usd": 749, + "plan": "business" + }, + { + "r": 54054054, + "usd": 749, + "plan": "business" + }, + { + "r": 518268403, + "usd": 17924.93, + "plan": "business" + }, + { + "r": 518865007, + "usd": null, + "why": "published throughput is 200 rps, workload needs 201 sustained" + }, + { + "r": 519461611, + "usd": null, + "why": "published throughput is 200 rps, workload needs 201 sustained" + }, + { + "r": 521848027, + "usd": null, + "why": "published throughput is 200 rps, workload needs 202 sustained" + }, + { + "r": 526620859, + "usd": null, + "why": "published throughput is 200 rps, workload needs 204 sustained" + }, + { + "r": 536166522, + "usd": null, + "why": "published throughput is 200 rps, workload needs 207 sustained" + }, + { + "r": 574349177, + "usd": null, + "why": "published throughput is 200 rps, workload needs 222 sustained" + }, + { + "r": 782406211, + "usd": null, + "why": "published throughput is 200 rps, workload needs 302 sustained" + }, + { + "r": 1065831558, + "usd": null, + "why": "published throughput is 200 rps, workload needs 412 sustained" + }, + { + "r": 1451927266, + "usd": null, + "why": "published throughput is 200 rps, workload needs 561 sustained" + }, + { + "r": 1977885501, + "usd": null, + "why": "published throughput is 200 rps, workload needs 764 sustained" + }, + { + "r": 2694371231, + "usd": null, + "why": "published throughput is 200 rps, workload needs 1040 sustained" + }, + { + "r": 3670402724, + "usd": null, + "why": "published throughput is 200 rps, workload needs 1417 sustained" + }, + { + "r": 5000000000, + "usd": null, + "why": "published throughput is 200 rps, workload needs 1930 sustained" + } + ], + "planNames": { + "business": "Business", + "pro": "Pro", + "starter": "Starter" + } + }, + { + "slug": "nownodes", + "name": "NOWNodes", + "cohort": "usage", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + }, + { + "r": 5000000000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + } + ] + }, + { + "slug": "onfinality", + "name": "OnFinality", + "cohort": "usage", + "unit": "ru", + "points": [ + { + "r": 100000, + "usd": 49, + "plan": "growth" + }, + { + "r": 11428571, + "usd": 49, + "plan": "growth" + }, + { + "r": 30456098, + "usd": 248.79, + "plan": "growth" + }, + { + "r": 30493028, + "usd": 249, + "plan": "accelerate" + }, + { + "r": 57142857, + "usd": 249, + "plan": "accelerate" + }, + { + "r": 1295075885, + "usd": 8372.94, + "plan": "accelerate" + }, + { + "r": 1296584071, + "usd": null, + "why": "published throughput is 500 rps, workload needs 501 sustained" + }, + { + "r": 1298092257, + "usd": null, + "why": "published throughput is 500 rps, workload needs 501 sustained" + }, + { + "r": 1301108630, + "usd": null, + "why": "published throughput is 500 rps, workload needs 502 sustained" + }, + { + "r": 1307141376, + "usd": null, + "why": "published throughput is 500 rps, workload needs 505 sustained" + }, + { + "r": 1355403339, + "usd": null, + "why": "published throughput is 500 rps, workload needs 523 sustained" + }, + { + "r": 1451927266, + "usd": null, + "why": "published throughput is 500 rps, workload needs 561 sustained" + }, + { + "r": 1977885501, + "usd": null, + "why": "published throughput is 500 rps, workload needs 764 sustained" + }, + { + "r": 2694371231, + "usd": null, + "why": "published throughput is 500 rps, workload needs 1040 sustained" + }, + { + "r": 3670402724, + "usd": null, + "why": "published throughput is 500 rps, workload needs 1417 sustained" + }, + { + "r": 5000000000, + "usd": null, + "why": "published throughput is 500 rps, workload needs 1930 sustained" + } + ], + "planNames": { + "accelerate": "Accelerate", + "growth": "Growth" + } + }, + { + "slug": "quicknode", + "name": "QuickNode", + "cohort": "usage", + "unit": "credit", + "points": [ + { + "r": 100000, + "usd": 49, + "plan": "build" + }, + { + "r": 3809524, + "usd": 49, + "plan": "build" + }, + { + "r": 19158295, + "usd": 248.84, + "plan": "build" + }, + { + "r": 19193768, + "usd": 249, + "plan": "accelerate" + }, + { + "r": 21428571, + "usd": 249, + "plan": "accelerate" + }, + { + "r": 42665343, + "usd": 498.74, + "plan": "accelerate" + }, + { + "r": 42741013, + "usd": 499, + "plan": "scale" + }, + { + "r": 45238095, + "usd": 499, + "plan": "scale" + }, + { + "r": 90042473, + "usd": 997.67, + "plan": "scale" + }, + { + "r": 90210074, + "usd": 999, + "plan": "business" + }, + { + "r": 95238095, + "usd": 999, + "plan": "business" + }, + { + "r": 142787895, + "usd": 1498.27, + "plan": "business" + }, + { + "r": 143021872, + "usd": 1499, + "plan": "business-plus-t1" + }, + { + "r": 152380952, + "usd": 1499, + "plan": "business-plus-t1" + }, + { + "r": 199812123, + "usd": 1997.03, + "plan": "business-plus-t1" + }, + { + "r": 200183241, + "usd": 1999, + "plan": "business-plus-t2" + }, + { + "r": 214285714, + "usd": 1999, + "plan": "business-plus-t2" + }, + { + "r": 309501980, + "usd": 2998.77, + "plan": "business-plus-t2" + }, + { + "r": 309874345, + "usd": 2999, + "plan": "business-plus-t3" + }, + { + "r": 333333333, + "usd": 2999, + "plan": "business-plus-t3" + }, + { + "r": 1295075885, + "usd": 13097.3, + "plan": "business-plus-t3" + }, + { + "r": 1296584071, + "usd": null, + "why": "published throughput is 500 rps, workload needs 501 sustained" + }, + { + "r": 1298092257, + "usd": null, + "why": "published throughput is 500 rps, workload needs 501 sustained" + }, + { + "r": 1301108630, + "usd": null, + "why": "published throughput is 500 rps, workload needs 502 sustained" + }, + { + "r": 1307141376, + "usd": null, + "why": "published throughput is 500 rps, workload needs 505 sustained" + }, + { + "r": 1355403339, + "usd": null, + "why": "published throughput is 500 rps, workload needs 523 sustained" + }, + { + "r": 1451927266, + "usd": null, + "why": "published throughput is 500 rps, workload needs 561 sustained" + }, + { + "r": 1977885501, + "usd": null, + "why": "published throughput is 500 rps, workload needs 764 sustained" + }, + { + "r": 2694371231, + "usd": null, + "why": "published throughput is 500 rps, workload needs 1040 sustained" + }, + { + "r": 3670402724, + "usd": null, + "why": "published throughput is 500 rps, workload needs 1417 sustained" + }, + { + "r": 5000000000, + "usd": null, + "why": "published throughput is 500 rps, workload needs 1930 sustained" + } + ], + "planNames": { + "accelerate": "Accelerate", + "build": "Build", + "business": "Business", + "business-plus-t1": "Business+ Tier 1", + "business-plus-t2": "Business+ Tier 2", + "business-plus-t3": "Business+ Tier 3", + "scale": "Scale" + } + }, + { + "slug": "quicknode-flat-rate", + "name": "QuickNode — Flat Rate RPS", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": 848, + "plan": "evm-75" + }, + { + "r": 194394983, + "usd": 848, + "plan": "evm-75" + }, + { + "r": 194630985, + "usd": 1548, + "plan": "evm-150" + }, + { + "r": 388771904, + "usd": 1548, + "plan": "evm-150" + }, + { + "r": 389209859, + "usd": 1998, + "plan": "evm-250" + }, + { + "r": 647494228, + "usd": 1998, + "plan": "evm-250" + }, + { + "r": 648306951, + "usd": null, + "why": "published throughput is 75 rps, workload needs 251 sustained" + }, + { + "r": 649119674, + "usd": null, + "why": "published throughput is 75 rps, workload needs 251 sustained" + }, + { + "r": 652370565, + "usd": null, + "why": "published throughput is 75 rps, workload needs 252 sustained" + }, + { + "r": 678377694, + "usd": null, + "why": "published throughput is 75 rps, workload needs 262 sustained" + }, + { + "r": 782406211, + "usd": null, + "why": "published throughput is 75 rps, workload needs 302 sustained" + }, + { + "r": 1065831558, + "usd": null, + "why": "published throughput is 75 rps, workload needs 412 sustained" + }, + { + "r": 1451927266, + "usd": null, + "why": "published throughput is 75 rps, workload needs 561 sustained" + }, + { + "r": 1977885501, + "usd": null, + "why": "published throughput is 75 rps, workload needs 764 sustained" + }, + { + "r": 2694371231, + "usd": null, + "why": "published throughput is 75 rps, workload needs 1040 sustained" + }, + { + "r": 3670402724, + "usd": null, + "why": "published throughput is 75 rps, workload needs 1417 sustained" + }, + { + "r": 5000000000, + "usd": null, + "why": "published throughput is 75 rps, workload needs 1930 sustained" + } + ], + "planNames": { + "evm-150": "Flat Rate RPS, EVM 150 RPS (+ Build $49)", + "evm-250": "Flat Rate RPS, EVM 250 RPS (+ Build $49)", + "evm-75": "Flat Rate RPS, EVM 75 RPS (+ Build $49)" + } + }, + { + "slug": "shyft", + "name": "Shyft", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "plan does not serve ethereum" + }, + { + "r": 5000000000, + "usd": null, + "why": "plan does not serve ethereum" + } + ] + }, + { + "slug": "syndica", + "name": "Syndica", + "cohort": "usage", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "provider does not price ethereum" + }, + { + "r": 5000000000, + "usd": null, + "why": "provider does not price ethereum" + } + ] + }, + { + "slug": "tatum", + "name": "Tatum", + "cohort": "usage", + "unit": "credit", + "points": [ + { + "r": 100000, + "usd": null, + "why": "archive surcharge not published" + }, + { + "r": 5000000000, + "usd": null, + "why": "archive surcharge not published" + } + ] + }, + { + "slug": "thirdweb", + "name": "thirdweb", + "cohort": "usage", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + }, + { + "r": 5000000000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + } + ] + }, + { + "slug": "triton", + "name": "Triton One", + "cohort": "usage", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "provider does not price ethereum" + }, + { + "r": 5000000000, + "usd": null, + "why": "provider does not price ethereum" + } + ] + }, + { + "slug": "validation-cloud", + "name": "Validation Cloud", + "cohort": "usage", + "unit": "cu", + "points": [ + { + "r": 100000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + }, + { + "r": 5000000000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + } + ] + }, + { + "slug": "zeeve", + "name": "Zeeve", + "cohort": "dedicated", + "unit": "request", + "points": [ + { + "r": 100000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + }, + { + "r": 5000000000, + "usd": null, + "why": "archive support for this plan is not published; not ranked" + } ] } ] diff --git a/src/lib/rpc-cost-curve.ts b/src/lib/rpc-cost-curve.ts index 212b2bd3e..cb001620b 100644 --- a/src/lib/rpc-cost-curve.ts +++ b/src/lib/rpc-cost-curve.ts @@ -61,6 +61,8 @@ export type RpcCostCurveProvider = { /** What the provider meters: request, cu, credit, ru, billing_unit. */ unit: string; points: RpcCostCurvePoint[]; + /** Plan id to the catalogue's name for it. Absent in older artifacts. */ + planNames?: Record; }; export type RpcCostCurveProfile = { @@ -177,6 +179,8 @@ export type RpcCostRankedRow = { unit: string; usd: number | null; plan: string; + /** The catalogue's name for `plan`, or "" when the artifact has none. */ + planName: string; reason: string; }; @@ -208,6 +212,7 @@ export function rpcCostRankAt( unit: provider.unit, usd: q.usd, plan: q.usd === null ? "" : q.plan, + planName: q.usd === null ? "" : (provider.planNames?.[q.plan] ?? ""), reason: q.usd === null ? q.reason : "", }; (q.usd === null ? unpriced : priced).push(row);