|
1 | 1 | import 'dart:typed_data'; |
| 2 | +import 'package:coinlib/src/common/bytes.dart'; |
2 | 3 | import 'package:coinlib/src/common/hex.dart'; |
| 4 | +import 'package:coinlib/src/crypto/ec_public_key.dart'; |
3 | 5 | import 'package:coinlib/src/tx/locktime.dart'; |
| 6 | +import 'package:collection/collection.dart'; |
4 | 7 | import 'checks.dart'; |
5 | 8 |
|
6 | 9 | /// Thrown when attempting to read or write beyond the boundary of data |
@@ -96,6 +99,17 @@ class BytesReader extends _ReadWriteBase { |
96 | 99 |
|
97 | 100 | Locktime readLocktime() => Locktime(readUInt32()); |
98 | 101 |
|
| 102 | + Map<ECPublicKey, T> readXPubKeyMap<T>(T Function() readValue) |
| 103 | + => Map.fromEntries( |
| 104 | + Iterable.generate( |
| 105 | + readVarInt().toInt(), |
| 106 | + (_) => MapEntry( |
| 107 | + ECPublicKey.fromXOnly(readSlice(32)), |
| 108 | + readValue(), |
| 109 | + ), |
| 110 | + ), |
| 111 | + ); |
| 112 | + |
99 | 113 | } |
100 | 114 |
|
101 | 115 | /// Methods to handle the writing of data |
@@ -144,6 +158,24 @@ mixin Writer { |
144 | 158 |
|
145 | 159 | void writeLocktime(Locktime locktime) => writeUInt32(locktime.value); |
146 | 160 |
|
| 161 | + void writeOrderedXPubkeyMap<T>( |
| 162 | + Map<ECPublicKey, T> map, |
| 163 | + void Function(T) writeValue, |
| 164 | + ) { |
| 165 | + |
| 166 | + writeVarInt(BigInt.from(map.length)); |
| 167 | + |
| 168 | + final orderedEntries = map.entries |
| 169 | + .map((entry) => MapEntry(entry.key.x, entry.value)) |
| 170 | + .sortedByCompare((entry) => entry.key, compareBytes); |
| 171 | + |
| 172 | + for (final entry in orderedEntries) { |
| 173 | + writeSlice(entry.key); |
| 174 | + writeValue(entry.value); |
| 175 | + } |
| 176 | + |
| 177 | + } |
| 178 | + |
147 | 179 | } |
148 | 180 |
|
149 | 181 | /// Writes serialized data to a Uint8List. Throws an [OutOfData] exception if |
|
0 commit comments