@@ -2,15 +2,17 @@ import {SlimTrade, TradeState} from '../types/float_market';
22import { TradeHistoryStatus } from '../bridge/handlers/trade_history_status' ;
33import { PingRollbackTrade } from '../bridge/handlers/ping_rollback_trade' ;
44import { TradeStatus } from '../types/steam_constants' ;
5+ import { isBackgroundNotaryRollbackEnabled , proveTradesInBackground } from './notary' ;
6+ import { reportTradeError } from './error_report' ;
57
6- export async function pingRollbackTrades ( pendingTrades : SlimTrade [ ] , tradeHistory : TradeHistoryStatus [ ] ) {
7- if ( ! pendingTrades || pendingTrades . length === 0 ) {
8- return ;
9- }
8+ interface RollbackTradeInfo {
9+ steamTrade : TradeHistoryStatus ;
10+ csfloatTrade : SlimTrade ;
11+ rollbackTrade ?: TradeHistoryStatus ;
12+ }
1013
11- if ( ! tradeHistory || tradeHistory . length === 0 ) {
12- return ;
13- }
14+ function findRollbackTrades ( pendingTrades : SlimTrade [ ] , tradeHistory : TradeHistoryStatus [ ] ) : RollbackTradeInfo [ ] {
15+ const results : RollbackTradeInfo [ ] = [ ] ;
1416
1517 for ( const trade of tradeHistory ) {
1618 // Status 12 corresponds to a rollback via trade protection (undocumented)
@@ -32,13 +34,42 @@ export async function pingRollbackTrades(pendingTrades: SlimTrade[], tradeHistor
3234 continue ;
3335 }
3436
35- // try to find the rollback trade id
3637 const rollbackTrade = tradeHistory . find ( ( e ) => e . rollback_trade === trade . trade_id ) ;
38+ results . push ( { steamTrade : trade , csfloatTrade, rollbackTrade} ) ;
39+ }
40+
41+ return results ;
42+ }
43+
44+ export async function pingRollbackTrades ( pendingTrades : SlimTrade [ ] , tradeHistory : TradeHistoryStatus [ ] ) {
45+ if ( ! pendingTrades ?. length || ! tradeHistory ?. length ) {
46+ return ;
47+ }
48+
49+ const rollbackTrades = findRollbackTrades ( pendingTrades , tradeHistory ) ;
50+ if ( rollbackTrades . length === 0 ) {
51+ return ;
52+ }
53+
54+ if ( await isBackgroundNotaryRollbackEnabled ( ) ) {
55+ try {
56+ await proveTradesInBackground ( rollbackTrades . map ( ( r ) => r . steamTrade ) ) ;
57+ console . log ( `proved ${ rollbackTrades . length } rollback trade(s) via notary` ) ;
58+ return ;
59+ } catch ( e ) {
60+ console . error ( 'notary proving failed, falling back to legacy ping' , e ) ;
61+ reportTradeError ( rollbackTrades [ 0 ] . csfloatTrade . id , `background extension notary failed: ${ e } ` ) ;
62+ }
63+ }
64+
65+ await pingRollbackTradesLegacy ( rollbackTrades ) ;
66+ }
3767
38- // Pinging the first asset in a trade will cancel all the items in the trade server-side
68+ async function pingRollbackTradesLegacy ( rollbackTrades : RollbackTradeInfo [ ] ) {
69+ for ( const { csfloatTrade, rollbackTrade} of rollbackTrades ) {
3970 try {
4071 await PingRollbackTrade . handleRequest (
41- { trade_id : csfloatTrade ? .id , rollback_trade_id : rollbackTrade ?. trade_id } ,
72+ { trade_id : csfloatTrade . id , rollback_trade_id : rollbackTrade ?. trade_id } ,
4273 { }
4374 ) ;
4475 } catch ( e ) {
0 commit comments