go-lns/pkg/primitives/covenant_binary.go
Virgil 80c728507b feat(primitives): add covenant binary codec
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 03:11:50 +00:00

58 lines
1.3 KiB
Go

// SPDX-License-Identifier: EUPL-1.2
package primitives
import "fmt"
// MarshalBinary serializes the covenant using the compact JS reference layout.
//
// The encoding is:
// - 1 byte covenant type
// - varint item count
// - repeated varbytes items
func (c Covenant) MarshalBinary() ([]byte, error) {
buf := make([]byte, 0, c.GetVarSize())
buf = append(buf, byte(c.Type))
buf = appendVarint(buf, uint64(len(c.Items)))
for _, item := range c.Items {
buf = appendVarBytes(buf, item)
}
return buf, nil
}
// UnmarshalBinary decodes the compact covenant layout used by the JS reference.
func (c *Covenant) UnmarshalBinary(data []byte) error {
*c = Covenant{}
if len(data) < 1 {
return fmt.Errorf("primitives.Covenant.UnmarshalBinary: short buffer")
}
c.Type = uint8(data[0])
data = data[1:]
count, consumed, err := readVarint(data)
if err != nil {
return fmt.Errorf("primitives.Covenant.UnmarshalBinary: %w", err)
}
data = data[consumed:]
c.Items = make([][]byte, 0, int(count))
for i := uint64(0); i < count; i++ {
item, n, err := readVarBytes(data)
if err != nil {
return fmt.Errorf("primitives.Covenant.UnmarshalBinary: %w", err)
}
c.Items = append(c.Items, item)
data = data[n:]
}
if len(data) != 0 {
return fmt.Errorf("primitives.Covenant.UnmarshalBinary: trailing data")
}
return nil
}