Handling Swap Simulation For Estimating MinOut
{
PriceMath,
} from "@metadaoproject/futarchy/v0.4";
const simlulation = PriceMath.simulateSwap(
inputAmountBN,
swapType,
amm.baseAmount,
amm.quoteAmount,
new BN(slippageBps),
);
returns
{
expectedOut,
newBaseReserves,
newQuoteReserves,
minExpectedOut,
}
Fetching AMM tokens via AMM
const ammClient = AmmClient.createClient({ provider });
const amm = await ammClient.getAmm(new PublicKey(ammAddr));
const baseMint = amm.baseMint;
const quoteMint = amm.quoteMint;
Fetching AMM tokens via Autocrat
const autocratClient = AutocratClient.createClient({
provider,
});
const conditionalVaultClient = ConditionalVaultClient.createClient({
provider,
});
const proposalKey = new PublicKey("")
const proposal = await autocratClient.fetchProposal(proposalKey)
const baseVault = await conditionalVaultClient.fetchVault(new PublicKey(proposal.baseVault))
const quoteVault = await conditionalVaultClient.fetchVault(new PublicKey(proposal.quoteVault))
const baseVaultMint = baseVault?.underlyingTokenMint
const quoteVaultMint = quoteVault?.underlyingTokenMint
const passBaseMint = baseVault?.conditionalTokenMints[0]
const failBaseMint = baseVault?.conditionalTokenMints[1]
const passQuoteMint = quoteVault?.conditionalTokenMints[0]
const failQuoteMint = quoteVault?.conditionalTokenMints[1]
Fetching AMM balances for swap and simulating swap
const amm = await ammClient.getAmm(new PublicKey(ammAddr));
const isBuySelected = true;
const inputAmountBN = 1_000_000; // $1 USDC
const slippageBps = 100; // 100 bps or 1%
const swapType: SwapType = isBuySelected ? { buy: {} } : { sell: {} };
const swapSimulationResult = PriceMath.simulateSwap(
inputAmountBN,
swapType,
amm.baseAmount,
amm.quoteAmount,
new BN(slippageBps),
);
Combined Split + Swap Example
if (activeConditionalBalanceBN.lt(inputAmountBN)) {
const mintAmount = inputAmountBN.sub(activeConditionalBalanceBN);
const mintTxBuilder = await conditionalVaultClient
.splitTokensIx(
questionAddr,
underlyingVaultAddr,
underlyingTokenMintAddr,
mintAmount,
2,
userPublicKey
)
.preInstructions([...associatedTokenAccountInstructions]);
}
const swapSimulationResult = await PriceMath.simulateSwap(
inputAmountBN,
swapType,
amm.baseAmount,
amm.quoteAmount,
new BN(slippageBps)
);
const minExpectedOutBN = swapSimulationResult.minExpectedOut!;
const swapTxBuilder = await ammClient.swapIx(
ammAddr,
baseMintAddr,
quoteMintAddr,
swapType,
inputAmountBN,
minExpectedOutBN,
userPublicKey
);
const instructions: TransactionInstruction[] = [
ComputeBudgetProgram.setComputeUnitLimit({
units: mintTxBuilder ? 200_000 : 150_000,
}),
];
if (mintTxBuilder) {
instructions.push(...(await InstructionUtils.getInstructions(mintTxBuilder)));
}
instructions.push(...(await InstructionUtils.getInstructions(swapTxBuilder)));
const tx = new Transaction().add(...instructions);
📚 Previously
📚 Next Up