compile function

Uint8List compile(
  1. List chunks
)

Implementation

Uint8List compile(List<dynamic> chunks) {
  final bufferSize = chunks.fold(0, (acc, chunk) {
    if (chunk is int) return (acc as int) + 1;
    if (chunk.length == 1 && asMinimalOP(chunk) != null) {
      return (acc as int) + 1;
    }
    return (acc as int) + pushData.encodingLength(chunk.length) + chunk.length;
  });
  var buffer = new Uint8List(bufferSize.toInt());

  var offset = 0;
  chunks.forEach((chunk) {
    // data chunk
    if (chunk is Uint8List) {
      // adhere to BIP62.3, minimal push policy
      final opcode = asMinimalOP(chunk);
      if (opcode != null) {
        buffer.buffer.asByteData().setUint8(offset, opcode);
        offset += 1;
        return null;
      }
      pushData.EncodedPushData? epd = pushData.encode(buffer, chunk.length, offset);
      offset += (epd?.size as int);
      buffer = (epd?.buffer ?? Uint8List.fromList([]));
      buffer.setRange(offset, offset + chunk.length, chunk);
      offset += chunk.length;
      // opcode
    } else {
      buffer.buffer.asByteData().setUint8(offset, chunk);
      offset += 1;
    }
  });

  if (offset != buffer.length) throw new ArgumentError("Could not decode chunks");
  return buffer;
}