wormhole/ethereum/contracts/relayer/libraries/ExecutionParameters.sol

95 lines
2.7 KiB
Solidity

// SPDX-License-Identifier: Apache 2
pragma solidity ^0.8.19;
import "../../interfaces/relayer/TypedUnits.sol";
import {BytesParsing} from "../../relayer/libraries/BytesParsing.sol";
error UnexpectedExecutionParamsVersion(uint8 version, uint8 expectedVersion);
error UnsupportedExecutionParamsVersion(uint8 version);
error TargetChainAndExecutionParamsVersionMismatch(uint16 targetChain, uint8 version);
error UnexpectedExecutionInfoVersion(uint8 version, uint8 expectedVersion);
error UnsupportedExecutionInfoVersion(uint8 version);
error TargetChainAndExecutionInfoVersionMismatch(uint16 targetChain, uint8 version);
error VersionMismatchOverride(uint8 instructionVersion, uint8 overrideVersion);
using BytesParsing for bytes;
enum ExecutionParamsVersion {EVM_V1}
struct EvmExecutionParamsV1 {
Gas gasLimit;
}
enum ExecutionInfoVersion {EVM_V1}
struct EvmExecutionInfoV1 {
Gas gasLimit;
GasPrice targetChainRefundPerGasUnused;
}
function decodeExecutionParamsVersion(bytes memory data)
pure
returns (ExecutionParamsVersion version)
{
(version) = abi.decode(data, (ExecutionParamsVersion));
}
function decodeExecutionInfoVersion(bytes memory data)
pure
returns (ExecutionInfoVersion version)
{
(version) = abi.decode(data, (ExecutionInfoVersion));
}
function encodeEvmExecutionParamsV1(EvmExecutionParamsV1 memory executionParams)
pure
returns (bytes memory)
{
return abi.encode(uint8(ExecutionParamsVersion.EVM_V1), executionParams.gasLimit);
}
function decodeEvmExecutionParamsV1(bytes memory data)
pure
returns (EvmExecutionParamsV1 memory executionParams)
{
uint8 version;
(version, executionParams.gasLimit) = abi.decode(data, (uint8, Gas));
if (version != uint8(ExecutionParamsVersion.EVM_V1)) {
revert UnexpectedExecutionParamsVersion(version, uint8(ExecutionParamsVersion.EVM_V1));
}
}
function encodeEvmExecutionInfoV1(EvmExecutionInfoV1 memory executionInfo)
pure
returns (bytes memory)
{
return abi.encode(
uint8(ExecutionInfoVersion.EVM_V1),
executionInfo.gasLimit,
executionInfo.targetChainRefundPerGasUnused
);
}
function decodeEvmExecutionInfoV1(bytes memory data)
pure
returns (EvmExecutionInfoV1 memory executionInfo)
{
uint8 version;
(version, executionInfo.gasLimit, executionInfo.targetChainRefundPerGasUnused) =
abi.decode(data, (uint8, Gas, GasPrice));
if (version != uint8(ExecutionInfoVersion.EVM_V1)) {
revert UnexpectedExecutionInfoVersion(version, uint8(ExecutionInfoVersion.EVM_V1));
}
}
function getEmptyEvmExecutionParamsV1()
pure
returns (EvmExecutionParamsV1 memory executionParams)
{
executionParams.gasLimit = Gas.wrap(uint256(0));
}