-
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
ci: solidity gas diff options [SLT-267] #3193
Conversation
WalkthroughThe pull request introduces enhancements to the gas reporting mechanism in the GitHub Actions workflow and modifies the Changes
Possibly related PRs
Suggested labels
Suggested reviewers
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
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.
Actionable comments posted: 2
🧹 Outside diff range and nitpick comments (1)
.github/workflows/solidity.yml (1)
281-281
: LGTM! Consider making the ignore pattern configurable.The addition of the
ignore
parameter to exclude test files from the gas diff report is a good improvement. This will help focus the report on the main contract implementations, reducing noise from test-related gas changes.To make this more flexible, consider making the ignore pattern configurable. You could use a GitHub Actions input or a repository variable to allow easy customization without changing the workflow file. For example:
- name: Compare gas reports uses: Rubilmax/[email protected] with: ignore: ${{ inputs.gas_diff_ignore_pattern || 'test/**/*' }} report: 'gas-report-${{ matrix.package }}.ansi' id: gas_diffThis way, you can easily adjust the ignore pattern for different projects or scenarios if needed.
// TODO: remove | ||
assert(balanceOf(account) >= amount); |
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.
Remove redundant assertion and consider using require
instead of assert
.
The added assertion is redundant as the OpenZeppelin _burn
function already includes a check to ensure the account has sufficient balance. If this check is intended for debugging or testing purposes, consider the following:
- Remove the assertion as indicated by the TODO comment, as it increases gas costs unnecessarily.
- If you decide to keep a check for any reason, use
require
instead ofassert
.assert
should only be used to check for internal errors and invariants, not for validating inputs or conditions that might fail due to external factors.
Here's an example of how you could modify the code if a check is still needed:
function burn(address account, uint256 amount) external {
require(balanceOf(account) >= amount, "Insufficient balance");
_burn(account, amount);
}
However, since this check is already performed in the _burn
function, it's recommended to remove the additional check entirely.
// TODO: remove | ||
assert(balanceOf(account) >= amount); |
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.
Remove unnecessary assertion after minting operation.
The added assertion after the minting operation is problematic for several reasons:
- It's logically incorrect: The check is performed after minting, so it will always pass because minting increases the balance.
- It's unnecessary: Minting by definition increases the balance, so there's no need to verify this.
- It increases gas costs without providing any benefit.
Recommendation:
Remove the assertion entirely, as indicated by the TODO comment. If you need to keep a check for any reason (though it's not recommended in this case), it should be placed before the minting operation and use require
instead of assert
. However, given that minting inherently increases balance, no such check is necessary.
The function should simply be:
function mint(address account, uint256 amount) external {
_mint(account, amount);
}
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #3193 +/- ##
===================================================
- Coverage 39.46606% 37.89647% -1.56959%
===================================================
Files 479 418 -61
Lines 26932 24245 -2687
Branches 342 82 -260
===================================================
- Hits 10629 9188 -1441
+ Misses 15557 14314 -1243
+ Partials 746 743 -3
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
Deploying sanguine-fe with
|
Latest commit: |
5ae5c6f
|
Status: | ✅ Deploy successful! |
Preview URL: | https://b3783e0c.sanguine-fe.pages.dev |
Branch Preview URL: | https://ci-solidity-gas-diff-options.sanguine-fe.pages.dev |
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.
Actionable comments posted: 4
🧹 Outside diff range and nitpick comments (1)
packages/contracts-rfq/contracts/FastBridgeV2.sol (1)
Line range hint
1-290
: Summary: Consistent gas optimizations acrossFastBridgeV2.sol
The changes in this file consistently replace
bytes memory
withbytes calldata
in function parameters across multiple functions. This optimization reduces gas costs by avoiding unnecessary data copying, especially beneficial for large input data.These changes improve the contract's efficiency without altering its core functionality. The optimizations are particularly valuable in a bridge system where gas costs can significantly impact user experience.
While the changes themselves are good, consider implementing the suggested additional safety checks to further improve the contract's robustness.
Given that this is a bridge contract handling cross-chain transactions, consider implementing a comprehensive event logging system for all major state changes. This would greatly aid in off-chain monitoring and auditing of bridge operations.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 Files selected for processing (2)
- .github/workflows/solidity.yml (1 hunks)
- packages/contracts-rfq/contracts/FastBridgeV2.sol (4 hunks)
🔇 Additional comments (3)
.github/workflows/solidity.yml (1)
280-284
: Excellent enhancements to the gas diff report!The new parameters added to the
foundry-gas-diff
action will significantly improve the quality and relevance of the gas usage report:
ignore: 'test/**/*'
: This excludes test files from the gas diff, focusing the report on production code.sortCriteria: avg
andsortOrders: desc
: This sorts functions by average gas usage in descending order, highlighting the most gas-intensive functions first.summaryQuantile: 0.5
: This uses the median for the summary, providing a balanced view of gas usage across different function calls.These changes will make the gas diff report more actionable by prioritizing the most important information for optimizing gas usage in the contracts.
packages/contracts-rfq/contracts/FastBridgeV2.sol (2)
74-76
: Approved: Gas optimization ingetBridgeTransaction
The change from
bytes memory
tobytes calldata
is a good optimization. Usingcalldata
for read-only function parameters reduces gas costs as it doesn't copy the data to memory. This is particularly beneficial forpure
functions likegetBridgeTransaction
.
216-218
: Approved: Gas optimization inclaim
functionThe change from
bytes memory
tobytes calldata
is a good gas optimization. This wrapper function immediately calls another function without modifying therequest
parameter, makingcalldata
more efficient.
function relay(bytes calldata request) external payable { | ||
relay(request, msg.sender); | ||
} |
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
Approved: Gas optimization in relay
function
The change from bytes memory
to bytes calldata
is a good gas optimization. Since this function is a wrapper that immediately calls another function without modifying the request
parameter, using calldata
is more efficient.
Consider adding the payable
keyword to the function signature of the second relay
overload to ensure that any attached ETH is properly forwarded:
-function relay(bytes calldata request, address relayer) public payable {
+function relay(bytes calldata request, address relayer) public payable {
This change would make the intent clearer and prevent any potential issues with ETH forwarding.
Committable suggestion was skipped due to low confidence.
function refund(bytes calldata request) external { | ||
bytes32 transactionId = keccak256(request); | ||
BridgeTransaction memory transaction = getBridgeTransaction(request); |
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
Approved: Gas optimization in refund
function
The change from bytes memory
to bytes calldata
for the request
parameter is a good gas optimization. This is beneficial for the refund
function as it doesn't modify the request
parameter.
Consider adding a check to ensure that the refund amount is greater than zero:
function refund(bytes calldata request) external {
bytes32 transactionId = keccak256(request);
BridgeTransaction memory transaction = getBridgeTransaction(request);
// ... existing checks ...
// set status to refunded if still in requested state
if (bridgeStatuses[transactionId] != BridgeStatus.REQUESTED) revert StatusIncorrect();
bridgeStatuses[transactionId] = BridgeStatus.REFUNDED;
// transfer origin collateral back to original sender
address to = transaction.originSender;
address token = transaction.originToken;
uint256 amount = transaction.originAmount + transaction.originFeeAmount;
+ require(amount > 0, "Refund amount must be greater than zero");
token.universalTransfer(to, amount);
emit BridgeDepositRefunded(transactionId, to, token, amount);
}
This additional check would prevent potential issues with zero-value refunds, which might waste gas on unnecessary transactions.
Committable suggestion was skipped due to low confidence.
function relay(bytes calldata request, address relayer) public payable { | ||
bytes32 transactionId = keccak256(request); | ||
BridgeTransaction memory transaction = getBridgeTransaction(request); |
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
Approved: Gas optimization in main relay
function
The change from bytes memory
to bytes calldata
for the request
parameter is a good gas optimization. This is particularly beneficial for this function as it contains the main relay logic and request
is not modified.
Consider adding a check to ensure that the relayer
address is not the zero address:
function relay(bytes calldata request, address relayer) public payable {
+ require(relayer != address(0), "Invalid relayer address");
bytes32 transactionId = keccak256(request);
BridgeTransaction memory transaction = getBridgeTransaction(request);
// ... rest of the function
}
This additional check would prevent potential issues with invalid relayer addresses.
Committable suggestion was skipped due to low confidence.
function claim(bytes calldata request, address to) public { | ||
bytes32 transactionId = keccak256(request); | ||
BridgeTransaction memory transaction = getBridgeTransaction(request); |
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
Approved: Gas optimization in main claim
function
The change from bytes memory
to bytes calldata
for the request
parameter is a good gas optimization. This is particularly beneficial for this function as it contains the main claim logic and request
is not modified.
Consider adding a check to ensure that the to
address is not the zero address when explicitly provided:
function claim(bytes calldata request, address to) public {
bytes32 transactionId = keccak256(request);
BridgeTransaction memory transaction = getBridgeTransaction(request);
// update bridge tx status if able to claim origin collateral
if (bridgeStatuses[transactionId] != BridgeStatus.RELAYER_PROVED) revert StatusIncorrect();
BridgeProof memory proof = bridgeProofs[transactionId];
// if "to" is zero addr, permissionlessly send funds to proven relayer
if (to == address(0)) {
to = proof.relayer;
+ } else if (to == address(0)) {
+ revert("Invalid recipient address");
} else if (proof.relayer != msg.sender) {
revert SenderIncorrect();
}
// ... rest of the function
}
This additional check would prevent potential issues with invalid recipient addresses when explicitly provided.
Committable suggestion was skipped due to low confidence.
Changes to gas cost
🧾 Summary (50% most significant diffs)
Full diff report 👇
|
Bundle ReportChanges will increase total bundle size by 262.31kB (0.73%) ⬆️. This is within the configured threshold ✅ Detailed changes
|
* update bl * remove global solidity extension settings * use monorepo support in global workspace only * - use Solidity extension for formatting *.sol files - use `forge fmt` as formatter in Solidity extension * REST API Improvements [SLT-179] (#3133) * fix swaptxinfo function * Updates test coverage command * migrating to using token addresses instead of symbols * fix linting errors * fixing swaptxinfocontroller * new tests and new functionality --------- Co-authored-by: abtestingalpha <[email protected]> * Publish - @synapsecns/[email protected] - @synapsecns/[email protected] * fix harmony proxy (#3149) Co-authored-by: Trajan0x <[email protected]> * merging rfq indexer into monorepo [SLT-164] [SLT-176] (#3136) * merging rfq indexer into monorepo * nuke .env * fix commands * fix package name * test coverage script * rough pass at docs and some linting and fixes yarn * Upgrades wagmi & rainbowkit * indxer * Adds invisible but used packages * +recent-invalid-fills [SLT-188] * Moves wagmi to root * new endpoints and clean up linting --------- Co-authored-by: Trajan0x <[email protected]> Co-authored-by: abtestingalpha <[email protected]> Co-authored-by: parodime <[email protected]> * Publish - @synapsecns/[email protected] - @synapsecns/[email protected] - @synapsecns/[email protected] * Adds /destinationTokens route [SLT-204] (#3151) * Adds /destinationTokens route * ZeroAddress & NativeGasAddress * Adds test for native gas tokens * Checksums incoming token address params * Publish - @synapsecns/[email protected] * boba pause (#3150) * boba pause * only boba to txns * Publish - @synapsecns/[email protected] * fix(synapse-interface): Reorders validation to check existence first (#3156) * Reorders validation to check existence first * Removes duplicates * Publish - @synapsecns/[email protected] * Fix boba pause (#3158) * Publish - @synapsecns/[email protected] * update bl * feat(rest-api): Adds Swagger for api docs [SLT-205] (#3159) * Adds Swagger for api docs * Replace prepended verb Get routes with nouns * Adds dev flag for swagger serverUrl * Publish - @synapsecns/[email protected] - @synapsecns/[email protected] - @synapsecns/[email protected] - @synapsecns/[email protected] * Pulls version from package json (#3160) * Publish - @synapsecns/[email protected] * Require vs import due to file location (#3161) * Require vs import due to file location * Publish - @synapsecns/[email protected] * Prevent caching of api docs (#3162) * Publish - @synapsecns/[email protected] * feat(contracts-rfq): relay/prove/claim with different address [SLT-130] (#3138) * init. solidity ^. FbV2 relay/prove/claim overloads * +IFastBridgeV2, explicit address0 cast, func scope & inheritdoc fixes * pragma lock, contract relabel * feat: start scoping V2 tests * test: override relayer role scenarios, no longer enforced by V2 * test: finish the parity test * test: the management methods * test: dst chain scenarios * test: bridge * test: prove * test: claim * test: dispute * test: refund * test: bridge reverts * remove redundant extend. rearrange inherit list * revert 0.8.20 in favor of user (non-ws) setting --------- Co-authored-by: ChiTimesChi <[email protected]> * Publish - [email protected] * fix(promexporter): make spans better (#3164) * move the errors * [goreleaser] * fix v to w * changing native token address standard [SLT-210] (#3157) * changing native token address standard * fixing tests * normalizeNativeTokenAddress middleware, additional tests --------- Co-authored-by: abtestingalpha <[email protected]> * Publish - @synapsecns/[email protected] * Refactoring rfq-indexer API and adding swagger docs [SLT-228] (#3167) * refactoring and adding swagger * remove testing scripts * fix typos and consistency with 404 errors * Publish - @synapsecns/[email protected] * fix read mes (#3168) * Publish - @synapsecns/[email protected] - [email protected] - @synapsecns/[email protected] * fix(opbot): use submitter get tx status [SLT-158] (#3134) * use experimental logger to debug * fix lint * [goreleaser] * use submitter instead of client * [goreleaser] * [goreleaser] * fix(synapse-interface): Additional checks on screen [SLT-166] (#3152) * Additional checks on screen * Adds checks on chain/token changes * Publish - @synapsecns/[email protected] * feat(synapse-interface): confirm new price [SLT-150] (#3084) * add bridge quote history middleware * request user confirm changes when quoted price updates * add conditions for displaying confirm change state * track initial quote initializing confirm change state * specify output delta threshold * callback functions to handle initialize/accept/reset confirm changes flow * quote countdown timer animation to signal refresh * implement automatic refresh intervals * mouse move to refresh automatic intervals * add i8n translations for button text --------- Co-authored-by: abtestingalpha <[email protected]> * Publish - @synapsecns/[email protected] * fix: formatted bridge fee amount (#3165) * Publish - @synapsecns/[email protected] * fix(contracts-rfq): CI workflows [SLT-245] (#3178) * fix: license, files * fix: package name * build: update solhint to latest * build: remove prettier dependencies * fix: solhint workflows * build: update solhint in other packages as well * chore: solhint rules, exceptions * fix: silence linter warnings in tests * chore: forge fmt * add variable to test linter CI * Revert "add variable to test linter CI" This reverts commit 0629309. * Publish - @synapsecns/[email protected] - @synapsecns/[email protected] - @synapsecns/[email protected] * feat(api): bridge limits [SLT-165] (#3179) * adds `/bridgeLimits` route, controller * fetch best sdk quote for min/max origin amounts * add tests * implement middleware to normalize addresses * adds swagger doc * Publish - @synapsecns/[email protected] * fix(contracts-rfq): limit the amount of solhint warnings [SLT-245] (#3182) * ci: limit the amount of solhint warnings * refactor: move the errors into the separate interface * refactor: errors imports in tests * Publish - @synapsecns/[email protected] * ci: Solidity gas diff [SLT-259] (#3181) * ci: run tests w/o coverage first for better visibility * test: malform the test to check the adjusted workflow * Revert "test: malform the test to check the adjusted workflow" This reverts commit e7db6e1. * ci: add gas-diff workflow * try changing the contract to trigger gas diffs * retrigger the workflow * ci: provide the correct report path * ci: run on pull requests only * ci: save gas reports in monorepo root * Revert "ci: run on pull requests only" This reverts commit 0a01d60. * Revert "try changing the contract to trigger gas diffs" This reverts commit 91bc03e. * refactor: wrap if statement * refactor: exclude `solidity-devops` package in a more generic way * ci: run tests w/o coverage for `solidity-devops`, add comments * add generic comment to trigger `solidity-devops` workflows * Revert "add generic comment to trigger `solidity-devops` workflows" This reverts commit cc35a43. * Publish - @synapsecns/[email protected] * fix(contracts-core): set very high gas limit for intensive tests [SLT-259] (#3186) * fix: set very high gas limit for intensive tests * ci: speed up solidity coverage * Publish - @synapsecns/[email protected] * feat(rest-api): Adds validateRouteExists validation [SLT-260] (#3180) * Adds validateRouteExists validation * Remove timeouts for 400s * Publish - @synapsecns/[email protected] * add duplicate command warning (#3174) Co-authored-by: Trajan0x <[email protected]> * reduce solhint warnings on FbV2 (#3189) * reduce solhint warnings on FbV2 * fix whitespace * Publish - @synapsecns/[email protected] * ci: solidity gas diff options [SLT-267] (#3193) * ci: ignore test files in gas diff report * add some changes to the test files * ci: define some options for gas-diff * try changing the contract to trigger gas diffs * Revert "try changing the contract to trigger gas diffs" This reverts commit 4504e3c. * Revert "add some changes to the test files" This reverts commit 7e7d6cb. * prove w/ tx id [SLT-181] (#3169) * prove w/ tx id SLT-181 * +proveOther tests, forge fmt * fmt * fmt * Publish - @synapsecns/[email protected] * fix(sdk-router): disable ARB airdrop tests (#3195) * Publish - @synapsecns/[email protected] - @synapsecns/[email protected] - @synapsecns/[email protected] - @synapsecns/[email protected] * Fixing issue for wallet integration [SLT-270] (#3194) * slight modification to graphql call * fixing explorer frontend as well * Publish - @synapsecns/[email protected] - @synapsecns/[email protected] * store relayer on relay [SLT-182] (#3170) * store relayer on relay [SLT-182] * +tests, zeroAddr check, fmt * Publish - @synapsecns/[email protected] * Adjust text to trigger build (#3199) * Publish - @synapsecns/[email protected] * feat(synapse-interface): refund RFQ transaction [SLT-272] (#3197) * Txn transaction refund tracking * Update store to support tracking * Query FastBridge contract for `bridgeStatuses` to find refund status * Track bridge transaction `bridgeQuote.routerAddress` in store * Fetch FastBridge contract address when only provided router address * add translations --------- Co-authored-by: aureliusbtc <[email protected]> Co-authored-by: ChiTimesChi <[email protected]> Co-authored-by: abtestingalpha <[email protected]> Co-authored-by: Defi-Moses <[email protected]> Co-authored-by: trajan0x <[email protected]> Co-authored-by: Trajan0x <[email protected]> Co-authored-by: parodime <[email protected]> Co-authored-by: abtestingalpha <[email protected]> Co-authored-by: abtestingalpha <[email protected]> Co-authored-by: parodime <[email protected]> Co-authored-by: vro <[email protected]> Co-authored-by: ChiTimesChi <[email protected]> Co-authored-by: bigboydiamonds <[email protected]> Co-authored-by: bigboydiamonds <[email protected]>
Description
A clear and concise description of the features you're adding in this pull request.
Additional context
Add any other context about the problem you're solving.
Metadata
Summary by CodeRabbit
New Features
Bug Fixes
burn
andmint
functions of theMockERC20
contract to ensure sufficient balance before executing these operations.Improvements
FastBridgeV2
contract for better gas efficiency.