kora_lib/rpc_server/method/
get_config.rs1use 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 let pool = get_signer_pool()
27 .map_err(|e| KoraError::InternalServerError(format!("Signer pool not initialized: {e}")))?;
28
29 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!(!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_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 ); assert_eq!(
71 response.validation_config.allowed_programs[1],
72 "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
73 ); assert_eq!(
75 response.validation_config.allowed_programs[2],
76 "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
77 ); assert_eq!(response.validation_config.allowed_tokens.len(), 1);
79 assert_eq!(
80 response.validation_config.allowed_tokens[0],
81 "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"
82 ); 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 ); assert_eq!(response.validation_config.disallowed_accounts.len(), 0);
89 assert_eq!(response.validation_config.price_source, crate::oracle::PriceSource::Mock);
90
91 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 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!(!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 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_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!(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}