agents/domains/evm/origin.go
package evm
import (
"context"
"fmt"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/synapsecns/sanguine/agents/contracts/origin"
"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"
)
// NewOriginContract returns a new bound origin contract.
//
//nolint:staticcheck
func NewOriginContract(ctx context.Context, client chain.Chain, originAddress common.Address) (domains.OriginContract, error) {
boundContract, err := origin.NewOriginRef(originAddress, client)
if err != nil {
return nil, fmt.Errorf("could not create %T: %w", &origin.OriginRef{}, err)
}
nonceManager := nonce.NewNonceManager(ctx, client, client.GetBigChainID())
return originContract{
contract: boundContract,
client: client,
nonceManager: nonceManager,
}, nil
}
// originContract contains an interface for interacting with the origin chain that implements
// domains.OriginContract.
type originContract struct {
// contract contains the contract handle
contract *origin.OriginRef
// client is the client
//nolint: staticcheck
client chain.Chain
// nonceManager is the nonce manager used for transacting
nonceManager nonce.Manager
}
func (o originContract) GetContractRef() *origin.OriginRef {
return o.contract
}
func (o originContract) IsValidState(ctx context.Context, statePayload []byte) (isValid bool, err error) {
isValid, err = o.contract.IsValidState(&bind.CallOpts{Context: ctx}, statePayload)
if err != nil {
return false, fmt.Errorf("could not check if state is valid: %w", err)
}
return isValid, nil
}
func (o originContract) SuggestLatestState(ctx context.Context) (types.State, error) {
suggestedStateRaw, err := o.contract.SuggestLatestState(&bind.CallOpts{Context: ctx})
if err != nil {
return nil, fmt.Errorf("could not get suggested latest state: %w", err)
}
if len(suggestedStateRaw) == 0 {
//nolint:nilnil
return nil, nil
}
suggestedState, err := types.DecodeState(suggestedStateRaw)
if err != nil {
return nil, fmt.Errorf("could not decode suggested state: %w", err)
}
return suggestedState, nil
}
func (o originContract) SuggestState(ctx context.Context, nonce uint32) (types.State, error) {
suggestedStateRaw, err := o.contract.SuggestState(&bind.CallOpts{Context: ctx}, nonce)
if err != nil {
return nil, fmt.Errorf("could not get suggested state: %w", err)
}
if len(suggestedStateRaw) == 0 {
//nolint:nilnil
return nil, nil
}
suggestedState, err := types.DecodeState(suggestedStateRaw)
if err != nil {
return nil, fmt.Errorf("could not decode suggested state: %w", err)
}
return suggestedState, nil
}
var _ domains.OriginContract = &originContract{}