Skip to content

Commit

Permalink
Merge pull request #56 from catalystdao/I4-typos
Browse files Browse the repository at this point in the history
Last types of verifiable
  • Loading branch information
reednaa authored Jun 21, 2024
2 parents 5e016f8 + db0c96e commit aea83f4
Show file tree
Hide file tree
Showing 9 changed files with 45 additions and 45 deletions.
38 changes: 19 additions & 19 deletions src/IncentivizedMessageEscrow.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ import "./MessagePayload.sol";
* and verify messages. There are 4 functions that an integration has to implement.
* Any implementation of this contract, allows applications to deliver a message to ::submitMessage
* along with the respective incentives.
* The integration (this contract) will handle transfering the message to the destination and
* The integration (this contract) will handle transferring the message to the destination and
* returning an ack from the destination to the integrating application.
*
* The incentive is released when an ack from the destination chain is delivered to this contract.
*
* Beyond making relayer incentives stronger, this contract also implements several quality of life features:
* - Refund unused gas.
* - Seperate gas payments for call and ack.
* - Separate gas payments for call and ack.
* - Simple implementation of new messaging protocols.
*
* Applications integration with Generalised Incentives have to be aware that Acks are replayable.
Expand Down Expand Up @@ -94,7 +94,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
* @notice Verifies the authenticity of a message.
* @dev Should be overwritten by the specific messaging protocol verification structure.
* onRecv. implementations should collect acks so _verifyPacket returns true after acks have been executed once.
* @param messagingProtocolContext Some context that is useful for verifing the message.
* @param messagingProtocolContext Some context that is useful for verifying the message.
* It should not contain the message but instead verification context like signatures, header, etc.
* Context may not be needed for verifying the message and can be prepended to rawMessage.
* @param rawMessage Some kind of package, initially untrusted. Should contain the message as a slice
Expand Down Expand Up @@ -123,7 +123,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
* @param destinationIdentifier The destination chain for the message.
* @param destinationImplementation The destination escrow contract.
* @param message The message. Contains relevant escrow context.
* @param deadline A timestamp that the message should be delivered before. If the AMB does not nativly
* @param deadline A timestamp that the message should be delivered before. If the AMB does not natively
* support a timeout on their messages this parameter should be ignored. If 0 is provided, parse it as MAX.
* @return costOfsendPacketInNativeToken An additional cost to emitting messages in NATIVE tokens.
*/
Expand Down Expand Up @@ -334,8 +334,8 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
* @param destinationIdentifier 32 bytes that identifies the destination chain.
* @param destinationAddress The destination application encoded in 65 bytes: First byte is the length and last 64 is the destination application.
* @param message The message to be sent to the destination. Please ensure the message is block-unique.
* This means that you don't send the same message twice in a single block. If you need to do that, add a nonce or noice.
* @param incentive The incentive to attatch to the bounty. The price of this incentive has to be paid,
* This means that you don't send the same message twice in a single block. If you need to do that, add a nonce or noise.
* @param incentive The incentive to attach to the bounty. The price of this incentive has to be paid,
* any excess is refunded to refundGasTo. (not msg.sender)
* @param deadline After this date, do not allow relayers to execute the message on the destination chain. If set to 0, disable timeouts.
* Not all AMBs may support disabling the deadline. If acks are required it is recommended to set the deadline sometime in the future.
Expand Down Expand Up @@ -477,7 +477,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
revert NotImplementedError();
}

