fsl-js-sdk
Version:
sdk for web
918 lines (917 loc) • 76 kB
JavaScript
"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)];