Temporal Liquidity: heterogeneous demand and Ethereum's single execution lane




A structural mismatch

A transaction can execute in this slot or a later slot, and its economic value may vary for each temporal choice. Even within the same block, it may be executed in the earlier part or the later part, with a different economic outcome. The economic value of a transaction depends on the temporal choice of its execution.

A liquidation’s value falls sharply within a slot or two. A treasury settlement holds steady for hours, then drops to zero at a cutoff. An oracle update depends on how long it has been since the last one.

Transaction types differ in the shape of value against execution time. Ethereum’s protocol represents none of it. Execution is one homogeneous lane, one stream per 12-second slot, and the only signal a transaction can send about time is a scalar fee.

So the question:

How can a network with no protocol-level mechanism for temporal differentiation, one lane per slot priced by fee alone, deliver appropriate service to transactions whose temporal requirements differ this much?

We don’t think it can, and the shortfall is usually read as a capacity problem instead.

Ethereum offers one service: inclusion as soon as your fee allows. A transaction that could wait has no slower, cheaper option with a deadline attached. It either bids as though it were urgent, or bids low and accepts an open-ended wait. Urgent transactions then have to outbid patient ones that are bidding like urgent ones. Nothing in the fee tells the protocol which is which.

Two things follow, and neither is a shortage of blockspace.

Some demand is excluded rather than delayed. A transaction whose value decays slowly could be worth executing later at a lower price, but with no way to say so it must pay the current price or not transact at all. It drops out. That is suppressed demand, and it never registers in the fee market as demand, because demand that cannot be expressed is invisible to the mechanism meant to price it.

And the fee market’s only control is the base fee, adjusted after each block according to how full the last one was. That adjustment rule reacts to congestion which has already happened, with no forward information about what is coming. Under bursty demand it can oscillate and converge slowly.

Two transactions the protocol cannot tell apart

Two transactions arrive in the same slot with identical maxFeePerGas and maxPriorityFeePerGas.

  • A is a liquidation. High value now, roughly half by the next slot, near zero within a minute. Sensitive to position within the slot.
  • B is a treasury settlement. Flat for several hundred slots, then zero at a cutoff. Indifferent to intra-slot position.

These two messages are indistinguishable. The builder sees the same bid and treats them the same way. Any outcome that serves one serves the other by accident. Include both immediately and B has paid for urgency it does not need, consuming capacity A was competing for. Delay both and A is destroyed while B is unaffected.

Neither can send a message to fix this. The protocol has no vocabulary for the statement, and no differentiated service that such a statement would select.

Supply side: exposing temporal structure

Ethereum exposes one temporal object to a transaction: the next slot. Inclusion is in or out, and the fee market prices that binary. Serving differentiated temporal demand needs more structure than that. Three things are missing: a finer coordinate inside the slot, future slots beyond the next one, and a pricing relationship among slots.

Within a slot. Position within a slot carries value, as MEV makes plain, but the protocol does not expose it. Subdividing a slot into finer quanta would make position addressable rather than a matter of builder discretion. Resolution can go well below block time. Commitment and verification cost, clock uncertainty, and observability each set a floor. This is explored in a TLM research note (RN-05).

Mini-blocks reaches something adjacent from the supply side: several auction rounds per slot, cleared by a distributed-validator cluster. Its motivation is that block value concentrates in the first few transactions while the rest of the block settles into a quieter regime. That observation is evidence for the same heterogeneity described here, arrived at from the extraction side rather than the demand side.

Across slots. The protocol prices the next slot. It offers a transaction no relationship to the slot after that, or the one a minute out. Deadlines, windows, and cadence require treating future slots as addressable. That is what would make “execute before market close” something the protocol can act on rather than a scheduling problem the application solves outside it.

Prices that link the two. Once future slots are addressable, the question is what they cost, and how today’s fee relates to a fee at a future slot. That is a term structure, and it is what makes forward commitments and reservations coherent rather than ad hoc. This is explored in a TLM research note (RN-11).

