docs: public Protos.Wallet walletToProto(Wallet wallet) {
          Protos.Wallet.Builder walletBuilder = Protos.Wallet.newBuilder();
          walletBuilder.setNetworkIdentifier(wallet.getNetworkParameters().getId());
          if (wallet.getDescription() != null) {
              walletBuilder.setDescription(wallet.getDescription());
          }
  
          for (WalletTransaction wtx : wallet.getWalletTransactions()) {
              Protos.Transaction txProto = makeTxProto(wtx);
              walletBuilder.addTransaction(txProto);
          }
  
          walletBuilder.addAllKey(wallet.serializeKeyChainGroupToProtobuf());
  
          for (Script script : wallet.getWatchedScripts()) {
              Protos.Script protoScript =
                      Protos.Script.newBuilder()
                              .setProgram(ByteString.copyFrom(script.getProgram()))
                              .setCreationTimestamp(script.getCreationTimeSeconds() * 1000)
                              .build();
  
              walletBuilder.addWatchedScript(protoScript);
          }
  
          // Populate the lastSeenBlockHash field.
          Sha256Hash lastSeenBlockHash = wallet.getLastBlockSeenHash();
          if (lastSeenBlockHash != null) {
              walletBuilder.setLastSeenBlockHash(hashToByteString(lastSeenBlockHash));
              walletBuilder.setLastSeenBlockHeight(wallet.getLastBlockSeenHeight());
          }
          if (wallet.getLastBlockSeenTimeSecs() > 0)
              walletBuilder.setLastSeenBlockTimeSecs(wallet.getLastBlockSeenTimeSecs());
  
          // Populate the scrypt parameters.
          KeyCrypter keyCrypter = wallet.getKeyCrypter();
          if (keyCrypter == null) {
              // The wallet is unencrypted.
              walletBuilder.setEncryptionType(EncryptionType.UNENCRYPTED);
          } else {
              // The wallet is encrypted.
              walletBuilder.setEncryptionType(keyCrypter.getUnderstoodEncryptionType());
              if (keyCrypter instanceof KeyCrypterScrypt) {
                  KeyCrypterScrypt keyCrypterScrypt = (KeyCrypterScrypt) keyCrypter;
                  walletBuilder.setEncryptionParameters(keyCrypterScrypt.getScryptParameters());
              } else {
                  // Some other form of encryption has been specified that we do not know how to persist.
                  throw new RuntimeException("The wallet has encryption of type '" + keyCrypter.getUnderstoodEncryptionType() + "' but this WalletProtobufSerializer does not know how to persist this.");
              }
          }
  
          if (wallet.getKeyRotationTime() != null) {
              long timeSecs = wallet.getKeyRotationTime().getTime() / 1000;
              walletBuilder.setKeyRotationTime(timeSecs);
          }
  
          populateExtensions(wallet, walletBuilder);
  
          for (Map.Entry<String, ByteString> entry : wallet.getTags().entrySet()) {
              Protos.Tag.Builder tag = Protos.Tag.newBuilder().setTag(entry.getKey()).setData(entry.getValue());
              walletBuilder.addTags(tag);
          }
  
          // Populate the wallet version.
          walletBuilder.setVersion(wallet.getVersion());
  
          return walletBuilder.build();
      }