relay provider proxies through itself

This commit is contained in:
chase-45 2023-01-07 00:14:08 -05:00 committed by Joe Howarth
parent c4df1ecbab
commit d49fec47cc
5 changed files with 58 additions and 0 deletions

View File

@ -6,8 +6,14 @@ pragma solidity ^0.8.0;
import "./RelayProviderGovernance.sol";
import "./RelayProviderStructs.sol";
import "../interfaces/IRelayProvider.sol";
import "../interfaces/ICoreRelayer.sol";
contract RelayProvider is RelayProviderGovernance, IRelayProvider {
modifier onlyApprovedSender() {
require(approvedSender(_msgSender()), "_msgSender() not approved");
_;
}
//Returns the delivery overhead fee required to deliver a message to targetChain, denominated in this chain's wei.
function quoteDeliveryOverhead(uint16 targetChain) public view override returns (uint256 nativePriceQuote) {
uint256 targetFees = deliverGasOverhead(targetChain) * gasPrice(targetChain) + wormholeFee(targetChain);
@ -79,4 +85,25 @@ contract RelayProvider is RelayProviderGovernance, IRelayProvider {
// round up
return (sourceAmount * srcNativeCurrencyPrice + dstNativeCurrencyPrice - 1) / dstNativeCurrencyPrice;
}
//Internal delivery proxies
function redeliverSingle(ICoreRelayer.TargetRedeliveryByTxHashParamsSingle memory targetParams)
public
payable
onlyApprovedSender
returns (uint64 sequence)
{
ICoreRelayer cr = ICoreRelayer(coreRelayer());
return cr.redeliverSingle{value:msg.value}(targetParams);
}
function deliverSingle(ICoreRelayer.TargetDeliveryParametersSingle memory targetParams)
public
payable
onlyApprovedSender
returns (uint64 sequence)
{
ICoreRelayer cr = ICoreRelayer(coreRelayer());
return cr.deliverSingle{value:msg.value}(targetParams);
}
}

View File

@ -24,6 +24,14 @@ contract RelayProviderGetters is RelayProviderState {
return _state.chainId;
}
function coreRelayer() public view returns (address) {
return _state.coreRelayer;
}
function approvedSender(address sender) public view returns (bool) {
return _state.approvedSenders[sender];
}
function gasPrice(uint16 targetChainId) public view returns (uint128) {
return _state.data[targetChainId].gasPrice;
}

View File

@ -17,6 +17,18 @@ abstract contract RelayProviderGovernance is RelayProviderGetters, RelayProvider
event RewardAddressUpdated(address indexed newAddress);
event DeliveryAddressUpdated(uint16 indexed targetChainId, bytes32 indexed newAddress);
event DeliverGasOverheadUpdated(uint32 indexed oldGasOverhead, uint32 indexed newGasOverhead);
event CoreRelayerUpdated(address coreRelayer);
event ApprovedSenderUpdated(address sender, bool approved);
function updateCoreRelayer(address payable newAddress) public onlyOwner {
setCoreRelayer(newAddress);
emit CoreRelayerUpdated(newAddress);
}
function updateApprovedSender(address sender, bool approved) public onlyOwner {
setApprovedSender(sender, approved);
emit ApprovedSenderUpdated(sender, approved);
}
function updateRewardAddress(address newAddress) public onlyOwner {
setRewardAddress(newAddress);
@ -114,4 +126,5 @@ abstract contract RelayProviderGovernance is RelayProviderGetters, RelayProvider
require(owner() == _msgSender(), "owner() != _msgSender()");
_;
}
}

View File

@ -24,6 +24,14 @@ contract RelayProviderSetters is Context, RelayProviderState {
_state.chainId = thisChain;
}
function setCoreRelayer(address payable coreRelayer) internal {
_state.coreRelayer = coreRelayer;
}
function setApprovedSender(address sender, bool approved) internal {
_state.approvedSenders[sender] = approved;
}
function setDeliverGasOverhead(uint16 chainId, uint32 deliverGasOverhead) internal {
_state.deliverGasOverhead[chainId] = deliverGasOverhead;
}

View File

@ -13,12 +13,14 @@ contract RelayProviderStorage {
uint16 chainId;
address owner;
address pendingOwner;
address payable coreRelayer;
mapping(address => bool) initializedImplementations;
mapping(uint16 => PriceData) data;
mapping(uint16 => uint32) deliverGasOverhead;
mapping(uint16 => uint32) wormholeFee;
mapping(uint16 => uint256) maximumBudget;
mapping(uint16 => bytes32) deliveryAddressMap;
mapping(address => bool) approvedSenders;
address rewardAddress;
}
}