Skip to content

Commit

Permalink
Pedantry
Browse files Browse the repository at this point in the history
  • Loading branch information
duncancmt committed Feb 10, 2025
1 parent 6828a3e commit a374e39
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/allowanceholder/AllowanceHolderContext.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ abstract contract AllowanceHolderContext is Context {
if (sender == address(_ALLOWANCE_HOLDER)) {
// ERC-2771 like usage where the _trusted_ `AllowanceHolder` has appended the appropriate
// msg.sender to the msg data
bytes calldata data = super._msgData();
assembly ("memory-safe") {
sender := shr(0x60, calldataload(sub(calldatasize(), 0x14)))
sender := shr(0x60, calldataload(add(data.offset, sub(data.length, 0x14))))
}
}
}
Expand Down
14 changes: 9 additions & 5 deletions src/multicall/MultiCallContext.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@ abstract contract MultiCallContext is Context {
return super._isForwarded() || super._msgSender() == address(_MULTICALL);
}

function _msgData() internal view override virtual returns (bytes calldata r) {
function _msgData() internal view virtual override returns (bytes calldata r) {
address sender = super._msgSender();
r = super._msgData();
assembly ("memory-safe") {
r.offset := 0x00
r.length :=
xor(
calldatasize(),
r.length,
mul(
xor(calldatasize(), sub(calldatasize(), 0x14)),
xor(r.length, sub(r.length, 0x14)),
eq(_MULTICALL_ADDRESS, and(0xffffffffffffffffffffffffffffffffffffffff, sender))
)
)
Expand All @@ -50,14 +50,18 @@ abstract contract MultiCallContext is Context {

function _msgSender() internal view virtual override returns (address sender) {
sender = super._msgSender();
bytes calldata data = super._msgData();
assembly ("memory-safe") {
sender := and(0xffffffffffffffffffffffffffffffffffffffff, sender)
// ERC-2771. The trusted forwarder (`_MULTICALL`) has appended the appropriate
// msg.sender to the msg data
sender :=
xor(
sender,
mul(xor(sender, shr(0x60, calldataload(sub(calldatasize(), 0x14)))), eq(_MULTICALL_ADDRESS, sender))
mul(
xor(sender, shr(0x60, calldataload(add(data.offset, sub(data.length, 0x14))))),
eq(_MULTICALL_ADDRESS, sender)
)
)
}
}
Expand Down

0 comments on commit a374e39

Please sign in to comment.