Skip to main content

OrderSubmitter

Struct OrderSubmitter 

Source
pub struct OrderSubmitter { /* private fields */ }
Expand description

Order submission facade for dYdX v4.

Provides a clean API for order submission, internally coordinating:

§Wallet Ownership

The wallet is owned by TransactionManager (passed at construction via private_key). This eliminates the need to pass &wallet to every method.

§Block Time Monitor

block_time_monitor provides current block height and dynamic block time estimation. Updated externally by WebSocket, read by order methods.

§Thread Safety

All methods are safe to call from multiple tasks concurrently.

Implementations§

Source§

impl OrderSubmitter

Source

pub fn new( grpc_client: DydxGrpcClient, http_client: DydxHttpClient, private_key: &str, wallet_address: String, subaccount_number: u32, chain_id: ChainId, block_time_monitor: Arc<BlockTimeMonitor>, ) -> Result<Self, DydxError>

Creates a new order submitter with wallet owned internally.

§Arguments
  • grpc_client - gRPC client for chain queries and broadcasting
  • http_client - HTTP client (provides market params cache)
  • private_key - Private key (hex-encoded) - wallet created internally
  • wallet_address - Main account address (may differ from derived address for permissioned keys)
  • subaccount_number - dYdX subaccount number (typically 0)
  • chain_id - dYdX chain ID
  • block_time_monitor - Block time monitor (provides current height and dynamic block time)
§Errors

Returns error if wallet creation from private key fails.

Source

pub fn from_components( tx_manager: Arc<TransactionManager>, broadcaster: Arc<TxBroadcaster>, order_builder: Arc<OrderMessageBuilder>, block_time_monitor: Arc<BlockTimeMonitor>, ) -> Self

Creates a new order submitter from pre-built components.

Use this when you already have initialized components (e.g., from DydxExecutionClient).

Source

pub fn current_block_height(&self) -> u32

Returns the current block height.

Source

pub fn block_time_monitor(&self) -> &BlockTimeMonitor

Returns a reference to the block time monitor.

Source

pub fn wallet_address(&self) -> &str

Returns the wallet address.

Source

pub fn order_builder(&self) -> &OrderMessageBuilder

Returns a reference to the order builder.

Source

pub fn tx_manager(&self) -> &TransactionManager

Returns a reference to the transaction manager.

Source

pub async fn submit_market_order( &self, instrument_id: InstrumentId, client_order_id: u32, client_metadata: u32, side: OrderSide, quantity: Quantity, ) -> Result<String, DydxError>

Submits a market order to dYdX via gRPC.

Market orders execute immediately at the best available price. Block height is read from the shared block_height state.

§Returns

The transaction hash on success.

§Errors

Returns DydxError if gRPC submission fails.

Source

pub async fn submit_limit_order( &self, instrument_id: InstrumentId, client_order_id: u32, client_metadata: u32, side: OrderSide, price: Price, quantity: Quantity, time_in_force: TimeInForce, post_only: bool, reduce_only: bool, expire_time: Option<i64>, ) -> Result<String, DydxError>

Submits a limit order to dYdX via gRPC.

Limit orders execute only at the specified price or better. Block height is read from the shared block_height state.

§Returns

The transaction hash on success.

§Errors

Returns DydxError if gRPC submission fails.

Source

pub async fn submit_limit_orders_batch( &self, orders: Vec<LimitOrderParams>, ) -> Result<Vec<String>, DydxError>

Submits a batch of limit orders.

§Protocol Constraints
  • Short-term orders cannot be batched: If any order is short-term (IOC, FOK, or expire_time within 60s), each order is submitted in a separate transaction.
  • Long-term orders can be batched: All orders in a single transaction.
§Returns

A vector of transaction hashes (one per transaction).

§Errors

Returns DydxError if any submission fails.

Source

