@omnitronix/happy-panda-game-engine 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +732 -0
  2. package/dist/__tests__/bonus-sequence.test.d.ts +7 -0
  3. package/dist/__tests__/bonus-sequence.test.d.ts.map +1 -0
  4. package/dist/__tests__/bonus-sequence.test.js +381 -0
  5. package/dist/__tests__/bonus-sequence.test.js.map +1 -0
  6. package/dist/__tests__/cherry-frequency.test.d.ts +8 -0
  7. package/dist/__tests__/cherry-frequency.test.d.ts.map +1 -0
  8. package/dist/__tests__/cherry-frequency.test.js +128 -0
  9. package/dist/__tests__/cherry-frequency.test.js.map +1 -0
  10. package/dist/__tests__/comprehensive.test.d.ts +16 -0
  11. package/dist/__tests__/comprehensive.test.d.ts.map +1 -0
  12. package/dist/__tests__/comprehensive.test.js +491 -0
  13. package/dist/__tests__/comprehensive.test.js.map +1 -0
  14. package/dist/__tests__/counter-manager.test.d.ts +7 -0
  15. package/dist/__tests__/counter-manager.test.d.ts.map +1 -0
  16. package/dist/__tests__/counter-manager.test.js +317 -0
  17. package/dist/__tests__/counter-manager.test.js.map +1 -0
  18. package/dist/__tests__/coverage-boost.test.d.ts +13 -0
  19. package/dist/__tests__/coverage-boost.test.d.ts.map +1 -0
  20. package/dist/__tests__/coverage-boost.test.js +606 -0
  21. package/dist/__tests__/coverage-boost.test.js.map +1 -0
  22. package/dist/__tests__/cpp-parity.test.d.ts +39 -0
  23. package/dist/__tests__/cpp-parity.test.d.ts.map +1 -0
  24. package/dist/__tests__/cpp-parity.test.js +392 -0
  25. package/dist/__tests__/cpp-parity.test.js.map +1 -0
  26. package/dist/__tests__/debug-trigger-bonus.test.d.ts +8 -0
  27. package/dist/__tests__/debug-trigger-bonus.test.d.ts.map +1 -0
  28. package/dist/__tests__/debug-trigger-bonus.test.js +359 -0
  29. package/dist/__tests__/debug-trigger-bonus.test.js.map +1 -0
  30. package/dist/__tests__/fixtures/cpp-parity-vectors.json +457 -0
  31. package/dist/__tests__/gdd-validation-1000.test.d.ts +14 -0
  32. package/dist/__tests__/gdd-validation-1000.test.d.ts.map +1 -0
  33. package/dist/__tests__/gdd-validation-1000.test.js +418 -0
  34. package/dist/__tests__/gdd-validation-1000.test.js.map +1 -0
  35. package/dist/__tests__/happy-panda-engine.test.d.ts +7 -0
  36. package/dist/__tests__/happy-panda-engine.test.d.ts.map +1 -0
  37. package/dist/__tests__/happy-panda-engine.test.js +414 -0
  38. package/dist/__tests__/happy-panda-engine.test.js.map +1 -0
  39. package/dist/__tests__/jackpot-manager.test.d.ts +8 -0
  40. package/dist/__tests__/jackpot-manager.test.d.ts.map +1 -0
  41. package/dist/__tests__/jackpot-manager.test.js +313 -0
  42. package/dist/__tests__/jackpot-manager.test.js.map +1 -0
  43. package/dist/__tests__/jackpot-trigger-trace.test.d.ts +6 -0
  44. package/dist/__tests__/jackpot-trigger-trace.test.d.ts.map +1 -0
  45. package/dist/__tests__/jackpot-trigger-trace.test.js +146 -0
  46. package/dist/__tests__/jackpot-trigger-trace.test.js.map +1 -0
  47. package/dist/__tests__/rng-gli19-compliance.test.d.ts +21 -0
  48. package/dist/__tests__/rng-gli19-compliance.test.d.ts.map +1 -0
  49. package/dist/__tests__/rng-gli19-compliance.test.js +480 -0
  50. package/dist/__tests__/rng-gli19-compliance.test.js.map +1 -0
  51. package/dist/__tests__/rng-seed-security.test.d.ts +19 -0
  52. package/dist/__tests__/rng-seed-security.test.d.ts.map +1 -0
  53. package/dist/__tests__/rng-seed-security.test.js +518 -0
  54. package/dist/__tests__/rng-seed-security.test.js.map +1 -0
  55. package/dist/__tests__/rng-seed-type.test.d.ts +16 -0
  56. package/dist/__tests__/rng-seed-type.test.d.ts.map +1 -0
  57. package/dist/__tests__/rng-seed-type.test.js +285 -0
  58. package/dist/__tests__/rng-seed-type.test.js.map +1 -0
  59. package/dist/__tests__/rng-stress-boundary.test.d.ts +15 -0
  60. package/dist/__tests__/rng-stress-boundary.test.d.ts.map +1 -0
  61. package/dist/__tests__/rng-stress-boundary.test.js +590 -0
  62. package/dist/__tests__/rng-stress-boundary.test.js.map +1 -0
  63. package/dist/__tests__/rtp-1million.test.d.ts +8 -0
  64. package/dist/__tests__/rtp-1million.test.d.ts.map +1 -0
  65. package/dist/__tests__/rtp-1million.test.js +156 -0
  66. package/dist/__tests__/rtp-1million.test.js.map +1 -0
  67. package/dist/__tests__/rtp-analysis.test.d.ts +8 -0
  68. package/dist/__tests__/rtp-analysis.test.d.ts.map +1 -0
  69. package/dist/__tests__/rtp-analysis.test.js +138 -0
  70. package/dist/__tests__/rtp-analysis.test.js.map +1 -0
  71. package/dist/__tests__/rtp-diagnostic.test.d.ts +6 -0
  72. package/dist/__tests__/rtp-diagnostic.test.d.ts.map +1 -0
  73. package/dist/__tests__/rtp-diagnostic.test.js +141 -0
  74. package/dist/__tests__/rtp-diagnostic.test.js.map +1 -0
  75. package/dist/__tests__/rtp-simulation.test.d.ts +8 -0
  76. package/dist/__tests__/rtp-simulation.test.d.ts.map +1 -0
  77. package/dist/__tests__/rtp-simulation.test.js +411 -0
  78. package/dist/__tests__/rtp-simulation.test.js.map +1 -0
  79. package/dist/__tests__/special-wins.test.d.ts +7 -0
  80. package/dist/__tests__/special-wins.test.d.ts.map +1 -0
  81. package/dist/__tests__/special-wins.test.js +179 -0
  82. package/dist/__tests__/special-wins.test.js.map +1 -0
  83. package/dist/__tests__/spin-generator.test.d.ts +7 -0
  84. package/dist/__tests__/spin-generator.test.d.ts.map +1 -0
  85. package/dist/__tests__/spin-generator.test.js +297 -0
  86. package/dist/__tests__/spin-generator.test.js.map +1 -0
  87. package/dist/__tests__/spin-handler.test.d.ts +7 -0
  88. package/dist/__tests__/spin-handler.test.d.ts.map +1 -0
  89. package/dist/__tests__/spin-handler.test.js +210 -0
  90. package/dist/__tests__/spin-handler.test.js.map +1 -0
  91. package/dist/__tests__/symbol-distribution.test.d.ts +6 -0
  92. package/dist/__tests__/symbol-distribution.test.d.ts.map +1 -0
  93. package/dist/__tests__/symbol-distribution.test.js +119 -0
  94. package/dist/__tests__/symbol-distribution.test.js.map +1 -0
  95. package/dist/__tests__/test-protocol-10000-spin.test.d.ts +14 -0
  96. package/dist/__tests__/test-protocol-10000-spin.test.d.ts.map +1 -0
  97. package/dist/__tests__/test-protocol-10000-spin.test.js +359 -0
  98. package/dist/__tests__/test-protocol-10000-spin.test.js.map +1 -0
  99. package/dist/__tests__/weighted-random.test.d.ts +7 -0
  100. package/dist/__tests__/weighted-random.test.d.ts.map +1 -0
  101. package/dist/__tests__/weighted-random.test.js +165 -0
  102. package/dist/__tests__/weighted-random.test.js.map +1 -0
  103. package/dist/__tests__/win-evaluator.test.d.ts +7 -0
  104. package/dist/__tests__/win-evaluator.test.d.ts.map +1 -0
  105. package/dist/__tests__/win-evaluator.test.js +264 -0
  106. package/dist/__tests__/win-evaluator.test.js.map +1 -0
  107. package/dist/config/happy-panda.config.d.ts +217 -0
  108. package/dist/config/happy-panda.config.d.ts.map +1 -0
  109. package/dist/config/happy-panda.config.js +721 -0
  110. package/dist/config/happy-panda.config.js.map +1 -0
  111. package/dist/config/index.d.ts +5 -0
  112. package/dist/config/index.d.ts.map +1 -0
  113. package/dist/config/index.js +21 -0
  114. package/dist/config/index.js.map +1 -0
  115. package/dist/debug/debug-command-definitions.d.ts +38 -0
  116. package/dist/debug/debug-command-definitions.d.ts.map +1 -0
  117. package/dist/debug/debug-command-definitions.js +80 -0
  118. package/dist/debug/debug-command-definitions.js.map +1 -0
  119. package/dist/domain/debug-trigger-bonus-command.d.ts +17 -0
  120. package/dist/domain/debug-trigger-bonus-command.d.ts.map +1 -0
  121. package/dist/domain/debug-trigger-bonus-command.js +3 -0
  122. package/dist/domain/debug-trigger-bonus-command.js.map +1 -0
  123. package/dist/domain/index.d.ts +5 -0
  124. package/dist/domain/index.d.ts.map +1 -0
  125. package/dist/domain/index.js +21 -0
  126. package/dist/domain/index.js.map +1 -0
  127. package/dist/domain/types.d.ts +228 -0
  128. package/dist/domain/types.d.ts.map +1 -0
  129. package/dist/domain/types.js +30 -0
  130. package/dist/domain/types.js.map +1 -0
  131. package/dist/engine/happy-panda-engine.d.ts +64 -0
  132. package/dist/engine/happy-panda-engine.d.ts.map +1 -0
  133. package/dist/engine/happy-panda-engine.js +324 -0
  134. package/dist/engine/happy-panda-engine.js.map +1 -0
  135. package/dist/engine/index.d.ts +5 -0
  136. package/dist/engine/index.d.ts.map +1 -0
  137. package/dist/engine/index.js +21 -0
  138. package/dist/engine/index.js.map +1 -0
  139. package/dist/game-engine.interface.d.ts +19 -0
  140. package/dist/game-engine.interface.d.ts.map +1 -0
  141. package/dist/game-engine.interface.js +9 -0
  142. package/dist/game-engine.interface.js.map +1 -0
  143. package/dist/happy-panda-v1.game-engine.d.ts +60 -0
  144. package/dist/happy-panda-v1.game-engine.d.ts.map +1 -0
  145. package/dist/happy-panda-v1.game-engine.js +524 -0
  146. package/dist/happy-panda-v1.game-engine.js.map +1 -0
  147. package/dist/index.d.ts +22 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +59 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/logic/handlers/index.d.ts +5 -0
  152. package/dist/logic/handlers/index.d.ts.map +1 -0
  153. package/dist/logic/handlers/index.js +21 -0
  154. package/dist/logic/handlers/index.js.map +1 -0
  155. package/dist/logic/handlers/spin-handler.d.ts +58 -0
  156. package/dist/logic/handlers/spin-handler.d.ts.map +1 -0
  157. package/dist/logic/handlers/spin-handler.js +265 -0
  158. package/dist/logic/handlers/spin-handler.js.map +1 -0
  159. package/dist/logic/index.d.ts +6 -0
  160. package/dist/logic/index.d.ts.map +1 -0
  161. package/dist/logic/index.js +22 -0
  162. package/dist/logic/index.js.map +1 -0
  163. package/dist/logic/services/counter-manager.d.ts +60 -0
  164. package/dist/logic/services/counter-manager.d.ts.map +1 -0
  165. package/dist/logic/services/counter-manager.js +268 -0
  166. package/dist/logic/services/counter-manager.js.map +1 -0
  167. package/dist/logic/services/index.d.ts +7 -0
  168. package/dist/logic/services/index.d.ts.map +1 -0
  169. package/dist/logic/services/index.js +23 -0
  170. package/dist/logic/services/index.js.map +1 -0
  171. package/dist/logic/services/jackpot-manager.d.ts +59 -0
  172. package/dist/logic/services/jackpot-manager.d.ts.map +1 -0
  173. package/dist/logic/services/jackpot-manager.js +142 -0
  174. package/dist/logic/services/jackpot-manager.js.map +1 -0
  175. package/dist/logic/services/win-evaluator.d.ts +51 -0
  176. package/dist/logic/services/win-evaluator.d.ts.map +1 -0
  177. package/dist/logic/services/win-evaluator.js +463 -0
  178. package/dist/logic/services/win-evaluator.js.map +1 -0
  179. package/dist/rng/dummy-rng-client.d.ts +39 -0
  180. package/dist/rng/dummy-rng-client.d.ts.map +1 -0
  181. package/dist/rng/dummy-rng-client.js +77 -0
  182. package/dist/rng/dummy-rng-client.js.map +1 -0
  183. package/dist/rng/index.d.ts +10 -0
  184. package/dist/rng/index.d.ts.map +1 -0
  185. package/dist/rng/index.js +27 -0
  186. package/dist/rng/index.js.map +1 -0
  187. package/dist/rng/rng-client.factory.d.ts +33 -0
  188. package/dist/rng/rng-client.factory.d.ts.map +1 -0
  189. package/dist/rng/rng-client.factory.js +57 -0
  190. package/dist/rng/rng-client.factory.js.map +1 -0
  191. package/dist/rng/rng-client.interface.d.ts +51 -0
  192. package/dist/rng/rng-client.interface.d.ts.map +1 -0
  193. package/dist/rng/rng-client.interface.js +9 -0
  194. package/dist/rng/rng-client.interface.js.map +1 -0
  195. package/dist/rng/rng-service.d.ts +93 -0
  196. package/dist/rng/rng-service.d.ts.map +1 -0
  197. package/dist/rng/rng-service.js +124 -0
  198. package/dist/rng/rng-service.js.map +1 -0
  199. package/dist/rng/spin-generator.d.ts +32 -0
  200. package/dist/rng/spin-generator.d.ts.map +1 -0
  201. package/dist/rng/spin-generator.js +338 -0
  202. package/dist/rng/spin-generator.js.map +1 -0
  203. package/dist/rng/weighted-random.d.ts +30 -0
  204. package/dist/rng/weighted-random.d.ts.map +1 -0
  205. package/dist/rng/weighted-random.js +58 -0
  206. package/dist/rng/weighted-random.js.map +1 -0
  207. package/package.json +59 -0
