neo-go/pkg/core/state/unclaimed.go
2020-03-16 12:19:32 +03:00

69 lines
1.8 KiB
Go

package state
import (
"bytes"
"encoding/binary"
"github.com/nspcc-dev/neo-go/pkg/io"
"github.com/nspcc-dev/neo-go/pkg/util"
)
// UnclaimedBalanceSize is a size of the UnclaimedBalance struct in bytes.
const UnclaimedBalanceSize = util.Uint256Size + 2 + 4 + 4 + 8
// UnclaimedBalances is a slice of UnclaimedBalance.
type UnclaimedBalances struct {
Raw []byte
}
// Size returns an amount of store unclaimed balances.
func (bs *UnclaimedBalances) Size() int {
return len(bs.Raw) / UnclaimedBalanceSize
}
// ForEach iterates over all unclaimed balances.
func (bs *UnclaimedBalances) ForEach(f func(*UnclaimedBalance) error) error {
b := new(UnclaimedBalance)
for i := 0; i < len(bs.Raw); i += UnclaimedBalanceSize {
r := io.NewBinReaderFromBuf(bs.Raw[i : i+UnclaimedBalanceSize])
b.DecodeBinary(r)
if r.Err != nil {
return r.Err
} else if err := f(b); err != nil {
return err
}
}
return nil
}
// Remove removes specified unclaim from the list and returns
// false if it wasn't found.
func (bs *UnclaimedBalances) Remove(tx util.Uint256, index uint16) bool {
const keySize = util.Uint256Size + 2
key := make([]byte, keySize)
copy(key, tx[:])
binary.LittleEndian.PutUint16(key[util.Uint256Size:], index)
for i := 0; i < len(bs.Raw); i += UnclaimedBalanceSize {
if bytes.Equal(bs.Raw[i:i+keySize], key) {
lastIndex := len(bs.Raw) - UnclaimedBalanceSize
if i != lastIndex {
copy(bs.Raw[i:i+UnclaimedBalanceSize], bs.Raw[lastIndex:])
}
bs.Raw = bs.Raw[:lastIndex]
return true
}
}
return false
}
// Put puts new unclaim in a list.
func (bs *UnclaimedBalances) Put(b *UnclaimedBalance) error {
w := io.NewBufBinWriter()
b.EncodeBinary(w.BinWriter)
if w.Err != nil {
return w.Err
}
bs.Raw = append(bs.Raw, w.Bytes()...)
return nil
}