2021-01-26 10:27:30 +00:00
|
|
|
package audit
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math/big"
|
|
|
|
|
|
|
|
"github.com/nspcc-dev/neofs-api-go/pkg/owner"
|
|
|
|
)
|
|
|
|
|
|
|
|
type transferTable struct {
|
|
|
|
txs map[string]map[string]*transferTx
|
|
|
|
}
|
|
|
|
|
|
|
|
type transferTx struct {
|
|
|
|
from, to *owner.ID
|
|
|
|
|
|
|
|
amount *big.Int
|
|
|
|
}
|
|
|
|
|
|
|
|
func newTransferTable() *transferTable {
|
|
|
|
return &transferTable{
|
|
|
|
txs: make(map[string]map[string]*transferTx),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *transferTable) transfer(tx *transferTx) {
|
|
|
|
from, to := tx.from.String(), tx.to.String()
|
|
|
|
if from == to {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
m, ok := t.txs[from]
|
|
|
|
if !ok {
|
|
|
|
if m, ok = t.txs[to]; ok {
|
2021-01-29 08:02:06 +00:00
|
|
|
to = from // ignore `from = to` swap because `from` doesn't require
|
2021-01-26 10:27:30 +00:00
|
|
|
tx.amount.Neg(tx.amount)
|
|
|
|
} else {
|
|
|
|
m = make(map[string]*transferTx, 1)
|
|
|
|
t.txs[from] = m
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
tgt, ok := m[to]
|
|
|
|
if !ok {
|
|
|
|
m[to] = tx
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
tgt.amount.Add(tgt.amount, tx.amount)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *transferTable) iterate(f func(*transferTx)) {
|
|
|
|
for _, m := range t.txs {
|
|
|
|
for _, tx := range m {
|
|
|
|
f(tx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|