UNPKG

fsl-js-sdk

Version:
918 lines (917 loc) 76 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); 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 __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FSLWeb3Sol = void 0; var _1 = __importDefault(require(".")); var bip39_1 = require("bip39"); var web3_js_1 = require("@solana/web3.js"); var spl_token_1 = require("@solana/spl-token"); var ethers_1 = require("ethers"); var ed25519_hd_key_1 = require("ed25519-hd-key"); var bs58_1 = require("bs58"); var decimal_js_1 = __importDefault(require("decimal.js")); var tweetnacl_1 = __importDefault(require("tweetnacl")); var tweetnacl_util_1 = require("tweetnacl-util"); var resolution_1 = __importDefault(require("@unstoppabledomains/resolution")); var anchor_1 = require("@project-serum/anchor"); var nodewallet_1 = __importDefault(require("@project-serum/anchor/dist/cjs/nodewallet")); var lz_v2_utilities_1 = require("@layerzerolabs/lz-v2-utilities"); var index_1 = require("../../constants/index"); var sdk_1 = require("../../sdk"); var lz_definitions_1 = require("@layerzerolabs/lz-definitions"); var mooarLz_1 = require("../../utils/mooarLz"); var solana_lz_1 = require("../../utils/solana_lz"); var solClaimAbi_1 = __importDefault(require("../../constants/solClaimAbi")); var FSLWeb3Sol = /** @class */ (function (_super) { __extends(FSLWeb3Sol, _super); function FSLWeb3Sol(_a) { var mnemonic = _a.mnemonic, gasPriorityPolygon = _a.gasPriorityPolygon, gasPriorityExtraPolygon = _a.gasPriorityExtraPolygon, gasPriorityExtraEvm = _a.gasPriorityExtraEvm; var _this = _super.call(this, { mnemonic: mnemonic, gasPriorityPolygon: gasPriorityPolygon, gasPriorityExtraPolygon: gasPriorityExtraPolygon, gasPriorityExtraEvm: gasPriorityExtraEvm, }) || this; if (mnemonic && _this.permission) { _this.generateWallet(mnemonic); } return _this; } FSLWeb3Sol.assignPublicKey = function (obj) { if (typeof obj === 'string') { return new web3_js_1.PublicKey(obj); } var assignObj = Object.create(web3_js_1.PublicKey.prototype); return Object.assign(assignObj, obj); }; FSLWeb3Sol.assignTransaction = function (obj) { var assignObj = Object.create(web3_js_1.Transaction.prototype); return Object.assign(assignObj, obj); }; FSLWeb3Sol.prototype.toBuffer = function (arr) { if (Buffer.isBuffer(arr)) { return arr; } else if (arr instanceof Uint8Array) { return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength); } else { return Buffer.from(arr); } }; FSLWeb3Sol.prototype.generateWallet = function (mnemonic) { if (!mnemonic) throw new Error('mnemonic is required'); if (!this.permission) throw new Error('This domain is not registered'); this.wallet = ethers_1.Wallet.fromMnemonic(mnemonic); var seed = (0, bip39_1.mnemonicToSeedSync)(mnemonic, ''); var path = "m/44'/501'/0'/0'"; this.solanaKeypaire = web3_js_1.Keypair.fromSeed((0, ed25519_hd_key_1.derivePath)(path, seed.toString('hex')).key); return this.wallet.address; }; FSLWeb3Sol.prototype.getSolanaAddress = function () { if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); return this.solanaKeypaire.publicKey.toBase58(); }; FSLWeb3Sol.prototype.exportSolanaPrivatekey = function () { if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); return (0, bs58_1.encode)(this.solanaKeypaire.secretKey); }; FSLWeb3Sol.prototype.checkSolanaTransactionHashStatus = function (txHash, rpc) { return __awaiter(this, void 0, void 0, function () { var connection; return __generator(this, function (_a) { connection = new web3_js_1.Connection(rpc, 'confirmed'); return [2 /*return*/, connection.getSignatureStatus(txHash)]; }); }); }; FSLWeb3Sol.validateSolAddress = function (address) { try { var pubkey = new web3_js_1.PublicKey(address); var isSolana = web3_js_1.PublicKey.isOnCurve(pubkey.toBuffer()); return isSolana; } catch (error) { return false; } }; FSLWeb3Sol.prototype.signSolanaMessage = function (message) { if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); // const fromWallet = Keypair.fromSecretKey(bs58.decode(privateKey)); var messageBytes = (0, tweetnacl_util_1.decodeUTF8)(message); var signature = tweetnacl_1.default.sign.detached(messageBytes, this.solanaKeypaire.secretKey); return signature; }; FSLWeb3Sol.verifySolanaMessage = function (message, signature, publicKey) { var messageBytes = (0, tweetnacl_util_1.decodeUTF8)(message); var result = tweetnacl_1.default.sign.detached.verify(messageBytes, signature, publicKey.toBytes()); return result; }; FSLWeb3Sol.prototype.sendSolanaTransaction = function (encodedTransaction, rpc) { return __awaiter(this, void 0, void 0, function () { var connection, result; return __generator(this, function (_a) { switch (_a.label) { case 0: connection = new web3_js_1.Connection(rpc, 'confirmed'); return [4 /*yield*/, connection.sendEncodedTransaction(encodedTransaction)]; case 1: result = _a.sent(); return [2 /*return*/, result]; } }); }); }; FSLWeb3Sol.prototype.sendRawTransaction = function (transactionBase64, rpc) { return __awaiter(this, void 0, void 0, function () { var transaction, transactionBinary, connection, signature; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); transaction = web3_js_1.VersionedTransaction.deserialize(Buffer.from(transactionBase64, 'base64')); transaction.sign([this.solanaKeypaire]); transactionBinary = transaction.serialize(); connection = new web3_js_1.Connection(rpc, 'confirmed'); return [4 /*yield*/, connection.sendRawTransaction(transactionBinary, { maxRetries: 2, skipPreflight: true, })]; case 1: signature = _a.sent(); return [2 /*return*/, signature]; } }); }); }; FSLWeb3Sol.prototype.signSolanaInstructions = function (instructions, keypairs, rpc, unitLimit, unitPrice) { return __awaiter(this, void 0, void 0, function () { var transaction, modifyComputeUnits, addPriorityFee, connection, blockHash, signatureData, wireTransaction, encodedTransaction; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); transaction = new web3_js_1.Transaction(); modifyComputeUnits = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: unitLimit !== null && unitLimit !== void 0 ? unitLimit : 200000, }); transaction.add(modifyComputeUnits); addPriorityFee = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({ microLamports: unitPrice !== null && unitPrice !== void 0 ? unitPrice : 5000, }); transaction.add(addPriorityFee); instructions.forEach(function (e) { transaction.add(e); }); transaction.feePayer = this.solanaKeypaire.publicKey; connection = new web3_js_1.Connection(rpc, 'confirmed'); return [4 /*yield*/, connection.getLatestBlockhash('confirmed')]; case 1: blockHash = (_a.sent()) .blockhash; transaction.recentBlockhash = blockHash; transaction.sign(this.solanaKeypaire); if (keypairs.length > 0) { transaction.partialSign.apply(transaction, keypairs); } signatureData = transaction.signature; if (signatureData != null) { wireTransaction = transaction.serialize(); encodedTransaction = this.toBuffer(wireTransaction).toString('base64'); return [2 /*return*/, encodedTransaction]; } else { return [2 /*return*/, '']; } return [2 /*return*/]; } }); }); }; FSLWeb3Sol.prototype.signSolanaTransaction = function (bufferStrs, versions) { var transactions = []; for (var i = 0; i < versions.length; i++) { if (versions[i] === 0) { var newTransaction = web3_js_1.VersionedTransaction.deserialize(Buffer.from(bufferStrs[i], 'base64')); newTransaction.sign([this.solanaKeypaire]); transactions.push(newTransaction); } else { var newTransaction = web3_js_1.Transaction.from(Buffer.from(bufferStrs[i], 'base64')); newTransaction.partialSign(this.solanaKeypaire); transactions.push(newTransaction); } } return transactions; }; FSLWeb3Sol.prototype.signSolanaTransactionWithBuffers = function (bufferStrs, versions) { var buffers = []; for (var i = 0; i < versions.length; i++) { if (versions[i] === 0) { var newTransaction = web3_js_1.VersionedTransaction.deserialize(Buffer.from(bufferStrs[i], 'base64')); newTransaction.sign([this.solanaKeypaire]); buffers.push(Buffer.from(newTransaction.serialize()).toString('base64')); } else { var newTransaction = web3_js_1.Transaction.from(Buffer.from(bufferStrs[i], 'base64')); newTransaction.partialSign(this.solanaKeypaire); buffers.push(newTransaction.serialize().toString('base64')); } } return buffers; }; FSLWeb3Sol.prototype.getSolanaSplTokenBalance = function (walletAddress, rpc, contractAddress) { return __awaiter(this, void 0, void 0, function () { var connection, publickey, mintAccount, associatedToken, account, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: connection = new web3_js_1.Connection(rpc); publickey = new web3_js_1.PublicKey(walletAddress); mintAccount = new web3_js_1.PublicKey(contractAddress); return [4 /*yield*/, (0, spl_token_1.getAssociatedTokenAddress)(mintAccount, publickey)]; case 1: associatedToken = _a.sent(); _a.label = 2; case 2: _a.trys.push([2, 4, , 5]); return [4 /*yield*/, (0, spl_token_1.getAccount)(connection, associatedToken)]; case 3: account = _a.sent(); return [3 /*break*/, 5]; case 4: error_1 = _a.sent(); return [2 /*return*/, 0]; case 5: return [2 /*return*/, Number(account.amount)]; } }); }); }; FSLWeb3Sol.prototype.getSolanaNativeTokenBalance = function (walletAddress, rpc) { return __awaiter(this, void 0, void 0, function () { var connection, publickey, balance; return __generator(this, function (_a) { switch (_a.label) { case 0: connection = new web3_js_1.Connection(rpc); publickey = new web3_js_1.PublicKey(walletAddress); return [4 /*yield*/, connection.getBalance(publickey)]; case 1: balance = _a.sent(); return [2 /*return*/, balance / 1e9]; } }); }); }; FSLWeb3Sol.prototype.transferSolanaNativeToken = function (_a) { var to = _a.to, amount = _a.amount, rpc = _a.rpc, unitLimit = _a.unitLimit, unitPrice = _a.unitPrice; return __awaiter(this, void 0, void 0, function () { var modifyComputeUnits, addPriorityFee, connection, toAccountPublicKey, number, newNumber, transferInstruction, transaction, blockHash, signatureData, wireTransaction, encodedTransaction, signature; return __generator(this, function (_b) { switch (_b.label) { case 0: if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); modifyComputeUnits = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: unitLimit !== null && unitLimit !== void 0 ? unitLimit : 200000, }); addPriorityFee = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({ microLamports: unitPrice !== null && unitPrice !== void 0 ? unitPrice : 5000, }); connection = new web3_js_1.Connection(rpc, 'confirmed'); toAccountPublicKey = new web3_js_1.PublicKey(to); number = amount * 1e9; newNumber = Math.floor(number); transferInstruction = web3_js_1.SystemProgram.transfer({ fromPubkey: this.solanaKeypaire.publicKey, toPubkey: toAccountPublicKey, lamports: newNumber, }); transaction = new web3_js_1.Transaction() .add(modifyComputeUnits) .add(addPriorityFee) .add(transferInstruction); return [4 /*yield*/, connection.getLatestBlockhash('confirmed')]; case 1: blockHash = (_b.sent()) .blockhash; transaction.feePayer = this.solanaKeypaire.publicKey; transaction.recentBlockhash = blockHash; transaction.sign.apply(transaction, [this.solanaKeypaire]); signatureData = transaction.signature; if (!(signatureData != null)) return [3 /*break*/, 3]; wireTransaction = transaction.serialize(); encodedTransaction = this.toBuffer(wireTransaction).toString('base64'); return [4 /*yield*/, connection.sendEncodedTransaction(encodedTransaction, { preflightCommitment: 'confirmed', })]; case 2: _b.sent(); signature = (0, bs58_1.encode)(signatureData); return [2 /*return*/, signature]; case 3: return [2 /*return*/, '']; } }); }); }; FSLWeb3Sol.prototype.checkSolanaNFTValid = function (_a) { var rpc = _a.rpc, contractAddress = _a.contractAddress; return __awaiter(this, void 0, void 0, function () { var connection, mintAccount, fromAccountAddress, err_1; return __generator(this, function (_b) { switch (_b.label) { case 0: if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); connection = new web3_js_1.Connection(rpc, 'confirmed'); mintAccount = new web3_js_1.PublicKey(contractAddress); _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); return [4 /*yield*/, (0, spl_token_1.getOrCreateAssociatedTokenAccount)(connection, this.solanaKeypaire, mintAccount, this.solanaKeypaire.publicKey)]; case 2: fromAccountAddress = _b.sent(); return [2 /*return*/, !!fromAccountAddress]; case 3: err_1 = _b.sent(); return [2 /*return*/, false]; case 4: return [2 /*return*/]; } }); }); }; FSLWeb3Sol.prototype.transferSolanaSplToken = function (_a) { var to = _a.to, amount = _a.amount, rpc = _a.rpc, contractAddress = _a.contractAddress, unitLimit = _a.unitLimit, unitPrice = _a.unitPrice; return __awaiter(this, void 0, void 0, function () { var modifyComputeUnits, addPriorityFee, connection, mintAccount, toAccountPublicKey, fromAccountAddress, associatedToken, accountInstruction, transaction, error_2, error_3, error_4, transferInstruction, blockHash, signatureData, wireTransaction, encodedTransaction, signature; return __generator(this, function (_b) { switch (_b.label) { case 0: if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); if (!contractAddress) throw new Error('contractAddress can not be empty'); modifyComputeUnits = web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: unitLimit !== null && unitLimit !== void 0 ? unitLimit : 200000, }); addPriorityFee = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({ microLamports: unitPrice !== null && unitPrice !== void 0 ? unitPrice : 5000, }); connection = new web3_js_1.Connection(rpc, 'confirmed'); mintAccount = new web3_js_1.PublicKey(contractAddress); toAccountPublicKey = new web3_js_1.PublicKey(to); return [4 /*yield*/, (0, spl_token_1.getOrCreateAssociatedTokenAccount)(connection, this.solanaKeypaire, mintAccount, this.solanaKeypaire.publicKey)]; case 1: fromAccountAddress = _b.sent(); return [4 /*yield*/, (0, spl_token_1.getAssociatedTokenAddress)(mintAccount, toAccountPublicKey)]; case 2: associatedToken = _b.sent(); accountInstruction = null; transaction = null; _b.label = 3; case 3: _b.trys.push([3, 5, , 6]); return [4 /*yield*/, (0, spl_token_1.getAccount)(connection, associatedToken)]; case 4: _b.sent(); return [3 /*break*/, 6]; case 5: error_2 = _b.sent(); if (error_2 instanceof spl_token_1.TokenAccountNotFoundError || error_2 instanceof spl_token_1.TokenInvalidAccountOwnerError) { try { accountInstruction = (0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(this.solanaKeypaire.publicKey, associatedToken, toAccountPublicKey, mintAccount); } catch (e) { error_3 = "transferSolanaToken invalid token account---".concat(e); throw new Error(error_3); } } else { error_4 = "transferSolanaToken--- error token account"; throw new Error(error_4); } return [3 /*break*/, 6]; case 6: transferInstruction = (0, spl_token_1.createTransferInstruction)(fromAccountAddress.address, associatedToken, this.solanaKeypaire.publicKey, amount); if (accountInstruction) { transaction = new web3_js_1.Transaction() .add(modifyComputeUnits) .add(addPriorityFee) .add(accountInstruction) .add(transferInstruction); } else { transaction = new web3_js_1.Transaction() .add(modifyComputeUnits) .add(addPriorityFee) .add(transferInstruction); } return [4 /*yield*/, connection.getLatestBlockhash('confirmed')]; case 7: blockHash = (_b.sent()) .blockhash; transaction.feePayer = this.solanaKeypaire.publicKey; transaction.recentBlockhash = blockHash; transaction.sign.apply(transaction, [this.solanaKeypaire]); signatureData = transaction.signature; if (!(signatureData != null)) return [3 /*break*/, 9]; wireTransaction = transaction.serialize(); encodedTransaction = this.toBuffer(wireTransaction).toString('base64'); return [4 /*yield*/, connection.sendEncodedTransaction(encodedTransaction, { preflightCommitment: 'confirmed', })]; case 8: _b.sent(); signature = (0, bs58_1.encode)(signatureData); return [2 /*return*/, signature]; case 9: return [2 /*return*/, '']; } }); }); }; FSLWeb3Sol.prototype.getSolanaTokenTransactions = function (rpc, from, limit) { return __awaiter(this, void 0, void 0, function () { var connection, walletPublicKey, signatures, transactionsFn, transactions, _loop_1, _i, signatures_1, signatureInfo; return __generator(this, function (_a) { switch (_a.label) { case 0: connection = new web3_js_1.Connection(rpc); walletPublicKey = new web3_js_1.PublicKey(from); return [4 /*yield*/, connection.getSignaturesForAddress(walletPublicKey, { limit: limit })]; case 1: signatures = _a.sent(); transactionsFn = []; transactions = []; _loop_1 = function (signatureInfo) { var signature = signatureInfo.signature; transactionsFn.push(function () { return connection .getTransaction(signature, { maxSupportedTransactionVersion: 0, }) .then(function (res) { if (res) { transactions.push(res); } }); }); }; for (_i = 0, signatures_1 = signatures; _i < signatures_1.length; _i++) { signatureInfo = signatures_1[_i]; _loop_1(signatureInfo); } return [4 /*yield*/, Promise.all(transactionsFn.map(function (fn) { return fn(); }))]; case 2: _a.sent(); return [2 /*return*/, transactions]; } }); }); }; FSLWeb3Sol.prototype.getOrCreateAssociatedAccount = function (symbol, owner, rpc) { return __awaiter(this, void 0, void 0, function () { var newWorkConnection, mintAccount; return __generator(this, function (_a) { switch (_a.label) { case 0: newWorkConnection = new web3_js_1.Connection(rpc, 'confirmed'); mintAccount = new web3_js_1.PublicKey(this.tokenMintAddress(symbol)); return [4 /*yield*/, (0, spl_token_1.getOrCreateAssociatedTokenAccount)(newWorkConnection, { publicKey: owner.publicKey, secretKey: owner.secretKey, }, mintAccount, owner.publicKey)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; FSLWeb3Sol.prototype.batchGetOrCreateAssociatedAccount = function (_a) { var fromToken = _a.fromToken, toToken = _a.toToken, rpc = _a.rpc; return __awaiter(this, void 0, void 0, function () { var promiseQueue; var _this = this; return __generator(this, function (_b) { switch (_b.label) { case 0: promiseQueue = []; if (![fromToken, toToken].includes(index_1.TOKEN_NAME.USDC)) { promiseQueue.push(function () { return _this.getOrCreateAssociatedAccount(index_1.TOKEN_NAME.USDC, _this.solanaKeypaire, rpc); }); } if (fromToken !== index_1.TOKEN_NAME.SOL) { promiseQueue.push(function () { return _this.getOrCreateAssociatedAccount(fromToken, _this.solanaKeypaire, rpc); }); } if (toToken !== index_1.TOKEN_NAME.SOL) { promiseQueue.push(function () { return _this.getOrCreateAssociatedAccount(toToken, _this.solanaKeypaire, rpc); }); } return [4 /*yield*/, Promise.all(promiseQueue.map(function (fn) { return fn(); }))]; case 1: _b.sent(); return [2 /*return*/]; } }); }); }; FSLWeb3Sol.prototype.getSolanaTokenUnit = function (_a) { var fromToken = _a.fromToken, toToken = _a.toToken, rpc = _a.rpc, amountIn = _a.amountIn, slipNum = _a.slipNum; return __awaiter(this, void 0, void 0, function () { var connection, orca, orcaSolPool, orcaSolPool2, solToken, solToken2, money, _b, _c, _d, _e, amount, slippageNum, quote, orcaAmount, amount2, quote2, orcaAmount2; return __generator(this, function (_f) { switch (_f.label) { case 0: if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); connection = new web3_js_1.Connection(rpc, 'confirmed'); return [4 /*yield*/, this.batchGetOrCreateAssociatedAccount({ fromToken: fromToken, toToken: toToken, rpc: rpc, })]; case 1: _f.sent(); orca = (0, sdk_1.getDooar)(connection); if (!(fromToken === index_1.TOKEN_NAME.USDC)) return [3 /*break*/, 11]; _b = toToken; switch (_b) { case index_1.TOKEN_NAME.GST: return [3 /*break*/, 2]; case index_1.TOKEN_NAME.GMT: return [3 /*break*/, 4]; case index_1.TOKEN_NAME.SOL: return [3 /*break*/, 6]; } return [3 /*break*/, 8]; case 2: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GST_USDC)]; case 3: orcaSolPool = _f.sent(); return [3 /*break*/, 10]; case 4: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GMT_USDC)]; case 5: orcaSolPool = _f.sent(); return [3 /*break*/, 10]; case 6: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 7: orcaSolPool = _f.sent(); return [3 /*break*/, 10]; case 8: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 9: orcaSolPool = _f.sent(); _f.label = 10; case 10: solToken = orcaSolPool.getTokenB(); return [3 /*break*/, 35]; case 11: if (!(fromToken === index_1.TOKEN_NAME.SOL)) return [3 /*break*/, 19]; return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 12: orcaSolPool = _f.sent(); _c = toToken; switch (_c) { case index_1.TOKEN_NAME.USDC: return [3 /*break*/, 13]; case index_1.TOKEN_NAME.GST: return [3 /*break*/, 14]; case index_1.TOKEN_NAME.GMT: return [3 /*break*/, 16]; } return [3 /*break*/, 18]; case 13: return [3 /*break*/, 18]; case 14: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GST_USDC)]; case 15: orcaSolPool2 = _f.sent(); return [3 /*break*/, 18]; case 16: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GMT_USDC)]; case 17: orcaSolPool2 = _f.sent(); return [3 /*break*/, 18]; case 18: solToken = orcaSolPool.getTokenA(); return [3 /*break*/, 35]; case 19: if (!(fromToken === index_1.TOKEN_NAME.GST)) return [3 /*break*/, 27]; return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GST_USDC)]; case 20: orcaSolPool = _f.sent(); _d = toToken; switch (_d) { case index_1.TOKEN_NAME.SOL: return [3 /*break*/, 21]; case index_1.TOKEN_NAME.USDC: return [3 /*break*/, 23]; case index_1.TOKEN_NAME.GMT: return [3 /*break*/, 24]; } return [3 /*break*/, 26]; case 21: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 22: orcaSolPool2 = _f.sent(); return [3 /*break*/, 26]; case 23: return [3 /*break*/, 26]; case 24: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GMT_USDC)]; case 25: orcaSolPool2 = _f.sent(); return [3 /*break*/, 26]; case 26: solToken = orcaSolPool.getTokenA(); return [3 /*break*/, 35]; case 27: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GMT_USDC)]; case 28: orcaSolPool = _f.sent(); _e = toToken; switch (_e) { case index_1.TOKEN_NAME.SOL: return [3 /*break*/, 29]; case index_1.TOKEN_NAME.USDC: return [3 /*break*/, 31]; case index_1.TOKEN_NAME.GST: return [3 /*break*/, 32]; } return [3 /*break*/, 34]; case 29: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 30: orcaSolPool2 = _f.sent(); return [3 /*break*/, 34]; case 31: return [3 /*break*/, 34]; case 32: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GST_USDC)]; case 33: orcaSolPool2 = _f.sent(); return [3 /*break*/, 34]; case 34: solToken = orcaSolPool.getTokenA(); _f.label = 35; case 35: amount = new decimal_js_1.default(amountIn || '1'); slippageNum = new decimal_js_1.default(slipNum || 0); return [4 /*yield*/, orcaSolPool.getQuote(solToken, amount, slippageNum)]; case 36: quote = _f.sent(); orcaAmount = quote.getExpectedOutputAmount(); if (!!orcaSolPool2) return [3 /*break*/, 37]; money = orcaAmount.toNumber().toString(); return [3 /*break*/, 39]; case 37: solToken2 = orcaSolPool2.getTokenB(); amount2 = new decimal_js_1.default(orcaAmount.toNumber()); return [4 /*yield*/, orcaSolPool2.getQuote(solToken2, amount2, slippageNum)]; case 38: quote2 = _f.sent(); orcaAmount2 = quote2.getExpectedOutputAmount(); money = orcaAmount2.toNumber().toString(); _f.label = 39; case 39: return [2 /*return*/, money]; } }); }); }; FSLWeb3Sol.prototype.waitForConfirmation = function (connection, signature, maxRetries) { if (maxRetries === void 0) { maxRetries = 60; } return __awaiter(this, void 0, void 0, function () { var retries, value, status_1; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!signature) return [2 /*return*/]; retries = 0; _a.label = 1; case 1: if (!(retries < maxRetries)) return [3 /*break*/, 4]; return [4 /*yield*/, connection.getSignatureStatuses([signature])]; case 2: value = (_a.sent()).value; status_1 = value[0]; if (status_1 && status_1.confirmationStatus === 'confirmed') { return [2 /*return*/]; } return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, 500); })]; case 3: _a.sent(); // 等待 500ms retries++; return [3 /*break*/, 1]; case 4: throw new Error('search timeout'); } }); }); }; FSLWeb3Sol.prototype.sendSolSwapTransition = function (connection, swapPayload, swapPayload2) { return __awaiter(this, void 0, void 0, function () { var computeUnitLimit, computeUnitPrice, _a, blockhash, lastValidBlockHeight, res, lookupTable, instructions, messageV0, _transaction, signers, swapTxId; return __generator(this, function (_b) { switch (_b.label) { case 0: computeUnitLimit = 400000; computeUnitPrice = 100000; return [4 /*yield*/, connection.getLatestBlockhash('confirmed')]; case 1: _a = _b.sent(), blockhash = _a.blockhash, lastValidBlockHeight = _a.lastValidBlockHeight; return [4 /*yield*/, connection .getAddressLookupTable(new web3_js_1.PublicKey('AWNCzbAUeFJxvnw2rQcTR7mwqtu2QpmH3FZp2GBUzEHL')) .catch(function () { return { value: null }; })]; case 2: res = _b.sent(); lookupTable = res.value; instructions = __spreadArray([ web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnitLimit, }), web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({ microLamports: computeUnitPrice, }) ], swapPayload.transaction.instructions, true); if (swapPayload2) { instructions = __spreadArray(__spreadArray([], instructions, true), swapPayload2.transaction.instructions, true); } messageV0 = new web3_js_1.TransactionMessage({ payerKey: this.solanaKeypaire.publicKey, recentBlockhash: blockhash, instructions: instructions, }).compileToV0Message(lookupTable ? [lookupTable] : []); _transaction = new web3_js_1.VersionedTransaction(messageV0); signers = __spreadArray([this.solanaKeypaire], swapPayload.signers, true); if (swapPayload2) { signers = __spreadArray(__spreadArray([], signers, true), swapPayload2.signers, true); } _transaction.sign(signers); return [4 /*yield*/, connection .sendTransaction(_transaction) .catch(function () { return ''; })]; case 3: swapTxId = _b.sent(); return [4 /*yield*/, this.waitForConfirmation(connection, swapTxId)]; case 4: _b.sent(); // await connection // .confirmTransaction({ // signature: swapTxId, // blockhash, // lastValidBlockHeight, // }) // .catch(() => { // return ''; // }); return [2 /*return*/, swapTxId]; } }); }); }; FSLWeb3Sol.prototype.swapSolanaToken = function (_a) { var _b; var fromToken = _a.fromToken, toToken = _a.toToken, tokenAmount = _a.tokenAmount, rpc = _a.rpc, _c = _a.slipNum, slipNum = _c === void 0 ? 1 : _c; return __awaiter(this, void 0, void 0, function () { var connection, orca, orcaSolPool, orcaSolPool2, solToken, _d, _e, _f, _g, swapSolToken, swapAmount, slippageNum, swapQuote, swapOrcaAmount, swapTxId, solToken2, amount2, quote2, orcaAmount2, _h, swapPayload, swapPayload2, swapPayload; return __generator(this, function (_j) { switch (_j.label) { case 0: if (!this.solanaKeypaire) throw new Error('Solana wallet not initialized'); connection = new web3_js_1.Connection(rpc, { confirmTransactionInitialTimeout: 10000, commitment: 'confirmed', }); return [4 /*yield*/, this.batchGetOrCreateAssociatedAccount({ fromToken: fromToken, toToken: toToken, rpc: rpc, })]; case 1: _j.sent(); orca = (0, sdk_1.getDooar)(connection); if (!(fromToken === index_1.TOKEN_NAME.USDC)) return [3 /*break*/, 11]; _d = toToken; switch (_d) { case index_1.TOKEN_NAME.GST: return [3 /*break*/, 2]; case index_1.TOKEN_NAME.GMT: return [3 /*break*/, 4]; case index_1.TOKEN_NAME.SOL: return [3 /*break*/, 6]; } return [3 /*break*/, 8]; case 2: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GST_USDC)]; case 3: orcaSolPool = _j.sent(); return [3 /*break*/, 10]; case 4: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GMT_USDC)]; case 5: orcaSolPool = _j.sent(); return [3 /*break*/, 10]; case 6: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 7: orcaSolPool = _j.sent(); return [3 /*break*/, 10]; case 8: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 9: orcaSolPool = _j.sent(); _j.label = 10; case 10: solToken = orcaSolPool.getTokenB(); return [3 /*break*/, 35]; case 11: if (!(fromToken === index_1.TOKEN_NAME.SOL)) return [3 /*break*/, 19]; return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 12: orcaSolPool = _j.sent(); _e = toToken; switch (_e) { case index_1.TOKEN_NAME.USDC: return [3 /*break*/, 13]; case index_1.TOKEN_NAME.GST: return [3 /*break*/, 14]; case index_1.TOKEN_NAME.GMT: return [3 /*break*/, 16]; } return [3 /*break*/, 18]; case 13: return [3 /*break*/, 18]; case 14: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GST_USDC)]; case 15: orcaSolPool2 = _j.sent(); return [3 /*break*/, 18]; case 16: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GMT_USDC)]; case 17: orcaSolPool2 = _j.sent(); return [3 /*break*/, 18]; case 18: solToken = orcaSolPool.getTokenA(); return [3 /*break*/, 35]; case 19: if (!(fromToken === index_1.TOKEN_NAME.GST)) return [3 /*break*/, 27]; return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GST_USDC)]; case 20: orcaSolPool = _j.sent(); _f = toToken; switch (_f) { case index_1.TOKEN_NAME.SOL: return [3 /*break*/, 21]; case index_1.TOKEN_NAME.USDC: return [3 /*break*/, 23]; case index_1.TOKEN_NAME.GMT: return [3 /*break*/, 24]; } return [3 /*break*/, 26]; case 21: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 22: orcaSolPool2 = _j.sent(); return [3 /*break*/, 26]; case 23: return [3 /*break*/, 26]; case 24: return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GMT_USDC)];