diff --git a/cairo_programs/cairo-1-contracts/random_ec_point.cairo b/cairo_programs/cairo-1-contracts/random_ec_point.cairo new file mode 100644 index 0000000000..d504c5e3ab --- /dev/null +++ b/cairo_programs/cairo-1-contracts/random_ec_point.cairo @@ -0,0 +1,27 @@ +#[contract] +mod RandomEcPoint{ + use option::OptionTrait; + use ec::ec_state_init; + use ec::ec_state_add; + use ec::ec_state_try_finalize_nz; + use ec::ec_point_from_x; + use ec::ec_point_non_zero; + use ec::ec_point_unwrap; + + // Test taken from https://github.com/starkware-libs/cairo/blob/a0ead7c0b8e297d281c7213151cd43ac11de5042/corelib/src/test/ec_test.cairo#L17 + #[external] + fn random_ec_point() -> felt252{ + let p = ec_point_from_x(1).unwrap(); + let p_nz = ec_point_non_zero(p); + + let mut state = ec_state_init(); + ec_state_add(ref state, p_nz); + + let q = ec_state_try_finalize_nz(state).expect('zero point'); + let (qx, qy) = ec_point_unwrap(q); + + assert(qx == 1, 'bad finalize x'); + qx + } + +} diff --git a/src/hint_processor/cairo_1_hint_processor/hint_processor.rs b/src/hint_processor/cairo_1_hint_processor/hint_processor.rs index 9c2c3c5b37..9698dcd779 100644 --- a/src/hint_processor/cairo_1_hint_processor/hint_processor.rs +++ b/src/hint_processor/cairo_1_hint_processor/hint_processor.rs @@ -465,15 +465,15 @@ impl Cairo1HintProcessor { x: &CellRef, y: &CellRef, ) -> Result<(), HintError> { - let value = res_operand_get_val(vm, value)?; - let scalar = res_operand_get_val(vm, scalar)?; - let max_x = res_operand_get_val(vm, max_x)?; + let value = res_operand_get_val(vm, value)?.to_biguint(); + let scalar = res_operand_get_val(vm, scalar)?.to_biguint(); + let max_x = res_operand_get_val(vm, max_x)?.to_biguint(); let x_value = (&value / &scalar).min(max_x); let y_value = value - &x_value * &scalar; - vm.insert_value(cell_ref_to_relocatable(x, vm)?, x_value) + vm.insert_value(cell_ref_to_relocatable(x, vm)?, Felt252::from(x_value)) .map_err(HintError::from)?; - vm.insert_value(cell_ref_to_relocatable(y, vm)?, y_value) + vm.insert_value(cell_ref_to_relocatable(y, vm)?, Felt252::from(y_value)) .map_err(HintError::from)?; Ok(()) diff --git a/src/tests/cairo_1_run_from_entrypoint_tests.rs b/src/tests/cairo_1_run_from_entrypoint_tests.rs index 6b52159700..d63984a83d 100644 --- a/src/tests/cairo_1_run_from_entrypoint_tests.rs +++ b/src/tests/cairo_1_run_from_entrypoint_tests.rs @@ -459,6 +459,14 @@ fn linear_split() { ); } +#[test] +#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] +fn random_ec_point() { + let program_data = + include_bytes!("../../cairo_programs/cairo-1-contracts/random_ec_point.casm"); + run_cairo_1_entrypoint(program_data.as_slice(), 0, &[], &[1.into()]); +} + #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn assert_le_find_small_arcs() {