@ton3/liteclient
Version:
TON Blockchain LiteClient
194 lines • 8.67 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _LiteApi_events;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LiteApi = void 0;
const events_1 = __importDefault(require("events"));
const debug_1 = __importDefault(require("debug"));
const stream_1 = require("../../tl/stream");
const dataTypes = __importStar(require("../../dataTypes"));
const functions = __importStar(require("../../functions"));
const ton3_core_1 = require("ton3-core");
const debug = (0, debug_1.default)('tonkite:lite-api:client');
let counter = 0;
const nextQueryId = () => {
const buffer = ton3_core_1.Utils.Helpers.hexToBytes('0000000095d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d10');
buffer.set((0, stream_1.uintToBytes)(counter++, 4).reverse(), 0);
return buffer;
};
const createADNLQuery = (queryId, query) => {
const queryPadding = 4 - (((query.length + 1) % 4) || 4);
const buffer = new Uint8Array(4 + 32 + 1 + query.length + queryPadding);
buffer.set((0, stream_1.uintToBytes)(0xb48bf97a, 4).reverse(), 0);
buffer.set(queryId, 4);
buffer.set([query.length], 4 + 32);
buffer.set(query, 4 + 32 + 1);
return buffer;
};
class LiteApiError extends Error {
constructor(message, code) {
super(message);
this.code = code;
}
}
class LiteApi {
constructor(adnlClient) {
this.adnlClient = adnlClient;
_LiteApi_events.set(this, new events_1.default());
adnlClient.on('data', (data) => {
const dataReader = new stream_1.StreamReader(data);
const adnlAnswer = dataTypes.adnl.answerMessage.read(dataReader);
const [tag, answer] = this.parseLiteServerAnswer(adnlAnswer.answer);
__classPrivateFieldGet(this, _LiteApi_events, "f").emit(ton3_core_1.Utils.Helpers.bytesToHex(adnlAnswer.queryId), {
tag,
answer,
});
});
}
parseLiteServerAnswer(dataReader) {
const tag = dataReader.readInt32LE();
const codecs = Object.values(dataTypes.liteServer);
const codec = codecs.find((codec) => codec.tag === tag);
if (!codec) {
throw new Error(`Data type 0x${tag.toString(16).padStart(8, '0')} is not supported.`);
}
return [tag, codec.read(dataReader)];
}
query(dataWriterFn, wait) {
const dataWriter = new stream_1.StreamWriter();
const queryWriter = new stream_1.StreamWriter();
if (wait) {
const { seqno, timeout = 10000 } = wait;
dataTypes.liteServer.waitMasterchainSeqno.write(dataWriter, seqno, timeout);
}
dataWriterFn(dataWriter);
dataTypes.liteServer.query.write(queryWriter, dataWriter.buffer);
const queryId = nextQueryId();
this.adnlClient.write(createADNLQuery(queryId, queryWriter.buffer));
return new Promise((resolve, reject) => {
__classPrivateFieldGet(this, _LiteApi_events, "f").once(ton3_core_1.Utils.Helpers.bytesToHex(queryId), ({ tag, answer }) => {
if (tag === dataTypes.liteServer.error.tag) {
return reject(new LiteApiError(answer.message, answer.code));
}
resolve(answer);
});
});
}
getMasterchainInfo(wait) {
debug('query getMasterchainInfo()');
return this.query((dataWriter) => {
functions.liteServer.getMasterchainInfo(dataWriter);
}, wait);
}
getTime(wait) {
debug('query getTime()');
return this.query((dataWriter) => {
functions.liteServer.getTime(dataWriter);
}, wait);
}
getVersion(wait) {
debug('query getVersion()');
return this.query((dataWriter) => {
functions.liteServer.getVersion(dataWriter);
}, wait);
}
getBlock(blockId, wait) {
debug('query getBlock()');
return this.query((dataWriter) => {
functions.liteServer.getBlock(dataWriter, blockId);
}, wait);
}
getAllShardsInfo(blockId, wait) {
debug('query getAllShardsInfo()');
return this.query((dataWriter) => {
functions.liteServer.getAllShardsInfo(dataWriter, blockId);
}, wait);
}
getState(blockId, wait) {
debug('query getState()');
return this.query((dataWriter) => {
functions.liteServer.getState(dataWriter, blockId);
}, wait);
}
getBlockHeader(data, wait) {
debug('query getBlockHeader()');
return this.query((dataWriter) => {
functions.liteServer.getBlockHeader(dataWriter, data.blockId, data.mode);
}, wait);
}
lookupBlock(input, wait) {
debug('query lookupBlock()');
return this.query((dataWriter) => {
functions.liteServer.lookupBlock(dataWriter, input);
}, wait);
}
getAccountState(data, wait) {
debug('query getAccountState(%d, %d, %s)', data.blockId.workchain, data.blockId.seqno, `${data.account.workchain}:${ton3_core_1.Utils.Helpers.bytesToHex(data.account.id)}`);
return this.query((dataWriter) => {
functions.liteServer.getAccountState(dataWriter, data.blockId, data.account);
}, wait);
}
listBlockTransactions(data, wait) {
return this.query((dataWriter) => {
debug('query listBlockTransactions()');
functions.liteServer.listBlockTransactions(dataWriter, data.blockId, data.count || 20, data.after || null, data?.options?.reverseOrder || false, data?.options?.wantProof || false);
}, wait);
}
getTransactions(data, wait) {
debug('query getTransactions(%s, %s, %s)', `${data.account.workchain}:${ton3_core_1.Utils.Helpers.bytesToHex(data.account.id)}`, data.lt.toString(10), ton3_core_1.Utils.Helpers.bytesToHex(data.hash));
return this.query((dataWriter) => {
functions.liteServer.getTransactions(dataWriter, data.count || 20, data.account, data.lt, data.hash);
}, wait);
}
getOneTransaction(data, wait) {
debug('query getOneTransaction(%s, %s, %s)', `${data.blockId.workchain},${data.blockId.shard.toString(16)},${data.blockId.seqno}`, `${data.accountId.workchain}:${ton3_core_1.Utils.Helpers.bytesToHex(data.accountId.id)}`, data.lt.toString(10));
return this.query((dataWriter) => {
functions.liteServer.getOneTransaction(dataWriter, data.blockId, data.accountId, data.lt);
}, wait);
}
runSmcMethod(data, wait) {
debug('query runSmcMethod()');
return this.query((dataWriter) => {
functions.liteServer.runSmcMethod(dataWriter, data.blockId, data.accountId, data.methodId, data.params);
}, wait);
}
sendMessage(body, wait) {
debug('query sendMessage()');
return this.query((dataWriter) => {
functions.liteServer.sendMessage(dataWriter, body);
}, wait);
}
}
exports.LiteApi = LiteApi;
_LiteApi_events = new WeakMap();
//# sourceMappingURL=index.js.map