diff --git a/extras/lbryinc/index.js b/extras/lbryinc/index.js
index 2d86de5fd..df1b0f823 100644
--- a/extras/lbryinc/index.js
+++ b/extras/lbryinc/index.js
@@ -38,8 +38,8 @@ export { syncReducer } from './redux/reducers/sync';
 // selectors
 export { selectAuthToken, selectIsAuthenticating } from './redux/selectors/auth';
 export {
-  makeSelectFetchingCostInfoForUri,
-  makeSelectCostInfoForUri,
+  selectFetchingCostInfoForUri,
+  selectCostInfoForUri,
   selectAllCostInfoByUri,
   selectFetchingCostInfo,
 } from './redux/selectors/cost_info';
diff --git a/extras/lbryinc/redux/selectors/cost_info.js b/extras/lbryinc/redux/selectors/cost_info.js
index b510c7c84..8d5103715 100644
--- a/extras/lbryinc/redux/selectors/cost_info.js
+++ b/extras/lbryinc/redux/selectors/cost_info.js
@@ -1,13 +1,16 @@
-import { createSelector } from 'reselect';
+// @flow
+type State = { costInfo: any };
 
-export const selectState = state => state.costInfo || {};
+export const selectState = (state: State) => state.costInfo || {};
+export const selectAllCostInfoByUri = (state: State) => selectState(state).byUri;
+export const selectFetchingCostInfo = (state: State) => selectState(state).fetching;
 
-export const selectAllCostInfoByUri = createSelector(selectState, state => state.byUri || {});
+export const selectCostInfoForUri = (state: State, uri: string) => {
+  const costInfos = selectAllCostInfoByUri(state);
+  return costInfos && costInfos[uri];
+};
 
-export const makeSelectCostInfoForUri = uri =>
-  createSelector(selectAllCostInfoByUri, costInfos => costInfos && costInfos[uri]);
-
-export const selectFetchingCostInfo = createSelector(selectState, state => state.fetching || {});
-
-export const makeSelectFetchingCostInfoForUri = uri =>
-  createSelector(selectFetchingCostInfo, fetchingByUri => fetchingByUri && fetchingByUri[uri]);
+export const selectFetchingCostInfoForUri = (state: State, uri: string) => {
+  const fetchingByUri = selectFetchingCostInfo(state);
+  return fetchingByUri && fetchingByUri[uri];
+};
diff --git a/ui/component/claimInsufficientCredits/index.js b/ui/component/claimInsufficientCredits/index.js
index 3a0230ea4..e8326006c 100644
--- a/ui/component/claimInsufficientCredits/index.js
+++ b/ui/component/claimInsufficientCredits/index.js
@@ -1,10 +1,10 @@
 import { connect } from 'react-redux';
-import { makeSelectInsufficientCreditsForUri } from 'redux/selectors/content';
+import { selectInsufficientCreditsForUri } from 'redux/selectors/content';
 import { makeSelectClaimWasPurchased } from 'redux/selectors/claims';
 import ClaimInsufficientCredits from './view';
 
 const select = (state, props) => ({
-  isInsufficientCredits: makeSelectInsufficientCreditsForUri(props.uri)(state),
+  isInsufficientCredits: selectInsufficientCreditsForUri(state, props.uri),
   claimWasPurchased: makeSelectClaimWasPurchased(props.uri)(state),
 });
 
diff --git a/ui/component/embedPlayButton/index.js b/ui/component/embedPlayButton/index.js
index 339f02b3b..ec8840c8d 100644
--- a/ui/component/embedPlayButton/index.js
+++ b/ui/component/embedPlayButton/index.js
@@ -2,7 +2,7 @@ import { connect } from 'react-redux';
 import { selectThumbnailForUri, makeSelectClaimForUri } from 'redux/selectors/claims';
 import { doResolveUri } from 'redux/actions/claims';
 import * as SETTINGS from 'constants/settings';
-import { doFetchCostInfoForUri, makeSelectCostInfoForUri } from 'lbryinc';
+import { doFetchCostInfoForUri, selectCostInfoForUri } from 'lbryinc';
 import { doPlayUri, doSetPlayingUri } from 'redux/actions/content';
 import { doAnaltyicsPurchaseEvent } from 'redux/actions/app';
 import { makeSelectClientSetting } from 'redux/selectors/settings';
