use crate::Address;
use crate::Digest;
use crate::EpochId;
use crate::GasCostSummary;
use crate::TypeTag;
use crate::execution_status::ExecutionStatus;
use crate::object::Owner;
use crate::object::Version;
#[derive(Eq, PartialEq, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
pub struct TransactionEffectsV2 {
pub status: ExecutionStatus,
pub epoch: EpochId,
pub gas_used: GasCostSummary,
pub transaction_digest: Digest,
pub gas_object_index: Option<u32>,
pub events_digest: Option<Digest>,
#[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=5).lift()))]
pub dependencies: Vec<Digest>,
pub lamport_version: Version,
#[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=2).lift()))]
pub changed_objects: Vec<ChangedObject>,
#[cfg_attr(feature = "proptest", any(proptest::collection::size_range(0..=2).lift()))]
pub unchanged_consensus_objects: Vec<UnchangedConsensusObject>,
pub auxiliary_data_digest: Option<Digest>,
}
#[derive(Eq, PartialEq, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
pub struct ChangedObject {
pub object_id: Address,
pub input_state: ObjectIn,
pub output_state: ObjectOut,
pub id_operation: IdOperation,
}
#[derive(Eq, PartialEq, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
pub struct UnchangedConsensusObject {
pub object_id: Address,
pub kind: UnchangedConsensusKind,
}
#[derive(Eq, PartialEq, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
#[non_exhaustive]
pub enum UnchangedConsensusKind {
ReadOnlyRoot { version: Version, digest: Digest },
MutateDeleted { version: Version },
ReadDeleted { version: Version },
Canceled { version: Version },
PerEpochConfig,
}
#[derive(Eq, PartialEq, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
#[non_exhaustive]
pub enum ObjectIn {
NotExist,
Exist {
version: Version,
digest: Digest,
owner: Owner,
},
}
#[derive(Eq, PartialEq, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
#[non_exhaustive]
pub enum ObjectOut {
NotExist,
ObjectWrite { digest: Digest, owner: Owner },
PackageWrite { version: Version, digest: Digest },
AccumulatorWrite(AccumulatorWrite),
}
#[derive(Eq, PartialEq, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
pub struct AccumulatorWrite {
address: Address,
type_: TypeTag,
operation: AccumulatorOperation,
value: AccumulatorValue,
}
impl AccumulatorWrite {
pub fn new(
address: Address,
type_: TypeTag,
operation: AccumulatorOperation,
value: AccumulatorValue,
) -> Self {
Self {
address,
type_,
operation,
value,
}
}
pub fn address(&self) -> &Address {
&self.address
}
pub fn accumulator_type(&self) -> &TypeTag {
&self.type_
}
pub fn operation(&self) -> AccumulatorOperation {
self.operation
}
pub fn value(&self) -> &AccumulatorValue {
&self.value
}
}
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
#[non_exhaustive]
pub enum AccumulatorOperation {
Merge,
Split,
}
#[derive(Eq, PartialEq, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
#[non_exhaustive]
pub enum AccumulatorValue {
Integer(u64),
IntegerTuple(u64, u64),
EventDigest(
#[cfg_attr(feature = "proptest", any(proptest::collection::size_range(1..=4).lift()))]
Vec<(u64, Digest)>,
),
}
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(
feature = "serde",
derive(serde_derive::Serialize, serde_derive::Deserialize)
)]
#[cfg_attr(feature = "proptest", derive(test_strategy::Arbitrary))]
#[non_exhaustive]
pub enum IdOperation {
None,
Created,
Deleted,
}
impl TransactionEffectsV2 {
pub fn status(&self) -> &ExecutionStatus {
&self.status
}
pub fn epoch(&self) -> EpochId {
self.epoch
}
pub fn gas_summary(&self) -> &GasCostSummary {
&self.gas_used
}
}