Skip to content
This repository was archived by the owner on Jun 1, 2026. It is now read-only.

Commit a2239e5

Browse files
committed
Improve OkxProvider
1 parent 58e5f5d commit a2239e5

16 files changed

Lines changed: 99 additions & 62 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/api/src/main.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ use settings::Settings;
5151
use settings_chain::{ChainProviders, ProviderFactory};
5252
use storage::Database;
5353
use streamer::{StreamProducer, StreamProducerConfig};
54-
use swap::{OkxApiClient, SwapClient};
54+
use swap::SwapClient;
55+
use swapper::okx::{OkxClientConfig, OkxProvider};
5556
use swapper::swapper::GemSwapper;
5657
use webhooks::WebhooksClient;
5758
use websocket_prices::PriceObserverConfig;
@@ -234,8 +235,8 @@ async fn rocket_api(settings: Settings) -> Result<Rocket<Build>, Box<dyn std::er
234235
let redemption_client = RewardsRedemptionClient::new(database.clone(), stream_producer.clone());
235236
let notifications_client = NotificationsClient::new(database.clone());
236237
let near_intents_client = swap::NearIntentsProxyClient::new(cacher_client.clone());
237-
let okx_api_client = OkxApiClient::new(
238-
swapper::okx::OkxClientConfig {
238+
let okx_provider = OkxProvider::new(
239+
OkxClientConfig {
239240
api_key: settings.swap.okx.key.public.clone(),
240241
secret_key: settings.swap.okx.key.secret.clone(),
241242
passphrase: settings.swap.okx.passphrase.clone(),
@@ -276,7 +277,7 @@ async fn rocket_api(settings: Settings) -> Result<Rocket<Build>, Box<dyn std::er
276277
.manage(Mutex::new(wallets_client))
277278
.manage(Mutex::new(notifications_client))
278279
.manage(Mutex::new(near_intents_client))
279-
.manage(okx_api_client)
280+
.manage(okx_provider)
280281
.manage(Mutex::new(portfolio_client))
281282
.manage(auth_client)
282283
.manage(stream_producer);

apps/api/src/swap/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ pub mod okx;
44

55
pub use client::SwapClient;
66
pub use near_intents::NearIntentsProxyClient;
7-
pub use okx::OkxApiClient;
87

98
use crate::responders::{ApiError, ApiResponse};
109
use primitives::FiatAssets;

apps/api/src/swap/okx.rs

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,17 @@
1-
use gem_client::ReqwestClient;
21
use primitives::swap::{ProxyQuote, ProxyQuoteRequest, SwapQuoteData};
32
use rocket::serde::json::Json;
4-
use std::sync::Arc;
53
use swapper::{
6-
RpcProvider,
7-
okx::{BASE_URL, OkxClientConfig, OkxProvider},
4+
RpcClient,
5+
okx::OkxProvider,
86
proxy::ProxyResponse,
97
};
108

11-
pub struct OkxApiClient {
12-
provider: OkxProvider<ReqwestClient>,
13-
}
14-
15-
impl OkxApiClient {
16-
pub fn new(config: OkxClientConfig, rpc_provider: Arc<dyn RpcProvider>) -> Self {
17-
let http = ReqwestClient::new(BASE_URL.to_string(), reqwest::Client::new());
18-
Self {
19-
provider: OkxProvider::new(http, config, rpc_provider),
20-
}
21-
}
22-
}
23-
249
#[rocket::post("/swaps/providers/okx/quote", data = "<body>")]
25-
pub async fn post_okx_quote(body: Json<ProxyQuoteRequest>, client: &rocket::State<OkxApiClient>) -> Json<ProxyResponse<ProxyQuote>> {
26-
Json(client.provider.compute_quote(body.into_inner()).await.into())
10+
pub async fn post_okx_quote(body: Json<ProxyQuoteRequest>, provider: &rocket::State<OkxProvider<RpcClient>>) -> Json<ProxyResponse<ProxyQuote>> {
11+
Json(provider.get_quote(body.into_inner()).await.into())
2712
}
2813

2914
#[rocket::post("/swaps/providers/okx/quote_data", data = "<body>")]
30-
pub async fn post_okx_quote_data(body: Json<ProxyQuote>, client: &rocket::State<OkxApiClient>) -> Json<ProxyResponse<SwapQuoteData>> {
31-
Json(client.provider.compute_quote_data(body.into_inner()).await.into())
15+
pub async fn post_okx_quote_data(body: Json<ProxyQuote>, provider: &rocket::State<OkxProvider<RpcClient>>) -> Json<ProxyResponse<SwapQuoteData>> {
16+
Json(provider.get_quote_data(body.into_inner()).await.into())
3217
}

crates/gem_solana/src/provider/balances.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,14 @@ mod chain_integration_tests {
6060
use super::*;
6161
use crate::{
6262
PYUSD_TOKEN_MINT, USDC_TOKEN_MINT, USDT_TOKEN_MINT,
63-
provider::testkit::{TEST_ADDRESS, create_solana_test_client},
63+
provider::testkit::create_solana_test_client,
6464
};
65-
use primitives::Chain;
65+
use primitives::{Chain, testkit::signer_mock::TEST_SOLANA_SENDER};
6666

6767
#[tokio::test]
6868
async fn test_solana_get_balance_coin() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
6969
let client = create_solana_test_client();
70-
let balance = client.get_balance_coin(TEST_ADDRESS.to_string()).await?;
70+
let balance = client.get_balance_coin(TEST_SOLANA_SENDER.to_string()).await?;
7171

7272
assert_eq!(balance.asset_id.chain, Chain::Solana);
7373
assert_eq!(balance.asset_id.token_id, None);
@@ -81,7 +81,7 @@ mod chain_integration_tests {
8181
let client = create_solana_test_client();
8282
let token_ids = vec![USDC_TOKEN_MINT.to_string(), USDT_TOKEN_MINT.to_string(), PYUSD_TOKEN_MINT.to_string()];
8383

84-
let balances = client.get_balance_tokens(TEST_ADDRESS.to_string(), token_ids.clone()).await?;
84+
let balances = client.get_balance_tokens(TEST_SOLANA_SENDER.to_string(), token_ids.clone()).await?;
8585

8686
assert_eq!(balances.len(), token_ids.len());
8787
for (i, balance) in balances.iter().enumerate() {
@@ -96,7 +96,7 @@ mod chain_integration_tests {
9696
#[tokio::test]
9797
async fn test_solana_get_balance_staking() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
9898
let client = create_solana_test_client();
99-
let staking_balance = client.get_balance_staking(TEST_ADDRESS.to_string()).await?;
99+
let staking_balance = client.get_balance_staking(TEST_SOLANA_SENDER.to_string()).await?;
100100

101101
if let Some(balance) = staking_balance {
102102
assert_eq!(balance.asset_id.chain, Chain::Solana);
@@ -110,7 +110,7 @@ mod chain_integration_tests {
110110
#[tokio::test]
111111
async fn test_solana_get_balance_assets() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
112112
let client = create_solana_test_client();
113-
let address = TEST_ADDRESS.to_string();
113+
let address = TEST_SOLANA_SENDER.to_string();
114114
let assets = client.get_balance_assets(address).await?;
115115

116116
for asset in assets {

crates/gem_solana/src/provider/preload.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ impl<C: Client + Clone> ChainTransactionLoad for SolanaClient<C> {
7878
#[cfg(all(test, feature = "chain_integration_tests"))]
7979
mod chain_integration_tests {
8080
use super::*;
81-
use crate::provider::testkit::{TEST_ADDRESS, TEST_EMPTY_ADDRESS, create_solana_test_client};
81+
use primitives::testkit::signer_mock::TEST_SOLANA_SENDER;
82+
use crate::provider::testkit::{ TEST_EMPTY_ADDRESS, create_solana_test_client};
8283
use primitives::swap::SwapData;
8384
use primitives::{Asset, SwapProvider};
8485

@@ -95,8 +96,8 @@ mod chain_integration_tests {
9596
let client = create_solana_test_client();
9697
let input = TransactionPreloadInput {
9798
input_type: TransactionInputType::Transfer(Asset::mock_sol()),
98-
sender_address: TEST_ADDRESS.to_string(),
99-
destination_address: TEST_ADDRESS.to_string(),
99+
sender_address: TEST_SOLANA_SENDER.to_string(),
100+
destination_address: TEST_SOLANA_SENDER.to_string(),
100101
};
101102
let result = client.get_transaction_preload(input).await?;
102103

@@ -114,7 +115,7 @@ mod chain_integration_tests {
114115
let client = create_solana_test_client();
115116
let input = TransactionPreloadInput {
116117
input_type: TransactionInputType::Transfer(Asset::mock_spl_token()),
117-
sender_address: TEST_ADDRESS.to_string(),
118+
sender_address: TEST_SOLANA_SENDER.to_string(),
118119
destination_address: "4BgapREafMMprtU6CehRmH8LUY26PRFmGf7K4S44oSMW".to_string(),
119120
};
120121

@@ -135,8 +136,8 @@ mod chain_integration_tests {
135136
let swap_data = SwapData::mock_with_provider(SwapProvider::Jupiter);
136137
let input = TransactionPreloadInput {
137138
input_type: TransactionInputType::Swap(Asset::mock_spl_token().clone(), Asset::mock_ethereum_usdc().clone(), swap_data),
138-
sender_address: TEST_ADDRESS.to_string(),
139-
destination_address: TEST_ADDRESS.to_string(),
139+
sender_address: TEST_SOLANA_SENDER.to_string(),
140+
destination_address: TEST_SOLANA_SENDER.to_string(),
140141
};
141142

142143
let result = client.get_transaction_preload(input).await?;
@@ -161,7 +162,7 @@ mod chain_integration_tests {
161162
let swap_data = SwapData::mock_with_provider(SwapProvider::Jupiter);
162163
let input = TransactionPreloadInput {
163164
input_type: TransactionInputType::Swap(Asset::mock_spl_token(), Asset::mock_spl_token(), swap_data),
164-
sender_address: TEST_ADDRESS.to_string(),
165+
sender_address: TEST_SOLANA_SENDER.to_string(),
165166
destination_address: TEST_EMPTY_ADDRESS.to_string(),
166167
};
167168

crates/gem_solana/src/provider/staking.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ impl<C: Client + Clone> ChainStaking for SolanaClient<C> {
4040
#[cfg(all(test, feature = "chain_integration_tests"))]
4141
mod chain_integration_tests {
4242
use super::*;
43-
use crate::provider::testkit::{TEST_ADDRESS, create_solana_test_client};
43+
use primitives::testkit::signer_mock::TEST_SOLANA_SENDER;
44+
use crate::provider::testkit::{ create_solana_test_client};
4445

4546
#[tokio::test]
4647
async fn test_solana_get_staking_apy() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
@@ -62,7 +63,7 @@ mod chain_integration_tests {
6263
#[tokio::test]
6364
async fn test_solana_get_staking_delegations() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
6465
let client = create_solana_test_client();
65-
let delegations = client.get_staking_delegations(TEST_ADDRESS.to_string()).await?;
66+
let delegations = client.get_staking_delegations(TEST_SOLANA_SENDER.to_string()).await?;
6667
assert!(delegations.len() <= 100);
6768
Ok(())
6869
}

crates/gem_solana/src/provider/testkit.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ use gem_jsonrpc::JsonRpcClient;
77
#[cfg(feature = "chain_integration_tests")]
88
use settings::testkit::get_test_settings;
99

10-
#[cfg(feature = "chain_integration_tests")]
11-
pub const TEST_ADDRESS: &str = "8wytzyCBXco7yqgrLDiecpEt452MSuNWRe7xsLgAAX1H";
1210
#[cfg(feature = "chain_integration_tests")]
1311
pub const TEST_EMPTY_ADDRESS: &str = "EniLGJRPvjbD51z5r59HRN4XoeMmRC4zMtHNHBKi1sFA";
1412
#[cfg(test)]

crates/gem_solana/src/provider/transactions.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ impl<C: Client + Clone> ChainTransactions for SolanaClient<C> {
5252
#[cfg(all(test, feature = "chain_integration_tests"))]
5353
mod chain_integration_tests {
5454
use super::*;
55-
use crate::provider::testkit::{TEST_ADDRESS, TEST_TRANSACTION_ID, create_solana_test_client};
55+
use primitives::testkit::signer_mock::TEST_SOLANA_SENDER;
56+
use crate::provider::testkit::{ TEST_TRANSACTION_ID, create_solana_test_client};
5657
use chain_traits::ChainState;
5758

5859
#[tokio::test]
@@ -70,9 +71,9 @@ mod chain_integration_tests {
7071
#[tokio::test]
7172
async fn test_solana_get_transactions_by_address() {
7273
let client = create_solana_test_client();
73-
let transactions = client.get_transactions_by_address(TransactionsRequest::new(TEST_ADDRESS.to_string())).await.unwrap();
74+
let transactions = client.get_transactions_by_address(TransactionsRequest::new(TEST_SOLANA_SENDER.to_string())).await.unwrap();
7475

75-
println!("Address: {}, transactions count: {}", TEST_ADDRESS, transactions.len());
76+
println!("Address: {}, transactions count: {}", TEST_SOLANA_SENDER, transactions.len());
7677
}
7778

7879
#[tokio::test]

crates/primitives/src/testkit/signer_mock.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ pub const TEST_PRIVATE_KEY: [u8; 32] = [1u8; 32];
22
pub const TEST_EVM_SENDER: &str = "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf";
33
pub const TEST_EVM_RECIPIENT: &str = "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF";
44
pub const TEST_OSMOSIS_SENDER: &str = "osmo1kglemumu8mn658j6g4z9jzn3zef2qdyyvklwa3";
5+
pub const TEST_SOLANA_SENDER: &str = "8wytzyCBXco7yqgrLDiecpEt452MSuNWRe7xsLgAAX1H";
6+
pub const TEST_TON_SENDER: &str = "UQAzoUpalAaXnVm5MoiYWRZguLFzY0KxFjLv3MkRq5BXz3VV";

0 commit comments

Comments
 (0)