synapsecns/sanguine

View on GitHub
agents/types/receipt.go

Summary

Maintainability
A
1 hr
Test Coverage
package types

import (
    "context"

    "github.com/ethereum/go-ethereum/common"
    "github.com/synapsecns/sanguine/ethergo/signer/signer"
)

const (
    receiptOffsetOrigin        = 0
    receiptOffsetDestination   = 4
    receiptOffsetMessageHash   = 8
    receiptOffsetSnapshotRoot  = 40
    receiptOffsetStateIndex    = 72
    receiptOffsetAttNotary     = 73
    receiptOffsetFirstExecutor = 93
    receiptOffsetFinalExecutor = 113
    receiptSize                = 133
)

// Receipt is the receipt interface.
type Receipt interface {
    Encoder
    // Origin is the origin of the receipt.
    Origin() uint32
    // Destination is the destination of the receipt.
    Destination() uint32
    // MessageHash is the hash of the message.
    MessageHash() [32]byte
    // SnapshotRoot is the root of the Snapshot Merkle Tree.
    SnapshotRoot() [32]byte
    // StateIndex is the state index of the receipt.
    StateIndex() uint8
    // AttestationNotary is the notary of the attestation.
    AttestationNotary() common.Address
    // FirstExecutor is the first executor of the receipt.
    FirstExecutor() common.Address
    // FinalExecutor is the final executor of the receipt.
    FinalExecutor() common.Address
    // SignReceipt returns the signature of the receipt payload signed by the signer.
    SignReceipt(ctx context.Context, signer signer.Signer, valid bool) (signer.Signature, []byte, common.Hash, error)
}

type receipt struct {
    origin            uint32
    destination       uint32
    messageHash       [32]byte
    snapshotRoot      [32]byte
    stateIndex        uint8
    attestationNotary common.Address
    firstExecutor     common.Address
    finalExecutor     common.Address
}

// NewReceipt creates a new receipt.
func NewReceipt(origin uint32, destination uint32, messageHash [32]byte, snapshotRoot [32]byte, stateIndex uint8, attestationNotary common.Address, firstExecutor common.Address, finalExecutor common.Address) Receipt {
    return &receipt{
        origin:            origin,
        destination:       destination,
        messageHash:       messageHash,
        snapshotRoot:      snapshotRoot,
        stateIndex:        stateIndex,
        attestationNotary: attestationNotary,
        firstExecutor:     firstExecutor,
        finalExecutor:     finalExecutor,
    }
}

func (r receipt) Origin() uint32 {
    return r.origin
}

func (r receipt) Destination() uint32 {
    return r.destination
}

func (r receipt) MessageHash() [32]byte {
    return r.messageHash
}

func (r receipt) SnapshotRoot() [32]byte {
    return r.snapshotRoot
}

func (r receipt) StateIndex() uint8 {
    return r.stateIndex
}

func (r receipt) AttestationNotary() common.Address {
    return r.attestationNotary
}

func (r receipt) FirstExecutor() common.Address {
    return r.firstExecutor
}

func (r receipt) FinalExecutor() common.Address {
    return r.finalExecutor
}

func (r receipt) SignReceipt(ctx context.Context, signer signer.Signer, valid bool) (signer.Signature, []byte, common.Hash, error) {
    var receiptSalt string
    if valid {
        receiptSalt = ReceiptValidSalt
    } else {
        receiptSalt = ReceiptInvalidSalt
    }
    return signEncoder(ctx, signer, r, receiptSalt)
}