Skip to content

Commit 1e00004

Browse files
authored
Merge pull request #45 from bcnmy/dev
fix: token amount in approval (#44)
2 parents 3cd7103 + b900ebf commit 1e00004

File tree

3 files changed

+47
-20
lines changed

3 files changed

+47
-20
lines changed

crates/routing-engine/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ pub enum RouteError {
111111
#[derive(Debug)]
112112
pub struct BridgeResult {
113113
route: Route,
114+
source_amount: f64,
114115
source_amount_in_usd: f64,
115116
from_address: String,
116117
to_address: String,
@@ -147,6 +148,7 @@ impl BridgeResult {
147148
from_token_id: &String,
148149
to_token_id: &String,
149150
is_smart_contract_deposit: bool,
151+
source_amount: f64,
150152
source_amount_in_usd: f64,
151153
from_address: String,
152154
to_address: String,
@@ -160,6 +162,7 @@ impl BridgeResult {
160162
to_token_id,
161163
is_smart_contract_deposit,
162164
)?,
165+
source_amount,
163166
source_amount_in_usd,
164167
from_address,
165168
to_address,
@@ -200,6 +203,7 @@ mod test {
200203
&"USDT".to_string(),
201204
false,
202205
100.0,
206+
200.0,
203207
"0x123".to_string(),
204208
"0x456".to_string(),
205209
)

crates/routing-engine/src/routing_engine.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@ use std::cmp;
22
use std::collections::HashMap;
33
use std::sync::Arc;
44

5-
use alloy::dyn_abi::abi::Token;
65
use futures::stream::{self, StreamExt};
76
use log::{debug, error, info};
87
use thiserror::Error;
98
use tokio::sync::{Mutex, RwLock};
109

1110
use account_aggregation::{service::AccountAggregationService, types::TokenWithBalance};
12-
use config::{ChainConfig, Config, config::BucketConfig, SolverConfig, TokenConfig};
11+
use config::{config::BucketConfig, ChainConfig, Config, SolverConfig, TokenConfig};
1312
use storage::{KeyValueStore, RedisClient, RedisClientError};
1413

14+
use crate::token_price::utils::{get_token_price, Errors};
15+
use crate::token_price::TokenPriceProvider;
1516
use crate::{
16-
BridgeResult,
17-
BridgeResultVecWrapper, estimator::{Estimator, LinearRegressionEstimator}, Route,
17+
estimator::{Estimator, LinearRegressionEstimator},
18+
BridgeResult, BridgeResultVecWrapper, Route,
1819
};
19-
use crate::token_price::TokenPriceProvider;
20-
use crate::token_price::utils::{Errors, get_token_price};
2120

2221
const FETCH_REDIS_KEYS_BATCH_SIZE: usize = 50;
2322

@@ -241,6 +240,7 @@ impl<PriceProvider: TokenPriceProvider> RoutingEngine<PriceProvider> {
241240
to_chain,
242241
&balance.token,
243242
to_token,
243+
balance.amount,
244244
amount_to_take,
245245
false,
246246
&balance.address,
@@ -321,6 +321,7 @@ impl<PriceProvider: TokenPriceProvider> RoutingEngine<PriceProvider> {
321321
to_chain_id: u32,
322322
from_token_id: &str,
323323
to_token_id: &str,
324+
token_amount: f64,
324325
token_amount_in_usd: f64,
325326
is_smart_contract_deposit: bool,
326327
from_address: &str,
@@ -344,6 +345,7 @@ impl<PriceProvider: TokenPriceProvider> RoutingEngine<PriceProvider> {
344345

345346
Ok(BridgeResult {
346347
route: Route { from_chain, to_chain, from_token, to_token, is_smart_contract_deposit },
348+
source_amount: token_amount,
347349
source_amount_in_usd: token_amount_in_usd,
348350
from_address: from_address.to_string(),
349351
to_address: to_address.to_string(),
@@ -366,20 +368,20 @@ mod tests {
366368

367369
use account_aggregation::service::AccountAggregationService;
368370
use config::{
369-
BucketConfig, ChainConfig, get_sample_config, SolverConfig, TokenConfig,
371+
get_sample_config, BucketConfig, ChainConfig, SolverConfig, TokenConfig,
370372
TokenConfigByChainConfigs,
371373
};
372-
use storage::{KeyValueStore, RedisClientError};
373374
use storage::mongodb_client::MongoDBClient;
375+
use storage::{KeyValueStore, RedisClientError};
374376

377+
use crate::estimator::Estimator;
378+
use crate::routing_engine::PathQuery;
379+
use crate::token_price::TokenPriceProvider;
375380
use crate::{
376-
CoingeckoClient,
377381
estimator::{DataPoint, LinearRegressionEstimator},
378382
routing_engine::{RoutingEngine, RoutingEngineError},
383+
CoingeckoClient,
379384
};
380-
use crate::estimator::Estimator;
381-
use crate::routing_engine::PathQuery;
382-
use crate::token_price::TokenPriceProvider;
383385

384386
#[derive(Error, Debug, Display)]
385387
struct Err;

crates/routing-engine/src/settlement_engine.rs

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::cmp;
12
use std::collections::HashMap;
23
use std::sync::Arc;
34

@@ -15,11 +16,11 @@ use tokio::sync::Mutex;
1516

1617
use config::{Config, TokenAddress};
1718

18-
use crate::{blockchain, BridgeResult, BridgeResultVecWrapper, Route};
1919
use crate::blockchain::erc20::IERC20::IERC20Instance;
2020
use crate::source::{EthereumTransaction, RequiredApprovalDetails, RouteSource};
21+
use crate::token_price::utils::{get_token_amount_from_value_in_usd, Errors};
2122
use crate::token_price::TokenPriceProvider;
22-
use crate::token_price::utils::{Errors, get_token_amount_from_value_in_usd};
23+
use crate::{blockchain, BridgeResult, BridgeResultVecWrapper};
2324

2425
pub struct SettlementEngine<Source: RouteSource, PriceProvider: TokenPriceProvider> {
2526
source: Source,
@@ -100,13 +101,28 @@ impl<Source: RouteSource, PriceProvider: TokenPriceProvider>
100101
.await
101102
.map_err(|err| SettlementEngineErrors::GetTokenAmountFromValueInUsdError(err))?;
102103

103-
info!("Token amount: {:?} for route {}", token_amount, route);
104+
let max_user_balance = &route.source_amount
105+
* f64::powi(
106+
10.0,
107+
route
108+
.route
109+
.from_token
110+
.by_chain
111+
.get(&route.route.from_chain.id)
112+
.unwrap()
113+
.decimals
114+
.into(),
115+
);
116+
let max_user_balance = max_user_balance.floor().to_string().parse()?;
117+
let user_balance: Uint<256, 4> = cmp::min(max_user_balance, token_amount);
118+
119+
info!("Token amount: {:?} for route {}", user_balance, route);
104120

105121
let (ethereum_transactions, required_approval_details) = self
106122
.source
107123
.generate_route_transactions(
108124
&route.route,
109-
&token_amount,
125+
&user_balance,
110126
&route.from_address,
111127
&route.to_address,
112128
)
@@ -126,7 +142,7 @@ impl<Source: RouteSource, PriceProvider: TokenPriceProvider>
126142
from_address: route.from_address.clone(),
127143
to_address: route.to_address.clone(),
128144
token: route.route.from_token.symbol.clone(),
129-
token_amount: token_amount.clone(),
145+
token_amount: user_balance.clone(),
130146
},
131147
t,
132148
)
@@ -224,7 +240,7 @@ impl<Source: RouteSource, PriceProvider: TokenPriceProvider>
224240
return Ok(None);
225241
}
226242

227-
let required_approval = required_approval_details.amount - current_approval;
243+
let required_approval = required_approval_details.amount;
228244
info!(
229245
"Required Approval: {:?} against requirement: {:?}",
230246
required_approval, required_approval_details
@@ -353,6 +369,9 @@ pub enum SettlementEngineErrors<Source: RouteSource, PriceProvider: TokenPricePr
353369

354370
#[error("Error while calling ERC20 Contract: {0}")]
355371
AlloyError(#[from] alloy::contract::Error),
372+
373+
#[error("Error while parsing U256: {0}")]
374+
ParseError(#[from] ruint::ParseError),
356375
}
357376

358377
pub fn generate_erc20_instance_map(
@@ -440,14 +459,14 @@ mod tests {
440459
use thiserror::Error;
441460
use tokio::sync::Mutex;
442461

443-
use config::{Config, get_sample_config};
462+
use config::{get_sample_config, Config};
444463
use storage::{KeyValueStore, RedisClientError};
445464

446-
use crate::{BridgeResult, BungeeClient, CoingeckoClient};
447465
use crate::settlement_engine::{
448466
generate_erc20_instance_map, SettlementEngine, SettlementEngineErrors, TransactionType,
449467
};
450468
use crate::source::{EthereumTransaction, RequiredApprovalDetails};
469+
use crate::{BridgeResult, BungeeClient, CoingeckoClient};
451470

452471
#[derive(Error, Debug, Display)]
453472
struct Err;
@@ -768,6 +787,7 @@ mod tests {
768787
&"USDC".to_string(),
769788
&"USDC".to_string(),
770789
false,
790+
200.0,
771791
1000.0,
772792
TEST_OWNER_WALLET.to_string(),
773793
TEST_OWNER_WALLET.to_string(),
@@ -805,6 +825,7 @@ mod tests {
805825
&"USDC".to_string(),
806826
&"USDT".to_string(),
807827
false,
828+
200.0,
808829
1000.0,
809830
TEST_OWNER_WALLET.to_string(),
810831
TEST_OWNER_WALLET.to_string(),

0 commit comments

Comments
 (0)