UNPKG

@sen-use/web3

Version:
86 lines (85 loc) 4.13 kB
"use strict"; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SolanaExplorer = void 0; const web3_js_1 = require("@solana/web3.js"); const DEFAULT_LIMIT = 700; const TRANSACTION_LIMIT = 200; class SolanaExplorer { constructor(conn) { this.conn = conn; } //Search for all signatures from last Signature and earlier //So: If new collection (to now) -> last Signature = null fetchSignatures(address, lastSignature, limit = DEFAULT_LIMIT) { return __awaiter(this, void 0, void 0, function* () { if (limit > DEFAULT_LIMIT) limit = DEFAULT_LIMIT; const options = { limit: limit, before: lastSignature, }; return this.conn.getConfirmedSignaturesForAddress2(address, options); }); } fetchConfirmTransaction(signatures) { return __awaiter(this, void 0, void 0, function* () { let confirmedTransactions = []; let limit = TRANSACTION_LIMIT; const promiseTransGroup = []; for (let offset = 0; offset <= signatures.length / limit; offset++) { const skip = offset * limit; const signaturesGroup = signatures.slice(skip, skip + limit); promiseTransGroup.push(this.conn.getParsedTransactions(signaturesGroup)); } const transGroups = yield Promise.all(promiseTransGroup); for (const transGroup of transGroups) { //@ts-ignore confirmedTransactions = confirmedTransactions.concat(transGroup); } return confirmedTransactions; }); } fetchTransactions(programId, options) { return __awaiter(this, void 0, void 0, function* () { const currentTime = new Date().getTime() / 1000; let { secondFrom, secondTo, lastSignature, limit } = options; secondFrom = Math.floor(secondFrom || 0); secondTo = Math.floor(secondTo || currentTime); const programPublicKey = new web3_js_1.PublicKey(programId); let signatures = []; let isStop = false; while (!isStop) { const confirmedSignatureInfos = yield this.fetchSignatures(programPublicKey, lastSignature, limit); if (!(confirmedSignatureInfos === null || confirmedSignatureInfos === void 0 ? void 0 : confirmedSignatureInfos.length) || isStop) break; for (const info of confirmedSignatureInfos) { const blockTime = info.blockTime; if (!blockTime || blockTime > secondTo) continue; if (blockTime < secondFrom) { isStop = true; break; } lastSignature = info.signature; signatures.push(info.signature); } if (limit && signatures.length >= limit) break; if ((confirmedSignatureInfos === null || confirmedSignatureInfos === void 0 ? void 0 : confirmedSignatureInfos.length) < DEFAULT_LIMIT) break; } const confirmedTransactions = yield this.fetchConfirmTransaction(signatures); return confirmedTransactions; }); } } exports.SolanaExplorer = SolanaExplorer;