-
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
FE Release only for #3238 #3250
Changes from all commits
5c3686c
c63eb6e
327a3a4
aab8e56
c167cf0
8311329
6dc151c
4b49879
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 |
---|---|---|
|
@@ -3,6 +3,14 @@ | |
All notable changes to this project will be documented in this file. | ||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||
|
||
## [0.3.8](https://github.com/synapsecns/sanguine/compare/@synapsecns/[email protected]...@synapsecns/[email protected]) (2024-10-07) | ||
|
||
**Note:** Version bump only for package @synapsecns/bridge-docs | ||
|
||
|
||
|
||
|
||
|
||
## [0.3.7](https://github.com/synapsecns/sanguine/compare/@synapsecns/[email protected]...@synapsecns/[email protected]) (2024-10-05) | ||
|
||
**Note:** Version bump only for package @synapsecns/bridge-docs | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import Routes from '@site/src/components/Routes' | ||
|
||
# Chains & Tokens | ||
|
||
This page contains a list of supported tokens, listed per-chain. For a given pair, use the [Synapse Bridge](https://synapseprotocol.com) to see if a route between them exists. | ||
|
||
<Routes /> |
This file was deleted.
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,10 @@ | ||
import { BRIDGABLE_TOKENS, CHAINS } from '@synapsecns/synapse-constants' | ||
|
||
const CHAINS_BY_ID = {} | ||
|
||
for (const { chainImg, id, name } of Object.values(CHAINS)) { | ||
if (id && name) { | ||
CHAINS_BY_ID[id] = { name, chainImg } | ||
} | ||
} | ||
|
||
export default () => | ||
Object.entries(BRIDGABLE_TOKENS).map(([id, tokens]) => { | ||
const chain = CHAINS_BY_ID[id] | ||
const chainImg = chain.chainImg({ width: 28, height: 28 }) | ||
const chain = CHAINS.CHAINS_BY_ID[id] | ||
const chainImg = chain.chainImg | ||
|
||
return ( | ||
<section key={id}> | ||
<h2 | ||
|
@@ -22,16 +15,10 @@ export default () => | |
alignItems: 'center', | ||
}} | ||
> | ||
{chainImg} {chain.name} <code>{id}</code> | ||
<img width="28" height="28" src={chainImg} alt={chain.name} /> | ||
{chain.name} <code>{id}</code> | ||
Comment on lines
+18
to
+19
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 Inconsistent The change to use
Please ensure that the 🔗 Analysis chainSimplified chain image rendering The changes improve readability by directly using Could you confirm if 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Search for usages of chainImg to ensure consistency
rg --type typescript --type javascript 'chainImg'
Length of output: 89 Script: #!/bin/bash
# Search for usages of chainImg to ensure consistency using file extensions
rg 'chainImg' --type-add 'ts=*.ts,*.tsx' --type-add 'js=*.js,*.jsx' -t ts -t js
Length of output: 139 Script: #!/bin/bash
# Search for usages of chainImg to ensure consistency using correct type definitions
rg 'chainImg' --type-add 'ts:*.ts,*.tsx' --type-add 'js:*.js,*.jsx' -t ts -t js
Length of output: 5908 Script: #!/bin/bash
# Search for usages of chainImg using glob patterns to avoid type definition errors
rg 'chainImg' --glob '*.ts' --glob '*.tsx' --glob '*.js' --glob '*.jsx'
Length of output: 5900 |
||
</h2> | ||
{Object.values(tokens).map((token) => { | ||
const tokenImg = | ||
typeof token.icon === 'string' ? ( | ||
<img width="16" height="16" src={token.icon} /> | ||
) : ( | ||
token.icon({ width: 16, height: 16 }) | ||
) | ||
|
||
return ( | ||
<span | ||
key={token.addresses[id]} | ||
|
@@ -42,7 +29,8 @@ export default () => | |
padding: '.25rem .5rem', | ||
}} | ||
> | ||
{tokenImg} {token.symbol} | ||
<img width="16" height="16" src={token.icon} alt={token.symbol} />{' '} | ||
{token.symbol} | ||
</span> | ||
) | ||
})} | ||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -3,6 +3,17 @@ | |||||
All notable changes to this project will be documented in this file. | ||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||||
|
||||||
# [0.7.0](https://github.com/synapsecns/sanguine/compare/@synapsecns/[email protected]...@synapsecns/[email protected]) (2024-10-07) | ||||||
|
||||||
|
||||||
### Features | ||||||
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 heading level for "Features" section. The "Features" section is using a third-level heading (###) instead of a second-level heading (##). This is inconsistent with the rest of the document and may cause issues with automatic parsing or rendering of the changelog. To maintain consistency, please change the heading level: -### Features
+## Features 📝 Committable suggestion
Suggested change
🧰 Tools🪛 Markdownlint
|
||||||
|
||||||
* **contracts-rfq:** arbitrary calls without additional native value [SLT-233] ([#3215](https://github.com/synapsecns/sanguine/issues/3215)) ([6dc151c](https://github.com/synapsecns/sanguine/commit/6dc151c709970e2a891a56d10c8ffc67bdf95522)) | ||||||
|
||||||
|
||||||
|
||||||
|
||||||
|
||||||
## [0.6.2](https://github.com/synapsecns/sanguine/compare/@synapsecns/[email protected]...@synapsecns/[email protected]) (2024-10-03) | ||||||
|
||||||
|
||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,13 +2,15 @@ | |
pragma solidity 0.8.24; | ||
|
||
import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; | ||
import {Address} from "@openzeppelin/contracts/utils/Address.sol"; | ||
|
||
import {UniversalTokenLib} from "./libs/UniversalToken.sol"; | ||
|
||
import {Admin} from "./Admin.sol"; | ||
import {IFastBridge} from "./interfaces/IFastBridge.sol"; | ||
import {IFastBridgeV2} from "./interfaces/IFastBridgeV2.sol"; | ||
import {IFastBridgeV2Errors} from "./interfaces/IFastBridgeV2Errors.sol"; | ||
import {IFastBridgeRecipient} from "./interfaces/IFastBridgeRecipient.sol"; | ||
|
||
/// @notice FastBridgeV2 is a contract for bridging tokens across chains. | ||
contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | ||
|
@@ -24,6 +26,9 @@ contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | |
/// @notice Minimum deadline period to relay a requested bridge transaction | ||
uint256 public constant MIN_DEADLINE_PERIOD = 30 minutes; | ||
|
||
/// @notice Maximum length of accepted callParams | ||
uint256 public constant MAX_CALL_PARAMS_LENGTH = 2 ** 16 - 1; | ||
|
||
/// @notice Status of the bridge tx on origin chain | ||
mapping(bytes32 => BridgeTxDetails) public bridgeTxDetails; | ||
/// @notice Relay details on destination chain | ||
|
@@ -45,7 +50,12 @@ contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | |
function bridge(BridgeParams memory params) external payable { | ||
bridge({ | ||
params: params, | ||
paramsV2: BridgeParamsV2({quoteRelayer: address(0), quoteExclusivitySeconds: 0, quoteId: bytes("")}) | ||
paramsV2: BridgeParamsV2({ | ||
quoteRelayer: address(0), | ||
quoteExclusivitySeconds: 0, | ||
quoteId: bytes(""), | ||
callParams: bytes("") | ||
}) | ||
}); | ||
} | ||
|
||
|
@@ -117,6 +127,9 @@ contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | |
|
||
/// @inheritdoc IFastBridge | ||
function getBridgeTransaction(bytes memory request) external pure returns (BridgeTransaction memory) { | ||
// TODO: the note below isn't true anymore with the BridgeTransactionV2 struct | ||
// since the variable length `callParams` was added. This needs to be fixed/acknowledged. | ||
|
||
Comment on lines
+130
to
+132
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. Update the Outdated Comment Regarding The comment indicates that the note is outdated due to the addition of Would you like assistance in updating this comment or addressing the TODO? |
||
// Note: when passing V2 request, this will decode the V1 fields correctly since the new fields were | ||
// added as the last fields of the struct and hence the ABI decoder will simply ignore the extra data. | ||
return abi.decode(request, (BridgeTransaction)); | ||
|
@@ -132,6 +145,7 @@ contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | |
if (params.sender == address(0) || params.to == address(0)) revert ZeroAddress(); | ||
if (params.originToken == address(0) || params.destToken == address(0)) revert ZeroAddress(); | ||
if (params.deadline < block.timestamp + MIN_DEADLINE_PERIOD) revert DeadlineTooShort(); | ||
if (paramsV2.callParams.length > MAX_CALL_PARAMS_LENGTH) revert CallParamsLengthAboveMax(); | ||
int256 exclusivityEndTime = int256(block.timestamp) + paramsV2.quoteExclusivitySeconds; | ||
// exclusivityEndTime must be in range (0 .. params.deadline] | ||
if (exclusivityEndTime <= 0 || exclusivityEndTime > int256(params.deadline)) { | ||
|
@@ -163,7 +177,8 @@ contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | |
nonce: senderNonces[params.sender]++, // increment nonce on every bridge | ||
exclusivityRelayer: paramsV2.quoteRelayer, | ||
// We checked exclusivityEndTime to be in range (0 .. params.deadline] above, so can safely cast | ||
exclusivityEndTime: uint256(exclusivityEndTime) | ||
exclusivityEndTime: uint256(exclusivityEndTime), | ||
callParams: paramsV2.callParams | ||
}) | ||
); | ||
bytes32 transactionId = keccak256(request); | ||
|
@@ -214,18 +229,32 @@ contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | |
address token = transaction.destToken; | ||
uint256 amount = transaction.destAmount; | ||
|
||
uint256 rebate = chainGasAmount; | ||
if (!transaction.sendChainGas) { | ||
// forward erc20 | ||
rebate = 0; | ||
// All state changes have been done at this point, can proceed to the external calls. | ||
// This follows the checks-effects-interactions pattern to mitigate potential reentrancy attacks. | ||
if (transaction.callParams.length == 0) { | ||
// No arbitrary call requested, so we just pull the tokens from the Relayer to the recipient, | ||
// or transfer ETH to the recipient (if token is ETH_ADDRESS) | ||
_pullToken(to, token, amount); | ||
} else if (token == UniversalTokenLib.ETH_ADDRESS) { | ||
// lump in gas rebate into amount in native gas token | ||
_pullToken(to, token, amount + rebate); | ||
} else { | ||
// forward erc20 then forward gas rebate in native gas token | ||
} else if (token != UniversalTokenLib.ETH_ADDRESS) { | ||
// Arbitrary call requested with ERC20: pull the tokens from the Relayer to the recipient first | ||
_pullToken(to, token, amount); | ||
_pullToken(to, UniversalTokenLib.ETH_ADDRESS, rebate); | ||
// Follow up with the hook function call | ||
_checkedCallRecipient({ | ||
recipient: to, | ||
msgValue: 0, | ||
token: token, | ||
amount: amount, | ||
callParams: transaction.callParams | ||
}); | ||
} else { | ||
// Arbitrary call requested with ETH: combine the ETH transfer with the call | ||
_checkedCallRecipient({ | ||
recipient: to, | ||
msgValue: amount, | ||
token: token, | ||
amount: amount, | ||
callParams: transaction.callParams | ||
}); | ||
} | ||
|
||
emit BridgeRelayed( | ||
|
@@ -237,7 +266,8 @@ contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | |
transaction.destToken, | ||
transaction.originAmount, | ||
transaction.destAmount, | ||
rebate | ||
// chainGasAmount is 0 since the gas rebate function is deprecated | ||
0 | ||
); | ||
} | ||
|
||
|
@@ -327,6 +357,31 @@ contract FastBridgeV2 is Admin, IFastBridgeV2, IFastBridgeV2Errors { | |
} | ||
} | ||
|
||
/// @notice Calls the Recipient's hook function with the specified callParams and performs | ||
/// all the necessary checks for the returned value. | ||
function _checkedCallRecipient( | ||
address recipient, | ||
uint256 msgValue, | ||
address token, | ||
uint256 amount, | ||
bytes memory callParams | ||
) | ||
internal | ||
{ | ||
bytes memory hookData = | ||
abi.encodeCall(IFastBridgeRecipient.fastBridgeTransferReceived, (token, amount, callParams)); | ||
// This will bubble any revert messages from the hook function | ||
bytes memory returnData = Address.functionCallWithValue({target: recipient, data: hookData, value: msgValue}); | ||
// Explicit revert if no return data at all | ||
if (returnData.length == 0) revert RecipientNoReturnValue(); | ||
// Check that exactly a single return value was returned | ||
if (returnData.length != 32) revert RecipientIncorrectReturnValue(); | ||
// Return value should be abi-encoded hook function selector | ||
if (bytes32(returnData) != bytes32(IFastBridgeRecipient.fastBridgeTransferReceived.selector)) { | ||
revert RecipientIncorrectReturnValue(); | ||
} | ||
} | ||
|
||
/// @notice Calculates time since proof submitted | ||
/// @dev proof.timestamp stores casted uint40(block.timestamp) block timestamps for gas optimization | ||
/// _timeSince(proof) can accomodate rollover case when block.timestamp > type(uint40).max but | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.0; | ||
|
||
interface IFastBridgeRecipient { | ||
function fastBridgeTransferReceived( | ||
address token, | ||
uint256 amount, | ||
bytes memory callParams | ||
) | ||
external | ||
payable | ||
returns (bytes4); | ||
} | ||
Comment on lines
+4
to
+13
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 Incorrect implementations of IFastBridgeRecipient found in test mocks:
Please ensure all contracts implementing this interface adhere strictly to its specifications to maintain consistency and prevent potential issues. 🔗 Analysis chainConsider security implications and error handling in implementations. The
bytes4 constant TRANSFER_RECEIVED = bytes4(keccak256("fastBridgeTransferReceived(address,uint256,bytes)")); This will allow easy verification in the calling contract. To verify the usage of this interface across the project, run: 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Search for contracts implementing IFastBridgeRecipient
echo "Contracts implementing IFastBridgeRecipient:"
rg --type solidity "contract.*is.*IFastBridgeRecipient"
# Search for calls to fastBridgeTransferReceived
echo "\nCalls to fastBridgeTransferReceived:"
rg --type solidity "fastBridgeTransferReceived\("
Length of output: 361 Script: #!/bin/bash
# Search for contracts implementing IFastBridgeRecipient
echo "Contracts implementing IFastBridgeRecipient:"
rg --glob '*.sol' 'contract\s+\w+\s+is\s+.*IFastBridgeRecipient'
# Search for calls to fastBridgeTransferReceived
echo "\nCalls to fastBridgeTransferReceived:"
rg --glob '*.sol' 'fastBridgeTransferReceived\('
Length of output: 1614 |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -33,10 +33,12 @@ interface IFastBridgeV2 is IFastBridge { | |
/// @param quoteRelayer Relayer that provided the quote for the transaction | ||
/// @param quoteExclusivitySeconds Period of time the quote relayer is guaranteed exclusivity after user's deposit | ||
/// @param quoteId Unique quote identifier used for tracking the quote | ||
/// @param callParams Parameters for the arbitrary call to the destination recipient (if any) | ||
struct BridgeParamsV2 { | ||
address quoteRelayer; | ||
int256 quoteExclusivitySeconds; | ||
bytes quoteId; | ||
bytes callParams; | ||
} | ||
|
||
/// @notice Updated bridge transaction struct to include parameters introduced in FastBridgeV2. | ||
|
@@ -57,6 +59,7 @@ interface IFastBridgeV2 is IFastBridge { | |
uint256 nonce; | ||
address exclusivityRelayer; | ||
uint256 exclusivityEndTime; | ||
bytes callParams; | ||
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 Inconsistencies Found: Some usages of
🔗 Analysis chainConsistency: Added The addition of Consider the following:
To ensure all usages of Let's proceed by searching for Let's verify that all usages of 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Search for usages of BridgeTransactionV2 in the codebase
rg --type solidity -A 5 'BridgeTransactionV2'
Length of output: 78 Script: #!/bin/bash
# Search for usages of BridgeTransactionV2 in .sol files
rg '\bBridgeTransactionV2\b' --type-add 'sol:*.sol' --type sol -A 5
Length of output: 17883 Script: #!/bin/bash
# Find .sol files using BridgeTransactionV2 without mentioning callParams
rg -l '\bBridgeTransactionV2\b' --type-add 'sol:*.sol' --type sol | while read -r file; do
if ! rg -q 'callParams' "$file"; then
echo "$file"
fi
done
Length of output: 1450 |
||
} | ||
|
||
event BridgeQuoteDetails(bytes32 indexed transactionId, bytes quoteId); | ||
|
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
Link Verification Failed: Incorrect Path
The hyperlink to
/docs/About/Routes
does not point to an existing document. It should be updated to/docs/bridge/docs/01-About/03-Routes.md
to correctly reference the Routes documentation.🔗 Analysis chain
Approve link update with verification suggestion.
The update to the hyperlink for supported routes improves navigation within the documentation. However, it's crucial to ensure that the new link
/docs/About/Routes
is correct and accessible.Please run the following script to verify the existence of the linked document:
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
Length of output: 305
Script:
Length of output: 482