-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
proposed mods for feat/guard-v2 [SLT-422] #3364
Changes from 6 commits
494e841
5d9844f
e4c6e21
5f162af
bce4c82
6d58acd
9ab744a
c8139b9
50ac219
a4346c4
62320d0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -34,10 +34,10 @@ | |
|
||
// 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 @@ | |
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 v2 rfq address: %w", err) | ||
} | ||
if !common.IsHexAddress(addrV2) { | ||
return fmt.Errorf("invalid rfq address: %s", addrV2) | ||
return fmt.Errorf("invalid rfq v2 address: %s", addrV2) | ||
} | ||
} | ||
|
||
|
@@ -96,7 +96,7 @@ | |
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) 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 | ||
Comment on lines
+108
to
+110
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Consider renaming GetRFQAddressV2. Since this method now returns the main RFQAddress and not a V2-specific address, the method name is misleading. Consider this change: -func (c Config) GetRFQAddressV2(chainID int) (string, error) {
+func (c Config) GetRFQAddress(chainID int) (string, error) {
|
||
} | ||
|
||
const defaultDBSelectorIntervalSeconds = 1 | ||
|
@@ -134,7 +134,7 @@ | |
for chainID, chainCfg := range relayerCfg.GetChains() { | ||
cfg.Chains[chainID] = ChainConfig{ | ||
RFQAddressV1: chainCfg.RFQAddressV1, | ||
RFQAddressV2: chainCfg.RFQAddress, | ||
RFQAddress: chainCfg.RFQAddress, | ||
Confirmations: chainCfg.FinalityConfirmations, | ||
} | ||
} | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -82,7 +82,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("could not get chain listener: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -107,7 +107,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Might want to do the versioned naming here (e.g. guardV2) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. my thought was this would eventually be "the" listener (ie: the only listener) and will be simpler to remove the "Legacy" one when we're done with it There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @parodime the chain listener is using its name to store its unique "latest handled block" in the DB: sanguine/ethergo/listener/db/store.go Lines 29 to 59 in 7c5c4f1
So for me it seems that we may want to preserve the old listener name when a new one is added, hence |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("could not get chain listener: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -210,7 +210,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if v1Addr != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
group.Go(func() error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
err := g.runChainIndexerV1(ctx, chainID) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
group.Go(func() error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
err := g.runChainIndexerV2(ctx, chainID) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
err := g.runChainIndexer(ctx, chainID, g.listenersV2[chainID]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Check for nil listener before starting V2 chain indexer The code starts the V2 chain indexer without verifying if the listener exists. If You can add a nil check before starting the chain indexer: if g.listenersV2[chainID] != nil {
group.Go(func() error {
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)
}
return nil
})
} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("could not runChainIndexer chain indexer for chain %d [v2]: %w", chainID, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -236,66 +236,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//nolint:cyclop | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (g Guard) runChainIndexerV1(ctx context.Context, chainID int) (err error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chainListener := g.listenersV1[chainID] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (g Guard) runChainIndexer(ctx context.Context, chainID int, chainListener listener.ContractListener) (err error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add defensive nil check for chainListener The function should verify that chainListener is not nil before proceeding to prevent potential runtime panics. func (g Guard) runChainIndexer(ctx context.Context, chainID int, chainListener listener.ContractListener) (err error) {
+ if chainListener == nil {
+ return fmt.Errorf("chain listener is nil for chain %d", chainID)
+ }
parser, err := fastbridgev2.NewParser(chainListener.Address()) 📝 Committable suggestion
Suggested change
🧰 Tools🪛 GitHub Check: codecov/patch[warning] 239-239: services/rfq/guard/service/guard.go#L239 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
parser, err := fastbridgev2.NewParser(chainListener.Address()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("could not parse: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -325,40 +266,17 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Inconsistent parameters in Unlike Apply this diff to include - err = g.handleProofDisputedLog(ctx, event)
+ err = g.handleProofDisputedLog(ctx, event, chainID) Also, update the
🧰 Tools🪛 GitHub Check: codecov/patch[warning] 279-279: services/rfq/guard/service/guard.go#L279 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("could not handle request: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+269
to
282
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Standardize event handler parameters and improve error messages. The event handling code has two issues:
Apply this diff: case *fastbridgev2.FastBridgeV2BridgeRequested:
err = g.handleBridgeRequestedLog(ctx, event, chainID)
if err != nil {
- return fmt.Errorf("could not handle request: %w", err)
+ return fmt.Errorf("could not handle bridge request event for chain %d: %w", chainID, err)
}
case *fastbridgev2.FastBridgeV2BridgeProofProvided:
err = g.handleProofProvidedLog(ctx, event, chainID)
if err != nil {
- return fmt.Errorf("could not handle request: %w", err)
+ return fmt.Errorf("could not handle proof provided event for chain %d: %w", chainID, err)
}
case *fastbridgev2.FastBridgeV2BridgeProofDisputed:
- err = g.handleProofDisputedLog(ctx, event)
+ err = g.handleProofDisputedLog(ctx, event, chainID)
if err != nil {
- return fmt.Errorf("could not handle request: %w", err)
+ return fmt.Errorf("could not handle proof disputed event for chain %d: %w", chainID, err)
} 📝 Committable suggestion
Suggested change
🧰 Tools🪛 GitHub Check: codecov/patch[warning] 269-269: services/rfq/guard/service/guard.go#L269 [warning] 274-274: services/rfq/guard/service/guard.go#L274 [warning] 279-279: services/rfq/guard/service/guard.go#L279 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,7 +23,7 @@ | |
|
||
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) { | ||
ChiTimesChi marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add test coverage for V2 event handlers The transition to FastBridgeV2 event types is a critical change that requires thorough testing to ensure correct event handling and maintain system reliability. Would you like assistance in generating comprehensive test cases for these event handlers? Also applies to: 70-70, 97-97 🧰 Tools🪛 GitHub Check: codecov/patch[warning] 25-25: services/rfq/guard/service/handlers.go#L25 |
||
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 @@ | |
} | ||
|
||
//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 @@ | |
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 @@ | |
|
||
//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,38 @@ | |
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) | ||
} | ||
if v1addr == nil { | ||
return false, fmt.Errorf("rfq address v1 is nil") | ||
} | ||
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.parseProvenTransaction(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) | ||
return false, fmt.Errorf("could not parse proven transaction for validity: %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, nil | ||
return valid, nil | ||
Comment on lines
+246
to
+253
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add test coverage for proof validation logic The refactored proof validation logic is well-structured but lacks test coverage. This is critical functionality that should be thoroughly tested. Would you like assistance in generating test cases for the proof validation scenarios? Also applies to: 257-303 🧰 Tools🪛 GitHub Check: codecov/patch[warning] 247-247: services/rfq/guard/service/handlers.go#L247 [warning] 254-254: services/rfq/guard/service/handlers.go#L254 |
||
} | ||
|
||
func (g *Guard) isProveValidV2(ctx context.Context, proven *guarddb.PendingProven, bridgeRequest *guarddb.BridgeRequest, receipt *types.Receipt) (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) | ||
|
||
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 +268,8 @@ | |
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 | ||
} | ||
|
||
|
@@ -338,9 +294,13 @@ | |
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 | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Update required: RFQAddressV2 references need to be modified
The consolidation of RFQAddress fields requires corresponding updates to the codebase. Several files still contain references to
RFQAddressV2
:services/rfq/guard/guardconfig/config.go
: 3 references including the methodGetRFQAddressV2
services/rfq/guard/service/handlers.go
: 1 reference in bridge request handlingservices/rfq/guard/service/guard.go
: 2 references in contract address retrievalThese references should be updated to use the new consolidated
RFQAddress
field to maintain consistency with the configuration changes.🔗 Analysis chain
LGTM! Verify impact of RFQAddress consolidation.
The struct changes improve clarity by marking V1 as legacy/optional and consolidating the primary RFQAddress field. This aligns well with the V2 transition.
Let's verify no direct references to the old RFQAddressV2 field remain:
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 620
Script:
Length of output: 923
Script:
Length of output: 88