Skip to content

deployments and refactor #95

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 0 additions & 21 deletions contracts/interfaces/IWatcherPrecompile.sol
Original file line number Diff line number Diff line change
Expand Up @@ -75,31 +75,10 @@ interface IWatcherPrecompile {
error InvalidSwitchboard();
/// @notice Error thrown when a request is already cancelled
error RequestAlreadyCancelled();

error RequestCancelled();
error AlreadyStarted();
error InvalidLevelNumber();

/// @notice Calculates the digest hash of payload parameters
/// @param params_ The payload parameters
/// @return digest The calculated digest
function getDigest(DigestParams memory params_) external pure returns (bytes32 digest);

/// @notice Gets the batch IDs for a request
/// @param requestCount_ The request count
/// @return Array of batch IDs
function getBatches(uint40 requestCount_) external view returns (uint40[] memory);

/// @notice Gets the payload IDs for a batch
/// @param batchCount_ The batch count
/// @return Array of payload IDs
function getBatchPayloadIds(uint40 batchCount_) external view returns (bytes32[] memory);

/// @notice Gets the payload parameters for a payload ID
/// @param payloadId_ The payload ID
/// @return The payload parameters
function getPayloadParams(bytes32 payloadId_) external view returns (PayloadParams memory);

function setTimeout(
uint256 delayInSeconds_,
bytes calldata payload_
Expand Down
1 change: 0 additions & 1 deletion contracts/protocol/socket/SocketUtils.sol
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ abstract contract SocketUtils is SocketConfig {
address switchboard_,
ExecuteParams memory executeParams_
) internal view returns (bytes32) {
// todo: match with watcher
return
keccak256(
abi.encode(
Expand Down
5 changes: 2 additions & 3 deletions contracts/protocol/watcherPrecompile/RequestHandler.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ abstract contract RequestHandler is WatcherPrecompileCore {
using DumpDecoder for bytes32;

function submitRequest(
PayloadSubmitParams[] calldata payloadSubmitParams
PayloadSubmitParams[] memory payloadSubmitParams
) public returns (uint40 requestCount) {
requestCount = nextRequestCount++;
uint40 batchCount = nextBatchCount;
Expand Down Expand Up @@ -86,7 +86,7 @@ abstract contract RequestHandler is WatcherPrecompileCore {
}

function _checkAppGateways(
PayloadSubmitParams[] calldata payloadSubmitParams
PayloadSubmitParams[] memory payloadSubmitParams
) internal view returns (address appGateway) {
bool isDeliveryHelper = msg.sender == addressResolver__.deliveryHelper();
address coreAppGateway = isDeliveryHelper
Expand All @@ -110,7 +110,6 @@ abstract contract RequestHandler is WatcherPrecompileCore {
uint40 batchCount = r.payloadParamsArray[0].dump.getBatchCount();

uint256 totalPayloadsLeft = _processBatch(requestCount, batchCount);
// todo: for retry cases
r.currentBatchPayloadsLeft = totalPayloadsLeft;
}

Expand Down
41 changes: 30 additions & 11 deletions contracts/protocol/watcherPrecompile/WatcherPrecompile.sol
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,24 @@ contract WatcherPrecompile is RequestHandler {
/// @param delayInSeconds_ The delay in seconds
function setTimeout(
uint256 delayInSeconds_,
bytes calldata payload_
) external returns (bytes32) {
return _setTimeout(payload_, delayInSeconds_);
bytes memory payload_
) external returns (bytes32 timeoutId) {
if (delayInSeconds_ > maxTimeoutDelayInSeconds) revert TimeoutDelayTooLarge();

// from auction manager
watcherPrecompileLimits__.consumeLimit(_getCoreAppGateway(msg.sender), SCHEDULE, 1);
uint256 executeAt = block.timestamp + delayInSeconds_;
timeoutId = _encodeId(evmxSlug, address(this));
timeoutRequests[timeoutId] = TimeoutRequest(
timeoutId,
msg.sender,
delayInSeconds_,
executeAt,
0,
false,
payload_
);
emit TimeoutRequested(timeoutId, msg.sender, payload_, executeAt);
}

/// @notice Ends the timeouts and calls the target address with the callback payload
Expand All @@ -50,7 +65,7 @@ contract WatcherPrecompile is RequestHandler {
function resolveTimeout(
bytes32 timeoutId_,
uint256 signatureNonce_,
bytes calldata signature_
bytes memory signature_
) external {
_isWatcherSignatureValid(
abi.encode(this.resolveTimeout.selector, timeoutId_),
Expand Down Expand Up @@ -106,9 +121,9 @@ contract WatcherPrecompile is RequestHandler {
/// @dev keccak256(abi.encode(switchboard, digest))
function finalized(
bytes32 payloadId_,
bytes calldata proof_,
bytes memory proof_,
uint256 signatureNonce_,
bytes calldata signature_
bytes memory signature_
) external {
_isWatcherSignatureValid(
abi.encode(this.finalized.selector, payloadId_, proof_),
Expand Down Expand Up @@ -143,9 +158,9 @@ contract WatcherPrecompile is RequestHandler {
/// @param resolvedPromises_ Array of resolved promises and their return data
/// @dev Only callable by the contract owner
function resolvePromises(
ResolvedPromises[] calldata resolvedPromises_,
ResolvedPromises[] memory resolvedPromises_,
uint256 signatureNonce_,
bytes calldata signature_
bytes memory signature_
) external {
_isWatcherSignatureValid(
abi.encode(this.resolvePromises.selector, resolvedPromises_),
Expand Down Expand Up @@ -192,7 +207,7 @@ contract WatcherPrecompile is RequestHandler {
bool isRevertingOnchain_,
bytes32 payloadId_,
uint256 signatureNonce_,
bytes calldata signature_
bytes memory signature_
) external {
_isWatcherSignatureValid(
abi.encode(this.markRevert.selector, isRevertingOnchain_, payloadId_),
Expand Down Expand Up @@ -224,9 +239,9 @@ contract WatcherPrecompile is RequestHandler {
// ================== On-Chain Inbox ==================

function callAppGateways(
CallFromChainParams[] calldata params_,
CallFromChainParams[] memory params_,
uint256 signatureNonce_,
bytes calldata signature_
bytes memory signature_
) external {
_isWatcherSignatureValid(
abi.encode(this.callAppGateways.selector, params_),
Expand Down Expand Up @@ -272,4 +287,8 @@ contract WatcherPrecompile is RequestHandler {
function getRequestParams(uint40 requestCount) external view returns (RequestParams memory) {
return requestParams[requestCount];
}

function getBatches(uint40 requestCount) external view returns (uint40[] memory) {
return requestBatchIds[requestCount];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,9 @@ contract WatcherPrecompileConfig is
/// @dev Only callable by the contract owner
/// @dev This helps in verifying that plugs are called by respective app gateways
function setAppGateways(
AppGatewayConfig[] calldata configs_,
AppGatewayConfig[] memory configs_,
uint256 signatureNonce_,
bytes calldata signature_
bytes memory signature_
) external {
_isWatcherSignatureValid(
abi.encode(this.setAppGateways.selector, configs_),
Expand Down
63 changes: 2 additions & 61 deletions contracts/protocol/watcherPrecompile/WatcherPrecompileCore.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pragma solidity ^0.8.21;

import "./WatcherPrecompileStorage.sol";
import {ECDSA} from "solady/utils/ECDSA.sol";
import {AccessControl} from "../utils/AccessControl.sol";
import "solady/auth/Ownable.sol";
import "solady/utils/Initializable.sol";
import {AddressResolverUtil} from "../utils/AddressResolverUtil.sol";

Expand All @@ -13,38 +13,11 @@ abstract contract WatcherPrecompileCore is
IWatcherPrecompile,
WatcherPrecompileStorage,
Initializable,
AccessControl,
Ownable,
AddressResolverUtil
{
using DumpDecoder for bytes32;

// ================== Timeout functions ==================

/// @notice Sets a timeout for a payload execution on app gateway
/// @param payload_ The payload data
/// @param delayInSeconds_ The delay in seconds
function _setTimeout(
bytes calldata payload_,
uint256 delayInSeconds_
) internal returns (bytes32 timeoutId) {
if (delayInSeconds_ > maxTimeoutDelayInSeconds) revert TimeoutDelayTooLarge();

// from auction manager
watcherPrecompileLimits__.consumeLimit(_getCoreAppGateway(msg.sender), SCHEDULE, 1);
uint256 executeAt = block.timestamp + delayInSeconds_;
timeoutId = _encodeId(evmxSlug, address(this));
timeoutRequests[timeoutId] = TimeoutRequest(
timeoutId,
msg.sender,
delayInSeconds_,
executeAt,
0,
false,
payload_
);
emit TimeoutRequested(timeoutId, msg.sender, payload_, executeAt);
}

function _finalize(
PayloadParams memory params_,
address transmitter_
Expand Down Expand Up @@ -174,30 +147,6 @@ abstract contract WatcherPrecompileCore is
return prevDigestsHash;
}

// ================== Helper functions ==================

/// @notice Verifies the connection between chain slug, target, and app gateway
/// @param chainSlug_ The identifier of the chain
/// @param target_ The target address
/// @param appGateway_ The app gateway address to verify
/// @dev Internal function to validate connections
function _verifyConnections(
uint32 chainSlug_,
address target_,
address appGateway_,
address switchboard_
) internal view {
// todo: revisit this
// if target is contractFactoryPlug, return
if (target_ == watcherPrecompileConfig__.contractFactoryPlug(chainSlug_)) return;

(address appGateway, address switchboard) = watcherPrecompileConfig__.getPlugConfigs(
chainSlug_,
target_
);
if (appGateway != appGateway_) revert InvalidGateway();
if (switchboard != switchboard_) revert InvalidSwitchboard();
}

// todo: revisit when we do timeout precompile
function _encodeId(
Expand Down Expand Up @@ -242,15 +191,7 @@ abstract contract WatcherPrecompileCore is
if (signer != owner()) revert InvalidWatcherSignature();
}

function getBatches(uint40 requestCount_) external view returns (uint40[] memory) {
return requestBatchIds[requestCount_];
}

function getBatchPayloadIds(uint40 batchCount_) external view returns (bytes32[] memory) {
return batchPayloadIds[batchCount_];
}

function getPayloadParams(bytes32 payloadId_) external view returns (PayloadParams memory) {
return payloads[payloadId_];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,15 @@ contract WatcherPrecompileLimits is
* @notice Update limit parameters for multiple app gateways
* @param updates_ Array of limit parameter updates
*/
function updateLimitParams(UpdateLimitParams[] calldata updates_) external onlyOwner {
function updateLimitParams(UpdateLimitParams[] memory updates_) external onlyOwner {
_updateLimitParams(updates_);
}

/**
* @notice Internal function to update limit parameters
* @param updates_ Array of limit parameter updates
*/
function _updateLimitParams(UpdateLimitParams[] calldata updates_) internal {
function _updateLimitParams(UpdateLimitParams[] memory updates_) internal {
for (uint256 i = 0; i < updates_.length; i++) {
_consumePartLimit(0, _limitParams[updates_[i].appGateway][updates_[i].limitType]);
_limitParams[updates_[i].appGateway][updates_[i].limitType].maxLimit = updates_[i]
Expand Down
8 changes: 0 additions & 8 deletions deployments/stage_addresses.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,6 @@
"WatcherPrecompile": "0x4b5BcB38014cBdf852Ae6429871E0b1Ac0a05Df8",
"WatcherPrecompileImpl": "0x3cf47Ad0F040dFF1208E649C8f8e23e6B5A08916"
},
"84532": {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why removing these addresses?

"ContractFactoryPlug": "0x693bcDb114a57302Cd687b8Af1bD7583ee56748C",
"FastSwitchboard": "0xf0f51Ba62284A98AbB5D447487d5E6B536DB9B72",
"FeesPlug": "0xe3332D21b49d9347913cca2316FcC1b34fa16914",
"Socket": "0x6D54668ba18B425a1DbFC0BD720145c0aeE97f65",
"SocketBatcher": "0xC559BABEbcD92278E91a545308190E4761efc347",
"startBlock": 22449147
},
"421614": {
"ContractFactoryPlug": "0x78E3A5d21d0dB60bf0A585Cc2105043F919A404b",
"FastSwitchboard": "0x1448E643AbA68a0F1E4C5a3996bA2a355ce3EA8B",
Expand Down
45 changes: 40 additions & 5 deletions test/SetupTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -199,15 +199,50 @@ contract SetupTest is Test {
bytes32[] memory payloadIds = watcherPrecompile.getBatchPayloadIds(batchCount_);

for (uint i = 0; i < payloadIds.length; i++) {
PayloadParams memory payloadParams = watcherPrecompile.getPayloadParams(payloadIds[i]);
if (payloadParams.dump.getCallType() != CallType.READ) {
(bytes32 dump, , , , , , , , , , , , ) = watcherPrecompile.payloads(payloadIds[i]);
if (dump.getCallType() != CallType.READ) {
return false;
}
}

return true;
}

function getPayloadParams(bytes32 payloadId_) internal view returns (PayloadParams memory) {
(
bytes32 dump,
address asyncPromise,
address switchboard,
address target,
address appGateway,
bytes32 payloadId,
bytes32 prevDigestsHash,
uint256 gasLimit,
,
uint256 readAt,
uint256 deadline,
bytes memory payload,
address finalizedTransmitter
) = watcherPrecompile.payloads(payloadId_);

return
PayloadParams({
dump: dump,
asyncPromise: asyncPromise,
switchboard: switchboard,
target: target,
appGateway: appGateway,
payloadId: payloadId,
prevDigestsHash: prevDigestsHash,
gasLimit: gasLimit,
value: 0,
readAt: readAt,
deadline: deadline,
payload: payload,
finalizedTransmitter: finalizedTransmitter
});
}

function _finalizeBatch(
uint40 batchCount_,
bytes[] memory readReturnData_,
Expand All @@ -216,12 +251,12 @@ contract SetupTest is Test {
bytes32[] memory payloadIds = watcherPrecompile.getBatchPayloadIds(batchCount_);

for (uint i = 0; i < payloadIds.length; i++) {
PayloadParams memory payloadParams = watcherPrecompile.getPayloadParams(payloadIds[i]);
PayloadParams memory payloadParams = getPayloadParams(payloadIds[i]);
if (payloadParams.dump.getCallType() == CallType.READ) {
_resolvePromise(payloadParams.payloadId, readReturnData_[readCount_++]);
_resolvePromise(payloadIds[i], payloadParams.payload);
} else {
bytes memory returnData = _uploadProofAndExecute(payloadParams);
_resolvePromise(payloadParams.payloadId, returnData);
_resolvePromise(payloadIds[i], returnData);
}
}
return readCount_;
Expand Down