Ethereum research already reaches into future slots, for a different purpose. Execution tickets and execution auctions allocate the right to propose a future slot, ahead of time, among proposers and builders. EIP-7732, the ePBS headliner for Glamsterdam, adds structure inside the slot through its payload-timeliness committee and dual deadlines. Preconfirmation designs commit to inclusion within a slot.

So the machinery for addressing slots other than the immediate next one is being built. What none of it provides is a way for a transaction to state a temporal requirement, or a service to buy against that statement. These proposals organize the supply side among its own participants.

The supply side has to expose temporal structure before the demand side has anything to select.

Evidence: three forms of the same gap

The cost of the missing mechanism is being paid today, three different ways.

Paid in place: the liquidation gas race

Aave liquidations run on Ethereum mainnet and are time-critical. Liquidators monitor positions continuously, react to oracle price movements, and submit with high priority to be first. There is no way to state this must execute before the position deteriorates, so the only instrument available is a larger bid. Liquidators bid gas against one another, and Aave’s own documentation notes that under congestion a bot can overpay to the point where the liquidation is no longer profitable.

What is being bought there is not capacity but position. That is a temporal service, sold through the only channel the protocol offers, priced by an auction that cannot distinguish urgency from willingness to spend. The demand is real, it is on Ethereum today, and the cost of expressing it badly is paid per transaction by everyone in the race.

Paid by leaving: dYdX

dYdX moved off Ethereum to its own chain, and the reason it gave was temporal. A decentralized order book needs order placement and cancellation at a latency that, in its assessment, neither Ethereum L1 nor Ethereum L2s could provide. The L2 rejection matters here: the constraint was not fees or throughput alone, and more blockspace would not have answered it.

Other factors were present, including sovereignty, product control, and token economics. But the stated reason is one Ethereum’s execution interface cannot address. Not “we need more capacity” but “we need a different relationship to time.”

An exit costs more than the application. Liquidity that leaves stops being composable with what remains: assets are bridged rather than held, order flow splits across venues, and the same capital backs less activity. Ethereum loses the fee revenue and the depth, and the destination gains both. Fragmentation is the cost of serving temporal demand one chain at a time.

Built elsewhere: HyperEVM

A production general-purpose EVM Layer-1 has already exposed temporal structure at protocol level, in a limited form. RN-03 treats the case in full, with sources.

HyperEVM maintains one EVM state but schedules two kinds of block. Small blocks are produced roughly every second at a low gas limit (about 2M gas as documented), serving latency-sensitive traffic. Large blocks are produced roughly once a minute at a high gas limit (about 30M gas), serving contract deployment, migrations, and heavy or large-atomic work. The two draw from separate mempools and expose separate base fees, two independent congestion signals, yet interleave into one increasing block sequence over shared state under one consensus. One chain, not two. (Cadences and limits are documented values, subject to change.)

HyperEVM introduces protocol-native temporal differentiation by allowing transactions to select between execution lanes with different latency and atomic-capacity profiles.

Three things make this relevant to Ethereum.

It is chain-level, not application-level. HyperEVM is a general-purpose chain competing for ordinary smart-contract activity, so it compares directly to Ethereum’s single execution lane rather than to an exchange’s internal matching rule. (Hyperliquid’s HyperCore order book also prioritizes by price and time, but that is an application’s internal rule, not the chain’s.)

Temporal classes are priced separately. Two base fees over shared physical capacity is a market structure, not a scheduling convenience. Temporal service is priced as its own thing rather than folded into one number.

A live chain found it worth operating. Demand for differentiated temporal service was sufficient to justify building and running the mechanism.

HyperEVM’s version is limited in two ways. It is coarse: two predefined classes rather than a stated preference, so a transaction cannot say “within 2s at price X, within 60s at price Y,” nor give an arbitrary deadline. And the dimensions are coupled: the fast lane bundles low latency with low atomic capacity, the slow lane the reverse, so choosing a lane chooses both. Distinct temporal characteristics collapse back into one knob.

Protocol-level temporal differentiation works on a general-purpose EVM chain. Whether it can be done finely, neutrally, and without the coupling is what we think is worth working on.

Which is where the goal of this work sits. We want to widen the set of applications Ethereum can host on its own base layer, so that time-sensitive work has a reason to stay rather than leaving for a sovereign chain, and so that liquidity is not split across chains as a side effect of an interface limitation. Every exit costs the applications that remain, through thinner liquidity and lost composability, and costs the departing application Ethereum’s security and settlement. A temporal market is one route to making that trade unnecessary.

Demand side: identifying a transaction’s temporal type

Given exposed structure, a transaction needs a way to say which part of it applies. That is where temporal liquidity comes in.

We use the term for the economically meaningful temporal characteristics execution demand carries, and the flexibility they define. The dimensions:

  • execution priority, sensitivity to ordering within a slot
  • delay tolerance, how value varies with waiting
  • execution windows and deadlines, when execution stops being valuable
  • predictability, forecastability of demand
  • continuity, whether demand is sustained or one-off

These are independent. A transaction can be priority-sensitive but deadline-loose, or deadline-bound and indifferent to intra-slot position. A stream can be predictable in aggregate while each transaction in it is urgent. That last independence is one reason a single scalar cannot stand in for the set.

Two representations, at different granularities.

Temporal Execution Profile (TEP) (RN-01), transaction-level, chiefly declared preference. Returning to A and B: A would identify as priority-sensitive with steep decay over a short window, B as position-indifferent with a hard deadline several hundred slots out. Under today’s interface both send the same message. As an illustration, not a proposal, a TEP might carry:

eligibility / commitment certificate   when the transaction becomes admissible
resource-demand vector                 what it consumes
admissible execution set or deadline   where in block time it may land
value over a small set of outcomes     what each landing is worth to it
expiry, cancellation, fallback         what happens if none is available

Temporal Stream Profile (TSP) (RN-02), stream-level, chiefly observed property. Some demand is a flow rather than a single transaction: an oracle updating on a cadence, a rollup posting batches. What describes such demand is the statistics of the stream, its average rate and cadence, the jitter around that cadence, its burstiness, how persistent it is, and how well it can be forecast. These are properties of the sequence, not of the transactions in it. A single transaction has no rate or cadence, so no TEP can express them however it is designed. That is why the stream level needs a representation of its own.

At this stage both are conceptual. Their fields and encoding would be defined along with the mechanism that consumes them, rather than fixed in advance.

Two kinds of time are in play here. Applications state what they need in physical time: market closes, reporting cycles, the moment a price goes stale. The chain executes in blockchain time: an ordered sequence of slots and positions within them. A temporal profile has to carry the mapping between the two, since a requirement expressed in one must be served in the other.

Two design points

Protocol-visible is not publicly revealed. A deadline or urgency field exposes trading intent, and a profile visible in a public mempool before ordering can be priced against or front-run. When a field becomes visible is a design choice that governs extraction: committed and hidden, builder-visible, consensus-certified, or revealed only after sequencing. Information reaching the scheduler and information reaching strategic observers are different things, and they can be separated.

Pricing, not policing, makes a declaration credible. The reflex is that declared preferences invite false urgency and therefore need verification. We think that overreaches. If each temporal class is charged at its prevailing market-clearing rate, selecting the urgent class means paying the urgent rate, so false urgency is self-limiting rather than a manipulation to detect. Private value is not verifiable in any case: a missed deadline is observable, the counterfactual value of a different execution time is not. It also means the classes stay open without a reputation or identity system, so a new participant is not disadvantaged for lacking a history.

What comes next

Mechanism design comes later. These are the questions the program starts with.

Throughput and execution. One thing this is not: a way to raise sustained throughput. The base fee is a controller targeting a fixed gas usage, so any lasting increase is choked back to the target. What a temporal interface changes is which transactions occupy that target and what the peak costs, not how much gets through. Beyond the fee level, temporal structure is scheduling information. Knowing which transactions can be deferred, which must stay adjacent, and which are independent is much of what an execution engine needs in order to run work in parallel, and Monad, Aptos and HyperCore each show what becomes available when a chain treats execution scheduling as a design problem rather than a given. Whether temporal profiles can feed that kind of engine, and what that does to throughput, is a direction we want to pursue (RN-06).

