-
Notifications
You must be signed in to change notification settings - Fork 31
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
FE Release 2024-11-11 #3385
FE Release 2024-11-11 #3385
Changes from all commits
27bd1d2
e4e3069
9c294d5
78f3bd5
36efe55
06532fd
1d6280b
7eda527
2f1f49e
107e890
4019633
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 | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -4,7 +4,6 @@ package botmd | |||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
"context" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"errors" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"log" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"math/big" | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -20,8 +19,8 @@ import ( | |||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hako/durafmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/slack-go/slack" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/slack-io/slacker" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/contrib/opbot/internal" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/contrib/opbot/signoz" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/core" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/core/retry" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/ethergo/chaindata" | ||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/synapsecns/sanguine/ethergo/submitter" | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -250,7 +249,8 @@ func (b *Bot) rfqRefund() *slacker.CommandDefinition { | |||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
fastBridgeContract, err := b.makeFastBridge(ctx.Context(), rawRequest) | ||||||||||||||||||||||||||||||||||||||||||||||||||
//nolint: gosec | ||||||||||||||||||||||||||||||||||||||||||||||||||
fastBridgeContractOrigin, err := b.makeFastBridge(ctx.Context(), uint32(rawRequest.Bridge.OriginChainID)) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply(err.Error()) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -275,11 +275,44 @@ func (b *Bot) rfqRefund() *slacker.CommandDefinition { | |||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
//nolint:gosec | ||||||||||||||||||||||||||||||||||||||||||||||||||
fastBridgeContractDest, err := b.makeFastBridge(ctx.Context(), uint32(rawRequest.Bridge.DestChainID)) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply(err.Error()) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
txBz, err := core.BytesToArray(common.Hex2Bytes(rawRequest.Bridge.TransactionID[2:])) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("error converting tx id") | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+287
to
+294
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 Use Instead of manually removing the "0x" prefix and using Apply this diff to update the code: - txBz, err := core.BytesToArray(common.Hex2Bytes(rawRequest.Bridge.TransactionID[2:]))
+ txBytes, err := common.FromHex(rawRequest.Bridge.TransactionID)
+ if err != nil {
+ _, err := ctx.Response().Reply("error converting tx id")
+ if err != nil {
+ log.Println(err)
+ }
+ return
+ }
+ txBz, err := core.BytesToArray(txBytes)
if err != nil {
_, err := ctx.Response().Reply("error converting tx bytes")
if err != nil {
log.Println(err)
}
return
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
isRelayed, err := fastBridgeContractDest.BridgeRelays(nil, txBz) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("error fetching bridge relays") | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
if isRelayed { | ||||||||||||||||||||||||||||||||||||||||||||||||||
_, err := ctx.Response().Reply("transaction has already been relayed") | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
log.Println(err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
return | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
nonce, err := b.submitter.SubmitTransaction( | ||||||||||||||||||||||||||||||||||||||||||||||||||
ctx.Context(), | ||||||||||||||||||||||||||||||||||||||||||||||||||
big.NewInt(int64(rawRequest.Bridge.OriginChainID)), | ||||||||||||||||||||||||||||||||||||||||||||||||||
func(transactor *bind.TransactOpts) (tx *types.Transaction, err error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
tx, err = fastBridgeContract.Refund(transactor, common.Hex2Bytes(rawRequest.Bridge.Request[2:])) | ||||||||||||||||||||||||||||||||||||||||||||||||||
tx, err = fastBridgeContractOrigin.Refund(transactor, common.Hex2Bytes(rawRequest.Bridge.Request[2:])) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("error submitting refund: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+315
to
317
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 Use Consistent with earlier, utilizing Apply this diff to update the code: - tx, err = fastBridgeContractOrigin.Refund(transactor, common.Hex2Bytes(rawRequest.Bridge.Request[2:]))
+ requestBytes, err := common.FromHex(rawRequest.Bridge.Request)
+ if err != nil {
+ return nil, fmt.Errorf("error decoding bridge request: %w", err)
+ }
+ tx, err = fastBridgeContractOrigin.Refund(transactor, requestBytes)
if err != nil {
return nil, fmt.Errorf("error submitting refund: %w", err)
}
return tx, nil 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -322,7 +355,7 @@ func (b *Bot) rfqRefund() *slacker.CommandDefinition { | |||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
func (b *Bot) makeFastBridge(ctx context.Context, req *internal.GetRFQByTxIDResponse) (*fastbridge.FastBridge, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
func (b *Bot) makeFastBridge(ctx context.Context, chainID uint32) (*fastbridge.FastBridge, error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
client, err := rfqClient.NewUnauthenticatedClient(b.handler, b.cfg.RFQApiURL) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("error creating rfq client: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -333,22 +366,23 @@ func (b *Bot) makeFastBridge(ctx context.Context, req *internal.GetRFQByTxIDResp | |||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("error fetching rfq contracts: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
chainClient, err := b.rpcClient.GetChainClient(ctx, req.Bridge.OriginChainID) | ||||||||||||||||||||||||||||||||||||||||||||||||||
chainClient, err := b.rpcClient.GetChainClient(ctx, int(chainID)) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("error getting chain client: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("error getting chain client for chain ID %d: %w", chainID, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
//nolint: gosec | ||||||||||||||||||||||||||||||||||||||||||||||||||
contractAddress, ok := contracts.Contracts[uint32(req.Bridge.OriginChainID)] | ||||||||||||||||||||||||||||||||||||||||||||||||||
contractAddress, ok := contracts.Contracts[chainID] | ||||||||||||||||||||||||||||||||||||||||||||||||||
if !ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, errors.New("contract address not found") | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("no contract address for chain ID") | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
fastBridgeHandle, err := fastbridge.NewFastBridge(common.HexToAddress(contractAddress), chainClient) | ||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("error creating fast bridge: %w", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
return nil, fmt.Errorf("error creating fast bridge for chain ID %d: %w", chainID, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
return fastBridgeHandle, nil | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
func toExplorerSlackLink(ogHash string) string { | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -25,3 +25,13 @@ func BytesToJSONString(bz []byte) (string, error) { | |
|
||
return string(formattedJSON), nil | ||
} | ||
|
||
// BytesToArray converts a slice to a 32 length byte array. | ||
func BytesToArray(bz []byte) ([32]byte, error) { | ||
var bytes [32]byte | ||
if len(bz) != 32 { | ||
return bytes, fmt.Errorf("invalid length of bytes: %d", len(bz)) | ||
} | ||
copy(bytes[:], bz) | ||
return bytes, nil | ||
} | ||
Comment on lines
+30
to
+37
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. 💡 Codebase verification Add unit tests for BytesToArray function The BytesToArray function currently lacks test coverage. Please add test cases to verify:
Example test cases should include:
🔗 Analysis chainAdd unit tests to verify error handling. The new function includes error handling that should be verified with tests, especially the case where input length ≠ 32 bytes. Let's check if tests exist: Would you like me to help generate comprehensive test cases for this function? 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Check for existing tests of BytesToArray function
# Expected: Find test file and verify coverage of error case
# Look for test file
echo "Searching for test file..."
fd "bytes_test.go" core/
# Check for error case testing
echo "Checking for error case testing..."
rg -A 5 "TestBytesToArray.*func" core/
Length of output: 226 Script: #!/bin/bash
# Let's check the content of the test file to verify test coverage
cat core/bytes_test.go
Length of output: 2405 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.20; | ||
pragma solidity ^0.8.4; | ||
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. 💡 Codebase verification Pragma version downgrade introduces compatibility issues with dependent contract The pragma version downgrade to ^0.8.4 in BridgeTransactionV2.sol creates a version mismatch with its main dependent contract FastBridgeV2.sol (which uses 0.8.24). This could lead to potential compilation issues since the library is used directly in FastBridgeV2 with the statement
Consider either:
🔗 Analysis chainVerify compiler version compatibility across dependencies While downgrading from ^0.8.20 to ^0.8.4 aligns with other contracts, ensure all dependencies and inherited contracts are compatible with this version range. Consider documenting the rationale for this version alignment in the repository's documentation to help future maintainers understand the decision. The previous results show varying pragma versions across the codebase, with some contracts using newer versions (0.8.24, 0.8.20) and others using older versions (0.8.4, 0.8.17). Let's verify the dependencies and usage of BridgeTransactionV2 to ensure version compatibility. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Check pragma versions across related contracts
echo "Checking pragma versions in related contracts..."
rg -A 1 "pragma solidity" "packages/contracts-rfq/contracts/"
# Check if any newer Solidity features are used
echo "Checking for newer Solidity features usage..."
rg -i "push\s*\[\s*\]|assembly\s*\{\s*basefee|block\.prevrandao|PUSH0" "packages/contracts-rfq/contracts/"
Length of output: 4493 Script: #!/bin/bash
# Check for imports and dependencies of BridgeTransactionV2.sol
echo "Checking imports in BridgeTransactionV2.sol..."
rg "^import.*;" "packages/contracts-rfq/contracts/libs/BridgeTransactionV2.sol"
# Check which contracts import BridgeTransactionV2
echo "Checking usage of BridgeTransactionV2..."
rg "import.*BridgeTransactionV2" "packages/contracts-rfq/contracts/"
# Check if there are any inheritance or library usage
echo "Checking for library usage of BridgeTransactionV2..."
rg "using BridgeTransactionV2" "packages/contracts-rfq/contracts/"
Length of output: 802 |
||
|
||
import {IFastBridgeV2} from "../interfaces/IFastBridgeV2.sol"; | ||
|
||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -10,7 +10,8 @@ import { isTokenSupportedOnChain } from '../utils/isTokenSupportedOnChain' | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { checksumAddresses } from '../middleware/checksumAddresses' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { normalizeNativeTokenAddress } from '../middleware/normalizeNativeTokenAddress' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { validateRouteExists } from '../validations/validateRouteExists' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { validateDecimals } from '../validations/validateDecimals' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { tokenAddressToToken } from '../utils/tokenAddressToToken' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const router: express.Router = express.Router() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -227,7 +228,20 @@ router.get( | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
isTokenSupportedOnChain(value, req.query.toChain as string) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.withMessage('Token not supported on specified chain'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check('amount').isNumeric().exists().withMessage('amount is required'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check('amount') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.exists() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.withMessage('amount is required') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.isNumeric() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.custom((value, { req }) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const fromTokenInfo = tokenAddressToToken( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
req.query.fromChain, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
req.query.fromToken | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return validateDecimals(value, fromTokenInfo.decimals) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.withMessage( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
'Amount has too many decimals, beyond the maximum allowed for this token' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+231
to
+244
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 Enhance error handling and performance of amount validation While the decimal validation is a good addition, there are a few areas for improvement:
Consider this improved implementation: check('amount')
.exists()
.withMessage('amount is required')
.isNumeric()
+ .isFloat({ min: 0 })
+ .withMessage('Amount must be greater than 0')
.custom((value, { req }) => {
+ try {
const fromTokenInfo = tokenAddressToToken(
req.query.fromChain,
req.query.fromToken
)
+ if (!fromTokenInfo) {
+ throw new Error('Token information not found')
+ }
return validateDecimals(value, fromTokenInfo.decimals)
+ } catch (error) {
+ throw new Error(`Invalid amount: ${error.message}`)
+ }
})
.withMessage(
'Amount has too many decimals, beyond the maximum allowed for this token'
), 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
check() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.custom((_value, { req }) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { fromChain, toChain, fromToken, toToken } = req.query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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.
🛠️ Refactor suggestion
Avoid suppressing
gosec
linter warnings without justification.Using
//nolint: gosec
suppresses potential security issues flagged by the linter. It's advisable to address the underlying security concerns or, if suppression is necessary, provide a justification comment explaining why.