Skip to content

Commit 294cd08

Browse files
author
Karl Ranna
authored
fix: inbound liquidity for connext currencies (#105)
* fix: inbound liquidity for connext currencies * fixup! fix: inbound liquidity for connext currencies
1 parent 8a95c69 commit 294cd08

File tree

2 files changed

+112
-20
lines changed

2 files changed

+112
-20
lines changed

src/opendex/orders.spec.ts

Lines changed: 93 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { OrderSide } from '../proto/xudrpc_pb';
44
import { coinsToSats } from '../utils';
55
import { testConfig } from '../test-utils';
66
import { TradeInfo } from '../trade/info';
7+
import { Config } from '../config';
78

89
type AssertTradeInfoToOpenDEXordersParams = {
910
tradeInfo: TradeInfo;
@@ -13,13 +14,14 @@ type AssertTradeInfoToOpenDEXordersParams = {
1314
sellPrice?: BigNumber;
1415
sellQuantity?: BigNumber;
1516
};
17+
config: Config;
1618
};
1719

1820
const assertTradeInfoToOpenDEXorders = ({
1921
tradeInfo,
2022
expected,
23+
config,
2124
}: AssertTradeInfoToOpenDEXordersParams) => {
22-
const config = testConfig();
2325
const { buyOrder, sellOrder } = tradeInfoToOpenDEXorders({
2426
tradeInfo,
2527
config,
@@ -33,7 +35,7 @@ const assertTradeInfoToOpenDEXorders = ({
3335
orderSide: OrderSide.BUY,
3436
pairId,
3537
price: expected.buyPrice.toNumber(),
36-
orderId: 'arby-ETH/BTC-buy-order',
38+
orderId: `arby-${config.BASEASSET}/${config.QUOTEASSET}-buy-order`,
3739
})
3840
);
3941
}
@@ -46,29 +48,29 @@ const assertTradeInfoToOpenDEXorders = ({
4648
orderSide: OrderSide.SELL,
4749
pairId,
4850
price: expected.sellPrice.toNumber(),
49-
orderId: 'arby-ETH/BTC-sell-order',
51+
orderId: `arby-${config.BASEASSET}/${config.QUOTEASSET}-sell-order`,
5052
})
5153
);
5254
}
5355
};
5456

