DFlow Shows Where Solana Trading Is Going. Retail Pricing Still Happens at the App.
As execution becomes an embedded wholesale service, synchronized JTX quotes show that app-level fees still shape the price offered before signing.
DFlow as a Wholesale Execution Layer
Trading interfaces on Solana keep multiplying. Execution need not. An app, a wallet, or an agent can present the same swap while the routing and transaction construction underneath is one shared service. DFlow is the named case: one API for quoting, routing, and building the transaction, sitting behind many customer-facing surfaces (docs).
Whether that arrangement is large enough to matter depends on which data universe you accept. Fig. 1 reconstructs DFlow’s share of Solana aggregator volume from DefiLlama, the public series available for this window. Read it as a within-source adoption index rather than a market-share estimate. What it shows is a rise, not a takeover, on numbers another source counts differently.
Integration is a separate claim from share, and the numbers for it are company-reported. MoonPay reports more than 500 applications, roughly 10 million monthly transactions, and Q1 2026 volume above $12 billion, across surfaces including Coinbase, Phantom, Solflare, and Kamino. The same interface covers quoting, signing, and submission for apps, wallets, and agents (docs; Helius).
None of this makes DFlow Solana’s Uniswap, and it does not need to be. The wholesale-execution question only requires that an ordinary retail trade plausibly passes through a layer the trader never sees. Adoption is an architecture fact. Once execution becomes an abstract middle layer, the interesting question is a finance question: not who routes the order, but where the retail price is still formed.
The JTX Test
JTX makes that question observable. It is a customer-facing Solana trading surface that labels DFlow as its router.
The measured object is pre-trade price dispersion: matched, standardized intents that receive different quoted outputs across interfaces. A difference sampled minutes apart is a difference between moments; a difference sampled inside a window of under two seconds is a difference between offers.
JTX’s quote is captured alongside Jupiter’s public quote in that window. Jupiter plays the role an outside option plays in the execution-quality literature: a contemporaneous alternative offer at decision time (Schwarz et al., 2025; Bessembinder, 2003). It is not the market’s latent true price, and a gap against it is not proof that best execution failed. Nor is this two DFlow-integrated apps compared: Jupiter is an independent public surface, and nothing here claims the two share a router.
Across five pairs and three displayed fee tiers, 29 observations classify STRONG synchronization, the largest cross-surface gap being 1.842 seconds. In 29 of 29, the JTX quote is lower than Jupiter’s. Against DFlow’s own no-key developer endpoint, a sensitivity reference rather than a production path, the count is 28 of 29.
All of this is pre-trade. Nothing was signed or submitted, so the panel is silent on fills, markouts, network fees, slippage, MEV, delivery, and settlement. What it measures is the offer a retail trader is shown at the moment they are shown it, which is the number they actually act on.
The App Fee Enters the Quote
The first place to look is the one cost the app does display, and JTX serves it from its own backend: a passive session returned {"feeBps":2} on a USDC→SOL quote that also displayed “Route via DFlow” and 0.02%. The schedule is pair-specific: 1 bp on USDC→USDT, 2 bps on USDC→SOL and USDC→WETH, 25 bps on USDC→JUP and USDC→XAUt0.
In 28 of 29 captured responses, that fee arrives as an input-side deduction: the shortfall between the quote’s stated input and the input that actually reaches the route reproduces each pair’s displayed tier almost exactly (method in the Appendix). The fee is not appended after the route prices the trade, it is removed before, and a small proportional haircut on the input comes back as a comparably lower quoted output. The trader meets it as a smaller number.
Four questions hide inside the word fee: who sets it, how it enters the offer, who bears it at quote stage, and who receives the deducted value after settlement. This evidence answers the middle two. The app labels the fee, deducts it from the input, and the trader carries it as a lower quoted output. The first and last remain open: nothing here shows that DFlow sets the schedule, identifies a separate upstream router charge, or follows the deducted units after settlement. Mechanical burden in the offer is not equilibrium incidence, and it is not retained profit (Tax Foundation, Tax Incidence).
Taking each observation’s displayed tier as the fee component and the remainder as residual, the median observed gap is 2.37 bps against a median displayed fee of 2.00 bps, leaving a median residual of 0.10 bps (IQR −0.01 to 0.54). On an aggregate absolute-gap basis, the displayed fee accounts for 89.2% of the observed quote disadvantage across the 29 observations. That figure is a share of total absolute gap magnitude: not an R-squared, not variance explained, not a pass-through coefficient, and not a measure of what anyone kept. Tightening the synchronization filter does not overturn the result; see the robustness note in the Appendix.
One row resists the decomposition. A $10,000 USDC→SOL capture routed entirely through BisonFi shows no detectable input-side deduction, yet a gap in line with the other 2 bp rows. It is carried at the displayed tier as a labeled approximation and left unresolved.
The one number the app does show predicts most of the disadvantage it does not show. A trader who reads the fee line has already read most of the gap.
Same Wholesale Layer, Different Retail Prices
Most is not all, and what remains is not spread evenly.
The tiers are already an act of pricing: a twenty-five-fold spread between the cheapest pair and the most expensive, inside a single app. Why a pair sits where it does, whether liquidity, route complexity, or willingness to pay, is not identified by quote data.
The sharper point is that pairs sharing a tier do not behave alike. USDC→JUP and USDC→XAUt0 both display 25 bps. JUP carries most of the residual mass in the panel, with individual residuals reaching +12.81 bps; XAUt0’s median residual is small and negative, near −0.44 bps. Same posted fee, different quoted cost against the outside option. A posted tier is not a sufficient statistic for the retail quote difference.
The residual is market-specific, and quote JSON cannot identify its source. Separating route composition, timing, liquidity, and quote construction needs transaction-level evidence.
That heterogeneity is the market-structure result. One wholesale execution framework can sit underneath retail markets that still price differently, because the layer that sets and displays the fee is not the layer that finds the route.
What This Changes for Competition and Accountability
Competition in this stack is layered. Apps compete on fees and on how a quote is presented, routers compete on execution quality, venues compete on liquidity. These are separate contests: a market can proliferate on the surface while consolidating underneath, so more customer-facing apps need not mean more independent execution systems. Nothing in this panel identifies a causal link from router concentration to retail fees.
Outsourcing execution therefore does not make the retail surface price-neutral. In the measured case the app kept the largest observable lever over the offer, the displayed fee, while presenting the routing as someone else’s service. An agent submitting standardized intent to a wholesale layer inherits that same policy, with less visibility than a screen provides.
Accountability is where this becomes uncomfortable. A residual quote disadvantage could reflect app policy, route construction, venue liquidity, timing, or settlement mechanics, and quote JSON cannot allocate it among them. The fee line predicts most of an otherwise invisible gap; the residual is the part no outside observer can assign.
Closing
Execution is not being taken away from apps. Outsourcing the router does not erase pricing discretion; it relocates it, and relocates the evidence with it. The routing moves into a shared layer, while the number that shapes the offer stays on the app’s own screen.
As execution moves into shared infrastructure, a trader’s screen can explain less about how a price was built, not more. The execution layer may become harder to see. The fee that shapes the offered price will not.
Appendix
- Panel. 29 synchronized observations, 2026-07-28/29; quote-stage JSON only, nothing signed or submitted, rules fixed before the final panel. USDC→SOL (14, $100 to $10,000, incl. same-tier liquidity check), USDC→JUP (6), USDC→USDT (3), USDC→XAUt0 (3, thin liquidity), USDC→WETH (3, same-tier liquidity check). Displayed tier served by JTX’s own backend at
GET /v1/fees/tier; UI baseline from a passive session on 2026-07-25. Input-side deduction measured by summing route legs whose input asset matches the top-level input, then differencing against the quote’s stated total input. DFlow-dev exception (28 of 29): a thin-liquidity USDC→WETH row. Reconciled rows and audit - Route-component association. Rows with no DFlow-labeled route component (8 of 29) hold a median residual near zero; the 21 that carry one hold both the overall median residual and the largest outlier. An association in what the quote discloses, not a causal DFlow effect; settling it needs transaction-level evidence
- Robustness. Near-zero-lag DFlow-dev vs. Jupiter dispersion (316 tick pairs) is material against a 2 bp fee signal on SOL and WETH, smaller at 1 bp and 25 bp, and reflects persistent cross-surface differences, not pure timing noise. The 13 of 29 rows with sync gap <= 1.0 s move the median gap-to-fee ratio from 1.17 to 1.02; subgroups unbalanced by pair. USDC→SOL at $100 / $1,000 / $10,000 shows no monotonic size trend in median residuals. Multi-hop counting under DefiLlama adapters (Fig. 1) remains unresolved
- Transaction-lineage companion: Can a Solana Transaction Prove the Router? · JTX: Moving Up the Stack (minnus)