compile function
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;
}