5557
describe('tradeInfoToOpenDEXorders', () => {
5658
describe('buy order', () => {
57-
test('all of OpenDEX base asset max inbound can be used for buying', () => {
59+
test('OpenDEX base asset max inbound for ETH/BTC', () => {
5860
expect.assertions(1);
5961
const tradeInfo = {
6062
price: new BigNumber('0.02'),
6163
assets: {
6264
openDEX: {
6365
baseAssetBalance: new BigNumber('40'),
64-
baseAssetMaxInbound: new BigNumber('500'),
66+
baseAssetMaxInbound: new BigNumber('0'),
6567
baseAssetMaxOutbound: new BigNumber('40'),
66-
quoteAssetBalance: new BigNumber('9.5'),
67-
quoteAssetMaxOutbound: new BigNumber('9.4'),
68-
quoteAssetMaxInbound: new BigNumber('2'),
68+
quoteAssetBalance: new BigNumber('0.35'),
69+
quoteAssetMaxOutbound: new BigNumber('0.35'),
70+
quoteAssetMaxInbound: new BigNumber('0.1'),
6971
},
7072
centralizedExchange: {
71-
baseAssetBalance: new BigNumber('501'),
73+
baseAssetBalance: new BigNumber('20'),
7274
quoteAssetBalance: new BigNumber('1.5'),
7375
},
7476
},
@@ -77,7 +79,40 @@ describe('tradeInfoToOpenDEXorders', () => {
7779
tradeInfo,
7880
expected: {
7981
buyPrice: new BigNumber('0.0188'),
80-
buyQuantity: new BigNumber('495'),
82+
buyQuantity: new BigNumber('14.1075'),
83+
},
84+
config: testConfig(),
85+
});
86+
});
87+
88+
test('OpenDEX base asset max inbound reduces buy quantity for BTC/USDT', () => {
89+
expect.assertions(1);
90+
const tradeInfo = {
91+
price: new BigNumber('10000'),
92+
assets: {
93+
openDEX: {
94+
baseAssetBalance: new BigNumber('1'),
95+
baseAssetMaxInbound: new BigNumber('0.5'),
96+
baseAssetMaxOutbound: new BigNumber('1'),
97+
quoteAssetBalance: new BigNumber('20000'),
98+
quoteAssetMaxOutbound: new BigNumber('20000'),
99+
quoteAssetMaxInbound: new BigNumber('20000'),
100+
},
101+
centralizedExchange: {
102+
baseAssetBalance: new BigNumber('1.5'),
103+
quoteAssetBalance: new BigNumber('25000'),
104+
},
105+
},
106+
};
107+
assertTradeInfoToOpenDEXorders({
108+
tradeInfo,
109+
expected: {
110+
buyPrice: new BigNumber('9400'),
111+
buyQuantity: new BigNumber('0.495'),
112+
},
113+
config: {
114+
...testConfig(),
115+
...{ BASEASSET: 'BTC', QUOTEASSET: 'USDT' },
81116
},
82117
});
83118
});
@@ -91,12 +126,12 @@ describe('tradeInfoToOpenDEXorders', () => {
91126
baseAssetBalance: new BigNumber('40'),
92127
baseAssetMaxInbound: new BigNumber('9007199254740991'),
93128
baseAssetMaxOutbound: new BigNumber('40'),
94-
quoteAssetBalance: new BigNumber('5.1'),
95-
quoteAssetMaxOutbound: new BigNumber('5'),
96-
quoteAssetMaxInbound: new BigNumber('2'),
129+
quoteAssetBalance: new BigNumber('0.1'),
130+
quoteAssetMaxOutbound: new BigNumber('0.1'),
131+
quoteAssetMaxInbound: new BigNumber('0.05'),
97132
},
98133
centralizedExchange: {
99-
baseAssetBalance: new BigNumber('501'),
134+
baseAssetBalance: new BigNumber('500'),
100135
quoteAssetBalance: new BigNumber('1.5'),
101136
},
102137
},
@@ -105,8 +140,9 @@ describe('tradeInfoToOpenDEXorders', () => {
105140
tradeInfo,
106141
expected: {
107142
buyPrice: new BigNumber('0.0188'),
108-
buyQuantity: new BigNumber('263.29787234'),
143+
buyQuantity: new BigNumber('5.26595744'),
109144
},
145+
config: testConfig(),
110146
});
111147
});
112148

@@ -124,7 +160,7 @@ describe('tradeInfoToOpenDEXorders', () => {
124160
quoteAssetMaxInbound: new BigNumber('2'),
125161
},
126162
centralizedExchange: {
127-
baseAssetBalance: new BigNumber('250'),
163+
baseAssetBalance: new BigNumber('5'),
128164
quoteAssetBalance: new BigNumber('1.5'),
129165
},
130166
},
@@ -133,8 +169,9 @@ describe('tradeInfoToOpenDEXorders', () => {
133169
tradeInfo,
134170
expected: {
135171
buyPrice: new BigNumber('0.0188'),
136-
buyQuantity: new BigNumber('247.5'),
172+
buyQuantity: new BigNumber('4.95'),
137173
},
174+
config: testConfig(),
138175
});
139176
});
140177
});
@@ -165,10 +202,11 @@ describe('tradeInfoToOpenDEXorders', () => {
165202
sellPrice: new BigNumber('0.0212'),
166203
sellQuantity: new BigNumber('39.6'),
167204
},
205+
config: testConfig(),
168206
});
169207
});
170208

