stackswap-front-api-test-02 0.10.1

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.
Files changed (151) hide show
  1. package/README.md +10 -0
  2. package/dist/esm/index.d.ts +106 -0
  3. package/dist/esm/index.js +196 -0
  4. package/dist/esm/index.js.map +1 -0
  5. package/dist/esm/stackswap/config.d.ts +172 -0
  6. package/dist/esm/stackswap/config.js +302 -0
  7. package/dist/esm/stackswap/config.js.map +1 -0
  8. package/dist/esm/stackswap/manager/bridge.manager.d.ts +27 -0
  9. package/dist/esm/stackswap/manager/bridge.manager.js +215 -0
  10. package/dist/esm/stackswap/manager/bridge.manager.js.map +1 -0
  11. package/dist/esm/stackswap/manager/farm.manager.d.ts +41 -0
  12. package/dist/esm/stackswap/manager/farm.manager.js +293 -0
  13. package/dist/esm/stackswap/manager/farm.manager.js.map +1 -0
  14. package/dist/esm/stackswap/manager/farm2.manager.d.ts +106 -0
  15. package/dist/esm/stackswap/manager/farm2.manager.js +625 -0
  16. package/dist/esm/stackswap/manager/farm2.manager.js.map +1 -0
  17. package/dist/esm/stackswap/manager/farm3.manager.d.ts +121 -0
  18. package/dist/esm/stackswap/manager/farm3.manager.js +557 -0
  19. package/dist/esm/stackswap/manager/farm3.manager.js.map +1 -0
  20. package/dist/esm/stackswap/manager/governance.manager.d.ts +9 -0
  21. package/dist/esm/stackswap/manager/governance.manager.js +68 -0
  22. package/dist/esm/stackswap/manager/governance.manager.js.map +1 -0
  23. package/dist/esm/stackswap/manager/groupfarm.manager.d.ts +70 -0
  24. package/dist/esm/stackswap/manager/groupfarm.manager.js +379 -0
  25. package/dist/esm/stackswap/manager/groupfarm.manager.js.map +1 -0
  26. package/dist/esm/stackswap/manager/launchpad.manager.d.ts +18 -0
  27. package/dist/esm/stackswap/manager/launchpad.manager.js +253 -0
  28. package/dist/esm/stackswap/manager/launchpad.manager.js.map +1 -0
  29. package/dist/esm/stackswap/manager/lbtc.manager.d.ts +31 -0
  30. package/dist/esm/stackswap/manager/lbtc.manager.js +327 -0
  31. package/dist/esm/stackswap/manager/lbtc.manager.js.map +1 -0
  32. package/dist/esm/stackswap/manager/lbtcstaking.manager.d.ts +61 -0
  33. package/dist/esm/stackswap/manager/lbtcstaking.manager.js +248 -0
  34. package/dist/esm/stackswap/manager/lbtcstaking.manager.js.map +1 -0
  35. package/dist/esm/stackswap/manager/multisig.manager.d.ts +11 -0
  36. package/dist/esm/stackswap/manager/multisig.manager.js +50 -0
  37. package/dist/esm/stackswap/manager/multisig.manager.js.map +1 -0
  38. package/dist/esm/stackswap/manager/nft.manager.d.ts +55 -0
  39. package/dist/esm/stackswap/manager/nft.manager.js +274 -0
  40. package/dist/esm/stackswap/manager/nft.manager.js.map +1 -0
  41. package/dist/esm/stackswap/manager/operator.manager.d.ts +17 -0
  42. package/dist/esm/stackswap/manager/operator.manager.js +86 -0
  43. package/dist/esm/stackswap/manager/operator.manager.js.map +1 -0
  44. package/dist/esm/stackswap/manager/other.manager.d.ts +9 -0
  45. package/dist/esm/stackswap/manager/other.manager.js +41 -0
  46. package/dist/esm/stackswap/manager/other.manager.js.map +1 -0
  47. package/dist/esm/stackswap/manager/pool.manager.d.ts +34 -0
  48. package/dist/esm/stackswap/manager/pool.manager.js +172 -0
  49. package/dist/esm/stackswap/manager/pool.manager.js.map +1 -0
  50. package/dist/esm/stackswap/manager/poxl.manager.d.ts +16 -0
  51. package/dist/esm/stackswap/manager/poxl.manager.js +72 -0
  52. package/dist/esm/stackswap/manager/poxl.manager.js.map +1 -0
  53. package/dist/esm/stackswap/manager/staking.manager.d.ts +40 -0
  54. package/dist/esm/stackswap/manager/staking.manager.js +295 -0
  55. package/dist/esm/stackswap/manager/staking.manager.js.map +1 -0
  56. package/dist/esm/stackswap/manager/swap.manager.d.ts +71 -0
  57. package/dist/esm/stackswap/manager/swap.manager.js +730 -0
  58. package/dist/esm/stackswap/manager/swap.manager.js.map +1 -0
  59. package/dist/esm/stackswap/manager/token.manager.d.ts +32 -0
  60. package/dist/esm/stackswap/manager/token.manager.js +142 -0
  61. package/dist/esm/stackswap/manager/token.manager.js.map +1 -0
  62. package/dist/esm/stackswap/util.d.ts +35 -0
  63. package/dist/esm/stackswap/util.js +202 -0
  64. package/dist/esm/stackswap/util.js.map +1 -0
  65. package/dist/index.d.ts +106 -0
  66. package/dist/index.js +206 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/index.umd.js +2 -0
  69. package/dist/index.umd.js.LICENSE.txt +25 -0
  70. package/dist/stackswap/config.d.ts +172 -0
  71. package/dist/stackswap/config.js +308 -0
  72. package/dist/stackswap/config.js.map +1 -0
  73. package/dist/stackswap/manager/bridge.manager.d.ts +27 -0
  74. package/dist/stackswap/manager/bridge.manager.js +222 -0
  75. package/dist/stackswap/manager/bridge.manager.js.map +1 -0
  76. package/dist/stackswap/manager/farm.manager.d.ts +41 -0
  77. package/dist/stackswap/manager/farm.manager.js +301 -0
  78. package/dist/stackswap/manager/farm.manager.js.map +1 -0
  79. package/dist/stackswap/manager/farm2.manager.d.ts +106 -0
  80. package/dist/stackswap/manager/farm2.manager.js +632 -0
  81. package/dist/stackswap/manager/farm2.manager.js.map +1 -0
  82. package/dist/stackswap/manager/farm3.manager.d.ts +121 -0
  83. package/dist/stackswap/manager/farm3.manager.js +564 -0
  84. package/dist/stackswap/manager/farm3.manager.js.map +1 -0
  85. package/dist/stackswap/manager/governance.manager.d.ts +9 -0
  86. package/dist/stackswap/manager/governance.manager.js +75 -0
  87. package/dist/stackswap/manager/governance.manager.js.map +1 -0
  88. package/dist/stackswap/manager/groupfarm.manager.d.ts +70 -0
  89. package/dist/stackswap/manager/groupfarm.manager.js +386 -0
  90. package/dist/stackswap/manager/groupfarm.manager.js.map +1 -0
  91. package/dist/stackswap/manager/launchpad.manager.d.ts +18 -0
  92. package/dist/stackswap/manager/launchpad.manager.js +257 -0
  93. package/dist/stackswap/manager/launchpad.manager.js.map +1 -0
  94. package/dist/stackswap/manager/lbtc.manager.d.ts +31 -0
  95. package/dist/stackswap/manager/lbtc.manager.js +334 -0
  96. package/dist/stackswap/manager/lbtc.manager.js.map +1 -0
  97. package/dist/stackswap/manager/lbtcstaking.manager.d.ts +61 -0
  98. package/dist/stackswap/manager/lbtcstaking.manager.js +255 -0
  99. package/dist/stackswap/manager/lbtcstaking.manager.js.map +1 -0
  100. package/dist/stackswap/manager/multisig.manager.d.ts +11 -0
  101. package/dist/stackswap/manager/multisig.manager.js +54 -0
  102. package/dist/stackswap/manager/multisig.manager.js.map +1 -0
  103. package/dist/stackswap/manager/nft.manager.d.ts +55 -0
  104. package/dist/stackswap/manager/nft.manager.js +281 -0
  105. package/dist/stackswap/manager/nft.manager.js.map +1 -0
  106. package/dist/stackswap/manager/operator.manager.d.ts +17 -0
  107. package/dist/stackswap/manager/operator.manager.js +93 -0
  108. package/dist/stackswap/manager/operator.manager.js.map +1 -0
  109. package/dist/stackswap/manager/other.manager.d.ts +9 -0
  110. package/dist/stackswap/manager/other.manager.js +45 -0
  111. package/dist/stackswap/manager/other.manager.js.map +1 -0
  112. package/dist/stackswap/manager/pool.manager.d.ts +34 -0
  113. package/dist/stackswap/manager/pool.manager.js +180 -0
  114. package/dist/stackswap/manager/pool.manager.js.map +1 -0
  115. package/dist/stackswap/manager/poxl.manager.d.ts +16 -0
  116. package/dist/stackswap/manager/poxl.manager.js +79 -0
  117. package/dist/stackswap/manager/poxl.manager.js.map +1 -0
  118. package/dist/stackswap/manager/staking.manager.d.ts +40 -0
  119. package/dist/stackswap/manager/staking.manager.js +302 -0
  120. package/dist/stackswap/manager/staking.manager.js.map +1 -0
  121. package/dist/stackswap/manager/swap.manager.d.ts +71 -0
  122. package/dist/stackswap/manager/swap.manager.js +737 -0
  123. package/dist/stackswap/manager/swap.manager.js.map +1 -0
  124. package/dist/stackswap/manager/token.manager.d.ts +32 -0
  125. package/dist/stackswap/manager/token.manager.js +150 -0
  126. package/dist/stackswap/manager/token.manager.js.map +1 -0
  127. package/dist/stackswap/util.d.ts +35 -0
  128. package/dist/stackswap/util.js +219 -0
  129. package/dist/stackswap/util.js.map +1 -0
  130. package/package.json +45 -0
  131. package/src/index.ts +279 -0
  132. package/src/stackswap/config.ts +456 -0
  133. package/src/stackswap/manager/bridge.manager.ts +313 -0
  134. package/src/stackswap/manager/farm.manager.ts +399 -0
  135. package/src/stackswap/manager/farm2.manager.ts +733 -0
  136. package/src/stackswap/manager/farm3.manager.ts +690 -0
  137. package/src/stackswap/manager/governance.manager.ts +112 -0
  138. package/src/stackswap/manager/groupfarm.manager.ts +474 -0
  139. package/src/stackswap/manager/launchpad.manager.ts +307 -0
  140. package/src/stackswap/manager/lbtc.manager.ts +566 -0
  141. package/src/stackswap/manager/lbtcstaking.manager.ts +360 -0
  142. package/src/stackswap/manager/multisig.manager.ts +87 -0
  143. package/src/stackswap/manager/nft.manager.ts +352 -0
  144. package/src/stackswap/manager/operator.manager.ts +123 -0
  145. package/src/stackswap/manager/other.manager.ts +72 -0
  146. package/src/stackswap/manager/pool.manager.ts +202 -0
  147. package/src/stackswap/manager/poxl.manager.ts +99 -0
  148. package/src/stackswap/manager/staking.manager.ts +402 -0
  149. package/src/stackswap/manager/swap.manager.ts +902 -0
  150. package/src/stackswap/manager/token.manager.ts +177 -0
  151. package/src/stackswap/util.ts +275 -0
