Skip to content

Commit

Permalink
Refactor OptimizedMarketOrder (#1119)
Browse files Browse the repository at this point in the history
* Rename `OptimizedMarketOrder` to `OptimizedOrder`
* Create a `OptimizedOrder` subtype `OptimizedNativeOrder`
* Make `quote_simulation_test.ts` type-safer
  • Loading branch information
kyu-c committed Dec 2, 2022
1 parent 3c41987 commit 44596f7
Show file tree
Hide file tree
Showing 10 changed files with 104 additions and 93 deletions.
Expand Up @@ -41,7 +41,7 @@ import {
NativeOtcOrderFillData,
NativeRfqOrderFillData,
OptimizedMarketBridgeOrder,
OptimizedMarketOrder,
OptimizedOrder,
} from '../types';

import {
Expand Down Expand Up @@ -727,7 +727,7 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase {
}
}

function slipNonNativeOrders(quote: MarketSellSwapQuote | MarketBuySwapQuote): OptimizedMarketOrder[] {
function slipNonNativeOrders(quote: MarketSellSwapQuote | MarketBuySwapQuote): OptimizedOrder[] {
const slippage = getMaxQuoteSlippageRate(quote);
if (slippage === 0) {
return quote.orders;
Expand Down
12 changes: 6 additions & 6 deletions src/asset-swapper/quote_consumers/quote_consumer_utils.ts
Expand Up @@ -7,7 +7,7 @@ import {
SwapQuote,
ERC20BridgeSource,
OptimizedMarketBridgeOrder,
OptimizedMarketOrder,
OptimizedOrder,
OptimizedOtcOrder,
OptimizedRfqOrder,
OptimizedLimitOrder,
Expand Down Expand Up @@ -96,19 +96,19 @@ export function isBuyQuote(quote: SwapQuote): quote is MarketBuySwapQuote {
return quote.type === MarketOperation.Buy;
}

function isOptimizedBridgeOrder(x: OptimizedMarketOrder): x is OptimizedMarketBridgeOrder {
function isOptimizedBridgeOrder(x: OptimizedOrder): x is OptimizedMarketBridgeOrder {
return x.type === FillQuoteTransformerOrderType.Bridge;
}

function isOptimizedLimitOrder(x: OptimizedMarketOrder): x is OptimizedLimitOrder {
function isOptimizedLimitOrder(x: OptimizedOrder): x is OptimizedLimitOrder {
return x.type === FillQuoteTransformerOrderType.Limit;
}

function isOptimizedRfqOrder(x: OptimizedMarketOrder): x is OptimizedRfqOrder {
function isOptimizedRfqOrder(x: OptimizedOrder): x is OptimizedRfqOrder {
return x.type === FillQuoteTransformerOrderType.Rfq;
}

function isOptimizedOtcOrder(x: OptimizedMarketOrder): x is OptimizedOtcOrder {
function isOptimizedOtcOrder(x: OptimizedOrder): x is OptimizedOtcOrder {
return x.type === FillQuoteTransformerOrderType.Otc;
}

Expand All @@ -117,7 +117,7 @@ function isOptimizedOtcOrder(x: OptimizedMarketOrder): x is OptimizedOtcOrder {
* FillQuoteTransformer.
*/
export function getFQTTransformerDataFromOptimizedOrders(
orders: OptimizedMarketOrder[],
orders: OptimizedOrder[],
): Pick<FillQuoteTransformerData, 'bridgeOrders' | 'limitOrders' | 'rfqOrders' | 'otcOrders' | 'fillSequence'> {
const fqtData: Pick<
FillQuoteTransformerData,
Expand Down
13 changes: 3 additions & 10 deletions src/asset-swapper/swap_quoter.ts
Expand Up @@ -34,14 +34,7 @@ import {
import { DexOrderSampler } from './utils/market_operation_utils/sampler';
import { SourceFilters } from './utils/market_operation_utils/source_filters';
import { OptimizerResultWithReport } from './utils/market_operation_utils/types';
import {
ERC20BridgeSource,
FillData,
GasSchedule,
GetMarketOrdersOpts,
OptimizedMarketOrder,
Orderbook,
} from './types';
import { ERC20BridgeSource, FillData, GasSchedule, GetMarketOrdersOpts, OptimizedOrder, Orderbook } from './types';
import { GasPriceUtils } from './utils/gas_price_utils';
import { QuoteRequestor } from './utils/quote_requestor';
import { QuoteFillResult, simulateBestCaseFill, simulateWorstCaseFill } from './utils/quote_simulation';
Expand Down Expand Up @@ -399,7 +392,7 @@ function createSwapQuote(
}

function calculateQuoteInfo(
optimizedOrders: OptimizedMarketOrder[],
optimizedOrders: OptimizedOrder[],
operation: MarketOperation,
assetFillAmount: BigNumber,
gasPrice: BigNumber,
Expand Down Expand Up @@ -430,7 +423,7 @@ function calculateQuoteInfo(
}

function calculateTwoHopQuoteInfo(
optimizedOrders: OptimizedMarketOrder[],
optimizedOrders: OptimizedOrder[],
operation: MarketOperation,
gasSchedule: GasSchedule,
slippage: number,
Expand Down
15 changes: 5 additions & 10 deletions src/asset-swapper/types.ts
Expand Up @@ -248,7 +248,7 @@ interface SwapQuoteBase {
takerToken: string;
makerToken: string;
gasPrice: BigNumber;
orders: OptimizedMarketOrder[];
orders: OptimizedOrder[];
bestCaseQuoteInfo: SwapQuoteInfo;
worstCaseQuoteInfo: SwapQuoteInfo;
sourceBreakdown: SwapQuoteOrdersBreakdown;
Expand Down Expand Up @@ -712,7 +712,7 @@ export interface GetMarketOrdersOpts {
fillAdjustor: FillAdjustor;
}

export interface OptimizedMarketOrderBase<TFillData extends FillData = FillData> {
interface OptimizedMarketOrderBase<TFillData extends FillData = FillData> {
source: ERC20BridgeSource;
fillData: TFillData;
type: FillQuoteTransformerOrderType; // should correspond with TFillData
Expand Down Expand Up @@ -741,14 +741,9 @@ export interface OptimizedOtcOrder extends OptimizedMarketOrderBase<NativeOtcOrd
type: FillQuoteTransformerOrderType.Otc;
}

/**
* Optimized orders to fill.
*/
export type OptimizedMarketOrder =
| OptimizedMarketBridgeOrder<FillData>
| OptimizedMarketOrderBase<NativeLimitOrderFillData>
| OptimizedMarketOrderBase<NativeRfqOrderFillData>
| OptimizedMarketOrderBase<NativeOtcOrderFillData>;
export type OptimizedNativeOrder = OptimizedLimitOrder | OptimizedRfqOrder | OptimizedOtcOrder;

export type OptimizedOrder = OptimizedMarketBridgeOrder<FillData> | OptimizedNativeOrder;

export abstract class Orderbook {
public abstract getOrdersAsync(
Expand Down
14 changes: 4 additions & 10 deletions src/asset-swapper/utils/market_operation_utils/orders.ts
Expand Up @@ -13,8 +13,8 @@ import {
NativeOtcOrderFillData,
NativeRfqOrderFillData,
OptimizedMarketBridgeOrder,
OptimizedMarketOrder,
OptimizedMarketOrderBase,
OptimizedOrder,
OptimizedNativeOrder,
} from '../../types';

import { MAX_UINT256, ZERO_AMOUNT } from './constants';
Expand Down Expand Up @@ -58,7 +58,7 @@ export interface CreateOrderFromPathOpts {
export function createOrdersFromTwoHopSample(
sample: DexSample<MultiHopFillData>,
opts: CreateOrderFromPathOpts,
): [OptimizedMarketOrder, OptimizedMarketOrder] {
): [OptimizedOrder, OptimizedOrder] {
const [makerToken, takerToken] = getMakerTakerTokens(opts);
const { firstHopSource, secondHopSource, intermediateToken } = sample.fillData;
const firstHopFill: Fill = {
Expand Down Expand Up @@ -548,13 +548,7 @@ function getFillTokenAmounts(fill: Fill, side: MarketOperation): [BigNumber, Big
];
}

export function createNativeOptimizedOrder(
fill: Fill<NativeFillData>,
side: MarketOperation,
):
| OptimizedMarketOrderBase<NativeRfqOrderFillData>
| OptimizedMarketOrderBase<NativeLimitOrderFillData>
| OptimizedMarketOrderBase<NativeOtcOrderFillData> {
export function createNativeOptimizedOrder(fill: Fill<NativeFillData>, side: MarketOperation): OptimizedNativeOrder {
const fillData = fill.fillData;
const [makerAmount, takerAmount] = getFillTokenAmounts(fill, side);
const base = {
Expand Down
6 changes: 3 additions & 3 deletions src/asset-swapper/utils/market_operation_utils/path.ts
Expand Up @@ -4,7 +4,7 @@ import _ = require('lodash');
import {
MarketOperation,
NativeFillData,
OptimizedMarketOrder,
OptimizedOrder,
ERC20BridgeSource,
ExchangeProxyOverhead,
Fill,
Expand Down Expand Up @@ -42,7 +42,7 @@ const DEFAULT_PATH_PENALTY_OPTS: PathPenaltyOpts = {
};

export class Path {
public orders?: OptimizedMarketOrder[];
public orders?: OptimizedOrder[];
public sourceFlags = BigInt(0);
protected _size: PathSize = { input: ZERO_AMOUNT, output: ZERO_AMOUNT };
protected _adjustedSize: PathSize = { input: ZERO_AMOUNT, output: ZERO_AMOUNT };
Expand Down Expand Up @@ -179,5 +179,5 @@ export class Path {
}

interface FinalizedPath extends Path {
readonly orders: OptimizedMarketOrder[];
readonly orders: OptimizedOrder[];
}
4 changes: 2 additions & 2 deletions src/asset-swapper/utils/market_operation_utils/types.ts
Expand Up @@ -5,7 +5,7 @@ import { BigNumber } from '@0x/utils';
import {
NativeOrderWithFillableAmounts,
ERC20BridgeSource,
OptimizedMarketOrder,
OptimizedOrder,
FillData,
FeeSchedule,
Fill,
Expand Down Expand Up @@ -307,7 +307,7 @@ export interface SourceQuoteOperation<TFillData extends FillData = FillData> ext
}

export interface OptimizerResult {
optimizedOrders: OptimizedMarketOrder[];
optimizedOrders: OptimizedOrder[];
sourceFlags: bigint;
liquidityDelivered: Readonly<Fill[] | DexSample<MultiHopFillData>>;
marketSideLiquidity: MarketSideLiquidity;
Expand Down
10 changes: 5 additions & 5 deletions src/asset-swapper/utils/quote_simulation.ts
Expand Up @@ -2,7 +2,7 @@ import { FillQuoteTransformerOrderType } from '@0x/protocol-utils';
import { BigNumber } from '@0x/utils';

import { constants } from '../constants';
import { MarketOperation, GasSchedule, NativeLimitOrderFillData, OptimizedMarketOrder } from '../types';
import { MarketOperation, GasSchedule, NativeLimitOrderFillData, OptimizedOrder } from '../types';

import { getNativeAdjustedTakerFeeAmount } from './utils';

Expand Down Expand Up @@ -61,7 +61,7 @@ const EMPTY_QUOTE_INTERMEDIATE_FILL_RESULT = {
};

interface QuoteFillInfo {
orders: OptimizedMarketOrder[];
orders: OptimizedOrder[];
fillAmount: BigNumber;
gasPrice: BigNumber;
side: MarketOperation;
Expand All @@ -80,7 +80,7 @@ const DEFAULT_SIMULATED_FILL_QUOTE_INFO_OPTS = {
};

export interface QuoteFillOrderCall {
order: OptimizedMarketOrder;
order: OptimizedOrder;
// Total input amount defined in the order.
totalOrderInput: BigNumber;
// Total output amount defined in the order.
Expand Down Expand Up @@ -176,7 +176,7 @@ export function fillQuoteOrders(
return result;
}

function hasProtocolFee(o: OptimizedMarketOrder): boolean {
function hasProtocolFee(o: OptimizedOrder): boolean {
return o.type === FillQuoteTransformerOrderType.Limit;
}

Expand Down Expand Up @@ -299,7 +299,7 @@ function fromIntermediateQuoteFillResult(ir: IntermediateQuoteFillResult, quoteI
};
}

function getTotalGasUsedByFills(fills: OptimizedMarketOrder[], gasSchedule: GasSchedule): number {
function getTotalGasUsedByFills(fills: OptimizedOrder[], gasSchedule: GasSchedule): number {
let gasUsed = 0;
for (const f of fills) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- TODO: fix me!
Expand Down
4 changes: 2 additions & 2 deletions test/asset-swapper/exchange_proxy_swap_quote_consumer_test.ts
Expand Up @@ -30,7 +30,7 @@ import {
Fill,
NativeFillData,
OptimizedLimitOrder,
OptimizedMarketOrder,
OptimizedOrder,
} from '../../src/asset-swapper/types';

import { chaiSetup } from './utils/chai_setup';
Expand Down Expand Up @@ -172,7 +172,7 @@ describe('ExchangeProxySwapQuoteConsumer', () => {

type PlainOrder = Exclude<LimitOrderFields, ['chainId', 'exchangeAddress']>;

function cleanOrders(orders: OptimizedMarketOrder[]): PlainOrder[] {
function cleanOrders(orders: OptimizedOrder[]): PlainOrder[] {
return orders.map(
(o) =>
_.omit(
Expand Down

0 comments on commit 44596f7

Please sign in to comment.