---
# System prepended metadata

title: Mintacoin presentation

---

# Mintacoin presentation

## Presentation index

-- Index
- El contexto de Mintacoin
  - El proposito de Mintacoin
  - Que se aprendio con Mintacoin y que se gano (Hacer documentaciones, capacitacion de personas, se aprendio sobre stellar, se uso el stellarSDK en un proyecto interno, etc)
  - Como se realizó Mintacoin
- Arquitectura del proyecto
  - Hacer comentario hacerca de la primera version con event sourcing with Elixir con DDD y compartir las siguientes docs por chat
    - https://blog.nootch.net/post/event-sourcing-with-elixir/
    - https://github.com/commanded/commanded
  - Explicar la version final uso de jobs with Oban con DDD (Final) 
    - https://hexdocs.pm/oban/Oban.html
    - DDD: https://youtu.be/fx3BmpzitUg
- La implementacion con el stellar SDK
  - Create accounts
  - Create assets
  - Trust assets
  - Create payments
- Documentacion
  - Mencion de Gitbook https://app.gitbook.com/o/uIhWdAsazph5xhaAPggN/home
  - Documentación principal https://docs.mintacoin.co/
  - Landing https://mintacoin.co/
- La API
  - Mencionar deployment con fly.io y obtencion de los API KEYS
  - URL de la API https://sandbox.api.mintacoin.co/v1-alpha
  - Autenticación de la API (Uso del API KEY)
  - Uso de la API y endpoints (Mostrar resultados del proceso con el Stellar Expert)
    1. Crear dos cuentas.
    3. Crear un asset con la primera cuenta.
    4. Intentar un pago con la cuenta dueña del asset (Va a falla por la trustline de la segunda cuenta).
    5. Crear trustline con la segunda cuenta.
    6. Intentar pago nuevamente.
    7. Ver transacciones y resultados en el Stellar Expert.




-- Script
## Mintacoin's context (Cristhian)

Hoy les vamos a hablar sobre Mintacoin, esta charla es otra perteneciente a la serie de proyectos que se vienen trabajando desde el MET(Main Engineering Team), en esta oportunidad queremos compartir los resultados satisfactorios del primer proyecto ejecutado dentro del equipo que empezó en el mes de Agosto. Esta base fue parte fundamental de la ejecución actual de proyectos dentro del MET, continuamos mejorando nuestros procesos pero gracias al resultado obtenido por Mintacoin podemos confiar que los resultados que vamos a presentar serán de gran valor para los proyectos que construyen futuro dentro de la compañia.

- Pasar diapositiva -

**[Comentar el index de la presentacion]**

- Pasar diapositiva -


## What is Mintacoin? (David)

Muchos habran escuchado hablar de Mintacoin, habran visto el canal de discord o alguna notificación relacionada al proyecto, pero que es Mintacoin?, bueno Mintacoin en resumidas cuentas en una API para la gestion de cuentas y crypto activos en diversas redes de blockchain, que tiene como objetivo reducir el tiempo de adopcion de tecnologias web3.0 para los desarrolladores, y también reducir la complejidad tecnica que requiere aprender una blockchain nueva. 

Desde un principio se penso Mintacoin como una API desde la cual un usuario pudiera gestionar mas de una cuenta en diferentes blockchains desde un solo lugar con un solo par de llaves, como sabemos por lo general una cuenta de blockchain requiere una llave publica y una privada, asi que desde Mintacoin podriamos realizar transacciones solo con las llaves publica y privada de Mintacoin.

- Pasar diapositiva -


## Mintacoin's history (Cristhian)

Todo comenzo hace unos meses cuando kommit participo de un grant o evento para una tecnologia de blockchain relativamente nueva llamada Stellar, en donde se participo con dos proyectos, uno fue el Stellar SDK, me imagino que ya todos saben mas o menos que es el Stellar SDK.

Pero para quien no sepa que es, es una libreria que nos permite interactuar desde Elixir con la red de Stellar para crear y procesar transacciones:
  - https://github.com/kommitters/stellar_sdk

Y el otro proyecto con el que participo kommit fue Mintacoin, en su momento era mas bien una idea, mas que un proyecto bien formado, ya que solo se tenia planteada la base de la idea y en cuanto a codigo solo teniamos algunas estructuras y funciones que no permitian hacer nada relevante aun.

