iota_types/
executable_transaction.rs1use iota_sdk_types::SenderSignedTransaction;
6use serde::{Deserialize, Serialize};
7
8use crate::{
9 committee::EpochId,
10 crypto::AuthorityStrongQuorumSignInfo,
11 message_envelope::{Envelope, TrustedEnvelope, VerifiedEnvelope},
12 messages_checkpoint::CheckpointSequenceNumber,
13 transaction::TransactionAPI,
14};
15
16#[derive(Clone, Debug, Serialize, Deserialize)]
21pub enum CertificateProof {
22 Checkpoint(EpochId, CheckpointSequenceNumber),
24 Certified(AuthorityStrongQuorumSignInfo),
26 QuorumExecuted(EpochId),
30 SystemTransaction(EpochId),
33 ConsensusOrdered(EpochId),
37}
38
39impl CertificateProof {
40 pub fn new_from_cert_sig(sig: AuthorityStrongQuorumSignInfo) -> Self {
41 Self::Certified(sig)
42 }
43
44 pub fn new_from_checkpoint(epoch: EpochId, checkpoint: CheckpointSequenceNumber) -> Self {
45 Self::Checkpoint(epoch, checkpoint)
46 }
47
48 pub fn new_system(epoch: EpochId) -> Self {
49 Self::SystemTransaction(epoch)
50 }
51
52 pub fn epoch(&self) -> EpochId {
53 match self {
54 Self::Checkpoint(epoch, _)
55 | Self::QuorumExecuted(epoch)
56 | Self::SystemTransaction(epoch)
57 | Self::ConsensusOrdered(epoch) => *epoch,
58 Self::Certified(sig) => sig.epoch,
59 }
60 }
61}
62
63pub type ExecutableTransaction = Envelope<SenderSignedTransaction, CertificateProof>;
69pub type VerifiedExecutableTransaction =
70 VerifiedEnvelope<SenderSignedTransaction, CertificateProof>;
71pub type TrustedExecutableTransaction = TrustedEnvelope<SenderSignedTransaction, CertificateProof>;
72
73impl VerifiedExecutableTransaction {
74 pub fn certificate_sig(&self) -> Option<&AuthorityStrongQuorumSignInfo> {
75 match self.auth_sig() {
76 CertificateProof::Certified(sig) => Some(sig),
77 _ => None,
78 }
79 }
80
81 pub fn gas_budget(&self) -> u64 {
82 self.data().transaction().gas_budget()
83 }
84}