Skip to content

Commit 99fe909

Browse files
cptarturmkaput
andauthored
Make oracles support not experimental (#3926)
Closes #3732 commit-id:cf38af52 --- **Stack**: - #3926 ⬅ - #3925 - #3850 - #3849 - #3848 - #3847 ⚠️ *Part of a stack created by [spr](https://github.com/ejoffe/spr). Do not merge manually using the UI - doing so may have unexpected results.* --------- Co-authored-by: Marek Kaput <[email protected]>
1 parent b6f2f59 commit 99fe909

File tree

33 files changed

+685
-83
lines changed

33 files changed

+685
-83
lines changed

.github/actions/setup-tools/action.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ inputs:
1010
description: 'Whether to setup scarb'
1111
required: false
1212
default: 'true'
13+
scarb-version:
14+
description: 'Optional: Scarb version to install. If not set, uses version from .tool-versions'
15+
required: false
16+
default: ''
1317
setup-usc:
1418
description: 'Whether to setup universal-sierra-compiler'
1519
required: false
@@ -24,6 +28,8 @@ runs:
2428

2529
- uses: software-mansion/setup-scarb@v1
2630
if: ${{ inputs.setup-scarb == 'true' }}
31+
with:
32+
scarb-version: ${{ inputs.scarb-version }}
2733

2834
- uses: software-mansion/setup-universal-sierra-compiler@v1
2935
if: ${{ inputs.setup-usc == 'true' }}

.github/workflows/ci.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,16 @@ jobs:
259259
- name: Run Data Transformer tests
260260
run: cargo test --profile ci -p data-transformer
261261

262+
test-forge-oracles:
263+
name: Test Oracles in Forge
264+
runs-on: ubuntu-latest
265+
steps:
266+
- uses: actions/checkout@v5
267+
- uses: ./.github/actions/setup-tools
268+
with:
269+
scarb-version: '2.13.1'
270+
- run: cargo test --profile ci -p forge --features run_test_for_scarb_since_2_13_1 e2e::oracles
271+
262272
test-forge-scarb-plugin:
263273
name: Test Forge Scarb Plugin
264274
runs-on: ubuntu-latest

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
#### Fixed
1313

1414
- Cheatcodes are now reflected in called contract, when directly using a library call from test code
15+
- Oracles are fully supported for Scarb versions >= 2.13.1. Bugs related to oracles' output handling have been fixed.
16+
Removed the `--experimental-oracles` flag.`
1517

1618
### Cast
1719

@@ -26,7 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2628

2729
#### Fixed
2830

29-
- Restored missing `command` missing from some responses when using `--json` output format.
31+
- Restored missing `command` missing from some responses when using `--json` output format.
3032

3133
## [0.53.0] - 2025-11-24
3234

crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/execution_info.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ use cairo_vm::{
33
types::relocatable::{MaybeRelocatable, Relocatable},
44
vm::vm_core::VirtualMachine,
55
};
6-
use conversions::{
7-
IntoConv,
8-
serde::serialize::{SerializeToFeltVec, raw::RawFeltVec},
9-
};
6+
use conversions::serde::SerializedValue;
7+
use conversions::{IntoConv, serde::serialize::SerializeToFeltVec};
108
use starknet_types_core::felt::Felt;
119

1210
fn get_cheated_block_info_ptr(
@@ -90,8 +88,10 @@ fn get_cheated_tx_info_ptr(
9088
new_tx_info[7] = MaybeRelocatable::Int(nonce);
9189
}
9290
if let Some(resource_bounds) = resource_bounds {
93-
let (resource_bounds_start_ptr, resource_bounds_end_ptr) =
94-
add_vec_memory_segment(&RawFeltVec::new(resource_bounds).serialize_to_vec(), vm);
91+
let (resource_bounds_start_ptr, resource_bounds_end_ptr) = add_vec_memory_segment(
92+
&SerializedValue::new(resource_bounds).serialize_to_vec(),
93+
vm,
94+
);
9595
new_tx_info[8] = resource_bounds_start_ptr.into();
9696
new_tx_info[9] = resource_bounds_end_ptr.into();
9797
}

crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ use cairo_vm::vm::{
3535
};
3636
use conversions::byte_array::ByteArray;
3737
use conversions::felt::{ToShortString, TryInferFormat};
38+
use conversions::serde::SerializedValue;
3839
use conversions::serde::deserialize::BufferReader;
39-
use conversions::serde::serialize::CairoSerialize;
40+
use conversions::serde::serialize::{CairoSerialize, SerializeToFeltVec};
4041
use data_transformer::cairo_types::CairoU256;
4142
use rand::prelude::StdRng;
4243
use runtime::{
@@ -64,8 +65,6 @@ pub struct ForgeExtension<'a> {
6465
pub environment_variables: &'a HashMap<String, String>,
6566
pub contracts_data: &'a ContractsData,
6667
pub fuzzer_rng: Option<Arc<Mutex<StdRng>>>,
67-
/// Whether `--experimental-oracles` flag has been enabled.
68-
pub experimental_oracles_enabled: bool,
6968
pub oracle_hint_service: OracleHintService,
7069
}
7170

@@ -86,18 +85,16 @@ impl<'a> ExtensionLogic for ForgeExtension<'a> {
8685
.oracle_hint_service
8786
.accept_cheatcode(selector.as_bytes())
8887
{
89-
if !self.experimental_oracles_enabled {
90-
return Err(anyhow!(
91-
"Oracles are an experimental feature. \
92-
To enable them, pass `--experimental-oracles` CLI flag."
93-
)
94-
.into());
95-
}
96-
9788
let output = self
9889
.oracle_hint_service
9990
.execute_cheatcode(oracle_selector, input_reader.into_remaining());
100-
return Ok(CheatcodeHandlingResult::Handled(output));
91+
let mut reader = BufferReader::new(&output);
92+
let deserialized: Result<SerializedValue<Felt>, ByteArray> = reader.read()?;
93+
let converted = deserialized
94+
.map_err(|error| EnhancedHintError::OracleError { error })
95+
.map(|r| r.serialize_to_vec())?;
96+
97+
return Ok(CheatcodeHandlingResult::Handled(converted));
10198
}
10299

103100
match selector {

crates/conversions/src/serde.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
pub mod deserialize;
22
pub mod serialize;
3+
pub mod serialized_value;
4+
5+
pub use serialized_value::SerializedValue;

crates/conversions/src/serde/deserialize/deserialize_impl.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ where
4343
{
4444
fn deserialize(reader: &mut BufferReader<'_>) -> BufferReadResult<Self> {
4545
let variant: Felt = reader.read()?;
46-
let variant: usize = variant.to_usize().ok_or(BufferReadError::ParseFailed)?;
46+
let variant = variant.to_usize().ok_or(BufferReadError::ParseFailed)?;
4747

4848
match variant {
4949
0 => Ok(Some(reader.read()?)),
@@ -53,6 +53,19 @@ where
5353
}
5454
}
5555

56+
impl<T: CairoDeserialize, E: CairoDeserialize> CairoDeserialize for Result<T, E> {
57+
fn deserialize(reader: &mut BufferReader<'_>) -> BufferReadResult<Self> {
58+
let variant: Felt = reader.read()?;
59+
let variant = variant.to_usize().ok_or(BufferReadError::ParseFailed)?;
60+
61+
match variant {
62+
0 => Ok(Ok(reader.read()?)),
63+
1 => Ok(Err(reader.read()?)),
64+
_ => Err(BufferReadError::ParseFailed),
65+
}
66+
}
67+
}
68+
5669
impl CairoDeserialize for bool {
5770
fn deserialize(reader: &mut BufferReader<'_>) -> BufferReadResult<Self> {
5871
let num: usize = reader.read()?;

crates/conversions/src/serde/lib.rs

Lines changed: 0 additions & 2 deletions
This file was deleted.

crates/conversions/src/serde/serialize.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use starknet_types_core::felt::Felt;
22

33
pub use cairo_serde_macros::CairoSerialize;
44

5-
pub mod raw;
65
mod serialize_impl;
76

87
pub struct BufferWriter {

crates/conversions/src/serde/serialize/raw.rs

Lines changed: 0 additions & 28 deletions
This file was deleted.

0 commit comments

Comments
 (0)