// Check if there is a mis-match between the cost and the value of the message.
// Check if there is a mismatch between the cost and the value of the message.
if (uint128(msg.value) != cost) {
if (uint128(msg.value) > cost) {
// Send the unused gas back to the the user.
Expand Down Expand Up @@ -670,7 +670,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
// First check if the application trusts the implementation on the destination chain.
bytes32 expectedDestinationImplementationHash = implementationAddressHash[fromApplication][destinationIdentifier];
// Check that the application approves the source implementation
// For acks, this should always be the case except when a fradulent applications sends a message to this contract.
// For acks, this should always be the case except when a fraudulent applications sends a message to this contract.
if (expectedDestinationImplementationHash != keccak256(destinationImplementationIdentifier)) revert InvalidImplementationAddress();

// Deliver the ack to the application.
Expand Down Expand Up @@ -825,7 +825,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
}

/**
* @notice Verifies the input parameters are contained messageIdentfier and that the other arguments are valid.
* @notice Verifies the input parameters are contained messageIdentifier and that the other arguments are valid.
* The usage of this function is intended when no parameters of a message can be trusted and we have to verify them.
* This is the case when we receive a timeout, as the timeout had to be emitted without any verification
* on the remote chain, for us to then verify since we know when a message identifier is good AND how to compute it.
Expand All @@ -851,7 +851,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
fromApplication = address(uint160(bytes20(message[FROM_APPLICATION_START_EVM:FROM_APPLICATION_END])));
bytes32 expectedDestinationImplementationHash = implementationAddressHash[fromApplication][destinationIdentifier];
// Check that the application approves of the remote implementation.
// For timeouts, this could fail because of fradulent sender or bad data.
// For timeouts, this could fail because of fraudulent sender or bad data.
if (expectedDestinationImplementationHash != keccak256(implementationIdentifier)) revert InvalidImplementationAddress();

// Do we need to check deadline again?
Expand Down Expand Up @@ -926,7 +926,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
ackFee = gasSpentOnSource * priceOfAckGas;
// deliveryFee + ackFee < 2**144 + 2**144 = 2**145
actualFee = deliveryFee + ackFee;
// (priceOfDeliveryGas * maxGasDelivery + priceOfDeliveryGas * maxGasAck) has been caculated before (escrowBounty) < (2**48 * 2**96) + (2**48 * 2**96) = 2**144 + 2**144 = 2**145
// (priceOfDeliveryGas * maxGasDelivery + priceOfDeliveryGas * maxGasAck) has been calculated before (escrowBounty) < (2**48 * 2**96) + (2**48 * 2**96) = 2**144 + 2**144 = 2**145
uint256 maxDeliveryFee = maxGasDelivery * priceOfDeliveryGas;
uint256 maxAckFee = maxGasAck * priceOfAckGas;
uint256 maxFee = maxDeliveryFee + maxAckFee;
Expand Down Expand Up @@ -1018,7 +1018,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes

/**
* @notice Sets a bounty for a message
* @dev Does not check if enough incentives have been provided, this is delegated as responsiblity
* @dev Does not check if enough incentives have been provided, this is delegated as responsibility
* of the caller of this function.
* @param fromApplication The application that called the contract. Should generally be msg.sender. Is used to separate storage between applications.
* @param destinationIdentifier The destination chain. Combined with fromApplication, this specifics a unique remote escrow implementation.
Expand All @@ -1044,7 +1044,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes

/**
* @notice Allows anyone to re-execute an ack which didn't properly execute.
* @dev No applciation should rely on this function. It should only be used incase an application has faulty logic.
* @dev No application should rely on this function. It should only be used incase an application has faulty logic.
* Example: Faulty logic results in wrong enforcement on gas limit => out of gas?
*
* This function allows replaying acks.
Expand Down Expand Up @@ -1094,21 +1094,21 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
bytes calldata implementationIdentifier,
bytes calldata receiveAckWithContext
) external payable virtual {
// Has the package previously been executed? (otherwise timeout might be more appropiate)
// Has the package previously been executed? (otherwise timeout might be more appropriate)

// Load the messageIdentifier from receiveAckWithContext.
// This makes it slighly easier to retry messages.
// This makes it slightly easier to retry messages.
bytes32 messageIdentifier = bytes32(receiveAckWithContext[MESSAGE_IDENTIFIER_START:MESSAGE_IDENTIFIER_END]);

bytes32 storedAckHash = _messageDelivered[sourceIdentifier][implementationIdentifier][messageIdentifier];
// First, check if there is actually an appropiate hash at the message identifier.
// First, check if there is actually an appropriate hash at the message identifier.
// Then, check if the storedAckHash & the source target (sourceIdentifier & implementationIdentifier) matches the executed one.
if (storedAckHash == bytes32(0) || storedAckHash != keccak256(receiveAckWithContext)) revert CannotRetryWrongMessage(storedAckHash, keccak256(receiveAckWithContext));

// Send the package again.
uint128 cost = _sendPacket(sourceIdentifier, implementationIdentifier, receiveAckWithContext, 0);

// Check if there is a mis-match between the cost and the value of the message.
// Check if there is a mismatch between the cost and the value of the message.
if (uint128(msg.value) != cost) {
if (uint128(msg.value) > cost) {
// Send the unused gas back to the the user.
Expand Down Expand Up @@ -1166,7 +1166,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
// When the message arrives, the usual incentive check ensures only 1 message can arrive. Since the incentive check is based on
// messageIdentifier, we need to verify it.
// Remember, the messageIdentifier is actually untrusted. So it is trivial to pass the above check. However, any way to pass
// the above check fradulently would result in messageIdentifier being wrong and unable to be reproduced on the source chain.
// the above check fraudulently would result in messageIdentifier being wrong and unable to be reproduced on the source chain.

// Load the deadline from the message.
uint64 deadline = uint64(bytes8(message[CTX0_DEADLINE_START:CTX0_DEADLINE_END]));
Expand Down Expand Up @@ -1197,7 +1197,7 @@ abstract contract IncentivizedMessageEscrow is IIncentivizedMessageEscrow, Bytes
0
);

// Check if there is a mis-match between the cost and the value of the message.
// Check if there is a mismatch between the cost and the value of the message.
if (uint128(msg.value) != cost) {
if (uint128(msg.value) > cost) {
// Send the unused gas back to the the user.
Expand Down
14 changes: 7 additions & 7 deletions src/apps/layerzero/IncentivizedLayerZeroEscrow.sol
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,14 @@ contract ExecutorZero is ILayerZeroExecutor {
* the executor. This has to be done for every remote chain & ULN.
*
* This implementation works by breaking the LZ endpoint flow. It relies on the
* `.verfiyable` check on the ULN. When a cross-chain message is verified (step 2)
* `.verifiable` check on the ULN. When a cross-chain message is verified (step 2)
* `commitVerification` is called and it deletes the storage for the verification: https://github.com/LayerZero-Labs/LayerZero-v2/blob/1fde89479fdc68b1a54cda7f19efa84483fcacc4/messagelib/contracts/uln/uln302/ReceiveUln302.sol#L56
* this exactly `verfiyable: true -> false`.
* this exactly `verifiable: true -> false`.
* We break this making the subcall `EndpointV2::verify` revert on _initializable:
* https://github.com/LayerZero-Labs/LayerZero-v2/blob/1fde89479fdc68b1a54cda7f19efa84483fcacc4/protocol/contracts/EndpointV2.sol#L340
* That is the purpose of `allowInitializePath`.
*
* Then we can use `verfiyable` to check if a message has been verified by DVNs.
* Then we can use `verifiable` to check if a message has been verified by DVNs.
*/
contract IncentivizedLayerZeroEscrow is IncentivizedMessageEscrow, ExecutorZero {
using PacketV1Codec for bytes;
Expand Down Expand Up @@ -239,13 +239,13 @@ contract IncentivizedLayerZeroEscrow is IncentivizedMessageEscrow, ExecutorZero
// Verify the message on the LZ ultra light node.
// Without any protection, this is a DoS vector. It is protected by setting allowInitializePath to return false
// As a result, once this returns true it should return true perpetually.
bool verifyable = ULN.verifiable(_config, _headerHash, _payloadHash);
if (!verifyable) {
bool verifiable = ULN.verifiable(_config, _headerHash, _payloadHash);
if (!verifiable) {
// LayerZero may have migrated to a new receive library. Check the timeout receive library.
(address timeoutULN, uint256 expiry) = ENDPOINT.defaultReceiveLibraryTimeout(srcEid);
if (timeoutULN == address(0) || expiry < block.timestamp) revert LZ_ULN_Verifying();
verifyable = IReceiveUlnBase(timeoutULN).verifiable(_config, _headerHash, _payloadHash);
if (!verifyable) revert LZ_ULN_Verifying();
verifiable = IReceiveUlnBase(timeoutULN).verifiable(_config, _headerHash, _payloadHash);
if (!verifiable) revert LZ_ULN_Verifying();
}

// Get the source chain
Expand Down
6 changes: 3 additions & 3 deletions src/apps/mock/OnRecvIncentivizedMockEscrow.sol
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,9 @@ contract OnRecvIncentivizedMockEscrow is IncentivizedMessageEscrow {
bytes32 feeRecipient
) onlyMessagingProtocol external {
uint256 gasLimit = gasleft();
VerifiedMessageHashContext storage _verfiedMessageHashContext = isVerifiedMessageHash[keccak256(rawMessage)];
_verfiedMessageHashContext.chainIdentifier = chainIdentifier;
_verfiedMessageHashContext.implementationIdentifier = destinationImplementationIdentifier;
VerifiedMessageHashContext storage _verifiedMessageHashContext = isVerifiedMessageHash[keccak256(rawMessage)];
_verifiedMessageHashContext.chainIdentifier = chainIdentifier;
_verifiedMessageHashContext.implementationIdentifier = destinationImplementationIdentifier;

_handleAck(chainIdentifier, destinationImplementationIdentifier, rawMessage, feeRecipient, gasLimit);
}
Expand Down
4 changes: 2 additions & 2 deletions src/apps/polymer/vIBCEscrow.sol
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ contract IncentivizedPolymerEscrow is APolymerEscrow, IbcReceiverBase, IbcReceiv
}

function onCloseIbcChannel(bytes32 channelId, string calldata, bytes32) external virtual onlyIbcDispatcher {
// logic to determin if the channel should be closed
// logic to determine if the channel should be closed
bool channelFound = false;
for (uint256 i = 0; i < connectedChannels.length; i++) {
if (connectedChannels[i] == channelId) {
Expand Down Expand Up @@ -158,7 +158,7 @@ contract IncentivizedPolymerEscrow is APolymerEscrow, IbcReceiverBase, IbcReceiv
// Get the payload by removing the implementation identifier.
bytes calldata rawMessage = ack.data[POLYMER_PACKAGE_PAYLOAD_START:];

// Set a verificaiton context so we can recover the ack.
// Set a verification context so we can recover the ack.
isVerifiedMessageHash[keccak256(rawMessage)] = VerifiedMessageHashContext({
chainIdentifier: packet.src.channelId,
implementationIdentifier: destinationImplementationIdentifier
Expand Down
4 changes: 2 additions & 2 deletions src/apps/wormhole/IncentivizedWormholeEscrow.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { IWormhole } from "./interfaces/IWormhole.sol";
/**
* @title Incentivized Wormhole Message Escrow
* @notice Incentivizes Wormhole messages through Generalised Incentives.
* Wormhole does not have any native way of relaying messages, this implemention adds one.
* Wormhole does not have any native way of relaying messages, this implementation adds one.
*
* When using Wormhole with Generalised Incentives and you don't want to lose message, be very careful regarding
* emitting messages to destinationChainIdentifiers that does not exist. Wormhole has no way to verify if a
Expand Down Expand Up @@ -50,7 +50,7 @@ contract IncentivizedWormholeEscrow is IncentivizedMessageEscrow, WormholeVerifi
amount = WORMHOLE.messageFee();
}

/** @notice Wormhole proofs are valid until the guardian set is changed. The new guradian set may sign a new VAA */
/** @notice Wormhole proofs are valid until the guardian set is changed. The new guardian set may sign a new VAA */
function _proofValidPeriod(bytes32 /* destinationIdentifier */) override internal pure returns(uint64) {
return 0;
}
Expand Down
6 changes: 3 additions & 3 deletions src/apps/wormhole/external/callworm/WormholeVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ contract WormholeVerifier is GettersGetter {

constructor(address wormholeState) payable GettersGetter(wormholeState) {}

/// @dev parseAndVerifyVM serves to parse an encodedVM and wholy validate it for consumption
/// @dev parseAndVerifyVM serves to parse an encodedVM and wholly validate it for consumption
function parseAndVerifyVM(bytes calldata encodedVM) public view returns (
SmallStructs.SmallVM memory vm,
bytes calldata payload,
Expand Down Expand Up @@ -91,7 +91,7 @@ contract WormholeVerifier is GettersGetter {


/**
* @dev verifySignatures serves to validate arbitrary sigatures against an arbitrary guardianSet
* @dev verifySignatures serves to validate arbitrary signatures against an arbitrary guardianSet
* - it intentionally does not solve for expectations within guardianSet (you should use verifyVM if you need these protections)
* - it intentioanlly does not solve for quorum (you should use verifyVM if you need these protections)
* - it intentionally returns true when signatures is an empty set (you should use verifyVM if you need these protections)
Expand Down Expand Up @@ -215,7 +215,7 @@ contract WormholeVerifier is GettersGetter {
}

/**
* @dev quorum serves solely to determine the number of signatures required to acheive quorum
* @dev quorum serves solely to determine the number of signatures required to achieve quorum
*/
function quorum(uint numGuardians) public pure virtual returns (uint numSignaturesRequiredForQuorum) {
unchecked {
Expand Down
Loading

0 comments on commit aea83f4

Please sign in to comment.