-
Notifications
You must be signed in to change notification settings - Fork 0
/
account.go
62 lines (51 loc) · 1.92 KB
/
account.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package filters
import (
"context"
"github.com/sanjayhashcash/go/ingest"
"github.com/sanjayhashcash/go/services/aurora/internal/db2/history"
"github.com/sanjayhashcash/go/services/aurora/internal/ingest/processors"
"github.com/sanjayhashcash/go/support/collections/set"
)
type accountFilter struct {
whitelistedAccountsSet set.Set[string]
lastModified int64
enabled bool
}
type AccountFilter interface {
processors.LedgerTransactionFilterer
RefreshAccountFilter(filterConfig *history.AccountFilterConfig) error
}
func NewAccountFilter() AccountFilter {
return &accountFilter{
whitelistedAccountsSet: set.Set[string]{},
}
}
func (filter *accountFilter) RefreshAccountFilter(filterConfig *history.AccountFilterConfig) error {
// only need to re-initialize the filter config state(rules) if its cached version(in memory)
// is older than the incoming config version based on lastModified epoch timestamp
if filterConfig.LastModified > filter.lastModified {
logger.Infof("New Account Filter config detected, reloading new config %v ", *filterConfig)
filter.enabled = filterConfig.Enabled
filter.whitelistedAccountsSet = listToSet(filterConfig.Whitelist)
filter.lastModified = filterConfig.LastModified
}
return nil
}
func (f *accountFilter) FilterTransaction(ctx context.Context, transaction ingest.LedgerTransaction) (bool, error) {
// filtering is disabled if the whitelist is empty for now, as that is the only filter rule
if len(f.whitelistedAccountsSet) == 0 || !f.enabled {
return true, nil
}
participants, err := processors.ParticipantsForTransaction(0, transaction)
if err != nil {
return false, err
}
// NOTE: this assumes that the participant list has a small memory footprint
// otherwise, we should be doing the filtering on the DB side
for _, p := range participants {
if f.whitelistedAccountsSet.Contains(p.Address()) {
return true, nil
}
}
return false, nil
}