hermez-node/priceupdater/priceupdater_test.go
priceupdater/priceupdater_test.goRaw
1package priceupdater
2
3import (
4 "context"
5 "os"
6 "testing"
7
8 ethCommon "github.com/ethereum/go-ethereum/common"
9 "github.com/hermeznetwork/hermez-node/common"
10 dbUtils "github.com/hermeznetwork/hermez-node/db"
11 "github.com/hermeznetwork/hermez-node/db/historydb"
12 "github.com/hermeznetwork/hermez-node/test"
13 "github.com/stretchr/testify/assert"
14 "github.com/stretchr/testify/require"
15)
16
17var historyDB *historydb.HistoryDB
18
19const usdtAddr = "0xdac17f958d2ee523a2206206994597c13d831ec7"
20
21func TestPriceUpdaterBitfinex(t *testing.T) {
22 // Init DB
23 pass := os.Getenv("POSTGRES_PASS")
24 db, err := dbUtils.InitSQLDB(5432, "localhost", "hermez", pass, "hermez")
25 if err != nil {
26 panic(err)
27 }
28 historyDB = historydb.NewHistoryDB(db, db, nil)
29 // Clean DB
30 test.WipeDB(historyDB.DB())
31 // Populate DB
32 // Gen blocks and add them to DB
33 blocks := test.GenBlocks(1, 2)
34 require.NoError(t, historyDB.AddBlocks(blocks))
35 // Gen tokens and add them to DB
36 tokens := []common.Token{
37 {
38 TokenID: 1,
39 EthBlockNum: blocks[0].Num,
40 EthAddr: ethCommon.HexToAddress("0x1"),
41 Name: "DAI",
42 Symbol: "DAI",
43 Decimals: 18,
44 }, // Used to test get by SC addr
45 {
46 TokenID: 2,
47 EthBlockNum: blocks[0].Num,
48 EthAddr: ethCommon.HexToAddress(usdtAddr),
49 Name: "Tether",
50 Symbol: "USDT",
51 Decimals: 18,
52 }, // Used to test get by token symbol
53 {
54 TokenID: 3,
55 EthBlockNum: blocks[0].Num,
56 EthAddr: ethCommon.HexToAddress("0x2"),
57 Name: "FOO",
58 Symbol: "FOO",
59 Decimals: 18,
60 }, // Used to test ignore
61 {
62 TokenID: 4,
63 EthBlockNum: blocks[0].Num,
64 EthAddr: ethCommon.HexToAddress("0x3"),
65 Name: "BAR",
66 Symbol: "BAR",
67 Decimals: 18,
68 }, // Used to test static
69 {
70 TokenID: 5,
71 EthBlockNum: blocks[0].Num,
72 EthAddr: ethCommon.HexToAddress("0x1f9840a85d5af5bf1d1762f925bdaddc4201f984"),
73 Name: "Uniswap",
74 Symbol: "UNI",
75 Decimals: 18,
76 }, // Used to test default
77 }
78 require.NoError(t, historyDB.AddTokens(tokens)) // ETH token exist in DB by default
79 // Update token price used to test ignore
80 ignoreValue := 44.44
81 require.NoError(t, historyDB.UpdateTokenValue(tokens[2].EthAddr, ignoreValue))
82
83 // Prepare token config
84 staticValue := 0.12345
85 tc := []TokenConfig{
86 // ETH and UNI tokens use default method
87 { // DAI uses SC addr
88 UpdateMethod: UpdateMethodTypeBitFinexV2,
89 Addr: ethCommon.HexToAddress("0x1"),
90 Symbol: "DAI",
91 },
92 { // USDT uses symbol
93 UpdateMethod: UpdateMethodTypeCoingeckoV3,
94 Addr: ethCommon.HexToAddress(usdtAddr),
95 },
96 { // FOO uses ignore
97 UpdateMethod: UpdateMethodTypeIgnore,
98 Addr: ethCommon.HexToAddress("0x2"),
99 },
100 { // BAR uses static
101 UpdateMethod: UpdateMethodTypeStatic,
102 Addr: ethCommon.HexToAddress("0x3"),
103 StaticValue: staticValue,
104 },
105 }
106
107 bitfinexV2URL := "https://api-pub.bitfinex.com/v2/"
108 coingeckoV3URL := "https://api.coingecko.com/api/v3/"
109 // Init price updater
110 pu, err := NewPriceUpdater(
111 UpdateMethodTypeCoingeckoV3,
112 tc,
113 historyDB,
114 bitfinexV2URL,
115 coingeckoV3URL,
116 )
117 require.NoError(t, err)
118 // Update token list
119 require.NoError(t, pu.UpdateTokenList())
120 // Update prices
121 pu.UpdatePrices(context.Background())
122
123 // Check results: get tokens from DB
124 fetchedTokens, err := historyDB.GetTokensTest()
125 require.NoError(t, err)
126 // Check that tokens that are updated via API have value:
127 // ETH
128 require.NotNil(t, fetchedTokens[0].USDUpdate)
129 assert.Greater(t, *fetchedTokens[0].USD, 0.0)
130 // DAI
131 require.NotNil(t, fetchedTokens[1].USDUpdate)
132 assert.Greater(t, *fetchedTokens[1].USD, 0.0)
133 // USDT
134 require.NotNil(t, fetchedTokens[2].USDUpdate)
135 assert.Greater(t, *fetchedTokens[2].USD, 0.0)
136 // UNI
137 require.NotNil(t, fetchedTokens[5].USDUpdate)
138 assert.Greater(t, *fetchedTokens[5].USD, 0.0)
139 // Check ignored token
140 assert.Equal(t, ignoreValue, *fetchedTokens[3].USD)
141 // Check static value
142 assert.Equal(t, staticValue, *fetchedTokens[4].USD)
143}