pub async fn cancel_order( &self, instrument_id: InstrumentId, client_order_id: u32, time_in_force: TimeInForce, expire_time_ns: Option<UnixNanos>, ) -> Result<String, DydxError>

Cancels an order on dYdX via gRPC.

Block height is read from the shared block_height state.

§Returns

The transaction hash on success.

§Errors

Returns DydxError if gRPC cancellation fails or market params not found.

Source

pub async fn cancel_orders_batch( &self, orders: &[(InstrumentId, u32, TimeInForce, Option<UnixNanos>)], ) -> Result<String, DydxError>

Cancels multiple orders in a single blockchain transaction.

Batches all cancellation messages into one transaction for efficiency.

§Arguments
  • orders - Slice of (instrument_id, client_order_id, time_in_force, expire_time_ns) tuples
§Returns

The transaction hash on success.

§Errors

Returns DydxError if transaction broadcast fails or market params not found.

Source

pub async fn submit_stop_market_order( &self, instrument_id: InstrumentId, client_order_id: u32, client_metadata: u32, side: OrderSide, trigger_price: Price, quantity: Quantity, reduce_only: bool, expire_time: Option<i64>, ) -> Result<String, DydxError>

Submits a stop market order to dYdX via gRPC.

Stop market orders are triggered when the price reaches trigger_price.

§Returns

The transaction hash on success.

§Errors

Returns DydxError if gRPC submission fails.

Source

pub async fn submit_stop_limit_order( &self, instrument_id: InstrumentId, client_order_id: u32, client_metadata: u32, side: OrderSide, trigger_price: Price, limit_price: Price, quantity: Quantity, time_in_force: TimeInForce, post_only: bool, reduce_only: bool, expire_time: Option<i64>, ) -> Result<String, DydxError>

Submits a stop limit order to dYdX via gRPC.

Stop limit orders are triggered when the price reaches trigger_price, then placed as a limit order at limit_price.

§Returns

The transaction hash on success.

§Errors

Returns DydxError if gRPC submission fails.

Source

pub async fn submit_take_profit_market_order( &self, instrument_id: InstrumentId, client_order_id: u32, client_metadata: u32, side: OrderSide, trigger_price: Price, quantity: Quantity, reduce_only: bool, expire_time: Option<i64>, ) -> Result<String, DydxError>

Submits a take profit market order to dYdX via gRPC.

Take profit market orders are triggered when the price reaches trigger_price, then executed as a market order.

§Returns

The transaction hash on success.

§Errors

Returns DydxError if gRPC submission fails.

Source

pub async fn submit_take_profit_limit_order( &self, instrument_id: InstrumentId, client_order_id: u32, client_metadata: u32, side: OrderSide, trigger_price: Price, limit_price: Price, quantity: Quantity, time_in_force: TimeInForce, post_only: bool, reduce_only: bool, expire_time: Option<i64>, ) -> Result<String, DydxError>

Submits a take profit limit order to dYdX via gRPC.

Take profit limit orders are triggered when the price reaches trigger_price, then placed as a limit order at limit_price.

§Returns

The transaction hash on success.

§Errors

Returns DydxError if gRPC submission fails.

Source

pub async fn submit_conditional_order( &self, instrument_id: InstrumentId, client_order_id: u32, client_metadata: u32, order_type: ConditionalOrderType, side: OrderSide, trigger_price: Price, limit_price: Option<Price>, quantity: Quantity, time_in_force: Option<TimeInForce>, post_only: bool, reduce_only: bool, expire_time: Option<i64>, ) -> Result<String, DydxError>

Submits a conditional order (generic interface).

This method handles all conditional order types: StopMarket, StopLimit, TakeProfitMarket, and TakeProfitLimit.

§Returns

The transaction hash on success.

§Errors

Returns DydxError if gRPC submission fails or limit_price is missing for limit orders.

Trait Implementations§

Source§

impl Debug for OrderSubmitter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> Ungil for T
where T: Send,