@rolly-dev/wasm-signer 1.5.1 → 1.9.0

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.
@@ -26,6 +26,17 @@ export function compute_address_hash(address_hex: string): BigUint64Array;
26
26
  */
27
27
  export function compute_multi_dice(win_numbers: number): bigint;
28
28
 
29
+ /**
30
+ * Full coinflip payout computation — pure integer arithmetic, zero floats.
31
+ *
32
+ * `random`: 4 Goldilocks field elements (Poseidon2 output).
33
+ * `bet_atomic`: bet in atomic units (1 USDT = 1_000_000).
34
+ * `prediction`: 0 or 1.
35
+ *
36
+ * Returns `BigUint64Array[4]`: `[win_amount, roll (0|1), is_win (0|1), multiplier×10000]`.
37
+ */
38
+ export function compute_payout_coinflip(random: BigUint64Array, bet_atomic: bigint, prediction: number): BigUint64Array;
39
+
29
40
  /**
30
41
  * Full dice payout computation — pure integer arithmetic, zero floats.
31
42
  *
@@ -51,6 +62,26 @@ export function compute_payout_dice(random: BigUint64Array, bet_atomic: bigint,
51
62
  */
52
63
  export function compute_payout_plinko(random: BigUint64Array, bet_atomic: bigint, sector: number, rows: number, is_extreme: boolean): BigUint64Array;
53
64
 
65
+ /**
66
+ * Compute prediction hash: `Poseidon2(game_id, p0, p1, p2)` → 4 field elements.
67
+ *
68
+ * Matches `compute_prediction_hash_native` in the circuit (`games/shared.rs`)
69
+ * and the in-circuit `build_prediction_hash`.
70
+ *
71
+ * Semantics of p0–p2 depend on the game:
72
+ * Dice: `(mode, pred_lo, pred_hi)`
73
+ * Plinko: `(sector, rows, is_extreme)`
74
+ * CoinFlip: `(prediction, 0, 0)`
75
+ */
76
+ export function compute_prediction_hash(game_id: number, p0: number, p1: number, p2: number): BigUint64Array;
77
+
78
+ /**
79
+ * Extract coinflip roll (0 or 1) from Poseidon2 random output.
80
+ *
81
+ * `random` must be exactly 4 elements. Returns `random[0] % 2`.
82
+ */
83
+ export function compute_roll_coinflip(random: BigUint64Array): number;
84
+
54
85
  /**
55
86
  * Extract dice roll number [0, 1000) from Poseidon2 random output.
56
87
  *
@@ -79,6 +110,19 @@ export function compute_roll_plinko(random: BigUint64Array, rows: number): numbe
79
110
  */
80
111
  export function compute_server_seed_hash(server_seed: BigUint64Array): BigUint64Array;
81
112
 
113
+ /**
114
+ * Compute user seed with bet-parameter binding:
115
+ * `Poseidon2(game_id, bet, pred_hash[4], secret[4])` → 4 field elements.
116
+ *
117
+ * Matches the circuit constraint in `slot/fairness.rs`.
118
+ * Prevents the operator from swapping bet parameters after the user commits.
119
+ *
120
+ * `bet` is the full bet amount in atomic units (u64).
121
+ * `pred_hash` must be 4 elements (output of `compute_prediction_hash`).
122
+ * `secret` must be 4 elements (output of `generate_user_secret`).
123
+ */
124
+ export function compute_user_seed_binding(game_id: number, bet: bigint, pred_hash: BigUint64Array, secret: BigUint64Array): BigUint64Array;
125
+
82
126
  /**
83
127
  * Derive a session key from 32 bytes of entropy (e.g. MetaMask signature).
84
128
  *
@@ -97,6 +141,19 @@ export function compute_server_seed_hash(server_seed: BigUint64Array): BigUint64
97
141
  */
98
142
  export function derive_session_key(sig_bytes: Uint8Array): BigUint64Array;
99
143
 
