content: package org.knowm.xchange.binance;
  
  import java.io.IOException;
  import java.math.BigDecimal;
  import java.util.List;
  import java.util.Map;
  import javax.ws.rs.DELETE;
  import javax.ws.rs.FormParam;
  import javax.ws.rs.GET;
  import javax.ws.rs.HeaderParam;
  import javax.ws.rs.POST;
  import javax.ws.rs.PUT;
  import javax.ws.rs.Path;
  import javax.ws.rs.PathParam;
  import javax.ws.rs.Produces;
  import javax.ws.rs.QueryParam;
  import javax.ws.rs.core.MediaType;
  import org.knowm.xchange.binance.dto.BinanceException;
  import org.knowm.xchange.binance.dto.account.BinanceAccountInformation;
  import org.knowm.xchange.binance.dto.account.DepositAddress;
  import org.knowm.xchange.binance.dto.account.DepositList;
  import org.knowm.xchange.binance.dto.account.WithdrawList;
  import org.knowm.xchange.binance.dto.account.WithdrawRequest;
  import org.knowm.xchange.binance.dto.trade.BinanceCancelledOrder;
  import org.knowm.xchange.binance.dto.trade.BinanceListenKey;
  import org.knowm.xchange.binance.dto.trade.BinanceNewOrder;
  import org.knowm.xchange.binance.dto.trade.BinanceOrder;
  import org.knowm.xchange.binance.dto.trade.BinanceTrade;
  import org.knowm.xchange.binance.dto.trade.OrderSide;
  import org.knowm.xchange.binance.dto.trade.OrderType;
  import org.knowm.xchange.binance.dto.trade.TimeInForce;
  import si.mazi.rescu.ParamsDigest;
  
  @Path("")
  @Produces(MediaType.APPLICATION_JSON)
  public interface BinanceAuthenticated extends Binance {
  
    public static final String SIGNATURE = "signature";
    static final String X_MBX_APIKEY = "X-MBX-APIKEY";
  
    @POST
    @Path("api/v3/order")
    /**
     * Send in a new order
     *
     * @param symbol
     * @param side
     * @param type
     * @param timeInForce
     * @param quantity
     * @param price optional, must be provided for limit orders only
     * @param newClientOrderId optional, a unique id for the order. Automatically generated if not
     *     sent.
     * @param stopPrice optional, used with stop orders
     * @param icebergQty optional, used with iceberg orders
     * @param recvWindow optional
     * @param timestamp
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    BinanceNewOrder newOrder(
        @FormParam("symbol") String symbol,
        @FormParam("side") OrderSide side,
        @FormParam("type") OrderType type,
        @FormParam("timeInForce") TimeInForce timeInForce,
        @FormParam("quantity") BigDecimal quantity,
        @FormParam("price") BigDecimal price,
        @FormParam("newClientOrderId") String newClientOrderId,
        @FormParam("stopPrice") BigDecimal stopPrice,
        @FormParam("icebergQty") BigDecimal icebergQty,
        @FormParam("recvWindow") Long recvWindow,
        @FormParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @POST
    @Path("api/v3/order/test")
    /**
     * Test new order creation and signature/recvWindow long. Creates and validates a new order but
     * does not send it into the matching engine.
     *
     * @param symbol
     * @param side
     * @param type
     * @param timeInForce
     * @param quantity
     * @param price
     * @param newClientOrderId optional, a unique id for the order. Automatically generated by
     *     default.
     * @param stopPrice optional, used with STOP orders
     * @param icebergQty optional used with icebergOrders
     * @param recvWindow optional
     * @param timestamp
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    Object testNewOrder(
        @FormParam("symbol") String symbol,
        @FormParam("side") OrderSide side,
        @FormParam("type") OrderType type,
        @FormParam("timeInForce") TimeInForce timeInForce,
        @FormParam("quantity") BigDecimal quantity,
        @FormParam("price") BigDecimal price,
        @FormParam("newClientOrderId") String newClientOrderId,
        @FormParam("stopPrice") BigDecimal stopPrice,
        @FormParam("icebergQty") BigDecimal icebergQty,
        @FormParam("recvWindow") Long recvWindow,
        @FormParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("api/v3/order")
    /**
     * Check an order's status.<br>
     * Either orderId or origClientOrderId must be sent.
     *
     * @param symbol
     * @param orderId optional
     * @param origClientOrderId optional
     * @param recvWindow optional
     * @param timestamp
     * @param apiKey
     * @param signature
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    BinanceOrder orderStatus(
        @QueryParam("symbol") String symbol,
        @QueryParam("orderId") long orderId,
        @QueryParam("origClientOrderId") String origClientOrderId,
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @DELETE
    @Path("api/v3/order")
    /**
     * Cancel an active order.
     *
     * @param symbol
     * @param orderId optional
     * @param origClientOrderId optional
     * @param newClientOrderId optional, used to uniquely identify this cancel. Automatically
     *     generated by default.
     * @param recvWindow optional
     * @param timestamp
     * @param apiKey
     * @param signature
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    BinanceCancelledOrder cancelOrder(
        @QueryParam("symbol") String symbol,
        @QueryParam("orderId") long orderId,
        @QueryParam("origClientOrderId") String origClientOrderId,
        @QueryParam("newClientOrderId") String newClientOrderId,
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("api/v3/openOrders")
    /**
     * Get all open orders on a symbol.
     *
     * @param symbol optional
     * @param recvWindow optional
     * @param timestamp
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    List<BinanceOrder> openOrders(
        @QueryParam("symbol") String symbol,
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("api/v3/openOrders")
    /**
     * Get all open orders without a symbol.
     *
     * @param symbol
     * @param recvWindow optional
     * @param timestamp mandatory
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    List<BinanceOrder> openOrders(
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("api/v3/allOrders")
    /**
     * Get all account orders; active, canceled, or filled. <br>
     * If orderId is set, it will get orders >= that orderId. Otherwise most recent orders are
     * returned.
     *
     * @param symbol
     * @param orderId optional
     * @param limit optional
     * @param recvWindow optional
     * @param timestamp
     * @param apiKey
     * @param signature
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    List<BinanceOrder> allOrders(
        @QueryParam("symbol") String symbol,
        @QueryParam("orderId") Long orderId,
        @QueryParam("limit") Integer limit,
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("api/v3/account")
    /**
     * Get current account information.
     *
     * @param recvWindow optional
     * @param timestamp
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    BinanceAccountInformation account(
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("api/v3/myTrades")
    /**
     * Get trades for a specific account and symbol.
     *
     * @param symbol
     * @param limit optional, default 500; max 500.
     * @param fromId optional, tradeId to fetch from. Default gets most recent trades.
     * @param recvWindow optional
     * @param timestamp
     * @param apiKey
     * @param signature
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    List<BinanceTrade> myTrades(
        @QueryParam("symbol") String symbol,
        @QueryParam("limit") Integer limit,
        @QueryParam("fromId") Long fromId,
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @POST
    @Path("wapi/v3/withdraw.html")
    /**
     * Submit a withdraw request.
     *
     * @param asset
     * @param address
     * @param addressTag optional for Ripple
     * @param amount
     * @param name optional, description of the address
     * @param recvWindow optional
     * @param timestamp
     * @param apiKey
     * @param signature
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    WithdrawRequest withdraw(
        @FormParam("asset") String asset,
        @FormParam("address") String address,
        @FormParam("addressTag") String addressTag,
        @FormParam("amount") BigDecimal amount,
        @FormParam("name") String name,
        @FormParam("recvWindow") Long recvWindow,
        @FormParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("wapi/v3/depositHistory.html")
    /**
     * Fetch deposit history.
     *
     * @param asset optional
     * @param startTime optional
     * @param endTime optional
     * @param recvWindow optional
     * @param timestamp
     * @param apiKey
     * @param signature
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    DepositList depositHistory(
        @QueryParam("asset") String asset,
        @QueryParam("startTime") Long startTime,
        @QueryParam("endTime") Long endTime,
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("wapi/v3/withdrawHistory.html")
    /**
     * Fetch withdraw history.
     *
     * @param asset optional
     * @param startTime optional
     * @param endTime optional
     * @param recvWindow optional
     * @param timestamp
     * @param apiKey
     * @param signature
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    WithdrawList withdrawHistory(
        @QueryParam("asset") String asset,
        @QueryParam("startTime") Long startTime,
        @QueryParam("endTime") Long endTime,
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    @GET
    @Path("wapi/v3/depositAddress.html")
    /**
     * Fetch deposit address.
     *
     * @param asset
     * @param recvWindow
     * @param timestamp
     * @param apiKey
     * @param signature
     * @return
     * @throws IOException
     * @throws BinanceException
     */
    DepositAddress depositAddress(
        @QueryParam("asset") String asset,
        @QueryParam("recvWindow") Long recvWindow,
        @QueryParam("timestamp") long timestamp,
        @HeaderParam(X_MBX_APIKEY) String apiKey,
        @QueryParam(SIGNATURE) ParamsDigest signature)
        throws IOException, BinanceException;
  
    /**
     * Returns a listen key for websocket login.
     *
     * @param apiKey the api key
     * @return
     * @throws BinanceException
     * @throws IOException
     */
    @POST
    @Path("/api/v1/userDataStream")
    BinanceListenKey startUserDataStream(@HeaderParam(X_MBX_APIKEY) String apiKey)
        throws IOException, BinanceException;
  
    /**
     * Keeps the authenticated websocket session alive.
     *
     * @param apiKey the api key
     * @param listenKey the api secret
     * @return
     * @throws BinanceException
     * @throws IOException
     */
    @PUT
    @Path("/api/v1/userDataStream?listenKey={listenKey}")
    Map<?, ?> keepAliveUserDataStream(
        @HeaderParam(X_MBX_APIKEY) String apiKey, @PathParam("listenKey") String listenKey)
        throws IOException, BinanceException;
  
    /**
     * Closes the websocket authenticated connection.
     *
     * @param apiKey the api key
     * @param listenKey the api secret
     * @return
     * @throws BinanceException
     * @throws IOException
     */
    @DELETE
    @Path("/api/v1/userDataStream?listenKey={listenKey}")
    Map<?, ?> closeUserDataStream(
        @HeaderParam(X_MBX_APIKEY) String apiKey, @PathParam("listenKey") String listenKey)
        throws IOException, BinanceException;
  }
  