Skip to content

Commit 24a94e3

Browse files
committed
ix(perps): align standalone tradeable balance with spot-backed paths
1 parent 4094076 commit 24a94e3

6 files changed

Lines changed: 29 additions & 7 deletions

File tree

app/components/UI/Perps/Views/PerpsOrderView/useInitPerpsPaymentToken.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ export function useInitPerpsPaymentToken(initialAsset: string) {
8383

8484
const pendingAddr = pendingConfigSelectedPaymentToken.address;
8585
const pendingChainId = pendingConfigSelectedPaymentToken.chainId;
86+
// Compatibility shim for pending configs persisted before
87+
// selectedPaymentTokenSource existed. Safe to remove after the 5-minute
88+
// pending-config TTL has cycled past release.
8689
const isLegacyAutoFallbackToken =
8790
pendingConfigSelectedPaymentTokenSource == null &&
8891
arePaymentTokensEqual(

app/controllers/perps/PerpsController.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ import type {
106106
PerpsActiveProviderMode,
107107
PerpsProviderType,
108108
PerpsSelectedPaymentToken,
109+
SelectedPaymentTokenSource,
109110
PerpsRemoteFeatureFlagState,
110111
PerpsTransactionParams,
111112
PerpsAddTransactionOptions,
@@ -4621,7 +4622,7 @@ export class PerpsController extends BaseController<
46214622
orderType?: OrderType;
46224623
/** When user used pay-with-token in PerpsPayRow: minimal token shape to restore selection */
46234624
selectedPaymentToken?: PerpsSelectedPaymentToken | null;
4624-
selectedPaymentTokenSource?: 'explicit' | 'autoNoPerpsBalance';
4625+
selectedPaymentTokenSource?: SelectedPaymentTokenSource;
46254626
},
46264627
): void {
46274628
const network = this.state.isTestnet ? 'testnet' : 'mainnet';
@@ -4665,7 +4666,7 @@ export class PerpsController extends BaseController<
46654666
limitPrice?: string;
46664667
orderType?: OrderType;
46674668
selectedPaymentToken?: PerpsSelectedPaymentToken | null;
4668-
selectedPaymentTokenSource?: 'explicit' | 'autoNoPerpsBalance';
4669+
selectedPaymentTokenSource?: SelectedPaymentTokenSource;
46694670
}
46704671
| undefined {
46714672
const network = this.state.isTestnet ? 'testnet' : 'mainnet';

app/controllers/perps/providers/HyperLiquidProvider.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9031,6 +9031,9 @@ describe('HyperLiquidProvider', () => {
90319031
describe('getAccountState with standalone mode', () => {
90329032
it('returns account state via standalone client when standalone mode enabled', async () => {
90339033
// Arrange
9034+
mockStandaloneInfoClient.spotClearinghouseState.mockResolvedValue({
9035+
balances: [{ coin: 'USDC', hold: '1000', total: '10000' }],
9036+
});
90349037
mockStandaloneInfoClient.clearinghouseState.mockResolvedValue({
90359038
assetPositions: [],
90369039
marginSummary: {
@@ -9058,6 +9061,9 @@ describe('HyperLiquidProvider', () => {
90589061
mockStandaloneInfoClient.clearinghouseState,
90599062
).toHaveBeenCalledWith({ user: mockUserAddress });
90609063
expect(accountState.totalBalance).toBeDefined();
9064+
expect(parseFloat(accountState.availableToTradeBalance ?? '0')).toBe(
9065+
55000,
9066+
);
90619067
});
90629068

90639069
it('uses testnet endpoint when provider is in testnet mode', async () => {

app/controllers/perps/providers/HyperLiquidProvider.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5585,14 +5585,21 @@ export class HyperLiquidProvider implements PerpsProvider {
55855585
const dexAccountStates = standalonePerpsResults.map((perpsState) =>
55865586
adaptAccountStateFromSDK(perpsState),
55875587
);
5588-
const aggregatedAccountState = addSpotBalanceToAccountState(
5589-
aggregateAccountStates(dexAccountStates),
5588+
const aggregatedAccountState = addSpotUsdcToAvailableToTradeBalance(
5589+
addSpotBalanceToAccountState(
5590+
aggregateAccountStates(dexAccountStates),
5591+
standaloneSpotStateResult,
5592+
),
55905593
standaloneSpotStateResult,
55915594
);
55925595

55935596
this.#deps.debugLogger.log(
55945597
'HyperLiquidProvider: standalone account state fetched',
5595-
{ totalBalance: aggregatedAccountState.totalBalance },
5598+
{
5599+
totalBalance: aggregatedAccountState.totalBalance,
5600+
availableToTradeBalance:
5601+
aggregatedAccountState.availableToTradeBalance,
5602+
},
55965603
);
55975604

55985605
return aggregatedAccountState;

app/controllers/perps/selectors.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import { createSelector } from 'reselect';
22

33
import { MARKET_SORTING_CONFIG, SortOptionId } from './constants/perpsConfig';
44
import type { PerpsControllerState } from './PerpsController';
5-
import type { PerpsSelectedPaymentToken } from './types';
5+
import type {
6+
PerpsSelectedPaymentToken,
7+
SelectedPaymentTokenSource,
8+
} from './types';
69
import type { SortDirection } from './utils/sortMarkets';
710

811
/**
@@ -132,7 +135,7 @@ export const selectPendingTradeConfiguration = createSelector(
132135
limitPrice?: string;
133136
orderType?: 'market' | 'limit';
134137
selectedPaymentToken?: PerpsSelectedPaymentToken | null;
135-
selectedPaymentTokenSource?: 'explicit' | 'autoNoPerpsBalance';
138+
selectedPaymentTokenSource?: SelectedPaymentTokenSource;
136139
}
137140
| undefined => {
138141
const network = isTestnet ? 'testnet' : 'mainnet';

app/controllers/perps/utils/accountUtils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ export function addSpotUsdcToAvailableToTradeBalance(
168168
return accountState;
169169
}
170170

171+
// Adapters are expected to populate availableToTradeBalance. Fall back to
172+
// availableBalance only for legacy or partially migrated AccountState payloads.
171173
const currentAvailableToTrade = parseFloat(
172174
accountState.availableToTradeBalance ?? accountState.availableBalance,
173175
);

0 commit comments

Comments
 (0)