144
+ /**
145
+ * Generate a cryptographically random user secret — 4 Goldilocks field elements.
146
+ *
147
+ * Each element is reduced mod p for canonical representation (safe for circuit use).
148
+ * Uses `getrandom` (`crypto.getRandomValues` in browser, OS entropy in Node.js).
149
+ *
150
+ * ```js
151
+ * const secret = generate_user_secret();
152
+ * // secret.length === 4, each < GOLDILOCKS_P
153
+ * ```
154
+ */
155
+ export function generate_user_secret(): BigUint64Array;
156
+
100
157
  /**
101
158
  * Generate a random user seed — 10 alphanumeric characters.
102
159
  *
@@ -63,6 +63,36 @@ function compute_multi_dice(win_numbers) {
63
63
  }
64
64
  exports.compute_multi_dice = compute_multi_dice;
65
65
 
66
+ /**
67
+ * Full coinflip payout computation — pure integer arithmetic, zero floats.
68
+ *
69
+ * `random`: 4 Goldilocks field elements (Poseidon2 output).
70
+ * `bet_atomic`: bet in atomic units (1 USDT = 1_000_000).
71
+ * `prediction`: 0 or 1.
72
+ *
73
+ * Returns `BigUint64Array[4]`: `[win_amount, roll (0|1), is_win (0|1), multiplier×10000]`.
74
+ * @param {BigUint64Array} random
75
+ * @param {bigint} bet_atomic
76
+ * @param {number} prediction
77
+ * @returns {BigUint64Array}
78
+ */
79
+ function compute_payout_coinflip(random, bet_atomic, prediction) {
80
+ try {
81
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
82
+ const ptr0 = passArray64ToWasm0(random, wasm.__wbindgen_export3);
83
+ const len0 = WASM_VECTOR_LEN;
84
+ wasm.compute_payout_coinflip(retptr, ptr0, len0, bet_atomic, prediction);
85
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
86
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
87
+ var v2 = getArrayU64FromWasm0(r0, r1).slice();
88
+ wasm.__wbindgen_export2(r0, r1 * 8, 8);
89
+ return v2;
90
+ } finally {
91
+ wasm.__wbindgen_add_to_stack_pointer(16);
92
+ }
93
+ }
94
+ exports.compute_payout_coinflip = compute_payout_coinflip;
95
+
66
96
  /**
67
97
  * Full dice payout computation — pure integer arithmetic, zero floats.
68
98
  *
@@ -130,6 +160,52 @@ function compute_payout_plinko(random, bet_atomic, sector, rows, is_extreme) {
130
160
  }
131
161
  exports.compute_payout_plinko = compute_payout_plinko;
132
162
 
163
+ /**
164
+ * Compute prediction hash: `Poseidon2(game_id, p0, p1, p2)` → 4 field elements.
165
+ *
166
+ * Matches `compute_prediction_hash_native` in the circuit (`games/shared.rs`)
167
+ * and the in-circuit `build_prediction_hash`.
168
+ *
169
+ * Semantics of p0–p2 depend on the game:
170
+ * Dice: `(mode, pred_lo, pred_hi)`
171
+ * Plinko: `(sector, rows, is_extreme)`
172
+ * CoinFlip: `(prediction, 0, 0)`
173
+ * @param {number} game_id
174
+ * @param {number} p0
175
+ * @param {number} p1
176
+ * @param {number} p2
177
+ * @returns {BigUint64Array}
178
+ */
179
+ function compute_prediction_hash(game_id, p0, p1, p2) {
180
+ try {
181
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
182
+ wasm.compute_prediction_hash(retptr, game_id, p0, p1, p2);
183
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
184
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
185
+ var v1 = getArrayU64FromWasm0(r0, r1).slice();
186
+ wasm.__wbindgen_export2(r0, r1 * 8, 8);
187
+ return v1;
188
+ } finally {
189
+ wasm.__wbindgen_add_to_stack_pointer(16);
190
+ }
191
+ }
192
+ exports.compute_prediction_hash = compute_prediction_hash;
193
+
194
+ /**
195
+ * Extract coinflip roll (0 or 1) from Poseidon2 random output.
196
+ *
197
+ * `random` must be exactly 4 elements. Returns `random[0] % 2`.
198
+ * @param {BigUint64Array} random
199
+ * @returns {number}
200
+ */
201
+ function compute_roll_coinflip(random) {
202
+ const ptr0 = passArray64ToWasm0(random, wasm.__wbindgen_export3);
203
+ const len0 = WASM_VECTOR_LEN;
204
+ const ret = wasm.compute_roll_coinflip(ptr0, len0);
205
+ return ret >>> 0;
206
+ }
207
+ exports.compute_roll_coinflip = compute_roll_coinflip;
208
+
133
209
  /**
134
210
  * Extract dice roll number [0, 1000) from Poseidon2 random output.
135
211
  *
@@ -192,6 +268,41 @@ function compute_server_seed_hash(server_seed) {
192
268
  }
193
269
  exports.compute_server_seed_hash = compute_server_seed_hash;
194
270
 
271
+ /**
272
+ * Compute user seed with bet-parameter binding:
273
+ * `Poseidon2(game_id, bet, pred_hash[4], secret[4])` → 4 field elements.
274
+ *
275
+ * Matches the circuit constraint in `slot/fairness.rs`.
276
+ * Prevents the operator from swapping bet parameters after the user commits.
277
+ *
278
+ * `bet` is the full bet amount in atomic units (u64).
279
+ * `pred_hash` must be 4 elements (output of `compute_prediction_hash`).
280
+ * `secret` must be 4 elements (output of `generate_user_secret`).
281
+ * @param {number} game_id
282
+ * @param {bigint} bet
283
+ * @param {BigUint64Array} pred_hash
284
+ * @param {BigUint64Array} secret
285
+ * @returns {BigUint64Array}
286
+ */
287
+ function compute_user_seed_binding(game_id, bet, pred_hash, secret) {
288
+ try {
289
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
290
+ const ptr0 = passArray64ToWasm0(pred_hash, wasm.__wbindgen_export3);
291
+ const len0 = WASM_VECTOR_LEN;
292
+ const ptr1 = passArray64ToWasm0(secret, wasm.__wbindgen_export3);
293
+ const len1 = WASM_VECTOR_LEN;
294
+ wasm.compute_user_seed_binding(retptr, game_id, bet, ptr0, len0, ptr1, len1);
295
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
296
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
297
+ var v3 = getArrayU64FromWasm0(r0, r1).slice();
298
+ wasm.__wbindgen_export2(r0, r1 * 8, 8);
299
+ return v3;
300
+ } finally {
301
+ wasm.__wbindgen_add_to_stack_pointer(16);
302
+ }
303
+ }
304
+ exports.compute_user_seed_binding = compute_user_seed_binding;
305
+
195
306
  /**
196
307
  * Derive a session key from 32 bytes of entropy (e.g. MetaMask signature).
197
308
  *
@@ -227,6 +338,33 @@ function derive_session_key(sig_bytes) {
227
338
  }
228
339
  exports.derive_session_key = derive_session_key;
229
340
 
341
+ /**
342
+ * Generate a cryptographically random user secret — 4 Goldilocks field elements.
343
+ *
344
+ * Each element is reduced mod p for canonical representation (safe for circuit use).
345
+ * Uses `getrandom` (`crypto.getRandomValues` in browser, OS entropy in Node.js).
346
+ *
347
+ * ```js
348
+ * const secret = generate_user_secret();
349
+ * // secret.length === 4, each < GOLDILOCKS_P
350
+ * ```
351
+ * @returns {BigUint64Array}
352
+ */
353
+ function generate_user_secret() {
354
+ try {
355
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
356
+ wasm.generate_user_secret(retptr);
357
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
358
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
359
+ var v1 = getArrayU64FromWasm0(r0, r1).slice();
360
+ wasm.__wbindgen_export2(r0, r1 * 8, 8);
361
+ return v1;
362
+ } finally {
363
+ wasm.__wbindgen_add_to_stack_pointer(16);
364
+ }
365
+ }
366
+ exports.generate_user_secret = generate_user_secret;
367
+
230
368
  /**
231
369
  * Generate a random user seed — 10 alphanumeric characters.
232
370
  *
Binary file
@@ -4,12 +4,17 @@ export const memory: WebAssembly.Memory;
4
4
  export const amount_split: (a: number, b: bigint) => void;
5
5
  export const compute_address_hash: (a: number, b: number, c: number) => void;
6
6
  export const compute_multi_dice: (a: number) => bigint;
7
+ export const compute_payout_coinflip: (a: number, b: number, c: number, d: bigint, e: number) => void;
7
8
  export const compute_payout_dice: (a: number, b: number, c: number, d: bigint, e: number, f: number, g: number) => void;
8
9
  export const compute_payout_plinko: (a: number, b: number, c: number, d: bigint, e: number, f: number, g: number) => void;
10
+ export const compute_prediction_hash: (a: number, b: number, c: number, d: number, e: number) => void;
11
+ export const compute_roll_coinflip: (a: number, b: number) => number;
9
12
  export const compute_roll_dice: (a: number, b: number) => number;
10
13
  export const compute_roll_plinko: (a: number, b: number, c: number) => number;
11
14
  export const compute_server_seed_hash: (a: number, b: number, c: number) => void;
15
+ export const compute_user_seed_binding: (a: number, b: number, c: bigint, d: number, e: number, f: number, g: number) => void;
12
16
  export const derive_session_key: (a: number, b: number, c: number) => void;
17
+ export const generate_user_secret: (a: number) => void;
13
18
  export const generate_user_seed: (a: number) => void;
14
19
  export const goldilocks_fields_to_hex: (a: number, b: number, c: number) => void;
15
20
  export const goldilocks_reduce: (a: bigint) => bigint;
@@ -26,6 +26,17 @@ export function compute_address_hash(address_hex: string): BigUint64Array;
26
26
  */
