-
Notifications
You must be signed in to change notification settings - Fork 160
Expand file tree
/
Copy pathChainablePostInteraction.sol
More file actions
48 lines (40 loc) · 1.67 KB
/
ChainablePostInteraction.sol
File metadata and controls
48 lines (40 loc) · 1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;
import { IPostInteraction } from "../interfaces/IPostInteraction.sol";
import { IOrderMixin } from "../interfaces/IOrderMixin.sol";
abstract contract ChainablePostInteraction is IPostInteraction {
error ChainablePostInteractionAccessDenied(address caller);
address internal immutable _LOP;
modifier onlyLimitOrderProtocolOrTail(uint80 allowedTail) {
if ((msg.sender != _LOP) && (uint80(uint160(msg.sender)) != allowedTail)) revert ChainablePostInteractionAccessDenied(msg.sender);
_;
}
constructor(address lop) {
_LOP = lop;
}
function postInteraction(
IOrderMixin.Order calldata order,
bytes calldata extension,
bytes32 orderHash,
address taker,
uint256 makingAmount,
uint256 takingAmount,
uint256 remainingMakingAmount,
bytes calldata extraData
) external onlyLimitOrderProtocolOrTail(uint80(bytes10(extraData[20:]))) {
bytes calldata tail = _postInteraction(order, extension, orderHash, taker, makingAmount, takingAmount, remainingMakingAmount, extraData);
if (tail.length > 19) {
IPostInteraction(address(bytes20(tail))).postInteraction(order, extension, orderHash, taker, makingAmount, takingAmount, remainingMakingAmount, tail[20:]);
}
}
function _postInteraction(
IOrderMixin.Order calldata order,
bytes calldata extension,
bytes32 orderHash,
address taker,
uint256 makingAmount,
uint256 takingAmount,
uint256 remainingMakingAmount,
bytes calldata extraData
) internal virtual returns (bytes calldata);
}