/** *** Copyright (c) 2016-2019, Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. *** Copyright (c) 2020-present, Jaguar0625, gimre, BloodyRookie. *** All rights reserved. *** *** This file is part of Catapult. *** *** Catapult is free software: you can redistribute it and/or modify *** it under the terms of the GNU Lesser General Public License as published by *** the Free Software Foundation, either version 3 of the License, or *** (at your option) any later version. *** *** Catapult is distributed in the hope that it will be useful, *** but WITHOUT ANY WARRANTY; without even the implied warranty of *** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *** GNU Lesser General Public License for more details. *** *** You should have received a copy of the GNU Lesser General Public License *** along with Catapult. If not, see . **/ import { BlockDurationDto } from './BlockDurationDto'; import { GeneratorUtils } from './GeneratorUtils'; import { MosaicFlagsDto } from './MosaicFlagsDto'; import { Serializer } from './Serializer'; /** * Binary layout for mosaic properties **/ export class MosaicPropertiesBuilder implements Serializer { /** Mosaic flags. **/ readonly flags: MosaicFlagsDto[]; /** Mosaic divisibility. **/ readonly divisibility: number; /** Mosaic duration. **/ readonly duration: BlockDurationDto; /** * Constructor. * * @param flags Mosaic flags. * @param divisibility Mosaic divisibility. * @param duration Mosaic duration. */ public constructor(flags: MosaicFlagsDto[], divisibility: number, duration: BlockDurationDto) { GeneratorUtils.notNull(flags, 'flags is null or undefined'); GeneratorUtils.notNull(divisibility, 'divisibility is null or undefined'); GeneratorUtils.notNull(duration, 'duration is null or undefined'); this.flags = flags; this.divisibility = divisibility; this.duration = duration; } /** * Load from binary array - Creates an object from payload. * * @param payload - Byte payload to use to serialize the object. */ public static loadFromBinary(payload: Uint8Array): MosaicPropertiesBuilder { const byteArray = Array.from(payload); const flags: MosaicFlagsDto[] = GeneratorUtils.toFlags(MosaicFlagsDto, GeneratorUtils.bufferToUint8(Uint8Array.from(byteArray))); byteArray.splice(0, 1); const divisibility: number = GeneratorUtils.bufferToUint8(Uint8Array.from(byteArray)); byteArray.splice(0, 1); const duration: BlockDurationDto = BlockDurationDto.loadFromBinary(Uint8Array.from(byteArray)); byteArray.splice(0, duration.getSize()); return new MosaicPropertiesBuilder(flags, divisibility, duration); } /** * Creates an instance of MosaicPropertiesBuilder. * * @param flags Mosaic flags. * @param divisibility Mosaic divisibility. * @param duration Mosaic duration. * @return Instance of MosaicPropertiesBuilder. */ public static createMosaicPropertiesBuilder( flags: MosaicFlagsDto[], divisibility: number, duration: BlockDurationDto, ): MosaicPropertiesBuilder { return new MosaicPropertiesBuilder(flags, divisibility, duration); } /** * Gets mosaic flags. * * @return Mosaic flags. */ public getFlags(): MosaicFlagsDto[] { return this.flags; } /** * Gets mosaic divisibility. * * @return Mosaic divisibility. */ public getDivisibility(): number { return this.divisibility; } /** * Gets mosaic duration. * * @return Mosaic duration. */ public getDuration(): BlockDurationDto { return this.duration; } /** * Gets the size of the object. * * @return Size in bytes. */ public getSize(): number { let size = 0; size += 1; // flags size += 1; // divisibility size += this.duration.getSize(); // duration return size; } /** * Serializes an object to bytes. * * @return Serialized bytes. */ public serialize(): Uint8Array { let newArray = Uint8Array.from([]); const flagsBytes = GeneratorUtils.uint8ToBuffer(GeneratorUtils.fromFlags(MosaicFlagsDto, this.flags)); newArray = GeneratorUtils.concatTypedArrays(newArray, flagsBytes); const divisibilityBytes = GeneratorUtils.uint8ToBuffer(this.getDivisibility()); newArray = GeneratorUtils.concatTypedArrays(newArray, divisibilityBytes); const durationBytes = this.duration.serialize(); newArray = GeneratorUtils.concatTypedArrays(newArray, durationBytes); return newArray; } }