@@ -374,11 +374,11 @@ pub async fn deposit_trade(
374374 State ( server_params) : State < & ' static ServerParams > ,
375375 Json ( req) : Json < DepositAndPlaceRequest > ,
376376) -> impl axum:: response:: IntoResponse {
377- let min_trade_value = 100 * PRICE_PRECISION as u64 ;
377+ let min_deposit_value = 100 * PRICE_PRECISION as u64 ;
378378
379379 if req. deposit_tx . signatures . is_empty ( )
380- || req. deposit_tx . message . instructions . len ( ) != 1
381- || req. deposit_tx . verify ( ) . is_err ( )
380+ || req. deposit_tx . message . instructions ( ) . len ( ) != 1
381+ || req. deposit_tx . verify_with_results ( ) . iter ( ) . all ( |x| * x )
382382 {
383383 return (
384384 StatusCode :: BAD_REQUEST ,
@@ -390,20 +390,20 @@ pub async fn deposit_trade(
390390 }
391391
392392 // verify deposit ix exists and amount
393- let ix = & req. deposit_tx . message . instructions [ 0 ] ;
393+ let ix = & req. deposit_tx . message . instructions ( ) [ 0 ] ;
394394 if & ix. data [ ..8 ] == drift_idl:: instructions:: Deposit :: DISCRIMINATOR {
395395 if let Ok ( deposit_ix) = drift_idl:: instructions:: Deposit :: deserialize ( & mut & ix. data [ 8 ..] ) {
396396 let spot_oracle = server_params
397397 . drift
398398 . try_get_oracle_price_data_and_slot ( MarketId :: spot ( deposit_ix. market_index ) )
399399 . expect ( "got price" ) ;
400400 let deposit_value = spot_oracle. data . price as u64 * deposit_ix. amount ;
401- if deposit_value < min_trade_value {
401+ if deposit_value < min_deposit_value {
402402 return (
403403 StatusCode :: BAD_REQUEST ,
404404 Json ( ProcessOrderResponse {
405405 message : "" ,
406- error : Some ( format ! ( "deposit size must be > ${min_trade_value }" ) ) ,
406+ error : Some ( format ! ( "deposit size must be > ${min_deposit_value }" ) ) ,
407407 } ) ,
408408 ) ;
409409 }
@@ -426,6 +426,28 @@ pub async fn deposit_trade(
426426 ) ;
427427 }
428428
429+ match server_params
430+ . drift
431+ . simulate_tx ( req. deposit_tx . message . clone ( ) )
432+ . await
433+ {
434+ Ok ( res) => {
435+ if let Some ( err) = res. err {
436+ log:: info!( target: "server" , "deposit sim failed: {err:?}" ) ;
437+ return (
438+ StatusCode :: BAD_REQUEST ,
439+ Json ( ProcessOrderResponse {
440+ message : "" ,
441+ error : Some ( "invalid deposit tx" . into ( ) ) ,
442+ } ) ,
443+ ) ;
444+ }
445+ }
446+ Err ( err) => {
447+ log:: info!( target: "server" , "deposit sim network err: {err:?}" ) ;
448+ }
449+ }
450+
429451 let context = RequestContext :: from_incoming_message ( & req. swift_order ) ;
430452 let ( status, resp) = match process_order ( server_params, req. swift_order , & context) . await {
431453 Ok ( order_metadata) => {
0 commit comments