CashToken.deserialize constructor

CashToken.deserialize(
  1. Uint8List bytes
)

Implementation

factory CashToken.deserialize(Uint8List bytes) {
  var offset = 0;
  if (bytes[offset] != 0xef) {
    throw FormatException('Missing CashToken prefix byte 0xEF');
  }
  offset++;

  final categoryId = bytes.sublist(offset, offset + 32);
  offset += 32;

  final bitfield = bytes[offset++];
  final hasNft = (bitfield & 0x20) != 0;
  final hasAmount = (bitfield & 0x10) != 0;
  final cap = hasNft
      ? CashTokenCapability.fromFlag(bitfield & 0x0f)
      : CashTokenCapability.none;

  Uint8List? commitment;
  if (hasNft) {
    final len = bytes[offset++];
    if (len > 0) {
      commitment = bytes.sublist(offset, offset + len);
      offset += len;
    }
  }

  var amount = BigInt.zero;
  if (hasAmount) {
    final first = bytes[offset++];
    if (first < 0xfd) {
      amount = BigInt.from(first);
    } else if (first == 0xfd) {
      amount = BigInt.from(bytes[offset] | (bytes[offset + 1] << 8));
      offset += 2;
    } else if (first == 0xfe) {
      amount = BigInt.from(bytes[offset] |
          (bytes[offset + 1] << 8) |
          (bytes[offset + 2] << 16) |
          (bytes[offset + 3] << 24));
      offset += 4;
    }
  }

  return CashToken(
    categoryId: categoryId,
    capability: cap,
    commitment: commitment,
    amount: amount,
  );
}