Skip to content

Commit

Permalink
CCTP: use chain listener instead of scribe (#2592)
Browse files Browse the repository at this point in the history
* WIP: replace scribe with chain listener

* Fix: build

* Fix: tests

* Fix: rfq build

* Cleanup: remove unused enum

* Cleanup: revert test change

* Cleanup: comments

* Cleanup: lint

* Fix: build

* Fix: test
  • Loading branch information
dwasse authored May 8, 2024
1 parent e6573c6 commit 9367858
Show file tree
Hide file tree
Showing 14 changed files with 90 additions and 211 deletions.
4 changes: 1 addition & 3 deletions services/cctp-relayer/cmd/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
"github.com/synapsecns/sanguine/services/cctp-relayer/db/sql"
"github.com/synapsecns/sanguine/services/cctp-relayer/relayer"
omniClient "github.com/synapsecns/sanguine/services/omnirpc/client"
"github.com/synapsecns/sanguine/services/scribe/client"
"github.com/urfave/cli/v2"
)

Expand Down Expand Up @@ -78,11 +77,10 @@ var runCommand = &cli.Command{
return fmt.Errorf("could not connect to database: %w", err)
}

scribeClient := client.NewRemoteScribe(uint16(c.Uint(scribePortFlag.Name)), c.String(scribeURL.Name), metricsProvider).ScribeClient
omnirpcClient := omniClient.NewOmnirpcClient(cfg.BaseOmnirpcURL, metricsProvider, omniClient.WithCaptureReqRes())
attAPI := attestation.NewCircleAPI(c.String(cfg.CircleAPIURl))

