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