import { ethers } from "ethers";
import {
BalancerApi,
SwapKind,
TokenAmount,
VAULT,
vaultV2Abi
} from "@berachain-foundation/berancer-sdk";
// Initialize provider and wallet
const RPC_URL = "https://rpc.berachain.com/";
const provider = new ethers.JsonRpcProvider(RPC_URL);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);
const balancerApi = new BalancerApi("https://chgbtcc9ffu7rbdw2kmu4urwy.stellate.sh/", 80094);
// Create swap amount (e.g., 1 HONEY)
const tokenAmount = TokenAmount.fromHumanAmount(honeyToken, '1');
// Fetch optimal swap paths
const { paths: sorPaths, routes } = await balancerApi.sorSwapPaths.fetchSorSwapPaths({
chainId: CHAIN_ID,
tokenIn: honeyToken.address,
tokenOut: wbtcToken.address,
swapKind: SwapKind.GivenIn,
swapAmount: tokenAmount,
});
// Convert SOR paths to batchSwap parameters
const batchSwapParams = {
kind: SwapKind.GivenIn,
swaps: routes.flatMap(route =>
route.hops.map((hop, index) => ({
poolId: hop.poolId,
assetInIndex: assets.indexOf(hop.tokenIn),
assetOutIndex: assets.indexOf(hop.tokenOut),
amount: index === 0 ? tokenAmount.amount : '0',
userData: '0x'
}))
),
assets: Array.from(new Set(routes.flatMap(route =>
route.hops.flatMap(hop => [hop.tokenIn, hop.tokenOut])
))),
funds: {
sender: wallet.address,
recipient: wallet.address,
fromInternalBalance: false,
toInternalBalance: false
},
limits: assets.map((_, i) =>
i === 0
? tokenAmount.amount.toString() // Exact input amount for first token
: ethers.MaxInt256.toString() // Max int256 for all other tokens
),
deadline: BigInt(Math.floor(Date.now() / 1000) + 3600),
};
// Execute batch swap via Vault contract
const vaultContract = new ethers.Contract(VAULT[CHAIN_ID], vaultV2Abi, wallet);
const tx = await vaultContract.batchSwap(
batchSwapParams.kind,
batchSwapParams.swaps,
batchSwapParams.assets,
batchSwapParams.funds,
batchSwapParams.limits,
batchSwapParams.deadline
);