{
  "group": "jcs",
  "protocol": 1,
  "description": "RFC 8785 sample §3.2.2-3.2.4, key order by UTF-16, our conditions with Cyrillic. Protocol files: numbers only as digit tokens, no repeated keys (compared after unescaping), no BOM, no lone surrogates or noncharacters, only JSON whitespace after the value; entries.jsonl lines are exactly JCS.",
  "cases": [
    {
      "name": "rfc8785_sample",
      "input_json_text": "{\"numbers\":[333333333.33333329,1E30,4.50,2e-3,0.000000000000000000000000001],\"string\":\"\\u20ac$\\u000F\\u000aA'\\u0042\\u0022\\u005c\\\\\\\"\\/\",\"literals\":[null,true,false]}",
      "expected_canonical": "{\"literals\":[null,true,false],\"numbers\":[333333333.3333333,1e+30,4.5,0.002,1e-27],\"string\":\"€$\\u000f\\nA'B\\\"\\\\\\\\\\\"/\"}",
      "expected_utf8_hex": "7b226c69746572616c73223a5b6e756c6c2c747275652c66616c73655d2c226e756d62657273223a5b3333333333333333332e333333333333332c31652b33302c342e352c302e3030322c31652d32375d2c22737472696e67223a22e282ac245c75303030665c6e4127425c225c5c5c5c5c222f227d",
      "note": "RFC sample has floats: JCS itself handles them, protocol files never carry them"
    },
    {
      "name": "conditions_with_cyrillic",
      "input": {
        "v": 1,
        "type": "conditions",
        "service": "vec-service",
        "draw": "vec-stream-1",
        "version": 1,
        "organizer": "Тестовый канал",
        "title": "Розыгрыш гарнитуры среди зрителей",
        "rules_ack": [
          "free_participation",
          "prize_from_organizer"
        ],
        "network": {
          "chain_hash": "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971",
          "public_key": "83cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a",
          "scheme": "bls-unchained-g1-rfc9380",
          "period": 3,
          "genesis": 1692803367
        },
        "open_at": "2026-10-16T11:50:00.000Z",
        "close_at": "2026-10-16T11:59:00.000Z",
        "margin_s": 60,
        "round": 33116213,
        "round_time": "2026-10-16T12:00:03.000Z",
        "commitment": "285754267832da358512cf05a5c2507644a07af9abab11d9bec4045b88a1cc71",
        "reveal_deadline": "2026-10-16T12:02:03.000Z",
        "salt_commit": "271137340c8a436f4e4b0c9a9b5bf098d3127cb8532c7a3dc9eb5ae2ca8a8837",
        "min_participants": 1,
        "min_duration_s": 60,
        "chances_max": 1,
        "formula": {
          "name": "draw-v1",
          "population": "entries",
          "winners": 1,
          "alternates": 2,
          "one_prize_per_subject": true
        },
        "kind": "free_draw",
        "surface": "stream",
        "participation": "free",
        "prize_provider": "streamer",
        "prize": {
          "text": "Игровая гарнитура",
          "count": 1
        }
      },
      "expected_canonical": "{\"chances_max\":1,\"close_at\":\"2026-10-16T11:59:00.000Z\",\"commitment\":\"285754267832da358512cf05a5c2507644a07af9abab11d9bec4045b88a1cc71\",\"draw\":\"vec-stream-1\",\"formula\":{\"alternates\":2,\"name\":\"draw-v1\",\"one_prize_per_subject\":true,\"population\":\"entries\",\"winners\":1},\"kind\":\"free_draw\",\"margin_s\":60,\"min_duration_s\":60,\"min_participants\":1,\"network\":{\"chain_hash\":\"52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971\",\"genesis\":1692803367,\"period\":3,\"public_key\":\"83cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a\",\"scheme\":\"bls-unchained-g1-rfc9380\"},\"open_at\":\"2026-10-16T11:50:00.000Z\",\"organizer\":\"Тестовый канал\",\"participation\":\"free\",\"prize\":{\"count\":1,\"text\":\"Игровая гарнитура\"},\"prize_provider\":\"streamer\",\"reveal_deadline\":\"2026-10-16T12:02:03.000Z\",\"round\":33116213,\"round_time\":\"2026-10-16T12:00:03.000Z\",\"rules_ack\":[\"free_participation\",\"prize_from_organizer\"],\"salt_commit\":\"271137340c8a436f4e4b0c9a9b5bf098d3127cb8532c7a3dc9eb5ae2ca8a8837\",\"service\":\"vec-service\",\"surface\":\"stream\",\"title\":\"Розыгрыш гарнитуры среди зрителей\",\"type\":\"conditions\",\"v\":1,\"version\":1}",
      "expected_utf8_hex": "7b226368616e6365735f6d6178223a312c22636c6f73655f6174223a22323032362d31302d31365431313a35393a30302e3030305a222c22636f6d6d69746d656e74223a2232383537353432363738333264613335383531326366303561356332353037363434613037616639616261623131643962656334303435623838613163633731222c2264726177223a227665632d73747265616d2d31222c22666f726d756c61223a7b22616c7465726e61746573223a322c226e616d65223a22647261772d7631222c226f6e655f7072697a655f7065725f7375626a656374223a747275652c22706f70756c6174696f6e223a22656e7472696573222c2277696e6e657273223a317d2c226b696e64223a22667265655f64726177222c226d617267696e5f73223a36302c226d696e5f6475726174696f6e5f73223a36302c226d696e5f7061727469636970616e7473223a312c226e6574776f726b223a7b22636861696e5f68617368223a2235326462396261373065306363306636656166373830336464303734343761316635343737373335666433663636313739326261393436303063383465393731222c2267656e65736973223a313639323830333336372c22706572696f64223a332c227075626c69635f6b6579223a22383363663066323839366164656537656238623566303166636164333931323231326334333765303037336539313166623930303232643365373630313833633863346234353062366130613663336163366135373736613264313036343531306431666563373538633932316363323262306531376536336161663462636235656436363330346465396366383039626432373463613733626162346166356136653963373661346263303965373665616538393931656635656365343561222c22736368656d65223a22626c732d756e636861696e65642d67312d72666339333830227d2c226f70656e5f6174223a22323032362d31302d31365431313a35303a30302e3030305a222c226f7267616e697a6572223a22d0a2d0b5d181d182d0bed0b2d18bd0b920d0bad0b0d0bdd0b0d0bb222c2270617274696369706174696f6e223a2266726565222c227072697a65223a7b22636f756e74223a312c2274657874223a22d098d0b3d180d0bed0b2d0b0d18f20d0b3d0b0d180d0bdd0b8d182d183d180d0b0227d2c227072697a655f70726f7669646572223a2273747265616d6572222c2272657665616c5f646561646c696e65223a22323032362d31302d31365431323a30323a30332e3030305a222c22726f756e64223a33333131363231332c22726f756e645f74696d65223a22323032362d31302d31365431323a30303a30332e3030305a222c2272756c65735f61636b223a5b22667265655f70617274696369706174696f6e222c227072697a655f66726f6d5f6f7267616e697a6572225d2c2273616c745f636f6d6d6974223a2232373131333733343063386134333666346534623063396139623562663039386433313237636238353332633761336463396562356165326361386138383337222c2273657276696365223a227665632d73657276696365222c2273757266616365223a2273747265616d222c227469746c65223a22d0a0d0bed0b7d18bd0b3d180d18bd18820d0b3d0b0d180d0bdd0b8d182d183d180d18b20d181d180d0b5d0b4d0b820d0b7d180d0b8d182d0b5d0bbd0b5d0b9222c2274797065223a22636f6e646974696f6e73222c2276223a312c2276657273696f6e223a317d",
      "expected_sha256": "467f97cad6856fd4be8991d4244d3c29cf7f99f052685e5ba6c372fbe825e924"
    },
    {
      "name": "key_order_utf16",
      "input_json_text": "{\"\\u20ac\":1,\"\\r\":2,\"\\ufb33\":3,\"1\":4,\"\\ud83d\\ude00\":5,\"\\u0080\":6,\"\\u00f6\":7}",
      "expected_canonical": "{\"\\r\":2,\"1\":4,\"\":6,\"ö\":7,\"€\":1,\"😀\":5,\"דּ\":3}"
    },
    {
      "name": "strict_protocol_json",
      "cases": [
        {
          "text": "{\"v\":1,\"chances\":1}",
          "expected_valid": true
        },
        {
          "text": "{\"v\":1,\"chances\":1.0}",
          "expected_valid": false
        },
        {
          "text": "{\"v\":1,\"n\":1e2}",
          "expected_valid": false
        },
        {
          "text": "{\"v\":1,\"n\":-1}",
          "expected_valid": false
        },
        {
          "text": "{\"a\":1,\"a\":2}",
          "expected_valid": false
        },
        {
          "text": "{\"s\":\"\\ud800\"}",
          "expected_valid": false
        },
        {
          "text": "﻿{\"v\":1}",
          "expected_valid": false
        },
        {
          "text": "{\"n\":9007199254740992}",
          "expected_valid": false
        },
        {
          "text": "{\"__proto__\":{\"x\":1}}",
          "expected_valid": true
        },
        {
          "text": "{\"v\":1} \n",
          "expected_valid": true
        },
        {
          "text": "{\"a\":1,\"\\u0061\":2}",
          "expected_valid": false
        },
        {
          "text": "{\"s\":\"\\ufdd0\"}",
          "expected_valid": false
        },
        {
          "text": "{\"s\":\"\\ud83f\\udfff\"}",
          "expected_valid": false
        }
      ]
    },
    {
      "name": "entries_jsonl_lines_canonical",
      "cases": [
        {
          "text": "{\"a\":1}\n{\"b\":2}\n",
          "expected_valid": true
        },
        {
          "text": "{\"a\": 1}\n",
          "expected_valid": false
        },
        {
          "text": "{\"b\":2,\"a\":1}\n",
          "expected_valid": false
        },
        {
          "text": "{\"a\":1}",
          "expected_valid": false
        }
      ]
    }
  ]
}
