Skip to main content

kora_lib/rpc_server/method/
get_config.rs

1use crate::{
2    config::{EnabledMethods, ValidationConfig},
3    signer::SelectionStrategy,
4    state::{self, get_signer_pool},
5    KoraError,
6};
7use serde::Serialize;
8use utoipa::ToSchema;
9
10#[derive(Debug, Clone, Serialize, ToSchema)]
11pub struct SignerPoolInfo {
12    pub strategy: SelectionStrategy,
13}
14
15#[derive(Debug, Clone, Serialize, ToSchema)]
16pub struct GetConfigResponse {
17    pub fee_payers: Vec<String>,
18    pub validation_config: ValidationConfig,
19    pub enabled_methods: EnabledMethods,
20}
21
22pub async fn get_config() -> Result<GetConfigResponse, KoraError> {
23    let config = state::get_config()?;
24
25    // Get signer pool information (required in multi-signer mode)
26    let pool = get_signer_pool()
27        .map_err(|e| KoraError::InternalServerError(format!("Signer pool not initialized: {e}")))?;
28
29    // Get all fee payer public keys from the signer pool
30    let fee_payers: Vec<String> =
31        pool.get_signers_info().iter().map(|signer| signer.public_key.clone()).collect();
32
33    Ok(GetConfigResponse {
34        fee_payers,
35        validation_config: config.validation.clone(),
36        enabled_methods: config.kora.enabled_methods.clone(),
37    })
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use crate::tests::{common::setup_or_get_test_signer, config_mock::ConfigMockBuilder};
44    use serial_test::serial;
45
46    #[tokio::test]
47    #[serial]
48    async fn test_get_config_success() {
49        let config = ConfigMockBuilder::new().build();
50        state::update_config(config).expect("Failed to update config");
51
52        let _ = setup_or_get_test_signer();
53
54        let result = get_config().await;
55
56        let response = result.unwrap();
57
58        // Assert fee payers
59        assert!(!response.fee_payers.is_empty(), "Should have at least one fee payer");
60        assert!(!response.fee_payers[0].is_empty(), "Fee payer pubkey should not be empty");
61
62        // Assert ValidationConfig defaults
63        assert_eq!(response.validation_config.max_allowed_lamports, 1_000_000_000);
64        assert_eq!(response.validation_config.max_signatures, 10);
65        assert_eq!(response.validation_config.allowed_programs.len(), 3);
66        assert_eq!(
67            response.validation_config.allowed_programs[0],
68            "11111111111111111111111111111111"
69        ); // System Program
70        assert_eq!(
71            response.validation_config.allowed_programs[1],
72            "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
73        ); // Token Program
74        assert_eq!(
75            response.validation_config.allowed_programs[2],
76            "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
77        ); // ATA Program
78        assert_eq!(response.validation_config.allowed_tokens.len(), 1);
79        assert_eq!(
80            response.validation_config.allowed_tokens[0],
81            "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"
82        ); // USDC devnet
83        assert_eq!(response.validation_config.allowed_spl_paid_tokens.as_slice().len(), 1);
84        assert_eq!(
85            response.validation_config.allowed_spl_paid_tokens.as_slice()[0],
86            "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"
87        ); // USDC devnet
88        assert_eq!(response.validation_config.disallowed_accounts.len(), 0);
89        assert_eq!(response.validation_config.price_source, crate::oracle::PriceSource::Mock);
90
91        // Assert FeePayerPolicy defaults - System (secure by default - all false)
92        assert!(!response.validation_config.fee_payer_policy.system.allow_transfer);
93        assert!(!response.validation_config.fee_payer_policy.system.allow_assign);
94        assert!(!response.validation_config.fee_payer_policy.system.allow_create_account);
95        assert!(!response.validation_config.fee_payer_policy.system.allow_allocate);
96        assert!(!response.validation_config.fee_payer_policy.system.nonce.allow_initialize);
97        assert!(!response.validation_config.fee_payer_policy.system.nonce.allow_advance);
98        assert!(!response.validation_config.fee_payer_policy.system.nonce.allow_withdraw);
99        assert!(!response.validation_config.fee_payer_policy.system.nonce.allow_authorize);
100        // Note: allow_upgrade removed - no authority parameter to validate
101
102        // Assert FeePayerPolicy defaults - SPL Token (secure by default - all false)
103        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_transfer);
104        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_burn);
105        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_close_account);
106        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_approve);
107        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_revoke);
108        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_set_authority);
109        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_mint_to);
110        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_initialize_mint);
111        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_initialize_account);
112        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_initialize_multisig);
113        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_freeze_account);
114        assert!(!response.validation_config.fee_payer_policy.spl_token.allow_thaw_account);
115
116        // Assert FeePayerPolicy defaults - Token2022 (secure by default - all false)
117        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_transfer);
118        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_burn);
119        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_close_account);
120        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_approve);
121        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_revoke);
122        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_set_authority);
123        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_mint_to);
124        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_initialize_mint);
125        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_initialize_account);
126        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_initialize_multisig);
127        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_freeze_account);
128        assert!(!response.validation_config.fee_payer_policy.token_2022.allow_thaw_account);
129        // Assert PriceConfig default (check margin value)
130        match response.validation_config.price.model {
131            crate::fee::price::PriceModel::Margin { margin } => assert_eq!(margin, 0.0),
132            _ => panic!("Expected Margin price model"),
133        }
134
135        // Assert Token2022Config defaults (only public fields)
136        assert_eq!(response.validation_config.token_2022.blocked_mint_extensions.len(), 0);
137        assert_eq!(response.validation_config.token_2022.blocked_account_extensions.len(), 0);
138
139        // Assert EnabledMethods defaults
140        assert!(response.enabled_methods.liveness);
141        assert!(response.enabled_methods.estimate_transaction_fee);
142        assert!(response.enabled_methods.get_supported_tokens);
143        assert!(response.enabled_methods.get_payer_signer);
144        assert!(response.enabled_methods.sign_transaction);
145        assert!(response.enabled_methods.sign_and_send_transaction);
146        assert!(response.enabled_methods.transfer_transaction);
147        assert!(response.enabled_methods.get_blockhash);
148        assert!(response.enabled_methods.get_config);
149    }
150}