cctpRelayer, err := relayer.NewCCTPRelayer(c.Context, cfg, store, scribeClient, omnirpcClient, metricsProvider, attAPI)
cctpRelayer, err := relayer.NewCCTPRelayer(c.Context, cfg, store, omnirpcClient, metricsProvider, attAPI)
if err != nil {
return fmt.Errorf("could not create cctp relayer: %w", err)
}
Expand Down
32 changes: 12 additions & 20 deletions services/cctp-relayer/config/chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,16 @@ import (
// ChainConfig defines the config for a specific chain.
type ChainConfig struct { // ChainID is the ID of the chain.
ChainID uint32 `yaml:"chain_id"`
// SynapseCCTPAddress is the address of the SynapseCCTP contract.
SynapseCCTPAddress string `yaml:"synapse_cctp_address"`
// TokenMessengerAddress is the address of the TokenMessenger contract.
TokenMessengerAddress string `yaml:"token_messenger_address"`
// CCTPAddress is the address of the CCTP contract.
// This will correspond to SynapseCCTP or TokenMessenger depending on the CCTPType.
CCTPAddress string `yaml:"cctp_address"`
// CCTP start block is the block at which the chain listener will listen for CCTP events.
CCTPStartBlock uint64 `yaml:"cctp_start_block"`
}

// GetSynapseCCTPAddress returns the SynapseCCTP address.
func (c ChainConfig) GetSynapseCCTPAddress() common.Address {
return common.HexToAddress(c.SynapseCCTPAddress)
}

// GetTokenMessengerAddress returns the TokenMessenger address.
func (c ChainConfig) GetTokenMessengerAddress() common.Address {
return common.HexToAddress(c.TokenMessengerAddress)
// GetCCTPAddress returns the CCTP address.
func (c ChainConfig) GetCCTPAddress() common.Address {
return common.HexToAddress(c.CCTPAddress)
}

// ChainConfigs contains an array of ChainConfigs.
Expand All @@ -40,12 +36,8 @@ func (c ChainConfigs) IsValid(_ context.Context) (ok bool, err error) {
}
intSet.Add(cfg.ChainID)

if len(cfg.SynapseCCTPAddress) > 0 && !common.IsHexAddress(cfg.SynapseCCTPAddress) {
return false, fmt.Errorf("invalid address %s: %s", cfg.SynapseCCTPAddress, "invalid address")
}

if len(cfg.TokenMessengerAddress) > 0 && !common.IsHexAddress(cfg.TokenMessengerAddress) {
return false, fmt.Errorf("invalid address %s: %s", cfg.TokenMessengerAddress, "invalid address")
if len(cfg.CCTPAddress) > 0 && !common.IsHexAddress(cfg.CCTPAddress) {
return false, fmt.Errorf("invalid address %s: %s", cfg.CCTPAddress, "invalid address")
}
}

Expand All @@ -58,8 +50,8 @@ func (c ChainConfig) IsValid(ctx context.Context) (ok bool, err error) {
return false, fmt.Errorf("%s: chain ID cannot be 0", "invalid chain id")
}

if c.SynapseCCTPAddress == "" && c.TokenMessengerAddress == "" {
return false, fmt.Errorf("at least one of SynapseCCTPAddress and TokenMessengerAddress is required")
if c.CCTPAddress == "" {
return false, fmt.Errorf("a CCTP address is required")
}

return true, nil
Expand Down
7 changes: 1 addition & 6 deletions services/cctp-relayer/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,8 @@ type Config struct {
// Chains stores all chain information
Chains ChainConfigs `yaml:"chains"`
// BaseOmnirpcURL is the base url for omnirpc.
// The format is "https://omnirpc.url/". Notice the lack of "confirmations" on the URL
// in comparison to what `Scribe` uses.
// The format is "https://omnirpc.url/".
BaseOmnirpcURL string `yaml:"base_omnirpc_url"`
// ScribePort is the port for the scribe server.
ScribePort uint `yaml:"scribe_port"`
// ScribeURL is the URL for the scribe server.
ScribeURL string `yaml:"scribe_url"`
// Signer contains the unbonded signer config for agents
// (this is signer used to submit transactions)
Signer ethConfig.SignerConfig `yaml:"unbonded_signer"`
Expand Down
8 changes: 4 additions & 4 deletions services/cctp-relayer/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ func configFixture(c ConfigSuite) config.Config {
return config.Config{
Chains: config.ChainConfigs{
config.ChainConfig{
ChainID: chainIDA,
SynapseCCTPAddress: mocks.MockAddress().String(),
ChainID: chainIDA,
CCTPAddress: mocks.MockAddress().String(),
},
config.ChainConfig{
ChainID: chainIDB,
SynapseCCTPAddress: mocks.MockAddress().String(),
ChainID: chainIDB,
CCTPAddress: mocks.MockAddress().String(),
},
},
BaseOmnirpcURL: gofakeit.URL(),
Expand Down
2 changes: 2 additions & 0 deletions services/cctp-relayer/db/relayer_db.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"

"github.com/ethereum/go-ethereum/common"
listenerDB "github.com/synapsecns/sanguine/ethergo/listener/db"
submitterDB "github.com/synapsecns/sanguine/ethergo/submitter/db"

"github.com/synapsecns/sanguine/services/cctp-relayer/types"
Expand Down Expand Up @@ -34,4 +35,5 @@ type CCTPRelayerDB interface {
CCTPRelayerDBReader
CCTPRelayerDBWriter
SubmitterDB() submitterDB.Service
listenerDB.ChainListenerDB
}
5 changes: 4 additions & 1 deletion services/cctp-relayer/db/sql/base/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package base

import (
"github.com/synapsecns/sanguine/core/metrics"
listenerDB "github.com/synapsecns/sanguine/ethergo/listener/db"
submitterDB "github.com/synapsecns/sanguine/ethergo/submitter/db"
"github.com/synapsecns/sanguine/ethergo/submitter/db/txdb"
"github.com/synapsecns/sanguine/services/cctp-relayer/db"
Expand All @@ -11,6 +12,7 @@ import (

// Store is a store that implements an underlying gorm db.
type Store struct {
listenerDB.ChainListenerDB
db *gorm.DB
metrics metrics.Handler
submitterStore submitterDB.Service
Expand All @@ -19,7 +21,7 @@ type Store struct {
// NewStore creates a new store.
func NewStore(db *gorm.DB, metrics metrics.Handler) *Store {
txDB := txdb.NewTXStore(db, metrics)
return &Store{db: db, metrics: metrics, submitterStore: txDB}
return &Store{ChainListenerDB: listenerDB.NewChainListenerStore(db, metrics), db: db, metrics: metrics, submitterStore: txDB}
}

// DB gets the database object for mutation outside of the lib.
Expand All @@ -36,6 +38,7 @@ func (s Store) SubmitterDB() submitterDB.Service {
// see: https://medium.com/@SaifAbid/slice-interfaces-8c78f8b6345d for an explanation of why we can't do this at initialization time
func GetAllModels() (allModels []interface{}) {
allModels = append(allModels, txdb.GetAllModels()...)
allModels = append(allModels, listenerDB.GetAllModels()...)
allModels = append(allModels, &types.Message{})
return allModels
}
Expand Down
3 changes: 2 additions & 1 deletion services/cctp-relayer/db/sql/mysql/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package mysql
import (
"context"
"fmt"
"time"

"github.com/ipfs/go-log"
common_base "github.com/synapsecns/sanguine/core/dbcommon"
"github.com/synapsecns/sanguine/core/metrics"
Expand All @@ -11,7 +13,6 @@ import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"time"
)

// Logger is the mysql logger.
Expand Down
4 changes: 2 additions & 2 deletions services/cctp-relayer/relayer/circle.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func NewCircleCCTPHandler(ctx context.Context, cfg config.Config, db db2.CCTPRel
if err != nil {
return nil, fmt.Errorf("could not get client: %w", err)
}
transmitterAddr, err := GetMessageTransmitterAddress(ctx, chain.GetTokenMessengerAddress(), cl)
transmitterAddr, err := GetMessageTransmitterAddress(ctx, chain.GetCCTPAddress(), cl)
if err != nil {
return nil, fmt.Errorf("could not get message transmitter address: %w", err)
}
Expand Down Expand Up @@ -333,7 +333,7 @@ func (c *circleCCTPHandler) getMessagePayload(ctx context.Context, txHash common
if err != nil {
return nil, fmt.Errorf("could not get chain config: %w", err)
}
transmitterAddr, err := GetMessageTransmitterAddress(ctx, chainCfg.GetTokenMessengerAddress(), ethClient)
transmitterAddr, err := GetMessageTransmitterAddress(ctx, chainCfg.GetCCTPAddress(), ethClient)
if err != nil {
return nil, fmt.Errorf("could not get message transmitter address: %w", err)
}
Expand Down
Loading

0 comments on commit 9367858

Please sign in to comment.