UtxoPocket - Mi idea de wallet (WIP)

UtxoPocket es (será) una herramienta en desarrollo de gestión de UTXOs que corre en el navegador, diseñada para ofrecer a los usuarios de Bitcoin un control total sobre sus fondos, teniendo como objetivo la mejor experiencia de usuario posible.
"name": "utxo-pocket",
"version": "0.0.0",
Por el momento la estoy planteando solo para ordenador y no dispositivos móviles, aunque en una tables es posible que pueda visualizarse bien.
Puedes probar mi mierda en https://utxopocket.devsigner.xyz o echarle un vistazo al vídeo de aquí abajo.
Este proyecto surge de la necesidad de no perder la costumbre de programar, actualmente me dedico profesionalmente al diseño de producto digital, pero con 13 años a las espaldas de desarrollo frontend no quiero perder esos conocimientos.
Por otro lado me está sirviendo para aprender Typescript, ya que me había quedado anclado en Javascript. Además, esto me va a servir para familiarizarme con la parte más técnica de Bitcoin a la que nunca me he llegado a acercar, creo que es el momento.
{
  Vue: true,
  Pinia: true,
  Vuetify: true,
  NestJS: true,
  Typescript: true,
  bitcoin-core: "pending"
}
Otra de las motivaciones es tratar de construir un concepto de wallet tal y como lo visualizo mentalmente y buscando la mejor experiencia de usuario posible.
Tambien me gustaría que el propio wallet te ayudase a formarte sobre Bitcoin con una Wiki integrada y accesible en todo momento.
Vista de UtxoPocket con varios UTXOs seleccionados y algunos bloqueados.

Funcionalidades Actuales de UtxoPocket

Por el momento, la aplicación muestra datos mockeados. Aunque la intención que que como usuario puedas conectarte a tu nodo para obtener la información necesaria. Uno de los siguientes pasos es integrar testnet, por el momento no me atrevo a trastear este desarrollo en mainnet.
Visualiza y selecciona todos los utxos bloqueados
<v-tooltip :disabled="!tooltipsEnabled" text="Select all locked UTXOs" location="right">
  <template v-slot:activator="{ props }">
    <v-list-item v-bind="props" @click="store.selectAllLockedUtxos()">
      <v-list-item-title>
        Locked UTXOs: {{ formatSats(totalLockedValue * 100000000) }} sats
      </v-list-item-title>
      <v-list-item-subtitle>{{ totalLockedCount }} Locked</v-list-item-subtitle>
</v-list-item>
  </template>
</v-tooltip>
selectAllLockedUtxos() {
  this.deselectAllUtxos();
  this.utxos.forEach((utxo: UTXO) => {
    if (utxo.locked) {
      utxo.selected = true;
      this.selectedUtxos.push(utxo);
    }
  });
},
Gestión de UTXOs:
UtxoPocket permite seleccionar, bloquear y organizar UTXOs con facilidad, proporcionando herramientas avanzadas para la gestión de tus fondos. Los usuarios pueden seleccionar UTXOs individuales, bloquearlos para evitar su uso en futuras transacciones, y aplicar etiquetas personalizadas para un seguimiento preciso.
Interfaz Intuitiva (o eso espero conseguir):
Con una interfaz basada en Vue 3 y Vuetify, UtxoPocket ofrece una experiencia de usuario fluida y moderna. Los controles del wallet se adaptan dinámicamente según el estado de las funciones, con colores que indican claramente qué opciones están activadas.
Colecciones de UTXOs:
Crea colecciones y asignalas a tus utxos para agruparlos. Gracias a dicebear se genera un avatar para tu colección hasheando el nombre de la misma y el color elegido. TODO: quitar variable de color y generar con Date.now.
Visualización de información:
Visualiza un gráfico con la evolución del balance de tus utxos, así como el total de utxos y su valor, el total de utxos bloquedos y su valor o la cantidad seleccionada de utxos.
En el modo inspección, al hacer click sobre un utxo, puedes ver toda la información disponible sobre él.
Multi select feature disabled. Locked UTXOs selected
Puedes elegir activar el modo de multiselección podrás seleccionar varios utxos a la vez y desactivarlo para seleccionarlos de uno en uno.

Transacciones

