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:
derpy-duck 2023-01-11 14:11:43 -05:00 committed by GitHub
parent b146a7ac82
commit 034a7dd831
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 334 additions and 52 deletions

View File

@ -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;
}
}
/**

View File

@ -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;
}

View File

@ -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) {

View File

@ -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;
}
}
}

View File

@ -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;
}

View File

@ -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)");

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -126,5 +126,4 @@ abstract contract RelayProviderGovernance is RelayProviderGetters, RelayProvider
require(owner() == _msgSender(), "owner() != _msgSender()");
_;
}
}

View File

@ -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