-
Notifications
You must be signed in to change notification settings - Fork 182
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(torii): model upgrades #2637
Changes from 10 commits
b1f3e35
fa71dbd
60a870d
62750f6
6313f44
f7fd6ae
e85bdd0
d641ba0
3336c4a
3742676
b3ee109
0d26d43
cbc39c7
14ffc8e
ddd9921
cf9c45c
3925cce
ae8bf42
210ac31
d86fcc4
ab855dd
5d57e6d
b04e848
e3d8a7b
b7f3264
87857c2
9b5d624
9ac0d21
a8d6737
d2c7696
255d4fb
6235080
612fc4b
0dbec7e
551c6bd
cea8102
155033d
4e921c3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -92,6 +92,7 @@ where | |
packed_size, | ||
unpacked_size, | ||
block_timestamp, | ||
false, | ||
) | ||
.await?; | ||
|
||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,113 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||
use anyhow::{Error, Ok, Result}; | ||||||||||||||||||||||||||||||||||||||||||||||||
use async_trait::async_trait; | ||||||||||||||||||||||||||||||||||||||||||||||||
use dojo_world::contracts::abigen::world::Event as WorldEvent; | ||||||||||||||||||||||||||||||||||||||||||||||||
use dojo_world::contracts::model::ModelReader; | ||||||||||||||||||||||||||||||||||||||||||||||||
use dojo_world::contracts::world::WorldContractReader; | ||||||||||||||||||||||||||||||||||||||||||||||||
use starknet::core::types::Event; | ||||||||||||||||||||||||||||||||||||||||||||||||
use starknet::providers::Provider; | ||||||||||||||||||||||||||||||||||||||||||||||||
use tracing::{debug, info}; | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
use super::EventProcessor; | ||||||||||||||||||||||||||||||||||||||||||||||||
use crate::sql::Sql; | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
pub(crate) const LOG_TARGET: &str = "torii_core::processors::upgrade_event"; | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
#[derive(Default, Debug)] | ||||||||||||||||||||||||||||||||||||||||||||||||
pub struct UpgradeEventProcessor; | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
#[async_trait] | ||||||||||||||||||||||||||||||||||||||||||||||||
impl<P> EventProcessor<P> for UpgradeEventProcessor | ||||||||||||||||||||||||||||||||||||||||||||||||
where | ||||||||||||||||||||||||||||||||||||||||||||||||
P: Provider + Send + Sync + std::fmt::Debug, | ||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||
fn event_key(&self) -> String { | ||||||||||||||||||||||||||||||||||||||||||||||||
"EventUpgraded".to_string() | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
// We might not need this anymore, since we don't have fallback and all world events must | ||||||||||||||||||||||||||||||||||||||||||||||||
// be handled. | ||||||||||||||||||||||||||||||||||||||||||||||||
fn validate(&self, _event: &Event) -> bool { | ||||||||||||||||||||||||||||||||||||||||||||||||
true | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
async fn process( | ||||||||||||||||||||||||||||||||||||||||||||||||
&self, | ||||||||||||||||||||||||||||||||||||||||||||||||
world: &WorldContractReader<P>, | ||||||||||||||||||||||||||||||||||||||||||||||||
db: &mut Sql, | ||||||||||||||||||||||||||||||||||||||||||||||||
_block_number: u64, | ||||||||||||||||||||||||||||||||||||||||||||||||
block_timestamp: u64, | ||||||||||||||||||||||||||||||||||||||||||||||||
_event_id: &str, | ||||||||||||||||||||||||||||||||||||||||||||||||
event: &Event, | ||||||||||||||||||||||||||||||||||||||||||||||||
) -> Result<(), Error> { | ||||||||||||||||||||||||||||||||||||||||||||||||
// Torii version is coupled to the world version, so we can expect the event to be well | ||||||||||||||||||||||||||||||||||||||||||||||||
// formed. | ||||||||||||||||||||||||||||||||||||||||||||||||
let event = match WorldEvent::try_from(event).unwrap_or_else(|_| { | ||||||||||||||||||||||||||||||||||||||||||||||||
panic!( | ||||||||||||||||||||||||||||||||||||||||||||||||
"Expected {} event to be well formed.", | ||||||||||||||||||||||||||||||||||||||||||||||||
<UpgradeEventProcessor as EventProcessor<P>>::event_key(self) | ||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||
}) { | ||||||||||||||||||||||||||||||||||||||||||||||||
Larkooo marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||
WorldEvent::EventUpgraded(e) => e, | ||||||||||||||||||||||||||||||||||||||||||||||||
_ => { | ||||||||||||||||||||||||||||||||||||||||||||||||
unreachable!() | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+52
to
+54
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Handle unexpected event types explicitly Ohayo, sensei! Instead of using Apply this diff: -_ => {
- unreachable!()
-}
+_ => {
+ return Err(anyhow!("Unexpected event type received in UpgradeEventProcessor."));
+}
|
||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+45
to
+55
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Replace panic and unreachable with proper error handling Ohayo sensei! The current error handling could crash the application. Consider using proper error propagation: - let event = match WorldEvent::try_from(event).unwrap_or_else(|_| {
- panic!(
- "Expected {} event to be well formed.",
- <UpgradeEventProcessor as EventProcessor<P>>::event_key(self)
- )
- }) {
- WorldEvent::EventUpgraded(e) => e,
- _ => {
- unreachable!()
- }
+ let event = match WorldEvent::try_from(event) {
+ Ok(WorldEvent::EventUpgraded(e)) => e,
+ Ok(_) => return Err(Error::msg(format!(
+ "Unexpected event type for {}",
+ <UpgradeEventProcessor as EventProcessor<P>>::event_key(self)
+ ))),
+ Err(e) => return Err(Error::msg(format!(
+ "Failed to parse {} event: {}",
+ <UpgradeEventProcessor as EventProcessor<P>>::event_key(self),
+ e
+ )))
}; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
// Called model here by language, but it's an event. Torii rework will make clear | ||||||||||||||||||||||||||||||||||||||||||||||||
// distinction. | ||||||||||||||||||||||||||||||||||||||||||||||||
let model = db.model(event.selector).await?; | ||||||||||||||||||||||||||||||||||||||||||||||||
let name = model.name; | ||||||||||||||||||||||||||||||||||||||||||||||||
let namespace = model.namespace; | ||||||||||||||||||||||||||||||||||||||||||||||||
let prev_schema = model.schema; | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
let model = world.model_reader(&namespace, &name).await?; | ||||||||||||||||||||||||||||||||||||||||||||||||
let new_schema = model.schema().await?; | ||||||||||||||||||||||||||||||||||||||||||||||||
let schema_diff = new_schema.diff(&prev_schema); | ||||||||||||||||||||||||||||||||||||||||||||||||
// No changes to the schema. This can happen if torii is re-run with a fresh database. | ||||||||||||||||||||||||||||||||||||||||||||||||
// As the register model fetches the latest schema from the chain. | ||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We might rework the |
||||||||||||||||||||||||||||||||||||||||||||||||
if schema_diff.is_none() { | ||||||||||||||||||||||||||||||||||||||||||||||||
return Ok(()); | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
let schema_diff = schema_diff.unwrap(); | ||||||||||||||||||||||||||||||||||||||||||||||||
let layout = model.layout().await?; | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
// Events are never stored onchain, hence no packing or unpacking. | ||||||||||||||||||||||||||||||||||||||||||||||||
let unpacked_size: u32 = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||
let packed_size: u32 = 0; | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
info!( | ||||||||||||||||||||||||||||||||||||||||||||||||
target: LOG_TARGET, | ||||||||||||||||||||||||||||||||||||||||||||||||
namespace = %namespace, | ||||||||||||||||||||||||||||||||||||||||||||||||
name = %name, | ||||||||||||||||||||||||||||||||||||||||||||||||
"Upgraded event." | ||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
debug!( | ||||||||||||||||||||||||||||||||||||||||||||||||
target: LOG_TARGET, | ||||||||||||||||||||||||||||||||||||||||||||||||
name, | ||||||||||||||||||||||||||||||||||||||||||||||||
diff = ?schema_diff, | ||||||||||||||||||||||||||||||||||||||||||||||||
layout = ?layout, | ||||||||||||||||||||||||||||||||||||||||||||||||
class_hash = ?event.class_hash, | ||||||||||||||||||||||||||||||||||||||||||||||||
contract_address = ?event.address, | ||||||||||||||||||||||||||||||||||||||||||||||||
packed_size = %packed_size, | ||||||||||||||||||||||||||||||||||||||||||||||||
unpacked_size = %unpacked_size, | ||||||||||||||||||||||||||||||||||||||||||||||||
"Upgraded event content." | ||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
db.register_model( | ||||||||||||||||||||||||||||||||||||||||||||||||
&namespace, | ||||||||||||||||||||||||||||||||||||||||||||||||
schema_diff, | ||||||||||||||||||||||||||||||||||||||||||||||||
layout, | ||||||||||||||||||||||||||||||||||||||||||||||||
event.class_hash.into(), | ||||||||||||||||||||||||||||||||||||||||||||||||
event.address.into(), | ||||||||||||||||||||||||||||||||||||||||||||||||
packed_size, | ||||||||||||||||||||||||||||||||||||||||||||||||
unpacked_size, | ||||||||||||||||||||||||||||||||||||||||||||||||
block_timestamp, | ||||||||||||||||||||||||||||||||||||||||||||||||
true, | ||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||
.await?; | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
Ok(()) | ||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ohayo sensei! Consider returning Result instead of panicking.
The
diff
method currently panics when comparing different types. For a public API, it would be better to return aResult
type to handle type mismatches gracefully.Here's a suggested implementation: