sui_cluster_test/test_case/
staking_test.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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        // Get a validator address from system state
29        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        // Build and execute the staking transaction
38        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        // Verify the stake appeared
53        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}