Skip to content

Commit e35b307

Browse files
committed
wip
1 parent fc439e7 commit e35b307

File tree

6 files changed

+92
-77
lines changed

6 files changed

+92
-77
lines changed

crates/gateway/gateway-server/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use axum::Router;
77
use katana_core::service::block_producer::BlockProducer;
88
use katana_pool_api::TransactionPool;
99
use katana_provider::{ProviderFactory, ProviderRO, ProviderRW};
10-
use katana_rpc_server::cors::Cors;
10+
use katana_rpc_server::middleware::cors::Cors;
1111
use katana_rpc_server::starknet::StarknetApi;
1212
use tokio::net::TcpListener;
1313
use tokio::sync::watch;

crates/grpc/src/handlers/starknet.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Starknet service handler implementation.
22
3-
use katana_pool::TransactionPool;
3+
use katana_pool::api::TransactionPool;
44
use katana_primitives::transaction::TxHash;
55
use katana_primitives::Felt;
66
use katana_provider::{ProviderFactory, ProviderRO};

crates/node/full/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use katana_pool::ordering::TipOrdering;
2626
use katana_provider::DbProviderFactory;
2727
use katana_rpc_api::katana::KatanaApiServer;
2828
use katana_rpc_api::starknet::{StarknetApiServer, StarknetTraceApiServer, StarknetWriteApiServer};
29-
use katana_rpc_server::cors::Cors;
29+
use katana_rpc_server::middleware::cors::Cors;
3030
use katana_rpc_server::starknet::{StarknetApi, StarknetApiConfig};
3131
use katana_rpc_server::{RpcServer, RpcServerHandle};
3232
use katana_stage::blocks::BatchBlockDownloader;

crates/node/sequencer/src/lib.rs

Lines changed: 28 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,15 @@ where
238238

239239
let mut rpc_modules = RpcModule::new(());
240240

241-
let cors = Cors::new()
242-
.allow_origins(config.rpc.cors_origins.clone())
243241
// Allow `POST` when accessing the resource
244-
.allow_methods([Method::POST, Method::GET])
245-
.allow_headers([CONTENT_TYPE, "argent-client".parse().unwrap(), "argent-version".parse().unwrap()]);
242+
let cors = Cors::new()
243+
.allow_origins(config.rpc.cors_origins.clone())
244+
.allow_methods([Method::POST, Method::GET])
245+
.allow_headers([
246+
CONTENT_TYPE,
247+
"argent-client".parse().unwrap(),
248+
"argent-version".parse().unwrap(),
249+
]);
246250

247251
#[cfg(feature = "paymaster")]
248252
if let Some(cfg) = &config.paymaster {
@@ -251,8 +255,12 @@ where
251255
};
252256

