sui_cluster_test/test_case/
staking_test.rs1use crate::{TestCaseImpl, TestContext};
5use async_trait::async_trait;
6use sui_test_transaction_builder::make_staking_transaction;
7use sui_types::transaction_driver_types::ExecuteTransactionRequestType;
8use tracing::info;
9
10pub struct StakingTest;
11
12#[async_trait]
13impl TestCaseImpl for StakingTest {
14 fn name(&self) -> &'static str {
15 "Staking"
16 }
17
18 fn description(&self) -> &'static str {
19 "Stake SUI with a validator and verify the delegation appears"
20 }
21
22 async fn run(&self, ctx: &mut TestContext) -> Result<(), anyhow::Error> {
23 info!("Testing staking workflow");
24
25 ctx.get_sui_from_faucet(Some(1)).await;
26 let sender = ctx.get_wallet_address();
27
28 let system_state = ctx.get_latest_sui_system_state().await;
30 let validator_addr = system_state
31 .active_validators
32 .first()
33 .expect("Should have at least one active validator")
34 .sui_address;
35 info!("Staking to validator: {validator_addr}");
36
37 let txn = make_staking_transaction(ctx.get_wallet(), validator_addr).await;
39 let digest = *txn.digest();
40
41 let client = ctx.clone_fullnode_client();
42 client
43 .quorum_driver_api()
44 .execute_transaction_block(
45 txn,
46 Default::default(),
47 Some(ExecuteTransactionRequestType::WaitForLocalExecution),
48 )
49 .await?;
50 info!("Staking transaction executed: {digest}");
51
52 let stakes = client.governance_api().get_stakes(sender).await?;
54 assert!(
55 !stakes.is_empty(),
56 "Should have at least one stake after staking"
57 );
58 let matching = stakes
59 .iter()
60 .find(|s| s.validator_address == validator_addr);
61 assert!(
62 matching.is_some(),
63 "Should find a stake delegated to {validator_addr}"
64 );
65 info!(
66 "Staking verified: {} delegation(s), staked to {validator_addr}",
67 stakes.len()
68 );
69
70 Ok(())
71 }
72}