bugfix for 0 slippage market orders
This commit is contained in:
@@ -283,6 +283,8 @@ DISTANT_FUTURE = 4294967295 # max uint32
|
|||||||
|
|
||||||
MAX_FRACTION = 65535 # max uint16
|
MAX_FRACTION = 65535 # max uint16
|
||||||
|
|
||||||
|
MIN_SLIPPAGE = 0.0001 # one bip
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Tranche:
|
class Tranche:
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ from dataclasses import dataclass
|
|||||||
from typing import Optional, Union, Any
|
from typing import Optional, Union, Any
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
|
from triton.profiler import deactivate
|
||||||
from web3.exceptions import ContractPanicError, ContractLogicError
|
from web3.exceptions import ContractPanicError, ContractLogicError
|
||||||
from web3.types import EventData
|
from web3.types import EventData
|
||||||
|
|
||||||
from dexorder import db, metric
|
from dexorder import db, metric, config
|
||||||
from dexorder.accounting import accounting_transaction_gas
|
from dexorder.accounting import accounting_transaction_gas
|
||||||
from dexorder.base import TransactionReceiptDict, TransactionRequest, transaction_request_deserializers
|
from dexorder.base import TransactionReceiptDict, TransactionRequest, transaction_request_deserializers
|
||||||
from dexorder.base.order import TrancheKey, OrderKey
|
from dexorder.base.order import TrancheKey, OrderKey
|
||||||
@@ -121,6 +122,11 @@ async def finish_execution_request(tk: TrancheKey, error: Optional[str]=None):
|
|||||||
if trig is not None:
|
if trig is not None:
|
||||||
trig.touch()
|
trig.touch()
|
||||||
|
|
||||||
|
def delay(secs=None):
|
||||||
|
trig = get_trigger()
|
||||||
|
if trig is not None:
|
||||||
|
trig.deactivate(secs if secs is not None else config.slippage_control_delay)
|
||||||
|
|
||||||
if error is None:
|
if error is None:
|
||||||
metric.executions.inc()
|
metric.executions.inc()
|
||||||
else:
|
else:
|
||||||
@@ -162,6 +168,7 @@ async def finish_execution_request(tk: TrancheKey, error: Optional[str]=None):
|
|||||||
retry()
|
retry()
|
||||||
elif error == 'RL':
|
elif error == 'RL':
|
||||||
log.debug(f'tranche {tk} execution failed due to "RL" rate limit')
|
log.debug(f'tranche {tk} execution failed due to "RL" rate limit')
|
||||||
|
delay()
|
||||||
retry()
|
retry()
|
||||||
elif error == 'TE':
|
elif error == 'TE':
|
||||||
log.debug(f'tranche {tk} execution failed due to "TE" too early')
|
log.debug(f'tranche {tk} execution failed due to "TE" too early')
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from typing import Optional, Sequence, Union
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from sortedcontainers import SortedList
|
from sortedcontainers import SortedList
|
||||||
|
|
||||||
from dexorder.base.orderlib import SwapOrderState, PriceProof, DISTANT_FUTURE, DISTANT_PAST, Line
|
from dexorder.base.orderlib import SwapOrderState, PriceProof, DISTANT_FUTURE, DISTANT_PAST, Line, MIN_SLIPPAGE
|
||||||
from dexorder.blockstate import BlockDict
|
from dexorder.blockstate import BlockDict
|
||||||
from .orderstate import Order
|
from .orderstate import Order
|
||||||
from .. import dec, order_log, timestamp, from_timestamp, config
|
from .. import dec, order_log, timestamp, from_timestamp, config
|
||||||
@@ -528,15 +528,17 @@ class TrancheTrigger:
|
|||||||
activation_trigger = TimeTrigger.create(True, tk, ts.activationTime, time)
|
activation_trigger = TimeTrigger.create(True, tk, ts.activationTime, time)
|
||||||
expiration_trigger = TimeTrigger.create(False, tk, ts.endTime, time)
|
expiration_trigger = TimeTrigger.create(False, tk, ts.endTime, time)
|
||||||
if tranche.marketOrder:
|
if tranche.marketOrder:
|
||||||
|
slippage = tranche.minLine.intercept
|
||||||
min_trigger = max_trigger = None
|
min_trigger = max_trigger = None
|
||||||
else:
|
else:
|
||||||
# tranche minLine and maxLine are relative to the pool and will be flipped from the orderspec if the
|
# tranche minLine and maxLine are relative to the pool and will be flipped from the orderspec if the
|
||||||
# order is buying the base and selling the quote.
|
# order is buying the base and selling the quote.
|
||||||
price = pool_prices[pool['address']] * dec(10) ** -pool['decimals']
|
price = pool_prices[pool['address']] * dec(10) ** -pool['decimals']
|
||||||
inverted = order.order.inverted
|
inverted = order.order.inverted
|
||||||
|
slippage = 0
|
||||||
min_trigger = PriceLineTrigger.create(tk, inverted, price, tranche.minLine, True, tranche.minIsBarrier)
|
min_trigger = PriceLineTrigger.create(tk, inverted, price, tranche.minLine, True, tranche.minIsBarrier)
|
||||||
max_trigger = PriceLineTrigger.create(tk, inverted, price, tranche.maxLine, False, tranche.maxIsBarrier)
|
max_trigger = PriceLineTrigger.create(tk, inverted, price, tranche.maxLine, False, tranche.maxIsBarrier)
|
||||||
return TrancheTrigger(order, tk, balance_trigger, activation_trigger, expiration_trigger, min_trigger, max_trigger, tranche.marketOrder)
|
return TrancheTrigger(order, tk, balance_trigger, activation_trigger, expiration_trigger, min_trigger, max_trigger, tranche.marketOrder, slippage)
|
||||||
|
|
||||||
def __init__(self, order: Order, tk: TrancheKey,
|
def __init__(self, order: Order, tk: TrancheKey,
|
||||||
balance_trigger: BalanceTrigger,
|
balance_trigger: BalanceTrigger,
|
||||||
@@ -544,7 +546,7 @@ class TrancheTrigger:
|
|||||||
expiration_trigger: Optional[TimeTrigger],
|
expiration_trigger: Optional[TimeTrigger],
|
||||||
min_trigger: Optional[PriceLineTrigger],
|
min_trigger: Optional[PriceLineTrigger],
|
||||||
max_trigger: Optional[PriceLineTrigger],
|
max_trigger: Optional[PriceLineTrigger],
|
||||||
market_order: bool,
|
market_order: bool, slippage: float,
|
||||||
):
|
):
|
||||||
assert order.key.vault == tk.vault and order.key.order_index == tk.order_index
|
assert order.key.vault == tk.vault and order.key.order_index == tk.order_index
|
||||||
tranche = order.order.tranches[tk.tranche_index]
|
tranche = order.order.tranches[tk.tranche_index]
|
||||||
@@ -564,6 +566,7 @@ class TrancheTrigger:
|
|||||||
|
|
||||||
tranche_remaining = tranche.fraction_of(order.amount) - order.tranche_filled(self.tk.tranche_index)
|
tranche_remaining = tranche.fraction_of(order.amount) - order.tranche_filled(self.tk.tranche_index)
|
||||||
self.status = \
|
self.status = \
|
||||||
|
TrancheState.Error if self.market_order and slippage < MIN_SLIPPAGE else \
|
||||||
TrancheState.Filled if tranche_remaining == 0 or tranche_remaining < self.order.min_fill_amount else \
|
TrancheState.Filled if tranche_remaining == 0 or tranche_remaining < self.order.min_fill_amount else \
|
||||||
TrancheState.Expired if self.expiration_trigger is not None and not self.expiration_trigger else \
|
TrancheState.Expired if self.expiration_trigger is not None and not self.expiration_trigger else \
|
||||||
TrancheState.Early if self.activation_trigger is None and not self.activation_trigger else \
|
TrancheState.Early if self.activation_trigger is None and not self.activation_trigger else \
|
||||||
|
|||||||
Reference in New Issue
Block a user