serialize method

Buffer serialize()

Encodes this message into a buffer.

Implementation

Buffer serialize() {
  // Create a fixed-length writable buffer for signed data.
  final signaturesBuffer = BufferWriter(2048);

  // Write the version number.
  final int? version = this.version;
  if (version != null) {
    final int maskedVersion = versionPrefixFlag | version;
    signaturesBuffer.setUint8(maskedVersion);
  }

  /// Write the message header.
  signaturesBuffer.setUint8(header.numRequiredSignatures);
  signaturesBuffer.setUint8(header.numReadonlySignedAccounts);
  signaturesBuffer.setUint8(header.numReadonlyUnsignedAccounts);

  // Write the encoded account keys length.
  final int keysLength = accountKeys.length;
  signaturesBuffer.setBuffer(shortvec.encodeLength(keysLength));

  /// Write the account addresses.
  for (final accountKey in accountKeys) {
    signaturesBuffer.setBuffer(accountKey.toBytes());
  }

  /// Write the 32-byte SHA-256 hash.
  final Blockhash blockhash = recentBlockhash;
  // ignore: unnecessary_null_comparison
  check(blockhash != null, 'Message requires a recentBlockhash.');
  signaturesBuffer.setBuffer(base58.decode(blockhash));

  // Create a fixed-length writable buffer with the maximum packet size.
  final instructionsBuffer = BufferWriter(packetDataSize);

  // Write the encoded instructions length.
  final List<int> ixsEncodedLength =
      shortvec.encodeLength(instructions.length);
  instructionsBuffer.setBuffer(ixsEncodedLength);

  // Write the message instructions.
  for (final MessageInstruction instruction in instructions) {
    // Program ID index.
    final int programIdIndex = instruction.programIdIndex;
    instructionsBuffer.setUint8(programIdIndex);

    // Compact array of account address indexes.
    final List<int> keyIndicesCount =
        shortvec.encodeLength(instruction.accounts.length);
    instructionsBuffer.setBuffer(keyIndicesCount);
    final Iterable<int> keyIndices = instruction.accounts;
    instructionsBuffer.setBuffer(keyIndices);

    // Compact array of opaque 8-bit data.
    final Uint8List data = base58.decode(instruction.data);
    final List<int> dataLength = shortvec.encodeLength(data.length);
    instructionsBuffer.setBuffer(dataLength);
    instructionsBuffer.setBuffer(data);
  }

  // Create a fixed-length writable buffer with the maximum packet size.
  final addressTableLookupsBuffer = BufferWriter(packetDataSize);
  if (version != null) {
    // Write the encoded table lookups length.
    final List<int> addressTableLookupsLength =
        shortvec.encodeLength(addressTableLookups.length);
    addressTableLookupsBuffer.setBuffer(addressTableLookupsLength);

    for (final MessageAddressTableLookup addressTableLookup
        in addressTableLookups) {
      // Compact array of the writable indexes length.
      final List<int> writableIndexes = addressTableLookup.writableIndexes;
      final List<int> writableIndexesCount =
          shortvec.encodeLength(writableIndexes.length);

      // Compact array of the readonly indexes length.
      final List<int> readonlyIndexes = addressTableLookup.readonlyIndexes;
      final List<int> readonlyIndexesCount =
          shortvec.encodeLength(readonlyIndexes.length);

      addressTableLookupsBuffer
          .setBuffer(addressTableLookup.accountKey.toBytes());
      addressTableLookupsBuffer.setBuffer(writableIndexesCount);
      addressTableLookupsBuffer.setBuffer(writableIndexes);
      addressTableLookupsBuffer.setBuffer(readonlyIndexesCount);
      addressTableLookupsBuffer.setBuffer(readonlyIndexes);
    }
  }

  /// Resize and merge the buffers.
  return signaturesBuffer.toBuffer(slice: true) +
      instructionsBuffer.toBuffer(slice: true) +
      addressTableLookupsBuffer.toBuffer(slice: true);
}