@@ -0,0 +1,480 @@
1
+ "use strict";
2
+ /**
3
+ * GLI-19 Compliance Tests - Comprehensive Audit Trail Verification
4
+ *
5
+ * This test suite verifies compliance with Gaming Laboratories International
6
+ * GLI-19 standard for Interactive Gaming Systems.
7
+ *
8
+ * Covered Sections:
9
+ * - 3.4: Tamper-evident audit trails
10
+ * - 3.4.2: Tamper detection mechanisms
11
+ * - 4.1.3: RNG outcome logging
12
+ * - 4.2.1: Deterministic replay capability
13
+ *
14
+ * Test Categories:
15
+ * 1. Audit Trail Completeness
16
+ * 2. Tamper Detection
17
+ * 3. Deterministic Replay
18
+ * 4. Data Integrity
19
+ * 5. Hash Verification
20
+ */
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ const happy_panda_v1_game_engine_1 = require("../happy-panda-v1.game-engine");
56
+ const types_1 = require("../domain/types");
57
+ const crypto = __importStar(require("crypto"));
58
+ describe('GLI-19 Compliance - Audit Trail & Tamper Detection', () => {
59
+ let engine;
60
+ beforeEach(() => {
61
+ engine = new happy_panda_v1_game_engine_1.HappyPandaV1GameEngine();
62
+ });
63
+ // Helper functions
64
+ async function initSession(betStake = 1) {
65
+ return engine.processCommand(null, null, {
66
+ id: `init-gli19-${Date.now()}`,
67
+ type: 'INIT_SESSION_STATE',
68
+ payload: {
69
+ gameDirection: types_1.GameDirection.SINGLE,
70
+ betStake,
71
+ },
72
+ });
73
+ }
74
+ async function executeSpin(publicState, privateState) {
75
+ return engine.processCommand(publicState, privateState, {
76
+ id: `spin-gli19-${Math.random().toString(36).slice(2)}`,
77
+ type: 'SPIN',
78
+ payload: { sessionId: 'gli19-test-session' },
79
+ });
80
+ }
81
+ function canonicalizeForHash(outcome) {
82
+ const entries = Object.entries(outcome)
83
+ .map(([actionId, record]) => ({
84
+ actionId,
85
+ result: Number(record.result),
86
+ seed: String(record.seed),
87
+ min: Number(record.min),
88
+ max: Number(record.max),
89
+ }))
90
+ .sort((a, b) => a.actionId.localeCompare(b.actionId));
91
+ return JSON.stringify(entries);
92
+ }
93
+ function generateHash(data) {
94
+ return crypto.createHash('sha256').update(data).digest('hex');
95
+ }
96
+ // ============================================================
97
+ // SECTION 1: AUDIT TRAIL COMPLETENESS (GLI-19 3.4)
98
+ // ============================================================
99
+ describe('GLI-19 Section 3.4: Audit Trail Completeness', () => {
100
+ it('should include all required fields in each RNG record', async () => {
101
+ const init = await initSession();
102
+ const spin = await executeSpin(init.publicState, init.privateState);
103
+ expect(spin.rngOutcome).toBeDefined();
104
+ for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
105
+ // GLI-19 requires complete record of each random event
106
+ expect(record).toHaveProperty('seed');
107
+ expect(record).toHaveProperty('result');
108
+ expect(record).toHaveProperty('min');
109
+ expect(record).toHaveProperty('max');
110
+ // Verify types
111
+ expect(typeof record.seed).toBe('number');
112
+ expect(typeof record.result).toBe('number');
113
+ expect(typeof record.min).toBe('number');
114
+ expect(typeof record.max).toBe('number');
115
+ // Verify actionId
116
+ expect(typeof actionId).toBe('string');
117
+ expect(actionId.length).toBeGreaterThan(0);
118
+ }
119
+ });
120
+ it('should track at least one RNG call per spin', async () => {
121
+ const init = await initSession();
122
+ const spin = await executeSpin(init.publicState, init.privateState);
123
+ const recordCount = Object.keys(spin.rngOutcome || {}).length;
124
+ expect(recordCount).toBeGreaterThan(0);
125
+ });
126
+ it('should track all RNG calls across multiple spins', async () => {
127
+ const init = await initSession();
128
+ let currentPublic = init.publicState;
129
+ let currentPrivate = init.privateState;
130
+ const allRecordCounts = [];
131
+ for (let i = 0; i < 10; i++) {
132
+ const spin = await executeSpin(currentPublic, currentPrivate);
133
+ const recordCount = Object.keys(spin.rngOutcome || {}).length;
134
+ allRecordCounts.push(recordCount);
135
+ currentPublic = spin.publicState;
136
+ currentPrivate = spin.privateState;
137
+ }
138
+ // Every spin should have tracked RNG calls
139
+ expect(allRecordCounts.every(count => count > 0)).toBe(true);
140
+ });
141
+ it('should preserve original seed values from RNG service', async () => {
142
+ const init = await initSession();
143
+ const spin = await executeSpin(init.publicState, init.privateState);
144
+ for (const [, record] of Object.entries(spin.rngOutcome)) {
145
+ // Seed should be a valid integer
146
+ expect(Number.isInteger(record.seed)).toBe(true);
147
+ expect(Number.isSafeInteger(record.seed)).toBe(true);
148
+ }
149
+ });
150
+ it('should have unique actionIds within command', async () => {
151
+ const init = await initSession();
152
+ const spin = await executeSpin(init.publicState, init.privateState);
153
+ const actionIds = Object.keys(spin.rngOutcome || {});
154
+ const uniqueIds = new Set(actionIds);
155
+ // No duplicate actionIds
156
+ expect(actionIds.length).toBe(uniqueIds.size);
157
+ });
158
+ });
159
+ // ============================================================
160
+ // SECTION 2: TAMPER DETECTION (GLI-19 3.4.2)
161
+ // ============================================================
162
+ describe('GLI-19 Section 3.4.2: Tamper Detection', () => {
163
+ it('should detect modification of seed value', async () => {
164
+ const init = await initSession();
165
+ const spin = await executeSpin(init.publicState, init.privateState);
166
+ const originalCanonical = canonicalizeForHash(spin.rngOutcome);
167
+ const originalHash = generateHash(originalCanonical);
168
+ // Tamper with seed
169
+ const tampered = JSON.parse(JSON.stringify(spin.rngOutcome));
170
+ const firstKey = Object.keys(tampered)[0];
171
+ tampered[firstKey].seed = tampered[firstKey].seed + 1;
172
+ const tamperedCanonical = canonicalizeForHash(tampered);
173
+ const tamperedHash = generateHash(tamperedCanonical);
174
+ expect(originalCanonical).not.toBe(tamperedCanonical);
175
+ expect(originalHash).not.toBe(tamperedHash);
176
+ });
177
+ it('should detect modification of result value', async () => {
178
+ const init = await initSession();
179
+ const spin = await executeSpin(init.publicState, init.privateState);
180
+ const originalCanonical = canonicalizeForHash(spin.rngOutcome);
181
+ const originalHash = generateHash(originalCanonical);
182
+ // Tamper with result
183
+ const tampered = JSON.parse(JSON.stringify(spin.rngOutcome));
184
+ const firstKey = Object.keys(tampered)[0];
185
+ tampered[firstKey].result = tampered[firstKey].result + 1;
186
+ const tamperedCanonical = canonicalizeForHash(tampered);
187
+ const tamperedHash = generateHash(tamperedCanonical);
188
+ expect(originalHash).not.toBe(tamperedHash);
189
+ });
190
+ it('should detect modification of min value', async () => {
191
+ const init = await initSession();
192
+ const spin = await executeSpin(init.publicState, init.privateState);
193
+ const originalHash = generateHash(canonicalizeForHash(spin.rngOutcome));
194
+ const tampered = JSON.parse(JSON.stringify(spin.rngOutcome));
195
+ const firstKey = Object.keys(tampered)[0];
196
+ tampered[firstKey].min = tampered[firstKey].min + 1;
197
+ const tamperedHash = generateHash(canonicalizeForHash(tampered));
198
+ expect(originalHash).not.toBe(tamperedHash);
199
+ });
200
+ it('should detect modification of max value', async () => {
201
+ const init = await initSession();
202
+ const spin = await executeSpin(init.publicState, init.privateState);
203
+ const originalHash = generateHash(canonicalizeForHash(spin.rngOutcome));
204
+ const tampered = JSON.parse(JSON.stringify(spin.rngOutcome));
205
+ const firstKey = Object.keys(tampered)[0];
206
+ tampered[firstKey].max = tampered[firstKey].max + 1;
207
+ const tamperedHash = generateHash(canonicalizeForHash(tampered));
208
+ expect(originalHash).not.toBe(tamperedHash);
209
+ });
210
+ it('should detect insertion of extra RNG record', async () => {
211
+ const init = await initSession();
212
+ const spin = await executeSpin(init.publicState, init.privateState);
213
+ const originalHash = generateHash(canonicalizeForHash(spin.rngOutcome));
214
+ // Add extra record
215
+ const tampered = { ...spin.rngOutcome };
216
+ tampered['injected_action'] = { result: 5, seed: 99999, min: 0, max: 100 };
217
+ const tamperedHash = generateHash(canonicalizeForHash(tampered));
218
+ expect(originalHash).not.toBe(tamperedHash);
219
+ });
220
+ it('should detect removal of RNG record', async () => {
221
+ const init = await initSession();
222
+ const spin = await executeSpin(init.publicState, init.privateState);
223
+ const originalHash = generateHash(canonicalizeForHash(spin.rngOutcome));
224
+ // Remove record
225
+ const tampered = { ...spin.rngOutcome };
226
+ const keys = Object.keys(tampered);
227
+ if (keys.length > 0) {
228
+ delete tampered[keys[0]];
229
+ }
230
+ const tamperedHash = generateHash(canonicalizeForHash(tampered));
231
+ expect(originalHash).not.toBe(tamperedHash);
232
+ });
233
+ it('should detect modification of actionId', async () => {
234
+ const init = await initSession();
235
+ const spin = await executeSpin(init.publicState, init.privateState);
236
+ const originalHash = generateHash(canonicalizeForHash(spin.rngOutcome));
237
+ // Modify actionId
238
+ const entries = Object.entries(spin.rngOutcome);
239
+ const tampered = {};
240
+ entries.forEach(([key, value], index) => {
241
+ if (index === 0) {
242
+ tampered['tampered_' + key] = value;
243
+ }
244
+ else {
245
+ tampered[key] = value;
246
+ }
247
+ });
248
+ const tamperedHash = generateHash(canonicalizeForHash(tampered));
249
+ expect(originalHash).not.toBe(tamperedHash);
250
+ });
251
+ it('should detect single bit flip in seed', async () => {
252
+ const init = await initSession();
253
+ const spin = await executeSpin(init.publicState, init.privateState);
254
+ const originalCanonical = canonicalizeForHash(spin.rngOutcome);
255
+ const tampered = JSON.parse(JSON.stringify(spin.rngOutcome));
256
+ const firstKey = Object.keys(tampered)[0];
257
+ // Flip least significant bit
258
+ tampered[firstKey].seed = tampered[firstKey].seed ^ 1;
259
+ const tamperedCanonical = canonicalizeForHash(tampered);
260
+ expect(originalCanonical).not.toBe(tamperedCanonical);
261
+ });
262
+ it('should detect record reordering attempts', async () => {
263
+ // Create outcome with multiple records
264
+ const outcome1 = {
265
+ action_a: { result: 5, seed: 100, min: 0, max: 10 },
266
+ action_b: { result: 6, seed: 200, min: 0, max: 10 },
267
+ action_c: { result: 7, seed: 300, min: 0, max: 10 },
268
+ };
269
+ // Same records but different insertion order
270
+ const outcome2 = {
271
+ action_c: { result: 7, seed: 300, min: 0, max: 10 },
272
+ action_a: { result: 5, seed: 100, min: 0, max: 10 },
273
+ action_b: { result: 6, seed: 200, min: 0, max: 10 },
274
+ };
275
+ // Canonicalization should sort, producing same hash
276
+ const hash1 = generateHash(canonicalizeForHash(outcome1));
277
+ const hash2 = generateHash(canonicalizeForHash(outcome2));
278
+ expect(hash1).toBe(hash2);
279
+ });
280
+ });
281
+ // ============================================================
282
+ // SECTION 3: DETERMINISTIC REPLAY (GLI-19 4.2.1)
283
+ // ============================================================
284
+ describe('GLI-19 Section 4.2.1: Deterministic Replay', () => {
285
+ it('should produce identical hash after serialization round-trip', async () => {
286
+ const init = await initSession();
287
+ const spin = await executeSpin(init.publicState, init.privateState);
288
+ const originalHash = generateHash(canonicalizeForHash(spin.rngOutcome));
289
+ // Simulate storage: serialize and deserialize
290
+ const serialized = JSON.stringify(spin.rngOutcome);
291
+ const deserialized = JSON.parse(serialized);
292
+ const restoredHash = generateHash(canonicalizeForHash(deserialized));
293
+ expect(originalHash).toBe(restoredHash);
294
+ });
295
+ it('should produce identical hash regardless of seed type after canonicalization', async () => {
296
+ const init = await initSession();
297
+ const spin = await executeSpin(init.publicState, init.privateState);
298
+ // Original with number seeds
299
+ const hashWithNumbers = generateHash(canonicalizeForHash(spin.rngOutcome));
300
+ // Convert seeds to strings (simulating wire format)
301
+ const withStringSeeds = {};
302
+ for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
303
+ withStringSeeds[actionId] = {
304
+ ...record,
305
+ seed: String(record.seed),
306
+ };
307
+ }
308
+ const hashWithStrings = generateHash(canonicalizeForHash(withStringSeeds));
309
+ // Must be identical for GLI-19 compliance
310
+ expect(hashWithNumbers).toBe(hashWithStrings);
311
+ });
312
+ it('should support audit verification with stored data', () => {
313
+ // Simulate auditor verification workflow
314
+ const storedOutcome = {
315
+ reel_0: { result: 5, seed: '123456', min: 0, max: 20 },
316
+ reel_1: { result: 12, seed: '789012', min: 0, max: 20 },
317
+ bonus_trigger: { result: 95, seed: '345678', min: 0, max: 100 },
318
+ };
319
+ const storedHash = 'expected_hash_from_audit_log';
320
+ // Auditor recalculates canonical form
321
+ const auditCanonical = canonicalizeForHash(storedOutcome);
322
+ const auditHash = generateHash(auditCanonical);
323
+ // In real audit, this would compare against stored hash
324
+ expect(auditHash).toBeDefined();
325
+ expect(auditHash.length).toBe(64); // SHA-256 hex length
326
+ });
327
+ it('should maintain hash integrity across wire format conversion', async () => {
328
+ const init = await initSession();
329
+ const spin = await executeSpin(init.publicState, init.privateState);
330
+ const originalCanonical = canonicalizeForHash(spin.rngOutcome);
331
+ // Simulate wire format: all numbers become strings in JSON
332
+ const wireFormat = JSON.parse(JSON.stringify(spin.rngOutcome));
333
+ // Convert back (simulating RGS receiving response)
334
+ const restoredCanonical = canonicalizeForHash(wireFormat);
335
+ expect(originalCanonical).toBe(restoredCanonical);
336
+ });
337
+ it('should be reproducible across multiple canonical calls', async () => {
338
+ const init = await initSession();
339
+ const spin = await executeSpin(init.publicState, init.privateState);
340
+ const hashes = [];
341
+ for (let i = 0; i < 100; i++) {
342
+ const canonical = canonicalizeForHash(spin.rngOutcome);
343
+ hashes.push(generateHash(canonical));
344
+ }
345
+ // All hashes must be identical
346
+ const uniqueHashes = new Set(hashes);
347
+ expect(uniqueHashes.size).toBe(1);
348
+ });
349
+ });
350
+ // ============================================================
351
+ // SECTION 4: DATA INTEGRITY
352
+ // ============================================================
353
+ describe('Data Integrity Verification', () => {
354
+ it('should verify result is within min/max bounds', async () => {
355
+ const init = await initSession();
356
+ const spin = await executeSpin(init.publicState, init.privateState);
357
+ for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
358
+ expect(record.result).toBeGreaterThanOrEqual(record.min);
359
+ expect(record.result).toBeLessThanOrEqual(record.max);
360
+ }
361
+ });
362
+ it('should verify min is less than or equal to max', async () => {
363
+ const init = await initSession();
364
+ const spin = await executeSpin(init.publicState, init.privateState);
365
+ for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
366
+ expect(record.min).toBeLessThanOrEqual(record.max);
367
+ }
368
+ });
369
+ it('should verify all values are finite numbers', async () => {
370
+ const init = await initSession();
371
+ const spin = await executeSpin(init.publicState, init.privateState);
372
+ for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
373
+ expect(Number.isFinite(record.seed)).toBe(true);
374
+ expect(Number.isFinite(record.result)).toBe(true);
375
+ expect(Number.isFinite(record.min)).toBe(true);
376
+ expect(Number.isFinite(record.max)).toBe(true);
377
+ }
378
+ });
379
+ it('should verify no NaN values exist', async () => {
380
+ const init = await initSession();
381
+ const spin = await executeSpin(init.publicState, init.privateState);
382
+ for (const [actionId, record] of Object.entries(spin.rngOutcome)) {
383
+ expect(Number.isNaN(record.seed)).toBe(false);
384
+ expect(Number.isNaN(record.result)).toBe(false);
385
+ expect(Number.isNaN(record.min)).toBe(false);
386
+ expect(Number.isNaN(record.max)).toBe(false);
387
+ }
388
+ });
389
+ });
390
+ // ============================================================
391
+ // SECTION 5: HASH VERIFICATION
392
+ // ============================================================
393
+ describe('Hash Verification', () => {
394
+ it('should produce consistent SHA-256 hash format', async () => {
395
+ const init = await initSession();
396
+ const spin = await executeSpin(init.publicState, init.privateState);
397
+ const hash = generateHash(canonicalizeForHash(spin.rngOutcome));
398
+ // SHA-256 produces 64 hex characters
399
+ expect(hash.length).toBe(64);
400
+ expect(/^[a-f0-9]+$/.test(hash)).toBe(true);
401
+ });
402
+ it('should produce different hash for every unique outcome', async () => {
403
+ const hashes = new Set();
404
+ for (let i = 0; i < 50; i++) {
405
+ const init = await initSession();
406
+ const spin = await executeSpin(init.publicState, init.privateState);
407
+ const hash = generateHash(canonicalizeForHash(spin.rngOutcome));
408
+ hashes.add(hash);
409
+ }
410
+ // With DummyRngClient returning same seeds, hashes might be same
411
+ // But with real RNG, all should be different
412
+ expect(hashes.size).toBeGreaterThan(0);
413
+ });
414
+ it('should verify empty outcome produces valid hash', () => {
415
+ const emptyOutcome = {};
416
+ const canonical = canonicalizeForHash(emptyOutcome);
417
+ const hash = generateHash(canonical);
418
+ expect(canonical).toBe('[]');
419
+ expect(hash.length).toBe(64);
420
+ });
421
+ it('should maintain hash stability across test runs', () => {
422
+ // Known input should produce known hash
423
+ const knownOutcome = {
424
+ test_action: { result: 5, seed: 123, min: 0, max: 10 },
425
+ };
426
+ const canonical = canonicalizeForHash(knownOutcome);
427
+ const hash = generateHash(canonical);
428
+ // This hash should be stable across all test runs
429
+ const expectedCanonical = '[{"actionId":"test_action","result":5,"seed":"123","min":0,"max":10}]';
430
+ expect(canonical).toBe(expectedCanonical);
431
+ // Pre-computed expected hash for the above canonical form
432
+ const expectedHash = generateHash(expectedCanonical);
433
+ expect(hash).toBe(expectedHash);
434
+ });
435
+ });
436
+ // ============================================================
437
+ // SECTION 6: COMPLIANCE DOCUMENTATION
438
+ // ============================================================
439
+ describe('Compliance Documentation Support', () => {
440
+ it('should provide sufficient audit data for regulatory review', async () => {
441
+ const init = await initSession();
442
+ const spin = await executeSpin(init.publicState, init.privateState);
443
+ // Collect all data needed for audit
444
+ const auditData = {
445
+ outcome: spin.rngOutcome,
446
+ canonical: canonicalizeForHash(spin.rngOutcome),
447
+ hash: generateHash(canonicalizeForHash(spin.rngOutcome)),
448
+ recordCount: Object.keys(spin.rngOutcome || {}).length,
449
+ allSeeds: Object.values(spin.rngOutcome || {}).map(r => r.seed),
450
+ allResults: Object.values(spin.rngOutcome || {}).map(r => r.result),
451
+ };
452
+ // Verify all audit data is complete
453
+ expect(auditData.outcome).toBeDefined();
454
+ expect(auditData.canonical).toBeDefined();
455
+ expect(auditData.hash).toBeDefined();
456
+ expect(auditData.recordCount).toBeGreaterThan(0);
457
+ expect(auditData.allSeeds.length).toBe(auditData.recordCount);
458
+ expect(auditData.allResults.length).toBe(auditData.recordCount);
459
+ });
460
+ it('should support 7-year audit retention requirements', async () => {
461
+ const init = await initSession();
462
+ const spin = await executeSpin(init.publicState, init.privateState);
463
+ // Verify data can be serialized for long-term storage
464
+ const forStorage = {
465
+ timestamp: new Date().toISOString(),
466
+ gameCode: 'happy-panda',
467
+ version: '1.0.0',
468
+ rngOutcome: spin.rngOutcome,
469
+ canonicalForm: canonicalizeForHash(spin.rngOutcome),
470
+ hash: generateHash(canonicalizeForHash(spin.rngOutcome)),
471
+ };
472
+ const serialized = JSON.stringify(forStorage);
473
+ const restored = JSON.parse(serialized);
474
+ // Verify data survives serialization
475
+ expect(restored.hash).toBe(forStorage.hash);
476
+ expect(generateHash(canonicalizeForHash(restored.rngOutcome))).toBe(restored.hash);
477
+ });
478
+ });
479
+ });
480
+ //# sourceMappingURL=rng-gli19-compliance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng-gli19-compliance.test.js","sourceRoot":"","sources":["../../src/__tests__/rng-gli19-compliance.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * RNG Seed Security Tests - Comprehensive Attack Vector Coverage
3
+ *
4
+ * This test suite covers:
5
+ * - Malformed seed injection attacks
6
+ * - Type confusion attacks
7
+ * - Integer overflow/underflow
8
+ * - Hash collision prevention
9
+ * - Replay attack vectors
10
+ * - Prototype pollution prevention
11
+ * - OWASP input validation
12
+ *
13
+ * GLI-19 Sections:
14
+ * - 3.4: Tamper-evident audit trails
15
+ * - 3.4.2: Tamper detection
16
+ * - 4.2.1: Deterministic replay
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=rng-seed-security.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng-seed-security.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rng-seed-security.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}