Skip to content

Commit 53526da

Browse files
authored
Merge pull request #138 from SocketDotTech/till-before-auction
Logic for how a request is submitted to watcher
2 parents 200454e + 76a7efa commit 53526da

35 files changed

+951
-1102
lines changed

contracts/app-gateway/DeliveryHelper.sol

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import "./FeesHelpers.sol";
66
/// @title DeliveryHelper
77
/// @notice Contract for managing payload delivery
88
contract DeliveryHelper is FeesHelpers {
9-
109
/// @notice Calls the watcher precompile to start processing a request
1110
/// @dev If a transmitter was already assigned, it updates the transmitter in watcher precompile too
1211
/// @param requestCount_ The ID of the request
@@ -37,7 +36,7 @@ contract DeliveryHelper is FeesHelpers {
3736

3837
// todo: move it to watcher precompile
3938
if (requestMetadata_.winningBid.transmitter != address(0))
40-
IFeesManager(addressResolver__.feesManager()).unblockAndAssignCredits(
39+
feesManager__().unblockAndAssignCredits(
4140
requestCount_,
4241
requestMetadata_.winningBid.transmitter
4342
);
@@ -77,14 +76,13 @@ contract DeliveryHelper is FeesHelpers {
7776
function _settleFees(uint40 requestCount_) internal {
7877
// If the request has a winning bid, ie. transmitter already assigned, unblock and assign fees
7978
if (requests[requestCount_].winningBid.transmitter != address(0)) {
80-
IFeesManager(addressResolver__.feesManager()).unblockAndAssignCredits(
79+
feesManager__().unblockAndAssignCredits(
8180
requestCount_,
8281
requests[requestCount_].winningBid.transmitter
8382
);
8483
} else {
8584
// If the request has no winning bid, ie. transmitter not assigned, unblock fees
86-
IFeesManager(addressResolver__.feesManager()).unblockCredits(requestCount_);
85+
feesManager__().unblockCredits(requestCount_);
8786
}
8887
}
89-
9088
}

contracts/app-gateway/RequestQueue.sol

Lines changed: 1 addition & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -5,164 +5,21 @@ import "./DeliveryUtils.sol";
55

66
/// @notice Abstract contract for managing asynchronous payloads
77
abstract contract RequestQueue is DeliveryUtils {
8-
// slots [207-257] reserved for gap
9-
uint256[50] _gap_queue_async;
10-
11-
12-
/// @notice Initiates a batch of payloads
13-
/// @param maxFees_ The fees data
14-
/// @param auctionManager_ The auction manager address
15-
/// @return requestCount The ID of the batch
16-
function batch(
17-
uint256 maxFees_,
18-
address auctionManager_,
19-
address consumeFrom_,
20-
bytes memory onCompleteData_
21-
) external returns (uint40 requestCount) {
22-
address appGateway = _getCoreAppGateway(msg.sender);
23-
return _batch(appGateway, auctionManager_, consumeFrom_, maxFees_, onCompleteData_);
24-
}
25-
26-
/// @notice Initiates a batch of payloads
27-
/// @dev it checks fees, payload limits and creates the payload submit params array after assigning proper levels
28-
/// @dev It also modifies the deploy payloads as needed by contract factory plug
29-
/// @dev Stores request metadata and submits the request to watcher precompile
30-
function _batch(
31-
address appGateway_,
32-
address auctionManager_,
33-
address consumeFrom_,
34-
uint256 maxFees_,
35-
bytes memory onCompleteData_
36-
) internal returns (uint40 requestCount) {
37-
if (queuePayloadParams.length == 0) return 0;
38-
39-
BatchParams memory params = BatchParams({
40-
appGateway: appGateway_,
41-
auctionManager: _getAuctionManager(auctionManager_),
42-
maxFees: maxFees_,
43-
onCompleteData: onCompleteData_,
44-
onlyReadRequests: false,
45-
queryCount: 0,
46-
finalizeCount: 0
47-
});
48-
49-
// Split the function into smaller parts
50-
(
51-
PayloadSubmitParams[] memory payloadSubmitParamsArray,
52-
bool onlyReadRequests,
53-
uint256 queryCount,
54-
uint256 finalizeCount
55-
) = _createPayloadSubmitParamsArray();
56-
57-
params.onlyReadRequests = onlyReadRequests;
58-
params.queryCount = queryCount;
59-
params.finalizeCount = finalizeCount;
60-
61-
_checkBatch(consumeFrom_, params.appGateway, params.maxFees);
62-
return _submitBatchRequest(payloadSubmitParamsArray, consumeFrom_, params);
63-
}
64-
658
function _submitBatchRequest(
669
PayloadSubmitParams[] memory payloadSubmitParamsArray,
6710
address consumeFrom_,
6811
BatchParams memory params
6912
) internal returns (uint40 requestCount) {
70-
RequestMetadata memory requestMetadata = RequestMetadata({
71-
appGateway: params.appGateway,
72-
auctionManager: params.auctionManager,
73-
maxFees: params.maxFees,
74-
winningBid: Bid({fee: 0, transmitter: address(0), extraData: new bytes(0)}),
75-
onCompleteData: params.onCompleteData,
76-
onlyReadRequests: params.onlyReadRequests,
77-
consumeFrom: consumeFrom_,
78-
queryCount: params.queryCount,
79-
finalizeCount: params.finalizeCount
80-
});
81-
82-
requestCount = watcherPrecompile__().submitRequest(payloadSubmitParamsArray);
83-
requests[requestCount] = requestMetadata;
84-
85-
if (params.onlyReadRequests) {
86-
watcherPrecompile__().startProcessingRequest(requestCount, address(0));
87-
}
88-
89-
uint256 watcherFees = watcherPrecompileLimits().getTotalFeesRequired(
90-
params.queryCount,
91-
params.finalizeCount,
92-
0,
93-
0
94-
);
95-
if (watcherFees > params.maxFees) revert InsufficientFees();
96-
uint256 maxTransmitterFees = params.maxFees - watcherFees;
97-
9813
emit PayloadSubmitted(
9914
requestCount,
10015
params.appGateway,
10116
payloadSubmitParamsArray,
102-
maxTransmitterFees,
17+
params.maxFees - watcherFees,
10318
params.auctionManager,
10419
params.onlyReadRequests
10520
);
10621
}
10722

108-
function _getAuctionManager(address auctionManager_) internal view returns (address) {
109-
return
110-
auctionManager_ == address(0)
111-
? IAddressResolver(addressResolver__).defaultAuctionManager()
112-
: auctionManager_;
113-
}
114-
115-
function _checkBatch(
116-
address consumeFrom_,
117-
address appGateway_,
118-
uint256 maxFees_
119-
) internal view {
120-
if (queuePayloadParams.length > REQUEST_PAYLOAD_COUNT_LIMIT)
121-
revert RequestPayloadCountLimitExceeded();
122-
123-
if (
124-
!IFeesManager(addressResolver__.feesManager()).isUserCreditsEnough(
125-
consumeFrom_,
126-
appGateway_,
127-
maxFees_
128-
)
129-
) revert InsufficientFees();
130-
}
131-
132-
/// @notice Creates an array of payload details
133-
/// @return payloadDetailsArray An array of payload details
134-
function _createPayloadSubmitParamsArray()
135-
internal
136-
returns (
137-
PayloadSubmitParams[] memory payloadDetailsArray,
138-
bool onlyReadRequests,
139-
uint256 queryCount,
140-
uint256 finalizeCount
141-
)
142-
{
143-
payloadDetailsArray = new PayloadSubmitParams[](queuePayloadParams.length);
144-
onlyReadRequests = queuePayloadParams[0].callType == CallType.READ;
145-
146-
uint256 currentLevel = 0;
147-
for (uint256 i = 0; i < queuePayloadParams.length; i++) {
148-
if (queuePayloadParams[i].callType == CallType.READ) {
149-
queryCount++;
150-
} else {
151-
onlyReadRequests = false;
152-
finalizeCount++;
153-
}
154-
155-
// Update level for calls
156-
if (i > 0 && queuePayloadParams[i].isParallel != Parallel.ON) {
157-
currentLevel = currentLevel + 1;
158-
}
159-
160-
payloadDetailsArray[i] = _createPayloadDetails(currentLevel, queuePayloadParams[i]);
161-
}
162-
163-
clearQueue();
164-
}
165-
16623
function _createDeployPayloadDetails(
16724
QueuePayloadParams memory queuePayloadParams_
16825
) internal returns (bytes memory payload, address target) {
@@ -184,40 +41,4 @@ abstract contract RequestQueue is DeliveryUtils {
18441
// getting app gateway for deployer as the plug is connected to the app gateway
18542
target = getDeliveryHelperPlugAddress(queuePayloadParams_.chainSlug);
18643
}
187-
188-
/// @notice Creates the payload details for a given call parameters
189-
/// @param queuePayloadParams_ The call parameters
190-
/// @return payloadDetails The payload details
191-
function _createPayloadDetails(
192-
uint256 level_,
193-
QueuePayloadParams memory queuePayloadParams_
194-
) internal returns (PayloadSubmitParams memory) {
195-
bytes memory payload = queuePayloadParams_.payload;
196-
address target = queuePayloadParams_.target;
197-
if (queuePayloadParams_.callType == CallType.DEPLOY) {
198-
(payload, target) = _createDeployPayloadDetails(queuePayloadParams_);
199-
}
200-
201-
if (queuePayloadParams_.value > chainMaxMsgValueLimit[queuePayloadParams_.chainSlug])
202-
revert MaxMsgValueLimitExceeded();
203-
204-
return
205-
PayloadSubmitParams({
206-
levelNumber: level_,
207-
chainSlug: queuePayloadParams_.chainSlug,
208-
callType: queuePayloadParams_.callType,
209-
isParallel: queuePayloadParams_.isParallel,
210-
writeFinality: queuePayloadParams_.writeFinality,
211-
asyncPromise: queuePayloadParams_.asyncPromise,
212-
switchboard: queuePayloadParams_.switchboard,
213-
target: target,
214-
appGateway: queuePayloadParams_.appGateway,
215-
gasLimit: queuePayloadParams_.gasLimit == 0
216-
? 10_000_000
217-
: queuePayloadParams_.gasLimit,
218-
value: queuePayloadParams_.value,
219-
readAt: queuePayloadParams_.readAt,
220-
payload: payload
221-
});
222-
}
22344
}

contracts/core/RequestHandler.sol

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ abstract contract RequestHandler is WatcherPrecompileCore {
2121
function submitRequest(
2222
PayloadSubmitParams[] memory payloadSubmitParams_
2323
) public returns (uint40 requestCount) {
24-
address appGateway = _checkAppGateways(payloadSubmitParams_);
25-
2624
requestCount = nextRequestCount++;
2725
uint40 batchCount = nextBatchCount;
2826
uint40 currentBatch = batchCount;
@@ -35,7 +33,7 @@ abstract contract RequestHandler is WatcherPrecompileCore {
3533
PayloadSubmitParams memory p = payloadSubmitParams_[i];
3634

3735
// Count reads and writes for checking limits
38-
if (p.callType == CallType.READ) {
36+
if (p.callType == READ) {
3937
readCount++;
4038
} else writeCount++;
4139

@@ -49,14 +47,6 @@ abstract contract RequestHandler is WatcherPrecompileCore {
4947
}
5048
}
5149

52-
uint40 localPayloadCount = payloadCounter++;
53-
bytes32 payloadId = WatcherIdUtils.createPayloadId(
54-
requestCount,
55-
batchCount,
56-
localPayloadCount,
57-
p.switchboard,
58-
p.chainSlug
59-
);
6050
batchPayloadIds[batchCount].push(payloadId);
6151

6252
bytes32 payloadHeader = PayloadHeaderDecoder.createPayloadHeader(
@@ -73,13 +63,11 @@ abstract contract RequestHandler is WatcherPrecompileCore {
7363
payloads[payloadId].asyncPromise = p.asyncPromise;
7464
payloads[payloadId].switchboard = p.switchboard;
7565
payloads[payloadId].target = p.target;
76-
payloads[payloadId].appGateway = p.callType == CallType.DEPLOY
77-
? addressResolver__.deliveryHelper()
78-
: p.appGateway;
66+
payloads[payloadId].appGateway = p.appGateway;
7967
payloads[payloadId].payloadId = payloadId;
8068
payloads[payloadId].gasLimit = p.gasLimit;
8169
payloads[payloadId].value = p.value;
82-
payloads[payloadId].readAt = p.readAt;
70+
payloads[payloadId].readAtBlockNumber = p.readAtBlockNumber;
8371
payloads[payloadId].payload = p.payload;
8472

8573
requestParams[requestCount].payloadParamsArray.push(payloads[payloadId]);
@@ -89,13 +77,7 @@ abstract contract RequestHandler is WatcherPrecompileCore {
8977
// Push the final batch ID to the request's batch list and increment the counter
9078
// This is needed because the last batch in the loop above doesn't get added since there's no next level to trigger it
9179
requestBatchIds[requestCount].push(nextBatchCount++);
92-
93-
requestParams[requestCount].queryCount = readCount;
94-
requestParams[requestCount].finalizeCount = writeCount;
95-
9680
requestParams[requestCount].currentBatch = currentBatch;
97-
requestParams[requestCount].payloadsRemaining = payloadSubmitParams_.length;
98-
requestParams[requestCount].middleware = msg.sender;
9981

10082
emit RequestSubmitted(
10183
msg.sender,
@@ -111,12 +93,8 @@ abstract contract RequestHandler is WatcherPrecompileCore {
11193
function _checkAppGateways(
11294
PayloadSubmitParams[] memory payloadSubmitParams
11395
) internal view returns (address appGateway) {
114-
bool isDeliveryHelper = msg.sender == addressResolver__.deliveryHelper();
115-
11696
// Get first app gateway and use it as reference
117-
address coreAppGateway = isDeliveryHelper
118-
? _getCoreAppGateway(payloadSubmitParams[0].appGateway)
119-
: _getCoreAppGateway(msg.sender);
97+
address coreAppGateway = _getCoreAppGateway(msg.sender);
12098

12199
// Skip first element since we already checked it
122100
for (uint256 i = 1; i < payloadSubmitParams.length; i++) {
@@ -169,6 +147,4 @@ abstract contract RequestHandler is WatcherPrecompileCore {
169147

170148
r.currentBatchPayloadsLeft = totalPayloads;
171149
}
172-
173-
174150
}

contracts/core/WatcherPrecompileCore.sol

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import "./WatcherPrecompileStorage.sol";
1515
/// @dev This contract implements the core functionality for payload verification, execution, and app configurations
1616
/// @dev It is inherited by WatcherPrecompile and provides the base implementation for request handling
1717
abstract contract WatcherPrecompileCore is
18-
IWatcherPrecompile,
18+
IWatcher,
1919
WatcherPrecompileStorage,
2020
Initializable,
2121
Ownable,
@@ -58,22 +58,6 @@ abstract contract WatcherPrecompileCore is
5858
PayloadParams memory params_,
5959
address transmitter_
6060
) internal returns (bytes32 digest) {
61-
uint32 chainSlug = params_.payloadHeader.getChainSlug();
62-
63-
// Verify that the app gateway is properly configured for this chain and target
64-
watcherPrecompileConfig__.verifyConnections(
65-
chainSlug,
66-
params_.target,
67-
params_.appGateway,
68-
params_.switchboard,
69-
requestParams[params_.payloadHeader.getRequestCount()].middleware
70-
);
71-
72-
_consumeCallbackFeesFromRequestCount(
73-
watcherPrecompileLimits__.finalizeFees(),
74-
params_.payloadHeader.getRequestCount()
75-
);
76-
7761
uint256 deadline = block.timestamp + expiryTime;
7862
payloads[params_.payloadId].deadline = deadline;
7963
payloads[params_.payloadId].finalizedTransmitter = transmitter_;
@@ -107,11 +91,6 @@ abstract contract WatcherPrecompileCore is
10791
/// @param params_ The payload parameters for the query
10892
/// @dev This function sets up a query request and emits a QueryRequested event
10993
function _query(PayloadParams memory params_) internal {
110-
_consumeCallbackFeesFromRequestCount(
111-
watcherPrecompileLimits__.queryFees(),
112-
params_.payloadHeader.getRequestCount()
113-
);
114-
11594
payloads[params_.payloadId].prevDigestsHash = _getPreviousDigestsHash(
11695
params_.payloadHeader.getBatchCount()
11796
);
@@ -184,22 +163,18 @@ abstract contract WatcherPrecompileCore is
184163
return payloadParamsArray;
185164
}
186165

187-
188-
189166
function _consumeCallbackFeesFromRequestCount(uint256 fees_, uint40 requestCount_) internal {
190167
// for callbacks in all precompiles
191168
uint256 feesToConsume = fees_ + watcherPrecompileLimits__.callBackFees();
192-
IFeesManager(addressResolver__.feesManager())
193-
.assignWatcherPrecompileCreditsFromRequestCount(feesToConsume, requestCount_);
169+
feesManager__().assignWatcherPrecompileCreditsFromRequestCount(
170+
feesToConsume,
171+
requestCount_
172+
);
194173
}
195174

196175
function _consumeCallbackFeesFromAddress(uint256 fees_, address consumeFrom_) internal {
197176
// for callbacks in all precompiles
198177
uint256 feesToConsume = fees_ + watcherPrecompileLimits__.callBackFees();
199-
IFeesManager(addressResolver__.feesManager()).assignWatcherPrecompileCreditsFromAddress(
200-
feesToConsume,
201-
consumeFrom_
202-
);
178+
feesManager__().assignWatcherPrecompileCreditsFromAddress(feesToConsume, consumeFrom_);
203179
}
204-
205180
}

0 commit comments

Comments
 (0)