Deliver single and request delivery forge tests (#36)
* Tests for 7 errors messages in deliverSingle and 3 error meessages n requestDelivery * Update forge tests to use new CoreRelayer governance * Remove console.sol import * Remove console logs * Changing limit from 2^62-1 to 2^63-1 * Testing changing wormhole fees for all current tests * Run forge fmt, remove [fuzz] params * remove whitespace
This commit is contained in:
parent
b146a7ac82
commit
034a7dd831
|
@ -155,18 +155,20 @@ contract CoreRelayer is CoreRelayerGovernance {
|
|||
|
||||
//REVISE consider deducting the cost of this process from the refund amount?
|
||||
|
||||
//find the delivery instruction for the rollover chain
|
||||
uint16 rolloverInstructionIndex = findDeliveryIndex(container, forwardingRequest.rolloverChain);
|
||||
if (funded) {
|
||||
//find the delivery instruction for the rollover chain
|
||||
uint16 rolloverInstructionIndex = findDeliveryIndex(container, forwardingRequest.rolloverChain);
|
||||
|
||||
//calc how much budget is used by chains other than the rollover chain
|
||||
uint256 rolloverChainCostEstimate = container.requests[rolloverInstructionIndex].computeBudget
|
||||
+ container.requests[rolloverInstructionIndex].applicationBudget;
|
||||
//uint256 nonrolloverBudget = totalMinimumFees - rolloverChainCostEstimate; //stack too deep
|
||||
uint256 rolloverBudget = refundAmount - (totalMinimumFees - rolloverChainCostEstimate)
|
||||
- container.requests[rolloverInstructionIndex].applicationBudget;
|
||||
//calc how much budget is used by chains other than the rollover chain
|
||||
uint256 rolloverChainCostEstimate = container.requests[rolloverInstructionIndex].computeBudget
|
||||
+ container.requests[rolloverInstructionIndex].applicationBudget;
|
||||
//uint256 nonrolloverBudget = totalMinimumFees - rolloverChainCostEstimate; //stack too deep
|
||||
uint256 rolloverBudget = refundAmount - (totalMinimumFees - rolloverChainCostEstimate)
|
||||
- container.requests[rolloverInstructionIndex].applicationBudget;
|
||||
|
||||
//overwrite the gas budget on the rollover chain to the remaining budget amount
|
||||
container.requests[rolloverInstructionIndex].computeBudget = rolloverBudget;
|
||||
//overwrite the gas budget on the rollover chain to the remaining budget amount
|
||||
container.requests[rolloverInstructionIndex].computeBudget = rolloverBudget;
|
||||
}
|
||||
|
||||
//emit forwarding instruction
|
||||
bytes memory reencoded = convertToEncodedDeliveryInstructions(container, funded);
|
||||
|
@ -239,7 +241,7 @@ contract CoreRelayer is CoreRelayerGovernance {
|
|||
(
|
||||
uint256 requestFee,
|
||||
uint256 applicationBudgetTarget,
|
||||
uint256 maximumReund,
|
||||
uint256 maximumRefund,
|
||||
bool isSufficient,
|
||||
string memory reason
|
||||
) = verifyFunding(
|
||||
|
@ -614,8 +616,13 @@ contract CoreRelayer is CoreRelayerGovernance {
|
|||
view
|
||||
returns (uint256 maximumRefund)
|
||||
{
|
||||
uint256 remainder = computeBudget - provider.quoteDeliveryOverhead(targetChain);
|
||||
maximumRefund = quoteAssetConversion(chainId(), remainder, targetChain, provider);
|
||||
uint256 deliveryOverhead = provider.quoteDeliveryOverhead(targetChain);
|
||||
if (computeBudget >= deliveryOverhead) {
|
||||
uint256 remainder = computeBudget - deliveryOverhead;
|
||||
maximumRefund = quoteAssetConversion(chainId(), remainder, targetChain, provider);
|
||||
} else {
|
||||
maximumRefund = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,11 +17,11 @@ contract CoreRelayerGetters is CoreRelayerState {
|
|||
return _state.consumedGovernanceActions[hash];
|
||||
}
|
||||
|
||||
function governanceChainId() public view returns (uint16){
|
||||
function governanceChainId() public view returns (uint16) {
|
||||
return _state.provider.governanceChainId;
|
||||
}
|
||||
|
||||
function governanceContract() public view returns (bytes32){
|
||||
function governanceContract() public view returns (bytes32) {
|
||||
return _state.provider.governanceContract;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ abstract contract CoreRelayerGovernance is
|
|||
ERC1967Upgrade
|
||||
{
|
||||
using BytesLib for bytes;
|
||||
|
||||
event ContractUpgraded(address indexed oldContract, address indexed newContract);
|
||||
|
||||
// "CoreRelayer" (left padded)
|
||||
|
@ -61,7 +62,8 @@ abstract contract CoreRelayerGovernance is
|
|||
|
||||
setConsumedGovernanceAction(vm.hash);
|
||||
|
||||
CoreRelayerLibrary.UpdateDefaultProvider memory provider = CoreRelayerLibrary.parseUpdateDefaultProvider(vm.payload, module);
|
||||
CoreRelayerLibrary.UpdateDefaultProvider memory provider =
|
||||
CoreRelayerLibrary.parseUpdateDefaultProvider(vm.payload, module);
|
||||
|
||||
require((provider.chain == chainId() && !isFork()) || provider.chain == 0, "invalid chain id");
|
||||
|
||||
|
@ -81,7 +83,11 @@ abstract contract CoreRelayerGovernance is
|
|||
emit ContractUpgraded(currentImplementation, newImplementation);
|
||||
}
|
||||
|
||||
function verifyGovernanceVM(bytes memory encodedVM) internal view returns (IWormhole.VM memory parsedVM, bool isValid, string memory invalidReason){
|
||||
function verifyGovernanceVM(bytes memory encodedVM)
|
||||
internal
|
||||
view
|
||||
returns (IWormhole.VM memory parsedVM, bool isValid, string memory invalidReason)
|
||||
{
|
||||
(IWormhole.VM memory vm, bool valid, string memory reason) = wormhole().parseAndVerifyVM(encodedVM);
|
||||
|
||||
if (!valid) {
|
||||
|
|
|
@ -5,9 +5,13 @@ import "../libraries/external/BytesLib.sol";
|
|||
|
||||
library CoreRelayerLibrary {
|
||||
using BytesLib for bytes;
|
||||
|
||||
function parseUpgrade(bytes memory encodedUpgrade, bytes32 module) public pure returns (ContractUpgrade memory cu) {
|
||||
uint index = 0;
|
||||
|
||||
function parseUpgrade(bytes memory encodedUpgrade, bytes32 module)
|
||||
public
|
||||
pure
|
||||
returns (ContractUpgrade memory cu)
|
||||
{
|
||||
uint256 index = 0;
|
||||
|
||||
cu.module = encodedUpgrade.toBytes32(index);
|
||||
index += 32;
|
||||
|
@ -28,8 +32,12 @@ library CoreRelayerLibrary {
|
|||
require(encodedUpgrade.length == index, "invalid ContractUpgrade");
|
||||
}
|
||||
|
||||
function parseRegisterChain(bytes memory encodedRegistration, bytes32 module) public pure returns (RegisterChain memory registerChain) {
|
||||
uint index = 0;
|
||||
function parseRegisterChain(bytes memory encodedRegistration, bytes32 module)
|
||||
public
|
||||
pure
|
||||
returns (RegisterChain memory registerChain)
|
||||
{
|
||||
uint256 index = 0;
|
||||
|
||||
registerChain.module = encodedRegistration.toBytes32(index);
|
||||
index += 32;
|
||||
|
@ -53,8 +61,12 @@ library CoreRelayerLibrary {
|
|||
require(encodedRegistration.length == index, "invalid RegisterChain");
|
||||
}
|
||||
|
||||
function parseUpdateDefaultProvider(bytes memory encodedDefaultProvider, bytes32 module) public pure returns (UpdateDefaultProvider memory defaultProvider) {
|
||||
uint index = 0;
|
||||
function parseUpdateDefaultProvider(bytes memory encodedDefaultProvider, bytes32 module)
|
||||
public
|
||||
pure
|
||||
returns (UpdateDefaultProvider memory defaultProvider)
|
||||
{
|
||||
uint256 index = 0;
|
||||
|
||||
defaultProvider.module = encodedDefaultProvider.toBytes32(index);
|
||||
index += 32;
|
||||
|
@ -65,7 +77,7 @@ library CoreRelayerLibrary {
|
|||
index += 1;
|
||||
|
||||
require(defaultProvider.action == 3, "invalid DefaultProvider");
|
||||
|
||||
|
||||
defaultProvider.chain = encodedDefaultProvider.toUint16(index);
|
||||
index += 2;
|
||||
|
||||
|
@ -86,7 +98,6 @@ library CoreRelayerLibrary {
|
|||
bytes32 module;
|
||||
uint8 action;
|
||||
uint16 chain; //TODO Why is this on this object?
|
||||
|
||||
uint16 emitterChain;
|
||||
bytes32 emitterAddress;
|
||||
}
|
||||
|
@ -98,5 +109,4 @@ library CoreRelayerLibrary {
|
|||
uint16 chain;
|
||||
address newProvider;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ contract CoreRelayerSetters is CoreRelayerState, Context {
|
|||
_state.initializedImplementations[implementation] = true;
|
||||
}
|
||||
|
||||
function setConsumedGovernanceAction(bytes32 hash) internal{
|
||||
function setConsumedGovernanceAction(bytes32 hash) internal {
|
||||
_state.consumedGovernanceActions[hash] = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,15 @@ import "./CoreRelayerGovernance.sol";
|
|||
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol";
|
||||
|
||||
contract CoreRelayerSetup is CoreRelayerSetters, ERC1967Upgrade {
|
||||
function setup(address implementation, uint16 chainId, address wormhole, address defaultRelayProvider, uint16 governanceChainId, bytes32 governanceContract, uint256 evmChainId) public {
|
||||
function setup(
|
||||
address implementation,
|
||||
uint16 chainId,
|
||||
address wormhole,
|
||||
address defaultRelayProvider,
|
||||
uint16 governanceChainId,
|
||||
bytes32 governanceContract,
|
||||
uint256 evmChainId
|
||||
) public {
|
||||
// sanity check initial values
|
||||
require(implementation != address(0), "1"); //"implementation cannot be address(0)");
|
||||
require(wormhole != address(0), "2"); //wormhole cannot be address(0)");
|
||||
|
|
|
@ -6,7 +6,7 @@ pragma solidity ^0.8.0;
|
|||
import "./IRelayProvider.sol";
|
||||
|
||||
interface ICoreRelayerGovernance {
|
||||
function setDefaultRelayProvider(address relayProvider) external;
|
||||
function setDefaultRelayProvider(bytes memory vaa) external;
|
||||
|
||||
function registerCoreRelayerContract(uint16 chainId, bytes32 relayerAddress) external;
|
||||
function registerCoreRelayerContract(bytes memory vaa) external;
|
||||
}
|
||||
|
|
|
@ -94,7 +94,7 @@ contract RelayProvider is RelayProviderGovernance, IRelayProvider {
|
|||
returns (uint64 sequence)
|
||||
{
|
||||
ICoreRelayer cr = ICoreRelayer(coreRelayer());
|
||||
return cr.redeliverSingle{value:msg.value}(targetParams);
|
||||
return cr.redeliverSingle{value: msg.value}(targetParams);
|
||||
}
|
||||
|
||||
function deliverSingle(ICoreRelayer.TargetDeliveryParametersSingle memory targetParams)
|
||||
|
@ -104,6 +104,6 @@ contract RelayProvider is RelayProviderGovernance, IRelayProvider {
|
|||
returns (uint64 sequence)
|
||||
{
|
||||
ICoreRelayer cr = ICoreRelayer(coreRelayer());
|
||||
return cr.deliverSingle{value:msg.value}(targetParams);
|
||||
return cr.deliverSingle{value: msg.value}(targetParams);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -126,5 +126,4 @@ abstract contract RelayProviderGovernance is RelayProviderGetters, RelayProvider
|
|||
require(owner() == _msgSender(), "owner() != _msgSender()");
|
||||
_;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -156,14 +156,16 @@ contract TestCoreRelayer is Test {
|
|||
CoreRelayerProxy myCoreRelayer = new CoreRelayerProxy(
|
||||
address(coreRelayerSetup),
|
||||
abi.encodeWithSelector(
|
||||
bytes4(keccak256("setup(address,uint16,address,address)")),
|
||||
bytes4(keccak256("setup(address,uint16,address,address,uint16,bytes32,uint256)")),
|
||||
address(coreRelayerImplementation),
|
||||
chainId,
|
||||
wormhole,
|
||||
defaultRelayProvider
|
||||
defaultRelayProvider,
|
||||
uint16(1), // governance chain id
|
||||
0x0000000000000000000000000000000000000000000000000000000000000004, // governance contract
|
||||
block.chainid
|
||||
)
|
||||
);
|
||||
|
||||
coreRelayer = ICoreRelayer(address(myCoreRelayer));
|
||||
}
|
||||
|
||||
|
@ -171,7 +173,7 @@ contract TestCoreRelayer is Test {
|
|||
public
|
||||
returns (uint16 sourceId, uint16 targetId, Contracts memory source, Contracts memory target)
|
||||
{
|
||||
uint128 halfMaxUint128 = 2 ** (62) - 1;
|
||||
uint128 halfMaxUint128 = 2 ** (63) - 1;
|
||||
vm.assume(gasParams.evmGasOverhead > 0);
|
||||
vm.assume(gasParams.targetGasLimit > 0);
|
||||
vm.assume(gasParams.targetGasPrice > 0 && gasParams.targetGasPrice < halfMaxUint128);
|
||||
|
@ -189,12 +191,27 @@ contract TestCoreRelayer is Test {
|
|||
|
||||
vm.deal(source.relayer, address(this).balance);
|
||||
vm.deal(target.relayer, address(this).balance);
|
||||
vm.deal(address(target.integration), 2 ** 16 * 100);
|
||||
vm.deal(address(source.integration), 2 ** 16 * 100);
|
||||
|
||||
// set relayProvider prices
|
||||
source.relayProvider.updatePrice(targetId, gasParams.targetGasPrice, gasParams.targetNativePrice);
|
||||
source.relayProvider.updatePrice(sourceId, gasParams.sourceGasPrice, gasParams.sourceNativePrice);
|
||||
target.relayProvider.updatePrice(targetId, gasParams.targetGasPrice, gasParams.targetNativePrice);
|
||||
target.relayProvider.updatePrice(sourceId, gasParams.sourceGasPrice, gasParams.sourceNativePrice);
|
||||
|
||||
source.wormholeSimulator.setMessageFee(gasParams.wormholeFeeOnSource);
|
||||
target.wormholeSimulator.setMessageFee(gasParams.wormholeFeeOnTarget);
|
||||
uint32 wormholeFeeOnTargetInSourceCurrency = uint32(
|
||||
gasParams.wormholeFeeOnTarget * source.relayProvider.quoteAssetPrice(targetId)
|
||||
/ source.relayProvider.quoteAssetPrice(sourceId) + 1
|
||||
);
|
||||
source.relayProvider.updateWormholeFee(targetId, wormholeFeeOnTargetInSourceCurrency);
|
||||
uint32 wormholeFeeOnSourceInTargetCurrency = uint32(
|
||||
gasParams.wormholeFeeOnSource * target.relayProvider.quoteAssetPrice(sourceId)
|
||||
/ target.relayProvider.quoteAssetPrice(targetId) + 1
|
||||
);
|
||||
target.relayProvider.updateWormholeFee(sourceId, wormholeFeeOnSourceInTargetCurrency);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -235,14 +252,41 @@ contract TestCoreRelayer is Test {
|
|||
for (uint16 j = 1; j <= numChains; j++) {
|
||||
map[i].relayProvider.updateDeliveryAddress(j, bytes32(uint256(uint160(map[j].relayer))));
|
||||
map[i].relayProvider.updateRewardAddress(map[i].rewardAddress);
|
||||
map[i].coreRelayerGovernance.registerCoreRelayerContract(
|
||||
j, bytes32(uint256(uint160(address(map[j].coreRelayer))))
|
||||
registerCoreRelayerContract(
|
||||
map[i].coreRelayerGovernance, i, j, bytes32(uint256(uint160(address(map[j].coreRelayer))))
|
||||
);
|
||||
map[i].relayProvider.updateMaximumBudget(j, maxBudget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function registerCoreRelayerContract(
|
||||
ICoreRelayerGovernance governance,
|
||||
uint16 currentChainId,
|
||||
uint16 chainId,
|
||||
bytes32 coreRelayerContractAddress
|
||||
) internal {
|
||||
bytes32 coreRelayerModule = 0x000000000000000000000000000000000000000000436f726552656c61796572;
|
||||
bytes memory message =
|
||||
abi.encodePacked(coreRelayerModule, uint8(2), uint16(currentChainId), chainId, coreRelayerContractAddress);
|
||||
IWormhole.VM memory preSignedMessage = IWormhole.VM({
|
||||
version: 1,
|
||||
timestamp: uint32(block.timestamp),
|
||||
nonce: 0,
|
||||
emitterChainId: relayerWormhole.governanceChainId(),
|
||||
emitterAddress: relayerWormhole.governanceContract(),
|
||||
sequence: 0,
|
||||
consistencyLevel: 200,
|
||||
payload: message,
|
||||
guardianSetIndex: 0,
|
||||
signatures: new IWormhole.Signature[](0),
|
||||
hash: bytes32("")
|
||||
});
|
||||
|
||||
bytes memory signed = relayerWormholeSimulator.encodeAndSignMessage(preSignedMessage);
|
||||
governance.registerCoreRelayerContract(signed);
|
||||
}
|
||||
|
||||
function within(uint256 a, uint256 b, uint256 c) internal view returns (bool) {
|
||||
return (a / b <= c && b / a <= c);
|
||||
}
|
||||
|
@ -284,14 +328,6 @@ contract TestCoreRelayer is Test {
|
|||
uint256 relayerBalance = target.relayer.balance;
|
||||
uint256 rewardAddressBalance = source.rewardAddress.balance;
|
||||
|
||||
map[SOURCE_CHAIN_ID].wormholeSimulator.setMessageFee(gasParams.wormholeFeeOnSource);
|
||||
map[TARGET_CHAIN_ID].wormholeSimulator.setMessageFee(gasParams.wormholeFeeOnTarget);
|
||||
uint32 wormholeFeeOnTargetInSourceCurrency = uint32(
|
||||
gasParams.wormholeFeeOnSource * map[SOURCE_CHAIN_ID].relayProvider.quoteAssetPrice(TARGET_CHAIN_ID)
|
||||
/ map[SOURCE_CHAIN_ID].relayProvider.quoteAssetPrice(SOURCE_CHAIN_ID) + 1
|
||||
);
|
||||
map[SOURCE_CHAIN_ID].relayProvider.updateWormholeFee(TARGET_CHAIN_ID, wormholeFeeOnTargetInSourceCurrency);
|
||||
|
||||
uint256 payment = source.coreRelayer.quoteGasDeliveryFee(
|
||||
TARGET_CHAIN_ID, gasParams.targetGasLimit, source.relayProvider
|
||||
) + source.wormhole.messageFee();
|
||||
|
@ -336,7 +372,10 @@ contract TestCoreRelayer is Test {
|
|||
TARGET_CHAIN_ID, gasParams.targetGasLimit, source.relayProvider
|
||||
) + source.wormhole.messageFee();
|
||||
|
||||
source.integration.sendMessageWithForwardedResponse{value: payment}(
|
||||
uint256 payment2 = target.coreRelayer.quoteGasDeliveryFee(SOURCE_CHAIN_ID, 500000, target.relayProvider)
|
||||
* gasParams.targetNativePrice / gasParams.sourceNativePrice + 1;
|
||||
|
||||
source.integration.sendMessageWithForwardedResponse{value: payment + payment2}(
|
||||
message, TARGET_CHAIN_ID, address(target.integration), address(target.refundAddress)
|
||||
);
|
||||
|
||||
|
@ -543,7 +582,8 @@ contract TestCoreRelayer is Test {
|
|||
stack.parsed = relayerWormhole.parseVM(stack.redeliveryVM);
|
||||
stack.instruction = target.coreRelayer.getRedeliveryByTxHashInstruction(stack.parsed.payload);
|
||||
|
||||
stack.budget = stack.instruction.newMaximumRefundTarget + stack.instruction.newApplicationBudgetTarget;
|
||||
stack.budget = stack.instruction.newMaximumRefundTarget + stack.instruction.newApplicationBudgetTarget
|
||||
+ target.wormhole.messageFee();
|
||||
|
||||
vm.prank(target.relayer);
|
||||
vm.expectRevert(bytes("9"));
|
||||
|
@ -696,11 +736,221 @@ contract TestCoreRelayer is Test {
|
|||
/**
|
||||
* Delivery 18-24
|
||||
*/
|
||||
struct DeliveryStackTooDeep {
|
||||
bytes32 deliveryVaaHash;
|
||||
uint256 payment;
|
||||
uint256 paymentNotEnough;
|
||||
Vm.Log[] entries;
|
||||
bytes actualVM;
|
||||
bytes deliveryVM;
|
||||
bytes[] encodedVMs;
|
||||
IWormhole.VM parsed;
|
||||
uint256 budget;
|
||||
ICoreRelayer.TargetDeliveryParametersSingle package;
|
||||
ICoreRelayer.DeliveryInstruction instruction;
|
||||
}
|
||||
|
||||
function testRevertDeliveryErrors_18_19_20_21_22_23_24(GasParameters memory gasParams, bytes memory message)
|
||||
public
|
||||
{
|
||||
(uint16 SOURCE_CHAIN_ID, uint16 TARGET_CHAIN_ID, Contracts memory source, Contracts memory target) =
|
||||
standardAssumeAndSetupTwoChains(gasParams, 1000000);
|
||||
|
||||
vm.recordLogs();
|
||||
|
||||
DeliveryStackTooDeep memory stack;
|
||||
|
||||
if (
|
||||
uint256(1) * gasParams.targetNativePrice * gasParams.targetGasPrice
|
||||
< uint256(1) * gasParams.sourceNativePrice * gasParams.sourceGasPrice
|
||||
) {
|
||||
stack.paymentNotEnough =
|
||||
source.coreRelayer.quoteGasDeliveryFee(TARGET_CHAIN_ID, 600000, source.relayProvider);
|
||||
|
||||
source.integration.sendMessageWithForwardedResponse{
|
||||
value: stack.paymentNotEnough + source.wormhole.messageFee()
|
||||
}(message, TARGET_CHAIN_ID, address(target.integration), address(target.refundAddress));
|
||||
|
||||
genericRelayer(SOURCE_CHAIN_ID, 2);
|
||||
|
||||
assertTrue(keccak256(target.integration.getMessage()) == keccak256(message));
|
||||
stack.entries = vm.getRecordedLogs();
|
||||
|
||||
stack.actualVM = relayerWormholeSimulator.fetchSignedMessageFromLogs(
|
||||
stack.entries[0], TARGET_CHAIN_ID, address(target.integration)
|
||||
);
|
||||
|
||||
stack.deliveryVM = relayerWormholeSimulator.fetchSignedMessageFromLogs(
|
||||
stack.entries[1], TARGET_CHAIN_ID, address(target.coreRelayer)
|
||||
);
|
||||
|
||||
stack.encodedVMs = new bytes[](2);
|
||||
stack.encodedVMs[0] = stack.actualVM;
|
||||
stack.encodedVMs[1] = stack.deliveryVM;
|
||||
|
||||
stack.package = ICoreRelayer.TargetDeliveryParametersSingle(stack.encodedVMs, 1, 0);
|
||||
|
||||
stack.parsed = relayerWormhole.parseVM(stack.deliveryVM);
|
||||
stack.instruction =
|
||||
target.coreRelayer.getDeliveryInstructionsContainer(stack.parsed.payload).instructions[0];
|
||||
|
||||
stack.budget = stack.instruction.maximumRefundTarget + stack.instruction.applicationBudgetTarget
|
||||
+ target.wormhole.messageFee();
|
||||
|
||||
vm.prank(source.relayer);
|
||||
vm.expectRevert(bytes("20"));
|
||||
source.coreRelayer.deliverSingle{value: stack.budget}(stack.package);
|
||||
}
|
||||
|
||||
stack.payment =
|
||||
source.coreRelayer.quoteGasDeliveryFee(TARGET_CHAIN_ID, gasParams.targetGasLimit, source.relayProvider);
|
||||
|
||||
source.wormhole.publishMessage{value: source.wormhole.messageFee()}(
|
||||
1, abi.encodePacked(uint8(0), bytes("hi!")), 200
|
||||
);
|
||||
|
||||
ICoreRelayer.DeliveryRequest memory deliveryRequest = ICoreRelayer.DeliveryRequest(
|
||||
TARGET_CHAIN_ID, //target chain
|
||||
source.coreRelayer.toWormholeFormat(address(target.integration)),
|
||||
source.coreRelayer.toWormholeFormat(address(target.refundAddress)),
|
||||
stack.payment - source.wormhole.messageFee(),
|
||||
0,
|
||||
source.coreRelayer.getDefaultRelayParams()
|
||||
);
|
||||
|
||||
source.coreRelayer.requestDelivery{value: stack.payment}(deliveryRequest, 1, source.relayProvider);
|
||||
|
||||
stack.entries = vm.getRecordedLogs();
|
||||
|
||||
stack.actualVM =
|
||||
relayerWormholeSimulator.fetchSignedMessageFromLogs(stack.entries[0], SOURCE_CHAIN_ID, address(this));
|
||||
|
||||
stack.deliveryVM = relayerWormholeSimulator.fetchSignedMessageFromLogs(
|
||||
stack.entries[1], SOURCE_CHAIN_ID, address(source.coreRelayer)
|
||||
);
|
||||
|
||||
bytes memory fakeVM = abi.encodePacked(stack.deliveryVM);
|
||||
|
||||
change(fakeVM, fakeVM.length - 1);
|
||||
|
||||
stack.encodedVMs = new bytes[](2);
|
||||
stack.encodedVMs[0] = stack.actualVM;
|
||||
stack.encodedVMs[1] = fakeVM;
|
||||
|
||||
stack.package = ICoreRelayer.TargetDeliveryParametersSingle(stack.encodedVMs, 1, 0);
|
||||
|
||||
stack.parsed = relayerWormhole.parseVM(stack.deliveryVM);
|
||||
stack.instruction = target.coreRelayer.getDeliveryInstructionsContainer(stack.parsed.payload).instructions[0];
|
||||
|
||||
stack.budget = stack.instruction.maximumRefundTarget + stack.instruction.applicationBudgetTarget
|
||||
+ target.wormhole.messageFee();
|
||||
|
||||
vm.prank(target.relayer);
|
||||
vm.expectRevert(bytes("18"));
|
||||
target.coreRelayer.deliverSingle{value: stack.budget}(stack.package);
|
||||
|
||||
stack.encodedVMs[1] = stack.encodedVMs[0];
|
||||
|
||||
stack.package = ICoreRelayer.TargetDeliveryParametersSingle(stack.encodedVMs, 1, 0);
|
||||
|
||||
vm.prank(target.relayer);
|
||||
vm.expectRevert(bytes("19"));
|
||||
target.coreRelayer.deliverSingle{value: stack.budget}(stack.package);
|
||||
|
||||
stack.encodedVMs[1] = stack.deliveryVM;
|
||||
|
||||
stack.package = ICoreRelayer.TargetDeliveryParametersSingle(stack.encodedVMs, 1, 0);
|
||||
|
||||
vm.expectRevert(bytes("21"));
|
||||
target.coreRelayer.deliverSingle{value: stack.budget}(stack.package);
|
||||
|
||||
vm.prank(target.relayer);
|
||||
vm.expectRevert(bytes("22"));
|
||||
target.coreRelayer.deliverSingle{value: stack.budget - 1}(stack.package);
|
||||
|
||||
uint16 differentChainId = 2;
|
||||
if (TARGET_CHAIN_ID == 2) {
|
||||
differentChainId = 3;
|
||||
}
|
||||
|
||||
vm.prank(target.relayer);
|
||||
vm.expectRevert(bytes("24"));
|
||||
map[differentChainId].coreRelayer.deliverSingle{value: stack.budget}(stack.package);
|
||||
|
||||
vm.prank(target.relayer);
|
||||
target.coreRelayer.deliverSingle{value: stack.budget}(stack.package);
|
||||
|
||||
vm.prank(target.relayer);
|
||||
vm.expectRevert(bytes("23"));
|
||||
target.coreRelayer.deliverSingle{value: stack.budget}(stack.package);
|
||||
}
|
||||
|
||||
struct RequestDeliveryStackTooDeep {
|
||||
uint256 payment;
|
||||
ICoreRelayer.DeliveryRequest deliveryRequest;
|
||||
uint256 deliveryOverhead;
|
||||
ICoreRelayer.DeliveryRequest badDeliveryRequest;
|
||||
}
|
||||
/**
|
||||
* Request delivery 25-27
|
||||
*/
|
||||
|
||||
function testRevertRequestDeliveryErrors_25_26_27(GasParameters memory gasParams, bytes memory message) public {
|
||||
(uint16 SOURCE_CHAIN_ID, uint16 TARGET_CHAIN_ID, Contracts memory source, Contracts memory target) =
|
||||
standardAssumeAndSetupTwoChains(gasParams, 1000000);
|
||||
|
||||
vm.recordLogs();
|
||||
|
||||
RequestDeliveryStackTooDeep memory stack;
|
||||
|
||||
stack.payment =
|
||||
source.coreRelayer.quoteGasDeliveryFee(TARGET_CHAIN_ID, gasParams.targetGasLimit, source.relayProvider);
|
||||
|
||||
source.wormhole.publishMessage{value: source.wormhole.messageFee()}(
|
||||
1, abi.encodePacked(uint8(0), bytes("hi!")), 200
|
||||
);
|
||||
|
||||
stack.deliveryRequest = ICoreRelayer.DeliveryRequest(
|
||||
TARGET_CHAIN_ID, //target chain
|
||||
source.coreRelayer.toWormholeFormat(address(target.integration)),
|
||||
source.coreRelayer.toWormholeFormat(address(target.refundAddress)),
|
||||
stack.payment - source.wormhole.messageFee(),
|
||||
0,
|
||||
source.coreRelayer.getDefaultRelayParams()
|
||||
);
|
||||
|
||||
vm.expectRevert(bytes("25"));
|
||||
source.coreRelayer.requestDelivery{value: stack.payment - 1}(stack.deliveryRequest, 1, source.relayProvider);
|
||||
|
||||
source.relayProvider.updateDeliverGasOverhead(TARGET_CHAIN_ID, gasParams.evmGasOverhead);
|
||||
|
||||
stack.deliveryOverhead = source.relayProvider.quoteDeliveryOverhead(TARGET_CHAIN_ID);
|
||||
vm.assume(stack.deliveryOverhead > 0);
|
||||
|
||||
stack.badDeliveryRequest = ICoreRelayer.DeliveryRequest(
|
||||
TARGET_CHAIN_ID, //target chain
|
||||
source.coreRelayer.toWormholeFormat(address(target.integration)),
|
||||
source.coreRelayer.toWormholeFormat(address(target.refundAddress)),
|
||||
stack.deliveryOverhead - 1,
|
||||
0,
|
||||
source.coreRelayer.getDefaultRelayParams()
|
||||
);
|
||||
|
||||
vm.expectRevert(bytes("26"));
|
||||
source.coreRelayer.requestDelivery{value: stack.deliveryOverhead - 1}(
|
||||
stack.badDeliveryRequest, 1, source.relayProvider
|
||||
);
|
||||
|
||||
source.relayProvider.updateDeliverGasOverhead(TARGET_CHAIN_ID, 0);
|
||||
|
||||
source.relayProvider.updateMaximumBudget(
|
||||
TARGET_CHAIN_ID, uint256(gasParams.targetGasLimit - 1) * gasParams.targetGasPrice
|
||||
);
|
||||
|
||||
vm.expectRevert(bytes("27"));
|
||||
source.coreRelayer.requestDelivery{value: stack.payment}(stack.deliveryRequest, 1, source.relayProvider);
|
||||
}
|
||||
|
||||
/**
|
||||
* asset conversoin 28-29
|
||||
*/
|
||||
|
@ -796,8 +1046,10 @@ contract TestCoreRelayer is Test {
|
|||
contracts.coreRelayer.getRedeliveryByTxHashInstruction(parsed.payload);
|
||||
ICoreRelayer.TargetDeliveryParametersSingle memory originalDelivery =
|
||||
pastDeliveries[instruction.sourceTxHash];
|
||||
uint256 budget = instruction.newMaximumRefundTarget + instruction.newApplicationBudgetTarget;
|
||||
uint16 targetChain = instruction.targetChain;
|
||||
uint256 budget = instruction.newMaximumRefundTarget + instruction.newApplicationBudgetTarget
|
||||
+ map[targetChain].wormhole.messageFee();
|
||||
|
||||
ICoreRelayer.TargetRedeliveryByTxHashParamsSingle memory package = ICoreRelayer
|
||||
.TargetRedeliveryByTxHashParamsSingle(
|
||||
encodedVM, originalDelivery.encodedVMs, originalDelivery.deliveryIndex, originalDelivery.multisendIndex
|
||||
|
|
Loading…
Reference in New Issue