253257
#[cfg(feature = "cartridge")]
254-
if let Some(cfg) = &config.paymaster {
258+
let controller_deployment_layer = if let Some(cfg) = &config.paymaster {
255259
if let Some(cartridge_api_cfg) = &cfg.cartridge_api {
260+
use katana_rpc_client::HttpClient;
261+
use katana_rpc_server::cartridge::VrfService;
262+
use katana_rpc_server::middleware::cartridge::ControllerDeploymentLayer;
263+
256264
anyhow::ensure!(
257265
config.rpc.apis.contains(&RpcModuleKind::Cartridge),
258266
"Cartridge API should be enabled when paymaster is set"
@@ -274,6 +282,9 @@ where
274282
None
275283
};
276284

285+
let cartridge_api_client =
286+
cartridge::CartridgeApiClient::new(cartridge_api_cfg.cartridge_api_url.clone());
287+
277288
let cartridge_api_config = CartridgeConfig {
278289
paymaster_url: cfg.url.clone(),
279290
paymaster_api_key: cfg.api_key.clone(),
@@ -282,7 +293,7 @@ where
282293
controller_deployer_private_key: cartridge_api_cfg
283294
.controller_deployer_private_key,
284295
#[cfg(feature = "vrf")]
285-
vrf,
296+
vrf: vrf.clone(),
286297
};
287298

288299
let cartrige_api = CartridgeApi::new(
@@ -295,11 +306,16 @@ where
295306

296307
rpc_modules.merge(CartridgeApiServer::into_rpc(cartrige_api))?;
297308

298-
Some(CartridgePaymasterConfig {
299-
cartridge_api_url: cartridge_api_cfg.cartridge_api_url.clone(),
300-
paymaster_address: cartridge_api_cfg.controller_deployer_address,
301-
paymaster_private_key: cartridge_api_cfg.controller_deployer_private_key,
302-
})
309+
Some(ControllerDeploymentLayer::new(
310+
starknet_api.clone(),
311+
cartridge_api_client,
312+
HttpClient::builder().build(cfg.url)?,
313+
cartridge_api_cfg.controller_deployer_address,
314+
SigningKey::from_secret_scalar(
315+
cartridge_api_cfg.controller_deployer_private_key,
316+
),
317+
vrf.map(VrfService::new),
318+
))
303319
} else {
304320
None
305321
}
@@ -381,54 +397,14 @@ where
381397
}
382398
}
383399

384-
// --- build paymaster tower layer (if configured)
385-
386-
#[cfg(feature = "cartridge")]
387-
let paymaster = if let Some(cfg) = &config.paymaster {
388-
if let Some(cartridge_api_cfg) = &cfg.cartridge_api {
389-
if let Some(vrf_cfg) = &cartridge_api_cfg.vrf {
390-
info!(target: "cartridge", "Paymaster tower layer enabled");
391-
392-
let cartridge_api_client = cartridge::CartridgeApiClient::new(
393-
cartridge_api_cfg.cartridge_api_url.clone(),
394-
);
395-
396-
let rpc_url = url::Url::parse(&format!("http://{}", config.rpc.socket_addr()))
397-
.expect("valid rpc url");
398-
399-
let vrf_client = cartridge::VrfClient::new(vrf_cfg.url.clone());
400-
401-
Some(Paymaster::new(
402-
provider.clone(),
403-
cartridge_api_client,
404-
pool.clone(),
405-
config.chain.id(),
406-
cartridge_api_cfg.controller_deployer_address,
407-
SigningKey::from_secret_scalar(
408-
cartridge_api_cfg.controller_deployer_private_key,
409-
),
410-
vrf_client,
411-
vrf_cfg.vrf_account,
412-
rpc_url,
413-
))
414-
} else {
415-
None
416-
}
417-
} else {
418-
None
419-
}
420-
} else {
421-
None
422-
};
423-
424400
// --- build rpc middleware
425401

426402
let rpc_middleware = RpcServiceBuilder::new()
427403
.layer(RpcServerMetricsLayer::new(&rpc_modules))
428404
.layer(RpcLoggerLayer::new());
429405

430406
#[cfg(feature = "cartridge")]
431-
let rpc_middleware = rpc_middleware.option_layer(paymaster.map(|p| p.layer()));
407+
let rpc_middleware = rpc_middleware.option_layer(controller_deployment_layer);
432408

433409
#[allow(unused_mut)]
434410
let mut rpc_server = RpcServer::new()

crates/rpc/rpc-server/src/cartridge/mod.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use http::{HeaderMap, HeaderName, HeaderValue};
3636
use jsonrpsee::core::{async_trait, RpcResult};
3737
use jsonrpsee::http_client::{HttpClient, HttpClientBuilder};
3838
use katana_core::backend::Backend;
39-
use katana_core::service::block_producer::{BlockProducer, BlockProducerMode};
39+
use katana_core::service::block_producer::BlockProducer;
4040
use katana_genesis::constant::{DEFAULT_STRK_FEE_TOKEN_ADDRESS, DEFAULT_UDC_ADDRESS};
4141
use katana_pool::api::TransactionPool;
4242
use katana_pool::TxPool;
@@ -161,20 +161,6 @@ where
161161
})
162162
}
163163

