@sen-use/web3
Version:
The library for Sentre
86 lines (85 loc) • 4.13 kB
JavaScript
;
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;