feat: Pass 1 day balance change (#4858)
This commit is contained in:
parent
7f671f7632
commit
6c792a0e73
|
@ -91,11 +91,12 @@ type TokenMarketValues struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ChainBalance struct {
|
type ChainBalance struct {
|
||||||
RawBalance string `json:"rawBalance"`
|
RawBalance string `json:"rawBalance"`
|
||||||
Balance *big.Float `json:"balance"`
|
Balance *big.Float `json:"balance"`
|
||||||
Address common.Address `json:"address"`
|
Balance1DayAgo string `json:"balance1DayAgo"`
|
||||||
ChainID uint64 `json:"chainId"`
|
Address common.Address `json:"address"`
|
||||||
HasError bool `json:"hasError"`
|
ChainID uint64 `json:"chainId"`
|
||||||
|
HasError bool `json:"hasError"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Token struct {
|
type Token struct {
|
||||||
|
@ -386,6 +387,7 @@ func (r *Reader) getWalletTokenBalances(ctx context.Context, addresses []common.
|
||||||
|
|
||||||
result := make(map[common.Address][]Token)
|
result := make(map[common.Address][]Token)
|
||||||
communities := make(map[string]bool)
|
communities := make(map[string]bool)
|
||||||
|
dayAgoTimestamp := time.Now().Add(-24 * time.Hour).Unix()
|
||||||
|
|
||||||
for _, address := range addresses {
|
for _, address := range addresses {
|
||||||
for _, tokenList := range [][]*token.Token{verifiedTokens, unverifiedTokens} {
|
for _, tokenList := range [][]*token.Token{verifiedTokens, unverifiedTokens} {
|
||||||
|
@ -415,12 +417,21 @@ func (r *Reader) getWalletTokenBalances(ctx context.Context, addresses []common.
|
||||||
if !isVisible {
|
if !isVisible {
|
||||||
isVisible = balance.Cmp(big.NewFloat(0.0)) > 0 || r.isCachedToken(cachedTokens, address, token.Symbol, token.ChainID)
|
isVisible = balance.Cmp(big.NewFloat(0.0)) > 0 || r.isCachedToken(cachedTokens, address, token.Symbol, token.ChainID)
|
||||||
}
|
}
|
||||||
|
balance1DayAgo, err := r.tokenManager.GetTokenHistoricalBalance(address, token.ChainID, token.Symbol, dayAgoTimestamp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
balance1DayAgoStr := "0"
|
||||||
|
if balance1DayAgo != nil {
|
||||||
|
balance1DayAgoStr = balance1DayAgo.String()
|
||||||
|
}
|
||||||
balancesPerChain[token.ChainID] = ChainBalance{
|
balancesPerChain[token.ChainID] = ChainBalance{
|
||||||
RawBalance: hexBalance.ToInt().String(),
|
RawBalance: hexBalance.ToInt().String(),
|
||||||
Balance: balance,
|
Balance: balance,
|
||||||
Address: token.Address,
|
Balance1DayAgo: balance1DayAgoStr,
|
||||||
ChainID: token.ChainID,
|
Address: token.Address,
|
||||||
HasError: hasError,
|
ChainID: token.ChainID,
|
||||||
|
HasError: hasError,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ import (
|
||||||
"github.com/status-im/status-go/services/communitytokens"
|
"github.com/status-im/status-go/services/communitytokens"
|
||||||
"github.com/status-im/status-go/services/utils"
|
"github.com/status-im/status-go/services/utils"
|
||||||
"github.com/status-im/status-go/services/wallet/async"
|
"github.com/status-im/status-go/services/wallet/async"
|
||||||
|
"github.com/status-im/status-go/services/wallet/bigint"
|
||||||
"github.com/status-im/status-go/services/wallet/community"
|
"github.com/status-im/status-go/services/wallet/community"
|
||||||
"github.com/status-im/status-go/services/wallet/walletevent"
|
"github.com/status-im/status-go/services/wallet/walletevent"
|
||||||
)
|
)
|
||||||
|
@ -873,3 +874,14 @@ func (tm *Manager) fillCommunityData(token *Token) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tm *Manager) GetTokenHistoricalBalance(account common.Address, chainID uint64, symbol string, timestamp int64) (*big.Int, error) {
|
||||||
|
var balance big.Int
|
||||||
|
err := tm.db.QueryRow("SELECT balance FROM balance_history WHERE currency = ? AND chain_id = ? AND address = ? AND timestamp < ? order by timestamp DESC LIMIT 1", symbol, chainID, account, timestamp).Scan((*bigint.SQLBigIntBytes)(&balance))
|
||||||
|
if err == sql.ErrNoRows {
|
||||||
|
return nil, nil
|
||||||
|
} else if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &balance, nil
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package token
|
package token
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"math/big"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -8,6 +9,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
|
||||||
"github.com/status-im/status-go/params"
|
"github.com/status-im/status-go/params"
|
||||||
|
"github.com/status-im/status-go/services/wallet/bigint"
|
||||||
"github.com/status-im/status-go/services/wallet/community"
|
"github.com/status-im/status-go/services/wallet/community"
|
||||||
"github.com/status-im/status-go/t/helpers"
|
"github.com/status-im/status-go/t/helpers"
|
||||||
"github.com/status-im/status-go/walletdatabase"
|
"github.com/status-im/status-go/walletdatabase"
|
||||||
|
@ -248,3 +250,50 @@ func TestMarkAsPreviouslyOwnedToken(t *testing.T) {
|
||||||
require.Equal(t, 2, count)
|
require.Equal(t, 2, count)
|
||||||
require.True(t, isFirst)
|
require.True(t, isFirst)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetTokenHistoricalBalance(t *testing.T) {
|
||||||
|
manager, stop := setupTestTokenDB(t)
|
||||||
|
defer stop()
|
||||||
|
|
||||||
|
account := common.HexToAddress("0x1234567890abcdef")
|
||||||
|
chainID := uint64(1)
|
||||||
|
testSymbol := "TEST"
|
||||||
|
block := int64(1)
|
||||||
|
timestamp := int64(1629878400) // Replace with desired timestamp
|
||||||
|
historyBalance := big.NewInt(0)
|
||||||
|
|
||||||
|
// Test case when no rows are returned
|
||||||
|
balance, err := manager.GetTokenHistoricalBalance(account, chainID, testSymbol, timestamp)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Nil(t, balance)
|
||||||
|
|
||||||
|
// Test case when a row is returned
|
||||||
|
historyBalance.SetInt64(int64(100))
|
||||||
|
_, err = manager.db.Exec("INSERT INTO balance_history (currency, chain_id, address, timestamp, balance, block) VALUES (?, ?, ?, ?, ?, ?)", testSymbol, chainID, account, timestamp-100, (*bigint.SQLBigIntBytes)(historyBalance), block)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
expectedBalance := big.NewInt(100)
|
||||||
|
balance, err = manager.GetTokenHistoricalBalance(account, chainID, testSymbol, timestamp)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, expectedBalance, balance)
|
||||||
|
|
||||||
|
// Test multiple values. Must return the most recent one
|
||||||
|
historyBalance.SetInt64(int64(100))
|
||||||
|
_, err = manager.db.Exec("INSERT INTO balance_history (currency, chain_id, address, timestamp, balance, block) VALUES (?, ?, ?, ?, ?, ?)", testSymbol, chainID, account, timestamp-200, (*bigint.SQLBigIntBytes)(historyBalance), block)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
historyBalance.SetInt64(int64(50))
|
||||||
|
symbol := "TEST2"
|
||||||
|
_, err = manager.db.Exec("INSERT INTO balance_history (currency, chain_id, address, timestamp, balance, block) VALUES (?, ?, ?, ?, ?, ?)", symbol, chainID, account, timestamp-1, (*bigint.SQLBigIntBytes)(historyBalance), block)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
historyBalance.SetInt64(int64(50))
|
||||||
|
chainID = uint64(2)
|
||||||
|
_, err = manager.db.Exec("INSERT INTO balance_history (currency, chain_id, address, timestamp, balance, block) VALUES (?, ?, ?, ?, ?, ?)", testSymbol, chainID, account, timestamp-1, (*bigint.SQLBigIntBytes)(historyBalance), block)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
chainID = uint64(1)
|
||||||
|
balance, err = manager.GetTokenHistoricalBalance(account, chainID, testSymbol, timestamp)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, expectedBalance, balance)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue