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;
  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);
}