164-
fn nonce(&self, address: ContractAddress) -> Result<Option<Nonce>, CartridgeApiError> {
165-
match self.pool.get_nonce(address) {
166-
pending_nonce @ Some(..) => Ok(pending_nonce),
167-
None => Ok(self.state()?.nonce(address)?),
168-
}
169-
}
170-
171-
fn state(&self) -> Result<Box<dyn StateProvider>, CartridgeApiError> {
172-
match &*self.block_producer.producer.read() {
173-
BlockProducerMode::Instant(_) => Ok(self.backend.storage.provider().latest()?),
174-
BlockProducerMode::Interval(producer) => Ok(producer.executor().read().state()),
175-
}
176-
}
177-
178164
pub async fn execute_outside(
179165
&self,
180166
contract_address: ContractAddress,
@@ -261,6 +247,7 @@ where
261247
where
262248
T: FnOnce(Self) -> F,
263249
F: Future + Send + 'static,
250+
F::Output: Send + 'static,
264251
{
265252
use tokio::runtime::Builder;
266253

crates/rpc/rpc-server/src/middleware/cartridge.rs

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::borrow::Cow;
2-
use std::collections::HashSet;
32
use std::future::Future;
43

54
use cartridge::vrf::VrfClientError;
@@ -27,6 +26,7 @@ use starknet::core::types::SimulationFlagForEstimateFee;
2726
use starknet::macros::selector;
2827
use starknet::signers::local_wallet::SignError;
2928
use starknet::signers::{LocalWallet, Signer, SigningKey};
29+
use tower::Layer;
3030
use tracing::{debug, trace};
3131

3232
use crate::cartridge::{encode_calls, VrfService};
@@ -37,9 +37,10 @@ const CARTRIDGE_ADD_EXECUTE_FROM_OUTSIDE: &str = "cartridge_addExecuteFromOutsid
3737
const CARTRIDGE_ADD_EXECUTE_FROM_OUTSIDE_TX: &str = "cartridge_addExecuteOutsideTransaction";
3838

3939
#[derive(Debug)]
40-
pub struct ControllerDeploymentLayer<Pool, PP, PF>
40+
pub struct ControllerDeploymentLayer<Pool, PoolTx, PP, PF>
4141
where
42-
Pool: TransactionPool + 'static,
42+
Pool: TransactionPool<Transaction = PoolTx> + 'static,
43+
PoolTx: From<BroadcastedTxWithChainId>,
4344
PP: PendingBlockProvider,
4445
PF: ProviderFactory,
4546
<PF as ProviderFactory>::Provider: ProviderRO,
@@ -52,6 +53,56 @@ where
5253
vrf_service: Option<VrfService>,
5354
}
5455

56+
impl<Pool, PoolTx, PP, PF> ControllerDeploymentLayer<Pool, PoolTx, PP, PF>
57+
where
58+
Pool: TransactionPool<Transaction = PoolTx> + 'static,
59+
PoolTx: From<BroadcastedTxWithChainId>,
60+
PP: PendingBlockProvider,
61+
PF: ProviderFactory,
62+
<PF as ProviderFactory>::Provider: ProviderRO,
63+
{
64+
pub fn new(
65+
starknet: StarknetApi<Pool, PP, PF>,
66+
cartridge_api: CartridgeApiClient,
67+
paymaster_client: HttpClient,
68+
deployer_address: ContractAddress,
69+
deployer_private_key: SigningKey,
70+
vrf_service: Option<VrfService>,
71+
) -> Self {
72+
Self {
73+
starknet,
74+
cartridge_api,
75+
paymaster_client,
76+
deployer_address,
77+
deployer_private_key,
78+
vrf_service,
79+
}
80+
}
81+
}
82+
83+
impl<S, Pool, PoolTx, PP, PF> Layer<S> for ControllerDeploymentLayer<Pool, PoolTx, PP, PF>
84+
where
85+
Pool: TransactionPool<Transaction = PoolTx> + 'static,
86+
PoolTx: From<BroadcastedTxWithChainId>,
87+
PP: PendingBlockProvider,
88+
PF: ProviderFactory,
89+
<PF as ProviderFactory>::Provider: ProviderRO,
90+
{
91+
type Service = ControllerDeploymentService<S, Pool, PP, PF>;
92+
93+
fn layer(&self, inner: S) -> Self::Service {
94+
ControllerDeploymentService {
95+
service: inner,
96+
starknet: self.starknet.clone(),
97+
cartridge_api: self.cartridge_api.clone(),
98+
paymaster_client: self.paymaster_client.clone(),
99+
vrf_service: self.vrf_service.clone(),
100+
deployer_address: self.deployer_address,
101+
deployer_private_key: self.deployer_private_key.clone(),
102+
}
103+
}
104+
}
105+
55106
#[derive(Debug)]
56107
pub struct ControllerDeploymentService<S, Pool, PP, PF>
57108
where
@@ -89,7 +140,7 @@ where
89140
request: Request<'a>,
90141
) -> S::MethodResponse {
91142
let request_id = request.id().clone();
92-
match self.handle_estimate_fee_inner(params, request).await {
143+
match self.starknet_estimate_fee_inner(params, request).await {
93144
Ok(response) => response,
94145
Err(err) => MethodResponse::error(request_id, ErrorObjectOwned::from(err)),
95146
}
@@ -100,14 +151,14 @@ where
100151
params: AddExecuteOutsideParams,
101152
request: Request<'a>,
102153
) -> S::MethodResponse {
103-
if let Err(err) = self.handle_execute_outside_inner(params).await {
154+
if let Err(err) = self.cartridge_add_execute_from_outside_inner(params).await {
104155
MethodResponse::error(request.id().clone(), ErrorObjectOwned::from(err))
105156
} else {
106157
self.service.call(request).await
107158
}
108159
}
109160

110-
async fn handle_estimate_fee_inner<'a>(
161+
async fn starknet_estimate_fee_inner<'a>(
111162
&self,
112163
params: EstimateFeeParams,
113164
request: Request<'a>,
@@ -169,7 +220,7 @@ where
169220
}
170221
}
171222

172-
async fn handle_execute_outside_inner(
223+
async fn cartridge_add_execute_from_outside_inner(
173224
&self,
174225
params: AddExecuteOutsideParams,
175226
) -> Result<(), CartridgeApiError> {
@@ -180,6 +231,7 @@ where
180231
let is_deployed = match self.starknet.class_hash_at_address(block_id, address).await {
181232
Ok(..) => true,
182233
Err(StarknetApiError::ContractNotFound) => false,
234+
183235
Err(e) => {
184236
return Err(CartridgeApiError::ControllerDeployment {
185237
reason: format!("failed to check Controller deployment status: {e}"),

0 commit comments

Comments
 (0)