package priceupdater import ( "context" "os" "testing" ethCommon "github.com/ethereum/go-ethereum/common" "github.com/hermeznetwork/hermez-node/common" dbUtils "github.com/hermeznetwork/hermez-node/db" "github.com/hermeznetwork/hermez-node/db/historydb" "github.com/hermeznetwork/hermez-node/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) var historyDB *historydb.HistoryDB const usdtAddr = "0xdac17f958d2ee523a2206206994597c13d831ec7" func TestPriceUpdaterBitfinex(t *testing.T) { // Init DB pass := os.Getenv("POSTGRES_PASS") db, err := dbUtils.InitSQLDB(5432, "localhost", "hermez", pass, "hermez") if err != nil { panic(err) } historyDB = historydb.NewHistoryDB(db, db, nil) // Clean DB test.WipeDB(historyDB.DB()) // Populate DB // Gen blocks and add them to DB blocks := test.GenBlocks(1, 2) require.NoError(t, historyDB.AddBlocks(blocks)) // Gen tokens and add them to DB tokens := []common.Token{ { TokenID: 1, EthBlockNum: blocks[0].Num, EthAddr: ethCommon.HexToAddress("0x1"), Name: "DAI", Symbol: "DAI", Decimals: 18, }, // Used to test get by SC addr { TokenID: 2, EthBlockNum: blocks[0].Num, EthAddr: ethCommon.HexToAddress(usdtAddr), Name: "Tether", Symbol: "USDT", Decimals: 18, }, // Used to test get by token symbol { TokenID: 3, EthBlockNum: blocks[0].Num, EthAddr: ethCommon.HexToAddress("0x2"), Name: "FOO", Symbol: "FOO", Decimals: 18, }, // Used to test ignore { TokenID: 4, EthBlockNum: blocks[0].Num, EthAddr: ethCommon.HexToAddress("0x3"), Name: "BAR", Symbol: "BAR", Decimals: 18, }, // Used to test static { TokenID: 5, EthBlockNum: blocks[0].Num, EthAddr: ethCommon.HexToAddress("0x1f9840a85d5af5bf1d1762f925bdaddc4201f984"), Name: "Uniswap", Symbol: "UNI", Decimals: 18, }, // Used to test default } require.NoError(t, historyDB.AddTokens(tokens)) // ETH token exist in DB by default // Update token price used to test ignore ignoreValue := 44.44 require.NoError(t, historyDB.UpdateTokenValue(tokens[2].EthAddr, ignoreValue)) // Prepare token config staticValue := 0.12345 tc := []TokenConfig{ // ETH and UNI tokens use default method { // DAI uses SC addr UpdateMethod: UpdateMethodTypeBitFinexV2, Addr: ethCommon.HexToAddress("0x1"), Symbol: "DAI", }, { // USDT uses symbol UpdateMethod: UpdateMethodTypeCoingeckoV3, Addr: ethCommon.HexToAddress(usdtAddr), }, { // FOO uses ignore UpdateMethod: UpdateMethodTypeIgnore, Addr: ethCommon.HexToAddress("0x2"), }, { // BAR uses static UpdateMethod: UpdateMethodTypeStatic, Addr: ethCommon.HexToAddress("0x3"), StaticValue: staticValue, }, } bitfinexV2URL := "https://api-pub.bitfinex.com/v2/" coingeckoV3URL := "https://api.coingecko.com/api/v3/" // Init price updater pu, err := NewPriceUpdater( UpdateMethodTypeCoingeckoV3, tc, historyDB, bitfinexV2URL, coingeckoV3URL, ) require.NoError(t, err) // Update token list require.NoError(t, pu.UpdateTokenList()) // Update prices pu.UpdatePrices(context.Background()) // Check results: get tokens from DB fetchedTokens, err := historyDB.GetTokensTest() require.NoError(t, err) // Check that tokens that are updated via API have value: // ETH require.NotNil(t, fetchedTokens[0].USDUpdate) assert.Greater(t, *fetchedTokens[0].USD, 0.0) // DAI require.NotNil(t, fetchedTokens[1].USDUpdate) assert.Greater(t, *fetchedTokens[1].USD, 0.0) // USDT require.NotNil(t, fetchedTokens[2].USDUpdate) assert.Greater(t, *fetchedTokens[2].USD, 0.0) // UNI require.NotNil(t, fetchedTokens[5].USDUpdate) assert.Greater(t, *fetchedTokens[5].USD, 0.0) // Check ignored token assert.Equal(t, ignoreValue, *fetchedTokens[3].USD) // Check static value assert.Equal(t, staticValue, *fetchedTokens[4].USD) }