55 lines
1.6 KiB
Solidity
55 lines
1.6 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.6.12;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
import { IERC20 } from "@openzeppelin/contracts-v3/token/ERC20/IERC20.sol";
|
|
import { IRelayerRegistry } from './RelayerAggregator.sol';
|
|
|
|
interface ICore {
|
|
function lockedBalance(address _addr) external view returns (uint256);
|
|
}
|
|
|
|
/**
|
|
* @dev Staked Balance Aggregator
|
|
*/
|
|
contract BalanceAggregator {
|
|
struct StakedBalance {
|
|
uint256 balance;
|
|
bool isContract;
|
|
}
|
|
|
|
IERC20 public immutable torn;
|
|
ICore public immutable core;
|
|
IRelayerRegistry public immutable relayerRegistry;
|
|
|
|
constructor(IERC20 _torn, ICore _core, IRelayerRegistry _relayerRegistry) public {
|
|
torn = _torn;
|
|
core = _core;
|
|
relayerRegistry = _relayerRegistry;
|
|
}
|
|
|
|
function getStakedBalances(address[] memory addresses) external view returns (StakedBalance[] memory) {
|
|
StakedBalance[] memory stakedBalances = new StakedBalance[](addresses.length);
|
|
|
|
for (uint i; i < addresses.length; ++i) {
|
|
stakedBalances[i] = getStaked(addresses[i]);
|
|
}
|
|
|
|
return stakedBalances;
|
|
}
|
|
|
|
function getStaked(address _addr) public view returns (StakedBalance memory) {
|
|
return StakedBalance({
|
|
balance: torn.balanceOf(_addr) + core.lockedBalance(_addr) + relayerRegistry.getRelayerBalance(_addr),
|
|
isContract: isContract(_addr)
|
|
});
|
|
}
|
|
|
|
function isContract(address _addr) public view returns (bool) {
|
|
uint32 size;
|
|
assembly {
|
|
size := extcodesize(_addr)
|
|
}
|
|
return (size > 0);
|
|
}
|
|
} |