-
Notifications
You must be signed in to change notification settings - Fork 32
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
add refunder to opbot #2838
add refunder to opbot #2838
Changes from 13 commits
b967398
544967f
a65c2bc
d14682e
b62cb02
97b4106
7a71c2d
3217f20
f6af4df
5f0b232
e28b400
dd73de3
2eba05a
07afb2a
7e5114b
27b8159
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 |
---|---|---|
|
@@ -2,10 +2,18 @@ | |
|
||
import ( | ||
"context" | ||
"fmt" | ||
"github.com/slack-io/slacker" | ||
"github.com/synapsecns/sanguine/contrib/opbot/config" | ||
"github.com/synapsecns/sanguine/contrib/opbot/signoz" | ||
"github.com/synapsecns/sanguine/core/dbcommon" | ||
"github.com/synapsecns/sanguine/core/metrics" | ||
signerConfig "github.com/synapsecns/sanguine/ethergo/signer/config" | ||
"github.com/synapsecns/sanguine/ethergo/signer/signer" | ||
"github.com/synapsecns/sanguine/ethergo/submitter" | ||
cctpSql "github.com/synapsecns/sanguine/services/cctp-relayer/db/sql" | ||
omnirpcClient "github.com/synapsecns/sanguine/services/omnirpc/client" | ||
"golang.org/x/sync/errgroup" | ||
) | ||
|
||
// Bot represents the bot server. | ||
|
@@ -15,10 +23,13 @@ | |
cfg config.Config | ||
signozClient *signoz.Client | ||
signozEnabled bool | ||
rpcClient omnirpcClient.RPCClient | ||
signer signer.Signer | ||
submitter submitter.TransactionSubmitter | ||
} | ||
|
||
// NewBot creates a new bot server. | ||
func NewBot(handler metrics.Handler, cfg config.Config) Bot { | ||
func NewBot(handler metrics.Handler, cfg config.Config) *Bot { | ||
server := slacker.NewClient(cfg.SlackBotToken, cfg.SlackAppToken) | ||
bot := Bot{ | ||
handler: handler, | ||
|
@@ -32,10 +43,12 @@ | |
bot.signozEnabled = true | ||
} | ||
|
||
bot.rpcClient = omnirpcClient.NewOmnirpcClient(cfg.OmniRPCURL, handler, omnirpcClient.WithCaptureReqRes()) | ||
|
||
Comment on lines
+46
to
+47
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 tests for the new functionality. The Do you want me to generate the unit testing code or open a GitHub issue to track this task? ToolsGitHub Check: codecov/patch
|
||
bot.addMiddleware(bot.tracingMiddleware(), bot.metricsMiddleware()) | ||
bot.addCommands(bot.traceCommand(), bot.rfqLookupCommand()) | ||
bot.addCommands(bot.traceCommand(), bot.rfqLookupCommand(), bot.rfqRefund()) | ||
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 tests for the new functionality. The addition of the Do you want me to generate the unit testing code or open a GitHub issue to track this task? ToolsGitHub Check: codecov/patch
|
||
|
||
return bot | ||
return &bot | ||
} | ||
|
||
func (b *Bot) addMiddleware(middlewares ...slacker.CommandMiddlewareHandler) { | ||
|
@@ -53,6 +66,33 @@ | |
// Start starts the bot server. | ||
// nolint: wrapcheck | ||
func (b *Bot) Start(ctx context.Context) error { | ||
var err error | ||
b.signer, err = signerConfig.SignerFromConfig(ctx, b.cfg.Signer) | ||
if err != nil { | ||
return fmt.Errorf("failed to create signer: %w", err) | ||
Comment on lines
+70
to
+72
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. 🧠 logic: Error handling for signer creation should be reviewed to ensure it covers all edge cases.
Comment on lines
+70
to
+72
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. 🧠 logic: Error handling for signer creation should be reviewed to ensure it covers all edge cases. |
||
} | ||
Comment on lines
+69
to
+73
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 tests for the new functionality. The initialization of the signer lacks test coverage. Ensure that tests are added to cover this initialization. Do you want me to generate the unit testing code or open a GitHub issue to track this task? ToolsGitHub Check: codecov/patch
|
||
|
||
dbType, err := dbcommon.DBTypeFromString(b.cfg.Database.Type) | ||
if err != nil { | ||
return fmt.Errorf("could not get db type: %w", err) | ||
Comment on lines
+75
to
+77
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. 🧠 logic: Error handling for database type conversion should be reviewed to ensure it covers all edge cases.
Comment on lines
+75
to
+77
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. 🧠 logic: Error handling for database type conversion should be reviewed to ensure it covers all edge cases. |
||
} | ||
Comment on lines
+75
to
+78
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 tests for the new functionality. The database connection lacks test coverage. Ensure that tests are added to cover this functionality. Do you want me to generate the unit testing code or open a GitHub issue to track this task? ToolsGitHub Check: codecov/patch
|
||
|
||
store, err := cctpSql.Connect(ctx, dbType, b.cfg.Database.DSN, b.handler) | ||
if err != nil { | ||
return fmt.Errorf("could not connect to database: %w", err) | ||
Comment on lines
+80
to
+82
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. 🧠 logic: Error handling for database connection should be reviewed to ensure it covers all edge cases.
Comment on lines
+80
to
+82
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. 🧠 logic: Error handling for database connection should be reviewed to ensure it covers all edge cases. |
||
} | ||
Comment on lines
+80
to
+83
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 tests for the new functionality. The connection to the database lacks test coverage. Ensure that tests are added to cover this functionality. Do you want me to generate the unit testing code or open a GitHub issue to track this task? ToolsGitHub Check: codecov/patch
|
||
|
||
b.submitter = submitter.NewTransactionSubmitter(b.handler, b.signer, b.rpcClient, store.SubmitterDB(), &b.cfg.SubmitterConfig) | ||
|
||
g, ctx := errgroup.WithContext(ctx) | ||
g.Go(func() error { | ||
return b.submitter.Start(ctx) | ||
}) | ||
Comment on lines
+85
to
+90
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 tests for the new functionality. The initialization and starting of the submitter lack test coverage. Ensure that tests are added to cover this functionality. Do you want me to generate the unit testing code or open a GitHub issue to track this task? ToolsGitHub Check: codecov/patch
|
||
|
||
g.Go(func() error { | ||
return b.server.Listen(ctx) | ||
}) | ||
Comment on lines
+92
to
+94
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 tests for the new functionality. The starting of the server lacks test coverage. Ensure that tests are added to cover this functionality. Do you want me to generate the unit testing code or open a GitHub issue to track this task? ToolsGitHub Check: codecov/patch
|
||
|
||
// nolint: wrapcheck | ||
return b.server.Listen(ctx) | ||
return g.Wait() | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -3,16 +3,23 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
package botmd | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"context" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/ethereum/go-ethereum/common" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/ethereum/go-ethereum/core/types" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hako/durafmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/slack-go/slack" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/slack-io/slacker" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/contrib/opbot/signoz" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/ethergo/chaindata" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
rfqClient "github.com/synapsecns/sanguine/services/rfq/api/client" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/services/rfq/contracts/fastbridge" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/services/rfq/relayer/relapi" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"log" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"math/big" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"regexp" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"strconv" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"strings" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"sync" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"time" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -239,6 +246,116 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (b *Bot) rfqRefund() *slacker.CommandDefinition { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return &slacker.CommandDefinition{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Command: "refund <tx> <origin_chainid>", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description: "refund a quote request", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Examples: []string{"refund 0x1234"}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Handler: func(ctx *slacker.CommandContext) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client, err := rfqClient.NewUnauthenticatedClient(b.handler, b.cfg.RFQApiURL) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Printf("error creating rfq client: %v\n", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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. Reduce the cognitive complexity of the The function has a high cognitive complexity (46). Consider refactoring to break down the function into smaller, more manageable functions. func (b *Bot) rfqRefund() *slacker.CommandDefinition {
return &slacker.CommandDefinition{
Command: "refund <tx> <origin_chainid>",
Description: "refund a quote request",
Examples: []string{"refund 0x1234"},
Handler: func(ctx *slacker.CommandContext) {
if err := b.handleRFQRefund(ctx); err != nil {
log.Println(err)
}
},
}
}
func (b *Bot) handleRFQRefund(ctx *slacker.CommandContext) error {
client, err := rfqClient.NewUnauthenticatedClient(b.handler, b.cfg.RFQApiURL)
if err != nil {
log.Printf("error creating rfq client: %v\n", err)
return err
}
contracts, err := client.GetRFQContracts(ctx.Context())
if err != nil {
log.Printf("error fetching rfq contracts: %v\n", err)
_, err := ctx.Response().Reply("error fetching rfq contracts")
if err != nil {
return err
}
return err
}
tx := stripLinks(ctx.Request().Param("tx"))
if len(tx) == 0 {
_, err := ctx.Response().Reply("please provide a tx hash")
if err != nil {
log.Println(err)
}
return nil
}
originChainID, err := b.getOriginChainID(ctx)
if err != nil {
return err
}
chainClient, err := b.rpcClient.GetChainClient(ctx.Context(), originChainID)
if err != nil {
log.Printf("error getting chain client: %v\n", err)
return err
}
contractAddress, ok := contracts.Contracts[uint32(originChainID)]
if !ok {
_, err := ctx.Response().Reply("contract address not found")
if err != nil {
log.Println(err)
}
return nil
}
fastBridgeHandle, err := fastbridge.NewFastBridge(common.HexToAddress(contractAddress), chainClient)
if err != nil {
log.Printf("error creating fast bridge: %v\n", err)
return err
}
return b.submitRefund(ctx, fastBridgeHandle, tx, originChainID)
}
func (b *Bot) getOriginChainID(ctx *slacker.CommandContext) (int, error) {
originChainIDStr := ctx.Request().Param("origin_chainid")
if len(originChainIDStr) == 0 {
_, err := ctx.Response().Reply("please provide an origin chain id")
if err != nil {
log.Println(err)
}
return 0, nil
}
originChainID, err := strconv.Atoi(convertChainName(originChainIDStr))
if err != nil {
_, err := ctx.Response().Reply("origin_chainid must be a number")
if err != nil {
log.Println(err)
}
return 0, err
}
return originChainID, nil
}
func (b *Bot) submitRefund(ctx *slacker.CommandContext, fastBridgeHandle *fastbridge.FastBridgeTransactor, tx string, originChainID int) error {
for _, relayer := range b.cfg.RelayerURLS {
relClient := relapi.NewRelayerClient(b.handler, relayer)
rawRequest, err := getQuoteRequest(ctx.Context(), relClient, tx)
if err != nil {
_, err := ctx.Response().Reply("error fetching quote request")
if err != nil {
log.Println(err)
}
return err
}
nonce, err := b.submitter.SubmitTransaction(ctx.Context(), big.NewInt(int64(originChainID)), func(transactor *bind.TransactOpts) (*types.Transaction, error) {
return fastBridgeHandle.Refund(transactor, common.Hex2Bytes(rawRequest.QuoteRequestRaw))
})
if err != nil {
log.Printf("error submitting refund: %v\n", err)
continue
}
if _, err := ctx.Response().Reply(fmt.Sprintf("refund submitted with nonce %d", nonce)); err != nil {
log.Println(err)
}
return nil
}
return nil
} ToolsGitHub Check: codecov/patch
GitHub Check: Lint (contrib/opbot)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
contracts, err := client.GetRFQContracts(ctx.Context()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Printf("error fetching rfq contracts: %v\n", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err = ctx.Response().Reply("error fetching rfq contracts") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tx := stripLinks(ctx.Request().Param("tx")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(tx) == 0 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("please provide a tx hash") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
originChainIDStr := ctx.Request().Param("origin_chainid") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(originChainIDStr) == 0 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("please provide an origin chain id") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
originChainID, err := strconv.Atoi(convertChainName(originChainIDStr)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("origin_chainid must be a number") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
chainClient, err := b.rpcClient.GetChainClient(ctx.Context(), originChainID) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Printf("error getting chain client: %v\n", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
contractAddress, ok := contracts.Contracts[uint32(originChainID)] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if !ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("contract address not found") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fastBridgeHandle, err := fastbridge.NewFastBridge(common.HexToAddress(contractAddress), chainClient) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Printf("error creating fast bridge: %v\n", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for _, relayer := range b.cfg.RelayerURLS { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
relClient := relapi.NewRelayerClient(b.handler, relayer) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
rawRequest, err := getQuoteRequest(ctx.Context(), relClient, tx) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("error fetching quote request") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if rawRequest.OriginChainID != uint32(originChainID) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("origin chain id does not match") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
nonce, err := b.submitter.SubmitTransaction(ctx.Context(), big.NewInt(int64(originChainID)), func(transactor *bind.TransactOpts) (tx *types.Transaction, err error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fastBridgeHandle.Refund(transactor, common.Hex2Bytes(rawRequest.QuoteRequestRaw)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Check failure on line 341 in contrib/opbot/botmd/commands.go GitHub Actions / Lint (contrib/opbot)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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. Wrap the error returned from the external package. The error returned from - return fastBridgeHandle.Refund(transactor, common.Hex2Bytes(rawRequest.QuoteRequestRaw))
+ tx, err := fastBridgeHandle.Refund(transactor, common.Hex2Bytes(rawRequest.QuoteRequestRaw))
+ if err != nil {
+ return nil, fmt.Errorf("failed to refund: %w", err)
+ }
+ return tx, nil Committable suggestion
Suggested change
ToolsGitHub Check: Lint (contrib/opbot)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Printf("error submitting refund: %v\n", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
continue | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// TODO: follow the lead of https://github.com/synapsecns/sanguine/pull/2845 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err = ctx.Response().Reply(fmt.Sprintf("refund submitted with nonce %d", nonce)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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. Fix ineffectual assignment to err. The variable - _, err = ctx.Response().Reply(fmt.Sprintf("refund submitted with nonce %d", nonce))
+ if _, err := ctx.Response().Reply(fmt.Sprintf("refund submitted with nonce %d", nonce)); err != nil {
+ log.Println(err)
+ } Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func toExplorerSlackLink(ogHash string) string { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
rfqHash := strings.ToUpper(ogHash) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// cut off 0x | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -264,3 +381,30 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
linkRegex := regexp.MustCompile(`<https?://[^|>]+\|([^>]+)>`) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return linkRegex.ReplaceAllString(input, "$1") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// convertChainName detects if the string contains letters and if it does, tries to convert it to a chain id. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// otherwise return the original string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func convertChainName(input string) string { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
res := chaindata.ChainNameToChainID(input) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if res != 0 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return strconv.Itoa(int(res)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return input | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func getQuoteRequest(ctx context.Context, client relapi.RelayerClient, tx string) (*relapi.GetQuoteRequestResponse, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// at this point tx can be a txid or a has, we try both | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
txRequest, err := client.GetQuoteRequestStatusByTxHash(ctx, tx) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// override tx with txid | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tx = txRequest.TxID | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+372
to
+378
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. Ensure error handling for The error handling for - txRequest, err := client.GetQuoteRequestStatusByTxHash(ctx, tx)
- if err == nil {
+ txRequest, err := client.GetQuoteRequestStatusByTxHash(ctx, tx)
+ if err != nil {
+ return nil, fmt.Errorf("error fetching quote request status by tx hash: %w", err)
+ } Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// look up quote request | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
qr, err := client.GetQuoteRequestByTXID(ctx, tx) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("error fetching quote request: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+381
to
+384
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. Ensure error handling for The error handling for - qr, err := client.GetQuoteRequestByTXID(ctx, tx)
- if err != nil {
- return nil, fmt.Errorf("error fetching quote request: %w", err)
+ qr, err := client.GetQuoteRequestByTXID(ctx, tx)
+ if err != nil {
+ return nil, fmt.Errorf("error fetching quote request by tx id: %w", err) Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return qr, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+372
to
+386
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. Ensure error handling for The error handling for - qr, err := client.GetQuoteRequestByTXID(ctx, tx)
- if err != nil {
- return nil, fmt.Errorf("error fetching quote request: %w", err)
+ qr, err := client.GetQuoteRequestByTXID(ctx, tx)
+ if err != nil {
+ return nil, fmt.Errorf("error fetching quote request by tx id: %w", err) Committable suggestion
Suggested change
ToolsGitHub Check: codecov/patch
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,12 +21,13 @@ | |
func (b *Bot) tracingMiddleware() slacker.CommandMiddlewareHandler { | ||
return func(next slacker.CommandHandler) slacker.CommandHandler { | ||
return func(cmdCtx *slacker.CommandContext) { | ||
// TODO: context is not inherited here. | ||
_, span := b.handler.Tracer().Start(cmdCtx.Context(), fmt.Sprintf("command.%s", cmdCtx.Definition().Command), trace.WithAttributes( | ||
ctx, span := b.handler.Tracer().Start(cmdCtx.Context(), fmt.Sprintf("command.%s", cmdCtx.Definition().Command), trace.WithAttributes( | ||
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. Tip Codebase Verification Add tests for new functionality. The new functionality added to the
Analysis chainAdd tests for new functionality. The new functionality added to the
Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Verify test coverage for new functionality in `tracingMiddleware`.
# Test: Search for test cases covering the `tracingMiddleware` method. Expect: Test cases covering all new functionality.
rg --type go 'tracingMiddleware'
Length of output: 233 Script: #!/bin/bash
# Description: Verify test coverage for the `tracingMiddleware` method by searching for test files and functions.
# Find all test files in the repository.
fd --type f --name '*_test.go'
# Search for test functions that might cover `tracingMiddleware`.
rg --type go 'func Test' | rg 'tracingMiddleware'
Length of output: 333 Script: #!/bin/bash
# Description: Verify test coverage for the `tracingMiddleware` method by searching for test files and functions.
# Find all test files in the repository.
fd '_test.go$'
# Search for references to `tracingMiddleware` within test files.
rg 'tracingMiddleware' $(fd '_test.go$')
Length of output: 25161 ToolsGitHub Check: codecov/patch
|
||
attribute.String("user_id", cmdCtx.Event().UserID), | ||
attribute.String("channel_id", cmdCtx.Event().Channel.ID), | ||
)) | ||
|
||
cmdCtx.WithContext(ctx) | ||
|
||
Comment on lines
+29
to
+30
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. Tip Codebase Verification Add tests for new functionality. The
Analysis chainAdd tests for new functionality. The new functionality added to the
Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Verify test coverage for new functionality in `tracingMiddleware`.
# Test: Search for test cases covering the `tracingMiddleware` method. Expect: Test cases covering all new functionality.
rg --type go 'tracingMiddleware'
Length of output: 233 Script: #!/bin/bash
# Description: Verify if there are tests covering the `tracingMiddleware` method.
# Find all Go test files in the repository
test_files=$(fd --type f --extension go --glob '*_test.go')
# Search for test cases covering the `tracingMiddleware` method in the test files
for file in $test_files; do
echo "Checking $file"
rg 'tracingMiddleware' "$file"
done
Length of output: 75047 ToolsGitHub Check: codecov/patch
|
||
defer func() { | ||
metrics.EndSpan(span) | ||
}() | ||
|
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.
Add tests for the new functionality.
The following functionalities lack test coverage:
rpcClient
initializationrfqRefund
commandsigner
initializationsubmitter
initializationDo you want me to generate the unit testing code or open a GitHub issue to track this task?
Also applies to: 46-47, 49-49, 51-51, 69-73, 75-78, 80-83, 85-90, 92-94, 97-97
Tools
GitHub Check: codecov/patch