Skip to content

Commit af4c1f3

Browse files
committed
Merge branch 'dcmt/explicit-deadline'
2 parents a5458bd + 73efaf4 commit af4c1f3

27 files changed

Lines changed: 69 additions & 24 deletions

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ Master list of UniV3 forks:
4747
payer/solver/relayer) to be `msgSender` (the taker)
4848
* Remove `LimitOrderFeeCollector`
4949

50+
### Non-breaking changes
51+
52+
* Add `NATIVE_CHECK` to taker-submitted Settlers on all chains to correctly
53+
handle the selling of the chain-native asset
54+
5055
## 2025-07-07
5156

5257
### Breaking changes

src/ISettlerActions.sol

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ interface ISettlerActions {
88
function TRANSFER_FROM(address recipient, ISignatureTransfer.PermitTransferFrom memory permit, bytes memory sig)
99
external;
1010

11+
// @dev msgValue is interpreted as an upper bound on the expected msg.value, not as an exact specification
12+
function NATIVE_CHECK(uint256 deadline, uint256 msgValue) external;
13+
1114
/// @dev Transfer funds from metatransaction requestor into the Settler contract using Permit2. Only for use in `Settler.executeMetaTxn` where the signature is provided as calldata
1215
function METATXN_TRANSFER_FROM(address recipient, ISignatureTransfer.PermitTransferFrom memory permit) external;
1316

src/Settler.sol

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import {CalldataDecoder, SettlerBase} from "./SettlerBase.sol";
1212
import {UnsafeMath} from "./utils/UnsafeMath.sol";
1313

1414
import {ISettlerActions} from "./ISettlerActions.sol";
15-
import {revertActionInvalid} from "./core/SettlerErrors.sol";
15+
import {revertActionInvalid, SignatureExpired, MsgValueMismatch} from "./core/SettlerErrors.sol";
16+
17+
// ugh; solidity inheritance
18+
import {SettlerAbstract} from "./SettlerAbstract.sol";
1619

1720
abstract contract Settler is ISettlerTakerSubmitted, Permit2PaymentTakerSubmitted, SettlerBase {
1821
using UnsafeMath for uint256;
@@ -26,6 +29,37 @@ abstract contract Settler is ISettlerTakerSubmitted, Permit2PaymentTakerSubmitte
2629
return false;
2730
}
2831

32+
function _dispatch(uint256 i, uint256 action, bytes calldata data)
33+
internal
34+
virtual
35+
override(SettlerAbstract, SettlerBase)
36+
returns (bool)
37+
{
38+
if (super._dispatch(i, action, data)) {
39+
return true;
40+
} else if (action == uint32(ISettlerActions.NATIVE_CHECK.selector)) {
41+
(uint256 deadline, uint256 msgValue) = abi.decode(data, (uint256, uint256));
42+
if (block.timestamp > deadline) {
43+
assembly ("memory-safe") {
44+
mstore(0x00, 0xcd21db4f) // selector for `SignatureExpired(uint256)`
45+
mstore(0x20, deadline)
46+
revert(0x1c, 0x24)
47+
}
48+
}
49+
if (msg.value > msgValue) {
50+
assembly ("memory-safe") {
51+
mstore(0x00, 0x4a094431) // selector for `MsgValueMismatch(uint256,uint256)`
52+
mstore(0x20, msgValue)
53+
mstore(0x40, callvalue())
54+
revert(0x1c, 0x44)
55+
}
56+
}
57+
} else {
58+
return false;
59+
}
60+
return true;
61+
}
62+
2963
function _dispatchVIP(uint256 action, bytes calldata data) internal virtual returns (bool) {
3064
if (action == uint32(ISettlerActions.TRANSFER_FROM.selector)) {
3165
(address recipient, ISignatureTransfer.PermitTransferFrom memory permit, bytes memory sig) =

src/chains/Arbitrum/TakerSubmitted.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ contract ArbitrumSettler is Settler, ArbitrumMixin {
9090

9191
function _dispatch(uint256 i, uint256 action, bytes calldata data)
9292
internal
93-
override(SettlerAbstract, SettlerBase, ArbitrumMixin)
93+
override(Settler, ArbitrumMixin)
9494
returns (bool)
9595
{
9696
return super._dispatch(i, action, data);

src/chains/Avalanche/TakerSubmitted.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ contract AvalancheSettler is Settler, AvalancheMixin {
6969

7070
function _dispatch(uint256 i, uint256 action, bytes calldata data)
7171
internal
72-
override(SettlerAbstract, SettlerBase, AvalancheMixin)
72+
override(Settler, AvalancheMixin)
7373
returns (bool)
7474
{
7575
return super._dispatch(i, action, data);

src/chains/Base/TakerSubmitted.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ contract BaseSettler is Settler, BaseMixin {
8080

8181
function _dispatch(uint256 i, uint256 action, bytes calldata data)
8282
internal
83-
override(SettlerAbstract, SettlerBase, BaseMixin)
83+
override(Settler, BaseMixin)
8484
returns (bool)
8585
{
8686
return super._dispatch(i, action, data);

src/chains/Berachain/TakerSubmitted.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ contract BerachainSettler is Settler, BerachainMixin {
3939

4040
function _dispatch(uint256 i, uint256 action, bytes calldata data)
4141
internal
42-
override(SettlerAbstract, SettlerBase, BerachainMixin)
42+
override(Settler, BerachainMixin)
4343
returns (bool)
4444
{
4545
return super._dispatch(i, action, data);

src/chains/Blast/TakerSubmitted.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ contract BlastSettler is Settler, BlastMixin {
4949
// Solidity inheritance is stupid
5050
function _dispatch(uint256 i, uint256 action, bytes calldata data)
5151
internal
52-
override(SettlerAbstract, SettlerBase, BlastMixin)
52+
override(Settler, BlastMixin)
5353
returns (bool)
5454
{
5555
return super._dispatch(i, action, data);

src/chains/Bnb/TakerSubmitted.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ contract BnbSettler is Settler, BnbMixin {
8080

8181
function _dispatch(uint256 i, uint256 action, bytes calldata data)
8282
internal
83-
override(SettlerAbstract, SettlerBase, BnbMixin)
83+
override(Settler, BnbMixin)
8484
returns (bool)
8585
{
8686
return super._dispatch(i, action, data);

0 commit comments

Comments
 (0)