@@ -0,0 +1,902 @@
1
+ import BigNumber from "bignumber.js";
2
+
3
+ import {falseCV, FungibleConditionCode, stringAsciiCV, trueCV, uintCV} from "@stacks/transactions";
4
+ import {openContractCall} from "@stacks/connect";
5
+ import {StackswapAPI} from "../../index";
6
+ import {decimal2integer, getPostConditionFromAsset, getWriteOptions, parseAddressToCV} from "../util";
7
+ import {LiquidityPool} from "./pool.manager";
8
+ import {BaseToken, Token} from "./token.manager";
9
+ import axios from "axios";
10
+
11
+ export enum SwapType {
12
+ NO_ROUTE,
13
+ ON_LOADING,
14
+ SINGLE = 2,
15
+ ROUTER_STX = 10,
16
+ ROUTER_STSW = 11,
17
+ ROUTER_STX_STSW = 20,
18
+ ROUTER_STSW_STX = 21,
19
+ }
20
+
21
+ export class SwapManager {
22
+ stackswap: StackswapAPI;
23
+
24
+ constructor(stackswap: StackswapAPI) {
25
+ this.stackswap = stackswap;
26
+ }
27
+
28
+ async findRouterAll(token_x : Token, token_y : Token, current_block: number) : Promise<{ valid: SwapType, [key: string]: any}> {
29
+ const url = this.stackswap.config.STACKS_BACKEND_URL() + '/api/v1/swap_all/' + token_x.addr +'/'+token_y.addr + '/' + current_block;
30
+ const result = await axios.get ( url,
31
+ {timeout: 50000,});
32
+ // // console.log('swap router : ', value)
33
+ const res = result.data;
34
+ if(Object.keys(res).length === 0){
35
+ return {valid : SwapType.NO_ROUTE}
36
+ }else if(res.type === 'SWAP'){
37
+ return{
38
+ valid : SwapType.SINGLE,
39
+ x_to_y : res.direction,
40
+ pair : LiquidityPool.parsePoolsFromServerData2(res.pair, token_x, token_y, res.direction)
41
+ }
42
+ }else if (res.type === 'RouterSWAP'){
43
+ if(res.bridge_token == Token.getBaseTokens(this.stackswap, BaseToken.STX).addr){
44
+ return {
45
+ valid : SwapType.ROUTER_STX,
46
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
47
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
48
+ router_from_mode : res.from_direction,
49
+ router_to_mode : res.to_direction
50
+ }
51
+
52
+ }else if(res.bridge_token == Token.getBaseTokens(this.stackswap, BaseToken.STSW).addr) {
53
+ return{
54
+ valid : SwapType.ROUTER_STSW,
55
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
56
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
57
+ router_from_mode : res.from_direction,
58
+ router_to_mode : res.to_direction
59
+ }
60
+ } else{
61
+ return {valid : SwapType.NO_ROUTE}
62
+ }
63
+ } else if(res.type === 'RouterSWAP2') {
64
+ if(res.bridge_token[0] == Token.getBaseTokens(this.stackswap, BaseToken.STSW).addr && res.bridge_token[1] == Token.getBaseTokens(this.stackswap, BaseToken.STX).addr){
65
+ return {
66
+ valid : SwapType.ROUTER_STSW_STX,
67
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
68
+ router_bridge_pair : LiquidityPool.parsePoolsFromServerData2(res.bridge_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), Token.getBaseTokens(this.stackswap, BaseToken.STX), res.bridge_direction),
69
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
70
+ router_from_mode : res.from_direction,
71
+ router_bridge_mode : res.bridge_direction,
72
+ router_to_mode : res.to_direction
73
+ }
74
+ }else if(res.bridge_token[1] == Token.getBaseTokens(this.stackswap, BaseToken.STSW).addr && res.bridge_token[0] == Token.getBaseTokens(this.stackswap, BaseToken.STX).addr) {
75
+ return {
76
+ valid : SwapType.ROUTER_STX_STSW,
77
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
78
+ router_bridge_pair : LiquidityPool.parsePoolsFromServerData2(res.bridge_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.bridge_direction),
79
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
80
+ router_from_mode : res.from_direction,
81
+ router_bridge_mode : res.bridge_direction,
82
+ router_to_mode : res.to_direction
83
+ }
84
+ } else{
85
+ return {valid : SwapType.NO_ROUTE}
86
+ }
87
+ }
88
+ else {
89
+ return {valid : SwapType.NO_ROUTE}
90
+ }
91
+ }
92
+
93
+
94
+ async findRouter4(token_x : Token, token_y : Token, current_block: number) : Promise<{ valid: SwapType, [key: string]: any}> {
95
+ const url = this.stackswap.config.STACKS_BACKEND_URL() + '/api/v1/swap_v4/' + token_x.addr +'/'+token_y.addr + '/' + current_block;
96
+ const result = await axios.get ( url,
97
+ {timeout: 50000,});
98
+ // // console.log('swap router : ', value)
99
+ const res = result.data;
100
+ if(Object.keys(res).length === 0){
101
+ return {valid : SwapType.NO_ROUTE}
102
+ }else if(res.type === 'SWAP'){
103
+ return{
104
+ valid : SwapType.SINGLE,
105
+ x_to_y : res.direction,
106
+ pair : LiquidityPool.parsePoolsFromServerData2(res.pair, token_x, token_y, res.direction)
107
+ }
108
+ }else if (res.type === 'RouterSWAP'){
109
+ if(res.bridge_token == Token.getBaseTokens(this.stackswap, BaseToken.STX).addr){
110
+ return {
111
+ valid : SwapType.ROUTER_STX,
112
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
113
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
114
+ router_from_mode : res.from_direction,
115
+ router_to_mode : res.to_direction
116
+ }
117
+
118
+ }else if(res.bridge_token == Token.getBaseTokens(this.stackswap, BaseToken.STSW).addr) {
119
+ return{
120
+ valid : SwapType.ROUTER_STSW,
121
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
122
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
123
+ router_from_mode : res.from_direction,
124
+ router_to_mode : res.to_direction
125
+ }
126
+ } else{
127
+ return {valid : SwapType.NO_ROUTE}
128
+ }
129
+ } else if(res.type === 'RouterSWAP2') {
130
+ if(res.bridge_token[0] == Token.getBaseTokens(this.stackswap, BaseToken.STSW).addr && res.bridge_token[1] == Token.getBaseTokens(this.stackswap, BaseToken.STX).addr){
131
+ return {
132
+ valid : SwapType.ROUTER_STSW_STX,
133
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
134
+ router_bridge_pair : LiquidityPool.parsePoolsFromServerData2(res.bridge_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), Token.getBaseTokens(this.stackswap, BaseToken.STX), res.bridge_direction),
135
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
136
+ router_from_mode : res.from_direction,
137
+ router_bridge_mode : res.bridge_direction,
138
+ router_to_mode : res.to_direction
139
+ }
140
+ }else if(res.bridge_token[1] == Token.getBaseTokens(this.stackswap, BaseToken.STSW).addr && res.bridge_token[0] == Token.getBaseTokens(this.stackswap, BaseToken.STX).addr) {
141
+ return {
142
+ valid : SwapType.ROUTER_STX_STSW,
143
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
144
+ router_bridge_pair : LiquidityPool.parsePoolsFromServerData2(res.bridge_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.bridge_direction),
145
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
146
+ router_from_mode : res.from_direction,
147
+ router_bridge_mode : res.bridge_direction,
148
+ router_to_mode : res.to_direction
149
+ }
150
+ } else{
151
+ return {valid : SwapType.NO_ROUTE}
152
+ }
153
+ }
154
+ else {
155
+ return {valid : SwapType.NO_ROUTE}
156
+ }
157
+ }
158
+
159
+
160
+ async findRouter3(token_x : Token, token_y : Token, current_block: number) : Promise<{ valid: SwapType, [key: string]: any}> {
161
+ const url = this.stackswap.config.STACKS_BACKEND_URL() + '/api/v1/swap_v3/' + token_x.addr +'/'+token_y.addr + '/' + current_block;
162
+ const result = await axios.get ( url,
163
+ {timeout: 50000,});
164
+ // // console.log('swap router : ', value)
165
+ const res = result.data;
166
+ if(Object.keys(res).length === 0){
167
+ return {valid : SwapType.NO_ROUTE}
168
+ }else if(res.type === 'SWAP'){
169
+ return{
170
+ valid : SwapType.SINGLE,
171
+ x_to_y : res.direction,
172
+ pair : LiquidityPool.parsePoolsFromServerData2(res.pair, token_x, token_y, res.direction)
173
+ }
174
+ }else if (res.type === 'RouterSWAP'){
175
+ if(res.bridge_token === 'STX'){
176
+ return {
177
+ valid : SwapType.ROUTER_STX,
178
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
179
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
180
+ router_from_mode : res.from_direction,
181
+ router_to_mode : res.to_direction
182
+ }
183
+
184
+ }else if(res.bridge_token === 'STSW') {
185
+ return{
186
+ valid : SwapType.ROUTER_STSW,
187
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
188
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
189
+ router_from_mode : res.from_direction,
190
+ router_to_mode : res.to_direction
191
+ }
192
+ } else{
193
+ return {valid : SwapType.NO_ROUTE}
194
+ }
195
+ } else if(res.type === 'RouterSWAP2') {
196
+ if(res.bridge_token === 'STSW|STX'){
197
+ return {
198
+ valid : SwapType.ROUTER_STSW_STX,
199
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
200
+ router_bridge_pair : LiquidityPool.parsePoolsFromServerData2(res.bridge_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), Token.getBaseTokens(this.stackswap, BaseToken.STX), res.bridge_direction),
201
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
202
+ router_from_mode : res.from_direction,
203
+ router_bridge_mode : res.bridge_direction,
204
+ router_to_mode : res.to_direction
205
+ }
206
+
207
+ }else if(res.bridge_token === 'STX|STSW') {
208
+ return{
209
+ valid : SwapType.ROUTER_STX_STSW,
210
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
211
+ router_bridge_pair : LiquidityPool.parsePoolsFromServerData2(res.bridge_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.bridge_direction),
212
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
213
+ router_from_mode : res.from_direction,
214
+ router_bridge_mode : res.bridge_direction,
215
+ router_to_mode : res.to_direction
216
+ }
217
+ } else{
218
+ return {valid : SwapType.NO_ROUTE}
219
+ }
220
+ }
221
+ else {
222
+ return {valid : SwapType.NO_ROUTE}
223
+ }
224
+ }
225
+
226
+ async findRouter2(token_x : Token, token_y : Token, current_block: number) : Promise<{ valid: SwapType, [key: string]: any}> {
227
+ const url = this.stackswap.config.STACKS_BACKEND_URL() + '/api/v1/swap_v2/' + token_x.addr +'/'+token_y.addr + '/' + current_block;
228
+ const result = await axios.get ( url,
229
+ {timeout: 50000,});
230
+ // // console.log('swap router : ', value)
231
+ const res = result.data;
232
+ if(Object.keys(res).length === 0){
233
+ return {valid : SwapType.NO_ROUTE}
234
+ }else if(res.type === 'SWAP'){
235
+ return{
236
+ valid : SwapType.SINGLE,
237
+ x_to_y : res.direction,
238
+ pair : LiquidityPool.parsePoolsFromServerData2(res.pair, token_x, token_y, res.direction)
239
+ }
240
+ }else if (res.type === 'RouterSWAP'){
241
+ if(res.bridge_token === 'STX'){
242
+ return {
243
+ valid : SwapType.ROUTER_STX,
244
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
245
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
246
+ router_from_mode : res.from_direction,
247
+ router_to_mode : res.to_direction
248
+ }
249
+
250
+ }else if(res.bridge_token === 'STSW') {
251
+ return{
252
+ valid : SwapType.ROUTER_STSW,
253
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
254
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
255
+ router_from_mode : res.from_direction,
256
+ router_to_mode : res.to_direction
257
+ }
258
+ } else{
259
+ return {valid : SwapType.NO_ROUTE}
260
+ }
261
+ } else {
262
+ return {valid : SwapType.NO_ROUTE}
263
+ }
264
+ }
265
+
266
+ async findRouter(token_x : Token, token_y : Token, current_block: number) : Promise<{ valid: SwapType, [key: string]: any}> {
267
+ const url = this.stackswap.config.STACKS_BACKEND_URL() + '/api/v1/swap/' + token_x.addr +'/'+token_y.addr + '/' + current_block;
268
+ const result = await axios.get ( url,
269
+ {timeout: 50000,});
270
+ // // console.log('swap router : ', value)
271
+ const res = result.data;
272
+ if(Object.keys(res).length === 0){
273
+ return {valid : SwapType.NO_ROUTE}
274
+ }else if(res.type === 'SWAP'){
275
+ return{
276
+ valid : SwapType.SINGLE,
277
+ x_to_y : res.direction,
278
+ pair : LiquidityPool.parsePoolsFromServerData2(res.pair, token_x, token_y, res.direction)
279
+ }
280
+ }else if (res.type === 'RouterSWAP'){
281
+ if(res.bridge_token === 'STX'){
282
+ return {
283
+ valid : SwapType.ROUTER_STX,
284
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STX), res.from_direction),
285
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STX), token_y, res.to_direction),
286
+ router_from_mode : res.from_direction,
287
+ router_to_mode : res.to_direction
288
+ }
289
+
290
+ }else if(res.bridge_token === 'STSW') {
291
+ return{
292
+ valid : SwapType.ROUTER_STSW,
293
+ router_from_pair : LiquidityPool.parsePoolsFromServerData2(res.from_pair, token_x, Token.getBaseTokens(this.stackswap, BaseToken.STSW), res.from_direction),
294
+ router_to_pair : LiquidityPool.parsePoolsFromServerData2(res.to_pair, Token.getBaseTokens(this.stackswap, BaseToken.STSW), token_y, res.to_direction),
295
+ router_from_mode : res.from_direction,
296
+ router_to_mode : res.to_direction
297
+ }
298
+ } else{
299
+ return {valid : SwapType.NO_ROUTE}
300
+ }
301
+ } else {
302
+ return {valid : SwapType.NO_ROUTE}
303
+ }
304
+ }
305
+
306
+ 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) {
307
+
308
+ const token_from = router_from_mode ? pair_from.token_x : pair_from.token_y;
309
+ const token_bridge1 = router_from_mode ? pair_from.token_y : pair_from.token_x;
310
+ const token_bridge2 = router_to_mode ? pair_to.token_x : pair_to.token_y;
311
+ const token_to = router_to_mode ? pair_to.token_y: pair_to.token_x;
312
+
313
+ const from_amt = new BigNumber(10 ** token_from.decimal).multipliedBy(token_from_amount).integerValue();
314
+ const bridge1_amt = new BigNumber(10 ** token_bridge1.decimal).multipliedBy(token_bridge1_amount).integerValue();
315
+ const bridge2_amt = new BigNumber(10 ** token_bridge2.decimal).multipliedBy(token_bridge2_amount).integerValue();
316
+ const to_amt = new BigNumber(10 ** token_to.decimal).multipliedBy(token_to_amount).integerValue();
317
+
318
+ const bridge1_min = bridge1_amt.multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
319
+ const bridge1_max = bridge1_amt.multipliedBy((100 + tolerance)).dividedBy(100).integerValue();
320
+ const bridge2_min = bridge2_amt.multipliedBy((100 - tolerance)).dividedBy(100).multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
321
+ const bridge2_max = bridge2_amt.multipliedBy((100 + tolerance)).dividedBy(100).multipliedBy((100 + tolerance)).dividedBy(100).integerValue();
322
+ const to_min = to_amt.multipliedBy((100 - tolerance)).dividedBy(100).multipliedBy((100 - tolerance)).dividedBy(100).multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
323
+
324
+ const token_from_addr = (token_from.addr);
325
+ const token_bridge1_addr = (token_bridge1.addr);
326
+ const token_bridge2_addr = (token_bridge2.addr);
327
+ const token_to_addr = (token_to.addr);
328
+
329
+ const pair_from_addr = pair_from.token_lp.addr;
330
+ const pair_bridge_addr = pair_bridge.token_lp.addr;
331
+ const pair_to_addr = pair_to.token_lp.addr;
332
+
333
+ const from_mode = router_from_mode ? trueCV() : falseCV();
334
+ const bridge_mode = router_bridge_mode ? trueCV() : falseCV();
335
+ const to_mode = router_to_mode ? trueCV() : falseCV();
336
+
337
+ const post_condition = [];
338
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_from.addr, from_amt.toString(), FungibleConditionCode.Equal));
339
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_from_addr, token_bridge1.addr, bridge1_min.toString(), FungibleConditionCode.GreaterEqual));
340
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_bridge1.addr, bridge1_max.toString(), FungibleConditionCode.LessEqual));
341
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_bridge_addr, token_bridge2.addr, bridge2_min.toString(), FungibleConditionCode.GreaterEqual));
342
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_bridge2.addr, bridge2_max.toString(), FungibleConditionCode.LessEqual));
343
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_to_addr, token_to.addr, to_min.toString(), FungibleConditionCode.GreaterEqual));
344
+
345
+ const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_ROUTER_SWAP2(), 'exchange-router2', [
346
+ parseAddressToCV(token_from_addr),
347
+ parseAddressToCV(token_bridge1_addr),
348
+ parseAddressToCV(token_bridge2_addr),
349
+ parseAddressToCV(token_to_addr),
350
+ parseAddressToCV(pair_from_addr),
351
+ parseAddressToCV(pair_bridge_addr),
352
+ parseAddressToCV(pair_to_addr),
353
+ from_mode,
354
+ bridge_mode,
355
+ to_mode,
356
+ uintCV(from_amt.toString()),
357
+ uintCV(bridge1_min.toString()),
358
+ uintCV(bridge2_min.toString()),
359
+ uintCV(to_min.toString()),
360
+ parseAddressToCV(this.stackswap.getSenderAddress()),
361
+ ], post_condition, callback);
362
+ openContractCall(options);
363
+ }
364
+
365
+ 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) {
366
+
367
+ const token_from = router_from_mode ? pair_from.token_x : pair_from.token_y;
368
+ const token_bridge = router_from_mode ? pair_from.token_y : pair_from.token_x;
369
+ const token_to = router_to_mode ? pair_to.token_y: pair_to.token_x;
370
+
371
+ const from_amt = new BigNumber(10 ** token_from.decimal).multipliedBy(token_from_amount).integerValue();
372
+ const bridge_amt = new BigNumber(10 ** token_bridge.decimal).multipliedBy(token_bridge_amount).integerValue();
373
+ const to_amt = new BigNumber(10 ** token_to.decimal).multipliedBy(token_to_amount).integerValue();
374
+
375
+ const bridge_min = bridge_amt.multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
376
+ const bridge_max = bridge_amt.multipliedBy((100 + tolerance)).dividedBy(100).integerValue();
377
+ const to_min = to_amt.multipliedBy((100 - tolerance)).dividedBy(100).multipliedBy((100 - tolerance)).dividedBy(100).integerValue();
378
+
379
+ const token_from_addr = (token_from.addr);
380
+ const token_bridge_addr = (token_bridge.addr);
381
+ const token_to_addr = (token_to.addr);
382
+
383
+ const pair_from_addr = pair_from.token_lp.addr;
384
+ const pair_to_addr = pair_to.token_lp.addr;
385
+
386
+ const from_mode = router_from_mode ? trueCV() : falseCV();
387
+ const to_mode = router_to_mode ? trueCV() : falseCV();
388
+
389
+ const post_condition = [];
390
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_from.addr, from_amt.toString(), FungibleConditionCode.Equal));
391
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_from_addr, token_bridge.addr, bridge_min.toString(), FungibleConditionCode.GreaterEqual));
392
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_bridge.addr, bridge_max.toString(), FungibleConditionCode.LessEqual));
393
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, pair_to_addr, token_to.addr, to_min.toString(), FungibleConditionCode.GreaterEqual));
394
+
395
+ const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_ROUTER_SWAP(), 'router-swap', [
396
+ parseAddressToCV(token_from_addr),
397
+ parseAddressToCV(token_bridge_addr),
398
+ parseAddressToCV(token_to_addr),
399
+ parseAddressToCV(pair_from_addr),
400
+ parseAddressToCV(pair_to_addr),
401
+ from_mode,
402
+ to_mode,
403
+ uintCV(from_amt.toString()),
404
+ uintCV(bridge_min.toString()),
405
+ uintCV(to_min.toString())
406
+ ], post_condition, callback);
407
+ openContractCall(options);
408
+ }
409
+
410
+ async swapContractCall(token_x_amount: string, token_y_amount: string, pair: LiquidityPool, x_to_y: boolean, tolerance: number, callback: any = null) {
411
+ const token_x = x_to_y ? pair.token_x : pair.token_y;
412
+ const token_y = x_to_y ? pair.token_y : pair.token_x;
413
+ const dx_bn = new BigNumber(10 ** token_x.decimal).multipliedBy(token_x_amount);
414
+ const dy_min_bn = new BigNumber(10 ** token_y.decimal).multipliedBy(token_y_amount).multipliedBy(100 - tolerance).dividedBy(100);
415
+ const dx = dx_bn.toFixed(0).toString();
416
+ const dy_min = dy_min_bn.toFixed(0).toString();
417
+
418
+ const functionName = x_to_y ? 'swap-x-for-y' : 'swap-y-for-x';
419
+ const token_x_addr = x_to_y ? (token_x.addr) : (token_y.addr);
420
+ const token_y_addr = x_to_y ? (token_y.addr) : (token_x.addr);
421
+ const post_condition = [];
422
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_x.addr, dx, FungibleConditionCode.Equal));
423
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, pair.token_lp.addr, token_y.addr, dy_min, FungibleConditionCode.GreaterEqual));
424
+ // // console.log(post_condition);
425
+ const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_SWAP(), functionName, [
426
+ parseAddressToCV(token_x_addr), parseAddressToCV(token_y_addr),
427
+ parseAddressToCV(pair.token_lp.addr), uintCV(dx), uintCV(dy_min) ], post_condition, callback);
428
+ openContractCall(options);
429
+ }
430
+
431
+ async importContractCall(pair: LiquidityPool, x_to_y: boolean, amount_x : string, amount_y : string, callback: any = null) {
432
+ const token_x = x_to_y ? pair.token_x : pair.token_y;
433
+ const token_y = x_to_y ? pair.token_y : pair.token_x;
434
+ const dx_temp = new BigNumber(10 ** token_x.decimal).multipliedBy(amount_x);
435
+ const dy_temp = new BigNumber(10 ** token_y.decimal).multipliedBy(amount_y) ;
436
+
437
+ // // console.log(dx_temp.toNumber(), dy_temp.toNumber())
438
+ const dx = x_to_y ? dx_temp : dy_temp;
439
+ const dy = x_to_y ? dy_temp : dx_temp ;
440
+
441
+ const dx_out = dx_temp.multipliedBy(1.2).toFixed(0).toString();
442
+ const dy_out = dy_temp.multipliedBy(1.2).toFixed(0).toString();
443
+ // // console.log(dx_out, dy_out)
444
+
445
+ const token_x_addr = x_to_y ? (token_x.addr) : (token_y.addr);
446
+ const token_y_addr = x_to_y ? (token_y.addr) : (token_x.addr);
447
+ const post_condition = [];
448
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_x.addr, dx_out, FungibleConditionCode.LessEqual));
449
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_y.addr, dy_out, FungibleConditionCode.LessEqual));
450
+ const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_SWAP(), 'add-to-position', [
451
+ parseAddressToCV(token_x_addr), parseAddressToCV(token_y_addr),
452
+ parseAddressToCV(pair.token_lp.addr), uintCV(dx.toFixed(0).toString()), uintCV(dy.toFixed(0).toString()) ], post_condition, callback);
453
+ openContractCall(options);
454
+ }
455
+
456
+ async removeContractCall( pair: LiquidityPool, percent: number, user_lp_total: string, dx: any, dy: any, swap_contract: string = this.stackswap.config.CONTRACT_NAME_STACKSWAP_SWAP(), callback: any = null) {
457
+ const token_x_addr = pair.token_x.addr;
458
+ const token_y_addr = pair.token_y.addr;
459
+ const pair_addr = pair.token_lp.addr;
460
+ const post_condition = [];
461
+ const burn_amount = new BigNumber(user_lp_total).multipliedBy(percent * 1.01).div(100).toFixed(0).toString();
462
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, pair.token_lp.addr, pair.token_x.addr, dx, FungibleConditionCode.GreaterEqual));
463
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, pair.token_lp.addr, pair.token_y.addr, dy, FungibleConditionCode.GreaterEqual));
464
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), pair.token_lp.addr, burn_amount, FungibleConditionCode.LessEqual));
465
+ const options = getWriteOptions(this.stackswap, swap_contract, 'reduce-position', [
466
+ parseAddressToCV(token_x_addr), parseAddressToCV(token_y_addr),
467
+ parseAddressToCV(pair_addr), uintCV(percent),
468
+ ], post_condition, callback);
469
+ openContractCall(options);
470
+ }
471
+
472
+ async createContractCall(token_x: Token, token_y: Token, token_x_amount: string, token_y_amount: string, liquidity_token_addr: any, callback: any = null) {
473
+ const token_x_addr = token_x.addr;
474
+ const token_y_addr = token_y.addr;
475
+ const pair_addr = liquidity_token_addr;
476
+ const post_condition = [];
477
+ const amount_X = decimal2integer(token_x_amount, token_x.decimal);
478
+ const amount_Y = decimal2integer(token_y_amount, token_y.decimal);
479
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_x.addr, amount_X, FungibleConditionCode.Equal));
480
+ post_condition.push(await getPostConditionFromAsset(this.stackswap, this.stackswap.getSenderAddress(), token_y.addr, amount_Y, FungibleConditionCode.Equal));
481
+ const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_ONE_STEP_MINT(), 'create-pair-new-liquidity-token', [
482
+ parseAddressToCV(token_x_addr), parseAddressToCV(token_y_addr),
483
+ parseAddressToCV(pair_addr), stringAsciiCV(token_x.symbol + '-' + token_y.symbol),
484
+ uintCV(amount_X), uintCV(amount_Y), parseAddressToCV(pair_addr),
485
+ parseAddressToCV(this.stackswap.getQualifiedAddress(this.stackswap.config.CONTRACT_NAME_STACKSWAP_SWAP())),
486
+ ], post_condition, callback);
487
+ openContractCall(options);
488
+ }
489
+
490
+ price_impact(x_to_y: boolean, pair: LiquidityPool, token_x_amount: string) {
491
+ // // console.log('price impact');
492
+ // (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
493
+ // dy = balancey * dx / balancex + dx
494
+ try {
495
+ const balance_x = x_to_y ? pair.balance_x : pair.balance_y;
496
+ const token_x_decimal: number = x_to_y ? pair.token_x.decimal : pair.token_y.decimal;
497
+ // // console.log('balance_x',balance_x, typeof(balance_x));
498
+
499
+ const balance_y = x_to_y ? pair.balance_y : pair.balance_y;
500
+ // // console.log('balance_y',balance_y);
501
+ const dx = new BigNumber(token_x_amount).multipliedBy(10 ** token_x_decimal);
502
+ // // console.log('dx',dx.toString(), typeof(dx));
503
+ if (dx.toNumber() > new BigNumber(balance_x).toNumber()) {
504
+ // // console.log('dx is bigger than dy');
505
+ return 100;
506
+ }
507
+ const dy_1 = new BigNumber(balance_y).multipliedBy(dx);
508
+ // // console.log('dy_1', dy_1.toString());
509
+ const dy_2 = new BigNumber(balance_x).plus(dx);
510
+ // // console.log('dy_2', dy_2.toString());
511
+ const dy = (dy_1.toNumber()) / (dy_2.toNumber());
512
+ // // console.log('dy',dy.toString());
513
+ const input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(balance_x)).dividedBy(new BigNumber(balance_y));
514
+ // // console.log('input_price',input_price.toString());
515
+ const output_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(balance_x)).plus(dx).dividedBy(new BigNumber(balance_y).minus(dy));
516
+ // // console.log('output_price',output_price.toString());
517
+ const price_impact2 = output_price.minus(input_price).multipliedBy(10000).dividedBy(input_price);
518
+ // // console.log('price_impact2',price_impact2.toString());
519
+ let price_impact = price_impact2.toNumber();
520
+ if (price_impact >= 10000) {
521
+ price_impact = 9999;
522
+ }
523
+ // // console.log('price impact : ', (price_impact/100))
524
+ return (price_impact / 100).toFixed(5);
525
+ } catch (e) {
526
+ // // console.log(e);
527
+ return 0;
528
+ }
529
+ }
530
+
531
+
532
+ price_impact_router(router_from_mode: boolean, router_to_mode: boolean,
533
+ pair_from:LiquidityPool, pair_to:LiquidityPool , token_from_amount: string) {
534
+ // // console.log('price impact');
535
+ // (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
536
+ // dy = balancey * dx / balancex + dx
537
+ try {
538
+ const from_input_balance = router_from_mode ? pair_from.balance_x : pair_from.balance_y;
539
+ const from_input_decimal = router_from_mode ? pair_from.token_x.decimal : pair_from.token_y.decimal;
540
+ const from_output_balance= router_from_mode ? pair_from.balance_y : pair_from.balance_y;
541
+
542
+ const from_input_dx = new BigNumber(token_from_amount).multipliedBy(10 ** from_input_decimal);
543
+ if (from_input_dx.toNumber() > new BigNumber(from_input_balance).toNumber()) {
544
+ return 100;
545
+ }
546
+ const from_dy_1 = new BigNumber(from_output_balance).multipliedBy(from_input_dx);
547
+ const from_dy_2 = new BigNumber(from_input_balance).plus(from_input_dx);
548
+ const from_dy = (from_dy_1.toNumber()) / (from_dy_2.toNumber());
549
+
550
+ const from_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(from_input_balance)).dividedBy(new BigNumber(from_output_balance));
551
+ 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));
552
+ const from_price_impact = from_output_price.minus(from_input_price).multipliedBy(10000).dividedBy(from_input_price);
553
+
554
+ // console.log("FROM : ", token_from_amount, from_dy, from_price_impact.toNumber())
555
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
556
+ const to_input_balance = router_to_mode ? pair_to.balance_x : pair_to.balance_y;
557
+ const to_input_decimal = router_to_mode ? pair_to.token_x.decimal : pair_to.token_y.decimal;
558
+ const to_output_balance= router_to_mode ? pair_to.balance_y : pair_to.balance_y;
559
+
560
+ const to_input_dx = new BigNumber(from_dy).multipliedBy(10 ** to_input_decimal);
561
+ if (to_input_dx.toNumber() > new BigNumber(to_input_balance).toNumber()) {
562
+ return 100;
563
+ }
564
+ const to_dy_1 = new BigNumber(to_output_balance).multipliedBy(to_input_dx);
565
+ const to_dy_2 = new BigNumber(to_input_balance).plus(to_input_dx);
566
+ const to_dy = (to_dy_1.toNumber()) / (to_dy_2.toNumber());
567
+
568
+ const to_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(to_input_balance)).dividedBy(new BigNumber(to_output_balance));
569
+ 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));
570
+ const to_price_impact = to_output_price.minus(to_input_price).multipliedBy(10000).dividedBy(to_input_price);
571
+
572
+ // // console.log("TO : ", bridge_dy, to_dy, to_price_impact.toNumber())
573
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
574
+ let price_impact = from_price_impact.toNumber() * to_price_impact.toNumber();
575
+ if (price_impact >= 10000) {
576
+ price_impact = 9999;
577
+ }
578
+ // console.log("TOTAL : ", price_impact)
579
+ return (price_impact / 100).toFixed(5);
580
+ } catch (e) {
581
+ // // console.log(e);
582
+ return 0;
583
+ }
584
+ }
585
+
586
+ price_impact_router2(router_from_mode: boolean, router_bridge_mode: boolean, router_to_mode: boolean,
587
+ pair_from:LiquidityPool, pair_bridge:LiquidityPool, pair_to:LiquidityPool , token_from_amount:string) {
588
+ // // console.log('price impact');
589
+ // (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
590
+ // dy = balancey * dx / balancex + dx
591
+ try {
592
+ const from_input_balance = router_from_mode ? pair_from.balance_x : pair_from.balance_y;
593
+ const from_input_decimal = router_from_mode ? pair_from.token_x.decimal : pair_from.token_y.decimal;
594
+ const from_output_balance= router_from_mode ? pair_from.balance_y : pair_from.balance_y;
595
+ const from_input_dx = new BigNumber(token_from_amount).multipliedBy(10 ** from_input_decimal);
596
+ if (from_input_dx.toNumber() > new BigNumber(from_input_balance).toNumber()) {
597
+ return 100;
598
+ }
599
+ const from_dy_1 = new BigNumber(from_output_balance).multipliedBy(from_input_dx);
600
+ const from_dy_2 = new BigNumber(from_input_balance).plus(from_input_dx);
601
+ const from_dy = (from_dy_1.toNumber()) / (from_dy_2.toNumber());
602
+
603
+ const from_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(from_input_balance)).dividedBy(new BigNumber(from_output_balance));
604
+ 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));
605
+ const from_price_impact = from_output_price.minus(from_input_price).multipliedBy(10000).dividedBy(from_input_price);
606
+
607
+ // console.log("FROM : ", token_from_amount, from_dy, from_price_impact.toNumber())
608
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
609
+ const bridge_input_balance = router_bridge_mode ? pair_bridge.balance_x : pair_bridge.balance_y;
610
+ const bridge_input_decimal = router_bridge_mode ? pair_bridge.token_x.decimal : pair_bridge.token_y.decimal;
611
+ const bridge_output_balance= router_bridge_mode ? pair_bridge.balance_y : pair_bridge.balance_y;
612
+
613
+ const bridge_input_dx = new BigNumber(from_dy).multipliedBy(10 ** bridge_input_decimal);
614
+ if (bridge_input_dx.toNumber() > new BigNumber(bridge_input_balance).toNumber()) {
615
+ return 100;
616
+ }
617
+ const bridge_dy_1 = new BigNumber(bridge_output_balance).multipliedBy(bridge_input_dx);
618
+ const bridge_dy_2 = new BigNumber(bridge_input_balance).plus(bridge_input_dx);
619
+ const bridge_dy = (bridge_dy_1.toNumber()) / (bridge_dy_2.toNumber());
620
+
621
+ const bridge_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(bridge_input_balance)).dividedBy(new BigNumber(bridge_output_balance));
622
+ 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));
623
+ const bridge_price_impact = bridge_output_price.minus(bridge_input_price).multipliedBy(10000).dividedBy(bridge_input_price);
624
+
625
+ // console.log("BRIDGE : ", from_dy, bridge_dy, bridge_price_impact.toNumber())
626
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
627
+ const to_input_balance = router_to_mode ? pair_to.balance_x : pair_to.balance_y;
628
+ const to_input_decimal = router_to_mode ? pair_to.token_x.decimal : pair_to.token_y.decimal;
629
+ const to_output_balance= router_to_mode ? pair_to.balance_y : pair_to.balance_y;
630
+
631
+ const to_input_dx = new BigNumber(bridge_dy).multipliedBy(10 ** to_input_decimal);
632
+ if (to_input_dx.toNumber() > new BigNumber(to_input_balance).toNumber()) {
633
+ return 100;
634
+ }
635
+ const to_dy_1 = new BigNumber(to_output_balance).multipliedBy(to_input_dx);
636
+ const to_dy_2 = new BigNumber(to_input_balance).plus(to_input_dx);
637
+ const to_dy = (to_dy_1.toNumber()) / (to_dy_2.toNumber());
638
+
639
+ const to_input_price = new BigNumber(10 ** 10).multipliedBy(new BigNumber(to_input_balance)).dividedBy(new BigNumber(to_output_balance));
640
+ 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));
641
+ const to_price_impact = to_output_price.minus(to_input_price).multipliedBy(10000).dividedBy(to_input_price);
642
+
643
+ // console.log("TO : ", bridge_dy, to_dy, to_price_impact.toNumber())
644
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
645
+ let price_impact = from_price_impact.toNumber() * bridge_price_impact.toNumber() * to_price_impact.toNumber();
646
+ if (price_impact >= 10000) {
647
+ price_impact = 9999;
648
+ }
649
+ // console.log("TOTAL : ", price_impact)
650
+ return (price_impact / 100).toFixed(5);
651
+ } catch (e) {
652
+ // // console.log(e);
653
+ return 0;
654
+ }
655
+ }
656
+ getPriceString(pair : LiquidityPool | null, token_x : Token| null, token_y : Token| null, price : number, price_invert : boolean) {
657
+ try {
658
+ if (price < 0){
659
+ pair;
660
+ return 'dx exceed pool balance';
661
+ } else if(token_x != null && token_y != null) {
662
+ if (price_invert) {
663
+ return ` 1 ${token_y.symbol} = ${new BigNumber((1 / price)).toFixed(token_x.decimal)} ${token_x.symbol}`;
664
+ } else {
665
+ return ` 1 ${token_x.symbol} = ${new BigNumber(price).toFixed(token_y.decimal)} ${token_y.symbol}`;
666
+ }
667
+ }
668
+ return '';
669
+ } catch (e) {
670
+ return '';
671
+ }
672
+
673
+ }
674
+
675
+ getPricesWithSwapData(swap_data : { valid: SwapType, [key: string]: any}, token_x_amount : string, price_invert:boolean)
676
+ : {price : number, dy: string, price_strings: string , [key:string] : any}{
677
+ let price = -1;
678
+
679
+ switch (swap_data.valid) {
680
+ case SwapType.SINGLE:
681
+ try{
682
+ const temp = swap_data.pair.getPoolPrice(!swap_data.x_to_y, Number(token_x_amount) <= 0 || token_x_amount == '' ? '-1': token_x_amount);
683
+ if ( temp.output_price !== '0'){
684
+ price = ( 1 / parseFloat( temp.output_price));
685
+ }
686
+ const price_strings = this.getPriceString(swap_data.pair, swap_data.pair.getTokenX(swap_data.x_to_y), swap_data.pair.getTokenY(swap_data.x_to_y), price, price_invert);
687
+ const token_y_amount = new BigNumber(temp.dy).toFixed(Number(swap_data.pair.getTokenY(swap_data.x_to_y).decimal)).toString();
688
+ return {price : price, dy: token_y_amount, price_strings: price_strings};
689
+ } catch (e) {
690
+ return {price : price, dy: '0', price_strings: ''};
691
+ }
692
+
693
+ case SwapType.ROUTER_STX:
694
+ return this.getRouterDY_V1(swap_data, token_x_amount,
695
+ Token.getBaseTokens(this.stackswap, BaseToken.STX), price_invert);
696
+
697
+ case SwapType.ROUTER_STSW:
698
+ return this.getRouterDY_V1(swap_data, token_x_amount,
699
+ Token.getBaseTokens(this.stackswap, BaseToken.STSW), price_invert);
700
+
701
+ case SwapType.ROUTER_STX_STSW:
702
+ return this.getRouterDY_V2(swap_data, token_x_amount,
703
+ Token.getBaseTokens(this.stackswap, BaseToken.STX),
704
+ Token.getBaseTokens(this.stackswap, BaseToken.STSW), price_invert);
705
+
706
+ case SwapType.ROUTER_STSW_STX:
707
+ return this.getRouterDY_V2(swap_data, token_x_amount,
708
+ Token.getBaseTokens(this.stackswap, BaseToken.STSW),
709
+ Token.getBaseTokens(this.stackswap, BaseToken.STX), price_invert);
710
+
711
+ default:
712
+ return {price : price, dy: '0', price_strings: ''};
713
+ }
714
+
715
+ }
716
+
717
+
718
+ calcParamsFromSwapData(swap_data : { valid: SwapType, [key: string]: any}, token_x_amount : string, price_invert:boolean, slippage_tolerance: number)
719
+ : {price : number, dy: string, price_strings: string , price_impact: number| string, min_dy: number, [key:string] : any} | null{
720
+
721
+ if (!swap_data) return null;
722
+
723
+ const dy_and_price = this.stackswap.swapManager.getPricesWithSwapData(
724
+ swap_data,
725
+ token_x_amount,
726
+ price_invert
727
+ );
728
+
729
+
730
+ // console.log(swap_data);
731
+ // alert(JSON.stringify(swap_data));
732
+ // const price = temp.price;
733
+
734
+ let temp_price_impact = 0;
735
+ if (
736
+ swap_data.valid === SwapType.ROUTER_STSW ||
737
+ swap_data.valid === SwapType.ROUTER_STX
738
+ ) {
739
+ temp_price_impact = Math.max(
740
+ Number(
741
+ this.stackswap.swapManager.price_impact(
742
+ swap_data.router_from_mode,
743
+ swap_data.router_from_pair,
744
+ token_x_amount
745
+ )
746
+ ),
747
+ Number(
748
+ this.stackswap.swapManager.price_impact(
749
+ swap_data.router_to_mode,
750
+ swap_data.router_to_pair,
751
+ dy_and_price.bridge_amount.toString()
752
+ )
753
+ )
754
+ );
755
+ //console.log('router : ', temp_price_impact, typeof(temp_price_impact))
756
+ } else if (
757
+ swap_data.valid === SwapType.ROUTER_STSW_STX ||
758
+ swap_data.valid === SwapType.ROUTER_STX_STSW
759
+ ) {
760
+ temp_price_impact = Math.max(
761
+ Number(
762
+ this.stackswap.swapManager.price_impact(
763
+ swap_data.router_from_mode,
764
+ swap_data.router_from_pair,
765
+ token_x_amount
766
+ )
767
+ ),
768
+ Number(
769
+ this.stackswap.swapManager.price_impact(
770
+ swap_data.router_bridge_mode,
771
+ swap_data.router_bridge_pair,
772
+ dy_and_price.bridge_amount1.toString()
773
+ )
774
+ ),
775
+ Number(
776
+ this.stackswap.swapManager.price_impact(
777
+ swap_data.router_to_mode,
778
+ swap_data.router_to_pair,
779
+ dy_and_price.bridge_amount2.toString()
780
+ )
781
+ )
782
+ );
783
+ //console.log('router : ', temp_price_impact, typeof(temp_price_impact))
784
+ } else if (swap_data.valid === SwapType.SINGLE) {
785
+ temp_price_impact = Number(
786
+ this.stackswap.swapManager.price_impact(
787
+ swap_data.x_to_y,
788
+ swap_data.pair,
789
+ token_x_amount
790
+ )
791
+ );
792
+ //console.log(temp_price_impact, typeof(temp_price_impact))
793
+ }
794
+
795
+ if (!temp_price_impact) {
796
+ temp_price_impact = 0;
797
+ }
798
+ dy_and_price.price_impact = temp_price_impact;
799
+ dy_and_price.min_dy = new BigNumber(dy_and_price.dy).multipliedBy(100-slippage_tolerance).dividedBy(100).toNumber();
800
+ // @ts-ignore
801
+ return dy_and_price
802
+
803
+ }
804
+
805
+ 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} {
806
+ let price = -1;
807
+ 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);
808
+ let router_from_price = -1;
809
+ if ( from_res.output_price !== '0') {
810
+ router_from_price = (1 / parseFloat(from_res.output_price));
811
+ }
812
+ const router_bridge_amt = new BigNumber(new BigNumber(from_res.dy).toFixed(Number(bridge_token.decimal))).toString();
813
+ const to_res = swap_data.router_to_pair.getPoolPrice(!swap_data.router_to_mode, Number(router_bridge_amt) <= 0 ? '-1': router_bridge_amt);
814
+ let router_to_price = -1;
815
+ if ( to_res.output_price !== '0') {
816
+ router_to_price = (1 / parseFloat(to_res.output_price));
817
+ }
818
+ 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();
819
+ price = router_from_price * router_to_price;
820
+ 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);
821
+ return {price : price, dy: token_y_amount, price_strings: price_strings, bridge_amount : router_bridge_amt};
822
+ }
823
+
824
+ 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} {
825
+ let price = -1;
826
+ 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);
827
+ let router_from_price = -1;
828
+ if ( from_res.output_price !== '0') {
829
+ router_from_price = (1 / parseFloat(from_res.output_price));
830
+ }
831
+ const router_bridge1_amt = new BigNumber(new BigNumber(from_res.dy).toFixed(Number(bridge_token1.decimal))).toString();
832
+
833
+ let router_bridge_price = -1;
834
+ 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);
835
+ if ( bridge_res.output_price !== '0') {
836
+ router_bridge_price = (1 / parseFloat(bridge_res.output_price));
837
+ }
838
+ const router_bridge2_amt = new BigNumber(new BigNumber(bridge_res.dy).toFixed(Number(bridge_token2.decimal))).toString();
839
+
840
+ const to_res = swap_data.router_to_pair.getPoolPrice(!swap_data.router_to_mode, Number(router_bridge2_amt) <= 0 ? '-1': router_bridge2_amt);
841
+ let router_to_price = -1;
842
+ if ( to_res.output_price !== '0') {
843
+ router_to_price = (1 / parseFloat(to_res.output_price));
844
+ }
845
+ 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();
846
+ price = router_from_price * router_to_price * router_bridge_price;
847
+ 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);
848
+ return {price: price, dy: token_y_amount, price_strings: price_strings, bridge_amount1: router_bridge1_amt, bridge_amount2: router_bridge2_amt};
849
+ }
850
+
851
+
852
+ async STX_transfer(receiver:string, fromAmount: string, tx_id: string, callback = null) {
853
+
854
+ // let temp_amt = stxAmount;
855
+ // if(decimal) temp_amt = new BigNumber(stxAmount).multipliedBy(10**6).toFixed(0);
856
+ const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_MULTICHAIN(), 'STX_transfer', [
857
+ parseAddressToCV(receiver),
858
+ uintCV(fromAmount),
859
+ parseAddressToCV(Token.getBaseTokens(this.stackswap,BaseToken.STX).addr),
860
+ parseAddressToCV(Token.getBaseTokens(this.stackswap,BaseToken.STSW).addr),
861
+ parseAddressToCV(this.stackswap.config.STX_STSW_LP()),
862
+ stringAsciiCV(tx_id),], [], callback, true);
863
+ openContractCall(options);
864
+ }
865
+
866
+ async SingleSwap_Token_STX(receiver:string, fromAmount: string, from_token: string, lp_stx_token: string, tx_id: string, callback = null) {
867
+
868
+ // let temp_amt = fromAmount;
869
+ // if(decimal) temp_amt = new BigNumber(fromAmount).multipliedBy(10**6).toFixed(0);
870
+
871
+ const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_MULTICHAIN(), 'SingleSwap_Token_STX', [
872
+ parseAddressToCV(from_token),
873
+ parseAddressToCV(lp_stx_token),
874
+ uintCV(fromAmount),
875
+ parseAddressToCV(receiver),
876
+ parseAddressToCV(Token.getBaseTokens(this.stackswap,BaseToken.STX).addr),
877
+ parseAddressToCV(Token.getBaseTokens(this.stackswap,BaseToken.STSW).addr),
878
+ parseAddressToCV(this.stackswap.config.STX_STSW_LP()),
879
+ stringAsciiCV(tx_id),], [], callback, true);
880
+ openContractCall(options);
881
+ }
882
+
883
+ async Router_Token_STSW_STX(receiver:string, fromAmount: string, from_token: string, lp_stsw_from: string, tx_id:string, callback = null) {
884
+
885
+ // let temp_amt = fromAmount;
886
+ // if(decimal) temp_amt = new BigNumber(fromAmount).multipliedBy(10**6).toFixed(0);
887
+ //
888
+ const options = getWriteOptions(this.stackswap, this.stackswap.config.CONTRACT_NAME_STACKSWAP_MULTICHAIN(), 'Router_Token_STSW_STX', [
889
+ parseAddressToCV(from_token),
890
+ parseAddressToCV(lp_stsw_from),
891
+ uintCV(fromAmount),
892
+ parseAddressToCV(receiver),
893
+ parseAddressToCV(Token.getBaseTokens(this.stackswap,BaseToken.STX).addr),
894
+ parseAddressToCV(Token.getBaseTokens(this.stackswap,BaseToken.STSW).addr),
895
+ parseAddressToCV(this.stackswap.config.STX_STSW_LP()),
896
+ stringAsciiCV(tx_id),], [], callback, true);
897
+ openContractCall(options);
898
+ }
899
+
900
+
901
+
902
+ }