@@ -41,7 +41,8 @@ contract CoreRelayerDelivery is CoreRelayerGovernance {
41
41
internal
42
42
returns (bool forwardIsFunded )
43
43
{
44
- DeliveryInstructionsContainer memory container = forwardInstruction.container;
44
+ DeliveryInstructionsContainer memory container =
45
+ decodeDeliveryInstructionsContainer (forwardInstruction.container);
45
46
46
47
// Add any additional funds which were passed in to the forward as msg.value
47
48
transactionFeeRefundAmount = transactionFeeRefundAmount + forwardInstruction.msgValue;
@@ -103,18 +104,17 @@ contract CoreRelayerDelivery is CoreRelayerGovernance {
103
104
*
104
105
* @param internalInstruction instruction to execute
105
106
* @param encodedVMs list of signed wormhole messages (VAAs)
106
- * @param deliveryVaaHash hash of delivery VAA
107
- * @param relayerRefund address to send the relayer's refund to
108
- * @param sourceChain chain id that the delivery originated from
109
- * @param sourceSequence sequence number of the delivery VAA on the source chain
107
+ * @param relayerRefundAddress address to send the relayer's refund to
108
+ * @param vaaInfo struct specifying:
109
+ * - sourceChain chain id that the delivery originated from
110
+ * - sourceSequence sequence number of the delivery VAA on the source chain
111
+ * - deliveryVaaHash hash of delivery VAA
110
112
*/
111
113
function _executeDelivery (
112
114
DeliveryInstruction memory internalInstruction ,
113
115
bytes [] memory encodedVMs ,
114
- bytes32 deliveryVaaHash ,
115
- address payable relayerRefund ,
116
- uint16 sourceChain ,
117
- uint64 sourceSequence
116
+ address payable relayerRefundAddress ,
117
+ DeliveryVAAInfo memory vaaInfo
118
118
) internal {
119
119
// lock the contract to prevent reentrancy
120
120
if (isContractLocked ()) {
@@ -161,26 +161,44 @@ contract CoreRelayerDelivery is CoreRelayerGovernance {
161
161
status = callToTargetContractSucceeded ? DeliveryStatus.SUCCESS : DeliveryStatus.RECEIVER_FAILURE;
162
162
}
163
163
164
+ // Emit a status update that can be read by a SDK
165
+ emit Delivery ({
166
+ recipientContract: fromWormholeFormat (internalInstruction.targetAddress),
167
+ sourceChain: vaaInfo.sourceChain,
168
+ sequence: vaaInfo.sourceSequence,
169
+ deliveryVaaHash: vaaInfo.deliveryVaaHash,
170
+ status: status
171
+ });
172
+
173
+ payRefunds (
174
+ internalInstruction,
175
+ relayerRefundAddress,
176
+ transactionFeeRefundAmount,
177
+ callToTargetContractSucceeded,
178
+ forwardingRequest.isValid,
179
+ forwardIsFunded
180
+ );
181
+ }
182
+
183
+ function payRefunds (
184
+ DeliveryInstruction memory internalInstruction ,
185
+ address payable relayerRefundAddress ,
186
+ uint256 transactionFeeRefundAmount ,
187
+ bool callToTargetContractSucceeded ,
188
+ bool forwardingRequestExists ,
189
+ bool forwardWasFunded
190
+ ) internal {
164
191
// Amount of receiverValue that is refunded to the user (0 if the call to 'receiveWormholeMessages' did not revert, or the full receiverValue otherwise)
165
192
uint256 receiverValueRefundAmount =
166
193
(callToTargetContractSucceeded ? 0 : internalInstruction.receiverValueTarget);
167
194
168
195
// Total refund to the user
169
- uint256 refundToRefundAddress = receiverValueRefundAmount + (forwardIsFunded ? 0 : transactionFeeRefundAmount);
196
+ uint256 refundToRefundAddress = receiverValueRefundAmount + (forwardWasFunded ? 0 : transactionFeeRefundAmount);
170
197
171
198
// Whether or not the refund succeeded
172
199
bool refundPaidToRefundAddress =
173
200
pay (payable (fromWormholeFormat (internalInstruction.refundAddress)), refundToRefundAddress);
174
201
175
- // Emit a status update that can be read by a SDK
176
- emit Delivery ({
177
- recipientContract: fromWormholeFormat (internalInstruction.targetAddress),
178
- sourceChain: sourceChain,
179
- sequence: sourceSequence,
180
- deliveryVaaHash: deliveryVaaHash,
181
- status: status
182
- });
183
-
184
202
uint256 wormholeMessageFee = wormhole ().messageFee ();
185
203
// Funds that the relayer passed as msg.value over what they needed
186
204
uint256 extraRelayerFunds = (
@@ -192,8 +210,8 @@ contract CoreRelayerDelivery is CoreRelayerGovernance {
192
210
// + (the users refund if that refund didn't succeed)
193
211
uint256 relayerRefundAmount = extraRelayerFunds
194
212
+ (internalInstruction.maximumRefundTarget - transactionFeeRefundAmount)
195
- + (forwardingRequest.isValid ? 0 : wormholeMessageFee) + (refundPaidToRefundAddress ? 0 : refundToRefundAddress);
196
- pay (relayerRefund , relayerRefundAmount);
213
+ + (forwardingRequestExists ? 0 : wormholeMessageFee) + (refundPaidToRefundAddress ? 0 : refundToRefundAddress);
214
+ pay (relayerRefundAddress , relayerRefundAmount);
197
215
}
198
216
199
217
function verifyRelayerVM (IWormhole.VM memory vm ) internal view returns (bool ) {
@@ -300,10 +318,12 @@ contract CoreRelayerDelivery is CoreRelayerGovernance {
300
318
_executeDelivery (
301
319
originalInstruction,
302
320
targetParams.sourceEncodedVMs,
303
- originalDeliveryVM.hash,
304
321
targetParams.relayerRefundAddress,
305
- originalDeliveryVM.emitterChainId,
306
- originalDeliveryVM.sequence
322
+ DeliveryVAAInfo ({
323
+ sourceChain: originalDeliveryVM.emitterChainId,
324
+ sourceSequence: originalDeliveryVM.sequence,
325
+ deliveryVaaHash: originalDeliveryVM.hash
326
+ })
307
327
);
308
328
}
309
329
@@ -427,10 +447,12 @@ contract CoreRelayerDelivery is CoreRelayerGovernance {
427
447
_executeDelivery (
428
448
deliveryInstruction,
429
449
targetParams.encodedVMs,
430
- deliveryVM.hash,
431
450
targetParams.relayerRefundAddress,
432
- deliveryVM.emitterChainId,
433
- deliveryVM.sequence
451
+ DeliveryVAAInfo ({
452
+ sourceChain: deliveryVM.emitterChainId,
453
+ sourceSequence: deliveryVM.sequence,
454
+ deliveryVaaHash: deliveryVM.hash
455
+ })
434
456
);
435
457
}
436
458
0 commit comments