Which applications it brings back. Some that left did so for temporal reasons and could return if Ethereum offered the service they needed. Others left for sovereignty, product control, or token economics. Separating the two tells us how much is actually recoverable.

How it fits the existing fee market. EIP-1559, ePBS, execution tickets, and slot auctions improve allocation, and this builds on them rather than replacing them. Temporal classes would interact with the base fee and with proposer and builder incentives, so part of the work is understanding those interactions and what they imply for the mechanisms already in place.

The mechanism itself. The supply-side structure and the demand-side profile fields are both still to be designed. Every class added costs disclosure, extraction surface, and protocol complexity, so the question is what the smallest useful set is rather than how much differentiation is possible.

The measurements that would settle these: deadline-success rates, waiting-time distributions, fee spend, utilization, effects on non-participants, extraction, and computational cost.

Conclusion

Ethereum’s execution interface says almost nothing about time beyond a price for the next slot. The cost of that shows up on the chain as gas races, and off it as applications that build somewhere else. The aim of this work is to close that gap, so that the base layer can host the timing-sensitive part of the ecosystem rather than exporting it.

Making temporal structure protocol-visible touches the fee market, block building, extraction, and the roadmap work already under way. It opens more questions than one program can work through, and many of them will be better answered by people closer to those areas.

The work so far is a set of research notes, a Vision Statement, and a Foundation Statement, all in the repository below. They set out the problem as we currently frame it and mark what is still open. The notes referenced above are RN-01 (temporal execution profiles), RN-02 (protocol-visible temporal abstraction), RN-03 (the Hyperliquid and HyperEVM case), RN-05 (supply-side granularity), RN-06 (Monad and parallel execution), and RN-11 (term structure and allocation).

We are looking for comments and for collaborators on the program.

1 Like

RN-13 §31 carries the resource requirement as data: the capacity constraint is

\sum g_{ij} x_{ijq} \leq K_q

with (g_{ij}) exogenous.

§53a then hands the canonical program back to RN-11 — and RN-11’s capacity constraint (sec. 6) is

\sum_i \sum_s x_i(s,t) \leq C(t)

unweighted: every allocated unit consumes the same capacity, so per-job cost heterogeneity isn’t representable there at all.

The note that owns the program has no cost coefficient; the note that has one treats it as given and doesn’t own the program. Neither says where (g_{ij}) comes from, or whether it can be known before execution — and RN-12, which RN-11 cites by section for the mechanism, isn’t in the repository.

So the resource primitive reads as currently unowned across the corpus: not wrong anywhere, just not yet anyone’s.

I’d like to report a measurement about what it looks like when someone does own it.

I’ve been metering a deterministic interpreter — the kind you’d need if verification cost has to be identical on every machine — measuring the real cost of a fixed step count.

Across instruction mixes that all execute exactly the same number of steps, real cost varies by more than 20x.

The dominant variable isn’t the opcode distribution: two mixes built from the same load instruction differ by 2.3x depending on whether the accesses hit cache or chase pointers.

What separates them is where the datum lands, which isn’t in the binary. You only learn it by running.

If this carries over to the substrate being modeled, (g_{ij}) cannot be treated as a job property that is necessarily known up front or recoverable statically. Its realized value may depend on execution state that is only observable during execution.

The reason I think that belongs in the model rather than in implementation: it puts a second floor under (\delta), and the floor has the same shape as the one RN-05 already has.

RN-05 §4.6 bounds the quantum from below with clock uncertainty — the boundary is an interval of width (\epsilon) rather than a point, and confidence goes as

1 - \frac{\epsilon}{Q}.

That is ambiguity about when a job arrived, and it worsens as (Q) shrinks.

Cost-realization error does the same thing from the inside.

A coarse quantum absorbs it: over- and under-estimates average out across many jobs. A fine quantum has fewer jobs to average against, and a single job costing several times its declared requirement overruns the whole quantum.

Same (1/Q) shape, different source: ambiguity about what a job costs rather than about when it arrived.

The (\epsilon) floor is about admission and buys relief from better clocks; this one is about occupancy and doesn’t.

