From 494e841ebf48afbf6cc3dbffa1d5155cfefc5d17 Mon Sep 17 00:00:00 2001 From: parodime Date: Sat, 2 Nov 2024 09:38:33 -0400 Subject: [PATCH 01/11] relabeling & using v2 events/parsing for both versions --- services/rfq/guard/guardconfig/config.go | 22 +++--- services/rfq/guard/service/guard.go | 97 +++--------------------- services/rfq/guard/service/handlers.go | 85 +++++---------------- 3 files changed, 39 insertions(+), 165 deletions(-) diff --git a/services/rfq/guard/guardconfig/config.go b/services/rfq/guard/guardconfig/config.go index 3c2a817af9..e9d11bce76 100644 --- a/services/rfq/guard/guardconfig/config.go +++ b/services/rfq/guard/guardconfig/config.go @@ -34,10 +34,10 @@ type Config struct { // ChainConfig represents the configuration for a chain. type ChainConfig struct { - // RFQAddressV1 is the rfq bridge contract address. + // RFQAddressV1 is the legacy V1 rfq bridge contract address. OPTIONAL. Only populate if also guarding a deprecated V1 contract. RFQAddressV1 *string `yaml:"rfq_address_v1"` - // RFQAddressV2 is the rfq bridge contract address. - RFQAddressV2 string `yaml:"rfq_address_v2"` + // RFQAddress is the current/latest rfq bridge contract address. REQUIRED. + RFQAddress string `yaml:"rfq_address"` // Confirmations is the number of required confirmations. Confirmations uint64 `yaml:"confirmations"` } @@ -70,17 +70,17 @@ func (c Config) Validate() (err error) { for chainID := range c.Chains { addrV1, err := c.GetRFQAddressV1(chainID) if err != nil { - return fmt.Errorf("could not get rfq address: %w", err) + return fmt.Errorf("could not get v1 rfq address: %w", err) } if addrV1 != nil && !common.IsHexAddress(*addrV1) { - return fmt.Errorf("invalid rfq address: %s", *addrV1) + return fmt.Errorf("invalid rfq v1 address: %s", *addrV1) } addrV2, err := c.GetRFQAddressV2(chainID) if err != nil { - return fmt.Errorf("could not get rfq address: %w", err) + return fmt.Errorf("could not get v1 rfq address: %w", err) } if !common.IsHexAddress(addrV2) { - return fmt.Errorf("invalid rfq address: %s", addrV2) + return fmt.Errorf("invalid rfq v1 address: %s", addrV2) } } @@ -96,7 +96,7 @@ func (c Config) GetChains() map[int]ChainConfig { func (c Config) GetRFQAddressV1(chainID int) (*string, error) { chainCfg, ok := c.Chains[chainID] if !ok { - return nil, fmt.Errorf("chain config not found for chain %d", chainID) + return nil, fmt.Errorf("v1 chain config not found for chain %d", chainID) } return chainCfg.RFQAddressV1, nil } @@ -105,9 +105,9 @@ func (c Config) GetRFQAddressV1(chainID int) (*string, error) { func (c Config) GetRFQAddressV2(chainID int) (string, error) { chainCfg, ok := c.Chains[chainID] if !ok { - return "", fmt.Errorf("chain config not found for chain %d", chainID) + return "", fmt.Errorf("v2 chain config not found for chain %d", chainID) } - return chainCfg.RFQAddressV2, nil + return chainCfg.RFQAddress, nil } const defaultDBSelectorIntervalSeconds = 1 @@ -134,7 +134,7 @@ func NewGuardConfigFromRelayer(relayerCfg relconfig.Config) Config { for chainID, chainCfg := range relayerCfg.GetChains() { cfg.Chains[chainID] = ChainConfig{ RFQAddressV1: chainCfg.RFQAddressV1, - RFQAddressV2: chainCfg.RFQAddress, + RFQAddress: chainCfg.RFQAddress, Confirmations: chainCfg.FinalityConfirmations, } } diff --git a/services/rfq/guard/service/guard.go b/services/rfq/guard/service/guard.go index 3ab33aa3e7..97c19f1304 100644 --- a/services/rfq/guard/service/guard.go +++ b/services/rfq/guard/service/guard.go @@ -82,7 +82,7 @@ func NewGuard(ctx context.Context, metricHandler metrics.Handler, cfg guardconfi if err != nil { return nil, fmt.Errorf("could not get deploy block: %w", err) } - chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(*rfqAddrV1), uint64(startBlock.Int64()), metricHandler, listener.WithName("guard")) + chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(*rfqAddrV1), uint64(startBlock.Int64()), metricHandler, listener.WithName("guardListenerLegacy")) if err != nil { return nil, fmt.Errorf("could not get chain listener: %w", err) } @@ -107,7 +107,7 @@ func NewGuard(ctx context.Context, metricHandler metrics.Handler, cfg guardconfi if err != nil { return nil, fmt.Errorf("could not get deploy block: %w", err) } - chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(rfqAddrV2), uint64(startBlock.Int64()), metricHandler, listener.WithName("guard")) + chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(rfqAddrV2), uint64(startBlock.Int64()), metricHandler, listener.WithName("guardListener")) if err != nil { return nil, fmt.Errorf("could not get chain listener: %w", err) } @@ -210,7 +210,7 @@ func (g *Guard) startChainIndexers(ctx context.Context) (err error) { } if v1Addr != nil { group.Go(func() error { - err := g.runChainIndexerV1(ctx, chainID) + err := g.runChainIndexer(ctx, chainID, g.listenersV1) if err != nil { return fmt.Errorf("could not runChainIndexer chain indexer for chain %d [v1]: %w", chainID, err) } @@ -219,7 +219,7 @@ func (g *Guard) startChainIndexers(ctx context.Context) (err error) { } group.Go(func() error { - err := g.runChainIndexerV2(ctx, chainID) + err := g.runChainIndexer(ctx, chainID, g.listenersV2) if err != nil { return fmt.Errorf("could not runChainIndexer chain indexer for chain %d [v2]: %w", chainID, err) } @@ -236,65 +236,9 @@ func (g *Guard) startChainIndexers(ctx context.Context) (err error) { } //nolint:cyclop -func (g Guard) runChainIndexerV1(ctx context.Context, chainID int) (err error) { - chainListener := g.listenersV1[chainID] +func (g Guard) runChainIndexer(ctx context.Context, chainID int, listeners map[int]listener.ContractListener) (err error) { - parser, err := fastbridge.NewParser(chainListener.Address()) - if err != nil { - return fmt.Errorf("could not parse: %w", err) - } - - err = chainListener.Listen(ctx, func(parentCtx context.Context, log types.Log) (err error) { - et, parsedEvent, ok := parser.ParseEvent(log) - // handle unknown event - if !ok { - if len(log.Topics) != 0 { - logger.Warnf("unknown event %s", log.Topics[0]) - } - return nil - } - - ctx, span := g.metrics.Tracer().Start(parentCtx, fmt.Sprintf("handleLog-%s", et), trace.WithAttributes( - attribute.String(metrics.TxHash, log.TxHash.String()), - attribute.Int(metrics.Origin, chainID), - attribute.String(metrics.Contract, log.Address.String()), - attribute.String("block_hash", log.BlockHash.String()), - attribute.Int64("block_number", int64(log.BlockNumber)), - )) - - defer func() { - metrics.EndSpanWithErr(span, err) - }() - - switch event := parsedEvent.(type) { - case *fastbridge.FastBridgeBridgeRequested: - err = g.handleBridgeRequestedLog(ctx, event, chainID) - if err != nil { - return fmt.Errorf("could not handle request: %w", err) - } - case *fastbridge.FastBridgeBridgeProofProvided: - err = g.handleProofProvidedLog(ctx, event, chainID) - if err != nil { - return fmt.Errorf("could not handle request: %w", err) - } - case *fastbridge.FastBridgeBridgeProofDisputed: - err = g.handleProofDisputedLog(ctx, event) - if err != nil { - return fmt.Errorf("could not handle request: %w", err) - } - } - - return nil - }) - if err != nil { - return fmt.Errorf("listener failed: %w", err) - } - return nil -} - -//nolint:cyclop,gosec -func (g Guard) runChainIndexerV2(ctx context.Context, chainID int) (err error) { - chainListener := g.listenersV2[chainID] + chainListener := listeners[chainID] parser, err := fastbridgev2.NewParser(chainListener.Address()) if err != nil { @@ -325,40 +269,17 @@ func (g Guard) runChainIndexerV2(ctx context.Context, chainID int) (err error) { switch event := parsedEvent.(type) { case *fastbridgev2.FastBridgeV2BridgeRequested: - v1Event := &fastbridge.FastBridgeBridgeRequested{ - TransactionId: event.TransactionId, - Sender: event.Sender, - Request: event.Request, - DestChainId: event.DestChainId, - OriginToken: event.OriginToken, - DestToken: event.DestToken, - DestAmount: event.DestAmount, - SendChainGas: event.SendChainGas, - Raw: event.Raw, - } - err = g.handleBridgeRequestedLog(ctx, v1Event, chainID) + err = g.handleBridgeRequestedLog(ctx, event, chainID) if err != nil { return fmt.Errorf("could not handle request: %w", err) } - // following events match ABIs exactly, so no need to differentiate case *fastbridgev2.FastBridgeV2BridgeProofProvided: - v1Event := &fastbridge.FastBridgeBridgeProofProvided{ - TransactionId: event.TransactionId, - Relayer: event.Relayer, - TransactionHash: event.TransactionHash, - Raw: event.Raw, - } - err = g.handleProofProvidedLog(ctx, v1Event, chainID) + err = g.handleProofProvidedLog(ctx, event, chainID) if err != nil { return fmt.Errorf("could not handle request: %w", err) } case *fastbridgev2.FastBridgeV2BridgeProofDisputed: - v1Event := &fastbridge.FastBridgeBridgeProofDisputed{ - TransactionId: event.TransactionId, - Relayer: event.Relayer, - Raw: event.Raw, - } - err = g.handleProofDisputedLog(ctx, v1Event) + err = g.handleProofDisputedLog(ctx, event) if err != nil { return fmt.Errorf("could not handle request: %w", err) } diff --git a/services/rfq/guard/service/handlers.go b/services/rfq/guard/service/handlers.go index c140316727..8bb7c3b746 100644 --- a/services/rfq/guard/service/handlers.go +++ b/services/rfq/guard/service/handlers.go @@ -23,7 +23,7 @@ import ( var maxRPCRetryTime = 15 * time.Second -func (g *Guard) handleBridgeRequestedLog(parentCtx context.Context, req *fastbridge.FastBridgeBridgeRequested, chainID int) (err error) { +func (g *Guard) handleBridgeRequestedLog(parentCtx context.Context, req *fastbridgev2.FastBridgeV2BridgeRequested, chainID int) (err error) { ctx, span := g.metrics.Tracer().Start(parentCtx, "handleBridgeRequestedLog-guard", trace.WithAttributes( attribute.Int(metrics.Origin, chainID), attribute.String("transaction_id", hexutil.Encode(req.TransactionId[:])), @@ -68,7 +68,7 @@ func (g *Guard) handleBridgeRequestedLog(parentCtx context.Context, req *fastbri } //nolint:gosec -func (g *Guard) handleProofProvidedLog(parentCtx context.Context, event *fastbridge.FastBridgeBridgeProofProvided, chainID int) (err error) { +func (g *Guard) handleProofProvidedLog(parentCtx context.Context, event *fastbridgev2.FastBridgeV2BridgeProofProvided, chainID int) (err error) { ctx, span := g.metrics.Tracer().Start(parentCtx, "handleProofProvidedLog-guard", trace.WithAttributes( attribute.Int(metrics.Origin, chainID), attribute.String("transaction_id", hexutil.Encode(event.TransactionId[:])), @@ -95,7 +95,7 @@ func (g *Guard) handleProofProvidedLog(parentCtx context.Context, event *fastbri return nil } -func (g *Guard) handleProofDisputedLog(parentCtx context.Context, event *fastbridge.FastBridgeBridgeProofDisputed) (err error) { +func (g *Guard) handleProofDisputedLog(parentCtx context.Context, event *fastbridgev2.FastBridgeV2BridgeProofDisputed) (err error) { ctx, span := g.metrics.Tracer().Start(parentCtx, "handleProofDisputedLog-guard", trace.WithAttributes( attribute.String("transaction_id", hexutil.Encode(event.TransactionId[:])), )) @@ -211,6 +211,7 @@ func (g *Guard) disputeV2(ctx context.Context, proven *guarddb.PendingProven, br //nolint:cyclop func (g *Guard) isProveValid(ctx context.Context, proven *guarddb.PendingProven, bridgeRequest *guarddb.BridgeRequest) (bool, error) { + // get the receipt for this tx on dest chain chainClient, err := g.client.GetChainClient(ctx, int(bridgeRequest.Transaction.DestChainId)) if err != nil { @@ -225,83 +226,35 @@ func (g *Guard) isProveValid(ctx context.Context, proven *guarddb.PendingProven, return false, fmt.Errorf("could not get receipt: %w", err) } - var valid bool + var rfqContractAddr string + if g.isV2Address(int(bridgeRequest.Transaction.OriginChainId), proven.FastBridgeAddress) { - valid, err = g.isProveValidV2(ctx, proven, bridgeRequest, receipt) + rfqContractAddr, err = g.cfg.GetRFQAddressV2(int(bridgeRequest.Transaction.DestChainId)) if err != nil { - return false, fmt.Errorf("could not check prove validity v2: %w", err) + return false, fmt.Errorf("could not get rfq address v2: %w", err) } } else { - valid, err = g.isProveValidV1(ctx, proven, bridgeRequest, receipt) + v1addr, err := g.cfg.GetRFQAddressV1(int(bridgeRequest.Transaction.DestChainId)) if err != nil { - return false, fmt.Errorf("could not check prove validity v1: %w", err) + return false, fmt.Errorf("could not get rfq address v1: %w", err) } + rfqContractAddr = *v1addr } - return valid, nil -} - -func (g *Guard) isProveValidV1(ctx context.Context, proven *guarddb.PendingProven, bridgeRequest *guarddb.BridgeRequest, receipt *types.Receipt) (bool, error) { - span := trace.SpanFromContext(ctx) + var valid bool + valid, err = g.isProveValidParse(ctx, proven, bridgeRequest, receipt, rfqContractAddr) - rfqAddr, err := g.cfg.GetRFQAddressV1(int(bridgeRequest.Transaction.DestChainId)) - if err != nil { - return false, fmt.Errorf("could not get rfq address v1: %w", err) - } - if rfqAddr == nil { - return false, errors.New("rfq address v1 is nil") - } - parser, err := fastbridge.NewParser(common.HexToAddress(*rfqAddr)) if err != nil { - return false, fmt.Errorf("could not get parser: %w", err) - } - - for _, log := range receipt.Logs { - _, parsedEvent, ok := parser.ParseEvent(*log) - if !ok { - continue - } - - if log.Address != common.HexToAddress(*rfqAddr) { - span.AddEvent(fmt.Sprintf("log address %s does not match rfq address %s", log.Address.Hex(), *rfqAddr)) - continue - } - - event, ok := parsedEvent.(*fastbridge.FastBridgeBridgeRelayed) - if !ok { - span.AddEvent("event is not a BridgeRelayed event") - continue - } - - if event.Relayer != proven.RelayerAddress { - span.AddEvent(fmt.Sprintf("relayer address %s does not match prover address %s", event.Relayer.Hex(), proven.RelayerAddress.Hex())) - continue - } - - details := relayDetails{ - TransactionID: event.TransactionId, - OriginAmount: event.OriginAmount, - DestAmount: event.DestAmount, - OriginChainID: event.OriginChainId, - To: event.To, - OriginToken: event.OriginToken, - DestToken: event.DestToken, - } - - return relayMatchesBridgeRequest(details, bridgeRequest), nil + return false, fmt.Errorf("could not parse proof for validity: %w", err) } - return false, nil + return valid, nil } -func (g *Guard) isProveValidV2(ctx context.Context, proven *guarddb.PendingProven, bridgeRequest *guarddb.BridgeRequest, receipt *types.Receipt) (bool, error) { +func (g *Guard) isProveValidParse(ctx context.Context, proven *guarddb.PendingProven, bridgeRequest *guarddb.BridgeRequest, receipt *types.Receipt, rfqContractAddr string) (bool, error) { span := trace.SpanFromContext(ctx) - rfqAddr, err := g.cfg.GetRFQAddressV2(int(bridgeRequest.Transaction.DestChainId)) - if err != nil { - return false, fmt.Errorf("could not get rfq address v2: %w", err) - } - parser, err := fastbridgev2.NewParser(common.HexToAddress(rfqAddr)) + parser, err := fastbridgev2.NewParser(common.HexToAddress(rfqContractAddr)) if err != nil { return false, fmt.Errorf("could not get parser: %w", err) } @@ -312,8 +265,8 @@ func (g *Guard) isProveValidV2(ctx context.Context, proven *guarddb.PendingProve continue } - if log.Address != common.HexToAddress(rfqAddr) { - span.AddEvent(fmt.Sprintf("log address %s does not match rfq address %s", log.Address.Hex(), rfqAddr)) + if log.Address != common.HexToAddress(rfqContractAddr) { + span.AddEvent(fmt.Sprintf("log address %s does not match rfq address %s", log.Address.Hex(), rfqContractAddr)) continue } From 5d9844f5c02bc5dd908646f50b93cc277b8e137a Mon Sep 17 00:00:00 2001 From: parodime Date: Sat, 2 Nov 2024 09:59:05 -0400 Subject: [PATCH 02/11] lint --- services/rfq/guard/service/guard.go | 1 - 1 file changed, 1 deletion(-) diff --git a/services/rfq/guard/service/guard.go b/services/rfq/guard/service/guard.go index 97c19f1304..b2423472f2 100644 --- a/services/rfq/guard/service/guard.go +++ b/services/rfq/guard/service/guard.go @@ -237,7 +237,6 @@ func (g *Guard) startChainIndexers(ctx context.Context) (err error) { //nolint:cyclop func (g Guard) runChainIndexer(ctx context.Context, chainID int, listeners map[int]listener.ContractListener) (err error) { - chainListener := listeners[chainID] parser, err := fastbridgev2.NewParser(chainListener.Address()) From e4c6e21cc3394ed6b19f4189823842cf8e56576f Mon Sep 17 00:00:00 2001 From: parodime Date: Sat, 2 Nov 2024 10:02:36 -0400 Subject: [PATCH 03/11] typo --- services/rfq/guard/guardconfig/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/rfq/guard/guardconfig/config.go b/services/rfq/guard/guardconfig/config.go index e9d11bce76..0e49c47d06 100644 --- a/services/rfq/guard/guardconfig/config.go +++ b/services/rfq/guard/guardconfig/config.go @@ -77,10 +77,10 @@ func (c Config) Validate() (err error) { } addrV2, err := c.GetRFQAddressV2(chainID) if err != nil { - return fmt.Errorf("could not get v1 rfq address: %w", err) + return fmt.Errorf("could not get v2 rfq address: %w", err) } if !common.IsHexAddress(addrV2) { - return fmt.Errorf("invalid rfq v1 address: %s", addrV2) + return fmt.Errorf("invalid rfq v2 address: %s", addrV2) } } From 5f162af32f7c633df1c249f625d5be01879d7114 Mon Sep 17 00:00:00 2001 From: parodime Date: Sat, 2 Nov 2024 10:06:45 -0400 Subject: [PATCH 04/11] addtl nil check on deref --- services/rfq/guard/service/handlers.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/rfq/guard/service/handlers.go b/services/rfq/guard/service/handlers.go index 8bb7c3b746..0e6ae0e6a4 100644 --- a/services/rfq/guard/service/handlers.go +++ b/services/rfq/guard/service/handlers.go @@ -238,6 +238,9 @@ func (g *Guard) isProveValid(ctx context.Context, proven *guarddb.PendingProven, if err != nil { return false, fmt.Errorf("could not get rfq address v1: %w", err) } + if v1addr == nil { + return false, fmt.Errorf("rfq address v1 is nil") + } rfqContractAddr = *v1addr } From bce4c82faaa1ea7ac153e435bf67044ba76e7a82 Mon Sep 17 00:00:00 2001 From: parodime Date: Mon, 4 Nov 2024 11:56:54 -0500 Subject: [PATCH 05/11] prove multicalled relays [SLT-422] --- services/rfq/guard/service/handlers.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/rfq/guard/service/handlers.go b/services/rfq/guard/service/handlers.go index 0e6ae0e6a4..0d1f75c101 100644 --- a/services/rfq/guard/service/handlers.go +++ b/services/rfq/guard/service/handlers.go @@ -294,9 +294,13 @@ func (g *Guard) isProveValidParse(ctx context.Context, proven *guarddb.PendingPr DestToken: event.DestToken, } - return relayMatchesBridgeRequest(details, bridgeRequest), nil + // if we find a relay that matches the bridge, then we can return true. otherwise continue looking through any remaining logs. + if relayMatchesBridgeRequest(details, bridgeRequest) { + return true, nil + } } + // if we have reached this point, then every log has been examined & none found suitable to validate the proof return false, nil } From 6d58acdab2da504012d286ad460973155c0600a3 Mon Sep 17 00:00:00 2001 From: parodime Date: Mon, 4 Nov 2024 13:22:09 -0500 Subject: [PATCH 06/11] runChainListener tweak. Parse proof relabel --- services/rfq/guard/service/guard.go | 8 +++----- services/rfq/guard/service/handlers.go | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/services/rfq/guard/service/guard.go b/services/rfq/guard/service/guard.go index b2423472f2..ff08ed5826 100644 --- a/services/rfq/guard/service/guard.go +++ b/services/rfq/guard/service/guard.go @@ -210,7 +210,7 @@ func (g *Guard) startChainIndexers(ctx context.Context) (err error) { } if v1Addr != nil { group.Go(func() error { - err := g.runChainIndexer(ctx, chainID, g.listenersV1) + err := g.runChainIndexer(ctx, chainID, g.listenersV1[chainID]) if err != nil { return fmt.Errorf("could not runChainIndexer chain indexer for chain %d [v1]: %w", chainID, err) } @@ -219,7 +219,7 @@ func (g *Guard) startChainIndexers(ctx context.Context) (err error) { } group.Go(func() error { - err := g.runChainIndexer(ctx, chainID, g.listenersV2) + err := g.runChainIndexer(ctx, chainID, g.listenersV2[chainID]) if err != nil { return fmt.Errorf("could not runChainIndexer chain indexer for chain %d [v2]: %w", chainID, err) } @@ -236,9 +236,7 @@ func (g *Guard) startChainIndexers(ctx context.Context) (err error) { } //nolint:cyclop -func (g Guard) runChainIndexer(ctx context.Context, chainID int, listeners map[int]listener.ContractListener) (err error) { - chainListener := listeners[chainID] - +func (g Guard) runChainIndexer(ctx context.Context, chainID int, chainListener listener.ContractListener) (err error) { parser, err := fastbridgev2.NewParser(chainListener.Address()) if err != nil { return fmt.Errorf("could not parse: %w", err) diff --git a/services/rfq/guard/service/handlers.go b/services/rfq/guard/service/handlers.go index 0d1f75c101..917f865b49 100644 --- a/services/rfq/guard/service/handlers.go +++ b/services/rfq/guard/service/handlers.go @@ -245,16 +245,16 @@ func (g *Guard) isProveValid(ctx context.Context, proven *guarddb.PendingProven, } var valid bool - valid, err = g.isProveValidParse(ctx, proven, bridgeRequest, receipt, rfqContractAddr) + valid, err = g.parseProvenTransaction(ctx, proven, bridgeRequest, receipt, rfqContractAddr) if err != nil { - return false, fmt.Errorf("could not parse proof for validity: %w", err) + return false, fmt.Errorf("could not parse proven transaction for validity: %w", err) } return valid, nil } -func (g *Guard) isProveValidParse(ctx context.Context, proven *guarddb.PendingProven, bridgeRequest *guarddb.BridgeRequest, receipt *types.Receipt, rfqContractAddr string) (bool, error) { +func (g *Guard) parseProvenTransaction(ctx context.Context, proven *guarddb.PendingProven, bridgeRequest *guarddb.BridgeRequest, receipt *types.Receipt, rfqContractAddr string) (bool, error) { span := trace.SpanFromContext(ctx) parser, err := fastbridgev2.NewParser(common.HexToAddress(rfqContractAddr)) From 9ab744ad891bae8ac4cd0e2f47ce82ff5026e6db Mon Sep 17 00:00:00 2001 From: parodime Date: Mon, 4 Nov 2024 13:58:37 -0500 Subject: [PATCH 07/11] removing fastbridgev1 BridgeRequested & refs --- services/rfq/guard/guarddb/base/model.go | 4 ++-- services/rfq/guard/guarddb/db.go | 4 ++-- services/rfq/guard/service/handlers.go | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/services/rfq/guard/guarddb/base/model.go b/services/rfq/guard/guarddb/base/model.go index b61ed107da..ea28b19dbd 100644 --- a/services/rfq/guard/guarddb/base/model.go +++ b/services/rfq/guard/guarddb/base/model.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/synapsecns/sanguine/core/dbcommon" - "github.com/synapsecns/sanguine/services/rfq/contracts/fastbridge" + "github.com/synapsecns/sanguine/services/rfq/contracts/fastbridgev2" "github.com/synapsecns/sanguine/services/rfq/guard/guarddb" ) @@ -168,7 +168,7 @@ func (b BridgeRequestModel) ToBridgeRequest() (*guarddb.BridgeRequest, error) { return &guarddb.BridgeRequest{ TransactionID: transactionID, RawRequest: req, - Transaction: fastbridge.IFastBridgeBridgeTransaction{ + Transaction: fastbridgev2.IFastBridgeBridgeTransaction{ OriginChainId: b.OriginChainID, DestChainId: b.DestChainID, OriginSender: common.HexToAddress(b.OriginSender), diff --git a/services/rfq/guard/guarddb/db.go b/services/rfq/guard/guarddb/db.go index a94ad8182f..9e62fbf380 100644 --- a/services/rfq/guard/guarddb/db.go +++ b/services/rfq/guard/guarddb/db.go @@ -7,7 +7,7 @@ import ( "fmt" "github.com/synapsecns/sanguine/ethergo/listener/db" - "github.com/synapsecns/sanguine/services/rfq/contracts/fastbridge" + "github.com/synapsecns/sanguine/services/rfq/contracts/fastbridgev2" "github.com/ethereum/go-ethereum/common" "github.com/synapsecns/sanguine/core/dbcommon" @@ -53,7 +53,7 @@ type Service interface { // BridgeRequest is the bridge request object. type BridgeRequest struct { TransactionID [32]byte - Transaction fastbridge.IFastBridgeBridgeTransaction + Transaction fastbridgev2.IFastBridgeBridgeTransaction RawRequest []byte } diff --git a/services/rfq/guard/service/handlers.go b/services/rfq/guard/service/handlers.go index 917f865b49..35102cad9c 100644 --- a/services/rfq/guard/service/handlers.go +++ b/services/rfq/guard/service/handlers.go @@ -14,7 +14,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/synapsecns/sanguine/core/metrics" "github.com/synapsecns/sanguine/core/retry" - "github.com/synapsecns/sanguine/services/rfq/contracts/fastbridge" "github.com/synapsecns/sanguine/services/rfq/contracts/fastbridgev2" "github.com/synapsecns/sanguine/services/rfq/guard/guarddb" "go.opentelemetry.io/otel/attribute" @@ -37,14 +36,14 @@ func (g *Guard) handleBridgeRequestedLog(parentCtx context.Context, req *fastbri return fmt.Errorf("could not get correct omnirpc client: %w", err) } - fastBridge, err := fastbridge.NewFastBridgeRef(req.Raw.Address, originClient) + fastBridgev2, err := fastbridgev2.NewFastBridgeV2Ref(req.Raw.Address, originClient) if err != nil { return fmt.Errorf("could not get correct fast bridge: %w", err) } - var bridgeTx fastbridge.IFastBridgeBridgeTransaction + var bridgeTx fastbridgev2.IFastBridgeBridgeTransaction call := func(ctx context.Context) error { - bridgeTx, err = fastBridge.GetBridgeTransaction(&bind.CallOpts{Context: ctx}, req.Request) + bridgeTx, err = fastBridgev2.GetBridgeTransaction(&bind.CallOpts{Context: ctx}, req.Request) if err != nil { return fmt.Errorf("could not get bridge transaction: %w", err) } From c8139b9128295f9253ec6c1e76eb9c1354bc632b Mon Sep 17 00:00:00 2001 From: parodime Date: Tue, 5 Nov 2024 11:51:14 -0500 Subject: [PATCH 08/11] test probe - revert guard listener label --- services/rfq/guard/service/guard.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/rfq/guard/service/guard.go b/services/rfq/guard/service/guard.go index ff08ed5826..4345b0f997 100644 --- a/services/rfq/guard/service/guard.go +++ b/services/rfq/guard/service/guard.go @@ -107,7 +107,7 @@ func NewGuard(ctx context.Context, metricHandler metrics.Handler, cfg guardconfi if err != nil { return nil, fmt.Errorf("could not get deploy block: %w", err) } - chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(rfqAddrV2), uint64(startBlock.Int64()), metricHandler, listener.WithName("guardListener")) + chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(rfqAddrV2), uint64(startBlock.Int64()), metricHandler, listener.WithName("guard")) if err != nil { return nil, fmt.Errorf("could not get chain listener: %w", err) } From 50ac219fa2e0bb1c7d824510a083565b008fd825 Mon Sep 17 00:00:00 2001 From: parodime Date: Tue, 5 Nov 2024 15:46:52 -0500 Subject: [PATCH 09/11] restore legacy listener "guard" label. Establish "guardV2" for new version --- ethergo/backends/anvil/anvil.go | 3 +++ services/rfq/guard/service/guard.go | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ethergo/backends/anvil/anvil.go b/ethergo/backends/anvil/anvil.go index 6bc14c3e3d..3a28485a2c 100644 --- a/ethergo/backends/anvil/anvil.go +++ b/ethergo/backends/anvil/anvil.go @@ -80,6 +80,9 @@ func NewAnvilBackend(ctx context.Context, t *testing.T, args *OptionBuilder) (*B return nil, fmt.Errorf("failed to build command args: %w", err) } + // this will silently fail if executing from a non-linux/amd64 architecture. + // you will see "connection" issues downstream as the container is not created. + // to solve - install qemu to enable docker emulation: apt-get install qemu qemu-user-static qemu-user binfmt-support runOptions := &dockertest.RunOptions{ Repository: "ghcr.io/foundry-rs/foundry", Tag: "nightly-1bac1b3d79243cea755800bf396c30a3d74741bf", diff --git a/services/rfq/guard/service/guard.go b/services/rfq/guard/service/guard.go index 4345b0f997..9c6afd7c30 100644 --- a/services/rfq/guard/service/guard.go +++ b/services/rfq/guard/service/guard.go @@ -82,7 +82,7 @@ func NewGuard(ctx context.Context, metricHandler metrics.Handler, cfg guardconfi if err != nil { return nil, fmt.Errorf("could not get deploy block: %w", err) } - chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(*rfqAddrV1), uint64(startBlock.Int64()), metricHandler, listener.WithName("guardListenerLegacy")) + chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(*rfqAddrV1), uint64(startBlock.Int64()), metricHandler, listener.WithName("guard")) if err != nil { return nil, fmt.Errorf("could not get chain listener: %w", err) } @@ -107,7 +107,7 @@ func NewGuard(ctx context.Context, metricHandler metrics.Handler, cfg guardconfi if err != nil { return nil, fmt.Errorf("could not get deploy block: %w", err) } - chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(rfqAddrV2), uint64(startBlock.Int64()), metricHandler, listener.WithName("guard")) + chainListener, err := listener.NewChainListener(chainClient, store, common.HexToAddress(rfqAddrV2), uint64(startBlock.Int64()), metricHandler, listener.WithName("guardV2")) if err != nil { return nil, fmt.Errorf("could not get chain listener: %w", err) } From a4346c4f7cd4cad213d2aee8a1f591febb86e7c8 Mon Sep 17 00:00:00 2001 From: parodime Date: Wed, 6 Nov 2024 03:24:07 -0500 Subject: [PATCH 10/11] poke to rerun w/o explorer check --- services/rfq/guard/service/guard.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/rfq/guard/service/guard.go b/services/rfq/guard/service/guard.go index 9c6afd7c30..efe9dae128 100644 --- a/services/rfq/guard/service/guard.go +++ b/services/rfq/guard/service/guard.go @@ -116,6 +116,7 @@ func NewGuard(ctx context.Context, metricHandler metrics.Handler, cfg guardconfi } // build submitter from config if one is not supplied + // if txSubmitter == nil { sg, err := signerConfig.SignerFromConfig(ctx, cfg.Signer) if err != nil { From 62320d0b933237d60051cf943ba479cf031de196 Mon Sep 17 00:00:00 2001 From: parodime Date: Wed, 6 Nov 2024 04:11:00 -0500 Subject: [PATCH 11/11] removing dev comments --- ethergo/backends/anvil/anvil.go | 3 --- services/rfq/guard/service/guard.go | 1 - 2 files changed, 4 deletions(-) diff --git a/ethergo/backends/anvil/anvil.go b/ethergo/backends/anvil/anvil.go index 3a28485a2c..6bc14c3e3d 100644 --- a/ethergo/backends/anvil/anvil.go +++ b/ethergo/backends/anvil/anvil.go @@ -80,9 +80,6 @@ func NewAnvilBackend(ctx context.Context, t *testing.T, args *OptionBuilder) (*B return nil, fmt.Errorf("failed to build command args: %w", err) } - // this will silently fail if executing from a non-linux/amd64 architecture. - // you will see "connection" issues downstream as the container is not created. - // to solve - install qemu to enable docker emulation: apt-get install qemu qemu-user-static qemu-user binfmt-support runOptions := &dockertest.RunOptions{ Repository: "ghcr.io/foundry-rs/foundry", Tag: "nightly-1bac1b3d79243cea755800bf396c30a3d74741bf", diff --git a/services/rfq/guard/service/guard.go b/services/rfq/guard/service/guard.go index efe9dae128..9c6afd7c30 100644 --- a/services/rfq/guard/service/guard.go +++ b/services/rfq/guard/service/guard.go @@ -116,7 +116,6 @@ func NewGuard(ctx context.Context, metricHandler metrics.Handler, cfg guardconfi } // build submitter from config if one is not supplied - // if txSubmitter == nil { sg, err := signerConfig.SignerFromConfig(ctx, cfg.Signer) if err != nil {