98 lines
4.0 KiB
Solidity
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);
|
||
|
}
|
||
|
}
|
||
|
}
|