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);