@@ -14,7 +14,7 @@ const select = (state, props) => ({
   thumbnail: selectThumbnailForUri(state, props.uri),
   claim: makeSelectClaimForUri(props.uri)(state),
   floatingPlayerEnabled: makeSelectClientSetting(SETTINGS.FLOATING_PLAYER)(state),
-  costInfo: makeSelectCostInfoForUri(props.uri)(state),
+  costInfo: selectCostInfoForUri(state, props.uri),
   renderMode: makeSelectFileRenderModeForUri(props.uri)(state),
 });
 
diff --git a/ui/component/fileActions/index.js b/ui/component/fileActions/index.js
index 78d76d263..a7dfda1e1 100644
--- a/ui/component/fileActions/index.js
+++ b/ui/component/fileActions/index.js
@@ -8,7 +8,7 @@ import {
 import { makeSelectStreamingUrlForUri, makeSelectFileInfoForUri } from 'redux/selectors/file_info';
 import { doPrepareEdit } from 'redux/actions/publish';
 import { DISABLE_COMMENTS_TAG } from 'constants/tags';
-import { makeSelectCostInfoForUri } from 'lbryinc';
+import { selectCostInfoForUri } from 'lbryinc';
 import { doSetPlayingUri, doPlayUri } from 'redux/actions/content';
 import { doToast } from 'redux/actions/notifications';
 import { doOpenModal, doSetActiveChannel, doSetIncognito, doAnalyticsView } from 'redux/actions/app';
@@ -24,7 +24,7 @@ const select = (state, props) => {
     claimIsMine: selectClaimIsMine(state, claim),
     fileInfo: makeSelectFileInfoForUri(props.uri)(state),
     renderMode: makeSelectFileRenderModeForUri(props.uri)(state),
-    costInfo: makeSelectCostInfoForUri(props.uri)(state),
+    costInfo: selectCostInfoForUri(state, props.uri),
     hasChannels: selectHasChannels(state),
     reactionsDisabled: makeSelectTagInClaimOrChannelForUri(props.uri, DISABLE_COMMENTS_TAG)(state),
     streamingUrl: makeSelectStreamingUrlForUri(props.uri)(state),
diff --git a/ui/component/fileDownloadLink/index.js b/ui/component/fileDownloadLink/index.js
index bf4ad34d3..5ae3b0cfa 100644
--- a/ui/component/fileDownloadLink/index.js
+++ b/ui/component/fileDownloadLink/index.js
@@ -6,7 +6,7 @@ import {
   makeSelectLoadingForUri,
   makeSelectStreamingUrlForUri,
 } from 'redux/selectors/file_info';
-import { makeSelectCostInfoForUri } from 'lbryinc';
+import { selectCostInfoForUri } from 'lbryinc';
 import { doOpenModal, doAnalyticsView } from 'redux/actions/app';
 import { doSetPlayingUri, doPlayUri } from 'redux/actions/content';
 import FileDownloadLink from './view';
@@ -20,7 +20,7 @@ const select = (state, props) => {
     loading: makeSelectLoadingForUri(props.uri)(state),
     claimIsMine: selectClaimIsMine(state, claim),
     claim,
-    costInfo: makeSelectCostInfoForUri(props.uri)(state),
+    costInfo: selectCostInfoForUri(state, props.uri),
     claimWasPurchased: makeSelectClaimWasPurchased(props.uri)(state),
     streamingUrl: makeSelectStreamingUrlForUri(props.uri)(state),
   };
diff --git a/ui/component/filePrice/index.js b/ui/component/filePrice/index.js
index 560f38b96..3c816eb18 100644
--- a/ui/component/filePrice/index.js
+++ b/ui/component/filePrice/index.js
@@ -1,6 +1,6 @@
 import { connect } from 'react-redux';
 import { selectClaimForUri, makeSelectClaimWasPurchased, selectClaimIsMine } from 'redux/selectors/claims';
-import { makeSelectCostInfoForUri, doFetchCostInfoForUri, makeSelectFetchingCostInfoForUri } from 'lbryinc';
+import { selectCostInfoForUri, doFetchCostInfoForUri, selectFetchingCostInfoForUri } from 'lbryinc';
 import FilePrice from './view';
 
 const select = (state, props) => {
@@ -10,8 +10,8 @@ const select = (state, props) => {
     claim,
     claimIsMine: selectClaimIsMine(state, claim),
     claimWasPurchased: makeSelectClaimWasPurchased(props.uri)(state),
-    costInfo: makeSelectCostInfoForUri(props.uri)(state),
-    fetching: makeSelectFetchingCostInfoForUri(props.uri)(state),
+    costInfo: selectCostInfoForUri(state, props.uri),
+    fetching: selectFetchingCostInfoForUri(state, props.uri),
   };
 };
 
diff --git a/ui/component/fileRenderFloating/index.js b/ui/component/fileRenderFloating/index.js
index 6de8b8e1b..0f54c8f75 100644
--- a/ui/component/fileRenderFloating/index.js
+++ b/ui/component/fileRenderFloating/index.js
@@ -13,7 +13,7 @@ import {
   makeSelectFileRenderModeForUri,
 } from 'redux/selectors/content';
 import { makeSelectClientSetting } from 'redux/selectors/settings';
-import { makeSelectCostInfoForUri } from 'lbryinc';
+import { selectCostInfoForUri } from 'lbryinc';
 import { doPlayUri, doSetPlayingUri } from 'redux/actions/content';
 import { doFetchRecommendedContent } from 'redux/actions/search';
 import { doAnaltyicsPurchaseEvent } from 'redux/actions/app';
@@ -38,7 +38,7 @@ const select = (state, props) => {
     floatingPlayerEnabled: makeSelectClientSetting(SETTINGS.FLOATING_PLAYER)(state),
     renderMode: makeSelectFileRenderModeForUri(uri)(state),
     videoTheaterMode: makeSelectClientSetting(SETTINGS.VIDEO_THEATER_MODE)(state),
-    costInfo: makeSelectCostInfoForUri(uri)(state),
+    costInfo: selectCostInfoForUri(state, uri),
     claimWasPurchased: makeSelectClaimWasPurchased(uri)(state),
     nextListUri: collectionId && makeSelectNextUrlForCollectionAndUrl(collectionId, uri)(state),
     previousListUri: collectionId && makeSelectPreviousUrlForCollectionAndUrl(collectionId, uri)(state),
diff --git a/ui/component/fileRenderInitiator/index.js b/ui/component/fileRenderInitiator/index.js
index f7a061680..8bcb1248e 100644
--- a/ui/component/fileRenderInitiator/index.js
+++ b/ui/component/fileRenderInitiator/index.js
@@ -4,13 +4,13 @@ import { selectThumbnailForUri, makeSelectClaimForUri, makeSelectClaimWasPurchas
 import { makeSelectFileInfoForUri } from 'redux/selectors/file_info';
 import * as SETTINGS from 'constants/settings';
 import * as COLLECTIONS_CONSTS from 'constants/collections';
-import { makeSelectCostInfoForUri } from 'lbryinc';
+import { selectCostInfoForUri } from 'lbryinc';
 import { makeSelectClientSetting } from 'redux/selectors/settings';
 import { withRouter } from 'react-router';
 import {
   makeSelectIsPlaying,
-  makeSelectShouldObscurePreview,
-  makeSelectInsufficientCreditsForUri,
+  selectShouldObscurePreviewForUri,
+  selectInsufficientCreditsForUri,
   makeSelectFileRenderModeForUri,
 } from 'redux/selectors/content';
 import FileRenderInitiator from './view';
@@ -24,11 +24,11 @@ const select = (state, props) => {
   return {
     claimThumbnail: selectThumbnailForUri(state, props.uri),
     fileInfo: makeSelectFileInfoForUri(props.uri)(state),
-    obscurePreview: makeSelectShouldObscurePreview(props.uri)(state),
+    obscurePreview: selectShouldObscurePreviewForUri(state, props.uri),
     isPlaying: makeSelectIsPlaying(props.uri)(state),
-    insufficientCredits: makeSelectInsufficientCreditsForUri(props.uri)(state),
+    insufficientCredits: selectInsufficientCreditsForUri(state, props.uri),
     autoplay: makeSelectClientSetting(SETTINGS.AUTOPLAY_MEDIA)(state),
-    costInfo: makeSelectCostInfoForUri(props.uri)(state),
+    costInfo: selectCostInfoForUri(state, props.uri),
     renderMode: makeSelectFileRenderModeForUri(props.uri)(state),
     claim: makeSelectClaimForUri(props.uri)(state),
     claimWasPurchased: makeSelectClaimWasPurchased(props.uri)(state),
diff --git a/ui/component/fileRenderInline/index.js b/ui/component/fileRenderInline/index.js
index f5e7a0db1..a858d3639 100644
--- a/ui/component/fileRenderInline/index.js
+++ b/ui/component/fileRenderInline/index.js
@@ -6,14 +6,14 @@ import { makeSelectFileRenderModeForUri, selectPrimaryUri } from 'redux/selector
 import { withRouter } from 'react-router';
 import { doAnalyticsView } from 'redux/actions/app';
 import FileRenderInline from './view';
-import { makeSelectCostInfoForUri } from 'lbryinc';
+import { selectCostInfoForUri } from 'lbryinc';
 
 const select = (state, props) => ({
   fileInfo: makeSelectFileInfoForUri(props.uri)(state),
   isPlaying: selectPrimaryUri(state) === props.uri,
   streamingUrl: makeSelectStreamingUrlForUri(props.uri)(state),
   renderMode: makeSelectFileRenderModeForUri(props.uri)(state),
-  costInfo: makeSelectCostInfoForUri(props.uri)(state),
+  costInfo: selectCostInfoForUri(state, props.uri),
   claimWasPurchased: makeSelectClaimWasPurchased(props.uri)(state),
 });
 
diff --git a/ui/component/fileTitleSection/index.js b/ui/component/fileTitleSection/index.js
index b681950eb..1fbbe0b08 100644
--- a/ui/component/fileTitleSection/index.js
+++ b/ui/component/fileTitleSection/index.js
@@ -1,17 +1,17 @@
 import { connect } from 'react-redux';
 import { doFetchSubCount, selectSubCountForUri } from 'lbryinc';
-import { selectTitleForUri, makeSelectClaimForUri } from 'redux/selectors/claims';
-import { makeSelectInsufficientCreditsForUri } from 'redux/selectors/content';
+import { selectTitleForUri, selectClaimForUri } from 'redux/selectors/claims';
+import { selectInsufficientCreditsForUri } from 'redux/selectors/content';
 import FileTitleSection from './view';
 
 const select = (state, props) => {
-  const claim = makeSelectClaimForUri(props.uri)(state);
+  const claim = selectClaimForUri(state, props.uri);
   const channelClaimId = claim && claim.signing_channel ? claim.signing_channel.claim_id : undefined;
   const channelUri = claim && claim.signing_channel ? claim.signing_channel.canonical_url : undefined;
   const subCount = channelUri && selectSubCountForUri(state, channelUri);
 
   return {
-    isInsufficientCredits: makeSelectInsufficientCreditsForUri(props.uri)(state),
+    isInsufficientCredits: selectInsufficientCreditsForUri(state, props.uri),
     title: selectTitleForUri(state, props.uri),
     channelClaimId,
     subCount,
diff --git a/ui/page/file/index.js b/ui/page/file/index.js
index 0395c634f..989077ade 100644
--- a/ui/page/file/index.js
+++ b/ui/page/file/index.js
@@ -11,7 +11,7 @@ import { doFetchFileInfo } from 'redux/actions/file_info';
 import { makeSelectCollectionForId } from 'redux/selectors/collections';
 import * as COLLECTIONS_CONSTS from 'constants/collections';
 import * as SETTINGS from 'constants/settings';
-import { makeSelectCostInfoForUri, doFetchCostInfoForUri } from 'lbryinc';
+import { selectCostInfoForUri, doFetchCostInfoForUri } from 'lbryinc';
 import { selectShowMatureContent, makeSelectClientSetting } from 'redux/selectors/settings';
 import { makeSelectFileRenderModeForUri, makeSelectContentPositionForUri } from 'redux/selectors/content';
 import { DISABLE_COMMENTS_TAG } from 'constants/tags';
@@ -25,7 +25,7 @@ const select = (state, props) => {
 
   return {
     linkedCommentId: urlParams.get('lc'),
-    costInfo: makeSelectCostInfoForUri(props.uri)(state),
+    costInfo: selectCostInfoForUri(state, props.uri),
     metadata: makeSelectMetadataForUri(props.uri)(state),
     obscureNsfw: !selectShowMatureContent(state),
     isMature: makeSelectClaimIsNsfw(props.uri)(state),
diff --git a/ui/redux/actions/content.js b/ui/redux/actions/content.js
index d625071a7..c0f9a4c07 100644
--- a/ui/redux/actions/content.js
+++ b/ui/redux/actions/content.js
@@ -22,7 +22,7 @@ import { doToast } from 'redux/actions/notifications';
 import { doPurchaseUri } from 'redux/actions/file';
 import Lbry from 'lbry';
 import * as SETTINGS from 'constants/settings';
-import { makeSelectCostInfoForUri, Lbryio } from 'lbryinc';
+import { selectCostInfoForUri, Lbryio } from 'lbryinc';
 import { makeSelectClientSetting, selectosNotificationsEnabled, selectDaemonSettings } from 'redux/selectors/settings';
 
 const DOWNLOAD_POLL_INTERVAL = 1000;
@@ -169,7 +169,7 @@ export function doPlayUri(
     }
 
     const daemonSettings = selectDaemonSettings(state);
-    const costInfo = makeSelectCostInfoForUri(uri)(state);
+    const costInfo = selectCostInfoForUri(state, uri);
     const cost = (costInfo && Number(costInfo.cost)) || 0;
     const saveFile = !uriIsStreamable ? true : daemonSettings.save_files || saveFileOverride || cost > 0;
     const instantPurchaseEnabled = makeSelectClientSetting(SETTINGS.INSTANT_PURCHASE_ENABLED)(state);
diff --git a/ui/redux/actions/file.js b/ui/redux/actions/file.js
index e73177e35..677e0ff89 100644
--- a/ui/redux/actions/file.js
+++ b/ui/redux/actions/file.js
@@ -22,7 +22,7 @@ import {
 } from 'redux/selectors/file_info';
 
 type Dispatch = (action: any) => any;
-type GetState = () => { file: FileState };
+type GetState = () => { claims: any, file: FileState, content: any };
 export function doOpenFileInFolder(path: string) {
   return () => {
     shell.showItemInFolder(path);
diff --git a/ui/redux/selectors/claims.js b/ui/redux/selectors/claims.js
index 2931cd8b6..677476415 100644
--- a/ui/redux/selectors/claims.js
+++ b/ui/redux/selectors/claims.js
@@ -575,6 +575,17 @@ export const makeSelectOmittedCountForChannel = (uri: string) =>
     }
   );
 
+export const selectClaimIsNsfwForUri = createCachedSelector(
+  selectClaimForUri,
+  // Eventually these will come from some list of tags that are considered adult
+  // Or possibly come from users settings of what tags they want to hide
+  // For now, there is just a hard coded list of tags inside `isClaimNsfw`
+  // selectNaughtyTags(),
+  (claim: Claim) => {
+    return claim ? isClaimNsfw(claim) : false;
+  }
+)((state, uri) => String(uri));
+
 export const makeSelectClaimIsNsfw = (uri: string) =>
   createSelector(
     makeSelectClaimForUri(uri),
@@ -590,7 +601,6 @@ export const makeSelectClaimIsNsfw = (uri: string) =>
       return isClaimNsfw(claim);
     }
   );
-
 // Returns the associated channel uri for a given claim uri
 // accepts a regular claim uri lbry://something
 // returns the channel uri that created this claim lbry://@channel
@@ -652,15 +662,31 @@ export const selectClaimSearchByQueryLastPageReached = createSelector(
   (state) => state.claimSearchByQueryLastPageReached || {}
 );
 
+// Deprecated
 export const makeSelectShortUrlForUri = (uri: string) =>
   createSelector(makeSelectClaimForUri(uri), (claim) => claim && claim.short_url);
-
+// Deprecated
 export const makeSelectCanonicalUrlForUri = (uri: string) =>
   createSelector(makeSelectClaimForUri(uri), (claim) => claim && claim.canonical_url);
-
+// Deprecated
 export const makeSelectPermanentUrlForUri = (uri: string) =>
   createSelector(makeSelectClaimForUri(uri), (claim) => claim && claim.permanent_url);
 
+export const selectShortUrlForUri = (state: State, uri: string) => {
+  const claim = selectClaimForUri(state, uri);
+  return claim && claim.short_url;
+};
+
+export const selectCanonicalUrlForUri = (state: State, uri: string) => {
+  const claim = selectClaimForUri(state, uri);
+  return claim && claim.canonical_url;
+};
+
+export const selectPermanentUrlForUri = (state: State, uri: string) => {
+  const claim = selectClaimForUri(state, uri);
+  return claim && claim.permanent_url;
+};
+
 export const makeSelectSupportsForUri = (uri: string) =>
   createSelector(selectSupportsByOutpoint, makeSelectClaimForUri(uri), (byOutpoint, claim: ?StreamClaim) => {
     if (!claim || !claim.is_my_output) {
diff --git a/ui/redux/selectors/content.js b/ui/redux/selectors/content.js
index 44305be42..f3d4e9784 100644
--- a/ui/redux/selectors/content.js
+++ b/ui/redux/selectors/content.js
@@ -3,13 +3,14 @@ import { createSelector } from 'reselect';
 import {
   makeSelectClaimForUri,
   selectClaimsByUri,
+  selectClaimIsNsfwForUri,
+  selectClaimIsMineForUri,
   makeSelectClaimIsNsfw,
-  makeSelectClaimIsMine,
   makeSelectContentTypeForUri,
 } from 'redux/selectors/claims';
 import { makeSelectMediaTypeForUri, makeSelectFileNameForUri } from 'redux/selectors/file_info';
 import { selectBalance } from 'redux/selectors/wallet';
-import { makeSelectCostInfoForUri } from 'lbryinc';
+import { selectCostInfoForUri } from 'lbryinc';
 import { selectShowMatureContent } from 'redux/selectors/settings';
 import * as RENDER_MODES from 'constants/file_render_modes';
 import path from 'path';
@@ -18,13 +19,14 @@ import { FORCE_CONTENT_TYPE_PLAYER, FORCE_CONTENT_TYPE_COMIC } from 'constants/c
 const RECENT_HISTORY_AMOUNT = 10;
 const HISTORY_ITEMS_PER_PAGE = 50;
 
-export const selectState = (state: any) => state.content || {};
+type State = { claims: any, content: any };
 
-export const selectPlayingUri = createSelector(selectState, (state) => state.playingUri);
-export const selectPrimaryUri = createSelector(selectState, (state) => state.primaryUri);
+export const selectState = (state: State) => state.content || {};
 
-export const selectListLoop = createSelector(selectState, (state) => state.loopList);
-export const selectListShuffle = createSelector(selectState, (state) => state.shuffleList);
+export const selectPlayingUri = (state: State) => selectState(state).playingUri;
+export const selectPrimaryUri = (state: State) => selectState(state).primaryUri;
+export const selectListLoop = (state: State) => selectState(state).loopList;
+export const selectListShuffle = (state: State) => selectState(state).shuffleList;
 
 export const makeSelectIsPlaying = (uri: string) =>
   createSelector(selectPrimaryUri, (primaryUri) => primaryUri === uri);
@@ -84,6 +86,13 @@ export const selectRecentHistory = createSelector(selectHistory, (history) => {
   return history.slice(0, RECENT_HISTORY_AMOUNT);
 });
 
+export const selectShouldObscurePreviewForUri = (state: State, uri: string) => {
+  const showMatureContent = selectShowMatureContent(state);
+  const isClaimMature = selectClaimIsNsfwForUri(state, uri);
+  return isClaimMature && !showMatureContent;
+};
+
+// deprecated
 export const makeSelectShouldObscurePreview = (uri: string) =>
   createSelector(selectShowMatureContent, makeSelectClaimIsNsfw(uri), (showMatureContent, isClaimMature) => {
     return isClaimMature && !showMatureContent;
@@ -155,12 +164,9 @@ export const makeSelectFileRenderModeForUri = (uri: string) =>
     }
   );
 
-export const makeSelectInsufficientCreditsForUri = (uri: string) =>
-  createSelector(
-    makeSelectClaimIsMine(uri),
-    makeSelectCostInfoForUri(uri),
-    selectBalance,
-    (isMine, costInfo, balance) => {
-      return !isMine && costInfo && costInfo.cost > 0 && costInfo.cost > balance;
-    }
-  );
+export const selectInsufficientCreditsForUri = (state: State, uri: string) => {
+  const isMine = selectClaimIsMineForUri(state, uri);
+  const costInfo = selectCostInfoForUri(state, uri);
+  const balance = selectBalance(state);
+  return !isMine && costInfo && costInfo.cost > 0 && costInfo.cost > balance;
+};