arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
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}