@orca-so/whirlpools-sdk
Version:
Typescript SDK to interact with Orca's Whirlpool program.
58 lines • 3.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.swapAsync = swapAsync;
const common_sdk_1 = require("@orca-so/common-sdk");
const __1 = require("../..");
const swap_ix_1 = require("../swap-ix");
const token_extension_util_1 = require("../../utils/public/token-extension-util");
const v2_1 = require("../v2");
const spl_token_1 = require("@solana/spl-token");
async function swapAsync(ctx, params, _opts) {
const { wallet, whirlpool, swapInput } = params;
const { aToB, amount, otherAmountThreshold, amountSpecifiedIsInput } = swapInput;
const txBuilder = new common_sdk_1.TransactionBuilder(ctx.connection, ctx.wallet, ctx.txBuilderOpts);
const data = whirlpool.getData();
const inputTokenMint = aToB ? data.tokenMintA : data.tokenMintB;
const maxInputAmount = amountSpecifiedIsInput ? amount : otherAmountThreshold;
if (inputTokenMint.equals(spl_token_1.NATIVE_MINT) && maxInputAmount.eq(common_sdk_1.U64_MAX)) {
throw new Error("Wrapping U64_MAX amount of SOL is not possible");
}
const [resolvedAtaA, resolvedAtaB] = await (0, common_sdk_1.resolveOrCreateATAs)(ctx.connection, wallet, [
{
tokenMint: data.tokenMintA,
wrappedSolAmountIn: aToB ? maxInputAmount : common_sdk_1.ZERO,
},
{
tokenMint: data.tokenMintB,
wrappedSolAmountIn: !aToB ? maxInputAmount : common_sdk_1.ZERO,
},
], () => ctx.fetcher.getAccountRentExempt(), undefined, true, ctx.accountResolverOpts.allowPDAOwnerAddress, ctx.accountResolverOpts.createWrappedSolAccountMethod);
const { address: ataAKey, ...tokenOwnerAccountAIx } = resolvedAtaA;
const { address: ataBKey, ...tokenOwnerAccountBIx } = resolvedAtaB;
txBuilder.addInstructions([tokenOwnerAccountAIx, tokenOwnerAccountBIx]);
const inputTokenAccount = aToB ? ataAKey : ataBKey;
const outputTokenAccount = aToB ? ataBKey : ataAKey;
const tokenExtensionCtx = await token_extension_util_1.TokenExtensionUtil.buildTokenExtensionContext(ctx.fetcher, data);
const baseParams = __1.SwapUtils.getSwapParamsFromQuote(swapInput, ctx, whirlpool, inputTokenAccount, outputTokenAccount, wallet);
return txBuilder.addInstruction(!token_extension_util_1.TokenExtensionUtil.isV2IxRequiredPool(tokenExtensionCtx) &&
!params.swapInput.supplementalTickArrays
? (0, swap_ix_1.swapIx)(ctx.program, baseParams)
: (0, v2_1.swapV2Ix)(ctx.program, {
...baseParams,
tokenMintA: tokenExtensionCtx.tokenMintWithProgramA.address,
tokenMintB: tokenExtensionCtx.tokenMintWithProgramB.address,
tokenProgramA: tokenExtensionCtx.tokenMintWithProgramA.tokenProgram,
tokenProgramB: tokenExtensionCtx.tokenMintWithProgramB.tokenProgram,
...(await token_extension_util_1.TokenExtensionUtil.getExtraAccountMetasForTransferHookForPool(ctx.connection, tokenExtensionCtx, baseParams.aToB
? baseParams.tokenOwnerAccountA
: baseParams.tokenVaultA, baseParams.aToB
? baseParams.tokenVaultA
: baseParams.tokenOwnerAccountA, baseParams.aToB ? baseParams.tokenAuthority : baseParams.whirlpool, baseParams.aToB
? baseParams.tokenVaultB
: baseParams.tokenOwnerAccountB, baseParams.aToB
? baseParams.tokenOwnerAccountB
: baseParams.tokenVaultB, baseParams.aToB ? baseParams.whirlpool : baseParams.tokenAuthority)),
supplementalTickArrays: params.swapInput.supplementalTickArrays,
}));
}
//# sourceMappingURL=swap-async.js.map