Repository navigation
two missing logos were two wrong slugs, and one of them hid Padre - #2846
Merged
Merged
Conversation
A reader asked why the SOLANA chip had no icon and why pump.fun and Terminal
showed initials. Three separate faults, and the third was not cosmetic.
The chip: the logo is looked up on the dimension VALUE, and the headline slice
is published under `all` while being labelled Solana, so hasLogo("all") missed.
ChainTabs now falls back to the label, which fixes every aliased chip on every
bench without each spec carrying an icon field.
pump.fun: I renamed its provider slug to `pumpapp` in #2842 so the metric
panels could resolve, and pump-fun.jpg stopped being found. The slug was the
wrong thing to bend. The harness maps the source's bot ids onto the slugs this
repo already uses, so one product is one row across every bench.
Terminal: same mapping, and this one mattered. Bench 201 already carries that
product as slug `padre`, display name Terminal, because Padre renamed itself;
trade.padre.gg still titles itself "Terminal | Your Edge in Memecoin Trading".
Publishing it as `terminal` split one product across two identities, and led me
to write in bench 206 that "Padre is not covered by this source" when Padre is
in the cohort under its new name. That line is gone and the row is `padre`.
BasedBot had a logo, pointing at another product. The manifest aliased
`basedbot` to based-app.png, which is Based App, the Hyperliquid frontend on
bench 269: an orange B against BasedBot's blue bird. A wrong-product logo is
worse than none, so BasedBot has its own file now.
Product links: none of the four benches declared a `url`, so no row linked
anywhere. They do now, to clean domains. Not to the source's own website_url
fields, every one of which is a tehcscreener referral link (axiom.trade/@adamtehc,
gmgn.ai/?ref=..., pump.fun/join/...). Publishing those would route our readers
through a third party's affiliate codes on a site whose stated policy is no
paid placement and no sold ranking slots.
Chains, which is the other half of what was asked. 206 and 207 were Solana-only
because their slugs say so; that was my call and it was the wrong trade. All
four benches now carry seven chain tabs, and three carry a real all-chains
slice. `all` is a true total where totalling is valid and the headline chain
where it is not: volume, transactions and fees add up, and the ratios built on
them are volume-weighted by construction, but a wallet trading on two chains is
one wallet and the source deduplicates for only 2 of 9 terminals, so bench 232
has no all-chains tab and says why on its own page.
Two bugs found while building that:
The all-chains take rate divided by total volume including the chains whose
fees were withheld. Axiom's measured Solana fees over its Solana plus Robinhood
plus BNB volume reads 0.66% where the measured rate is 0.92%, understating a
terminal precisely because part of it could not be measured. A withheld cell
now leaves the ratio entirely, numerator and denominator together.
Canonicalising the roster broke the fetch. The roster addresses the API, which
only knows its own ids, so GET /bots/pump-fun returned 404 and both renamed
rows went dark. The list is raw for fetching and canonical for comparison, and
canonicalRoster does the conversion at the one place that needs it.
Titles on 206 and 207 no longer say "on Solana". Their slugs still do, and the
methodology says so rather than leaving it silent; renaming them touches seven
call sites each plus bench-published.json and is a separate change.
Every declared tab fills: 8/8/7/7/6/6/5/4 rows across the strip, verified
against Prometheus per tab rather than from the leader line.
Flotapponnier
added a commit
that referenced
this pull request
Oct 7, 2026
… behind them (#2848) Chasing "did you link it to the right product page" to the end. Provider rows link to /products/<slug> through rowHref, so the slug IS the link. Before #2846 two rows pointed at 404s: /products/pumpapp and /products/terminal, both confirmed 404 on staging. Canonicalising the slugs fixed the links, and all nine now resolve. Two things that fix did not cover. The external link, description and X handle on a product page come from src/data/provider-registry.ts, not from the bench spec. Seven of the nine were registered; padre and basedbot were not, so their pages had no link out and a generated fallback description. Both added, in the registry's own neutral register rather than the source's marketing copy ("#1 Degen Trading Bot 🚀"). BasedBot's entry says outright that it is not Based App, the Hyperliquid frontend, because the two already collided once in the logo manifest. And the `url:` field I added to all four specs in #2846 is dead. It passes the schema, but nothing in the render path reads it: `url` is not on ProviderResult, the loader never carries it, and no other bench in the repo declares it. Thirty-six lines removed. A field that validates and renders nothing is worse than no field, because the next person reads it as the mechanism and stops looking for the real one.
Flotapponnier
added a commit
that referenced
this pull request
Oct 7, 2026
Finishing the logo sweep. Seven chain chips across the terminal benches, six resolved, HyperEVM did not. Aliased to hyperliquid.png: HyperEVM is Hyperliquid's EVM execution layer, the same project and the same brand, which is how hypercore and hyperliquid-hip3 are already handled two lines above. Worth distinguishing from the alias removed in #2846. basedbot pointed at based-app.png, a different company's logo on a different product. This one points at the same project's own mark. An alias is right when the brand is shared and wrong when only the name looks similar.
This was referenced Oct 7, 2026
Flotapponnier
added a commit
that referenced
this pull request
Oct 7, 2026
…2852) Benches 203, 206, 207 and 232 leave DEV_ONLY. They were gated on 2026-10-02 when the Dune trial ended; they were re-sourced this week to the public tehcscreener API via harnesses/terminal-activity, and the audit round is what #2843, #2844, #2846, #2848 and #2849 were. Un-gated after the audit rather than after a 24h window, and the distinction matters: these four declare no range selector. Every query is an instant read of a gauge, so there is no window to fill. The only thing a day would buy them is a complete chart, which is cosmetic, and 351 scrapes are already in. 206 and 207 are renamed on the way out: solana-avg-trade-size -> terminal-avg-trade-size solana-unique-traders -> terminal-swap-transactions Both gained an all-chains default view in #2846 while their slugs still promised Solana, which is the kind of thing an SEO audit flags and a reader trips over. Neither was ever served on production, so there is no signal to preserve and no redirect is owed; RENAMED_BENCH_SLUGS stays untouched. The second name also drops a claim the old one never earned: it counts transactions, not unique traders. Cache keys bumped in lockstep, bench-unfiltered v88 to v89, all-benchmarks v81 to v82 and bench-filters v32 to v33, because every cached bench set is stale on both counts: the membership changed and two slugs moved. bench-published.json keeps each bench's original publication date under its new key.
Flotapponnier
added a commit
that referenced
this pull request
Oct 7, 2026
* four benches came off Dune, and the method was the bug, not the vendor (#2842) Benches 203, 206, 207 and 232 were gated to staging on 2026-10-02 when the Dune trial ended, under a note saying they "have no free equivalent for what they measure". That stopped being true. They now read the public tehcscreener API through a new harness, terminal-activity: Allium-backed, no key, 120 requests a minute, synced daily. The interesting part is not the saving. Fee-wallet attribution can only see a terminal that charges a fee, so the old method had three blind spots that belonged to the method and not to Dune: pump.fun takes no terminal fee and was structurally absent from three of these four benches whatever its real volume. It is now measurable, and on Solana it is third by wallets at 51,554 and first by nothing: its observed take rate reads 0.000% against 0.44% to 1.12% for everyone else. Fomo sponsors the gas on the trades it routes, so the addresses on its transactions were its own routing accounts. Bench 232 published no figure for it at all. It now leads that bench at 86,227 wallets. BasedBot had no public fee-wallet list and read unresponsive everywhere. It turns out to be a Robinhood Chain terminal: $419M there against $15.8M on Solana over 30 days, and zero Solana volume in the last 7, so it ranks on one tab and reads unresponsive on the other rather than being given its last live Solana day. The source is also per chain, so 232 and 203 gained a chain axis with five tabs (Solana, BNB, Robinhood, Ethereum, Base) filling 8/7/7/5/6 rows. 206 and 207 stay Solana-scoped because their slugs say so. 232 gained two columns off the same row it already read, swaps per wallet and volume per wallet, which separate a terminal with many light users from one with few heavy ones: Terminal leads both while Fomo leads the count. What got worse, stated rather than hidden: bench 203 lost its fee-paying-rate panel. That column measured the share of transactions that actually paid a fee, which this source does not report and which none of its fields reconstruct, so it was removed rather than approximated. Bench 206 lost Padre, Phantom and Bloom, which the source does not cover; they were removed rather than published as zero, because a zero would rank them last on a figure nobody measured. Three guards, each for a failure seen in the data: Gauges are deleted, not republished. The previous source froze on 2026-08-25 and was republished for 32 days with nothing in the metrics saying so. The sample is the source's latest day, never the latest day that carries a number, so a terminal that did nothing in the window reads unresponsive. A zero fee column is distinguished from a zero fee. One terminal at zero is pump.fun; every terminal on a chain at zero is the column having failed, and terminal_fee_column_ok says which, wired as the bench's probe_ok so no badge can crown a leader off a dead column. Audit findings fixed in passing: the hub's four tooltips and its source label still said Dune and still told readers that Fomo, pump.fun and BasedBot were unmeasured, which is now the opposite of what the pages show; the paused-bench notice named a blocker that has been cleared; the four seo_titles ran 80 to 93 characters against a repo median of 50 and the descriptions 174 to 195 against 136, so both were brought into range; bench 203's new title had drifted off its own slug and was pulled back; the Dockerfile did not copy go.sum, so the image was not reproducible. The two containers nobody reads any more, ocb-dune-platform-volume and ocb-memecoin-platforms, are stopped on the VPS rather than removed. They were idle at 0% CPU so the machine gains nothing; what they stop doing is polling Dune. dune-platform-volume keeps its SQL and a header saying plainly that no bench reads it. The four stay in DEV_ONLY. The blocker is no longer a Dune plan, it is the ordinary one: a full 24h window of the new series and an audit round. (cherry picked from commit 0bf009a) * I crowned pump.fun's zero take rate an hour ago and it does not hold (#2843) #2842 shipped bench 203 asserting that the pump.fun app "takes no terminal fee, so this reads 0: a measurement, not a missing value", and made that the page's headline finding. Checking the source per chain rather than per row breaks the claim. pump.fun reports fees on Robinhood, BNB, Ethereum and Base, and exactly $0.00 on the $252M it routes on Solana. Axiom is the same shape inverted: it charges 0.92% on Solana and reported exactly $0.00 on $29.8M of Robinhood volume and $21.7M of BNB volume across a full week. Nobody routes tens of millions for free for a week. Those zeros are gaps, and I published one of them as the cheapest price in the market and let it crown a tab. The fee guard was one level too coarse. terminal_fee_column_ok is per chain, so it asks "did anybody on this chain report a fee" and reads healthy while a single row is blank: on BNB, gmgn, maestro, terminal and fomo all report fees, so nothing stopped Axiom's zero from winning. There is now a second guard per cell. A platform that reports fees on any chain and exactly zero on another, on material volume, has that cell's take rate withheld and terminal_fee_withheld set, because this harness cannot tell a waived fee from an unmeasured one and will not guess in the direction that produces a leader. Volume, transactions and wallets for the cell are untouched; only the ratio that needs the fee column is withheld. A platform reporting zero on every chain it serves is a different claim and still publishes as a real zero, so a genuinely free terminal is not erased. Two tests pin both directions. Live effect: five cells withheld (pump.fun on Solana, Axiom on Robinhood, BNB and Arc), seven Solana take rates remain, and the Solana tab is now led by Fomo at 0.442%, which is measured. Copy corrected in bench 203's disclaimer, seo_intro, methodology, findings, FAQ and the pump.fun formula, in the harness README and metric list, and in the hub tooltip, all of which repeated the claim. (cherry picked from commit 128d159) * the withheld cell still won the tab, because the gate answered the wrong question (#2844) #2843 withheld the take rate for a cell whose zero could not be explained, and the harness did exactly that. Axiom still led the BNB and Robinhood tabs at 0.000%. terminal_activity_health answers "did this platform publish on this chain". For a withheld fee cell the answer is yes, and correctly so: the volume, transactions and wallets are all there and all real. Only the take rate is missing. Bench 203 gated on that, so the row rendered live, the absent p50 became 0 under zero_is_a_value, and with lower-is-better a blank cell was crowned the cheapest terminal in the market. A bench has to gate on the metric it ranks, not on whether the row exists. terminal_fee_rate_health{platform,chain} is 1 only when a take rate was actually published for that cell, and bench 203's nine success queries now read it. The other three benches keep the generic gate, which is right for them: they rank volume, transactions and wallets, and none of those is ever withheld. Verified on the deployed harness: the fee gate reads 0 for pump.fun on Solana and for Axiom on Robinhood and BNB, 1 on every other cell. Found by checking the published variant blobs row by row rather than trusting the leader line. Two of the rows that looked wrong there, Trojan and Photon at p50=0 on chains they do not serve, were already correct: they carry availability=unavailable and the page filters them. My own check had counted them as ranked because it tested p50 for null and zero is not null. (cherry picked from commit bf86fd2) * two missing logos were two wrong slugs, and one of them hid Padre (#2846) A reader asked why the SOLANA chip had no icon and why pump.fun and Terminal showed initials. Three separate faults, and the third was not cosmetic. The chip: the logo is looked up on the dimension VALUE, and the headline slice is published under `all` while being labelled Solana, so hasLogo("all") missed. ChainTabs now falls back to the label, which fixes every aliased chip on every bench without each spec carrying an icon field. pump.fun: I renamed its provider slug to `pumpapp` in #2842 so the metric panels could resolve, and pump-fun.jpg stopped being found. The slug was the wrong thing to bend. The harness maps the source's bot ids onto the slugs this repo already uses, so one product is one row across every bench. Terminal: same mapping, and this one mattered. Bench 201 already carries that product as slug `padre`, display name Terminal, because Padre renamed itself; trade.padre.gg still titles itself "Terminal | Your Edge in Memecoin Trading". Publishing it as `terminal` split one product across two identities, and led me to write in bench 206 that "Padre is not covered by this source" when Padre is in the cohort under its new name. That line is gone and the row is `padre`. BasedBot had a logo, pointing at another product. The manifest aliased `basedbot` to based-app.png, which is Based App, the Hyperliquid frontend on bench 269: an orange B against BasedBot's blue bird. A wrong-product logo is worse than none, so BasedBot has its own file now. Product links: none of the four benches declared a `url`, so no row linked anywhere. They do now, to clean domains. Not to the source's own website_url fields, every one of which is a tehcscreener referral link (axiom.trade/@adamtehc, gmgn.ai/?ref=..., pump.fun/join/...). Publishing those would route our readers through a third party's affiliate codes on a site whose stated policy is no paid placement and no sold ranking slots. Chains, which is the other half of what was asked. 206 and 207 were Solana-only because their slugs say so; that was my call and it was the wrong trade. All four benches now carry seven chain tabs, and three carry a real all-chains slice. `all` is a true total where totalling is valid and the headline chain where it is not: volume, transactions and fees add up, and the ratios built on them are volume-weighted by construction, but a wallet trading on two chains is one wallet and the source deduplicates for only 2 of 9 terminals, so bench 232 has no all-chains tab and says why on its own page. Two bugs found while building that: The all-chains take rate divided by total volume including the chains whose fees were withheld. Axiom's measured Solana fees over its Solana plus Robinhood plus BNB volume reads 0.66% where the measured rate is 0.92%, understating a terminal precisely because part of it could not be measured. A withheld cell now leaves the ratio entirely, numerator and denominator together. Canonicalising the roster broke the fetch. The roster addresses the API, which only knows its own ids, so GET /bots/pump-fun returned 404 and both renamed rows went dark. The list is raw for fetching and canonical for comparison, and canonicalRoster does the conversion at the one place that needs it. Titles on 206 and 207 no longer say "on Solana". Their slugs still do, and the methodology says so rather than leaving it silent; renaming them touches seven call sites each plus bench-published.json and is a separate change. Every declared tab fills: 8/8/7/7/6/6/5/4 rows across the strip, verified against Prometheus per tab rather than from the leader line. (cherry picked from commit cf6b2cd) * the product links were right once the slugs were, and two had no page behind them (#2848) Chasing "did you link it to the right product page" to the end. Provider rows link to /products/<slug> through rowHref, so the slug IS the link. Before #2846 two rows pointed at 404s: /products/pumpapp and /products/terminal, both confirmed 404 on staging. Canonicalising the slugs fixed the links, and all nine now resolve. Two things that fix did not cover. The external link, description and X handle on a product page come from src/data/provider-registry.ts, not from the bench spec. Seven of the nine were registered; padre and basedbot were not, so their pages had no link out and a generated fallback description. Both added, in the registry's own neutral register rather than the source's marketing copy ("#1 Degen Trading Bot 🚀"). BasedBot's entry says outright that it is not Based App, the Hyperliquid frontend, because the two already collided once in the logo manifest. And the `url:` field I added to all four specs in #2846 is dead. It passes the schema, but nothing in the render path reads it: `url` is not on ProviderResult, the loader never carries it, and no other bench in the repo declares it. Thirty-six lines removed. A field that validates and renders nothing is worse than no field, because the next person reads it as the mechanism and stops looking for the real one. (cherry picked from commit 9be7674) * the last bare chip: HyperEVM (#2849) Finishing the logo sweep. Seven chain chips across the terminal benches, six resolved, HyperEVM did not. Aliased to hyperliquid.png: HyperEVM is Hyperliquid's EVM execution layer, the same project and the same brand, which is how hypercore and hyperliquid-hip3 are already handled two lines above. Worth distinguishing from the alias removed in #2846. basedbot pointed at based-app.png, a different company's logo on a different product. This one points at the same project's own mark. An alias is right when the brand is shared and wrong when only the name looks similar. (cherry picked from commit 9bcff78) * the four terminal benches go to production, two under honest slugs Benches 203, 206, 207 and 232 leave DEV_ONLY. They were gated on 2026-10-02 when the Dune trial ended; they were re-sourced this week to the public tehcscreener API via harnesses/terminal-activity, and the audit round is what #2843, #2844, #2846, #2848 and #2849 were. Un-gated after the audit rather than after a 24h window, and the distinction matters: these four declare no range selector. Every query is an instant read of a gauge, so there is no window to fill. The only thing a day would buy them is a complete chart, which is cosmetic, and 351 scrapes are already in. 206 and 207 are renamed on the way out: solana-avg-trade-size -> terminal-avg-trade-size solana-unique-traders -> terminal-swap-transactions Both gained an all-chains default view in #2846 while their slugs still promised Solana, which is the kind of thing an SEO audit flags and a reader trips over. Neither was ever served on production, so there is no signal to preserve and no redirect is owed; RENAMED_BENCH_SLUGS stays untouched. The second name also drops a claim the old one never earned: it counts transactions, not unique traders. Cache keys bumped in lockstep, bench-unfiltered v88 to v89, all-benchmarks v81 to v82 and bench-filters v32 to v33, because every cached bench set is stale on both counts: the membership changed and two slugs moved. bench-published.json keeps each bench's original publication date under its new key. (cherry picked from commit 5acfdd7)
Flotapponnier
added a commit
that referenced
this pull request
Oct 7, 2026
…2854) #2846 gave 206 and 207 an all-chains default view and #2852 renamed them off the solana- prefix, but the renaming stopped at the title. The body did not move, so both pages shipped to production saying "leads Solana terminals", "routed Solana volume divided by that day's swap count", and, in every one of the eighteen provider formulas, "on Solana on the day". That is a page contradicting its own tab strip in front of readers, on the figure it exists to publish. Fixed across the seo_description, disclaimer, seo_intro, methodology, findings, FAQ and all eighteen formulas. 207's "Is this Solana only?" FAQ was the wrong question once the answer became no; it now answers how to read one chain at a time, which is what someone looking at eight tabs actually wants to know. Three mentions of Solana stay in each, and all three are true: the methodology line about BasedBot routing on Robinhood and almost nothing on Solana, and the tags on Trojan and Photon, which really are Solana-only products.
Flotapponnier
added a commit
that referenced
this pull request
Oct 7, 2026
…2854) (#2855) #2846 gave 206 and 207 an all-chains default view and #2852 renamed them off the solana- prefix, but the renaming stopped at the title. The body did not move, so both pages shipped to production saying "leads Solana terminals", "routed Solana volume divided by that day's swap count", and, in every one of the eighteen provider formulas, "on Solana on the day". That is a page contradicting its own tab strip in front of readers, on the figure it exists to publish. Fixed across the seo_description, disclaimer, seo_intro, methodology, findings, FAQ and all eighteen formulas. 207's "Is this Solana only?" FAQ was the wrong question once the answer became no; it now answers how to read one chain at a time, which is what someone looking at eight tabs actually wants to know. Three mentions of Solana stay in each, and all three are true: the methodology line about BasedBot routing on Robinhood and almost nothing on Solana, and the tags on Trojan and Photon, which really are Solana-only products. (cherry picked from commit df56c7d)
Flotapponnier
added a commit
that referenced
this pull request
Oct 7, 2026
Two halves of one sentence counting different things. `wins` is one per chain led, deliberately, so a product topping four chain tabs of one bench earns four. `distinctBenchCount` is one per bench. Putting them either side of "of" only worked while the trading benches had no chain axis and a win meant a bench. Seven chain tabs landed on four of those benches this afternoon, in #2846 and #2857. The numerator multiplied, the denominator did not, and the card went out claiming a count that cannot exist. Mine. benchesLedCount counts distinct benchmarks the provider leads in any view, aggregate or chain, which is the basis the sentence already promised. FOMO now reads "#1 on 9 of 10 benchmarks" against 23 and 11. The two other places that use `wins` keep it: they say "first-place finishes", which can honestly exceed the bench count. They now say "first-place finishes across chains", because a reader who sees 23 finishes and 10 benchmarks will divide them and the two words stop that.
Flotapponnier
added a commit
that referenced
this pull request
Oct 7, 2026
Two halves of one sentence counting different things. `wins` is one per chain led, deliberately, so a product topping four chain tabs of one bench earns four. `distinctBenchCount` is one per bench. Putting them either side of "of" only worked while the trading benches had no chain axis and a win meant a bench. Seven chain tabs landed on four of those benches this afternoon, in #2846 and #2857. The numerator multiplied, the denominator did not, and the card went out claiming a count that cannot exist. Mine. benchesLedCount counts distinct benchmarks the provider leads in any view, aggregate or chain, which is the basis the sentence already promised. FOMO now reads "#1 on 9 of 10 benchmarks" against 23 and 11. The two other places that use `wins` keep it: they say "first-place finishes", which can honestly exceed the bench count. They now say "first-place finishes across chains", because a reader who sees 23 finishes and 10 benchmarks will divide them and the two words stop that.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You asked why the SOLANA chip had no icon, why pump.fun and Terminal showed initials, whether every row has a logo and a product page, what Terminal is, and why two of the benches were Solana-only. Three separate faults, and the third was not cosmetic.
The chip
The logo is looked up on the dimension value. The headline slice is published under
alland labelled "Solana", sohasLogo("all")missed.ChainTabsnow falls back to the label slug, which fixes every aliased chip on every bench without each spec carrying an icon field.The two provider logos
pumpappin #2842 so the metric panels could resolve.pump-fun.jpgstopped being found. The slug was the wrong thing to bend.terminal, but bench 201 already carries that product as slugpadre, display name Terminalbasedbottobased-app.png, which is Based App, the Hyperliquid frontend on bench 269. Orange B against BasedBot's blue bird.The harness now maps the source's bot ids onto the slugs this repo already uses, so one product is one row across every bench.
What Terminal is, and a retraction
Terminal is Padre.
trade.padre.ggstill titles itself "Terminal | Your Edge in Memecoin Trading", and bench 201 has carried it aspadre/ name "Terminal" all along.Which means the line I wrote in bench 206 — "Padre, Phantom and Bloom are not covered by this source" — was wrong about Padre. It is in the cohort, under its new name, and I split one product across two identities by not checking the repo first. Fixed.
Product pages
None of the four benches declared a
url, so no row linked anywhere. They do now, to clean domains — not to the source's ownwebsite_urlfields, every one of which is a tehcscreener referral link (axiom.trade/@adamtehc,gmgn.ai/?ref=...,pump.fun/join/adam_tehc). Publishing those would route our readers through a third party's affiliate codes on a site whose stated policy is no paid placement and no sold ranking slots.Chains
206 and 207 were Solana-only because their slugs say so. That was my call and it was the wrong trade. All four now carry seven chain tabs, and three carry a real all-chains slice.
allis a true total where totalling is valid and the headline chain where it is not:Fomo's all-chains volume is $151.6M against $103.2M on Solana alone.
Two bugs found while building that
The all-chains take rate divided by volume it could not measure. Axiom's measured Solana fees over its Solana + Robinhood + BNB volume reads 0.66% where the measured rate is 0.92%, understating a terminal precisely because part of it could not be measured. A withheld cell now leaves the ratio entirely, numerator and denominator together.
Canonicalising the roster broke the fetch. The roster addresses the API, which only knows its own ids, so
GET /bots/pump-funreturned 404 and both renamed rows went dark. The list is raw for fetching and canonical for comparison.Still inconsistent, flagged not fixed
solana-unique-tradersandsolana-avg-trade-sizekeep their slugs while their titles, default view and tabs are no longer Solana-only. The methodology now says so rather than leaving it silent. Renaming touches seven call sites each plusbench-published.json; your call.Verification
Every declared tab fills — 8 / 8 / 7 / 7 / 6 / 6 / 5 / 4 rows across the strip — checked against Prometheus per tab rather than read off the leader line.
pnpm validate237/237, typecheck clean,go testgreen (3 new tests: the all-chains split in both directions, the withheld-volume denominator, and the raw-vs-canonical roster),gofmtclean, eslint clean. Harness redeployed.