updateTipPin method

Future<Account> updateTipPin({
  1. required String legacyPin,
  2. required String pinTokenBase64,
  3. required String sessionKeyBase64,
  4. required String tipPublicKeyHex,
})

Implementation

Future<Account> updateTipPin({
  required String legacyPin,
  required String pinTokenBase64,
  required String sessionKeyBase64,
  required String tipPublicKeyHex,
}) async {
  final iterator = DateTime.now().millisecondsSinceEpoch * 1000000;
  var encryptedLegacyPin = '';
  if (legacyPin.isNotEmpty) {
    encryptedLegacyPin = encryptPin(
      legacyPin,
      pinTokenBase64,
      sessionKeyBase64,
      iterator,
    );
  }
  final tipPublicKey = hex.decode(tipPublicKeyHex);
  if (tipPublicKey.length != 32) {
    throw ArgumentError(
        'Invalid tip public key size: ${tipPublicKey.length}');
  }
  const pinSuffix = [0, 0, 0, 0, 0, 0, 0, 1];
  final newEncryptedPin = encryptBytesPin(
    pinTokenBase64: pinTokenBase64,
    privateKeyBase64: sessionKeyBase64,
    target: Uint8List.fromList(tipPublicKey + pinSuffix),
    iterator: iterator + 1,
  );

  final data = await updatePin(PinRequest(
    pin: newEncryptedPin,
    oldPin: encryptedLegacyPin,
  ));
  return data.data;
}