splitU256ToU64Parts static method

List<BigInt> splitU256ToU64Parts(
  1. BigInt number, {
  2. Endian order = Endian.big,
})

Implementation

static List<BigInt> splitU256ToU64Parts(
  BigInt number, {
  Endian order = Endian.big,
}) {
  if (number.isNegative || number.bitLength > 256) {
    if (number.isNegative) {
      throw ArgumentException.invalidOperationArguments(
        "splitU256ToU64Parts",
        name: "number",
        reason: "Invalid unsigned integer.",
      );
    }
    throw ArgumentException.invalidOperationArguments(
      "splitU256ToU64Parts",
      name: "number",
      reason: "Number is to large.",
    );
  }

  final BigInt hiHi = (number >> 192).toUnsigned(64);
  final BigInt hiLo = (number >> 128).toUnsigned(64);
  final BigInt loHi = (number >> 64).toUnsigned(64);
  final BigInt loLo = number.toUnsigned(64);

  // Return order depends on Endian type
  if (order == Endian.little) {
    // Matches Rust/Substrate `[u64;4]` layout (little-endian)
    return [loLo, loHi, hiLo, hiHi];
  } else {
    // Big-endian (most significant first)
    return [hiHi, hiLo, loHi, loLo];
  }
}