@c4tplatform/caminojs
Version:
Camino Platform JS Library
116 lines • 15.1 kB
JavaScript
;
/**
* @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==