It also reaches RN-01.

§3 lists a resource-demand vector among the TEP fields, and §6.1 sorts the fields by how each is verified — putting resource use among the certified facts, next to an authenticated deadline.

A deadline can be authenticated by a signature before the fact.

If the real requirement is only knowable after execution, resource use doesn’t certify that way, and it isn’t a declared preference either: it would be a third kind of field the taxonomy doesn’t currently carry — verifiable, but only ex post.

That would put metering upstream of representation rather than beside it.

RN-13’s physical-law interpretation sorts substrate limits into irreducible, hardware/resource, protocol-induced and architecture-induced, and says identifying which category an observed limit falls in may be one of the theory’s most important tasks.

This is one answer for one substrate, and I’d rather offer it than assert it: the limit I hit is category 2, state access, and it is the category a step count cannot see.

The harness is a small Rust crate with no dependencies, and the result I least expected is that the weakest hardware isn’t the worst case above a certain working set:

git clone https://github.com/cristiandkzk/deterministic-succession

cd deterministic-succession/genesis/predicado/vm

cargo run --release --bin mezclas     # the instruction-mix table
cargo run --release --bin conjunto     # the working-set sweep

If RN-12 is where the resource primitive lands, this is a constraint I’d rather hand you before it’s written than after: a declared scalar requirement is the natural thing to reach for there, and it’s the thing the measurement says doesn’t hold.

I can post the full tables as their own thread rather than derail this one.

Cristian, thank you so much. This is the most careful reading for my notes, and I am grateful for it. Every citation you made is accurate; I checked each one against the files. Thank you for your tremedous efforts.

You are right that the resource primitive is unowned. RN-11 owns the program and has no cost coefficient. RN-13 has the coefficient and defers the program. Neither says where g_ij comes from. RN-13 §53a half-admits it, with a line about notation needing unification across three notes.

The RN-01 §6.1 point lands, and I have taken it. Resource use cannot sit among certified facts next to an authenticated deadline. A deadline is settled by a signature before anything runs; a realised cost does not exist until the work has run. I have rewritten the section to sort fields by when each can be checked: certified in advance, checkable only after execution, observed statistics, never verifiable. Your third category was the programme’s own argument, used elsewhere and missing from that one list: supplied temporal liquidity is checkable after the fact because the chain records where a transaction landed, while urgency is a private counterfactual that never becomes checkable.

One clarification: Declarations are in Blockchain Time, the logical ordering of blocks. A TEP or TSP deadline is a block height: exact, identical on every node, with no ε in it. RN-05 §4.6’s ε bounds a physical measurement, which quantum a transaction arrived in, and it does not limit what a transaction may declare. RN-01 §4 sets out the two domains. That distinction was not stated plainly enough and now is, along with a line in RN-01 §3 saying which domain each field uses.

Read that way, your floor is a third thing again: how much of a quantum a job consumes once it runs. That is what makes it a new constraint rather than a restatement of ε, and you say as much yourself when you write that ε “is about admission… this one is about occupancy.”

I do have a question about the 1/Q shape, but it is a detail better worked through directly than in a thread, and I would like to follow up with you on it privately if you are willing.

On RN-12. You were right that it was not in the public repo. It is now, along with RN-15, and your comment is part of why: RN-12 had been sitting in a private repo in a state I kept calling final revision, and being asked for it in public was the push it needed. Read it as a draft rather than a position.

Where your finding bears on the notes. I just push out a new note - RN-15 - it prices in gas used, a protocol-defined quantity, so its balance identity is arithmetic over a declared number and holds whatever gas physically measures.

RN-12 is the one you aimed at. It assumes no virtual machine and no fee rule, so it has no schedule to fall back on. If it prices capacity per job it will have to say where that cost comes from, and your result rules out a declared scalar. It carries no such coefficient today. I have another further note to be pushed out soon.

And yes, please do post the full tables as their own thread. I will link them from the notes.

Our interests overlap well beyond this one thread, and I would welcome the chance to talk further and to find something worth working on together, if you are interested. Thank you again.