UNPKG

@c4tplatform/caminojs

Version:
116 lines 15.1 kB
"use strict"; /** * @packageDocumentation * @module API-AVM-InitialStates */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.InitialStates = void 0; const buffer_1 = require("buffer/"); const bintools_1 = __importDefault(require("../../utils/bintools")); const output_1 = require("../../common/output"); const outputs_1 = require("./outputs"); const constants_1 = require("./constants"); const serialization_1 = require("../../utils/serialization"); /** * @ignore */ const bintools = bintools_1.default.getInstance(); /** * Class for creating initial output states used in asset creation */ class InitialStates extends serialization_1.Serializable { constructor() { super(...arguments); this._typeName = "InitialStates"; this._typeID = undefined; this.fxs = {}; } serialize(encoding = "hex") { const fields = super.serialize(encoding); const flatfxs = {}; for (let fxid in this.fxs) { flatfxs[`${fxid}`] = this.fxs[`${fxid}`].map((o) => o.serialize(encoding)); } return Object.assign(Object.assign({}, fields), { fxs: flatfxs }); } deserialize(fields, encoding = "hex") { super.deserialize(fields, encoding); const unflat = {}; for (let fxid in fields["fxs"]) { unflat[`${fxid}`] = fields["fxs"][`${fxid}`].map((o) => { const out = (0, outputs_1.SelectOutputClass)(o["_typeID"]); out.deserialize(o, encoding); return out; }); } this.fxs = unflat; } /** * * @param out The output state to add to the collection * @param fxid The FxID that will be used for this output, default AVMConstants.SECPFXID */ addOutput(out, fxid = constants_1.AVMConstants.SECPFXID) { if (!(fxid in this.fxs)) { this.fxs[`${fxid}`] = []; } this.fxs[`${fxid}`].push(out); } fromBuffer(bytes, offset = 0) { const result = []; const klen = bintools.copyFrom(bytes, offset, offset + 4); offset += 4; const klennum = klen.readUInt32BE(0); for (let i = 0; i < klennum; i++) { const fxidbuff = bintools.copyFrom(bytes, offset, offset + 4); offset += 4; const fxid = fxidbuff.readUInt32BE(0); result[`${fxid}`] = []; const statelenbuff = bintools.copyFrom(bytes, offset, offset + 4); offset += 4; const statelen = statelenbuff.readUInt32BE(0); for (let j = 0; j < statelen; j++) { const outputid = bintools .copyFrom(bytes, offset, offset + 4) .readUInt32BE(0); offset += 4; const out = (0, outputs_1.SelectOutputClass)(outputid); offset = out.fromBuffer(bytes, offset); result[`${fxid}`].push(out); } } this.fxs = result; return offset; } toBuffer() { const buff = []; const keys = Object.keys(this.fxs) .map((k) => parseInt(k, 10)) .sort(); const klen = buffer_1.Buffer.alloc(4); klen.writeUInt32BE(keys.length, 0); buff.push(klen); for (let i = 0; i < keys.length; i++) { const fxid = keys[`${i}`]; const fxidbuff = buffer_1.Buffer.alloc(4); fxidbuff.writeUInt32BE(fxid, 0); buff.push(fxidbuff); const initialState = this.fxs[`${fxid}`].sort((0, output_1.BaseOutputComparator)()); const statelen = buffer_1.Buffer.alloc(4); statelen.writeUInt32BE(initialState.length, 0); buff.push(statelen); for (let j = 0; j < initialState.length; j++) { const outputid = buffer_1.Buffer.alloc(4); outputid.writeInt32BE(initialState[`${j}`].getOutputID(), 0); buff.push(outputid); buff.push(initialState[`${j}`].toBuffer()); } } return buffer_1.Buffer.concat(buff); } } exports.InitialStates = InitialStates; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbHN0YXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGlzL2F2bS9pbml0aWFsc3RhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQUVILG9DQUFnQztBQUNoQyxvRUFBMkM7QUFDM0MsZ0RBQXNFO0FBQ3RFLHVDQUE2QztBQUM3QywyQ0FBMEM7QUFDMUMsNkRBQTRFO0FBQzVFOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQWEsa0JBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUVqRDs7R0FFRztBQUNILE1BQWEsYUFBYyxTQUFRLDRCQUFZO0lBQS9DOztRQUNZLGNBQVMsR0FBRyxlQUFlLENBQUE7UUFDM0IsWUFBTyxHQUFHLFNBQVMsQ0FBQTtRQTRCbkIsUUFBRyxHQUFxQyxFQUFFLENBQUE7SUFtRXRELENBQUM7SUE3RkMsU0FBUyxDQUFDLFdBQStCLEtBQUs7UUFDNUMsTUFBTSxNQUFNLEdBQVcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoRCxNQUFNLE9BQU8sR0FBVyxFQUFFLENBQUE7UUFDMUIsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBYSxFQUFVLEVBQUUsQ0FDckUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FDdEIsQ0FBQTtTQUNGO1FBQ0QsdUNBQ0ssTUFBTSxLQUNULEdBQUcsRUFBRSxPQUFPLElBQ2I7SUFDSCxDQUFDO0lBQ0QsV0FBVyxDQUFDLE1BQWMsRUFBRSxXQUErQixLQUFLO1FBQzlELEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ25DLE1BQU0sTUFB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LElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BELE1BQU0sUUFBUSxHQUFXLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ3hDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7YUFDM0M7U0FDRjtRQUNELE9BQU8sZUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QixDQUFDO0NBQ0Y7QUFqR0Qsc0NBaUdDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgQVBJLUFWTS1Jbml0aWFsU3RhdGVzXG4gKi9cblxuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IEJpblRvb2xzIGZyb20gXCIuLi8uLi91dGlscy9iaW50b29sc1wiXG5pbXBvcnQgeyBCYXNlT3V0cHV0LCBCYXNlT3V0cHV0Q29tcGFyYXRvciB9IGZyb20gXCIuLi8uLi9jb21tb24vb3V0cHV0XCJcbmltcG9ydCB7IFNlbGVjdE91dHB1dENsYXNzIH0gZnJvbSBcIi4vb3V0cHV0c1wiXG5pbXBvcnQgeyBBVk1Db25zdGFudHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIlxuaW1wb3J0IHsgU2VyaWFsaXphYmxlLCBTZXJpYWxpemVkRW5jb2RpbmcgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2VyaWFsaXphdGlvblwiXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgYmludG9vbHM6IEJpblRvb2xzID0gQmluVG9vbHMuZ2V0SW5zdGFuY2UoKVxuXG4vKipcbiAqIENsYXNzIGZvciBjcmVhdGluZyBpbml0aWFsIG91dHB1dCBzdGF0ZXMgdXNlZCBpbiBhc3NldCBjcmVhdGlvblxuICovXG5leHBvcnQgY2xhc3MgSW5pdGlhbFN0YXRlcyBleHRlbmRzIFNlcmlhbGl6YWJsZSB7XG4gIHByb3RlY3RlZCBfdHlwZU5hbWUgPSBcIkluaXRpYWxTdGF0ZXNcIlxuICBwcm90ZWN0ZWQgX3R5cGVJRCA9IHVuZGVmaW5lZFxuXG4gIHNlcmlhbGl6ZShlbmNvZGluZzogU2VyaWFsaXplZEVuY29kaW5nID0gXCJoZXhcIik6IG9iamVjdCB7XG4gICAgY29uc3QgZmllbGRzOiBvYmplY3QgPSBzdXBlci5zZXJpYWxpemUoZW5jb2RpbmcpXG4gICAgY29uc3QgZmxhdGZ4czogb2JqZWN0ID0ge31cbiAgICBmb3IgKGxldCBmeGlkIGluIHRoaXMuZnhzKSB7XG4gICAgICBmbGF0ZnhzW2Ake2Z4aWR9YF0gPSB0aGlzLmZ4c1tgJHtmeGlkfWBdLm1hcCgobzogQmFzZU91dHB1dCk6IG9iamVjdCA9PlxuICAgICAgICBvLnNlcmlhbGl6ZShlbmNvZGluZylcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmZpZWxkcyxcbiAgICAgIGZ4czogZmxhdGZ4c1xuICAgIH1cbiAgfVxuICBkZXNlcmlhbGl6ZShmaWVsZHM6IG9iamVjdCwgZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpIHtcbiAgICBzdXBlci5kZXNlcmlhbGl6ZShmaWVsZHMsIGVuY29kaW5nKVxuICAgIGNvbnN0IHVuZmxhdDogeyBbZnhpZDogbnVtYmVyXTogQmFzZU91dHB1dFtdIH0gPSB7fVxuICAgIGZvciAobGV0IGZ4aWQgaW4gZmllbGRzW1wiZnhzXCJdKSB7XG4gICAgICB1bmZsYXRbYCR7ZnhpZH1gXSA9IGZpZWxkc1tcImZ4c1wiXVtgJHtmeGlkfWBdLm1hcCgobzogb2JqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IG91dDogQmFzZU91dHB1dCA9IFNlbGVjdE91dHB1dENsYXNzKG9bXCJfdHlwZUlEXCJdKVxuICAgICAgICBvdXQuZGVzZXJpYWxpemUobywgZW5jb2RpbmcpXG4gICAgICAgIHJldHVybiBvdXRcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMuZnhzID0gdW5mbGF0XG4gIH1cblxuICBwcm90ZWN0ZWQgZnhzOiB7IFtmeGlkOiBudW1iZXJdOiBCYXNlT3V0cHV0W10gfSA9IHt9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvdXQgVGhlIG91dHB1dCBzdGF0ZSB0byBhZGQgdG8gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGZ4aWQgVGhlIEZ4SUQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgb3V0cHV0LCBkZWZhdWx0IEFWTUNvbnN0YW50cy5TRUNQRlhJRFxuICAgKi9cbiAgYWRkT3V0cHV0KG91dDogQmFzZU91dHB1dCwgZnhpZDogbnVtYmVyID0gQVZNQ29uc3RhbnRzLlNFQ1BGWElEKTogdm9pZCB7XG4gICAgaWYgKCEoZnhpZCBpbiB0aGlzLmZ4cykpIHtcbiAgICAgIHRoaXMuZnhzW2Ake2Z4aWR9YF0gPSBbXVxuICAgIH1cbiAgICB0aGlzLmZ4c1tgJHtmeGlkfWBdLnB1c2gob3V0KVxuICB9XG5cbiAgZnJvbUJ1ZmZlcihieXRlczogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc3VsdDogeyBbZnhpZDogbnVtYmVyXTogQmFzZU91dHB1dFtdIH0gPSBbXVxuICAgIGNvbnN0IGtsZW46IEJ1ZmZlciA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDQpXG4gICAgb2Zmc2V0ICs9IDRcbiAgICBjb25zdCBrbGVubnVtOiBudW1iZXIgPSBrbGVuLnJlYWRVSW50MzJCRSgwKVxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBrbGVubnVtOyBpKyspIHtcbiAgICAgIGNvbnN0IGZ4aWRidWZmOiBCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KVxuICAgICAgb2Zmc2V0ICs9IDRcbiAgICAgIGNvbnN0IGZ4aWQ6IG51bWJlciA9IGZ4aWRidWZmLnJlYWRVSW50MzJCRSgwKVxuICAgICAgcmVzdWx0W2Ake2Z4aWR9YF0gPSBbXVxuICAgICAgY29uc3Qgc3RhdGVsZW5idWZmOiBCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KVxuICAgICAgb2Zmc2V0ICs9IDRcbiAgICAgIGNvbnN0IHN0YXRlbGVuOiBudW1iZXIgPSBzdGF0ZWxlbmJ1ZmYucmVhZFVJbnQzMkJFKDApXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgc3RhdGVsZW47IGorKykge1xuICAgICAgICBjb25zdCBvdXRwdXRpZDogbnVtYmVyID0gYmludG9vbHNcbiAgICAgICAgICAuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICAgICAgICAucmVhZFVJbnQzMkJFKDApXG4gICAgICAgIG9mZnNldCArPSA0XG4gICAgICAgIGNvbnN0IG91dDogQmFzZU91dHB1dCA9IFNlbGVjdE91dHB1dENsYXNzKG91dHB1dGlkKVxuICAgICAgICBvZmZzZXQgPSBvdXQuZnJvbUJ1ZmZlcihieXRlcywgb2Zmc2V0KVxuICAgICAgICByZXN1bHRbYCR7ZnhpZH1gXS5wdXNoKG91dClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5meHMgPSByZXN1bHRcbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICB0b0J1ZmZlcigpOiBCdWZmZXIge1xuICAgIGNvbnN0IGJ1ZmY6IEJ1ZmZlcltdID0gW11cbiAgICBjb25zdCBrZXlzOiBudW1iZXJbXSA9IE9iamVjdC5rZXlzKHRoaXMuZnhzKVxuICAgICAgLm1hcCgoazogc3RyaW5nKTogbnVtYmVyID0+IHBhcnNlSW50KGssIDEwKSlcbiAgICAgIC5zb3J0KClcbiAgICBjb25zdCBrbGVuOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNClcbiAgICBrbGVuLndyaXRlVUludDMyQkUoa2V5cy5sZW5ndGgsIDApXG4gICAgYnVmZi5wdXNoKGtsZW4pXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZ4aWQ6IG51bWJlciA9IGtleXNbYCR7aX1gXVxuICAgICAgY29uc3QgZnhpZGJ1ZmY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgICAgZnhpZGJ1ZmYud3JpdGVVSW50MzJCRShmeGlkLCAwKVxuICAgICAgYnVmZi5wdXNoKGZ4aWRidWZmKVxuICAgICAgY29uc3QgaW5pdGlhbFN0YXRlID0gdGhpcy5meHNbYCR7ZnhpZH1gXS5zb3J0KEJhc2VPdXRwdXRDb21wYXJhdG9yKCkpXG4gICAgICBjb25zdCBzdGF0ZWxlbjogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgICBzdGF0ZWxlbi53cml0ZVVJbnQzMkJFKGluaXRpYWxTdGF0ZS5sZW5ndGgsIDApXG4gICAgICBidWZmLnB1c2goc3RhdGVsZW4pXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgaW5pdGlhbFN0YXRlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dGlkOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNClcbiAgICAgICAgb3V0cHV0aWQud3JpdGVJbnQzMkJFKGluaXRpYWxTdGF0ZVtgJHtqfWBdLmdldE91dHB1dElEKCksIDApXG4gICAgICAgIGJ1ZmYucHVzaChvdXRwdXRpZClcbiAgICAgICAgYnVmZi5wdXNoKGluaXRpYWxTdGF0ZVtgJHtqfWBdLnRvQnVmZmVyKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmYpXG4gIH1cbn1cbiJdfQ==