import { ethers } from "ethers";
import {
BalancerApi,
RemoveLiquidity,
RemoveLiquidityKind,
Slippage,
PriceImpact,
} 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);
// Get pool data
const poolId = "POOL_ID";
const poolState = await balancerApi.pools.fetchPoolState(poolId);
// Prepare remove liquidity input for single token exit
const removeLiquidityInput = {
chainId: CHAIN_ID,
kind: RemoveLiquidityKind.SingleTokenExactIn,
rpcUrl: RPC_URL,
bptIn: {
address: poolState.address,
decimals: 18,
rawAmount: ethers.parseUnits("0.1", 18), // 0.1 BPT
},
tokenOut: WBERA_TOKEN
};
const removeLiquidity = new RemoveLiquidity();
// Query expected outputs and calculate price impact in parallel
const [queryOutput, priceImpact] = await Promise.all([
removeLiquidity.query(removeLiquidityInput, poolState),
PriceImpact.removeLiquidity(removeLiquidityInput, poolState)
]);
console.log(
"Expected Token Out:",
ethers.formatUnits(queryOutput.amountsOut[0].amount, queryOutput.amountsOut[0].token.decimals),
queryOutput.amountsOut[0].token.symbol
);
console.log("Price Impact:", priceImpact.percentage, "%");
// Build transaction with 1% slippage
const slippage = Slippage.fromPercentage("1");
const deadline = BigInt(Math.floor(Date.now() / 1000) + 60);
const callData = removeLiquidity.buildCall({
...queryOutput,
sender: wallet.address,
recipient: wallet.address,
wethIsEth: true,
slippage,
deadline,
});
// Send transaction
const tx = await wallet.sendTransaction({
to: callData.to,
data: callData.callData,
value: callData.value,
});
console.log("Transaction sent:", tx.hash);
const receipt = await tx.wait();