deliverydata test
This commit is contained in:
parent
7e7594e519
commit
b9896fc218
|
@ -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
|
||||
|
|
|
@ -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 {}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue