All files / src/redstone-payload RedstonePayload.ts

89.47% Statements 17/19
100% Branches 2/2
77.77% Functions 7/9
89.47% Lines 17/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 793x 3x 3x         3x   3x         3x   4x 4x   4x             4x                               4x               4x     4x       4x       4x   8x                       1x      
import { BytesLike, concat, isBytes, toUtf8Bytes } from "ethers/lib/utils";
import { Serializable } from "../common/Serializable";
import {
  DATA_PACKAGES_COUNT_BS,
  REDSTONE_MARKER_HEX,
  UNSIGNED_METADATA_BYTE_SIZE_BS,
} from "../common/redstone-constants";
import { convertIntegerNumberToBytes } from "../common/utils";
import { SignedDataPackage } from "../data-package/SignedDataPackage";
import {
  RedstonePayloadParser,
  RedstonePayloadParsingResult,
} from "./RedstonePayloadParser";
 
export class RedstonePayload extends Serializable {
  constructor(
    public readonly signedDataPackages: SignedDataPackage[],
    public readonly unsignedMetadata: BytesLike
  ) {
    super();
  }
 
  public static prepare(
    signedDataPackages: SignedDataPackage[],
    unsignedMetadata: BytesLike
  ): string {
    return new RedstonePayload(
      signedDataPackages,
      unsignedMetadata
    ).toBytesHexWithout0xPrefix();
  }
 
  toObj() {
    return {
      signedDataPackages: this.signedDataPackages.map((signedDataPackage) =>
        signedDataPackage.toObj()
      ),
      unsignedMetadata: this.unsignedMetadata,
    };
  }
 
  toBytes(): Uint8Array {
    return concat([
      this.serializeSignedDataPackages(),
      this.serializeUnsignedMetadata(),
      REDSTONE_MARKER_HEX,
    ]);
  }
 
  serializeUnsignedMetadata(): Uint8Array {
    const unsignedMetadataBytes = isBytes(this.unsignedMetadata)
      ? this.unsignedMetadata
      : toUtf8Bytes(this.unsignedMetadata);
    const unsignedMetadataByteSizeBytes = convertIntegerNumberToBytes(
      unsignedMetadataBytes.length,
      UNSIGNED_METADATA_BYTE_SIZE_BS
    );
    return concat([unsignedMetadataBytes, unsignedMetadataByteSizeBytes]);
  }
 
  serializeSignedDataPackages(): Uint8Array {
    return concat([
      ...this.signedDataPackages.map((signedDataPackage) =>
        signedDataPackage.toBytes()
      ),
      convertIntegerNumberToBytes(
        this.signedDataPackages.length,
        DATA_PACKAGES_COUNT_BS
      ),
    ]);
  }
 
  public static parse(
    bytesWithRedstonePayloadInTheEnd: Uint8Array
  ): RedstonePayloadParsingResult {
    return new RedstonePayloadParser(bytesWithRedstonePayloadInTheEnd).parse();
  }
}