@yodlpay/payment-router
v1.0.10
Published
Find the cheapest swap/bridge route across multiple protocols and encode Yodl payment calls
Readme
@yodlpay/payment-router
Find the cheapest swap/bridge route across multiple protocols and encode Yodl payment calls.
Installation
npm install @yodlpay/payment-routerPeer dependencies: viem and typescript.
Usage
import { preparePayment, getTokenBySymbol } from "@yodlpay/payment-router";
import { base } from "viem/chains";
const payment = await preparePayment(
{
fromToken: getTokenBySymbol("USDC", base.id),
toToken: getTokenBySymbol("USDT", base.id),
amount: "10",
receiver: "0x...",
},
"0x...", // sender address
);
// payment.calls → BatchCall[] ready for UserOp
// payment.method → "direct" | "swap" | "bridge"
// payment.protocol → "Relay" | "LI.FI" | "Across" | "Uniswap" | "Odos" | "direct"
// payment.fees → FeeItem[] | undefinedFee information
Every quote returns an itemized fee breakdown via fees?: FeeItem[] on both QuoteResult and PreparedPayment:
interface FeeItem {
label: string; // e.g. "Relayer gas", "LP fee", "Protocol fee"
category: FeeCategory; // "gas" | "relayer" | "lp" | "protocol" | "app"
amount: string; // raw token units
token: Address; // fee token address
chainId: number;
amountUsd?: string; // USD equivalent (when available)
}Use summarizeFees() to group fees:
import { summarizeFees } from "@yodlpay/payment-router";
const summary = summarizeFees(payment.fees!);
// summary.gas → FeeItem[] (gas-related fees)
// summary.nonGas → FeeItem[] (relayer, lp, protocol, app fees)
// summary.all → FeeItem[] (everything)Protocols
| Protocol | Swap | Bridge | |----------|------|--------| | Relay | Yes | Yes | | LI.FI | Yes | Yes | | Across | No | Yes | | Uniswap | Yes | No | | Odos | Yes | No |
Key concepts
- Stateless — no wallet, no signing, no tx submission. The SDK only does quoting + call encoding.
BatchCall[]— the output format. Each call has{ to, data, value }ready to batch into a UserOp.- Protocol adapters — all implement the same
ProtocolAdapterinterface withgetQuote()andbuildCalls().
