70 lines
1.8 KiB
Go
70 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
|
||
|
}
|