agents/domains/evm/lightinbox.go
package evm
import (
"context"
"fmt"
"math/big"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
ethTypes "github.com/ethereum/go-ethereum/core/types"
"github.com/synapsecns/sanguine/agents/contracts/lightinbox"
"github.com/synapsecns/sanguine/agents/domains"
"github.com/synapsecns/sanguine/agents/types"
"github.com/synapsecns/sanguine/ethergo/chain"
"github.com/synapsecns/sanguine/ethergo/signer/nonce"
"github.com/synapsecns/sanguine/ethergo/signer/signer"
)
// NewLightInboxContract returns a bound light inbox contract.
//
//nolint:staticcheck
func NewLightInboxContract(ctx context.Context, client chain.Chain, lightInboxAddress common.Address) (domains.LightInboxContract, error) {
boundCountract, err := lightinbox.NewLightInboxRef(lightInboxAddress, client)
if err != nil {
return nil, fmt.Errorf("could not create %T: %w", &lightinbox.LightInboxRef{}, err)
}
nonceManager := nonce.NewNonceManager(ctx, client, client.GetBigChainID())
return lightInboxContract{
contract: boundCountract,
client: client,
nonceManager: nonceManager,
}, nil
}
type lightInboxContract struct {
// contract contains the contract handle
contract *lightinbox.LightInboxRef
// client contains the evm client
//nolint: staticcheck
client chain.Chain
// nonceManager is the nonce manager used for transacting with the chain
nonceManager nonce.Manager
}
func (a lightInboxContract) SubmitAttestation(
transactor *bind.TransactOpts,
attPayload []byte,
signature signer.Signature,
agentRoot [32]byte,
snapGas []*big.Int,
) (tx *ethTypes.Transaction, err error) {
rawSig, err := types.EncodeSignature(signature)
if err != nil {
return nil, fmt.Errorf("could not encode signature: %w", err)
}
tx, err = a.contract.SubmitAttestation(transactor, attPayload, rawSig, agentRoot, snapGas)
if err != nil {
return nil, fmt.Errorf("could not submit attestation: %w", err)
}
return tx, nil
}
//nolint:dupl
func (a lightInboxContract) SubmitStateReportWithSnapshot(transactor *bind.TransactOpts, stateIndex uint8, signature signer.Signature, snapPayload []byte, snapSignature []byte) (tx *ethTypes.Transaction, err error) {
rawSig, err := types.EncodeSignature(signature)
if err != nil {
return nil, fmt.Errorf("could not encode signature: %w", err)
}
// TODO: Is there a way to get a return value from a contractTransactor call?
tx, err = a.contract.SubmitStateReportWithSnapshot(transactor, stateIndex, rawSig, snapPayload, snapSignature)
if err != nil {
return nil, fmt.Errorf("could not submit state report: %w", err)
}
return tx, nil
}
func (a lightInboxContract) VerifyStateWithSnapshot(transactor *bind.TransactOpts, stateIndex uint8, snapPayload []byte, snapSignature []byte) (tx *ethTypes.Transaction, err error) {
tx, err = a.contract.VerifyStateWithSnapshot(transactor, stateIndex, snapPayload, snapSignature)
if err != nil {
return nil, fmt.Errorf("could not submit state report: %w", err)
}
return tx, nil
}
func (a lightInboxContract) SubmitAttestationReport(transactor *bind.TransactOpts, attestation, arSignature, attSignature []byte) (tx *ethTypes.Transaction, err error) {
tx, err = a.contract.SubmitAttestationReport(transactor, attestation, arSignature, attSignature)
if err != nil {
return nil, fmt.Errorf("could not submit state report: %w", err)
}
return tx, nil
}
func (a lightInboxContract) VerifyStateWithAttestation(transactor *bind.TransactOpts, stateIndex uint8, snapPayload []byte, attPayload []byte, attSignature []byte) (tx *ethTypes.Transaction, err error) {
tx, err = a.contract.VerifyStateWithAttestation(transactor, stateIndex, snapPayload, attPayload, attSignature)
if err != nil {
return nil, fmt.Errorf("could not submit state report: %w", err)
}
return tx, nil
}
func (a lightInboxContract) VerifyReceipt(transactor *bind.TransactOpts, rcptPayload []byte, rcptSignature []byte) (tx *ethTypes.Transaction, err error) {
tx, err = a.contract.VerifyReceipt(transactor, rcptPayload, rcptSignature)
if err != nil {
return nil, fmt.Errorf("could not submit state report: %w", err)
}
return tx, nil
}
//nolint:dupl
func (a lightInboxContract) SubmitStateReportWithAttestation(transactor *bind.TransactOpts, stateIndex uint8, signature signer.Signature, snapPayload, attPayload, attSignature []byte) (tx *ethTypes.Transaction, err error) {
rawSig, err := types.EncodeSignature(signature)
if err != nil {
return nil, fmt.Errorf("could not encode signature: %w", err)
}
tx, err = a.contract.SubmitStateReportWithAttestation(transactor, stateIndex, rawSig, snapPayload, attPayload, attSignature)
if err != nil {
return nil, fmt.Errorf("could not submit state report: %w", err)
}
return tx, nil
}