@@ -52,53 +52,30 @@ type UniswapV4Scraper struct {
52
52
exchangeName string
53
53
startBlock uint64
54
54
waitTime int
55
- listenByAddress bool
56
55
chanTrades chan * dia.Trade
57
56
factoryContractAddress common.Address
57
+ thresholdSlippage float64
58
58
}
59
59
60
- var (
61
- fullPoolsUniswapV4 * []string
62
- )
63
-
64
60
// NewUniswapV4Scraper returns a new UniswapV4Scraper
65
61
func NewUniswapV4Scraper (exchange dia.Exchange , scrape bool , relDB * models.RelDB ) * UniswapV4Scraper {
66
- log .Info ("NewUniswapScraper " , exchange .Name )
67
- log .Info ("NewUniswapScraper Address " , exchange .Contract )
62
+ log .Info ("NewUniswapV4Scraper " , exchange .Name )
63
+ log .Info ("NewUniswapV4Scraper Address " , exchange .Contract )
68
64
69
65
var (
70
- s * UniswapV4Scraper
71
- listenByAddress bool
72
- err error
66
+ s * UniswapV4Scraper
67
+ err error
73
68
)
74
69
75
- listenByAddress , err = strconv .ParseBool (utils .Getenv ("LISTEN_BY_ADDRESS" , "false" ))
76
- if err != nil {
77
- log .Fatal ("parse LISTEN_BY_ADDRESS: " , err )
78
- }
79
-
80
70
switch exchange .Name {
81
71
case dia .UniswapExchangeV4 :
82
- s = makeUniswapV4Scraper (exchange , listenByAddress , "" , "" , "200" , uint64 (12369621 ))
72
+ s = makeUniswapV4Scraper (exchange , "" , "" , "200" , uint64 (12369621 ))
83
73
84
74
}
85
75
86
76
s .relDB = relDB
87
77
s .poolMap = make (map [[32 ]byte ]dia.Pool )
88
78
89
- // Only include pools with (minimum) liquidity bigger than given env var.
90
- liquidityThreshold , err := strconv .ParseFloat (utils .Getenv ("LIQUIDITY_THRESHOLD" , "0" ), 64 )
91
- if err != nil {
92
- liquidityThreshold = float64 (0 )
93
- log .Warnf ("parse liquidity threshold: %v. Set to default %v" , err , liquidityThreshold )
94
- }
95
- // Only include pools with (minimum) liquidity USD value bigger than given env var.
96
- liquidityThresholdUSD , err := strconv .ParseFloat (utils .Getenv ("LIQUIDITY_THRESHOLD_USD" , "0" ), 64 )
97
- if err != nil {
98
- liquidityThresholdUSD = float64 (0 )
99
- log .Warnf ("parse liquidity threshold: %v. Set to default %v" , err , liquidityThresholdUSD )
100
- }
101
-
102
79
pingNodeInterval , err := strconv .ParseInt (utils .Getenv ("PING_SERVER" , "0" ), 10 , 64 )
103
80
if err != nil {
104
81
log .Error ("parse PING_SERVER: " , err )
@@ -114,7 +91,7 @@ func NewUniswapV4Scraper(exchange dia.Exchange, scrape bool, relDB *models.RelDB
114
91
}
115
92
116
93
// makeUniswapV4Scraper returns a uniswap scraper as used in NewUniswapV4Scraper.
117
- func makeUniswapV4Scraper (exchange dia.Exchange , listenByAddress bool , restDial string , wsDial string , waitMilliseconds string , startBlock uint64 ) * UniswapV4Scraper {
94
+ func makeUniswapV4Scraper (exchange dia.Exchange , restDial string , wsDial string , waitMilliseconds string , startBlock uint64 ) * UniswapV4Scraper {
118
95
var restClient , wsClient * ethclient.Client
119
96
var err error
120
97
var s * UniswapV4Scraper
@@ -148,33 +125,22 @@ func makeUniswapV4Scraper(exchange dia.Exchange, listenByAddress bool, restDial
148
125
error : nil ,
149
126
chanTrades : make (chan * dia.Trade ),
150
127
waitTime : waitTime ,
151
- listenByAddress : listenByAddress ,
152
128
startBlock : startBlock ,
153
129
factoryContractAddress : common .HexToAddress (exchange .Contract ),
154
130
}
131
+
132
+ s .thresholdSlippage , err = strconv .ParseFloat (utils .Getenv (strings .ToUpper (s .exchangeName )+ "_THRESHOLD_SLIPPAGE" , "0.005" ), 64 )
133
+ if err != nil {
134
+ log .Error ("Parse THRESHOLD_SLIPPAGE: " , err )
135
+ s .thresholdSlippage = 0.001
136
+ }
137
+
155
138
return s
156
139
}
157
140
158
141
// runs in a goroutine until s is closed
159
142
func (s * UniswapV4Scraper ) mainLoop () {
160
143
161
- var err error
162
- reverseBasetokens , err = getReverseTokensFromConfig ("uniswapv4/reverse_tokens/" + s .exchangeName + "Basetoken" )
163
- if err != nil {
164
- log .Error ("error getting basetokens for which pairs should be reversed: " , err )
165
- }
166
- log .Infof ("reverse the following basetokens on %s: %v" , s .exchangeName , reverseBasetokens )
167
- reverseQuotetokens , err = getReverseTokensFromConfig ("uniswapv4/reverse_tokens/" + s .exchangeName + "Quotetoken" )
168
- if err != nil {
169
- log .Error ("error getting quotetokens for which pairs should be reversed: " , err )
170
- }
171
- log .Infof ("reverse the following quotetokens on %s: %v" , s .exchangeName , reverseQuotetokens )
172
- fullPoolsUniswapV4 , err = getReverseTokensFromConfig ("uniswapv4/fullPools/" + s .exchangeName + "FullPools" )
173
- if err != nil {
174
- log .Error ("error getting fullPools for which pairs should be reversed: " , err )
175
- }
176
- log .Infof ("Take into account both directions of a trade on the following pools: %v" , fullPoolsUniswapV4 )
177
-
178
144
time .Sleep (4 * time .Second )
179
145
s .run = true
180
146
@@ -193,12 +159,19 @@ func (s *UniswapV4Scraper) mainLoop() {
193
159
rawSwap , ok := <- sink
194
160
if ok {
195
161
196
- // TO DO: Can we use liquidity field in order to assess admissibility of a trade?
162
+ slippage := computeSlippage (rawSwap .SqrtPriceX96 , rawSwap .Amount0 , rawSwap .Amount1 , rawSwap .Liquidity )
163
+ log .Infof ("slippage: %v" , slippage )
164
+
197
165
swap , err := s .normalizeRawSwap (rawSwap )
198
166
if err != nil {
199
167
log .Error ("normalizeRawSwap: " , err )
200
168
continue
201
169
}
170
+ if slippage > s .thresholdSlippage {
171
+ log .Warn ("slippage above threshold: " , slippage )
172
+ continue
173
+ }
174
+
202
175
s .sendTrade (swap , hex .EncodeToString (rawSwap .Id [:]))
203
176
204
177
}
@@ -238,30 +211,6 @@ func (s *UniswapV4Scraper) sendTrade(swap UniswapV4Swap, poolID string) {
238
211
VerifiedPair : true ,
239
212
}
240
213
241
- // switch {
242
- // case utils.Contains(reverseBasetokens, pool.Token1.Address.Hex()):
243
- // // If we need quotation of a base token, reverse pair
244
- // tSwapped, err := dia.SwapTrade(*t)
245
- // if err == nil {
246
- // t = &tSwapped
247
- // }
248
- // case utils.Contains(reverseQuotetokens, pool.Token0.Address.Hex()):
249
- // // If we need quotation of a base token, reverse pair
250
- // tSwapped, err := dia.SwapTrade(*t)
251
- // if err == nil {
252
- // t = &tSwapped
253
- // }
254
- // }
255
-
256
- // if utils.Contains(fullPoolsUniswapV4, pool.Address.Hex()) {
257
- // tSwapped, err := dia.SwapTrade(*t)
258
- // if err == nil {
259
- // if tSwapped.Price > 0 {
260
- // s.chanTrades <- &tSwapped
261
- // }
262
- // }
263
- // }
264
-
265
214
if price > 0 {
266
215
log .Infof ("Got trade on pair %s: %v" , t .Pair , t )
267
216
log .Info ("------" )
@@ -281,44 +230,25 @@ func (s *UniswapV4Scraper) normalizeRawSwap(rawSwap *uniswapcontractv4.Poolmanag
281
230
pool , ok := s .poolMap [rawSwap .Id ]
282
231
if ! ok {
283
232
pool , err = s .relDB .GetPoolByAddress (dia .ETHEREUM , hex .EncodeToString (rawSwap .Id [:]))
284
- if err != nil || len ( pool . Assetvolumes ) != 2 {
233
+ if err != nil {
285
234
return
286
235
}
287
- if len (pool .Assetvolumes ) == 2 {
288
- s .poolMap [rawSwap .Id ] = pool
236
+ if len (pool .Assetvolumes ) != 2 {
237
+ err = errors .New ("not enough assets in pool" )
238
+ return
289
239
}
240
+ s .poolMap [rawSwap .Id ] = pool
290
241
}
291
242
292
243
asset0 := pool .Assetvolumes [pool .Assetvolumes [0 ].Index ].Asset
293
244
asset1 := pool .Assetvolumes [pool .Assetvolumes [1 ].Index ].Asset
294
- log .Infof ("%s-%s" , asset0 .Symbol , asset1 .Symbol )
295
245
decimals0 := int (asset0 .Decimals )
296
246
decimals1 := int (asset1 .Decimals )
297
247
amount0Big := new (big.Float ).Quo (big .NewFloat (0 ).SetInt (rawSwap .Amount0 ), new (big.Float ).SetFloat64 (math .Pow10 (decimals0 )))
298
248
amount1Big := new (big.Float ).Quo (big .NewFloat (0 ).SetInt (rawSwap .Amount1 ), new (big.Float ).SetFloat64 (math .Pow10 (decimals1 )))
299
249
amount0 , _ := amount0Big .Float64 ()
300
250
amount1 , _ := amount1Big .Float64 ()
301
251
302
- // slippage0, _ := new(big.Float).Quo(amount0Big, big.NewFloat(0).SetInt(rawSwap.Liquidity)).Float64()
303
- // slippage1, _ := new(big.Float).Quo(amount1Big, big.NewFloat(0).SetInt(rawSwap.Liquidity)).Float64()
304
- // normalizedLiquidity, _ := new(big.Float).Quo(big.NewFloat(0).SetInt(rawSwap.Liquidity), new(big.Float).SetFloat64(math.Pow10(18))).Float64()
305
- // log.Infof("slippage0 -- slippage1 -- liquidity: %v -- %v -- %v", slippage0, slippage1, normalizedLiquidity)
306
-
307
- var pairTicker string
308
- if amount0 < 0 {
309
- pairTicker = asset1 .Symbol + "-" + asset0 .Symbol
310
- } else {
311
- pairTicker = asset0 .Symbol + "-" + asset1 .Symbol
312
- }
313
- slippage := computeSlippage (rawSwap .SqrtPriceX96 , rawSwap .Amount0 , rawSwap .Amount1 , rawSwap .Liquidity )
314
- if slippage != nil {
315
- log .Infof (
316
- "%s -- slippage: %s" ,
317
- pairTicker ,
318
- slippage .String (),
319
- )
320
- }
321
-
322
252
normalizedSwap = UniswapV4Swap {
323
253
ID : rawSwap .Raw .TxHash .Hex (),
324
254
Timestamp : time .Now ().Unix (),
@@ -424,22 +354,24 @@ func (ps *UniswapPairV4Scraper) Pair() dia.ExchangePair {
424
354
return ps .pair
425
355
}
426
356
427
- func computeSlippage (sqrtPriceX96 * big.Int , amount0 * big.Int , amount1 * big.Int , liquidity * big.Int ) (slippage * big. Float ) {
357
+ func computeSlippage (sqrtPriceX96 * big.Int , amount0 * big.Int , amount1 * big.Int , liquidity * big.Int ) (slippage float64 ) {
428
358
429
359
price := new (big.Float ).Quo (big .NewFloat (0 ).SetInt (sqrtPriceX96 ), new (big.Float ).SetFloat64 (math .Pow (2 , 96 )))
430
360
431
361
if amount0 .Sign () < 0 {
432
362
// token0 -> token1
433
363
amount0Abs := big .NewInt (0 ).Abs (amount0 )
434
364
numerator := big .NewFloat (0 ).Mul (big .NewFloat (0 ).SetInt (amount0Abs ), price )
435
- return new (big.Float ).Quo (numerator , big .NewFloat (0 ).SetInt (liquidity ))
365
+ slippage , _ = new (big.Float ).Quo (numerator , big .NewFloat (0 ).SetInt (liquidity )).Float64 ()
366
+ return
436
367
} else if amount1 .Sign () < 0 {
437
368
// token1 -> token0
438
369
numerator := big .NewFloat (0 ).SetInt (big .NewInt (0 ).Abs (amount1 ))
439
370
denominator := big .NewFloat (0 ).Mul (big .NewFloat (0 ).SetInt (liquidity ), price )
440
- return new (big.Float ).Quo (numerator , denominator )
371
+ slippage , _ = new (big.Float ).Quo (numerator , denominator ).Float64 ()
372
+ return
441
373
}
442
374
log .Infof ("sqrtPrice -- amount0 -- amount1 -- liquidity: %s -- %s -- %s -- %s" , sqrtPriceX96 .String (), amount0 .String (), amount1 .String (), liquidity .String ())
443
- return nil
375
+ return 0
444
376
445
377
}
0 commit comments