Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions app/components/Nav/Main/MainNavigator.js
Original file line number Diff line number Diff line change
Expand Up @@ -938,10 +938,7 @@ const MainNavigator = () => {
// Get feature flag state for conditional Perps screen registration
const perpsEnabledFlag = useSelector(selectPerpsEnabledFlag);
const isEvmSelected = useSelector(selectIsEvmNetworkSelected);
const isPerpsEnabled = useMemo(
() => perpsEnabledFlag && isEvmSelected,
[perpsEnabledFlag, isEvmSelected],
);
const isPerpsEnabled = useMemo(() => perpsEnabledFlag, [perpsEnabledFlag]);
// Get feature flag state for conditional Predict screen registration
const predictEnabledFlag = useSelector(selectPredictEnabledFlag);
const isPredictEnabled = useMemo(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export function createStakedTrxAsset(
...base,
name: 'Staked TRX',
symbol: 'sTRX',
ticker: 'sTRX',
isStaked: true,
balance: formatWithThreshold(sum, minimumDisplayThreshold, I18n.locale, {
minimumFractionDigits: 0,
Expand Down
43 changes: 43 additions & 0 deletions app/components/UI/Earn/Views/EarnInputView/EarnInputView.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import { getIsRedesignedStablecoinLendingScreenEnabled } from './utils';
import { selectConversionRate } from '../../../../../selectors/currencyRateController';
import { trace, TraceName } from '../../../../../util/trace';
import { MAINNET_DISPLAY_NAME } from '../../../../../core/Engine/constants';
import { selectTrxStakingEnabled } from '../../../../../selectors/featureFlagController/trxStakingEnabled';

jest.mock('./utils');

Expand Down Expand Up @@ -172,6 +173,13 @@ jest.mock('../../../../../selectors/multichainAccounts/accounts', () => ({

jest.mock('../../../../../selectors/featureFlagController/confirmations');

jest.mock(
'../../../../../selectors/featureFlagController/trxStakingEnabled',
() => ({
selectTrxStakingEnabled: jest.fn(() => false),
}),
);

jest.mock('../../../../../util/trace', () => ({
...jest.requireActual('../../../../../util/trace'),
trace: jest.fn(),
Expand Down Expand Up @@ -388,6 +396,8 @@ describe('EarnInputView', () => {

selectStablecoinLendingEnabledFlagMock.mockReturnValue(false);

(selectTrxStakingEnabled as unknown as jest.Mock).mockReturnValue(false);

(useEarnTokens as jest.Mock).mockReturnValue({
getEarnToken: jest.fn(() => ({
...MOCK_ETH_MAINNET_ASSET,
Expand Down Expand Up @@ -568,6 +578,39 @@ describe('EarnInputView', () => {
});
});

describe('TRON staking flow', () => {
it('constructs TRX earnToken and shows the ResourceToggle when staking enabled', () => {
(selectTrxStakingEnabled as unknown as jest.Mock).mockReturnValue(true);

(useEarnTokens as jest.Mock).mockReturnValue({
getEarnToken: jest.fn(() => undefined),
getOutputToken: jest.fn(() => undefined),
});

const TRX_TOKEN = {
name: 'TRON',
symbol: 'TRX',
ticker: 'TRX',
chainId: 'tron:main',
address: 'T1111111111111111111111111111111111',
balance: '0',
balanceFiat: '$0',
isETH: false,
} as unknown as typeof MOCK_ETH_MAINNET_ASSET;

const { getByTestId } = render(EarnInputView, {
params: {
token: TRX_TOKEN,
},
key: Routes.STAKING.STAKE,
name: 'params',
});

expect(getByTestId('resource-toggle-energy')).toBeTruthy();
expect(getByTestId('resource-toggle-bandwidth')).toBeTruthy();
});
});

describe('when values are entered in the keypad', () => {
it('updates ETH and fiat values', async () => {
const { toJSON, getByText } = renderComponent();
Expand Down
45 changes: 38 additions & 7 deletions app/components/UI/Earn/Views/EarnInputView/EarnInputView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,44 @@ const EarnInputView = () => {
const { trackEvent, createEventBuilder } = useMetrics();
const { attemptDepositTransaction } = usePoolStakedDeposit();
const { getEarnToken } = useEarnTokens();
const earnToken = getEarnToken(token);

///: BEGIN:ONLY_INCLUDE_IF(tron)
const [resourceType, setResourceType] = useState<ResourceType>('energy');
const isTronNative =
token.ticker === 'TRX' && String(token.chainId).startsWith('tron:');
///: END:ONLY_INCLUDE_IF

const earnTokenFromMap = getEarnToken(token);

const earnToken = React.useMemo(() => {
if (earnTokenFromMap) return earnTokenFromMap;

///: BEGIN:ONLY_INCLUDE_IF(tron)
if (isTrxStakingEnabled && isTronNative) {
const experiences = [{ type: EARN_EXPERIENCES.POOLED_STAKING, apr: '0' }];
return {
...token,
isETH: false,
balanceMinimalUnit: '0',
balanceFormatted: token.balance ?? '0',
balanceFiat: token.balanceFiat ?? '0',
tokenUsdExchangeRate: 0,
experiences,
experience: experiences[0],
} as EarnTokenDetails;
}
///: END:ONLY_INCLUDE_IF

return undefined;
}, [
earnTokenFromMap,
///: BEGIN:ONLY_INCLUDE_IF(tron)
isTrxStakingEnabled,
isTronNative,
token,
///: END:ONLY_INCLUDE_IF
]);

const networkClientId = useSelector(selectNetworkClientId);
const {
isFiat,
Expand Down Expand Up @@ -159,12 +196,6 @@ const EarnInputView = () => {
exchangeRate,
});

///: BEGIN:ONLY_INCLUDE_IF(tron)
const [resourceType, setResourceType] = useState<ResourceType>('energy');
const isTronNative =
token.ticker === 'TRX' && String(token.chainId).startsWith('tron:');
///: END:ONLY_INCLUDE_IF

const { shouldLogStablecoinEvent, shouldLogStakingEvent } =
useEarnAnalyticsEventLogging({
earnToken,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1949,7 +1949,7 @@ exports[`EarnInputView when values are entered in the keypad updates ETH and fia
"flexGrow": 1,
}
}
handlerTag={6}
handlerTag={8}
handlerType="NativeViewGestureHandler"
onGestureHandlerEvent={[Function]}
onGestureHandlerStateChange={[Function]}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,13 @@ jest.mock('../../../Stake/hooks/usePoolStakedUnstake', () => ({

jest.mock('../../../../../selectors/featureFlagController/confirmations');

jest.mock(
'../../../../../selectors/featureFlagController/trxStakingEnabled',
() => ({
selectTrxStakingEnabled: jest.fn(() => true),
}),
);

jest.mock('../../selectors/featureFlags', () => ({
selectStablecoinLendingEnabledFlag: jest.fn().mockReturnValue(false),
selectPooledStakingEnabledFlag: jest.fn().mockReturnValue(true),
Expand Down Expand Up @@ -754,6 +761,32 @@ describe('EarnWithdrawInputView', () => {
});
});

describe('TRON unstake flow', () => {
it('renders Unstake label when TRX staking is enabled and TRON asset is used', async () => {
const tronToken: TokenI = {
name: 'Tron',
symbol: 'TRX',
ticker: 'TRX',
chainId: 'tron:728126428',
address: 'tron:728126428/slip44:195',
decimals: 6,
balance: '1000',
balanceFiat: '$100',
isNative: true,
} as unknown as TokenI;

render(EarnWithdrawInputView, tronToken);

await act(async () => {
fireEvent.press(screen.getByText('1'));
});

await waitFor(() => {
expect(screen.getByText('Unstake')).toBeTruthy();
});
});
});

describe('Analytics', () => {
it('tracks EARN_INPUT_OPENED on render for stablecoin lending withdrawal', () => {
(
Expand Down
Loading
Loading