Avoid call if the value sent is zero.

This commit is contained in:
Sebastián Claudio Nale 2023-02-17 12:50:15 -03:00 committed by scnale
parent a5427bb177
commit 958d964ad5
1 changed files with 15 additions and 9 deletions

View File

@ -103,7 +103,7 @@ contract CoreRelayer is CoreRelayerGovernance {
emitRedelivery(request, nonce, provider.getConsistencyLevel(), receiverValueTarget, maximumRefund, provider); emitRedelivery(request, nonce, provider.getConsistencyLevel(), receiverValueTarget, maximumRefund, provider);
//Send the delivery fees to the specified address of the provider. //Send the delivery fees to the specified address of the provider.
provider.getRewardAddress().call{value: msg.value - wormhole().messageFee()}(""); pay(provider.getRewardAddress(), msg.value - wormhole().messageFee());
} }
function emitRedelivery( function emitRedelivery(
@ -165,7 +165,7 @@ contract CoreRelayer is CoreRelayerGovernance {
wormhole.publishMessage{value: wormhole.messageFee()}(nonce, container, provider.getConsistencyLevel()); wormhole.publishMessage{value: wormhole.messageFee()}(nonce, container, provider.getConsistencyLevel());
//pay fee to provider //pay fee to provider
provider.getRewardAddress().call{value: totalCost - wormhole.messageFee()}(""); pay(provider.getRewardAddress(), totalCost - wormhole.messageFee());
} }
/** /**
@ -246,7 +246,7 @@ contract CoreRelayer is CoreRelayerGovernance {
// if funded, pay out reward to provider. Otherwise, the delivery code will handle sending a refund. // if funded, pay out reward to provider. Otherwise, the delivery code will handle sending a refund.
if (funded) { if (funded) {
provider.getRewardAddress().call{value: refundAmount}(""); pay(provider.getRewardAddress(), refundAmount);
} }
//clear forwarding request from cache //clear forwarding request from cache
@ -459,8 +459,7 @@ contract CoreRelayer is CoreRelayerGovernance {
status: DeliveryStatus.FORWARD_REQUEST_SUCCESS status: DeliveryStatus.FORWARD_REQUEST_SUCCESS
}); });
} else { } else {
(bool sent,) = fromWormholeFormat(internalInstruction.refundAddress).call{value: weiToRefund}(""); bool sent = pay(payable(fromWormholeFormat(internalInstruction.refundAddress)), weiToRefund);
if (!sent) { if (!sent) {
// if refunding fails, pay out full refund to relayer // if refunding fails, pay out full refund to relayer
weiToRefund = 0; weiToRefund = 0;
@ -474,8 +473,7 @@ contract CoreRelayer is CoreRelayerGovernance {
}); });
} }
} else { } else {
(bool sent,) = fromWormholeFormat(internalInstruction.refundAddress).call{value: weiToRefund}(""); bool sent = pay(payable(fromWormholeFormat(internalInstruction.refundAddress)), weiToRefund);
if (!sent) { if (!sent) {
// if refunding fails, pay out full refund to relayer // if refunding fails, pay out full refund to relayer
weiToRefund = 0; weiToRefund = 0;
@ -504,7 +502,7 @@ contract CoreRelayer is CoreRelayerGovernance {
uint256 wormholeFeePaid = forwardingRequest.isValid ? wormhole.messageFee() : 0; uint256 wormholeFeePaid = forwardingRequest.isValid ? wormhole.messageFee() : 0;
uint256 relayerRefundAmount = msg.value - weiToRefund - receiverValuePaid - wormholeFeePaid; uint256 relayerRefundAmount = msg.value - weiToRefund - receiverValuePaid - wormholeFeePaid;
// refund the rest to relayer // refund the rest to relayer
relayerRefund.call{value: relayerRefundAmount}(""); pay(relayerRefund, relayerRefundAmount);
} }
//REVISE, consider implementing this system into the RelayProvider. //REVISE, consider implementing this system into the RelayProvider.
@ -600,7 +598,7 @@ contract CoreRelayer is CoreRelayerGovernance {
deliveryVaaHash: redeliveryVM.hash, deliveryVaaHash: redeliveryVM.hash,
status: DeliveryStatus.INVALID_REDELIVERY status: DeliveryStatus.INVALID_REDELIVERY
}); });
targetParams.relayerRefundAddress.send(msg.value); pay(targetParams.relayerRefundAddress, msg.value);
return; return;
} }
@ -957,4 +955,12 @@ contract CoreRelayer is CoreRelayerGovernance {
provider.getDeliveryAddress(request.targetChain) provider.getDeliveryAddress(request.targetChain)
); );
} }
function pay(address payable receiver, uint256 amount) internal returns (bool success) {
if (amount > 0) {
(success,) = receiver.call{value: amount}("");
} else {
success = true;
}
}
} }