171-
test('OpenDEX quote asset max inbound reduces sell quantity', () => {
209+
test('OpenDEX quote asset max inbound reduces sell quantity for ETH/BTC', () => {
172210
expect.assertions(1);
173211
const tradeInfo = {
174212
price: new BigNumber('0.02'),
@@ -193,6 +231,42 @@ describe('tradeInfoToOpenDEXorders', () => {
193231
sellPrice: new BigNumber('0.0212'),
194232
sellQuantity: new BigNumber('11.67452830'),
195233
},
234+
config: testConfig(),
235+
});
236+
});
237+
238+
test('OpenDEX quote asset max inbound for BTC/USDT', () => {
239+
expect.assertions(1);
240+
const tradeInfo = {
241+
price: new BigNumber('10000'),
242+
assets: {
243+
openDEX: {
244+
baseAssetBalance: new BigNumber('1'),
245+
baseAssetMaxInbound: new BigNumber('1'),
246+
baseAssetMaxOutbound: new BigNumber('1'),
247+
quoteAssetBalance: new BigNumber('15000'),
248+
quoteAssetMaxOutbound: new BigNumber('15000'),
249+
quoteAssetMaxInbound: new BigNumber('0'),
250+
},
251+
centralizedExchange: {
252+
baseAssetBalance: new BigNumber('1.5'),
253+
quoteAssetBalance: new BigNumber('20000'),
254+
},
255+
},
256+
};
257+
assertTradeInfoToOpenDEXorders({
258+
tradeInfo,
259+
expected: {
260+
sellPrice: new BigNumber('10600'),
261+
sellQuantity: new BigNumber('0.44363207'),
262+
},
263+
config: {
264+
...testConfig(),
265+
...{
266+
BASEASSET: 'BTC',
267+
QUOTEASSET: 'USDT',
268+
},
269+
},
196270
});
197271
});
198272

@@ -221,6 +295,7 @@ describe('tradeInfoToOpenDEXorders', () => {
221295
sellPrice: new BigNumber('0.0212'),
222296
sellQuantity: new BigNumber('4.95'),
223297
},
298+
config: testConfig(),
224299
});
225300
});
226301
});

src/opendex/orders.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Config } from '../config';
33
import { OrderSide } from '../proto/xudrpc_pb';
44
import { TradeInfo } from '../trade/info';
55
import { coinsToSats } from '../utils';
6+
import { Asset } from 'src/constants';
67

78
type OpenDEXorder = {
89
quantity: number;
@@ -51,8 +52,24 @@ const tradeInfoToOpenDEXorders = ({
5152
const margin = price.multipliedBy(marginPercentage);
5253
const buyPrice = price.minus(margin);
5354
const sellPrice = price.plus(margin);
55+
const CONNEXT_CURRENCIES = ['ETH', 'USDT', 'DAI'];
56+
const getOpenDEXMaxInbound = (asset: Asset) => {
57+
if (CONNEXT_CURRENCIES.includes(asset)) {
58+
if (asset === 'ETH') {
59+
// connext node provides us max inbound liquidity of 15 ETH
60+
return new BigNumber('14.25');
61+
} else {
62+
// ...and 5000 for other assets
63+
return new BigNumber('4750');
64+
}
65+
} else if (asset === config.BASEASSET) {
66+
return openDEXbaseAssetMaxInbound;
67+
} else {
68+
return openDEXquoteAssetMaxInbound;
69+
}
70+
};
5471
const buyQuantity = BigNumber.minimum(
55-
openDEXbaseAssetMaxInbound,
72+
getOpenDEXMaxInbound(config.BASEASSET),
5673
openDEXquoteAssetMaxOutbound.dividedBy(buyPrice),
5774
centralizedExchangeBaseAssetBalance
5875
);
@@ -62,7 +79,7 @@ const tradeInfoToOpenDEXorders = ({
6279
);
6380
const sellQuantity = BigNumber.minimum(
6481
openDEXbaseAssetMaxOutbound,
65-
openDEXquoteAssetMaxInbound.dividedBy(sellPrice),
82+
getOpenDEXMaxInbound(config.QUOTEASSET).dividedBy(sellPrice),
6683
centralizedExchangeQuoteAssetBalance.dividedBy(price)
6784
);
6885
const sellQuantityWithBuffer = sellQuantity.minus(

0 commit comments

Comments
 (0)