1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
// Copyright (c) Mysten Labs, Inc.
// Modifications Copyright (c) 2024 IOTA Stiftung
// SPDX-License-Identifier: Apache-2.0
use serde::{Deserialize, Serialize};
use super::IDOperation;
use crate::{
base_types::VersionDigest,
digests::ObjectDigest,
object::{Object, Owner},
};
#[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize)]
pub struct EffectsObjectChange {
// input_state and output_state are the core fields that's required by
// the protocol as it tells how an object changes on-chain.
/// State of the object in the store prior to this transaction.
pub(crate) input_state: ObjectIn,
/// State of the object in the store after this transaction.
pub(crate) output_state: ObjectOut,
/// Whether this object ID is created or deleted in this transaction.
/// This information isn't required by the protocol but is useful for
/// providing more detailed semantics on object changes.
pub(crate) id_operation: IDOperation,
}
impl EffectsObjectChange {
pub fn new(
modified_at: Option<(VersionDigest, Owner)>,
written: Option<&Object>,
id_created: bool,
id_deleted: bool,
) -> Self {
debug_assert!(
!id_created || !id_deleted,
"Object ID can't be created and deleted at the same time."
);
Self {
input_state: modified_at.map_or(ObjectIn::NotExist, ObjectIn::Exist),
output_state: written.map_or(ObjectOut::NotExist, |o| {
if o.is_package() {
ObjectOut::PackageWrite((o.version(), o.digest()))
} else {
ObjectOut::ObjectWrite((o.digest(), o.owner))
}
}),
id_operation: if id_created {
IDOperation::Created
} else if id_deleted {
IDOperation::Deleted
} else {
IDOperation::None
},
}
}
}
/// If an object exists (at root-level) in the store prior to this transaction,
/// it should be Exist, otherwise it's NonExist, e.g. wrapped objects should be
/// NonExist.
#[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize)]
pub enum ObjectIn {
NotExist,
/// The old version, digest and owner.
Exist((VersionDigest, Owner)),
}
#[derive(Eq, PartialEq, Clone, Debug, Serialize, Deserialize)]
pub enum ObjectOut {
/// Same definition as in ObjectIn.
NotExist,
/// Any written object, including all of mutated, created, unwrapped today.
ObjectWrite((ObjectDigest, Owner)),
/// Packages writes need to be tracked separately with version because
/// we don't use lamport version for package publish and upgrades.
PackageWrite(VersionDigest),
}