From eb969eeedb7fb47847cc7d8a602c6a94ce87e853 Mon Sep 17 00:00:00 2001 From: Step7750 Date: Fri, 5 Sep 2025 18:10:00 -0600 Subject: [PATCH 1/4] Switches Trade Verification to Use "slim" Endpoint Lower amount of bandwidth wasted by fields that aren't used for verification by switching to the "slim" endpoint. DO_NOT_SUBMIT=Wait for slim to rollout in production. --- src/lib/alarms/blocked_users.ts | 4 +-- src/lib/alarms/csfloat_trade_pings.ts | 10 +++--- src/lib/alarms/rollback.ts | 4 +-- src/lib/alarms/trade_history.ts | 4 +-- src/lib/alarms/trade_offer.ts | 8 ++--- src/lib/bridge/handlers/fetch_slim_trades.ts | 36 ++++++++++++++++++++ src/lib/bridge/handlers/handlers.ts | 2 ++ src/lib/bridge/handlers/types.ts | 1 + src/lib/types/float_market.ts | 14 ++++++++ 9 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 src/lib/bridge/handlers/fetch_slim_trades.ts diff --git a/src/lib/alarms/blocked_users.ts b/src/lib/alarms/blocked_users.ts index efeeca38..35fe1d1a 100644 --- a/src/lib/alarms/blocked_users.ts +++ b/src/lib/alarms/blocked_users.ts @@ -1,11 +1,11 @@ -import {Trade} from '../types/float_market'; +import {SlimTrade} from '../types/float_market'; import {gStore} from '../storage/store'; import {StorageKey} from '../storage/keys'; import {FetchSteamUser} from '../bridge/handlers/fetch_steam_user'; import {FetchBlockedUsers} from '../bridge/handlers/fetch_blocked_users'; import {PingBlockedUsers} from '../bridge/handlers/ping_blocked_users'; -export async function reportBlockedBuyers(pendingTrades: Trade[]) { +export async function reportBlockedBuyers(pendingTrades: SlimTrade[]) { const lastPing = await gStore.getWithStorage( chrome.storage.local, StorageKey.LAST_TRADE_BLOCKED_PING_ATTEMPT diff --git a/src/lib/alarms/csfloat_trade_pings.ts b/src/lib/alarms/csfloat_trade_pings.ts index 6391eeac..8d40ea3d 100644 --- a/src/lib/alarms/csfloat_trade_pings.ts +++ b/src/lib/alarms/csfloat_trade_pings.ts @@ -1,5 +1,4 @@ -import {Trade} from '../types/float_market'; -import {FetchPendingTrades} from '../bridge/handlers/fetch_pending_trades'; +import {SlimTrade} from '../types/float_market'; import {pingTradeHistory} from './trade_history'; import {cancelUnconfirmedTradeOffers, pingCancelTrades, pingSentTradeOffers} from './trade_offer'; import {HasPermissions} from '../bridge/handlers/has_permissions'; @@ -10,6 +9,7 @@ import {StorageKey} from '../storage/keys'; import {reportBlockedBuyers} from './blocked_users'; import {TradeHistoryStatus} from '../bridge/handlers/trade_history_status'; import {pingRollbackTrades} from './rollback'; +import {FetchSlimTrades} from '../bridge/handlers/fetch_slim_trades'; export const PING_CSFLOAT_TRADE_STATUS_ALARM_NAME = 'ping_csfloat_trade_status_alarm'; @@ -28,9 +28,9 @@ export async function pingTradeStatus(expectedSteamID?: string) { return; } - let pendingTrades: Trade[]; + let pendingTrades: SlimTrade[]; try { - const resp = await FetchPendingTrades.handleRequest({limit: 3000, exclude_wait_for_settlement: true}, {}); + const resp = await FetchSlimTrades.handleRequest({limit: 3000, exclude_wait_for_settlement: true}, {}); pendingTrades = resp.trades; } catch (e) { console.error(e); @@ -75,7 +75,7 @@ interface UpdateErrors { rollback_trades_error?: string; } -async function pingUpdates(pendingTrades: Trade[]): Promise { +async function pingUpdates(pendingTrades: SlimTrade[]): Promise { const errors: UpdateErrors = {}; try { diff --git a/src/lib/alarms/rollback.ts b/src/lib/alarms/rollback.ts index b1365fae..465f11a0 100644 --- a/src/lib/alarms/rollback.ts +++ b/src/lib/alarms/rollback.ts @@ -1,9 +1,9 @@ -import {Trade, TradeState} from '../types/float_market'; +import {SlimTrade, TradeState} from '../types/float_market'; import {TradeHistoryStatus} from '../bridge/handlers/trade_history_status'; import {PingRollbackTrade} from '../bridge/handlers/ping_rollback_trade'; import {TradeStatus} from '../types/steam_constants'; -export async function pingRollbackTrades(pendingTrades: Trade[], tradeHistory: TradeHistoryStatus[]) { +export async function pingRollbackTrades(pendingTrades: SlimTrade[], tradeHistory: TradeHistoryStatus[]) { if (!pendingTrades || pendingTrades.length === 0) { return; } diff --git a/src/lib/alarms/trade_history.ts b/src/lib/alarms/trade_history.ts index af3a0563..c4fde656 100644 --- a/src/lib/alarms/trade_history.ts +++ b/src/lib/alarms/trade_history.ts @@ -1,9 +1,9 @@ -import {Trade} from '../types/float_market'; +import {SlimTrade, Trade} from '../types/float_market'; import {TradeHistoryStatus, TradeHistoryType} from '../bridge/handlers/trade_history_status'; import {AppId, TradeStatus} from '../types/steam_constants'; import {clearAccessTokenFromStorage, getAccessToken} from './access_token'; -export async function pingTradeHistory(pendingTrades: Trade[]): Promise { +export async function pingTradeHistory(pendingTrades: SlimTrade[]): Promise { const {history, type} = await getTradeHistory(); // premature optimization in case it's 100 trades diff --git a/src/lib/alarms/trade_offer.ts b/src/lib/alarms/trade_offer.ts index e9ca20a6..07655a9a 100644 --- a/src/lib/alarms/trade_offer.ts +++ b/src/lib/alarms/trade_offer.ts @@ -1,5 +1,5 @@ import {TradeOfferState, TradeStatus} from '../types/steam_constants'; -import {Trade, TradeState} from '../types/float_market'; +import {SlimTrade, TradeState} from '../types/float_market'; import {OfferStatus, TradeOfferStatus, TradeOffersType} from '../bridge/handlers/trade_offer_status'; import {clearAccessTokenFromStorage, getAccessToken} from './access_token'; import {AnnotateOffer} from '../bridge/handlers/annotate_offer'; @@ -11,7 +11,7 @@ import {HasPermissions} from '../bridge/handlers/has_permissions'; import {convertSteamID32To64} from '../utils/userinfo'; import {TradeHistoryStatus} from '../bridge/handlers/trade_history_status'; -export async function pingSentTradeOffers(pendingTrades: Trade[]) { +export async function pingSentTradeOffers(pendingTrades: SlimTrade[]) { const {offers, type} = await getSentTradeOffers(); const offersToFind = pendingTrades.reduce( @@ -68,7 +68,7 @@ export async function pingSentTradeOffers(pendingTrades: Trade[]) { } } -export async function pingCancelTrades(pendingTrades: Trade[], tradeHistory: TradeHistoryStatus[]) { +export async function pingCancelTrades(pendingTrades: SlimTrade[], tradeHistory: TradeHistoryStatus[]) { const hasWaitForCancelPing = pendingTrades.find((e) => e.state === TradeState.PENDING && e.wait_for_cancel_ping); if (!hasWaitForCancelPing) { // Nothing to process/ping, exit @@ -119,7 +119,7 @@ export async function pingCancelTrades(pendingTrades: Trade[], tradeHistory: Tra // cancelUnconfirmedTradeOffers related to sales on CSFloat that haven't been confirmed for a while // Helps prevent the user from sending a trade offer _way after_ the sale has already failed -export async function cancelUnconfirmedTradeOffers(pendingTrades: Trade[]) { +export async function cancelUnconfirmedTradeOffers(pendingTrades: SlimTrade[]) { const offerIDsToCancel = [ ...new Set( pendingTrades diff --git a/src/lib/bridge/handlers/fetch_slim_trades.ts b/src/lib/bridge/handlers/fetch_slim_trades.ts new file mode 100644 index 00000000..745b7f85 --- /dev/null +++ b/src/lib/bridge/handlers/fetch_slim_trades.ts @@ -0,0 +1,36 @@ +import {SlimTrade} from '../../types/float_market'; +import {SimpleHandler} from './main'; +import {RequestType} from './types'; +import {environment} from '../../../environment'; + +export interface FetchSlimTradesRequest { + state?: string; + limit?: number; + page?: number; + exclude_wait_for_settlement?: boolean; +} + +export interface FetchSlimTradesResponse { + count: number; + trades: SlimTrade[]; +} + +export const FetchSlimTrades = new SimpleHandler( + RequestType.FETCH_SLIM_TRADES, + async (req) => { + const state = req.state ? req.state : 'pending'; + const limit = req.limit ? req.limit : 100; + const resp = await fetch( + `${environment.csfloat_base_api_url}/v1/me/trades/slim?state=${state}&limit=${limit}&exclude_wait_for_settlement=${req.exclude_wait_for_settlement || false}&page=${req.page || 0}`, + { + credentials: 'include', + } + ); + + if (resp.status !== 200) { + throw new Error('invalid status'); + } + + return resp.json() as Promise; + } +); diff --git a/src/lib/bridge/handlers/handlers.ts b/src/lib/bridge/handlers/handlers.ts index 950a10af..2eba0125 100644 --- a/src/lib/bridge/handlers/handlers.ts +++ b/src/lib/bridge/handlers/handlers.ts @@ -32,6 +32,7 @@ import {FetchRecommendedPrice} from './fetch_recommended_price'; import {FetchCSFloatMe} from './fetch_csfloat_me'; import {PingRollbackTrade} from './ping_rollback_trade'; import {FetchTradeHistory} from './fetch_trade_history'; +import {FetchSlimTrades} from './fetch_slim_trades'; export const HANDLERS_MAP: {[key in RequestType]: RequestHandler} = { [RequestType.EXECUTE_SCRIPT_ON_PAGE]: ExecuteScriptOnPage, @@ -66,4 +67,5 @@ export const HANDLERS_MAP: {[key in RequestType]: RequestHandler} = { [RequestType.FETCH_CSFLOAT_ME]: FetchCSFloatMe, [RequestType.PING_ROLLBACK_TRADE]: PingRollbackTrade, [RequestType.FETCH_TRADE_HISTORY]: FetchTradeHistory, + [RequestType.FETCH_SLIM_TRADES]: FetchSlimTrades, }; diff --git a/src/lib/bridge/handlers/types.ts b/src/lib/bridge/handlers/types.ts index d60da7f0..9a6dce7c 100644 --- a/src/lib/bridge/handlers/types.ts +++ b/src/lib/bridge/handlers/types.ts @@ -31,4 +31,5 @@ export enum RequestType { FETCH_CSFLOAT_ME = 29, PING_ROLLBACK_TRADE = 30, FETCH_TRADE_HISTORY = 31, + FETCH_SLIM_TRADES = 32, } diff --git a/src/lib/types/float_market.ts b/src/lib/types/float_market.ts index c242a158..d2916bca 100644 --- a/src/lib/types/float_market.ts +++ b/src/lib/types/float_market.ts @@ -91,6 +91,7 @@ export interface Trade { id: string; accepted_at?: string; buyer: User; + seller: User; buyer_id: string; contract: Contract; contract_id: string; @@ -107,3 +108,16 @@ export interface Trade { seller_blocked_buyer_at?: string; buyer_blocked_seller_at?: string; } + +export interface SlimItem { + asset_id: string; + market_hash_name: string; +} + +export interface SlimContract { + item: SlimItem; +} + +export interface SlimTrade extends Omit { + contract: SlimContract; +} From 3f3a931a29d691880aeae8d45bf6d417868a0133 Mon Sep 17 00:00:00 2001 From: Step7750 Date: Fri, 5 Sep 2025 18:11:07 -0600 Subject: [PATCH 2/4] removes unused `exclude_wait_for_settlement` --- src/lib/bridge/handlers/fetch_slim_trades.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/bridge/handlers/fetch_slim_trades.ts b/src/lib/bridge/handlers/fetch_slim_trades.ts index 745b7f85..68e06ec5 100644 --- a/src/lib/bridge/handlers/fetch_slim_trades.ts +++ b/src/lib/bridge/handlers/fetch_slim_trades.ts @@ -7,7 +7,6 @@ export interface FetchSlimTradesRequest { state?: string; limit?: number; page?: number; - exclude_wait_for_settlement?: boolean; } export interface FetchSlimTradesResponse { @@ -21,7 +20,7 @@ export const FetchSlimTrades = new SimpleHandler Date: Fri, 5 Sep 2025 18:22:34 -0600 Subject: [PATCH 3/4] fixes build --- src/lib/alarms/csfloat_trade_pings.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/alarms/csfloat_trade_pings.ts b/src/lib/alarms/csfloat_trade_pings.ts index 8d40ea3d..0abae725 100644 --- a/src/lib/alarms/csfloat_trade_pings.ts +++ b/src/lib/alarms/csfloat_trade_pings.ts @@ -30,7 +30,7 @@ export async function pingTradeStatus(expectedSteamID?: string) { let pendingTrades: SlimTrade[]; try { - const resp = await FetchSlimTrades.handleRequest({limit: 3000, exclude_wait_for_settlement: true}, {}); + const resp = await FetchSlimTrades.handleRequest({limit: 3000}, {}); pendingTrades = resp.trades; } catch (e) { console.error(e); From 7a4fcdeccd916062ab8016bf7d1394bd13a4b361 Mon Sep 17 00:00:00 2001 From: Step7750 Date: Mon, 8 Sep 2025 16:14:04 -0600 Subject: [PATCH 4/4] address comments --- src/lib/types/float_market.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lib/types/float_market.ts b/src/lib/types/float_market.ts index d2916bca..2d098fb1 100644 --- a/src/lib/types/float_market.ts +++ b/src/lib/types/float_market.ts @@ -107,12 +107,10 @@ export interface Trade { wait_for_cancel_ping?: boolean; seller_blocked_buyer_at?: string; buyer_blocked_seller_at?: string; + is_settlement_period?: boolean; } -export interface SlimItem { - asset_id: string; - market_hash_name: string; -} +export interface SlimItem extends Pick {} export interface SlimContract { item: SlimItem;