Skip to content

Commit 94f7c24

Browse files
committed
some improvements on univ4 scraper suite.
1 parent 94bbc74 commit 94f7c24

File tree

7 files changed

+65
-427
lines changed

7 files changed

+65
-427
lines changed

cmd/assetCollectionService/go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ module github.com/diadata-org/diadata/assetCollectionService
33
go 1.22
44

55
require (
6-
github.com/diadata-org/diadata v1.4.573
6+
github.com/diadata-org/diadata v1.4.575
77
github.com/sirupsen/logrus v1.9.3
88
)
9-
replace github.com/diadata-org/diadata => /home/philipp/go/src/github.com/diadata-org/diadata
9+
1010
require (
1111
filippo.io/edwards25519 v1.0.0 // indirect
1212
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect

cmd/exchange-scrapers/collector/collector.go

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ var (
4848
dia.BifrostExchange,
4949
dia.HydrationExchange,
5050
dia.UniswapExchangeV3Celo,
51+
dia.UniswapExchangeV4,
5152
}
5253

5354
exchange = flag.String("exchange", "", "which exchange")

cmd/exchange-scrapers/collector/go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ module github.com/diadata-org/diadata/exchange-scrapers/collector
33
go 1.22
44

55
require (
6-
github.com/diadata-org/diadata v1.4.573
6+
github.com/diadata-org/diadata v1.4.575
77
github.com/segmentio/kafka-go v0.4.35
88
github.com/sirupsen/logrus v1.9.3
99
)
10-
replace github.com/diadata-org/diadata => /home/philipp/go/src/github.com/diadata-org/diadata
10+
1111
require (
1212
filippo.io/edwards25519 v1.0.0 // indirect
1313
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect

cmd/liquidityScraper/go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ module github.com/diadata-org/diadata/liquidityScraper
33
go 1.22
44

55
require (
6-
github.com/diadata-org/diadata v1.4.573
6+
github.com/diadata-org/diadata v1.4.575
77
github.com/sirupsen/logrus v1.9.3
88
)
9-
replace github.com/diadata-org/diadata => /home/philipp/go/src/github.com/diadata-org/diadata
9+
1010
require (
1111
filippo.io/edwards25519 v1.0.0 // indirect
1212
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect

pkg/dia/scraper/exchange-scrapers/UniswapV4Scraper.go

+33-101
Original file line numberDiff line numberDiff line change
@@ -52,53 +52,30 @@ type UniswapV4Scraper struct {
5252
exchangeName string
5353
startBlock uint64
5454
waitTime int
55-
listenByAddress bool
5655
chanTrades chan *dia.Trade
5756
factoryContractAddress common.Address
57+
thresholdSlippage float64
5858
}
5959

60-
var (
61-
fullPoolsUniswapV4 *[]string
62-
)
63-
6460
// NewUniswapV4Scraper returns a new UniswapV4Scraper
6561
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)
6864

6965
var (
70-
s *UniswapV4Scraper
71-
listenByAddress bool
72-
err error
66+
s *UniswapV4Scraper
67+
err error
7368
)
7469

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-
8070
switch exchange.Name {
8171
case dia.UniswapExchangeV4:
82-
s = makeUniswapV4Scraper(exchange, listenByAddress, "", "", "200", uint64(12369621))
72+
s = makeUniswapV4Scraper(exchange, "", "", "200", uint64(12369621))
8373

8474
}
8575

8676
s.relDB = relDB
8777
s.poolMap = make(map[[32]byte]dia.Pool)
8878

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-
10279
pingNodeInterval, err := strconv.ParseInt(utils.Getenv("PING_SERVER", "0"), 10, 64)
10380
if err != nil {
10481
log.Error("parse PING_SERVER: ", err)
@@ -114,7 +91,7 @@ func NewUniswapV4Scraper(exchange dia.Exchange, scrape bool, relDB *models.RelDB
11491
}
11592

11693
// 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 {
11895
var restClient, wsClient *ethclient.Client
11996
var err error
12097
var s *UniswapV4Scraper
@@ -148,33 +125,22 @@ func makeUniswapV4Scraper(exchange dia.Exchange, listenByAddress bool, restDial
148125
error: nil,
149126
chanTrades: make(chan *dia.Trade),
150127
waitTime: waitTime,
151-
listenByAddress: listenByAddress,
152128
startBlock: startBlock,
153129
factoryContractAddress: common.HexToAddress(exchange.Contract),
154130
}
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+
155138
return s
156139
}
157140

158141
// runs in a goroutine until s is closed
159142
func (s *UniswapV4Scraper) mainLoop() {
160143

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-
178144
time.Sleep(4 * time.Second)
179145
s.run = true
180146

@@ -193,12 +159,19 @@ func (s *UniswapV4Scraper) mainLoop() {
193159
rawSwap, ok := <-sink
194160
if ok {
195161

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+
197165
swap, err := s.normalizeRawSwap(rawSwap)
198166
if err != nil {
199167
log.Error("normalizeRawSwap: ", err)
200168
continue
201169
}
170+
if slippage > s.thresholdSlippage {
171+
log.Warn("slippage above threshold: ", slippage)
172+
continue
173+
}
174+
202175
s.sendTrade(swap, hex.EncodeToString(rawSwap.Id[:]))
203176

204177
}
@@ -238,30 +211,6 @@ func (s *UniswapV4Scraper) sendTrade(swap UniswapV4Swap, poolID string) {
238211
VerifiedPair: true,
239212
}
240213

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-
265214
if price > 0 {
266215
log.Infof("Got trade on pair %s: %v", t.Pair, t)
267216
log.Info("------")
@@ -281,44 +230,25 @@ func (s *UniswapV4Scraper) normalizeRawSwap(rawSwap *uniswapcontractv4.Poolmanag
281230
pool, ok := s.poolMap[rawSwap.Id]
282231
if !ok {
283232
pool, err = s.relDB.GetPoolByAddress(dia.ETHEREUM, hex.EncodeToString(rawSwap.Id[:]))
284-
if err != nil || len(pool.Assetvolumes) != 2 {
233+
if err != nil {
285234
return
286235
}
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
289239
}
240+
s.poolMap[rawSwap.Id] = pool
290241
}
291242

292243
asset0 := pool.Assetvolumes[pool.Assetvolumes[0].Index].Asset
293244
asset1 := pool.Assetvolumes[pool.Assetvolumes[1].Index].Asset
294-
log.Infof("%s-%s", asset0.Symbol, asset1.Symbol)
295245
decimals0 := int(asset0.Decimals)
296246
decimals1 := int(asset1.Decimals)
297247
amount0Big := new(big.Float).Quo(big.NewFloat(0).SetInt(rawSwap.Amount0), new(big.Float).SetFloat64(math.Pow10(decimals0)))
298248
amount1Big := new(big.Float).Quo(big.NewFloat(0).SetInt(rawSwap.Amount1), new(big.Float).SetFloat64(math.Pow10(decimals1)))
299249
amount0, _ := amount0Big.Float64()
300250
amount1, _ := amount1Big.Float64()
301251

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-
322252
normalizedSwap = UniswapV4Swap{
323253
ID: rawSwap.Raw.TxHash.Hex(),
324254
Timestamp: time.Now().Unix(),
@@ -424,22 +354,24 @@ func (ps *UniswapPairV4Scraper) Pair() dia.ExchangePair {
424354
return ps.pair
425355
}
426356

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) {
428358

429359
price := new(big.Float).Quo(big.NewFloat(0).SetInt(sqrtPriceX96), new(big.Float).SetFloat64(math.Pow(2, 96)))
430360

431361
if amount0.Sign() < 0 {
432362
// token0 -> token1
433363
amount0Abs := big.NewInt(0).Abs(amount0)
434364
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
436367
} else if amount1.Sign() < 0 {
437368
// token1 -> token0
438369
numerator := big.NewFloat(0).SetInt(big.NewInt(0).Abs(amount1))
439370
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
441373
}
442374
log.Infof("sqrtPrice -- amount0 -- amount1 -- liquidity: %s -- %s -- %s -- %s", sqrtPriceX96.String(), amount0.String(), amount1.String(), liquidity.String())
443-
return nil
375+
return 0
444376

445377
}

0 commit comments

Comments
 (0)