UNPKG

@kubectl/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(output_1.Output.comparator()); 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbHN0YXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGlzL2F2bS9pbml0aWFsc3RhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQUVILG9DQUFnQztBQUNoQyxvRUFBMkM7QUFDM0MsZ0RBQTRDO0FBQzVDLHVDQUE2QztBQUM3QywyQ0FBMEM7QUFDMUMsNkRBQTRFO0FBQzVFOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQWEsa0JBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUVqRDs7R0FFRztBQUNILE1BQWEsYUFBYyxTQUFRLDRCQUFZO0lBQS9DOztRQUNZLGNBQVMsR0FBRyxlQUFlLENBQUE7UUFDM0IsWUFBTyxHQUFHLFNBQVMsQ0FBQTtRQTRCbkIsUUFBRyxHQUFpQyxFQUFFLENBQUE7SUFtRWxELENBQUM7SUE3RkMsU0FBUyxDQUFDLFdBQStCLEtBQUs7UUFDNUMsTUFBTSxNQUFNLEdBQVcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoRCxNQUFNLE9BQU8sR0FBVyxFQUFFLENBQUE7UUFDMUIsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUyxFQUFVLEVBQUUsQ0FDakUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FDdEIsQ0FBQTtTQUNGO1FBQ0QsdUNBQ0ssTUFBTSxLQUNULEdBQUcsRUFBRSxPQUFPLElBQ2I7SUFDSCxDQUFDO0lBQ0QsV0FBVyxDQUFDLE1BQWMsRUFBRSxXQUErQixLQUFLO1FBQzlELEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ25DLE1BQU0s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O1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BELE1BQU0sUUFBUSxHQUFXLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQ3hDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7YUFDM0M7U0FDRjtRQUNELE9BQU8sZUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QixDQUFDO0NBQ0Y7QUFqR0Qsc0NBaUdDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgQVBJLUFWTS1Jbml0aWFsU3RhdGVzXG4gKi9cblxuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIlxuaW1wb3J0IEJpblRvb2xzIGZyb20gXCIuLi8uLi91dGlscy9iaW50b29sc1wiXG5pbXBvcnQgeyBPdXRwdXQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL291dHB1dFwiXG5pbXBvcnQgeyBTZWxlY3RPdXRwdXRDbGFzcyB9IGZyb20gXCIuL291dHB1dHNcIlxuaW1wb3J0IHsgQVZNQ29uc3RhbnRzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCJcbmltcG9ydCB7IFNlcmlhbGl6YWJsZSwgU2VyaWFsaXplZEVuY29kaW5nIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NlcmlhbGl6YXRpb25cIlxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGJpbnRvb2xzOiBCaW5Ub29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKClcblxuLyoqXG4gKiBDbGFzcyBmb3IgY3JlYXRpbmcgaW5pdGlhbCBvdXRwdXQgc3RhdGVzIHVzZWQgaW4gYXNzZXQgY3JlYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIEluaXRpYWxTdGF0ZXMgZXh0ZW5kcyBTZXJpYWxpemFibGUge1xuICBwcm90ZWN0ZWQgX3R5cGVOYW1lID0gXCJJbml0aWFsU3RhdGVzXCJcbiAgcHJvdGVjdGVkIF90eXBlSUQgPSB1bmRlZmluZWRcblxuICBzZXJpYWxpemUoZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpOiBvYmplY3Qge1xuICAgIGNvbnN0IGZpZWxkczogb2JqZWN0ID0gc3VwZXIuc2VyaWFsaXplKGVuY29kaW5nKVxuICAgIGNvbnN0IGZsYXRmeHM6IG9iamVjdCA9IHt9XG4gICAgZm9yIChsZXQgZnhpZCBpbiB0aGlzLmZ4cykge1xuICAgICAgZmxhdGZ4c1tgJHtmeGlkfWBdID0gdGhpcy5meHNbYCR7ZnhpZH1gXS5tYXAoKG86IE91dHB1dCk6IG9iamVjdCA9PlxuICAgICAgICBvLnNlcmlhbGl6ZShlbmNvZGluZylcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmZpZWxkcyxcbiAgICAgIGZ4czogZmxhdGZ4c1xuICAgIH1cbiAgfVxuICBkZXNlcmlhbGl6ZShmaWVsZHM6IG9iamVjdCwgZW5jb2Rpbmc6IFNlcmlhbGl6ZWRFbmNvZGluZyA9IFwiaGV4XCIpIHtcbiAgICBzdXBlci5kZXNlcmlhbGl6ZShmaWVsZHMsIGVuY29kaW5nKVxuICAgIGNvbnN0IHVuZmxhdDogeyBbZnhpZDogbnVtYmVyXTogT3V0cHV0W10gfSA9IHt9XG4gICAgZm9yIChsZXQgZnhpZCBpbiBmaWVsZHNbXCJmeHNcIl0pIHtcbiAgICAgIHVuZmxhdFtgJHtmeGlkfWBdID0gZmllbGRzW1wiZnhzXCJdW2Ake2Z4aWR9YF0ubWFwKChvOiBvYmplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgb3V0OiBPdXRwdXQgPSBTZWxlY3RPdXRwdXRDbGFzcyhvW1wiX3R5cGVJRFwiXSlcbiAgICAgICAgb3V0LmRlc2VyaWFsaXplKG8sIGVuY29kaW5nKVxuICAgICAgICByZXR1cm4gb3V0XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmZ4cyA9IHVuZmxhdFxuICB9XG5cbiAgcHJvdGVjdGVkIGZ4czogeyBbZnhpZDogbnVtYmVyXTogT3V0cHV0W10gfSA9IHt9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvdXQgVGhlIG91dHB1dCBzdGF0ZSB0byBhZGQgdG8gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGZ4aWQgVGhlIEZ4SUQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgb3V0cHV0LCBkZWZhdWx0IEFWTUNvbnN0YW50cy5TRUNQRlhJRFxuICAgKi9cbiAgYWRkT3V0cHV0KG91dDogT3V0cHV0LCBmeGlkOiBudW1iZXIgPSBBVk1Db25zdGFudHMuU0VDUEZYSUQpOiB2b2lkIHtcbiAgICBpZiAoIShmeGlkIGluIHRoaXMuZnhzKSkge1xuICAgICAgdGhpcy5meHNbYCR7ZnhpZH1gXSA9IFtdXG4gICAgfVxuICAgIHRoaXMuZnhzW2Ake2Z4aWR9YF0ucHVzaChvdXQpXG4gIH1cblxuICBmcm9tQnVmZmVyKGJ5dGVzOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzdWx0OiB7IFtmeGlkOiBudW1iZXJdOiBPdXRwdXRbXSB9ID0gW11cbiAgICBjb25zdCBrbGVuOiBCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KVxuICAgIG9mZnNldCArPSA0XG4gICAgY29uc3Qga2xlbm51bTogbnVtYmVyID0ga2xlbi5yZWFkVUludDMyQkUoMClcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwga2xlbm51bTsgaSsrKSB7XG4gICAgICBjb25zdCBmeGlkYnVmZjogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICAgIG9mZnNldCArPSA0XG4gICAgICBjb25zdCBmeGlkOiBudW1iZXIgPSBmeGlkYnVmZi5yZWFkVUludDMyQkUoMClcbiAgICAgIHJlc3VsdFtgJHtmeGlkfWBdID0gW11cbiAgICAgIGNvbnN0IHN0YXRlbGVuYnVmZjogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICAgIG9mZnNldCArPSA0XG4gICAgICBjb25zdCBzdGF0ZWxlbjogbnVtYmVyID0gc3RhdGVsZW5idWZmLnJlYWRVSW50MzJCRSgwKVxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHN0YXRlbGVuOyBqKyspIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0aWQ6IG51bWJlciA9IGJpbnRvb2xzXG4gICAgICAgICAgLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDQpXG4gICAgICAgICAgLnJlYWRVSW50MzJCRSgwKVxuICAgICAgICBvZmZzZXQgKz0gNFxuICAgICAgICBjb25zdCBvdXQ6IE91dHB1dCA9IFNlbGVjdE91dHB1dENsYXNzKG91dHB1dGlkKVxuICAgICAgICBvZmZzZXQgPSBvdXQuZnJvbUJ1ZmZlcihieXRlcywgb2Zmc2V0KVxuICAgICAgICByZXN1bHRbYCR7ZnhpZH1gXS5wdXNoKG91dClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5meHMgPSByZXN1bHRcbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICB0b0J1ZmZlcigpOiBCdWZmZXIge1xuICAgIGNvbnN0IGJ1ZmY6IEJ1ZmZlcltdID0gW11cbiAgICBjb25zdCBrZXlzOiBudW1iZXJbXSA9IE9iamVjdC5rZXlzKHRoaXMuZnhzKVxuICAgICAgLm1hcCgoazogc3RyaW5nKTogbnVtYmVyID0+IHBhcnNlSW50KGssIDEwKSlcbiAgICAgIC5zb3J0KClcbiAgICBjb25zdCBrbGVuOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNClcbiAgICBrbGVuLndyaXRlVUludDMyQkUoa2V5cy5sZW5ndGgsIDApXG4gICAgYnVmZi5wdXNoKGtsZW4pXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZ4aWQ6IG51bWJlciA9IGtleXNbYCR7aX1gXVxuICAgICAgY29uc3QgZnhpZGJ1ZmY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgICAgZnhpZGJ1ZmYud3JpdGVVSW50MzJCRShmeGlkLCAwKVxuICAgICAgYnVmZi5wdXNoKGZ4aWRidWZmKVxuICAgICAgY29uc3QgaW5pdGlhbFN0YXRlID0gdGhpcy5meHNbYCR7ZnhpZH1gXS5zb3J0KE91dHB1dC5jb21wYXJhdG9yKCkpXG4gICAgICBjb25zdCBzdGF0ZWxlbjogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgICBzdGF0ZWxlbi53cml0ZVVJbnQzMkJFKGluaXRpYWxTdGF0ZS5sZW5ndGgsIDApXG4gICAgICBidWZmLnB1c2goc3RhdGVsZW4pXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgaW5pdGlhbFN0YXRlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dGlkOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNClcbiAgICAgICAgb3V0cHV0aWQud3JpdGVJbnQzMkJFKGluaXRpYWxTdGF0ZVtgJHtqfWBdLmdldE91dHB1dElEKCksIDApXG4gICAgICAgIGJ1ZmYucHVzaChvdXRwdXRpZClcbiAgICAgICAgYnVmZi5wdXNoKGluaXRpYWxTdGF0ZVtgJHtqfWBdLnRvQnVmZmVyKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmYpXG4gIH1cbn1cbiJdfQ==