From df351081947587bf77ea779c06a16143d8d5be03 Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Wed, 21 May 2025 16:36:37 +0200 Subject: [PATCH 1/4] XC-354: Add Chainstack RPC provider --- canister/scripts/provision.sh | 3 +++ canister/sol_rpc_canister.did | 2 ++ canister/src/providers/mod.rs | 25 +++++++++++++++++++++++-- libs/types/src/rpc_client/mod.rs | 4 ++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/canister/scripts/provision.sh b/canister/scripts/provision.sh index 5bf9af7f..c63b786a 100755 --- a/canister/scripts/provision.sh +++ b/canister/scripts/provision.sh @@ -7,6 +7,7 @@ set -e -x set -u # or set -o nounset : "$ALCHEMY_API_KEY" : "$ANKR_API_KEY" +: "$CHAINSTACK_API_KEY" : "$DRPC_API_KEY" : "$HELIUS_API_KEY" @@ -21,6 +22,8 @@ dfx canister call ${CANISTER} updateApiKeys "(vec { record { variant { AlchemyDevnet }; opt \"${ALCHEMY_API_KEY}\" }; record { variant { AnkrMainnet }; opt \"${ANKR_API_KEY}\" }; record { variant { AnkrDevnet }; opt \"${ANKR_API_KEY}\" }; + record { variant { ChainstackMainnet }; opt \"${ANKR_API_KEY}\" }; + record { variant { ChainstackDevnet }; opt \"${ANKR_API_KEY}\" }; record { variant { DrpcMainnet }; opt \"${DRPC_API_KEY}\" }; record { variant { DrpcDevnet }; opt \"${DRPC_API_KEY}\" }; record { variant { HeliusMainnet }; opt \"${HELIUS_API_KEY}\" }; diff --git a/canister/sol_rpc_canister.did b/canister/sol_rpc_canister.did index 2d7141d3..cf571639 100644 --- a/canister/sol_rpc_canister.did +++ b/canister/sol_rpc_canister.did @@ -14,6 +14,8 @@ type SupportedProvider = variant { AlchemyDevnet; AnkrMainnet; AnkrDevnet; + ChainstackMainnet; + ChainstackDevnet; DrpcMainnet; DrpcDevnet; HeliusMainnet; diff --git a/canister/src/providers/mod.rs b/canister/src/providers/mod.rs index 317523ae..00506296 100644 --- a/canister/src/providers/mod.rs +++ b/canister/src/providers/mod.rs @@ -48,6 +48,24 @@ thread_local! { public_url: Some("https://rpc.ankr.com/solana_devnet/".to_string()), } }, + SupportedRpcProviderId::ChainstackMainnet => SupportedRpcProvider { + cluster: SolanaCluster::Mainnet, + access: RpcAccess::Authenticated { + auth: RpcAuth::UrlParameter { + url_pattern: "https://solana-mainnet.core.chainstack.com/{API_KEY}".to_string(), + }, + public_url: None, + } + }, + SupportedRpcProviderId::ChainstackDevnet => SupportedRpcProvider { + cluster: SolanaCluster::Devnet, + access: RpcAccess::Authenticated { + auth: RpcAuth::UrlParameter { + url_pattern: "https://solana-devnet.core.chainstack.com/{API_KEY}".to_string(), + }, + public_url: None, + } + }, SupportedRpcProviderId::DrpcMainnet => SupportedRpcProvider { cluster: SolanaCluster::Mainnet, access: RpcAccess::Authenticated { @@ -116,6 +134,7 @@ impl Providers { const NON_DEFAULT_MAINNET_SUPPORTED_PROVIDERS: &'static [SupportedRpcProviderId] = &[ SupportedRpcProviderId::AnkrMainnet, SupportedRpcProviderId::PublicNodeMainnet, + SupportedRpcProviderId::ChainstackMainnet, ]; const DEFAULT_DEVNET_SUPPORTED_PROVIDERS: &'static [SupportedRpcProviderId] = &[ @@ -123,8 +142,10 @@ impl Providers { SupportedRpcProviderId::HeliusDevnet, SupportedRpcProviderId::DrpcDevnet, ]; - const NON_DEFAULT_DEVNET_SUPPORTED_PROVIDERS: &'static [SupportedRpcProviderId] = - &[SupportedRpcProviderId::AnkrDevnet]; + const NON_DEFAULT_DEVNET_SUPPORTED_PROVIDERS: &'static [SupportedRpcProviderId] = &[ + SupportedRpcProviderId::AnkrDevnet, + SupportedRpcProviderId::ChainstackDevnet, + ]; pub fn new(source: RpcSources, strategy: ConsensusStrategy) -> Result { fn get_sources(provider_ids: &[SupportedRpcProviderId]) -> Vec { diff --git a/libs/types/src/rpc_client/mod.rs b/libs/types/src/rpc_client/mod.rs index dc68e13e..1fd3f7b6 100644 --- a/libs/types/src/rpc_client/mod.rs +++ b/libs/types/src/rpc_client/mod.rs @@ -321,6 +321,10 @@ pub enum SupportedRpcProviderId { AnkrMainnet, /// [Ankr](https://www.ankr.com/) provider on [Solana Devnet](https://solana.com/docs/references/clusters) AnkrDevnet, + /// [Chainstack](https://www.chainstack.com/) provider on [Solana Mainnet](https://solana.com/docs/references/clusters) + ChainstackMainnet, + /// [Chainstack](https://www.chainstack.com/) provider on [Solana Devnet](https://solana.com/docs/references/clusters) + ChainstackDevnet, /// [dRPC](https://drpc.org/) provider on [Solana Mainnet](https://solana.com/docs/references/clusters) DrpcMainnet, /// [dRPC](https://drpc.org/) provider on [Solana Devnet](https://solana.com/docs/references/clusters) From fb0b317fa0e6d6e7c27b64bbe3901797caa2f893 Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Wed, 21 May 2025 17:10:22 +0200 Subject: [PATCH 2/4] XC-354: Fix getProviders test --- integration_tests/tests/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_tests/tests/tests.rs b/integration_tests/tests/tests.rs index 80a189bf..c6fc3f32 100644 --- a/integration_tests/tests/tests.rs +++ b/integration_tests/tests/tests.rs @@ -133,7 +133,7 @@ mod get_provider_tests { let client = setup.client().build(); let providers = client.get_providers().await; - assert_eq!(providers.len(), 9); + assert_eq!(providers.len(), 10); assert_eq!( providers[0], From 96f33ba08f96512f30d9c83e854c00cb66293852 Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Wed, 21 May 2025 17:11:56 +0200 Subject: [PATCH 3/4] XC-354: Fix getProviders test --- integration_tests/tests/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_tests/tests/tests.rs b/integration_tests/tests/tests.rs index c6fc3f32..26d9531f 100644 --- a/integration_tests/tests/tests.rs +++ b/integration_tests/tests/tests.rs @@ -133,7 +133,7 @@ mod get_provider_tests { let client = setup.client().build(); let providers = client.get_providers().await; - assert_eq!(providers.len(), 10); + assert_eq!(providers.len(), 11); assert_eq!( providers[0], From e7e114b41cf75a8f6e6daef65f370a6745152c5c Mon Sep 17 00:00:00 2001 From: Louis Pahlavi Date: Wed, 21 May 2025 17:13:35 +0200 Subject: [PATCH 4/4] XC-354: Fix API key provisioning --- canister/scripts/provision.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/canister/scripts/provision.sh b/canister/scripts/provision.sh index c63b786a..927f3113 100755 --- a/canister/scripts/provision.sh +++ b/canister/scripts/provision.sh @@ -22,8 +22,8 @@ dfx canister call ${CANISTER} updateApiKeys "(vec { record { variant { AlchemyDevnet }; opt \"${ALCHEMY_API_KEY}\" }; record { variant { AnkrMainnet }; opt \"${ANKR_API_KEY}\" }; record { variant { AnkrDevnet }; opt \"${ANKR_API_KEY}\" }; - record { variant { ChainstackMainnet }; opt \"${ANKR_API_KEY}\" }; - record { variant { ChainstackDevnet }; opt \"${ANKR_API_KEY}\" }; + record { variant { ChainstackMainnet }; opt \"${CHAINSTACK_API_KEY}\" }; + record { variant { ChainstackDevnet }; opt \"${CHAINSTACK_API_KEY}\" }; record { variant { DrpcMainnet }; opt \"${DRPC_API_KEY}\" }; record { variant { DrpcDevnet }; opt \"${DRPC_API_KEY}\" }; record { variant { HeliusMainnet }; opt \"${HELIUS_API_KEY}\" };