deliverydata test

This commit is contained in:
chase-45 2023-04-08 20:39:18 -04:00
parent 7e7594e519
commit b9896fc218
3 changed files with 113 additions and 24 deletions

View File

@ -97,6 +97,8 @@ contract CoreRelayerMessages is CoreRelayerGetters {
instruction.targetRelayProvider = relayProvider.getTargetChainAddress(send.targetChain);
instruction.payload = send.payload;
instruction.executionParameters = IWormholeRelayerInternalStructs.ExecutionParameters({
version: 1,
gasLimit: calculateTargetGasDeliveryAmount(send.targetChain, send.maxTransactionFee, relayProvider)
@ -261,8 +263,8 @@ contract CoreRelayerMessages is CoreRelayerGetters {
/**
* Converts (maxTransactionFee - overhead) from source to target chain currency, using the provider's prices.
* It also applies the assetConversionBuffer, similar to the receiverValue calculation.
*
* It also applies the assetConversionBuffer, similar to the receiverValue calculation.
* @param targetChain uint16
* @param maxTransactionFee uint256
* @param overhead uint256

View File

@ -32,6 +32,9 @@ contract MockRelayerIntegration is IWormholeReceiver {
// map that stores payloads from received VAAs
mapping(bytes32 => bytes) verifiedPayloads;
// map that stores deliverydata from received deliveries
mapping(bytes32 => bytes) deliveryDatas;
// mapping of other MockRelayerIntegration contracts
mapping(uint16 => bytes32) registeredContracts;
@ -56,16 +59,17 @@ contract MockRelayerIntegration is IWormholeReceiver {
payable
returns (uint64 sequence)
{
sequence = sendMessageGeneral(_message, targetChainId, destination, targetChainId, destination, 0);
sequence = sendMessageGeneral(_message, targetChainId, destination, targetChainId, destination, 0, bytes(""));
}
function sendMessageWithRefundAddress(
bytes memory _message,
uint16 targetChainId,
address destination,
address refundAddress
address refundAddress,
bytes memory payload
) public payable returns (uint64 sequence) {
sequence = sendMessageGeneral(_message, targetChainId, destination, targetChainId, refundAddress, 0);
sequence = sendMessageGeneral(_message, targetChainId, destination, targetChainId, refundAddress, 0, payload);
}
function messageInfosCreator(uint64 sequence1, uint64 sequence2)
@ -106,7 +110,7 @@ contract MockRelayerIntegration is IWormholeReceiver {
uint64 sequence1 =
wormhole.publishMessage{value: wormhole.messageFee()}(0, encodeFurtherInstructions(instructions), 200);
sequence = executeSend(
targetChainId, destination, targetChainId, refundAddress, 0, messageInfosCreator(sequence0, sequence1)
targetChainId, destination, targetChainId, refundAddress, 0, bytes(""), messageInfosCreator(sequence0, sequence1)
);
}
@ -116,7 +120,8 @@ contract MockRelayerIntegration is IWormholeReceiver {
address destination,
uint16 refundChain,
address refundAddress,
uint256 receiverValue
uint256 receiverValue,
bytes memory payload
) public payable returns (uint64 sequence) {
uint64 sequence0 = wormhole.publishMessage{value: wormhole.messageFee()}(0, fullMessage, 200);
uint64 sequence1 = wormhole.publishMessage{value: wormhole.messageFee()}(0, abi.encodePacked(uint8(0)), 200);
@ -126,6 +131,7 @@ contract MockRelayerIntegration is IWormholeReceiver {
refundChain,
refundAddress,
receiverValue,
payload,
messageInfosCreator(sequence0, sequence1)
);
}
@ -183,6 +189,7 @@ contract MockRelayerIntegration is IWormholeReceiver {
uint16 refundChainId,
address refundAddress,
uint256 receiverValue,
bytes memory payload,
IWormholeRelayer.MessageInfo[] memory messageInfos
) internal returns (uint64 sequence) {
bytes memory emptyArray;
@ -194,7 +201,7 @@ contract MockRelayerIntegration is IWormholeReceiver {
refundAddress: relayer.toWormholeFormat(address(refundAddress)), // This will be ignored on the target chain if the intent is to perform a forward
maxTransactionFee: msg.value - 3 * wormhole.messageFee() - receiverValue,
receiverValue: receiverValue,
payload: emptyArray,
payload: payload,
relayParameters: relayer.getDefaultRelayParams()
});
@ -208,6 +215,7 @@ contract MockRelayerIntegration is IWormholeReceiver {
bytes[] memory wormholeObservations
) public payable override {
// loop through the array of wormhole observations from the batch and store each payload
deliveryDatas[deliveryData.deliveryHash] = encodeDeliveryData(deliveryData);
uint256 numObservations = wormholeObservations.length;
bytes[] memory messages = new bytes[](numObservations - 1);
uint16 emitterChainId;
@ -282,6 +290,10 @@ contract MockRelayerIntegration is IWormholeReceiver {
return messageHistory[messageHistory.length - 1];
}
function getDeliveryData(bytes32 vaaHash) public returns (DeliveryData memory deliveryData){
deliveryData = decodeDeliveryData(deliveryDatas[vaaHash]);
}
function getMessageHistory() public view returns (bytes[][] memory) {
return messageHistory;
}
@ -372,5 +384,38 @@ contract MockRelayerIntegration is IWormholeReceiver {
furtherInstructions.gasLimits = gasLimits;
}
function encodeDeliveryData(DeliveryData memory deliveryData) public returns (bytes memory encoded){
encoded = abi.encodePacked(
deliveryData.sourceAddress,
deliveryData.sourceChain,
deliveryData.maximumRefund,
deliveryData.deliveryHash,
uint32(deliveryData.payload.length),
deliveryData.payload
);
}
function decodeDeliveryData(bytes memory encoded) public returns (DeliveryData memory deliveryData){
uint256 index = 0;
deliveryData.sourceAddress = encoded.toBytes32(index);
index += 32;
deliveryData.sourceChain = encoded.toUint16(index);
index += 2;
deliveryData.maximumRefund = encoded.toUint256(index);
index += 32;
deliveryData.deliveryHash = encoded.toBytes32(index);
index += 32;
uint32 payloadLength = encoded.toUint32(index);
index += 4;
deliveryData.payload = encoded.slice(index, payloadLength);
index += payloadLength;
}
receive() external payable {}
}

View File

@ -269,7 +269,7 @@ contract WormholeRelayerTests is Test {
setup.source.integration.sendMessageWithRefundAddress{
value: maxTransactionFee + uint256(3) * setup.source.wormhole.messageFee()
}(message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress));
}(message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress), bytes(""));
genericRelayer.relay(setup.sourceChainId);
@ -301,7 +301,8 @@ contract WormholeRelayerTests is Test {
address(setup.target.integration),
setup.targetChainId,
address(setup.target.refundAddress),
receiverValueSource
receiverValueSource,
bytes("")
);
genericRelayer.relay(setup.sourceChainId);
@ -353,7 +354,8 @@ contract WormholeRelayerTests is Test {
address(setup.target.integration),
setup.sourceChainId,
address(setup.source.refundAddress),
0
0,
bytes("")
);
genericRelayer.relay(setup.sourceChainId);
@ -408,7 +410,8 @@ contract WormholeRelayerTests is Test {
address(setup.target.integration),
setup.targetChainId,
address(setup.target.refundAddress),
receiverValueSource
receiverValueSource,
bytes("")
);
genericRelayer.relay(setup.sourceChainId);
@ -630,7 +633,7 @@ contract WormholeRelayerTests is Test {
// The victim requests their message to be sent.
setup.source.integration.sendMessageWithRefundAddress{
value: computeBudget + uint256(3) * setup.source.wormhole.messageFee()
}(victimMsg, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress));
}(victimMsg, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress), bytes(""));
// The relayer delivers the victim's message.
// During the delivery process, the forward request injected by the malicious contract is acknowledged.
@ -659,7 +662,7 @@ contract WormholeRelayerTests is Test {
vm.deal(address(this), paymentNotEnough);
sequence = setup.source.integration.sendMessageWithRefundAddress{value: paymentNotEnough}(
message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress)
message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress), bytes("")
);
genericRelayer.relay(setup.sourceChainId);
@ -700,7 +703,8 @@ contract WormholeRelayerTests is Test {
address(setup.target.integration),
setup.targetChainId,
address(0x0),
newReceiverValueSource
newReceiverValueSource,
bytes("")
);
genericRelayer.relay(setup.sourceChainId);
@ -738,7 +742,8 @@ contract WormholeRelayerTests is Test {
address(setup.target.integration),
setup.targetChainId,
address(0x0),
newReceiverValueSource - 1
newReceiverValueSource - 1,
bytes("")
);
genericRelayer.relay(setup.sourceChainId);
@ -768,7 +773,7 @@ contract WormholeRelayerTests is Test {
vm.recordLogs();
setup.source.integration.sendMessageWithRefundAddress{value: payment}(
message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress)
message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress), bytes("")
);
genericRelayer.relay(setup.sourceChainId);
@ -780,7 +785,7 @@ contract WormholeRelayerTests is Test {
vm.deal(address(this), payment);
setup.source.integration.sendMessageWithRefundAddress{value: payment}(
secondMessage, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress)
secondMessage, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress), bytes("")
);
genericRelayer.relay(setup.sourceChainId);
@ -880,7 +885,7 @@ contract WormholeRelayerTests is Test {
) + 3 * setup.source.wormhole.messageFee();
setup.source.integration.sendMessageWithRefundAddress{value: stack.payment}(
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress, bytes("")
);
prepareDeliveryStack(stack, setup);
@ -919,7 +924,7 @@ contract WormholeRelayerTests is Test {
) + 3 * setup.source.wormhole.messageFee();
setup.source.integration.sendMessageWithRefundAddress{value: stack.payment}(
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress, bytes("")
);
prepareDeliveryStack(stack, setup);
@ -954,7 +959,7 @@ contract WormholeRelayerTests is Test {
) + 3 * setup.source.wormhole.messageFee();
setup.source.integration.sendMessageWithRefundAddress{value: stack.payment}(
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress, bytes("")
);
prepareDeliveryStack(stack, setup);
@ -980,7 +985,7 @@ contract WormholeRelayerTests is Test {
) + 3 * setup.source.wormhole.messageFee();
setup.source.integration.sendMessageWithRefundAddress{value: stack.payment}(
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress, bytes("")
);
prepareDeliveryStack(stack, setup);
@ -1054,7 +1059,7 @@ contract WormholeRelayerTests is Test {
vm.expectRevert(abi.encodeWithSignature("MaxTransactionFeeNotEnough(uint8)", 0));
setup.source.integration.sendMessageWithRefundAddress{value: maxTransactionFee + 3 * wormholeFee}(
message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress)
message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress), bytes("")
);
}
@ -1080,7 +1085,7 @@ contract WormholeRelayerTests is Test {
vm.expectRevert(abi.encodeWithSignature("FundsTooMuch(uint8)", 0));
setup.source.integration.sendMessageWithRefundAddress{
value: maxTransactionFee * 105 / 100 + 1 + 3 * wormholeFee
}(message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress));
}(message, setup.targetChainId, address(setup.target.integration), address(setup.target.refundAddress), bytes(""));
}
function testRevertMultichainSendEmpty(GasParameters memory gasParams, FeeParameters memory feeParams) public {
@ -1245,7 +1250,7 @@ contract WormholeRelayerTests is Test {
vm.expectRevert(abi.encodeWithSignature("RelayProviderDoesNotSupportTargetChain()"));
setup.source.integration.sendMessageWithRefundAddress{value: maxTransactionFee + uint256(3) * wormholeFee}(
message, 32, address(setup.target.integration), address(setup.target.refundAddress)
message, 32, address(setup.target.integration), address(setup.target.refundAddress), bytes("")
);
}
@ -1316,4 +1321,41 @@ contract WormholeRelayerTests is Test {
assertTrue(newInstruction.receiverValueTarget == instruction.receiverValueTarget);
}
function testDeliveryData(
GasParameters memory gasParams, FeeParameters memory feeParams, bytes memory message
) public {
StandardSetupTwoChains memory setup = standardAssumeAndSetupTwoChains(gasParams, feeParams, 1000000);
vm.recordLogs();
DeliveryStack memory stack;
stack.payment = setup.source.coreRelayer.quoteGas(
setup.targetChainId, gasParams.targetGasLimit, address(setup.source.relayProvider)
) + 3 * setup.source.wormhole.messageFee();
bytes memory payload = abi.encodePacked(uint256(6));
setup.source.integration.sendMessageWithRefundAddress{value: stack.payment}(
message, setup.targetChainId, address(setup.target.integration), setup.target.refundAddress, payload
);
prepareDeliveryStack(stack, setup);
setup.target.coreRelayerFull.deliver{value: stack.budget}(stack.package);
IWormholeReceiver.DeliveryData memory deliveryData = setup.target.integration.getDeliveryData(stack.parsed.hash);
// console.log(payload.toUint256(0));
// console.log(deliveryData.payload.toUint256(0));
assertTrue(keccak256(setup.target.integration.getMessage()) == keccak256(message));
assertTrue(setup.target.coreRelayer.fromWormholeFormat(deliveryData.sourceAddress) == address(setup.source.integration));
assertTrue(deliveryData.sourceChain == setup.sourceChainId);
assertTrue(deliveryData.maximumRefund > 0);
assertTrue(deliveryData.deliveryHash == stack.parsed.hash);
assertTrue(keccak256(deliveryData.payload) == keccak256(payload));
}
}