stackswap-front-api-test-02 1.0.147 → 1.0.150
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/stackswap/config.d.ts +2 -0
- package/dist/esm/stackswap/config.js +3 -0
- package/dist/esm/stackswap/config.js.map +1 -1
- package/dist/esm/stackswap/manager/swap.manager.d.ts +11 -1
- package/dist/esm/stackswap/manager/swap.manager.js +252 -45
- package/dist/esm/stackswap/manager/swap.manager.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/stackswap/config.d.ts +2 -0
- package/dist/stackswap/config.js +3 -0
- package/dist/stackswap/config.js.map +1 -1
- package/dist/stackswap/manager/swap.manager.d.ts +11 -1
- package/dist/stackswap/manager/swap.manager.js +252 -45
- package/dist/stackswap/manager/swap.manager.js.map +1 -1
- package/package.json +1 -1
- package/src/stackswap/config.ts +5 -0
- package/src/stackswap/manager/swap.manager.ts +299 -58
|
@@ -13,7 +13,9 @@ export enum SwapType {
|
|
|
13
13
|
ON_LOADING,
|
|
14
14
|
SINGLE = 2,
|
|
15
15
|
ROUTER_STX = 10,
|
|
16
|
-
ROUTER_STSW = 11
|
|
16
|
+
ROUTER_STSW = 11,
|
|
17
|
+
ROUTER_STX_STSW = 20,
|
|
18
|
+
ROUTER_STSW_STX = 21,
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
export class SwapManager {
|
|
@@ -23,6 +25,73 @@ export class SwapManager {
|
|
|
23
25
|
this.stackswap = stackswap;
|
|
24
26
|
}
|
|
25
27
|
|
|
28
|
+
|
|
29
|
+
async findRouter3(token_x : Token, token_y : Token, current_block: number) : Promise<{ valid: SwapType, [key: string]: any}> {
|
|
30
|
+
const url = this.stackswap.config.STACKS_BACKEND_URL() + '/api/v1/swap_v3/' + token_x.addr +'/'+token_y.addr + '/' + current_block;
|
|
31
|
+
const result = await axios.get ( url,
|
|
32
|
+
{timeout: 50000,});
|
|
33
|
+
// console.log('swap router : ', value)
|
|
34
|
+
const res = result.data;
|
|
35
|
+
if(Object.keys(res).length === 0){
|
|
36
|
+
return {valid : SwapType.NO_ROUTE}
|
|
37
|
+
}else if(res.type === 'SWAP'){
|
|
38
|
+
return{
|
|
39
|
+
valid : SwapType.SINGLE,
|
|
40
|
+
x_to_y : res.direction,
|
|
41
|
+
pair : LiquidityPool.parsePoolsFromServerData2(res.pair, token_x, token_y, res.direction)
|
|
42
|
+
}
|
|
43
|
+
}else if (res.type === 'RouterSWAP'){
|
|
44
|
+
if(res.bridge_token === 'STX'){
|
|
45
|
+
return {
|
|
46
|
+
valid : SwapType.ROUTER_STX,
|
|
47
|
+
router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
|
|
48
|
+
router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
|
|
49
|
+
router_from_mode : res.from_direction,
|
|
50
|
+
router_to_mode : res.to_direction
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
}else if(res.bridge_token === 'STSW') {
|
|
54
|
+
return{
|
|
55
|
+
valid : SwapType.ROUTER_STSW,
|
|
56
|
+
router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
|
|
57
|
+
router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
|
|
58
|
+
router_from_mode : res.from_direction,
|
|
59
|
+
router_to_mode : res.to_direction
|
|
60
|
+
}
|
|
61
|
+
} else{
|
|
62
|
+
return {valid : SwapType.NO_ROUTE}
|
|
63
|
+
}
|
|
64
|
+
} else if(res.type === 'RouterSWAP2') {
|
|
65
|
+
if(res.bridge_token === 'STSW|STX'){
|
|
66
|
+
return {
|
|
67
|
+
valid : SwapType.ROUTER_STSW_STX,
|
|
68
|
+
router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
|
|
69
|
+
router_bridge_pair : LiquidityPool.parsePoolsFromServerData2(res.bridge_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), Token.getBaseTokens(this.stackswap, BaseToken.STX), res.bridge_direction),
|
|
70
|
+
router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
|
|
71
|
+
router_from_mode : res.from_direction,
|
|
72
|
+
router_bridge_mode : res.bridge_direction,
|
|
73
|
+
router_to_mode : res.to_direction
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
}else if(res.bridge_token === 'STX|STSW') {
|
|
77
|
+
return{
|
|
78
|
+
valid : SwapType.ROUTER_STX_STSW,
|
|
79
|
+
router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
|
|
80
|
+
router_bridge_pair : LiquidityPool.parsePoolsFromServerData2(res.bridge_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.bridge_direction),
|
|
81
|
+
router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
|
|
82
|
+
router_from_mode : res.from_direction,
|
|
83
|
+
router_bridge_mode : res.bridge_direction,
|
|
84
|
+
router_to_mode : res.to_direction
|
|
85
|
+
}
|
|
86
|
+
} else{
|
|
87
|
+
return {valid : SwapType.NO_ROUTE}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
return {valid : SwapType.NO_ROUTE}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
26
95
|
async findRouter2(token_x : Token, token_y : Token, current_block: number) : Promise<{ valid: SwapType, [key: string]: any}> {
|
|
27
96
|
const url = this.stackswap.config.STACKS_BACKEND_URL() + '/api/v1/swap_v2/' + token_x.addr +'/'+token_y.addr + '/' + current_block;
|
|
28
97
|
const result = await axios.get ( url,
|
|
@@ -103,6 +172,65 @@ export class SwapManager {
|
|
|
103
172
|
}
|
|
104
173
|
}
|
|
105
174
|
|
|
175
|
+
async routerSwap2ContractCall(token_from_amount: string, token_to_amount: string, token_bridge1_amount: string, token_bridge2_amount: string, pair_from: LiquidityPool, pair_to: LiquidityPool, pair_bridge: LiquidityPool, router_from_mode: boolean, router_to_mode: boolean, router_bridge_mode: boolean, tolerance: number, callback: any = null) {
|
|
176
|
+
|
|
177
|
+
const token_from = router_from_mode ? pair_from.token_x : pair_from.token_y;
|
|
178
|
+
const token_bridge1 = router_from_mode ? pair_from.token_y : pair_from.token_x;
|
|
179
|
+
const token_bridge2 = router_from_mode ? pair_to.token_x : pair_to.token_y;
|
|
180
|
+
const token_to = router_to_mode ? pair_to.token_y: pair_to.token_x;
|
|
181
|
+
|
|
182
|
+
const from_amt = new BigNumber(10 ** token_from.decimal).multipliedBy(token_from_amount).integerValue();
|
|
183
|
+
const bridge1_amt = new BigNumber(10 ** token_bridge1.decimal).multipliedBy(token_bridge1_amount).integerValue();
|
|
184
|
+
const bridge2_amt = new BigNumber(10 ** token_bridge2.decimal).multipliedBy(token_bridge2_amount).integerValue();
|
|
185
|
+
const to_amt = new BigNumber(10 ** token_to.decimal).multipliedBy(token_to_amount).integerValue();
|
|
186
|
+
|
|
187
|
+
const bridge1_min = bridge1_amt.multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
|
|
188
|
+
const bridge1_max = bridge1_amt.multipliedBy((100 + tolerance)).dividedBy(100).integerValue();
|
|
189
|
+
const bridge2_min = bridge2_amt.multipliedBy((100 - tolerance)).dividedBy(100).multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
|
|
190
|
+
const bridge2_max = bridge2_amt.multipliedBy((100 + tolerance)).dividedBy(100).multipliedBy((100 + tolerance)).dividedBy(100).integerValue();
|
|
191
|
+
const to_min = to_amt.multipliedBy((100 - tolerance)).dividedBy(100).multipliedBy((100 - tolerance)).dividedBy(100).multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
|
|
192
|
+
|
|
193
|
+
const token_from_addr = (token_from.addr);
|
|
194
|
+
const token_bridge1_addr = (token_bridge1.addr);
|
|
195
|
+
const token_bridge2_addr = (token_bridge2.addr);
|
|
196
|
+
const token_to_addr = (token_to.addr);
|
|
197
|
+
|
|
198
|
+
const pair_from_addr = pair_from.token_lp.addr;
|
|
199
|
+
const pair_bridge_addr = pair_bridge.token_lp.addr;
|
|
200
|
+
const pair_to_addr = pair_to.token_lp.addr;
|
|
201
|
+
|
|
202
|
+
const from_mode = router_from_mode ? trueCV() : falseCV();
|
|
203
|
+
const bridge_mode = router_bridge_mode ? trueCV() : falseCV();
|
|
204
|
+
const to_mode = router_to_mode ? trueCV() : falseCV();
|
|
205
|
+
|
|
206
|
+
const post_condition = [];
|
|
207
|
+
post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_from.addr, from_amt.toString(), FungibleConditionCode.Equal));
|
|
208
|
+
post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_from_addr, token_bridge1.addr, bridge1_min.toString(), FungibleConditionCode.GreaterEqual));
|
|
209
|
+
post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_bridge1.addr, bridge1_max.toString(), FungibleConditionCode.LessEqual));
|
|
210
|
+
post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_bridge_addr, token_bridge2.addr, bridge2_min.toString(), FungibleConditionCode.GreaterEqual));
|
|
211
|
+
post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_bridge2.addr, bridge2_max.toString(), FungibleConditionCode.LessEqual));
|
|
212
|
+
post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_to_addr, token_to.addr, to_min.toString(), FungibleConditionCode.GreaterEqual));
|
|
213
|
+
|
|
214
|
+
const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_ROUTER_SWAP2(), 'exchange-router2', [
|
|
215
|
+
parseAddressToCV(token_from_addr),
|
|
216
|
+
parseAddressToCV(token_bridge1_addr),
|
|
217
|
+
parseAddressToCV(token_bridge2_addr),
|
|
218
|
+
parseAddressToCV(token_to_addr),
|
|
219
|
+
parseAddressToCV(pair_from_addr),
|
|
220
|
+
parseAddressToCV(pair_bridge_addr),
|
|
221
|
+
parseAddressToCV(pair_to_addr),
|
|
222
|
+
from_mode,
|
|
223
|
+
bridge_mode,
|
|
224
|
+
to_mode,
|
|
225
|
+
uintCV(from_amt.toString()),
|
|
226
|
+
uintCV(bridge1_min.toString()),
|
|
227
|
+
uintCV(bridge2_min.toString()),
|
|
228
|
+
uintCV(to_min.toString()),
|
|
229
|
+
this.stackswap.getSenderAddress(),
|
|
230
|
+
], post_condition, callback);
|
|
231
|
+
openContractCall(options);
|
|
232
|
+
}
|
|
233
|
+
|
|
106
234
|
async routerSwapContractCall(token_from_amount: string, token_to_amount: string, token_bridge_amount: string, pair_from: LiquidityPool, pair_to: LiquidityPool, router_from_mode: boolean, router_to_mode: boolean, tolerance: number, callback: any = null) {
|
|
107
235
|
|
|
108
236
|
const token_from = router_from_mode ? pair_from.token_x : pair_from.token_y;
|
|
@@ -114,6 +242,7 @@ export class SwapManager {
|
|
|
114
242
|
const to_amt = new BigNumber(10 ** token_to.decimal).multipliedBy(token_to_amount).integerValue();
|
|
115
243
|
|
|
116
244
|
const bridge_min = bridge_amt.multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
|
|
245
|
+
const bridge_max = bridge_amt.multipliedBy((100 + tolerance)).dividedBy(100).integerValue();
|
|
117
246
|
const to_min = to_amt.multipliedBy((100 - tolerance)).dividedBy(100).multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
|
|
118
247
|
|
|
119
248
|
const token_from_addr = (token_from.addr);
|
|
@@ -129,7 +258,7 @@ export class SwapManager {
|
|
|
129
258
|
const post_condition = [];
|
|
130
259
|
post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_from.addr, from_amt.toString(), FungibleConditionCode.Equal));
|
|
131
260
|
post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_from_addr, token_bridge.addr, bridge_min.toString(), FungibleConditionCode.GreaterEqual));
|
|
132
|
-
post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_bridge.addr,
|
|
261
|
+
post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_bridge.addr, bridge_max.toString(), FungibleConditionCode.LessEqual));
|
|
133
262
|
post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_to_addr, token_to.addr, to_min.toString(), FungibleConditionCode.GreaterEqual));
|
|
134
263
|
|
|
135
264
|
const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_ROUTER_SWAP(), 'router-swap', [
|
|
@@ -268,40 +397,54 @@ export class SwapManager {
|
|
|
268
397
|
}
|
|
269
398
|
}
|
|
270
399
|
|
|
271
|
-
|
|
400
|
+
|
|
401
|
+
price_impact_router(router_from_mode: boolean, router_to_mode: boolean,
|
|
402
|
+
pair_from:LiquidityPool, pair_to:LiquidityPool , token_from_amount: string) {
|
|
272
403
|
// console.log('price impact');
|
|
273
404
|
// (dy (/ (* u997 balance-y dx) (+ (* u1000 balance-x) (* u997 dx)))) ;; overall fee is 30 bp, either all for the pool, or 25 bp for pool and 5 bp for operator
|
|
274
405
|
// dy = balancey * dx / balancex + dx
|
|
275
406
|
try {
|
|
276
|
-
const
|
|
277
|
-
const
|
|
278
|
-
|
|
407
|
+
const from_input_balance = router_from_mode ? pair_from.balance_x : pair_from.balance_y;
|
|
408
|
+
const from_input_decimal = router_from_mode ? pair_from.token_x.decimal : pair_from.token_y.decimal;
|
|
409
|
+
const from_output_balance= router_from_mode ? pair_from.balance_y : pair_from.balance_y;
|
|
279
410
|
|
|
280
|
-
const
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
const dx = new BigNumber(token_from_amount).multipliedBy(10 ** token_from_decimal);
|
|
284
|
-
// console.log('dx', dx.toString(), typeof (dx));
|
|
285
|
-
if (dx.toNumber() > new BigNumber(balance_x).toNumber()) {
|
|
286
|
-
// console.log('dx is bigger than dy');
|
|
411
|
+
const from_input_dx = new BigNumber(token_from_amount).multipliedBy(10 ** from_input_decimal);
|
|
412
|
+
if (from_input_dx.toNumber() > new BigNumber(from_input_balance).toNumber()) {
|
|
287
413
|
return 100;
|
|
288
414
|
}
|
|
289
|
-
const
|
|
290
|
-
|
|
291
|
-
const
|
|
292
|
-
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
415
|
+
const from_dy_1 = new BigNumber(from_output_balance).multipliedBy(from_input_dx);
|
|
416
|
+
const from_dy_2 = new BigNumber(from_input_balance).plus(from_input_dx);
|
|
417
|
+
const from_dy = (from_dy_1.toNumber()) / (from_dy_2.toNumber());
|
|
418
|
+
|
|
419
|
+
const from_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(from_input_balance)).dividedBy(new BigNumber(from_output_balance));
|
|
420
|
+
const from_output_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(from_input_balance)).plus(from_input_dx).dividedBy(new BigNumber(from_output_balance).minus(from_dy));
|
|
421
|
+
const from_price_impact = from_output_price.minus(from_input_price).multipliedBy(10000).dividedBy(from_input_price);
|
|
422
|
+
|
|
423
|
+
console.log("FROM : ", token_from_amount, from_dy, from_price_impact.toNumber())
|
|
424
|
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
425
|
+
const to_input_balance = router_to_mode ? pair_to.balance_x : pair_to.balance_y;
|
|
426
|
+
const to_input_decimal = router_to_mode ? pair_to.token_x.decimal : pair_to.token_y.decimal;
|
|
427
|
+
const to_output_balance= router_to_mode ? pair_to.balance_y : pair_to.balance_y;
|
|
428
|
+
|
|
429
|
+
const to_input_dx = new BigNumber(from_dy).multipliedBy(10 ** to_input_decimal);
|
|
430
|
+
if (to_input_dx.toNumber() > new BigNumber(to_input_balance).toNumber()) {
|
|
431
|
+
return 100;
|
|
432
|
+
}
|
|
433
|
+
const to_dy_1 = new BigNumber(to_output_balance).multipliedBy(to_input_dx);
|
|
434
|
+
const to_dy_2 = new BigNumber(to_input_balance).plus(to_input_dx);
|
|
435
|
+
const to_dy = (to_dy_1.toNumber()) / (to_dy_2.toNumber());
|
|
436
|
+
|
|
437
|
+
const to_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(to_input_balance)).dividedBy(new BigNumber(to_output_balance));
|
|
438
|
+
const to_output_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(to_input_balance)).plus(to_input_dx).dividedBy(new BigNumber(to_output_balance).minus(to_dy));
|
|
439
|
+
const to_price_impact = to_output_price.minus(to_input_price).multipliedBy(10000).dividedBy(to_input_price);
|
|
440
|
+
|
|
441
|
+
// console.log("TO : ", bridge_dy, to_dy, to_price_impact.toNumber())
|
|
442
|
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
443
|
+
let price_impact = from_price_impact.toNumber() * to_price_impact.toNumber();
|
|
302
444
|
if (price_impact >= 10000) {
|
|
303
445
|
price_impact = 9999;
|
|
304
446
|
}
|
|
447
|
+
console.log("TOTAL : ", price_impact)
|
|
305
448
|
return (price_impact / 100).toFixed(5);
|
|
306
449
|
} catch (e) {
|
|
307
450
|
// console.log(e);
|
|
@@ -309,6 +452,76 @@ export class SwapManager {
|
|
|
309
452
|
}
|
|
310
453
|
}
|
|
311
454
|
|
|
455
|
+
price_impact_router2(router_from_mode: boolean, router_bridge_mode: boolean, router_to_mode: boolean,
|
|
456
|
+
pair_from:LiquidityPool, pair_bridge:LiquidityPool, pair_to:LiquidityPool , token_from_amount:string) {
|
|
457
|
+
// console.log('price impact');
|
|
458
|
+
// (dy (/ (* u997 balance-y dx) (+ (* u1000 balance-x) (* u997 dx)))) ;; overall fee is 30 bp, either all for the pool, or 25 bp for pool and 5 bp for operator
|
|
459
|
+
// dy = balancey * dx / balancex + dx
|
|
460
|
+
try {
|
|
461
|
+
const from_input_balance = router_from_mode ? pair_from.balance_x : pair_from.balance_y;
|
|
462
|
+
const from_input_decimal = router_from_mode ? pair_from.token_x.decimal : pair_from.token_y.decimal;
|
|
463
|
+
const from_output_balance= router_from_mode ? pair_from.balance_y : pair_from.balance_y;
|
|
464
|
+
const from_input_dx = new BigNumber(token_from_amount).multipliedBy(10 ** from_input_decimal);
|
|
465
|
+
if (from_input_dx.toNumber() > new BigNumber(from_input_balance).toNumber()) {
|
|
466
|
+
return 100;
|
|
467
|
+
}
|
|
468
|
+
const from_dy_1 = new BigNumber(from_output_balance).multipliedBy(from_input_dx);
|
|
469
|
+
const from_dy_2 = new BigNumber(from_input_balance).plus(from_input_dx);
|
|
470
|
+
const from_dy = (from_dy_1.toNumber()) / (from_dy_2.toNumber());
|
|
471
|
+
|
|
472
|
+
const from_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(from_input_balance)).dividedBy(new BigNumber(from_output_balance));
|
|
473
|
+
const from_output_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(from_input_balance)).plus(from_input_dx).dividedBy(new BigNumber(from_output_balance).minus(from_dy));
|
|
474
|
+
const from_price_impact = from_output_price.minus(from_input_price).multipliedBy(10000).dividedBy(from_input_price);
|
|
475
|
+
|
|
476
|
+
console.log("FROM : ", token_from_amount, from_dy, from_price_impact.toNumber())
|
|
477
|
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
478
|
+
const bridge_input_balance = router_bridge_mode ? pair_bridge.balance_x : pair_bridge.balance_y;
|
|
479
|
+
const bridge_input_decimal = router_bridge_mode ? pair_bridge.token_x.decimal : pair_bridge.token_y.decimal;
|
|
480
|
+
const bridge_output_balance= router_bridge_mode ? pair_bridge.balance_y : pair_bridge.balance_y;
|
|
481
|
+
|
|
482
|
+
const bridge_input_dx = new BigNumber(from_dy).multipliedBy(10 ** bridge_input_decimal);
|
|
483
|
+
if (bridge_input_dx.toNumber() > new BigNumber(bridge_input_balance).toNumber()) {
|
|
484
|
+
return 100;
|
|
485
|
+
}
|
|
486
|
+
const bridge_dy_1 = new BigNumber(bridge_output_balance).multipliedBy(bridge_input_dx);
|
|
487
|
+
const bridge_dy_2 = new BigNumber(bridge_input_balance).plus(bridge_input_dx);
|
|
488
|
+
const bridge_dy = (bridge_dy_1.toNumber()) / (bridge_dy_2.toNumber());
|
|
489
|
+
|
|
490
|
+
const bridge_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(bridge_input_balance)).dividedBy(new BigNumber(bridge_output_balance));
|
|
491
|
+
const bridge_output_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(bridge_input_balance)).plus(bridge_input_dx).dividedBy(new BigNumber(bridge_output_balance).minus(bridge_dy));
|
|
492
|
+
const bridge_price_impact = bridge_output_price.minus(bridge_input_price).multipliedBy(10000).dividedBy(bridge_input_price);
|
|
493
|
+
|
|
494
|
+
console.log("BRIDGE : ", from_dy, bridge_dy, bridge_price_impact.toNumber())
|
|
495
|
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
496
|
+
const to_input_balance = router_to_mode ? pair_to.balance_x : pair_to.balance_y;
|
|
497
|
+
const to_input_decimal = router_to_mode ? pair_to.token_x.decimal : pair_to.token_y.decimal;
|
|
498
|
+
const to_output_balance= router_to_mode ? pair_to.balance_y : pair_to.balance_y;
|
|
499
|
+
|
|
500
|
+
const to_input_dx = new BigNumber(bridge_dy).multipliedBy(10 ** to_input_decimal);
|
|
501
|
+
if (to_input_dx.toNumber() > new BigNumber(to_input_balance).toNumber()) {
|
|
502
|
+
return 100;
|
|
503
|
+
}
|
|
504
|
+
const to_dy_1 = new BigNumber(to_output_balance).multipliedBy(to_input_dx);
|
|
505
|
+
const to_dy_2 = new BigNumber(to_input_balance).plus(to_input_dx);
|
|
506
|
+
const to_dy = (to_dy_1.toNumber()) / (to_dy_2.toNumber());
|
|
507
|
+
|
|
508
|
+
const to_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(to_input_balance)).dividedBy(new BigNumber(to_output_balance));
|
|
509
|
+
const to_output_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(to_input_balance)).plus(to_input_dx).dividedBy(new BigNumber(to_output_balance).minus(to_dy));
|
|
510
|
+
const to_price_impact = to_output_price.minus(to_input_price).multipliedBy(10000).dividedBy(to_input_price);
|
|
511
|
+
|
|
512
|
+
console.log("TO : ", bridge_dy, to_dy, to_price_impact.toNumber())
|
|
513
|
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
514
|
+
let price_impact = from_price_impact.toNumber() * bridge_price_impact.toNumber() * to_price_impact.toNumber();
|
|
515
|
+
if (price_impact >= 10000) {
|
|
516
|
+
price_impact = 9999;
|
|
517
|
+
}
|
|
518
|
+
console.log("TOTAL : ", price_impact)
|
|
519
|
+
return (price_impact / 100).toFixed(5);
|
|
520
|
+
} catch (e) {
|
|
521
|
+
// console.log(e);
|
|
522
|
+
return 0;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
312
525
|
getPriceString(pair : LiquidityPool | null, token_x : Token| null, token_y : Token| null, price : number, price_invert : boolean) {
|
|
313
526
|
try {
|
|
314
527
|
if (price < 0){
|
|
@@ -347,40 +560,22 @@ export class SwapManager {
|
|
|
347
560
|
}
|
|
348
561
|
|
|
349
562
|
case SwapType.ROUTER_STX:
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
let router_from_price = -1;
|
|
353
|
-
if ( from_res.output_price !== '0') {
|
|
354
|
-
router_from_price = (1 / parseFloat(from_res.output_price));
|
|
355
|
-
}
|
|
356
|
-
const router_bridge_amt = new BigNumber(new BigNumber(from_res.dy).toFixed(Number(bridge_token.decimal))).toString();
|
|
357
|
-
const to_res = swap_data.router_to_pair.getPoolPrice(!swap_data.router_to_mode, Number(router_bridge_amt) <= 0 ? '-1': router_bridge_amt);
|
|
358
|
-
let router_to_price = -1;
|
|
359
|
-
if ( to_res.output_price !== '0') {
|
|
360
|
-
router_to_price = (1 / parseFloat(to_res.output_price));
|
|
361
|
-
}
|
|
362
|
-
const token_y_amount2 = new BigNumber(to_res.dy).toFixed(Number(Number(token_x_amount) <= 0 || token_x_amount == '' ? 0 : swap_data.router_to_pair.getTokenY(swap_data.router_to_mode).decimal)).toString();
|
|
363
|
-
price = router_from_price * router_to_price;
|
|
364
|
-
const price_strings2 = this.getPriceString(swap_data.pair, swap_data.router_from_pair.getTokenX(swap_data.router_from_mode), swap_data.router_to_pair.getTokenY(swap_data.router_to_mode), price, price_invert);
|
|
365
|
-
return {price : price, dy: token_y_amount2, price_strings: price_strings2, bridge_amount : router_bridge_amt};
|
|
563
|
+
return this.getRouterDY_V1(swap_data, token_x_amount,
|
|
564
|
+
Token.getBaseTokens(this.stackswap, BaseToken.STX), price_invert);
|
|
366
565
|
|
|
367
566
|
case SwapType.ROUTER_STSW:
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
const token_y_amount3 = new BigNumber(to_res2.dy).toFixed(Number(Number(token_x_amount) <= 0 || token_x_amount == '' ? 0 : swap_data.router_to_pair.getTokenY(swap_data.router_to_mode).decimal)).toString();
|
|
381
|
-
price = router_from_price2 * router_to_price2;
|
|
382
|
-
const price_strings3 = this.getPriceString(swap_data.pair, swap_data.router_from_pair.getTokenX(swap_data.router_from_mode), swap_data.router_to_pair.getTokenY(swap_data.router_to_mode), price, price_invert);
|
|
383
|
-
return {price : price, dy: token_y_amount3, price_strings: price_strings3, bridge_amount : router_bridge_amt2};
|
|
567
|
+
return this.getRouterDY_V1(swap_data, token_x_amount,
|
|
568
|
+
Token.getBaseTokens(this.stackswap, BaseToken.STSW), price_invert);
|
|
569
|
+
|
|
570
|
+
case SwapType.ROUTER_STX_STSW:
|
|
571
|
+
return this.getRouterDY_V2(swap_data, token_x_amount,
|
|
572
|
+
Token.getBaseTokens(this.stackswap, BaseToken.STX),
|
|
573
|
+
Token.getBaseTokens(this.stackswap, BaseToken.STSW), price_invert);
|
|
574
|
+
|
|
575
|
+
case SwapType.ROUTER_STSW_STX:
|
|
576
|
+
return this.getRouterDY_V2(swap_data, token_x_amount,
|
|
577
|
+
Token.getBaseTokens(this.stackswap, BaseToken.STSW),
|
|
578
|
+
Token.getBaseTokens(this.stackswap, BaseToken.STX), price_invert);
|
|
384
579
|
|
|
385
580
|
default:
|
|
386
581
|
return {price : price, dy: '0', price_strings: ''};
|
|
@@ -388,5 +583,51 @@ export class SwapManager {
|
|
|
388
583
|
|
|
389
584
|
}
|
|
390
585
|
|
|
586
|
+
private getRouterDY_V1(swap_data: any, token_x_amount: string, bridge_token: Token, price_invert: boolean) :{price: number,dy: string, price_strings: string, bridge_amount: string} {
|
|
587
|
+
let price = -1;
|
|
588
|
+
const from_res = swap_data.router_from_pair.getPoolPrice(!swap_data.router_from_mode, Number(token_x_amount) <= 0 || token_x_amount == '' ? '1': token_x_amount);
|
|
589
|
+
let router_from_price = -1;
|
|
590
|
+
if ( from_res.output_price !== '0') {
|
|
591
|
+
router_from_price = (1 / parseFloat(from_res.output_price));
|
|
592
|
+
}
|
|
593
|
+
const router_bridge_amt = new BigNumber(new BigNumber(from_res.dy).toFixed(Number(bridge_token.decimal))).toString();
|
|
594
|
+
const to_res = swap_data.router_to_pair.getPoolPrice(!swap_data.router_to_mode, Number(router_bridge_amt) <= 0 ? '-1': router_bridge_amt);
|
|
595
|
+
let router_to_price = -1;
|
|
596
|
+
if ( to_res.output_price !== '0') {
|
|
597
|
+
router_to_price = (1 / parseFloat(to_res.output_price));
|
|
598
|
+
}
|
|
599
|
+
const token_y_amount = new BigNumber(to_res.dy).toFixed(Number(Number(token_x_amount) <= 0 || token_x_amount == '' ? 0 : swap_data.router_to_pair.getTokenY(swap_data.router_to_mode).decimal)).toString();
|
|
600
|
+
price = router_from_price * router_to_price;
|
|
601
|
+
const price_strings = this.getPriceString(swap_data.pair, swap_data.router_from_pair.getTokenX(swap_data.router_from_mode), swap_data.router_to_pair.getTokenY(swap_data.router_to_mode), price, price_invert);
|
|
602
|
+
return {price : price, dy: token_y_amount, price_strings: price_strings, bridge_amount : router_bridge_amt};
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
private getRouterDY_V2(swap_data: any, token_x_amount: string, bridge_token1: Token, bridge_token2: Token, price_invert: boolean) :{price: number,dy: string, price_strings: string, bridge_amount1: string, bridge_amount2: string} {
|
|
606
|
+
let price = -1;
|
|
607
|
+
const from_res = swap_data.router_from_pair.getPoolPrice(!swap_data.router_from_mode, Number(token_x_amount) <= 0 || token_x_amount == '' ? '1': token_x_amount);
|
|
608
|
+
let router_from_price = -1;
|
|
609
|
+
if ( from_res.output_price !== '0') {
|
|
610
|
+
router_from_price = (1 / parseFloat(from_res.output_price));
|
|
611
|
+
}
|
|
612
|
+
const router_bridge1_amt = new BigNumber(new BigNumber(from_res.dy).toFixed(Number(bridge_token1.decimal))).toString();
|
|
613
|
+
|
|
614
|
+
let router_bridge_price = -1;
|
|
615
|
+
const bridge_res = swap_data.router_bridge_pair.getPoolPrice(!swap_data.router_bridge_mode, Number(router_bridge1_amt) <= 0 || router_bridge1_amt == '' ? '1': router_bridge1_amt);
|
|
616
|
+
if ( bridge_res.output_price !== '0') {
|
|
617
|
+
router_bridge_price = (1 / parseFloat(bridge_res.output_price));
|
|
618
|
+
}
|
|
619
|
+
const router_bridge2_amt = new BigNumber(new BigNumber(bridge_res.dy).toFixed(Number(bridge_token2.decimal))).toString();
|
|
620
|
+
|
|
621
|
+
const to_res = swap_data.router_to_pair.getPoolPrice(!swap_data.router_to_mode, Number(router_bridge2_amt) <= 0 ? '-1': router_bridge2_amt);
|
|
622
|
+
let router_to_price = -1;
|
|
623
|
+
if ( to_res.output_price !== '0') {
|
|
624
|
+
router_to_price = (1 / parseFloat(to_res.output_price));
|
|
625
|
+
}
|
|
626
|
+
const token_y_amount = new BigNumber(to_res.dy).toFixed(Number(Number(token_x_amount) <= 0 || token_x_amount == '' ? 0 : swap_data.router_to_pair.getTokenY(swap_data.router_to_mode).decimal)).toString();
|
|
627
|
+
price = router_from_price * router_to_price * router_bridge_price;
|
|
628
|
+
const price_strings = this.getPriceString(swap_data.pair, swap_data.router_from_pair.getTokenX(swap_data.router_from_mode), swap_data.router_to_pair.getTokenY(swap_data.router_to_mode), price, price_invert);
|
|
629
|
+
return {price: price, dy: token_y_amount, price_strings: price_strings, bridge_amount1: router_bridge1_amt, bridge_amount2: router_bridge2_amt};
|
|
630
|
+
}
|
|
631
|
+
|
|
391
632
|
|
|
392
633
|
}
|