Price And Depth Discontinuity At The Handover
A chart that runs across a graduation is two series pretending to be one. The left half is a function evaluated at a position. The right half is a ratio of two balances that every trade disturbs. Nothing requires the two to meet, and the candle at the join is a rendering artefact rather than a market event. This note separates the mechanisms, works the slippage arithmetic on both sides, and explains why depth becomes the number that matters.
Before the handover
- Price formula
- A function of how much supply has been sold
- Slippage
- Computable in closed form for any order size
- Depth
- Not a variable; the function covers its whole range
- Who can change it
- Only traders, and only by advancing the position
- Chart source
- Trades against the curve account
After the handover
- Price formula
- Quote reserve divided by base reserve
- Slippage
- Depends on current depth, which is not constant
- Depth
- A live variable anybody can add to or subtract from
- Who can change it
- Traders, and separately every liquidity provider
- Chart source
- Swaps against the pool, spliced onto the previous series
- Question
- Why does the price jump when a token migrates to a pool
- Short answer
- The two venues compute price with unrelated equations, and nothing reconciles them
- Opening price
- Set by the ratio of the two deposits the migration routine made
- Slippage
- Closed-form on a curve, depth-dependent in a pool
- Reading rule
- Never read turnover without reading depth over the same window
The price jumps at migration because the two venues compute price with unrelated equations. A curve evaluates a function at a position. A pool divides one reserve by the other. The opening pool price is set by the ratio of the two deposits the migration routine made, and there is no mechanism anywhere in the system that requires it to equal the last curve quote.
Two equations, one instant
A bonding curve is a rule that maps position to price. Ask it for a quote and it evaluates itself at wherever the position currently sits. Nothing else is involved: no reserves to compare, no counterparty, no depth. The rule is total, meaning it produces an answer everywhere in its domain, which is why a curve never runs out of anything.
A constant-product pool is a rule about state rather than a function of position. It holds two balances and preserves their product across a swap, which is the behaviour set out in the Raydium protocol documentation for pools of that type. Ask it for a quote and the answer is the ratio of the balances it currently holds. Every fill changes those balances, so every fill changes the next quote, and the pool has no memory of what it quoted a minute ago.
At migration one is retired and the other takes over, at a single instant, with no overlap by design. That is the discontinuity. It is not a market event, because no participant caused it, and it is not an error, because both mechanisms behaved correctly. It is a change in what the plotted quantity means.
Why the prices need not match
People expect continuity because continuity is what markets normally provide. In a market with continuous trading, the price at any instant is the price of the last trade, and the last trade before an event and the first after it are both trades. The number carries across because the mechanism carries across.
Here the mechanism does not carry across. The last curve price was produced by a rule that no longer exists for this token. The first pool price is produced by a rule that did not exist for this token a moment earlier. The only thing linking them is the deposit, and the deposit is chosen by the migration routine according to the launchpad's parameters rather than to make the chart look tidy.
In practice the two are often close, because the token allocation reserved for the pool and the reserve accumulated by the curve are usually sized so the opening price lands near where the curve finished. That is a design choice, not a guarantee, and treating a close match as a law produces confusion the first time it does not hold.
What sets the opening price
Exactly two numbers: the quantity of quote asset deposited and the quantity of tokens deposited. Divide the first by the second and you have the opening price. Multiply them and you have the constant the pool will preserve.
Both deposits are downstream of launchpad parameters. The quote deposit is the accumulated reserve less whatever the operator retains under its fee model. The token deposit is an allocation held back for this purpose since the token was created. Changing either parameter changes the opening price and the opening depth together, in opposite directions.
This is worth internalising because it makes the opening price predictable in structure even though this desk refuses to print the parameters. If you know the two deposits, which you can read off the migration transaction, you know the opening price exactly. No inference is required and no third-party display is needed.
Slippage changes character
| Aspect | Curve phase | Pool phase |
|---|---|---|
| What determines cost | The function and the current position | Current reserves and your size relative to them |
| Stability over time | Same size always costs the same at the same position | Same size costs more or less as depth changes |
| Who can change it | Only traders advancing the position | Traders, plus every liquidity provider adding or removing |
| Predictability | Closed form; computable exactly in advance | Computable from a reserve snapshot that may be stale by execution |
| Failure mode | Trade rejected once the curve is complete | Trade fills at a materially worse price than quoted |
| Protection available | Little needed; the outcome is deterministic | Minimum-output limits, which turn bad fills into failed transactions |
| Effect of others | Sequential; earlier trades move your starting point | Same, plus ordering within a block matters a great deal |
The row worth dwelling on is the last one. In a pool, transactions in the same block execute in an order the trader does not control, and each one moves the reserves for the next. A quote fetched a second before signing describes a state that may not exist by the time the transaction lands. Minimum-output limits exist for exactly this reason, and aggregator interfaces return an expected output alongside that minimum, as the Jupiter documentation describes. Setting the minimum loosely to avoid failures is how people convert a failed transaction into an expensive fill.
Illustrative arithmetic on both sides
Illustrative arithmetic
Invented round numbers describing no real token, used to compare how the two mechanisms respond to the same order. Take a pool holding 100 units of quote asset and 200,000 tokens. The quoted price is 0.0005 and the constant is 20,000,000.
A buy of 5 units takes the quote reserve to 105, so the token reserve becomes 20,000,000 divided by 105, about 190,476. The buyer receives about 9,524 tokens at an average of about 0.000525, which is five percent above the pre-trade quote. A buy of 20 units takes the reserve to 120, the token side to about 166,667, and delivers about 33,333 tokens at an average of 0.0006, which is twenty percent above the quote. Four times the size, four times the impact in this range, and the relationship steepens as size grows further.
Now double the depth: 200 units against 400,000 tokens, the same 0.0005 price, constant 80,000,000. The same 20-unit buy takes quote to 220 and tokens to about 363,636, delivering about 36,364 tokens at an average of about 0.00055, or ten percent above quote. Identical order, identical price, half the impact, purely because depth doubled.
That is the whole argument for reading depth rather than price. On the curve side of the seam, none of this variation exists: the same size at the same position always costs the same, because there is no depth to have changed. The figures are invented; the shape of the relationship is not.
Depth becomes a live variable
Before migration, depth is not a concept. After migration it is the single most important number describing the market, and it is one that anybody can change without asking anyone.
The seeded deposit sets a starting depth. From that moment, any provider can add liquidity, earning a share of swap fees in exchange for holding both sides of a volatile pair. Any provider who added can withdraw. The seeded position itself is normally burned or locked and therefore stays, but it is only the floor, and everything above the floor is discretionary.
This produces a pattern worth expecting: depth often rises in the first hours as providers arrive to farm fees during the busiest period, then falls as those providers leave once activity subsides. A trader who calibrated their sizing during the busy window finds the same size behaving quite differently later, and concludes something changed about the token when what changed was the pool.
There is also an asymmetry inside the pool worth knowing. A constant-product pool cannot be fully drained on either side, because the product must stay constant, so the last tokens are arbitrarily expensive. What that means in practice is that a thin pool does not run out; it prices you out, which feels different and is worse, because the transaction succeeds.
The stitched chart and what it hides
Most charting tools present a graduated token as one continuous series. This is a reasonable product decision and a slightly dishonest picture. The left portion is derived from trades against the curve and the right portion from swaps against the pool, and the join is rendered as though it were a normal interval.
Three artefacts follow. First, the candle spanning the seam can look extreme, because it may include the last curve print and the first pool print with the discontinuity between them. Second, volume around the seam is not comparable across the join, because the two halves are counted by different indexers with different conventions about routed legs and both sides of a swap. Third, any indicator with a lookback window straddling the seam is averaging two different quantities and producing a number about nothing.
None of this is a reason to distrust charts generally. It is a reason to treat the seam as a marked boundary and to avoid reading anything across it. When somebody points at a dramatic candle at the moment of graduation as evidence of something, the first question is whether they are pointing at a market event or at a rendering of two mechanisms meeting.
Turnover without depth is unreadable
Turnover is a flow: value that moved through a pair over a window. Depth is a stock: value sitting in the pool right now. A flow figure without the stock it flowed against cannot be interpreted, and almost every surface that displays turnover omits depth entirely.
Consider the same turnover figure against two pools, one deep and one thin. In the deep pool it represents ordinary trading that barely moved price. In the thin pool it represents the reserve being cycled repeatedly, with large price swings and a small number of participants. The screener shows the same number for both, sorted into the same position on the same list.
The cheapest correction available is to divide turnover by depth, giving a rough turnover ratio that says how many times over the pool was traded through in the window. It is crude, it is not standard anywhere, and it separates the two cases above immediately. The second cheapest is to count distinct signers alongside turnover, which separates many participants trading small amounts from few participants cycling large ones.
This is also the honest test to apply to any tool that reports on produced activity. A figure that states its window, its venues, whether it counts both sides of a swap and whether routed legs are deduplicated can be checked against the chain. Teams comparing a professional Solana volume bot against a cheaper one usually find the difference is not the trading; it is whether the reporting is specified well enough to verify at all.
The first hour, mechanically
Several distinct things happen at once in the first hour, and separating them prevents most of the misreadings.
- Anybody who tracked the curve toward completion trades in the earliest slots, because on-chain state is public immediately.
- Arbitrage appears as soon as a second venue for the same mint exists, and it will keep prices roughly aligned across pools at a cost.
- Aggregators index the pool at different times, so quotes differ across front ends for a while and then converge.
- Liquidity providers arrive to capture fees during the busy window, raising depth, and some of them leave later, lowering it again.
- Charting sites begin their pool series, which is why some show a token as brand new when it has been trading for weeks.
- Routed swaps appear as multiple legs, so transaction counts and turnover both run higher than the number of user actions.
What to record at the seam
If you are going to analyse the transition afterwards, a handful of readings taken at the time are worth more than any amount of reconstruction later.
Record the migration slot and block time, which give you the exact boundary. Record both deposit amounts, which give you the opening price and the opening constant. Record the pool address and its program owner. Then take a depth reading at a few known intervals afterwards, because depth is the series nobody keeps and the one you will most want when trying to explain a fill somebody complains about.
None of this requires paid infrastructure. It requires deciding in advance that the readings matter, because they are cheap to take at the time and impossible to take retroactively once the state has moved on.
Questions the desk is sent
Why does the price change at migration?
Because the two venues use different pricing rules and there is no mechanism forcing them to agree. On the curve, price is the output of a function evaluated at the position reached. In the pool, price is the quote reserve divided by the base reserve, and those reserves are whatever the migration routine deposited. The opening pool price is a consequence of the deposit ratio, not a continuation of the curve.
Is the jump at the seam a real price move?
It is a real change in the price at which the token can be traded, and it is not a move produced by anybody trading. Nobody bought or sold to create it. That is why it is better described as a discontinuity than as a candle: the underlying quantity being plotted changed definition at that instant.
Why is slippage worse after migration?
It is not necessarily worse, it is differently determined. On a curve the cost of a given size follows from the function and is the same whenever you trade it. In a pool it depends on the depth present at that moment, so a trade that was cheap an hour ago can be expensive now if providers have withdrawn. The variance is the change people notice.
What is price impact, exactly?
The difference between the quoted price before your trade and the average price you actually pay, caused by your own trade moving the reserve ratio. It is not a fee and nobody collects it. It is the mechanical result of taking one asset out of a pool and putting another in, and it grows non-linearly with size relative to the reserve.
Can I calculate slippage before trading?
Yes, if you can read the pool reserves, because a constant-product quote is arithmetic on two numbers. In practice aggregators do this for you and return an expected output with a minimum acceptable output attached. The value of understanding the arithmetic is knowing when a quote is implausible rather than trusting it blindly.
Why do two sites show different prices for the same token?
Usually because they are reading different pools, or because one has not indexed the new pool and is still showing the last price it saw. After a migration both explanations are common at once. The reserves in a specific pool are the ground truth, and any displayed price is somebody derived reading of them.
Does high volume right after migration mean anything?
By itself, very little. The first minutes attract arbitrage between newly connected venues, routed legs that count as several swaps, and anyone who was waiting for the pool. Turnover measured without depth alongside it cannot distinguish a busy market from a small pool being cycled. Read the two together or read neither.
Filed under After by The Migration Desk. Program behaviour described here was read from public documentation or from transactions anyone can open in a block explorer; anything the desk worked out by watching is marked as inference where it appears. Launchpad parameters are operator-controlled and change, so no threshold, fee or duration is stated as a fixed number anywhere on this site. The standard is written out in what this desk does.