27
27
  export function compute_multi_dice(win_numbers: number): bigint;
28
28
 
29
+ /**
30
+ * Full coinflip payout computation — pure integer arithmetic, zero floats.
31
+ *
32
+ * `random`: 4 Goldilocks field elements (Poseidon2 output).
33
+ * `bet_atomic`: bet in atomic units (1 USDT = 1_000_000).
34
+ * `prediction`: 0 or 1.
35
+ *
36
+ * Returns `BigUint64Array[4]`: `[win_amount, roll (0|1), is_win (0|1), multiplier×10000]`.
37
+ */
38
+ export function compute_payout_coinflip(random: BigUint64Array, bet_atomic: bigint, prediction: number): BigUint64Array;
39
+
29
40
  /**
30
41
  * Full dice payout computation — pure integer arithmetic, zero floats.
31
42
  *
@@ -51,6 +62,26 @@ export function compute_payout_dice(random: BigUint64Array, bet_atomic: bigint,
51
62
  */
52
63
  export function compute_payout_plinko(random: BigUint64Array, bet_atomic: bigint, sector: number, rows: number, is_extreme: boolean): BigUint64Array;
53
64
 
65
+ /**
66
+ * Compute prediction hash: `Poseidon2(game_id, p0, p1, p2)` → 4 field elements.
67
+ *
68
+ * Matches `compute_prediction_hash_native` in the circuit (`games/shared.rs`)
69
+ * and the in-circuit `build_prediction_hash`.
70
+ *
71
+ * Semantics of p0–p2 depend on the game:
72
+ * Dice: `(mode, pred_lo, pred_hi)`
73
+ * Plinko: `(sector, rows, is_extreme)`
74
+ * CoinFlip: `(prediction, 0, 0)`
75
+ */
76
+ export function compute_prediction_hash(game_id: number, p0: number, p1: number, p2: number): BigUint64Array;
77
+
78
+ /**
79
+ * Extract coinflip roll (0 or 1) from Poseidon2 random output.
80
+ *
81
+ * `random` must be exactly 4 elements. Returns `random[0] % 2`.
82
+ */
83
+ export function compute_roll_coinflip(random: BigUint64Array): number;
84
+
54
85
  /**
55
86
  * Extract dice roll number [0, 1000) from Poseidon2 random output.
56
87
  *
@@ -79,6 +110,19 @@ export function compute_roll_plinko(random: BigUint64Array, rows: number): numbe
79
110
  */