**[Preguntar a Juan H sobre el porque se eligio Stellar como base para la primera version de Mintacoin]**

En ese momento el MET estaba encargado de proveer mantenimiento y gestion a los proyectos que se tenian en Open Source. Es aqui donde una nueva versión de Mintacoin entra en juego, viendo un potencial para explorar nuevas tecnologias que construyen el futuro, y algo a destacar, la oportunidad de que los kommitters empiecen a dar el siguiente paso en su carrera profesional, liderando equipos y ejecutando proyectos desde su base. 

Dado esto la primera version de Mintacoin se descarto y el proyecto empezo desde cero nuevamente despues de haber redefinido la estructura y enfoque, siendo liderado por Cristhian Rodriguez, y posteriormente liderado por David Pinchao hasta que se completo el MVP.

- Pasar diapositiva -


## What we learnt? What we won? (David)

Con Mintacoin se aprendieron y ganaron muchas cosas a lo largo de su desarrollo y proceso dentro de kommit y del MET, como mencionamos Mintacoin fue la base para todos los proyectos que actualmente se estan desarrollando y seguiran dentro del MET, además del valor para el desarrollo del liderazgo profesional en los kommitters. En general aprendimos y ganamos lo siguiente:

- Aprendimos a construir un proyecto desde cero, definiendo arquitectura, outcomes, y construir la base del repo y el codigo.
- Aprendimos a hacer documentaciones profesionales para APIs.
- Aprendimos del poder de usar el Stellar SDK en un proyecto real.
- Realizamos nuestros primeros entrenamientos de liderazgo.
- Entrenamos desarrolladores en las bases de blockchain y crypto con Stellar.

**[Preguntar a Felipe y otro desarrollador de Mintacoin sobre su aprendizaje con el proyecto]**

- Pasar diapositiva -


## Architecture 

### (Cristhian)

Se tenia muy claro desde el principio que la API tendria que interactuar con sistemas externos por lo que ibamos a depender de los eventos presentes en la red de Stellar. Por lo tanto se penso en el uso de un patrón de diseño basado en eventos, y una estructura basada en Domain Driven Design.

- Pasar diapositiva -

Para Mintacoin se penso en tres implementaciones:

1. La primera fue el uso de Genservers y un evento NOTIFY/LISTEN de postgres, en donde postgres ejecutaba una notificacion cuando un registro era modificado o creado en la base de datos, y el Genserver se encargaba de escuchar y procesar ese evento.
 - https://blog.lelonek.me/listen-and-notify-postgresql-commands-in-elixir-187c49597851
2. La segunda fue el uso de una libreria de CQRS (Command Query Responsibility Segregation) para Elixir llamada Commanded, que fue descartada debido a que tuvimos problemas a la hora de manejar los errores en las ejecuciones de los eventos.
 - https://github.com/commanded/commanded
3. Y por ultimo, la tercera y la cual fue la implementacion final, fue el uso de oban para procesar los eventos, algo similar a lo que teniamos en la primera implementacion pero con el uso de una libreria relevante en el mundo de elixir y con un flujo facil de usar, testear, y confiable, además Oban nos permite auditar los eventos que se ejecuten.
 - Para quien no sepa que es Oban, es una libreria para el procesamiento de trabajos o jobs en segundo plano, que tiene una amplia variedad de formas para gestionar los trabajos y el flujo con que se ejecutan https://hexdocs.pm/oban/Oban.html
 - Tambien comentar que para varios kommitters que trabajaron en Mintacoin fue su primera ves usando un software como Oban, asi que esto tambien fue de ayuda para su desarrollo profesional.

- Pasar diapositiva -

### (David)

Deicidimos hacer uso de la arquitectura DDD (Domain Driven Design), la cual presentaba una planeación muy ligada entre expertos del negocio y developers. Donde construimos las bases del proyecto siguiendo estos pasos:
- Definir el contexto y los conceptos que Mintacoin maneja
- Delimitar el alcance de cada contexto en base a sus funciones
- Para construir el modelo relacional se llegaba a consensos dentro del equipo y se ajustaban los schemas dependiendo de la necesidad del negocio.
- Luego definimos nuestros main features y el workflow que deberia tener cada uno.
- Despues de definir las features definimos la autenticacion y acceso a la API basandonos en el foco de usuarios del negocio.
- Finalmente a partir de esto definimos los outcomes para el proyecto.

