DCIPs/assets/eip-4886/contracts/Proxiable.sol

98 lines
4.0 KiB
Solidity

// SPDX-License-Identifier: CC0-1.0
// EPSProxy Contracts v1.7.0 (epsproxy/contracts/Proxiable.sol)
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@epsproxy/contracts/EPS.sol";
/**
* @dev Contract module which allows children to implement calls to the EPS
* proxy registry
*/
abstract contract Proxiable is Context {
EPS eps; // Address for the relevant chain passed in on the constructor.
/**
* @dev Constructor initialises the register contract object
*/
constructor(
address _epsRegisterAddress
) {
eps = EPS(_epsRegisterAddress);
}
/**
* @dev Returns the proxied address details (nominator and delivery address) for a passed proxy address
*/
function getAddresses(address _receivedAddress) internal view returns (address nominator, address delivery, bool isProxied) {
return (eps.getAddresses(_receivedAddress));
}
/**
* @dev Returns true if this is currently a proxy address (i.e. has an entry that isn't expired):
*/
function proxyRecordExists(address _receivedAddress) internal view returns (bool isProxied) {
return (eps.proxyRecordExists(_receivedAddress));
}
/**
* @dev Returns an ERC20 token balance for the nominator, if a proxy record exists, or for the address
* passed in if no proxy record exists.
*/
function ERC20BalanceOfNominator(address _receivedAddress, address tokenContract) internal virtual view returns (uint256 _tokenBalance){
address nominator;
address delivery;
bool isProxied;
(nominator, delivery, isProxied) = getAddresses(_receivedAddress);
return IERC20(tokenContract).balanceOf(nominator);
}
/**
* @dev Returns an ERC20 token balance for the nominator, if a proxy record exists, or for the address
* passed in if no proxy record exists, IF we have been passed a bool indicating
* that a proxied address is in use. This function should be used in conjunction with an off-chain call
* to proxyRecordExists that determines if a proxy address is in use, which is then passed in on the call
* to the contract inheriting this method. This saves gas for anyone who is NOT using a proxy as we do not needlessly check for proxy details.
*/
function ERC20BalanceOfNominatorSwitched(address _receivedAddress, address _tokenContract, bool _isProxied) internal virtual view returns (uint256 _tokenBalance){
if (_isProxied) {
return ERC20BalanceOfNominator(_receivedAddress, _tokenContract);
}
else {
return IERC20(_tokenContract).balanceOf(_receivedAddress);
}
}
/**
* @dev Returns an ERC721 token balance for the nominator, if a proxy record exists, or for the address
* passed in if no proxy record exists.
*/
function ERC721BalanceOfNominator(address _proxy, address tokenContract) internal virtual view returns (uint256 _tokenBalance){
address nominator;
address delivery;
bool isProxied;
(nominator, delivery, isProxied) = getAddresses(_proxy);
return IERC721(tokenContract).balanceOf(nominator);
}
/**
* @dev Returns an ERC721 token balance for the nominator, if a proxy record exists, or for the address
* passed in if no proxy record exists, IF we have been passed a bool indicating
* that a proxied address is in use. This function should be used in conjunction with an off-chain call
* to proxyRecordExists that determines if a proxy address is in use, which is then passed in on the call
* to the contract inheriting this method . This saves gas for anyone who is NOT using a proxy as we do not needlessly check for proxy details.
*/
function ERC721BalanceOfNominatorSwitched(address _receivedAddress, address _tokenContract, bool _isProxied) internal virtual view returns (uint256 _tokenBalance){
if (_isProxied) {
return ERC721BalanceOfNominator(_receivedAddress, _tokenContract);
}
else {
return IERC721(_tokenContract).balanceOf(_receivedAddress);
}
}
}