namespace BlueLaminate.Core.Tradeups; /// /// A skin that can come OUT of a tradeup, carrying the float bounds needed to map an /// input average float onto this skin's own wear range. /// is recorded so the listing-side query (Phase C) can filter ST vs non-ST outputs; /// the graph itself is ST-agnostic. /// public sealed record TradeupOutputSkin( int SkinId, string Name, decimal FloatMin, decimal FloatMax, bool StatTrakAvailable); /// /// One tradeup "recipe slot": all eligible input skins of a single rarity within one /// collection, and the set of output skins they produce (the next rarity tier present /// in that collection). For a single-collection contract, ten inputs are drawn from /// and each of is an equally likely /// outcome, so k_C = OutputSkins.Count. /// public sealed record TradeupInputGroup( int CollectionId, string CollectionName, WeaponRarity InputRarity, WeaponRarity OutputRarity, IReadOnlyList InputSkinIds, IReadOnlyList OutputSkins); /// /// The full tradeup reference graph derived from the static catalogue: every /// (collection, input rarity) → (output rarity, output skins) edge that yields a /// 10-input weapon tradeup. Built once per process from the monthly-synced catalogue /// (see ); contains no pricing or listing data. /// public sealed record TradeupGraph(IReadOnlyList Groups);