Skip to content

Commit abdec34

Browse files
authored
Ensured that Automation Registration transaction verification fails if the feature is not active (#208)
* Ensured that Automation Registration transaction verification fails if the feature is not active. See smr-moonshot issue 1793.
1 parent 24de6e4 commit abdec34

File tree

3 files changed

+52
-31
lines changed

3 files changed

+52
-31
lines changed

aptos-move/aptos-vm/src/aptos_vm.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,7 @@ impl AptosVM {
883883
traversal_context,
884884
)
885885
}
886+
886887
fn execute_automation_registration_txn<'a, 'r, 'l>(
887888
&'l self,
888889
resolver: &'r impl AptosMoveResolver,
@@ -1729,6 +1730,18 @@ impl AptosVM {
17291730
is_approved_gov_script: bool,
17301731
traversal_context: &mut TraversalContext,
17311732
) -> Result<(), VMStatus> {
1733+
// Check if the native automation feature is active. We do this here so that the check
1734+
// is executed during verification at the RPC node and mempool as well as during execution.
1735+
if let TransactionPayload::AutomationRegistration(_) = transaction.payload() {
1736+
if !self.features().is_enabled(FeatureFlag::SUPRA_NATIVE_AUTOMATION) {
1737+
return Err(VMStatus::Error {
1738+
status_code: StatusCode::FEATURE_UNDER_GATING,
1739+
sub_status: None,
1740+
message: Some("The Supra Native Automation feature is currently inactive.".to_string()),
1741+
});
1742+
}
1743+
}
1744+
17321745
// Check transaction format.
17331746
if transaction.contains_duplicate_signers() {
17341747
return Err(VMStatus::error(

aptos-move/e2e-testsuite/src/tests/automation_registration.rs

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
use aptos_cached_packages::aptos_framework_sdk_builder;
5-
use aptos_language_e2e_tests::account::{Account, AccountData};
6-
use aptos_language_e2e_tests::executor::FakeExecutor;
7-
use aptos_types::on_chain_config::FeatureFlag;
8-
use aptos_types::transaction::automation::{AutomationTaskMetaData, RegistrationParams};
9-
use aptos_types::transaction::{
10-
EntryFunction, ExecutionStatus, SignedTransaction, TransactionOutput, TransactionPayload,
11-
TransactionStatus,
5+
use aptos_language_e2e_tests::{
6+
account::{Account, AccountData},
7+
executor::FakeExecutor,
128
};
13-
use move_core_types::account_address::AccountAddress;
14-
use move_core_types::value::MoveValue;
15-
use move_core_types::vm_status::StatusCode;
9+
use aptos_types::{
10+
on_chain_config::FeatureFlag,
11+
transaction::{
12+
automation::{AutomationTaskMetaData, RegistrationParams},
13+
EntryFunction, ExecutionStatus, SignedTransaction, TransactionOutput, TransactionPayload,
14+
TransactionStatus,
15+
},
16+
};
17+
use move_core_types::{account_address::AccountAddress, value::MoveValue, vm_status::StatusCode};
1618
use std::ops::{Deref, DerefMut};
1719

1820
const TIMESTAMP_NOW_SECONDS: &str = "0x1::timestamp::now_seconds";
@@ -31,6 +33,7 @@ impl AutomationRegistrationTestContext {
3133
pub(crate) fn sender_account_data(&self) -> &AccountData {
3234
&self.txn_sender
3335
}
36+
3437
pub(crate) fn sender_account_address(&self) -> AccountAddress {
3538
*self.txn_sender.address()
3639
}
@@ -63,16 +66,12 @@ impl AutomationRegistrationTestContext {
6366
} else {
6467
(vec![], flag_value)
6568
};
66-
self.executor.exec(
67-
"features",
68-
"change_feature_flags_internal",
69-
vec![],
70-
vec![
69+
self.executor
70+
.exec("features", "change_feature_flags_internal", vec![], vec![
7171
MoveValue::Signer(acc).simple_serialize().unwrap(),
7272
bcs::to_bytes(&enabled).unwrap(),
7373
bcs::to_bytes(&disabled).unwrap(),
74-
],
75-
);
74+
]);
7675
}
7776

7877
pub(crate) fn new_account_data(&mut self, amount: u64, seq_num: u64) -> AccountData {
@@ -124,6 +123,7 @@ impl AutomationRegistrationTestContext {
124123
_ => panic!("Unexpected transaction status: {output:?}"),
125124
}
126125
}
126+
127127
pub(crate) fn check_discarded_output(
128128
output: TransactionOutput,
129129
expected_status_code: StatusCode,
@@ -161,11 +161,10 @@ impl AutomationRegistrationTestContext {
161161
}
162162

163163
pub(crate) fn account_sequence_number(&mut self, account_address: AccountAddress) -> u64 {
164-
let view_output = self.execute_view_function(
165-
str::parse(ACCOUNT_SEQ_NUM).unwrap(),
166-
vec![],
167-
vec![account_address.to_vec()],
168-
);
164+
let view_output =
165+
self.execute_view_function(str::parse(ACCOUNT_SEQ_NUM).unwrap(), vec![], vec![
166+
account_address.to_vec(),
167+
]);
169168
let result = view_output.values.expect("Valid result");
170169
assert_eq!(result.len(), 1);
171170
bcs::from_bytes::<u64>(&result[0]).unwrap()
@@ -183,13 +182,12 @@ impl AutomationRegistrationTestContext {
183182
}
184183

185184
pub(crate) fn get_task_details(&mut self, index: u64) -> AutomationTaskMetaData {
186-
let view_output = self.execute_view_function(
187-
str::parse(AUTOMATION_TASK_DETAILS).unwrap(),
188-
vec![],
189-
vec![MoveValue::U64(index)
190-
.simple_serialize()
191-
.expect("Successful serialization")],
192-
);
185+
let view_output =
186+
self.execute_view_function(str::parse(AUTOMATION_TASK_DETAILS).unwrap(), vec![], vec![
187+
MoveValue::U64(index)
188+
.simple_serialize()
189+
.expect("Successful serialization"),
190+
]);
193191
let result = view_output.values.expect("Valid result");
194192
assert!(!result.is_empty());
195193
bcs::from_bytes::<AutomationTaskMetaData>(&result[0])
@@ -237,11 +235,20 @@ fn check_successful_registration() {
237235
let sender_address = test_context.sender_account_address();
238236
let sender_seq_num_old = test_context.account_sequence_number(sender_address);
239237

240-
// when flag is not enabled although registry in initialized, registration will fail.
238+
// When the SUPRA_NATIVE_AUTOMATION feature flag is not enabled registration requests must fail
239+
// to validate. This ensures that they won't be accepted by the RPC nodes or the Mempool.
240+
let validation_result = test_context.validate_transaction(automation_txn.clone());
241+
assert_eq!(
242+
validation_result.status(),
243+
Some(StatusCode::FEATURE_UNDER_GATING)
244+
);
245+
246+
// When the SUPRA_NATIVE_AUTOMATION feature flag is not enabled registration requests must fail
247+
// to execute.
241248
let result = test_context.execute_transaction(automation_txn.clone());
242249
assert!(matches!(
243250
result.status().status(),
244-
Ok(ExecutionStatus::MoveAbort { .. })
251+
Err(StatusCode::FEATURE_UNDER_GATING)
245252
));
246253

247254
// enable the supra native automation, registration should succeed.

unit_test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ cd ./aptos-move/framework/supra-framework && "$ROOT"/target/release/aptos move t
55
cd ..
66
cargo test --release -p aptos-framework -- --skip prover || exit 2
77
RUST_MIN_STACK=104857600 cargo nextest run -p e2e-move-tests || exit 3
8+
RUST_MIN_STACK=104857600 cargo nextest run -p language-e2e-testsuite --no-fail-fast || exit 4

0 commit comments

Comments
 (0)