Skip to content

Commit 8b28d23

Browse files
authored
Merge pull request #2175 from AmbireTech/feature/bridge-sorting-based-on-performance
New swap&bridge sorting options
2 parents 9431dcc + 731eef4 commit 8b28d23

3 files changed

Lines changed: 34 additions & 4 deletions

File tree

src/controllers/swapAndBridge/swapAndBridge.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,7 +1605,29 @@ export class SwapAndBridgeController extends EventEmitter implements ISwapAndBri
16051605
return -1
16061606
}
16071607

1608-
const sortByAmountAndTime = () => {
1608+
const sortByPerformance = () => {
1609+
// if it's a bridge, prioritize across and relay as we find
1610+
// across and relay the best bridges out where with a close
1611+
// to 100% success rate and an approximate bridge time of 30s
1612+
if (isBridge) {
1613+
const aHasAcross = r1.usedBridgeNames?.includes('across')
1614+
const bHasAcross = r2.usedBridgeNames?.includes('across')
1615+
if (aHasAcross && !bHasAcross) return -1
1616+
if (bHasAcross && !aHasAcross) return 1
1617+
1618+
const aHasRelay = r1.usedBridgeNames?.includes('relaydepository')
1619+
const bHasRelay = r2.usedBridgeNames?.includes('relaydepository')
1620+
if (aHasRelay && !bHasRelay) return -1
1621+
if (bHasRelay && !aHasRelay) return 1
1622+
} else {
1623+
// if it's a swap, deprioritize the bungee auto route as it's an intent
1624+
// engine. And intent engines are bad UX
1625+
const aHasBungeeAutoRoute = r1.usedBridgeNames?.includes('bungeeAutoRoute')
1626+
const bHasBungeeAutoRoute = r2.usedBridgeNames?.includes('bungeeAutoRoute')
1627+
if (aHasBungeeAutoRoute && !bHasBungeeAutoRoute) return 1
1628+
if (bHasBungeeAutoRoute && !aHasBungeeAutoRoute) return -1
1629+
}
1630+
16091631
const a = BigInt(r1.toAmount)
16101632
const b = BigInt(r2.toAmount)
16111633

@@ -1646,7 +1668,8 @@ export class SwapAndBridgeController extends EventEmitter implements ISwapAndBri
16461668
const r2ServiceFee = r2.serviceFee && Number(r2.serviceFee.amountUSD) > 0
16471669
if (r1ServiceFee && !r2ServiceFee) return 1
16481670
if (r2ServiceFee && !r1ServiceFee) return -1
1649-
return sortByAmountAndTime()
1671+
1672+
return sortByPerformance()
16501673
})
16511674
.sort((a, b) => Number(a.disabled === true) - Number(b.disabled === true))
16521675
// select the first enabled route

src/interfaces/swapAndBridge.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ export interface SwapAndBridgeRoute {
127127
* @example - Wrapping and unwrapping natives
128128
*/
129129
withConvenienceFee: boolean
130+
isIntent?: boolean // we add this by ourselves
130131
}
131132

132133
export interface SocketAPISwapUserTx {
@@ -447,6 +448,7 @@ export interface BungeeExchangeQuoteResponse {
447448
suggestedClientSlippage: number
448449
approvalData: BungeeApprovalData
449450
txData: BungeeTxData
451+
isIntent?: boolean // we add this by ourselves
450452
}
451453
destinationChainId: number
452454
input: {
@@ -462,6 +464,7 @@ export interface BungeeExchangeQuoteResponse {
462464
estimatedTime?: number
463465
routeDetails: BungeeRouteDetails
464466
slippage: number
467+
isIntent?: boolean // we add this by ourselves
465468
}[]
466469
originChainId: number
467470
receiverAddress: string

src/services/socket/api.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ export class SocketAPI implements SwapProvider {
311311
}
312312

313313
let allRoutes = [...response.manualRoutes]
314-
if (response.autoRoute) allRoutes.push(response.autoRoute)
314+
if (response.autoRoute) allRoutes.push({ ...response.autoRoute, isIntent: true })
315315
allRoutes = allRoutes.sort((r1, r2) => {
316316
const a = BigInt(r1.output.amount)
317317
const b = BigInt(r2.output.amount)
@@ -397,7 +397,11 @@ export class SocketAPI implements SwapProvider {
397397
approvalData: 'approvalData' in route ? route.approvalData : undefined,
398398
txData: 'txData' in route ? route.txData : undefined,
399399
rawRoute: '', // not needed for socket,
400-
withConvenienceFee: shouldIncludeConvenienceFee
400+
withConvenienceFee: shouldIncludeConvenienceFee,
401+
usedBridgeNames:
402+
fromChainId !== route.output.token.chainId
403+
? [route.isIntent ? 'bungeeAutoRoute' : route.routeDetails.name.toLowerCase()]
404+
: [route.isIntent ? 'bungeeAutoRoute' : '']
401405
}
402406
})
403407
}

0 commit comments

Comments
 (0)