-
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 1 commit
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 @@ 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) | ||
parodime marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
} | ||
|
||
|
@@ -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 | ||
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 @@ 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, | ||
} | ||
} | ||
|
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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("could not runChainIndexer chain indexer for chain %d [v2]: %w", chainID, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -236,65 +236,9 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//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) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ChiTimesChi marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 @@ 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) { | ||
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 @@ 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 | ||
parodime marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
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) { | ||
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. Maybe rename this one? 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. agree |
||
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 | ||
} | ||
|
||
|
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