contract AaveVoteStrategyToken is IVoteStrategyToken {
  using SafeMath for uint256;

  IERC20 public immutable AAVE;
  IERC20 public immutable STKAAVE;
  string internal constant NAME = 'Aave Vote Strategy (Aave Token + Staked Aave)';
  string internal constant SYMBOL = 'AAVE + stkAAVE';
  uint8 internal constant DECIMALS = 18;

  constructor(IERC20 aave, IERC20 stkAave) public {
    AAVE = aave;
    STKAAVE = stkAave;
  }

  function name() external override view returns (string memory) {
    return NAME;
  }

  function symbol() external override view returns (string memory) {
    return SYMBOL;
  }

  function decimals() external override view returns (uint8) {
    return DECIMALS;
  }

  /**
   * @dev Returns the aggregated AAVE + stkAAVE balance of `voter`
   * @param voter The address of the voter
   * @return The aggregated balance
   */
  function balanceOf(address voter) external override view returns (uint256) {
    return AAVE.balanceOf(voter).add(STKAAVE.balanceOf(voter));
  }
}
/**
 * @title AaveVoteStrategyToken
 * @notice Wrapper contract to allow fetching aggregated balance of AAVE and stkAAVE from an address,
 * used on the AaveProtoGovernance
 * @author Aave
 **/
function balanceOf(address voter) external override view returns (uint256) {
  return AAVE.balanceOf(voter).add(STKAAVE.balanceOf(voter));
}

/**
 * @dev Returns the aggregated AAVE + stkAAVE balance of `voter`
 * @param voter The address of the voter
 * @return The aggregated balance
 */