Swap size on a curve: deriving a band from the depth in front of it
A swap size is not a preference and it is not a division of the budget. It is a statement about the reserve the trade will be priced against, which means the same number is a conservative choice at one depth and an aggressive one at another.
Swap size is derived from the reserve a trade will be priced against, not from the budget behind it. Two rules produce the band: a cost rule that sets a floor where fixed costs stop being a rounding error, and an impact rule that sets a ceiling where a fill moves the quote enough to price the campaign's own next trade. Both ends move as the curve fills, which is why the band is re-derived at every depth rather than configured once.
Size is chosen against what sits in front of it
On a bonding curve the price of a fill is a function of what the program is holding. There is no order book to absorb a trade and no counterparty deciding whether to take it; the mechanism prices it against its own reserve and updates. That makes size a relative quantity in a way it is not on a deep, established pair, where a modest trade genuinely disappears into the book.
The consequence is that the useful unit is not SOL. It is the share of the reserve a fill represents. A 0.2 SOL trade against a 20 SOL reserve is one percent of the mechanism; the same trade against a 200 SOL reserve is a tenth of that. The absolute number is identical and the behaviour is not remotely comparable, which is why plans that carry a size field between phases produce results nobody can explain.
Writing the depth down first is therefore not a formality. One sentence - the reserve in front of the trade, and the share a fill at the intended size represents - is the input every other line in this note depends on. Skipping it means the band that follows is derived against nothing.
The two limits that define a band
The floor comes from cost. Every fill carries costs that do not scale with size: the base network fee, the priority fee offered for inclusion, and any per-transaction overhead the setup imposes. Against a large trade those are noise. Against a small one they are the trade. The floor is wherever the plan decides that ratio stops being acceptable, expressed as a rule such as fixed cost must remain under some percentage of notional.
The ceiling comes from impact. A fill moves the quote, and the next fill is priced at the moved quote. A campaign sending consecutive same-direction fills at a size that visibly moves the mechanism is buying from itself at progressively worse levels. The ceiling is wherever the plan decides that movement per fill stops being acceptable, expressed as a rule such as no single fill may represent more than some percentage of the reserve.
Both rules are choices, and stating them as choices is what makes the resulting band defensible. Neither is a law, neither is published anywhere, and any page presenting a specific percentage as an industry standard has made it up. What is not a choice is that the two rules exist and that the band lives between them.
The same size at three depths
| Depth | Share of reserve per fill | What the record shows | Where the cost goes |
|---|---|---|---|
| Shallow | Large: the fill is a visible fraction of the mechanism | A staircase, with each fill priced above the last | Into slippage the campaign created for itself |
| Medium | Moderate: the fill moves the quote slightly | Movement that accumulates over a run rather than per fill | Split between slippage and fixed cost |
| Deep | Small: the fill barely registers against the reserve | Turnover with little directional effect | Almost entirely into fixed cost per fill |
The row that catches people out is the last one. A size that was carefully derived when the reserve was small is, at depth, a small trade with a fixed cost attached, and a campaign running hundreds of them is mostly buying transactions. The record looks busy and the allocation drains into overhead, which is a failure that never shows up as an error anywhere.
The first row catches a different group. Carrying a deep-water size backwards into a shallow reserve produces exactly the staircase that operators complain about when they say a run moved the price and then gave it back. Nothing malfunctioned. The size was correct for a mechanism that was not the one in front of it.
Deriving the band in five moves
- Observe the reserveTake the depth in front of the trade as a number, from the mechanism rather than from memory, and note when it was taken.
- State the cost ruleA maximum share of notional that fixed costs may represent. Write the assumed fixed cost per fill next to it, because the rule is meaningless without it.
- State the impact ruleA maximum share of the reserve a single fill may represent. This is where the plan's tolerance for movement gets written down.
- Compute floor and ceilingFloor from the cost rule and the fixed cost assumption; ceiling from the impact rule and the observed reserve. Check that the floor is below the ceiling; if it is not, the depth cannot support the cost structure and something else has to change.
- Choose the distributionHow sizes are drawn between the two ends. This is a separate decision from the band itself and it changes the record more than the band width does.
The failure case in the fourth move deserves attention because plans rarely anticipate it. If the fixed cost per fill is high enough and the reserve shallow enough, the cost rule and the impact rule can cross, and there is no size that satisfies both. That is real information: it means the phase cannot be run economically at the current cost level, and the honest responses are to wait, to relax one of the two rules explicitly, or to not run the phase.
Worked arithmetic: one rule set, three depths
The figures below are illustrative arithmetic, chosen to show how a single rule set produces three different bands. They describe no real token, reserve or run.
Illustrative only
Fixed cost assumption per fill: 0.0005 SOL.
Cost rule: fixed cost under 1 percent of notional. Floor = 0.0005 / 0.01 = 0.05 SOL.
Impact rule: no fill above 0.5 percent of the reserve.
Depth A, reserve 20 SOL: ceiling = 0.10 SOL. Band 0.05 to 0.10, ratio 2 to 1.
Depth B, reserve 80 SOL: ceiling = 0.40 SOL. Band 0.05 to 0.40, ratio 8 to 1.
Depth C, reserve 320 SOL: ceiling = 1.60 SOL. Band 0.05 to 1.60, ratio 32 to 1.
Same allocation of 16 SOL at each depth, sampling the midpoint of the band:
Depth A midpoint 0.075: 213 fills, fixed cost 0.107 SOL.
Depth B midpoint 0.225: 71 fills, fixed cost 0.036 SOL.
Depth C midpoint 0.825: 19 fills, fixed cost 0.010 SOL.
Three observations fall out of that block. The floor never moved, because it depends on the cost assumption rather than on depth. The ceiling scaled with the reserve, so the band widened by a factor of sixteen across the three depths. And the total fixed cost of the same allocation fell by a factor of ten as fills got larger, which is the quiet argument for re-deriving upward as depth grows.
The fourth observation is the one that changes plans: at depth C the band is so wide that the midpoint is an arbitrary choice. A 32-to-1 range needs a stated distribution, because the difference between clustering near the floor and clustering near the ceiling is a difference of roughly an order of magnitude in trade count for the same allocation. The band alone stops being a sufficient specification once it is that wide.
Distribution inside the band
A band is a range; a distribution is how sizes are drawn from it. Three shapes cover most plans, and each produces a recognisably different record at the same cost.
| Shape | Where fills cluster | Effect on trade count | What it accepts |
|---|---|---|---|
| Uniform | Evenly across the whole band | Predictable, close to the midpoint average | A flat distribution is itself an unusual shape |
| Weighted low | Most fills near the floor, a few near the ceiling | High, with fixed cost a larger share of spend | More transactions, more fee exposure, a busier record |
| Weighted high | Most fills near the ceiling, a few small | Low, with slippage a larger share of spend | Fewer, more conspicuous fills and more movement per fill |
Weighted-low is the shape most plans end up with by accident, because operators nervous about impact set a low midpoint and never state a distribution. It is a legitimate choice, but it should be a choice: it converts allocation into transaction count, which raises the fixed-cost share and produces the busiest possible record for a given spend.
The counter-intuitive point is that the distribution matters more than the width. Two campaigns with identical bands and different distributions produce different trade counts, different cost structures and different records. Two campaigns with different bands and the same distribution shape mostly differ in scale. Writing the distribution into the block is therefore not a detail.
Cost per swap and what it does to the floor
The floor is a function of the fixed cost assumption, so anything that changes fixed costs changes the floor and invalidates every size below the new one. Base fees, priority fee offers and any per-transaction overhead all feed this number, and the fee model that governs them is documented in the Solana documentation rather than being a property of a tool.
Account-level costs belong here too. An account has to hold a minimum balance to remain alive, and where a campaign creates accounts as part of its setup that cost is real even though it is not a fee. The rules are set out in the Solana program documentation, and the practical effect is that the spendable part of an allocation is smaller than the allocation, which pushes the effective floor up.
Beyond protocol costs there is whatever the execution layer charges, and that is the component operators most often leave out of the floor calculation entirely. A per-swap fee changes the cost rule directly: it raises fixed cost per fill, raises the floor, and narrows the band from below. Working through the whole stack once - network, priority, mechanism spread and platform - is the only way the floor means anything, and consoles that publish a full Solana volume bot cost breakdown make that arithmetic checkable rather than assumed.
Round trips and paying twice
A round trip is two fills, and both legs pay. If the campaign buys and later sells the same notional, it pays fixed cost twice, mechanism spread twice, and slippage in both directions - and on a curve the second leg is priced against a reserve the first leg moved. Sizing a round trip as if it were one trade understates its cost by more than a factor of two.
This is where the impact rule earns its keep. A fill at the ceiling moves the quote by the maximum the plan tolerates, and if the return leg follows quickly it executes against that moved quote. Two fills at half the ceiling, spaced apart, cost the same in notional and considerably less in self-inflicted slippage, which is an argument for the ceiling being a hard limit rather than a target.
The cleanest way to keep this honest is to write the round-trip cost as a line in the block: two fixed costs, two spreads, plus an allowance for movement between the legs. Where a volume bot for a Pump.fun curve executes both legs automatically, that arithmetic still has to exist somewhere; automation changes who presses the button, not what the round trip costs.
How a band goes stale without anyone touching it
A band is a snapshot of two ratios, and both drift. The reserve grows as the curve fills, which raises the ceiling and makes the configured band conservative. Network conditions change, which moves fixed cost and therefore the floor. Neither drift produces an error message, and both leave the configuration file looking exactly as it did.
The defence is a re-derivation trigger written into the block: recompute the band after a stated amount of gross flow, or whenever the assumed fixed cost is observed to be materially wrong. Tying it to flow rather than to the clock means the check happens when something has actually changed.
Verifying the assumption is a matter of reading the record rather than trusting the plan. Per-transaction costs and fill sizes are visible for any signing account through a public explorer such as the Solana explorer, and comparing a handful of real fills against the assumptions in the block is a five-minute check that catches a stale floor before it has consumed a phase.
The size band checklist
- The reserve in front of the trade is written down as a number with a timestamp.
- The cost rule is stated as a share of notional, with the fixed cost assumption next to it.
- The impact rule is stated as a share of the reserve.
- Floor and ceiling were computed from those rules, and the floor is below the ceiling.
- If the two rules cross, the block says what changed rather than quietly picking a size.
- A distribution shape is named, not left to whatever the tool draws by default.
- Trade count and total fixed cost were computed from the distribution, not from the midpoint alone.
- Round-trip cost is a line in the block, counted as two legs.
- A re-derivation trigger exists and is tied to gross flow rather than to elapsed time.
- A sample of real fills is checked against the fixed cost assumption during the phase.
What swap size does not control
Size does not control the cadence. Trade count falls out of size and allocation, and the interval falls out of trade count and phase length, so changing the band moves the cadence as a side effect. Operators who adjust size to fix a pacing problem are changing two things and observing one, which is how a block stops being explicable.
It does not fix concentration either. A well-derived band executed from four accounts still produces a record dominated by four accounts, and the width of the band has no bearing on that. Footprint is a wallet decision, and reaching for the size field to solve it is a category error.
And it does not make the record look unplanned. A stated distribution inside a derived band produces sizes with a describable shape, because that is what the specification asks for. Deriving the band properly makes a campaign cheaper, more explicable and easier to defend at the close. It does not make it invisible, and nothing on this page claims otherwise.
The same questions, asked at this depth
Is there a correct swap size?
Not independently of depth. The band is derived from the reserve in front of the trade and from two tolerance rules the plan states. Change the depth and the same rules produce a different band without anyone changing their mind.
Why not just divide the budget by the number of trades?
Because that derives size from the budget, which knows nothing about the mechanism. The budget decides how many trades you can afford at a given size; it does not decide what size is appropriate for the depth.
Does the distribution inside the band matter?
More than the average does. A band with every fill near the midpoint produces a very different record than the same band sampled across its full width, and the two cost roughly the same.
What raises the floor of the band?
Anything that raises the fixed cost of a fill: higher base fees, higher priority fee offers, additional account setup. When fixed costs rise, small trades stop clearing the cost rule and the floor moves up.
What lowers the ceiling?
A shallower reserve, or a tighter tolerance for movement per fill. Both are legitimate reasons to trade smaller, and both should be written as a rule rather than applied as a feeling.
How often should a band be re-derived?
Whenever the depth it was derived against has changed materially, and at every phase boundary as a matter of course. A band is a snapshot of a ratio, and the ratio moves as the curve fills.
Filed under Parameters and written by The Curve Campaign Desk. Ranges on this page exist to show which direction a trade-off runs; the phase decides the value, and every figure inside a worked block is illustrative arithmetic that describes no real token. What this desk does and does not cover is set out on the desk page.