-
Notifications
You must be signed in to change notification settings - Fork 171
Expand file tree
/
Copy pathcapabilities.rs
More file actions
66 lines (63 loc) · 2.75 KB
/
capabilities.rs
File metadata and controls
66 lines (63 loc) · 2.75 KB
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
use sov_modules_api::capabilities::UniquenessData;
use sov_modules_api::ExecutionContext;
use sov_modules_api::{CredentialId, Spec, TimeStateAccessor, TxHash};
use crate::Uniqueness;
impl<S: Spec> Uniqueness<S> {
/// Checks the provided uniqueness number.
/// ## Note
/// This method should perform all the checks required to ensure that the execution of
/// [`Self::mark_tx_attempted`] will succeed.
///
/// # Errors
/// May return an error if state access fails (e.g if we run out of gas) or if an overflow occurs (in the `check_generation_uniqueness` case).
pub fn check_uniqueness(
&self,
credential_id: &CredentialId,
transaction_uniqueness: UniquenessData,
transaction_hash: TxHash,
execution_context: &ExecutionContext,
state: &mut impl TimeStateAccessor,
) -> anyhow::Result<()> {
match transaction_uniqueness {
UniquenessData::Nonce(nonce) => match execution_context {
ExecutionContext::SequencerWarmUp => {
self.check_nonce_uniqueness_allow_nonconsecutive(credential_id, nonce, state)
}
_ => self.check_nonce_uniqueness(credential_id, nonce, state),
},
UniquenessData::Generation(generation) => {
self.check_generation_uniqueness(credential_id, generation, transaction_hash, state)
}
UniquenessData::Timestamp(ts) | UniquenessData::TimestampNonce(ts) => {
self.check_timestamp_uniqueness(credential_id, ts, transaction_hash, state)
}
}
}
/// Marks a transaction as attempted, ensuring that future attempts at execution will fail.
///
/// # Errors
/// May return an error if state access fails (e.g if we run out of gas) or if an overflow occurs (in the `check_generation_uniqueness` case).
pub fn mark_tx_attempted(
&mut self,
credential_id: &CredentialId,
transaction_generation: UniquenessData,
transaction_hash: TxHash,
state: &mut impl TimeStateAccessor,
) -> anyhow::Result<()> {
match transaction_generation {
UniquenessData::Nonce(_) => self.mark_nonce_tx_attempted(credential_id, state),
UniquenessData::Generation(generation) => self.mark_generational_tx_attempted(
credential_id,
generation,
transaction_hash,
state,
),
UniquenessData::Timestamp(ts) => {
self.mark_timestamp_tx_attempted(None, ts, transaction_hash, state)
}
UniquenessData::TimestampNonce(ts) => {
self.mark_timestamp_tx_attempted(Some(credential_id), ts, transaction_hash, state)
}
}
}
}