PSBT.parse constructor

PSBT.parse(
  1. String psbtBase64
)

Parse a PSBT from a base64 string.

Implementation

factory PSBT.parse(String psbtBase64) {
  int offset = 0;
  Uint8List psbtBytes = psbtToBytes(psbtBase64);
  offset += 5;

  Map<String, dynamic> psbtData = {"global": {}, "inputs": [], "outputs": []};

  // Global
  Map<String, String> globalMap = {};

  while (true) {
    int keyLen = Varints.read(psbtBytes, offset);

    offset += _getOffset(psbtBytes[offset]);
    if (keyLen == 0) {
      break;
    }

    Uint8List key = psbtBytes.sublist(offset, offset + keyLen);
    offset += keyLen;
    int valueLen = Varints.read(psbtBytes, offset);

    offset += _getOffset(psbtBytes[offset]);
    Uint8List value = psbtBytes.sublist(offset, offset + valueLen);

    offset += valueLen;
    globalMap[Converter.bytesToHex(key)] = Converter.bytesToHex(value);
  }
  psbtData["global"] = globalMap;
  // Inputs
  if (psbtData["global"]["00"] == null) {
    throw Exception('Invalid PSBT');
  }
  Transaction globalTx =
      Transaction.parsePsbtTransaction(psbtData["global"]["00"]);

  for (int i = 0; i < globalTx.inputs.length; i++) {
    Map<String, String> inputData = {};
    while (true) {
      int keyLen = Varints.read(psbtBytes, offset);
      offset += _getOffset(psbtBytes[offset]);
      if (keyLen == 0) {
        break;
      }
      Uint8List key = psbtBytes.sublist(offset, offset + keyLen);
      offset += keyLen;
      int valueLen = Varints.read(psbtBytes, offset);
      offset += _getOffset(psbtBytes[offset]);
      Uint8List value = psbtBytes.sublist(offset, offset + valueLen);
      offset += valueLen;
      inputData[Converter.bytesToHex(key)] = Converter.bytesToHex(value);
    }
    psbtData["inputs"].add(inputData);
  }

  // Outputs
  for (int i = 0; i < globalTx.outputs.length; i++) {
    Map<String, String> outputData = {};
    while (true) {
      int keyLen = Varints.read(psbtBytes, offset);
      offset += _getOffset(psbtBytes[offset]);
      if (keyLen == 0) {
        break;
      }
      Uint8List key = psbtBytes.sublist(offset, offset + keyLen);
      offset += keyLen;
      int valueLen = Varints.read(psbtBytes, offset);
      offset += _getOffset(psbtBytes[offset]);
      Uint8List value = psbtBytes.sublist(offset, offset + valueLen);
      offset += valueLen;
      outputData[Converter.bytesToHex(key)] = Converter.bytesToHex(value);
    }
    psbtData["outputs"].add(outputData);
  }

  return PSBT(psbtData);
}