synapsecns/sanguine

View on GitHub
agents/types/header.go

Summary

Maintainability
A
35 mins
Test Coverage
package types

import (
    "fmt"
    "github.com/ethereum/go-ethereum/crypto"
)

// MessageFlag indicates if the message is normal "Base" message or "Manager" message.
type MessageFlag uint8

const (
    // MessageFlagBase is the normal message that has tips.
    MessageFlagBase MessageFlag = iota
    // MessageFlagManager is manager message and will not have tips.
    MessageFlagManager
)

const (
    // MessageFlagSize if the size in bytes of a message flag.
    MessageFlagSize = 1
    // MessageHeaderSize is the size in bytes of a message header.
    MessageHeaderSize = 4*4 + MessageFlagSize
)

// Header contains information of a message.
type Header interface {
    // Flag is the flag of the message
    Flag() MessageFlag
    // OriginDomain is the origin domain of the message
    OriginDomain() uint32
    // Nonce is the nonce of the message
    Nonce() uint32
    // DestinationDomain is the destination domain of the message
    DestinationDomain() uint32
    // OptimisticSeconds is the optimistic time period of the message in seconds
    OptimisticSeconds() uint32

    // Leaf is the leaf of the header.
    Leaf() ([32]byte, error)
}

type headerImpl struct {
    flag              MessageFlag
    originDomain      uint32
    nonce             uint32
    destinationDomain uint32
    optimisticSeconds uint32
}

// NewHeader creates a new header type.
func NewHeader(flag MessageFlag, originDomain uint32, nonce uint32, destinationDomain uint32, optimisticSeconds uint32) Header {
    return &headerImpl{
        flag:              flag,
        originDomain:      originDomain,
        nonce:             nonce,
        destinationDomain: destinationDomain,
        optimisticSeconds: optimisticSeconds,
    }
}

func (h headerImpl) Flag() MessageFlag {
    return h.flag
}

func (h headerImpl) OriginDomain() uint32 {
    return h.originDomain
}

func (h headerImpl) Nonce() uint32 {
    return h.nonce
}

func (h headerImpl) DestinationDomain() uint32 {
    return h.destinationDomain
}

func (h headerImpl) OptimisticSeconds() uint32 {
    return h.optimisticSeconds
}

func (h headerImpl) Leaf() ([32]byte, error) {
    var paddedHeader [32]byte
    bytesHeader, err := EncodeHeader(h)
    if err != nil {
        return [32]byte{}, fmt.Errorf("failed to encode header: %w", err)
    }

    // Determine where to start copying bytesHeader into paddedHeader
    startIndex := len(paddedHeader) - len(bytesHeader)
    copy(paddedHeader[startIndex:], bytesHeader)

    // Pad the beginning bytes with zeros
    for i := 0; i < startIndex; i++ {
        paddedHeader[i] = 0
    }

    headerHash := crypto.Keccak256(paddedHeader[:])

    var headerHash32Byte [32]byte
    copy(headerHash32Byte[:], headerHash)

    return headerHash32Byte, nil
}