UNPKG

fsl-js-sdk

Version:
441 lines (440 loc) 30.5 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DooarPoolImpl = void 0; var spl_token_v0_1 = require("@solana/spl-token-v0"); var web3_js_1 = require("@solana/web3.js"); var dooar_defaults_1 = require("../../../constants/dooar-defaults"); var dooar_1 = require("../../../dooar"); var pool_instructions_1 = require("../../../dooar/utils/web3/instructions/pool-instructions"); var key_utils_1 = require("../../../dooar/utils/web3/key-utils"); var quote_builder_1 = require("../../quote/quote-builder"); var spl_token_swap_1 = require("@solana/spl-token-swap"); var DooarPoolImpl = /** @class */ (function () { function DooarPoolImpl(connection, network, config) { this.connection = connection; this.poolParams = config; this.dooarTokenSwapId = network === dooar_1.Network.MAINNET ? dooar_1.DOOAR_TOKEN_SWAP_ID : dooar_1.DOOAR_TOKEN_SWAP_ID_DEVNET; } DooarPoolImpl.prototype.loadFeeAccount = function () { return __awaiter(this, void 0, void 0, function () { var accountInfo, tokenSwapData, newFeeAccount; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.connection.getAccountInfo(this.poolParams.address)]; case 1: accountInfo = _a.sent(); if (!(accountInfo === null || accountInfo === void 0 ? void 0 : accountInfo.data)) { throw new Error('Failed to get pool fee account.'); } tokenSwapData = spl_token_swap_1.TokenSwapLayout.decode(accountInfo.data); newFeeAccount = new web3_js_1.PublicKey(tokenSwapData.feeAccount); this.poolParams = Object.freeze(__assign(__assign({}, this.poolParams), { feeAccount: newFeeAccount })); return [2 /*return*/]; } }); }); }; DooarPoolImpl.prototype.getTokenA = function () { var tokenId = this.poolParams.tokenIds[0]; return this.poolParams.tokens[tokenId]; }; DooarPoolImpl.prototype.getTokenB = function () { var tokenId = this.poolParams.tokenIds[1]; return this.poolParams.tokens[tokenId]; }; DooarPoolImpl.prototype.getPoolTokenMint = function () { return this.poolParams.poolTokenMint; }; DooarPoolImpl.prototype.getLPBalance = function (owner) { return __awaiter(this, void 0, void 0, function () { var address, accountInfo, result; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, dooar_1.deriveAssociatedTokenAddress)(owner, this.poolParams.poolTokenMint)]; case 1: address = _a.sent(); return [4 /*yield*/, this.connection.getAccountInfo(address)]; case 2: accountInfo = _a.sent(); // User does not have a balance for this account if (accountInfo == undefined) { return [2 /*return*/, dooar_1.DooarU64.fromNumber(0, this.poolParams.poolTokenDecimals)]; } result = (0, dooar_1.deserializeAccount)(accountInfo === null || accountInfo === void 0 ? void 0 : accountInfo.data); if (result == undefined) { throw new Error('Failed to parse user account for LP token.'); } return [2 /*return*/, dooar_1.DooarU64.fromU64(result.amount, this.poolParams.poolTokenDecimals)]; } }); }); }; DooarPoolImpl.prototype.getLPSupply = function () { return __awaiter(this, void 0, void 0, function () { var context, amt; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.connection.getTokenSupply(this.poolParams.poolTokenMint)]; case 1: context = _a.sent(); amt = new spl_token_v0_1.u64(context.value.amount); return [2 /*return*/, dooar_1.DooarU64.fromU64(amt, this.poolParams.poolTokenDecimals)]; } }); }); }; DooarPoolImpl.prototype.getQuote = function (inputToken, inputAmount, slippage) { return __awaiter(this, void 0, void 0, function () { var _a, inputPoolToken, outputPoolToken, _b, inputTokenCount, outputTokenCount; return __generator(this, function (_c) { switch (_c.label) { case 0: _a = (0, dooar_1.getTokens)(this.poolParams, inputToken.mint.toString()), inputPoolToken = _a.inputPoolToken, outputPoolToken = _a.outputPoolToken; return [4 /*yield*/, (0, dooar_1.getTokenCount)(this.connection, this.poolParams, inputPoolToken, outputPoolToken)]; case 1: _b = _c.sent(), inputTokenCount = _b.inputTokenCount, outputTokenCount = _b.outputTokenCount; return [2 /*return*/, this.getQuoteWithPoolAmounts(inputToken, inputAmount, inputTokenCount, outputTokenCount, slippage)]; } }); }); }; DooarPoolImpl.prototype.getQuoteWithPoolAmounts = function (inputToken, inputAmount, inputTokenPoolAmount, outputTokenPoolAmount, slippage) { return __awaiter(this, void 0, void 0, function () { var slippageTolerance, feeStructure, _a, inputPoolToken, outputPoolToken, inputAmountU64, quoteParams, quoteBuilder, quote; return __generator(this, function (_b) { slippageTolerance = slippage === undefined ? dooar_defaults_1.defaultSlippagePercentage : dooar_1.Percentage.fromDecimal(slippage); feeStructure = this.poolParams.feeStructure; _a = (0, dooar_1.getTokens)(this.poolParams, inputToken.mint.toString()), inputPoolToken = _a.inputPoolToken, outputPoolToken = _a.outputPoolToken; inputAmountU64 = dooar_1.U64Utils.toTokenU64(inputAmount, inputPoolToken, 'inputAmount'); quoteParams = { inputToken: inputPoolToken, outputToken: outputPoolToken, inputTokenCount: inputTokenPoolAmount, outputTokenCount: outputTokenPoolAmount, feeStructure: feeStructure, slippageTolerance: slippageTolerance, amp: this.poolParams.amp !== undefined ? new spl_token_v0_1.u64(this.poolParams.amp) : undefined, }; quoteBuilder = quote_builder_1.QuoteBuilderFactory.getBuilder(this.poolParams.curveType); quote = quoteBuilder === null || quoteBuilder === void 0 ? void 0 : quoteBuilder.buildQuote(quoteParams, inputAmountU64); if (quote == undefined) { throw new Error('Failed to get quote!'); } return [2 /*return*/, quote]; }); }); }; DooarPoolImpl.prototype.swap = function (owner, inputToken, amountIn, minimumAmountOut) { return __awaiter(this, void 0, void 0, function () { var _owner, ownerAddress, _a, inputPoolToken, outputPoolToken, amountInU64, minimumAmountOutU64, _b, inputPoolTokenUserAddress, resolveInputAddrInstructions, _c, outputPoolTokenUserAddress, resolveOutputAddrInstructions, _d, userTransferAuthority, approvalInstruction, swapInstruction; return __generator(this, function (_e) { switch (_e.label) { case 0: _owner = new key_utils_1.Owner(owner); ownerAddress = _owner.publicKey; _a = (0, dooar_1.getTokens)(this.poolParams, inputToken.mint.toString()), inputPoolToken = _a.inputPoolToken, outputPoolToken = _a.outputPoolToken; amountInU64 = dooar_1.U64Utils.toTokenU64(amountIn, inputPoolToken, 'amountIn'); minimumAmountOutU64 = dooar_1.U64Utils.toTokenU64(minimumAmountOut, outputPoolToken, 'minimumAmountOut'); return [4 /*yield*/, (0, dooar_1.resolveOrCreateAssociatedTokenAddress)(this.connection, _owner, inputPoolToken.mint, amountInU64)]; case 1: _b = _e.sent(), inputPoolTokenUserAddress = _b.address, resolveInputAddrInstructions = __rest(_b, ["address"]); return [4 /*yield*/, (0, dooar_1.resolveOrCreateAssociatedTokenAddress)(this.connection, _owner, outputPoolToken.mint)]; case 2: _c = _e.sent(), outputPoolTokenUserAddress = _c.address, resolveOutputAddrInstructions = __rest(_c, ["address"]); if (inputPoolTokenUserAddress === undefined || outputPoolTokenUserAddress === undefined) { throw new Error('Unable to derive input / output token associated address.'); } _d = (0, pool_instructions_1.createApprovalInstruction)(ownerAddress, amountInU64, inputPoolTokenUserAddress), userTransferAuthority = _d.userTransferAuthority, approvalInstruction = __rest(_d, ["userTransferAuthority"]); return [4 /*yield*/, (0, pool_instructions_1.createSwapInstruction)(this.poolParams, _owner, inputPoolToken, inputPoolTokenUserAddress, outputPoolToken, outputPoolTokenUserAddress, amountInU64, minimumAmountOutU64, userTransferAuthority.publicKey, this.dooarTokenSwapId)]; case 3: swapInstruction = _e.sent(); return [4 /*yield*/, new dooar_1.TransactionBuilder(this.connection, ownerAddress, _owner) .addInstruction(resolveInputAddrInstructions) .addInstruction(resolveOutputAddrInstructions) .addInstruction(approvalInstruction) .addInstruction(swapInstruction) .build()]; case 4: return [2 /*return*/, _e.sent()]; } }); }); }; DooarPoolImpl.prototype.getDepositQuote = function (maxTokenAIn, maxTokenBIn, slippage) { return __awaiter(this, void 0, void 0, function () { var slippageTolerance, maxTokenAIn_U64, maxTokenBIn_U64, _a, tokenAAmount, tokenBAmount, lpSupply, poolTokenAmountWithA, poolTokenAmountWithB, minPoolTokenAmountOut_U64; return __generator(this, function (_b) { switch (_b.label) { case 0: slippageTolerance = slippage === undefined ? dooar_defaults_1.defaultSlippagePercentage : dooar_1.Percentage.fromDecimal(slippage); maxTokenAIn_U64 = dooar_1.U64Utils.toTokenU64(maxTokenAIn, this.getTokenA(), 'maxTokenAIn'); maxTokenBIn_U64 = dooar_1.U64Utils.toTokenU64(maxTokenBIn, this.getTokenB(), 'maxTokenBIn'); return [4 /*yield*/, (0, dooar_1.getTokenCount)(this.connection, this.poolParams, this.getTokenA(), this.getTokenB())]; case 1: _a = _b.sent(), tokenAAmount = _a.inputTokenCount, tokenBAmount = _a.outputTokenCount; return [4 /*yield*/, this.getLPSupply()]; case 2: lpSupply = _b.sent(); if (tokenAAmount.eq(dooar_1.ZERO) || tokenBAmount.eq(dooar_1.ZERO)) { return [2 /*return*/, { minPoolTokenAmountOut: dooar_1.DooarU64.fromU64(dooar_1.ZERO, lpSupply.scale), maxTokenAIn: dooar_1.DooarU64.fromU64(maxTokenAIn_U64, this.getTokenA().scale), maxTokenBIn: dooar_1.DooarU64.fromU64(maxTokenBIn_U64, this.getTokenB().scale), }]; } poolTokenAmountWithA = maxTokenAIn_U64 .mul(slippageTolerance.denominator) .mul(lpSupply.toU64()) .div(tokenAAmount) .div(slippageTolerance.numerator.add(slippageTolerance.denominator)); poolTokenAmountWithB = maxTokenBIn_U64 .mul(slippageTolerance.denominator) .mul(lpSupply.toU64()) .div(tokenBAmount) .div(slippageTolerance.numerator.add(slippageTolerance.denominator)); minPoolTokenAmountOut_U64 = poolTokenAmountWithA.gt(poolTokenAmountWithB) ? poolTokenAmountWithB : poolTokenAmountWithA; return [2 /*return*/, { minPoolTokenAmountOut: dooar_1.DooarU64.fromU64(minPoolTokenAmountOut_U64, lpSupply.scale), maxTokenAIn: dooar_1.DooarU64.fromU64(maxTokenAIn_U64, this.getTokenA().scale), maxTokenBIn: dooar_1.DooarU64.fromU64(maxTokenBIn_U64, this.getTokenB().scale), }]; } }); }); }; DooarPoolImpl.prototype.deposit = function (owner, maxTokenAIn, maxTokenBIn, minPoolTokenAmountOut) { return __awaiter(this, void 0, void 0, function () { var _owner, ownerAddress, tokenA, tokenB, maxTokenAIn_U64, maxTokenBIn_U64, minPoolTokenAmountOut_U64, _a, userTokenAPublicKey, resolveTokenAInstructions, _b, userTokenBPublicKey, resolveTokenBInstructions, _c, userPoolTokenPublicKey, resolvePoolTokenInstructions, _d, userTransferAuthority, transferTokenAInstruction, transferTokenBInstruction, depositInstruction; return __generator(this, function (_e) { switch (_e.label) { case 0: _owner = new key_utils_1.Owner(owner); ownerAddress = _owner.publicKey; tokenA = this.getTokenA(); tokenB = this.getTokenB(); maxTokenAIn_U64 = dooar_1.U64Utils.toTokenU64(maxTokenAIn, tokenA, 'maxTokenAIn'); maxTokenBIn_U64 = dooar_1.U64Utils.toTokenU64(maxTokenBIn, tokenB, 'maxTokenBIn'); minPoolTokenAmountOut_U64 = dooar_1.U64Utils.toPoolU64(minPoolTokenAmountOut, this.poolParams, 'poolTokenAmount'); return [4 /*yield*/, (0, dooar_1.resolveOrCreateAssociatedTokenAddress)(this.connection, _owner, tokenA.mint, maxTokenAIn_U64)]; case 1: _a = _e.sent(), userTokenAPublicKey = _a.address, resolveTokenAInstructions = __rest(_a, ["address"]); return [4 /*yield*/, (0, dooar_1.resolveOrCreateAssociatedTokenAddress)(this.connection, _owner, tokenB.mint, maxTokenBIn_U64)]; case 2: _b = _e.sent(), userTokenBPublicKey = _b.address, resolveTokenBInstructions = __rest(_b, ["address"]); return [4 /*yield*/, (0, dooar_1.resolveOrCreateAssociatedTokenAddress)(this.connection, _owner, this.poolParams.poolTokenMint)]; case 3: _c = _e.sent(), userPoolTokenPublicKey = _c.address, resolvePoolTokenInstructions = __rest(_c, ["address"]); _d = (0, pool_instructions_1.createApprovalInstruction)(ownerAddress, maxTokenAIn_U64, userTokenAPublicKey), userTransferAuthority = _d.userTransferAuthority, transferTokenAInstruction = __rest(_d, ["userTransferAuthority"]); transferTokenBInstruction = __rest((0, pool_instructions_1.createApprovalInstruction)(ownerAddress, maxTokenBIn_U64, userTokenBPublicKey, userTransferAuthority), []); return [4 /*yield*/, (0, pool_instructions_1.createDepositInstruction)(this.poolParams, userTransferAuthority.publicKey, userTokenAPublicKey, userTokenBPublicKey, userPoolTokenPublicKey, minPoolTokenAmountOut_U64, maxTokenAIn_U64, maxTokenBIn_U64, tokenA.addr, tokenB.addr, this.dooarTokenSwapId, _owner)]; case 4: depositInstruction = _e.sent(); return [4 /*yield*/, new dooar_1.TransactionBuilder(this.connection, ownerAddress, _owner) .addInstruction(resolveTokenAInstructions) .addInstruction(resolveTokenBInstructions) .addInstruction(resolvePoolTokenInstructions) .addInstruction(transferTokenAInstruction) .addInstruction(transferTokenBInstruction) .addInstruction(depositInstruction) .build()]; case 5: return [2 /*return*/, _e.sent()]; } }); }); }; DooarPoolImpl.prototype.getWithdrawQuote = function (quoteTokenAmount, quoteTokenMint, poolTokenAccount, slippage) { var _a; return __awaiter(this, void 0, void 0, function () { var slippageTolerance, lpSupply, _b, tokenAAmount, tokenBAmount, poolTokenIn_U64, _c, feeStructure, feeAccount, shouldCalculateWithdrawFeed, withdrawFee, token, totalAmount, numerator, denominator, poolTokenIn, poolTokenIn_U64_2, minTokenAOut, minTokenBOut; return __generator(this, function (_d) { switch (_d.label) { case 0: slippageTolerance = slippage === undefined ? dooar_defaults_1.defaultSlippagePercentage : dooar_1.Percentage.fromDecimal(slippage); return [4 /*yield*/, this.getLPSupply()]; case 1: lpSupply = _d.sent(); return [4 /*yield*/, (0, dooar_1.getTokenCount)(this.connection, this.poolParams, this.getTokenA(), this.getTokenB())]; case 2: _b = _d.sent(), tokenAAmount = _b.inputTokenCount, tokenBAmount = _b.outputTokenCount; poolTokenIn_U64 = dooar_1.ZERO; _c = this.poolParams, feeStructure = _c.feeStructure, feeAccount = _c.feeAccount; shouldCalculateWithdrawFeed = !feeAccount.equals(poolTokenAccount) && ((_a = feeStructure.withdrawFee) === null || _a === void 0 ? void 0 : _a.numerator.gt(dooar_1.ZERO)); if (quoteTokenMint.equals(this.getPoolTokenMint())) { poolTokenIn_U64 = dooar_1.U64Utils.toPoolU64(quoteTokenAmount, this.poolParams, 'quoteTokenAmount'); if (shouldCalculateWithdrawFeed && poolTokenIn_U64.gtn(0) && feeStructure.withdrawFee) { withdrawFee = poolTokenIn_U64 .mul(feeStructure.withdrawFee.numerator) .div(feeStructure.withdrawFee.denominator); withdrawFee = withdrawFee.eqn(0) ? new spl_token_v0_1.u64(1) : withdrawFee; poolTokenIn_U64 = poolTokenIn_U64.sub(withdrawFee); } } else if (quoteTokenMint.equals(this.getTokenA().mint) || quoteTokenMint.equals(this.getTokenB().mint)) { token = quoteTokenMint.equals(this.getTokenA().mint) ? this.getTokenA() : this.getTokenB(); totalAmount = token.mint.equals(this.getTokenA().mint) ? tokenAAmount : tokenBAmount; numerator = quoteTokenAmount instanceof dooar_1.DooarU64 ? quoteTokenAmount.toDecimal() : quoteTokenAmount; denominator = dooar_1.DecimalUtil.fromU64(totalAmount, token.scale); poolTokenIn = lpSupply.toDecimal().div(denominator).mul(numerator); poolTokenIn_U64 = dooar_1.U64Utils.toPoolU64(poolTokenIn, this.poolParams, 'poolTokenIn'); if (shouldCalculateWithdrawFeed && poolTokenIn_U64.gtn(0) && feeStructure.withdrawFee) { poolTokenIn_U64_2 = poolTokenIn_U64 .mul(feeStructure.withdrawFee.denominator) .div(feeStructure.withdrawFee.denominator.sub(feeStructure.withdrawFee.numerator)); poolTokenIn_U64 = poolTokenIn_U64_2.gt(poolTokenIn_U64) ? poolTokenIn_U64_2 : poolTokenIn_U64.addn(1); } } else { throw new Error("Unable to get withdraw quote with an invalid quoteTokenMint ".concat(quoteTokenMint)); } if (poolTokenIn_U64.eq(dooar_1.ZERO)) { return [2 /*return*/, { maxPoolTokenAmountIn: dooar_1.DooarU64.fromU64(dooar_1.ZERO, lpSupply.scale), minTokenAOut: dooar_1.DooarU64.fromU64(dooar_1.ZERO, this.getTokenA().scale), minTokenBOut: dooar_1.DooarU64.fromU64(dooar_1.ZERO, this.getTokenB().scale), }]; } minTokenAOut = new dooar_1.DooarU64(poolTokenIn_U64 .mul(slippageTolerance.denominator) .mul(tokenAAmount) .div(lpSupply.toU64()) .div(slippageTolerance.numerator.add(slippageTolerance.denominator)), this.getTokenA().scale); minTokenBOut = new dooar_1.DooarU64(poolTokenIn_U64 .mul(slippageTolerance.denominator) .mul(tokenBAmount) .div(lpSupply.toU64()) .div(slippageTolerance.numerator.add(slippageTolerance.denominator)), this.getTokenB().scale); return [2 /*return*/, { maxPoolTokenAmountIn: dooar_1.DooarU64.fromU64(poolTokenIn_U64, lpSupply.scale), minTokenAOut: minTokenAOut, minTokenBOut: minTokenBOut, }]; } }); }); }; DooarPoolImpl.prototype.withdraw = function (owner, poolTokenAmountIn, minTokenAOut, minTokenBOut) { return __awaiter(this, void 0, void 0, function () { var _owner, ownerAddress, tokenA, tokenB, minTokenAOut_U64, minTokenBOut_U64, poolTokenAmountIn_U64, _a, userTokenAPublicKey, resolveTokenAInstructions, _b, userTokenBPublicKey, resolveTokenBInstructions, _c, userPoolTokenPublicKey, resolvePoolTokenInstructions, _d, userTransferAuthority, transferPoolTokenInstruction, withdrawInstruction; return __generator(this, function (_e) { switch (_e.label) { case 0: _owner = new key_utils_1.Owner(owner); ownerAddress = _owner.publicKey; tokenA = this.getTokenA(); tokenB = this.getTokenB(); minTokenAOut_U64 = dooar_1.U64Utils.toTokenU64(minTokenAOut, tokenA, 'minTokenAOut'); minTokenBOut_U64 = dooar_1.U64Utils.toTokenU64(minTokenBOut, tokenB, 'minTokenBOut'); poolTokenAmountIn_U64 = dooar_1.U64Utils.toPoolU64(poolTokenAmountIn, this.poolParams, 'poolTokenAmountIn'); return [4 /*yield*/, (0, dooar_1.resolveOrCreateAssociatedTokenAddress)(this.connection, _owner, tokenA.mint)]; case 1: _a = _e.sent(), userTokenAPublicKey = _a.address, resolveTokenAInstructions = __rest(_a, ["address"]); return [4 /*yield*/, (0, dooar_1.resolveOrCreateAssociatedTokenAddress)(this.connection, _owner, tokenB.mint)]; case 2: _b = _e.sent(), userTokenBPublicKey = _b.address, resolveTokenBInstructions = __rest(_b, ["address"]); return [4 /*yield*/, (0, dooar_1.resolveOrCreateAssociatedTokenAddress)(this.connection, _owner, this.poolParams.poolTokenMint)]; case 3: _c = _e.sent(), userPoolTokenPublicKey = _c.address, resolvePoolTokenInstructions = __rest(_c, ["address"]); _d = (0, pool_instructions_1.createApprovalInstruction)(ownerAddress, poolTokenAmountIn_U64, userPoolTokenPublicKey), userTransferAuthority = _d.userTransferAuthority, transferPoolTokenInstruction = __rest(_d, ["userTransferAuthority"]); return [4 /*yield*/, (0, pool_instructions_1.createWithdrawInstruction)(this.poolParams, userTransferAuthority.publicKey, userTokenAPublicKey, userTokenBPublicKey, userPoolTokenPublicKey, poolTokenAmountIn_U64, minTokenAOut_U64, minTokenBOut_U64, tokenA.addr, tokenB.addr, this.dooarTokenSwapId, _owner)]; case 4: withdrawInstruction = _e.sent(); return [4 /*yield*/, new dooar_1.TransactionBuilder(this.connection, ownerAddress, _owner) .addInstruction(resolveTokenAInstructions) .addInstruction(resolveTokenBInstructions) .addInstruction(resolvePoolTokenInstructions) .addInstruction(transferPoolTokenInstruction) .addInstruction(withdrawInstruction) .build()]; case 5: return [2 /*return*/, _e.sent()]; } }); }); }; return DooarPoolImpl; }()); exports.DooarPoolImpl = DooarPoolImpl;