Skip to content

Commit c12eddc

Browse files
authored
Make access lists for tradable balance simulations configurable (cowprotocol#3549)
# Description [The current config](https://github.com/cowprotocol/services/blob/503a50b93a641d936df5767de0fb6dcf377414a7/crates/driver/src/infra/config/file/mod.rs#L23-L26) that controls access lists feature usage for simulations doesn't affect the tradable balance simulations. This is also important for chains that don't support access lists(e.g. ZKSync). This PR fixes it. ## How to test Will be tested on Lens.
1 parent 0c619e7 commit c12eddc

File tree

4 files changed

+36
-16
lines changed

4 files changed

+36
-16
lines changed

crates/driver/src/domain/competition/pre_processing.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ pub struct Utilities {
4646
signature_validator: Arc<dyn SignatureValidating>,
4747
app_data_retriever: Option<order::app_data::AppDataRetriever>,
4848
liquidity_fetcher: infra::liquidity::Fetcher,
49+
disable_access_list_simulation: bool,
4950
}
5051

5152
impl std::fmt::Debug for Utilities {
@@ -102,6 +103,7 @@ impl DataAggregator {
102103
eth: infra::Ethereum,
103104
app_data_retriever: Option<order::app_data::AppDataRetriever>,
104105
liquidity_fetcher: infra::liquidity::Fetcher,
106+
disable_access_list_simulation: bool,
105107
) -> Self {
106108
let signature_validator = shared::signature_validator::validator(
107109
eth.web3(),
@@ -117,6 +119,7 @@ impl DataAggregator {
117119
signature_validator,
118120
app_data_retriever,
119121
liquidity_fetcher,
122+
disable_access_list_simulation,
120123
}),
121124
control: Mutex::new(ControlBlock {
122125
auction: auction::Id(0),
@@ -204,8 +207,12 @@ impl Utilities {
204207
|(trader, token, source, interactions)| {
205208
let token_contract = tokens.get(&token);
206209
let token_contract = token_contract.expect("all tokens were created earlier");
207-
let fetch_balance =
208-
token_contract.tradable_balance(trader.into(), source, interactions);
210+
let fetch_balance = token_contract.tradable_balance(
211+
trader.into(),
212+
source,
213+
interactions,
214+
self.disable_access_list_simulation,
215+
);
209216

210217
async move {
211218
let balance = fetch_balance.await;

crates/driver/src/infra/api/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ impl Api {
4646
shutdown: impl Future<Output = ()> + Send + 'static,
4747
order_priority_strategies: Vec<OrderPriorityStrategy>,
4848
app_data_retriever: Option<AppDataRetriever>,
49+
disable_access_list_simulation: bool,
4950
) -> Result<(), hyper::Error> {
5051
// Add middleware.
5152
let mut app = axum::Router::new().layer(tower::ServiceBuilder::new().layer(
@@ -57,6 +58,7 @@ impl Api {
5758
self.eth.clone(),
5859
app_data_retriever.clone(),
5960
self.liquidity.clone(),
61+
disable_access_list_simulation,
6062
));
6163

6264
let order_sorting_strategies =

crates/driver/src/infra/blockchain/token.rs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,18 @@ impl Erc20 {
8787
trader: eth::Address,
8888
source: order::SellTokenBalance,
8989
interactions: &[eth::Interaction],
90+
disable_access_list_simulation: bool,
9091
) -> Result<eth::TokenAmount, Error> {
9192
if interactions.is_empty() {
9293
self.tradable_balance_simple(trader, source).await
9394
} else {
94-
self.tradable_balance_simulated(trader, source, interactions)
95-
.await
95+
self.tradable_balance_simulated(
96+
trader,
97+
source,
98+
interactions,
99+
disable_access_list_simulation,
100+
)
101+
.await
96102
}
97103
}
98104

@@ -104,6 +110,7 @@ impl Erc20 {
104110
trader: eth::Address,
105111
source: order::SellTokenBalance,
106112
interactions: &[eth::Interaction],
113+
disable_access_lists: bool,
107114
) -> Result<eth::TokenAmount, Error> {
108115
let balance_helper = self.ethereum.contracts().balance_helper();
109116
let mut method = balance_helper.balance(
@@ -127,18 +134,21 @@ impl Erc20 {
127134
})
128135
.collect(),
129136
);
130-
// Create the access list for the balance simulation
131-
let access_list_call = contracts::storage_accessible::call(
132-
method.tx.to.unwrap(),
133-
contracts::bytecode!(contracts::support::Balances),
134-
method.tx.data.clone().unwrap(),
135-
);
136-
let access_list = self
137-
.ethereum
138-
.create_access_list(access_list_call)
139-
.await
140-
.ok();
141-
method.tx.access_list = access_list.map(Into::into);
137+
// Create the access list for the balance simulation only if they are enabled
138+
// system-wide.
139+
if !disable_access_lists {
140+
let access_list_call = contracts::storage_accessible::call(
141+
method.tx.to.unwrap(),
142+
contracts::bytecode!(contracts::support::Balances),
143+
method.tx.data.clone().unwrap(),
144+
);
145+
let access_list = self
146+
.ethereum
147+
.create_access_list(access_list_call)
148+
.await
149+
.ok();
150+
method.tx.access_list = access_list.map(Into::into);
151+
}
142152
let (_, _, effective_balance, can_transfer) = contracts::storage_accessible::simulate(
143153
contracts::bytecode!(contracts::support::Balances),
144154
method,

crates/driver/src/run.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ async fn run_with(args: cli::Args, addr_sender: Option<oneshot::Sender<SocketAdd
9696
},
9797
config.order_priority_strategies,
9898
app_data_retriever,
99+
config.disable_access_list_simulation,
99100
);
100101

101102
futures::pin_mut!(serve);

0 commit comments

Comments
 (0)