Visualiza tus transacciones en la página de transacciones. He refactorizado todo el backend que partía de un modelo de datos de UTXOs erroneo. Ahora todo lo que se ve en el wallet parte de las transacciones, con un modelo lo más parico posible a la realidad. De esta manera todo debería de encajar bastante bien cuando el wallet obtenga la información de la blockchain.
Soporte para BIP329:
UtxoPocket está completamente alineada con el estándar BIP329, permitiendo la importación y exportación de etiquetas de UTXOs, garantizando la interoperabilidad con otras herramientas y wallets que cumplan con este estándar.
bip329Labels: (state) =>
  state.utxos
    .filter((utxo: UTXO) => utxo.tags && utxo.tags.length > 0)
    .map((utxo: UTXO) => ({
      type: 'addr',
      ref: utxo.address,
      origin: 'UtxoPocket',
      label:
        state.tagList.find((tag: Tag) => tag.id === utxo.tags?.[0])
          ?.description || '',
          spendable: utxo.spendable.toString(),
      })),

Próximas Mejoras

Wiki de Bitcoin y Mejores Prácticas:
Incluir una sección educativa dedicada a explicar cómo usar la herramienta, junto con artículos sobre Bitcoin, mejores prácticas de seguridad, y gestión de fondos.
Estadísticas avanzadas del wallet:
Visualizar estadísticas detalladas de su wallet, incluyendo gráficos de barras que mostrarán la distribución de UTXOs bloqueados y desbloqueados, análisis de la distribución temporal de UTXOs, estadísticas de las tasas pagadas en transacciones y todo lo que se me ocurra.
Sistema de Etiquetado Avanzado:
Etiquetado que cumple con la especificación de BIP-329 a través del gestor de etiquetas. Se pueden exportar e importar etiquetas que cumplan con la especificación.

Colecciones de UTXOs:

Despues de haber enseñado mi primera aproximación, me ha entrado algo de feedback muy valioso en cuanto a la gestión de etiquetado de utxos que estaba haciendo.
BIP-329 es una característica del protocolo de Bitcoin que permite etiquetar las salidas no gastadas según un formato estandar.
Especificacion de BIP-329 en GitHub:
Por mi parte, había implementado en UtxoPocket un sistema que cumplía con esta especificación, pero le había puesto mi propia capa. Necesitaba asociar un color en el etiquetado, pero la key "color" no forma parte de la especificación. Esto era un problema, porque el etiquetado BIP-329 debe de poder exportarse e importarse en otras wallets. Así que al exportar las etiquetas se generaban dos archivos diferentes: uno para la implementación estricta de la BIP-329 y otro con datos adicionales como el color.
Me han sugerido implementar el concepto de colecciones y es lo que he hecho. Ahora el sistema de etiquetado BIP-329 solo hace eso (single responsability).
Por otro lado, el concepto de colecciones me ha parecido genial. He creado una página Collection Manager donde el usuario puede crear nuevas colecciones. Cuando lo hace se presenta un diálogo para ponerle nombre a la colección y escoger un color (aun que en breve voy a quitar el color).
Ese nombre y el momento actual en milisegundos son hasheados para generar un avatar dinámico y único en cada instante, cortesía de una maravillosa librería llamada DiceBear, similar a otras como podría ser robohash.
DiceBear en GitHub:
Playground de DiceBear
Una vez creada la colección, puedes ir a la pantalla de wallet y seleccionar uno o varios UTXOs para asignarlo a una categoría. Una vez que lo haya hecho, se visualiza un tab para cada colección creada, donde podrán verse los utxos asignados, así como el avatar de la colección.
Finalmente, las etiquetas de BIP-329, se pueden asignar de manera similar. Cuando un UTXO tiene una etiqueta, se muestra un icono y un tooltip con el que podrás ver la etiqueta al pasar el ratón por encima.
Detección de Direcciones Reutilizadas:
UtxoPocket ayudará a los usuarios a identificar direcciones reutilizadas, promoviendo prácticas de privacidad más seguras.
Evaluación de salud del wallet:
Un sistema de puntuación de salud del wallet está en desarrollo. Este sistema utilizará una fórmula basada en múltiples variables para evaluar la seguridad y la eficiencia del uso del wallet, proporcionando recomendaciones personalizadas para mejorar la gestión de los UTXOs.

Últimos comentarios

La idea es ir actualizando este primer y chapucero artículo sobre mi desarrollo e ir integrando nuevas funcionalidades a mi ritmo.
Una vez que tenga una versión con la que me sienta satisfecho, la idea es abrir el proyecto para que sea FOSS.
A tope! 🔥

TODO

-Visualizar transacciones
-Mejorar concepto de colecciones y asignar color o robot a colección.
-Corregir asignación de label y en modo multiselección.
-Bar chart showing locked vs unlocked utxos.
-Utxos time distribution.
-Fees paid and fees distribution.
-CGenerate stats from collections.
-Reused addresses
-Wallet score: create scoring for wallet health.
-Wiki: How do I use UtxoPocket
-Wiki: About bitcoin and best practices.
-Review: Nunchuk + Envoy