Skip to content
Merged
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
6 changes: 6 additions & 0 deletions contracts/interfaces/ISocket.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ interface ISocket {
*/
event ExecutionSuccess(bytes32 payloadId, bytes returnData);

/**
* @notice emits the status of payload after external call
* @param payloadId msg id which is executed
*/
event ExecutionFailed(bytes32 payloadId, bytes returnData);

/**
* @notice emits the config set by a plug for a remoteChainSlug
* @param plug address of plug on current chain
Expand Down
10 changes: 8 additions & 2 deletions contracts/mock/MockSocket.sol
Original file line number Diff line number Diff line change
Expand Up @@ -61,17 +61,23 @@ contract MockSocket is ISocket {
*/
error LowGasLimit();
error InvalidSlug();
error ExecutionFailed();

////////////////////////////////////////////////////////////
////////////////////// State Vars //////////////////////////
////////////////////////////////////////////////////////////
uint64 public callCounter;
uint32 public chainSlug;

enum ExecutionStatus {
NotExecuted,
Executed,
Reverted
}

/**
* @dev keeps track of whether a payload has been executed or not using payload id
*/
mapping(bytes32 => bool) public payloadExecuted;
mapping(bytes32 => ExecutionStatus) public payloadExecuted;

constructor(uint32 chainSlug_, address, address, address, string memory) {
chainSlug = chainSlug_;
Expand Down
25 changes: 18 additions & 7 deletions contracts/protocol/socket/Socket.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ contract Socket is SocketUtils {
/**
* @dev Error emitted when a payload has already been executed
*/
error PayloadAlreadyExecuted();
error PayloadAlreadyExecuted(ExecutionStatus status);
/**
* @dev Error emitted when the executor is not valid
*/
Expand All @@ -39,18 +39,23 @@ contract Socket is SocketUtils {
*/
error LowGasLimit();
error InvalidSlug();
error ExecutionFailed();
error DeadlinePassed();

////////////////////////////////////////////////////////////
////////////////////// State Vars //////////////////////////
////////////////////////////////////////////////////////////
uint64 public callCounter;

enum ExecutionStatus {
NotExecuted,
Executed,
Reverted
}

/**
* @dev keeps track of whether a payload has been executed or not using payload id
*/
mapping(bytes32 => bool) public payloadExecuted;
mapping(bytes32 => ExecutionStatus) public payloadExecuted;

constructor(
uint32 chainSlug_,
Expand Down Expand Up @@ -96,9 +101,10 @@ contract Socket is SocketUtils {
bytes memory transmitterSignature_
) external payable returns (bytes memory) {
// make sure payload is not executed already
if (payloadExecuted[params_.payloadId]) revert PayloadAlreadyExecuted();
if (payloadExecuted[params_.payloadId] != ExecutionStatus.NotExecuted)
revert PayloadAlreadyExecuted(payloadExecuted[params_.payloadId]);
// update state to make sure no reentrancy
payloadExecuted[params_.payloadId] = true;
payloadExecuted[params_.payloadId] = ExecutionStatus.Executed;

if (params_.deadline < block.timestamp) revert DeadlinePassed();

Expand Down Expand Up @@ -165,8 +171,13 @@ contract Socket is SocketUtils {
value: msg.value
}(payload_);

if (!success) revert ExecutionFailed();
emit ExecutionSuccess(payloadId_, returnData);
if (!success) {
payloadExecuted[payloadId_] = ExecutionStatus.Reverted;
emit ExecutionFailed(payloadId_, returnData);
} else {
emit ExecutionSuccess(payloadId_, returnData);
}

return returnData;
}

Expand Down
2 changes: 1 addition & 1 deletion contracts/protocol/watcherPrecompile/WatcherPrecompile.sol
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ contract WatcherPrecompile is WatcherPrecompileConfig, Initializable {
resolvedPromises_[i].returnData[j]
);

if (!success) continue;
if (!success) break;
emit PromiseResolved(resolvedPromises_[i].payloadId, success, next[j]);
}
}
Expand Down
Loading