Overview
The Flags library provides utilities for setting and reading bit flags that control cross-chain execution behavior.
Library Location: contracts/libraries/Flags.sol
Available Flags
Revert entire transaction if the external call fails
Provide native sender context to the target contract
Send hashed calldata instead of full data
SEND_EXTERNAL_CALL_GAS_LIMIT
Include custom gas limit for external call
Functions
setFlag
function setFlag(uint256 _packedFlags, uint8 _flag, bool _value)
internal pure returns (uint256)
Sets a specific flag to true or false.
getFlag
function getFlag(uint256 _packedFlags, uint8 _flag)
internal pure returns (bool)
Reads the value of a specific flag.
Usage Examples
Setting Flags
Creating Flag Configuration
using Flags for uint256;
// Start with no flags set
uint256 flags = uint256(0);
// Set REVERT_IF_EXTERNAL_FAIL to true
flags = flags.setFlag(Flags.REVERT_IF_EXTERNAL_FAIL, true);
// Set PROXY_WITH_SENDER to true
flags = flags.setFlag(Flags.PROXY_WITH_SENDER, true);
// Chain multiple flags
flags = uint256(0)
.setFlag(Flags.REVERT_IF_EXTERNAL_FAIL, true)
.setFlag(Flags.PROXY_WITH_SENDER, true)
.setFlag(Flags.SEND_EXTERNAL_CALL_GAS_LIMIT, false);
Reading Flags
using Flags for uint256;
bool shouldRevert = flags.getFlag(Flags.REVERT_IF_EXTERNAL_FAIL);
bool proxySender = flags.getFlag(Flags.PROXY_WITH_SENDER);
if (shouldRevert) {
// Handle revert logic
}
Common Flag Combinations
Standard Cross-Chain Call
uint256 flags = uint256(0)
.setFlag(Flags.REVERT_IF_EXTERNAL_FAIL, true)
.setFlag(Flags.PROXY_WITH_SENDER, true);
Reverts on failure and provides sender context.
Fire-and-Forget Message
uint256 flags = uint256(0)
.setFlag(Flags.REVERT_IF_EXTERNAL_FAIL, false)
.setFlag(Flags.PROXY_WITH_SENDER, true);
Doesn’t revert on failure, useful for optional notifications.
Anonymous Call
uint256 flags = uint256(0)
.setFlag(Flags.REVERT_IF_EXTERNAL_FAIL, true)
.setFlag(Flags.PROXY_WITH_SENDER, false);
Doesn’t expose sender information to target.
Integration Pattern
Using Flags in Integration
import "./libraries/Flags.sol";
contract MyBridge {
using Flags for uint256;
function sendWithFlags(bool shouldRevert, bool proxySender) external {
uint256 flags = uint256(0)
.setFlag(Flags.REVERT_IF_EXTERNAL_FAIL, shouldRevert)
.setFlag(Flags.PROXY_WITH_SENDER, proxySender);
debridgeGate.sendMessage(
chainId,
target,
data,
flags,
referralCode
);
}
}
Always use the library functions instead of manual bit manipulation to ensure compatibility with future updates.