- Update dbis_core, cross-chain-pmm-lps, explorer-monorepo, metamask-integration, pr-workspace/chains - Omit embedded publish git dirs and empty placeholders from index Made-with: Cursor
55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { evaluateEconomics, impliedGrossPct, type EconomicsInput } from './economics-engine.js';
|
|
import { pmmQuoteAmountOutFromChain } from './chain138-pmm-quote.js';
|
|
|
|
export interface PathGateParams {
|
|
rpcUrl: string;
|
|
poolAddress: string;
|
|
tokenIn: string;
|
|
amountIn: bigint;
|
|
traderForView: string;
|
|
/** Token decimals for both legs (typical: 6 for cUSDT/cUSDC). */
|
|
decimals: number;
|
|
economics: Omit<EconomicsInput, 'grossPct'>;
|
|
}
|
|
|
|
export interface PathGateResult {
|
|
amountOut: bigint | null;
|
|
impliedGrossPct: number;
|
|
economics: ReturnType<typeof evaluateEconomics>;
|
|
passesEconomicsGate: boolean;
|
|
error?: string;
|
|
}
|
|
|
|
export async function evaluatePathGate(params: PathGateParams): Promise<PathGateResult> {
|
|
const amountOut = await pmmQuoteAmountOutFromChain({
|
|
rpcUrl: params.rpcUrl,
|
|
poolAddress: params.poolAddress,
|
|
tokenInLookup: params.tokenIn,
|
|
amountIn: params.amountIn,
|
|
traderForView: params.traderForView,
|
|
});
|
|
|
|
if (amountOut === null) {
|
|
return {
|
|
amountOut: null,
|
|
impliedGrossPct: 0,
|
|
economics: evaluateEconomics({ grossPct: 0, flashFeePct: params.economics.flashFeePct }),
|
|
passesEconomicsGate: false,
|
|
error: 'quote_failed_or_invalid_token_pair',
|
|
};
|
|
}
|
|
|
|
const gross = impliedGrossPct(params.amountIn, amountOut, params.decimals);
|
|
const economics = evaluateEconomics({
|
|
grossPct: gross,
|
|
...params.economics,
|
|
});
|
|
|
|
return {
|
|
amountOut,
|
|
impliedGrossPct: gross,
|
|
economics,
|
|
passesEconomicsGate: economics.passesResidual,
|
|
};
|
|
}
|