fsl-js-sdk
Version:
sdk for web
441 lines (440 loc) • 30.5 kB
JavaScript
"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;