Skip to content

Commit

Permalink
fix: get_class (#117)
Browse files Browse the repository at this point in the history
  • Loading branch information
jbcaron authored May 28, 2024
1 parent aafa136 commit 17c3735
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Next release

- fix(rpc): get_class
- refactor: mapping db
- perf(db): contract key history now using rocksdb iterators for history
- fix(root): Cleaned state root commitments crate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ pub struct StorageContractClassData {
pub abi: ContractAbi,
pub sierra_program_length: u64,
pub abi_length: u64,
pub block_number: u64,
}

#[derive(Debug, Clone, Encode, Decode)]
Expand Down
5 changes: 4 additions & 1 deletion crates/client/db/src/storage_updates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,10 @@ pub async fn store_class_update(block_number: u64, class_update: ClassUpdateWrap
contract_class_wrapper;

handler_contract_class_data_mut
.insert(class_hash, StorageContractClassData { contract_class, abi, sierra_program_length, abi_length })
.insert(
class_hash,
StorageContractClassData { contract_class, abi, sierra_program_length, abi_length, block_number },
)
.unwrap();
},
);
Expand Down
14 changes: 12 additions & 2 deletions crates/client/rpc/src/methods/read/get_class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use mp_felt::Felt252Wrapper;
use starknet_core::types::{BlockId, ContractClass, FieldElement};

use crate::errors::StarknetRpcApiError;
use crate::methods::trace::utils::block_number_by_id;

/// Get the contract class definition in the given block associated with the given hash.
///
Expand All @@ -18,7 +19,7 @@ use crate::errors::StarknetRpcApiError;
///
/// Returns the contract class definition if found. In case of an error, returns a
/// `StarknetRpcApiError` indicating either `BlockNotFound` or `ClassHashNotFound`.
pub fn get_class(_block_id: BlockId, class_hash: FieldElement) -> RpcResult<ContractClass> {
pub fn get_class(block_id: BlockId, class_hash: FieldElement) -> RpcResult<ContractClass> {
let class_hash = Felt252Wrapper(class_hash).into();

// TODO: get class for the given block when block_number will be stored in
Expand All @@ -30,7 +31,16 @@ pub fn get_class(_block_id: BlockId, class_hash: FieldElement) -> RpcResult<Cont
}
Ok(None) => Err(StarknetRpcApiError::ClassHashNotFound.into()),
Ok(Some(class)) => {
let StorageContractClassData { contract_class, abi, sierra_program_length, abi_length } = class;
let StorageContractClassData {
contract_class,
abi,
sierra_program_length,
abi_length,
block_number: declared_at_block,
} = class;
if declared_at_block >= block_number_by_id(block_id)? {
return Err(StarknetRpcApiError::ClassHashNotFound.into());
}
Ok(ContractClassWrapper { contract: contract_class, abi, sierra_program_length, abi_length }
.try_into()
.map_err(|e| {
Expand Down
3 changes: 2 additions & 1 deletion crates/client/rpc/src/methods/read/get_class_at.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ pub fn get_class_at(block_id: BlockId, contract_address: FieldElement) -> RpcRes
};

// converting from stored Blockifier class to rpc class
let StorageContractClassData { contract_class, abi, sierra_program_length, abi_length } = contract_class_data;
let StorageContractClassData { contract_class, abi, sierra_program_length, abi_length, block_number: _ } =
contract_class_data;
Ok(ContractClassWrapper { contract: contract_class, abi, sierra_program_length, abi_length }.try_into().map_err(
|e| {
log::error!("Failed to convert contract class from hash '{class_hash}' to RPC contract class: {e}");
Expand Down

0 comments on commit 17c3735

Please sign in to comment.