CS2Price › Blog › Trade-up contracts
Category: Trade-up contractsCS2Price · 2026-07-22 · 6 min read · 82 views · 💬 1 ·

A trade-up contract is the only CS2 mechanic that turns 10 skins of one rarity into a single skin of the next rarity up. The game picks the outcome at random, but the odds and prices are known in advance — so a contract can be calculated before you press the button. Below: exactly how, which numbers actually matter, and a live example priced on our current data.
Each input skin brings into the draw every next-rarity skin from its own collection. All resulting tickets are equally likely. So the chance of a specific outcome is the number of your inputs from its collection divided by the total ticket count: P = countC / Σ (counti × Ki), where K is how many next-rarity skins collection i has. If all ten inputs come from one collection with two outcomes, each drops at 50%.
This is where half the guides get it wrong. Before the 18 October 2019 patch the rule was "collection first, then a skin inside it": (count/10) × (1/K). For a single collection, and for mixes where collections have the same number of outcomes, both formulas agree — which is why the error goes unnoticed for years. But take a 1+9 mix where the first collection has 2 outcomes and the second has 5: the old formula promises 5% per outcome from the first, while the real chance is 2/47, about 4.3%. On an expensive target that gap matters.
The second source of confusion is the output wear. It isn't random. Each input is first normalised on its own float range: (float − min) / (max − min). The ten resulting numbers are averaged, and the average is stretched onto the range of the skin that dropped: floatout = avgNorm × (max − min) + min.
The practical takeaway matters more than the formula: each input is normalised separately. A skin with a 0–0.5 range at float 0.25 gives a normalised 0.5 — exactly the same as a 0–1 skin at float 0.5. So "a cheap input with a small number on the tag" and "an input that pulls the average down" are not the same thing, and comparing inputs by raw float is meaningless.
Contract profit = (expected value of the output) − (cost of the 10 inputs). Expected value = the sum over outcomes of price × probability. A detail usually skipped: the outcome price must be taken net, minus the fee of the marketplace you'll sell on. Our calculation assumes 5% by default — on markets charging 12–13% a paper-positive contract easily lands at zero.
EV alone isn't enough: it tells you the long-run average and nothing about a single spin. That's why every contract card carries three more numbers next to it.
Take The Dreams & Nightmares collection. Its Mil-Spec skins cost pennies — here are two of the cheapest inputs, priced live from our database across all markets:
Ten such inputs cost a few dozen roubles, while the outcomes are Restricted skins from the same collection, each worth noticeably more than the whole basket. I deliberately avoid writing the exact figures in prose: they change daily, and the blocks above and the button below show current ones. The point of the example is its structure: even the worst outcome beats the inputs — that's a guaranteed-profit contract.
No manual math needed — press the button below: the constructor assembles ten Dreams & Nightmares inputs and shows every outcome, its odds, EV and profit chance on live prices. The constructor is a club section; what's free and what isn't is laid out in the step-by-step contract guide with screenshots.
The easiest entry point is a collection: look at which Mil-Specs are cheap and which Restricted outcomes are expensive. Collection pages are open to everyone and list every item by rarity with a price per wear — convenient for spotting the skew by eye. Here's the collection from the example above:
Going through 110 collections by hand is an evening's work, so the engine does it: it recalculates every possible build on current prices and keeps the result in the database. Right now that's about 1,600 contracts, roughly 160 of them with a positive worst outcome. The top of the list is on the public profitable contracts page; the full feed with filters and sorting is in the club.
After that it's practice: work through collections, catch price skews, build a low normalised float. The engine does the math, and the bell tells you when an input you need suddenly got cheaper.