- Pasar diapositiva -


# La implementación con el stellar SDK (David)

El enfoque que se planteo desde un inicio para Mintacoin fue usar varias blockchains y asi un usuario pueda gestionar todos sus crypto activos desde un solo lugar con un solo par de llaves, es decir, existe un `Account` en Mintacoin para un usuario que puede tener una conexion a cada blockchain, esa conexion la llamamos `Wallet`, y para el MVP que se completo de la API de Mintacoin se hizo la primera implementacion con la blockchain de Stellar usando el Stellar SDK, asi que por el momento una cuenta solo podria tener un `Wallet` en Stellar.

Con el Stellar SDK se crearon 4 implementaciones principales para 4 operaciones basicas necesarias en la gestion completa de cuentas y assets en Mintacoin:

## Create accounts (Cristhian)

La primera implementacion fue la de creacion de cuentas, la implementacion mas basica y una de las fundamentales de la API. 

- Stellar tiene diversas operaciones, y existe una especifica para crear cuentas, como sabemos una cuenta es un par de llaves, pero esta realmente no existe en la blockchain hasta que es fundada con la operacion CreateAccount.

## Create assets (Cristhian)

La segunda implementacion fue la creacion de assets, que nos permite a traves del uso de las llaves de una cuenta crear un asset en una blockchain.

- La creacion de un asset es basicamente la creacion de un pago con un asset que aun no exista, y el valor de ese pago seria el supply del asset en la red.

## Assets trusting (Cristhian)

La tercera implementacion fue la creacion de una trustline o linea de confianza entre una cuenta y un asset, que le da la posibilidad a una cuenta de recibir un asset en especifico, ya que por defecto una cuenta no puede aceptar cualquier asset excepto el nativo, por ejemplo, cuando creamos la cuenta en lobstar para los mmitkoins tuvimos que agregar el asset y lobstar internamente nos creo la trustline de nuestra cuenta con el mmitkoin. Hay que tener en cuenta que para la creacion del asset hay que agregar a la transaccion la creacion de una trustline entre la cuenta que recibe el asset y el asset, ya que como este no existe aun, la cuenta claramente no tiene previamente una trusline.

## Create payments (Cristhian)

La cuarta y ultima implementacion fue la creacion de pagos, que hace uso de las tres implementaciones mencionadas anteriormente, y es el intercambio de assets entre dos cuentas.

- Para hacer un pago debemos tener en cuenta lo siguiente
> Debe asegurarse de que la cuenta de origen tiene los activos para el pago y que la cuenta de destino tiene una línea de confianza o trustline con el activo implicado.

- https://hackmd.io/G6Bq4lvNSzuF7XLOVYLRVA

- Pasar diapositiva -


# Results (David)

A partir del trabajo hecho para el MVP de Mintacoin se obtuvieron 3 resultados principales:

1. El primero es como tal el landing, en el cual tenemos una pequeña descripcion y un formulario que podemos ingresar para obtener acceso a la API.
2. El segundo es como tal la API sandbox en produccion de Mintacoin, cuya URL es esta **[URL en diapositiva]**, y si ingresamos al home de la URL nos redirecciona directamente a la documentacion.
3. Y el tercero es la documentacion de la API, cuya URL es esta **[URL en diapositiva]**, donde podemos encontrar documentacion de como autenticarnos a la API, y como usar los diferentes endpoints que nos ofrece **[Mostrar por encima el contenido de la documentacion]**.

- Pasar diapositiva -


# The API (Cristhian)

**[A partir de la seccion anterior continuar mostrando el funcionamiento de la API]**

2. Crear dos cuentas
3. Crear un asset con la primera cuenta.
4. Intentar un pago con la cuenta dueña del asset (Va a fallar por la trustline de la segunda cuenta).
5. Crear trustline con la segunda cuenta.
6. Intentar pago nuevamente.
7. Ver transacciones y resultados en los balances.