diff --git a/backend/pkg/commons/rpc/erigon.go b/backend/pkg/commons/rpc/erigon.go index e2fce24da..2d9edc041 100644 --- a/backend/pkg/commons/rpc/erigon.go +++ b/backend/pkg/commons/rpc/erigon.go @@ -421,7 +421,10 @@ func (client *ErigonClient) GetBalancesForAddress(address string, tokenStr []str return nil, err } - res := parseAddressBalance(tokens, address, balancesInt) + res, err := parseAddressBalance(tokens, address, balancesInt) + if err != nil { + return nil, err + } return res, nil } diff --git a/backend/pkg/commons/rpc/geth.go b/backend/pkg/commons/rpc/geth.go index 964fb89ea..6e7919541 100644 --- a/backend/pkg/commons/rpc/geth.go +++ b/backend/pkg/commons/rpc/geth.go @@ -290,7 +290,10 @@ func (client *GethClient) GetBalancesForAddress(address string, tokenStr []strin return nil, err } - res := parseAddressBalance(tokens, address, balancesInt) + res, err := parseAddressBalance(tokens, address, balancesInt) + if err != nil { + return nil, err + } return res, nil } diff --git a/backend/pkg/commons/rpc/utils.go b/backend/pkg/commons/rpc/utils.go index 9ee220b89..f544609d0 100644 --- a/backend/pkg/commons/rpc/utils.go +++ b/backend/pkg/commons/rpc/utils.go @@ -126,14 +126,46 @@ func getRateFromOracle(oracle *oneinchoracle.OneinchOracle, token []byte, ret *t return nil } -func parseAddressBalance(tokens []common.Address, address string, balances []*big.Int) []*types.Eth1AddressBalance { +func parseAddressBalance(tokens []common.Address, address string, balances []*big.Int) ([]*types.Eth1AddressBalance, error) { + if len(tokens) == 0 || len(balances) == 0 { + return nil, fmt.Errorf("tokens or balances slice is empty") + } + if len(tokens) != len(balances) { + return nil, fmt.Errorf("tokens and balances slices have mismatched lengths") + } + + if address == "" { + return nil, fmt.Errorf("address is empty") + } + addrBytes := common.FromHex(address) + if len(addrBytes) == 0 { + return nil, fmt.Errorf("invalid address format") + } + res := make([]*types.Eth1AddressBalance, len(tokens)) - for tokenIdx := range tokens { + for tokenIdx, token := range tokens { + if token == (common.Address{}) { + return nil, fmt.Errorf("token at index %d is empty", tokenIdx) + } + tokenBytes := token.Bytes() + if len(tokenBytes) == 0 { + return nil, fmt.Errorf("invalid token format at index %d", tokenIdx) + } + + if balances[tokenIdx] == nil { + return nil, fmt.Errorf("balance at index %d is nil", tokenIdx) + } + balanceBytes := balances[tokenIdx].Bytes() + if len(balanceBytes) == 0 { + return nil, fmt.Errorf("invalid balance format at index %d", tokenIdx) + } + res[tokenIdx] = &types.Eth1AddressBalance{ - Address: common.FromHex(address), - Token: common.FromHex(string(tokens[tokenIdx].Bytes())), - Balance: balances[tokenIdx].Bytes(), + Address: addrBytes, + Token: tokenBytes, + Balance: balanceBytes, } } - return res + + return res, nil }