Тут ещё большая проблема...
Если не брать простые рынки, типа аутрайтов (просто список исходов, один из них победит) и best-of (конечное число возможных вариантов) и думать о футболах/баскетболах, то возникает большая проблема в количестве данных.
Тот же футбол нужно построить матрицу... ну хотя бы 25-30 элементов... Да, ещё будет элемент "неуказанный счёт", ну это ладно, это не страшно.
Страшно то, что при ставке на группировку "больше 0.5" нам нужно разбить ставку между всеми исходами. кроме одного "0-0". Это значит, что нужно обновить данные в десятках, а для больших матриц в сотнях ячеек.
Это стоит дорого, это стоит газ, это БУДЕТ стоить дешевле, но сейчас это тупо дорого. Сейчас поэкспериментировал с "плотными" структурами, никакого толка не оказалось, solidity достаточно жёстко привязан к базовым 32байтовым структурам. То есть деваться некуда, надо платить.
То есть наша матрица плюс-минус жёстко ограничена размером в 100 элементов. Этого более чем достаточно для футбола, в принципе достаточно для хоккея, наверное достаточно для бейсбола...
Но в пролёте оказывается баскетбол, в пролёте оказывается ставки на количество убийств в доте, в пролёте любые матчи, где средняя результативность команды больше 15 очков...
И я просто не вижу сейчас способов решить эту проблему. Чтобы оперировать большими (100+ исходов) матрицами, нужно эти 100 плюс исходов инициализировать и обновлять. Инициализация 20 000 газа за одну ячейку, обновление 5 тысяч. И никуда ты не денешься. Ладно, при создании матча не жалко, пусть платят, там даже по текущим ценам это будет стоить 5-10 долларов максимум... А вот накладные расходы при ставке в 1-2 доллара.. как-то неправильно, дорого. Ладно, допустим, что это не проблема. эфир2 поможет сделать транзакции дешевле.
Но это расходы для матрицы на 100 исходов, а что будет для баскетбола, где по-хорошему нужна 1000, если не придумывать группировки? Значит ли это, что мы не можем создавать матрицы для большого разброса счетов? А что можем?
В общем надо подумать... Я сильно надеялся, что упаковка данных может как-то помочь, но нет, не помогает. Если тебе надо сохранить 100 значений - тебе надо заплатить за 100 uint256 значений, изворачиваться с упаковками бесполезно, так как ОБНОВЛЕНИЕ, а это самое главное, стоит столько же или БОЛЬШЕ.
Значит извращаться не будем, храним распределение в uint256, это сильно упрощает код, но что же делать с матрицами...