I have seen the revert(add(32, data), datasize)
in multiple contracts in Openzeppelin library. However, I fail to understand what it actually does. It just reverts while returning datasize
bytes from the offset add(32, data)
? But why? Why do we use 32?
Code to reproduce
Following is the code from Address.sol:
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}