80
111
  export function compute_server_seed_hash(server_seed: BigUint64Array): BigUint64Array;
81
112
 
113
+ /**
114
+ * Compute user seed with bet-parameter binding:
115
+ * `Poseidon2(game_id, bet, pred_hash[4], secret[4])` → 4 field elements.
116
+ *
117
+ * Matches the circuit constraint in `slot/fairness.rs`.
118
+ * Prevents the operator from swapping bet parameters after the user commits.
119
+ *
120
+ * `bet` is the full bet amount in atomic units (u64).
121
+ * `pred_hash` must be 4 elements (output of `compute_prediction_hash`).
122
+ * `secret` must be 4 elements (output of `generate_user_secret`).
123
+ */
124
+ export function compute_user_seed_binding(game_id: number, bet: bigint, pred_hash: BigUint64Array, secret: BigUint64Array): BigUint64Array;
125
+
82
126
  /**
83
127
  * Derive a session key from 32 bytes of entropy (e.g. MetaMask signature).
84
128
  *
@@ -97,6 +141,19 @@ export function compute_server_seed_hash(server_seed: BigUint64Array): BigUint64
97
141
  */
98
142
  export function derive_session_key(sig_bytes: Uint8Array): BigUint64Array;
99
143
 
144
+ /**
145
+ * Generate a cryptographically random user secret — 4 Goldilocks field elements.
146
+ *
147
+ * Each element is reduced mod p for canonical representation (safe for circuit use).
148
+ * Uses `getrandom` (`crypto.getRandomValues` in browser, OS entropy in Node.js).
149
+ *
150
+ * ```js
151
+ * const secret = generate_user_secret();
152
+ * // secret.length === 4, each < GOLDILOCKS_P
153
+ * ```
154
+ */
155
+ export function generate_user_secret(): BigUint64Array;
156
+
100
157
  /**
101
158
  * Generate a random user seed — 10 alphanumeric characters.
102
159
  *