Skip to content

Conversation

ashwinrava
Copy link
Member

This PR implements the routing logic below. Changes here: a8c41f2

  • Update /limits to return utilization data so that we don't need to refetch it
  • Call limits with a standard amount to maximize cache hits
  • Use data to determine Across/CCTP bridge strategy
image

Copy link

linear bot commented Sep 30, 2025

Copy link

vercel bot commented Sep 30, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
app-frontend-v3 Ready Ready Preview Comment Sep 30, 2025 8:23pm
sepolia-frontend-v3 Ready Ready Preview Comment Sep 30, 2025 8:23pm

@ashwinrava ashwinrava changed the base branch from master to mguevara/acx-4479-add-cctp-bridge-strategy September 30, 2025 12:02
Copy link
Contributor

@dohaki dohaki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some remarks! Also some inline comments seem to be incorrect/outdated

const isLargeDeposit = depositAmountUsd > 1_000_000; // 1M USD

// Check if eligible for Fast CCTP (Polygon, BSC, Solana) and deposit > 10K USD
const fastCctpChains = [CHAIN_IDs.POLYGON, CHAIN_IDs.BSC, CHAIN_IDs.SOLANA];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be part of the CCTP bridge strategy?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, for this use case we are already exporting CCTP_FILL_TIME_ESTIMATES from the strategy. Maybe we can use that combined with a threshold.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast CCTP chains can be taken from here. Chains with "seconds" are considered fast

@ashwinrava ashwinrava marked this pull request as draft September 30, 2025 14:18
@ashwinrava ashwinrava force-pushed the ashwin/acx-4481-implement-acrossnative-routing-logic branch from a8c41f2 to 671465d Compare September 30, 2025 20:11
@ashwinrava ashwinrava changed the base branch from mguevara/acx-4479-add-cctp-bridge-strategy to master September 30, 2025 20:12
@ashwinrava ashwinrava marked this pull request as ready for review September 30, 2025 20:29
@ashwinrava ashwinrava changed the base branch from master to feat/mint-burn-bridge-routing September 30, 2025 21:51
Comment on lines +65 to +67
if (bridgeStrategyData.isUtilizationHigh) {
return getCctpBridgeStrategy();
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

when utilization is high CCTP strategy should be used only for USDC, right?


import { CrossSwap, CrossSwapQuotes, Token } from "../_dexes/types";
import { AppFee, CrossSwapType } from "../_dexes/utils";
import { Logger } from "@across-protocol/sdk/dist/types/relayFeeCalculator";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see we have some utils in api/_logger.ts. Can we use getLogger from there?

Copy link
Contributor

@melisaguevara melisaguevara left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking nice. Left some comments/questions.

return getAcrossBridgeStrategy();
} else {
// Use OFT bridge if not CCTP
return getCctpBridgeStrategy();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for all these checks, should we check if the strategy we want to return is part of the supportedBridgeStrategies list? That way we avoid returning here a strategy that was previously filtered out.

Comment on lines +77 to +79
const isFastCctpChain =
fastCctpChains.includes(inputToken.chainId) ||
fastCctpChains.includes(outputToken.chainId);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think only the origin chain matters here.

const utilizationThreshold = sdk.utils.fixedPointAdjustment.mul(80).div(100); // 80%

// Calculate current utilization percentage
const currentUtilization = _utilizedReserves
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think utilizedReserves can be negative, would that have any impact in this calculation?
I see in other places we floored it to zero when that happens. See for example: https://github.com/across-protocol/frontend/blob/master/api/_utils.ts#L2709

});

// Safely return undefined if we can't fetch bridge strategy data
return undefined;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could instead return the expected JSON object but all fields set to false?
This would be a more clear return type than undefined.

const depositAmountUsd = parseFloat(
ethers.utils.formatUnits(amountInInputTokenDecimals, inputToken.decimals)
);
const isInThreshold = depositAmountUsd <= 10_000; // 10K USD
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we want to consider extracted hardcoded variables into a single place. This would help us later to make changes or understand why certain thresholds were set.

return getAcrossBridgeStrategy();
} else {
// Use OFT bridge if not CCTP
return getCctpBridgeStrategy();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment here says that we should use OFT bridge if not CCTP but the return function indicates that we are using the cctp bridge strategy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants