# Polygon
## Project development
- Flow del contrato en un proyecto real

Desarrollo del proyecto:
- Crear un smart contract que cree un token en su contruccion y permite hacer transacciones desde una cuenta a otra con ese token:
- Recibe en su construccion el supply del asset y el nombre.
- La funcion de pago recibe el address hacia donde hacer el pago y el valor a pagar.
- El contrato debe tener una restriccion para que solo lo pueda ejecutar el dueño (Cuenta maestra).
- Debe hacer el pago de un token especificado dentro del contrato.
- Agregar validaciones como evitar que se pueda hacer pago hacia si mismo, bloquear un maximo de pago, etc.
- El proyecto sera desarrollado con el uso de Alchemy, hardhat, ethers.js, Metamask, y alchemy_faucet para fundar las cuentas, arquitectura:
- Alchemy (https://www.alchemy.com/): Nos otorga un api_token para acceder a su nodo y asi hacer uso de polygon a traves de la API de Alchemy.
- Harthat y ethers (https://hardhat.org/): Configuracion y conexion a polygon.
- Solidity: Lenguaje para los smart contracts.
- Metamask (https://metamask.io/): Administrador de wallets de ethereum que nos permite "autenticarnos" para realizar transacciones.
- Alchemy faucet (https://mumbaifaucet.com/?a=polygon-docs): Nos permite fundar las cuentas para testing.
- Polygon scan (https://mumbai.polygonscan.com/): Nos permite hacer seguimiento a las transacciones, contratos y cuentas.
- Standard ERC20: Como base para la creacion del token, se podria usar Openzepellin, revisar la posibilidad (https://docs.openzeppelin.com/contracts/4.x/)
- Creacion del proyecto en kommitters _(PONER LINK DEL REPO CUANDO SE CREE)_
## NOTES
- Hardhat:
- hardhat y ethers: configuracion y conexion a la red de polygon
- alchemy: otorga el api_key y la url de acceso para la configuracion, tambien nos permite revisar las transacciones
- solidity: lenguaje de los smart contracts
- metamask: administrador de wallets que nos otorga la key para "autenticarnos" o basicamente ponerle un source account a las transacciones
- https://mumbaifaucet.com/: nos permite fundar la cuenta
- Despues de hablar con Einer me comento una idea para el smart contract, el objetivo seria recompensar a un kommitter cuando un PR suyo sea aprobado y mezclado en un proyecto open source, el flujo del proyecto completo seria el siguiente:
- Un kommitter mezcla un PR aprobado en un proyecto open source en la organizacion de kommitters
- A traves de la API de github enviamos la informacion del kommitter a una funcion lambda en AWS
- En la funcion lambda usamos las funciones de un smart contract en polygon para recompensar al kommitter (Usando ethers y hardhat)
- Tener en cuenta Remix para la demostracion de la charla.
- Solidity no acepta numeros flotantes, asi que se debe poner el numero entero contando los decimales, teniendo en cuenta la cantidad de decimales que acepta un token, por ejemplo:
- El ETH acepta 18 decimales, asi que un (1) ETH seria representado como: 1000000000000000000, un uno con 18 ceros, entonces si creamos un token que se llame TKN que acepta 5 decimales, un TKN seria representado como: 100000, un uno con 5 ceros.
- Para evitar error de overflow usando numero s muy grandes teniendo en cuenta los decimales podemos usar: `ethers.utils.parseUnits("5", 16)`
- Las interfaces se usan para usar funciones de un contrato en otro
- Openzeppelin es una organizacion que reune smart contracts para ofrecerlos como templates para diferentes propositos de forma open source, asi que aqui tambien hay templates para la creacion de tokens:
- https://docs.openzeppelin.com/contracts/4.x/erc20
- Necesitamos investigar y documentar en el path de solidity que es Override, Pure, Virtual, etc. en las funciones.
- Investigar si se puede poner un numero de decimales diferente a 18 con el ERC20 de Openzeppelin.
Por hacer
- [x] Necesitamos investigar y documentar en el path de solidity que es Override, Pure, Virtual, etc. en las funciones y actualizar el path de solidity. Ademas agregar la documentacion de los events y la definicion.
- [x] Investigar si se puede poner un numero de decimales diferente a 18 con el ERC20 de Openzeppelin.
- [x] Probar que funcione la restriccion de owner con openzeppelin.
- [x] Funcionalidad (Smart contract): Una funcion que se use cuando un usuario de kommit salga de la empresa, regresar los tokens a la cuenta principal.
- [x] Funcionalidad (Hardhat): A partir de un input como el siguente, hacer un pago desde la cuenta dueña del contrato a la wallet del kommitter:
{
user: AndresRamirez
actions: OSS_participation | thanks_or_congrats | trainings
wallet: 0xjkhf98hf8ashfd
}
- [x] Investigar si se puede sobreescribir la variable decimals del standard o sobreescribir los decimales desde el contructor.
## Tareas por hacer (4 de enero de 2023)
-- Andres (Orden de prioridad)
- [x] Crear documentacion sobre los tokens en polygon
- Que es un token en polygon/ethereum
- Que es un standard
- Explicacion general sobre cada standard
- Que es openzeppelin
- Ejemplo con el ERC20 con Openzeppelin
- Como hacer exchange del token con matics (Si es muy complejo solo poner una descripcion pequeña y un link)
- [x] Revisar documentacion para el contenido de las redes sociales
- [-] Revisar el script de la presentacion de polygon por si hay algo que se pueda mejorar o quitar
- [x] Hacer script para sidechain y plasma
- [ ] Agregar diapositivas para la presentacion de polygon (PENDIENTE)
-- Cristhian
- [X] Revisar polygon y organizar la documentacion del tech review
- [x] Revisar documentacion para el contenido de las redes sociales
- [x] Revisar script de Andres para la presentacion de polygon
- [x] Crear script de lo mio para presentacion de polygon
- [X] Hacer script de bor y heimdall
- [ ] Crear diapositivas para la presentacion
## Funcionalidades y reglas del smart contract
- Los pagos solo los puede hacer la cuenta dueña del contrato
-
## Polygon presentation
## Introduccion (Andres)
Buenas tardes commites, espero que esten bastante bien. En esta presentacion mi compañero Cristhian y yo Andres les vamos a mostrar nuestro avance en la investigacion de Polygon, una blockchain con bastantes funcionalidades novedosas.
## Tabla de Contenido (Andres)
EStos son los temas que vamos a tratar en la presentacion espero que sean de su agrado
- Resources
- https://medium.com/coinmonks/polygon-vs-ethereum-where-you-should-launch-your-nft-project-bdcb70a3e67c
- https://www.youtube.com/watch?v=iM8AcSpIZGo&ab_channel=Alchemy
- https://www.youtube.com/watch?v=OaNcF_xo-3g&list=PLDllzmccetSM7qd9I163lcgbiy4rMuBXH&index=1
- https://docs.openzeppelin.com/contracts/4.x/erc20
- https://wiki.polygon.technology/docs/develop/hardhat/
- https://decrypt.co/es/resources/que-es-metamask-como-utilizar-la-mejor-y-mas-popular-wallet-de-ethereum
-
-- Index
- El problema con Ethereum
- ¿Que es polygon?
- ¿Que es la blockchain de polygon?
- ¿Que una side chain?
- ¿Que es un smart contract?
- Tools de deploy de smart contracts para polygon
- Remix
- Es un IDE online para escribir smart contracts, recomendado para empezar, pero existen otros tools que nos permiten crear un entorno de desarrollo mas complejo como hardhat.
- Alchemy
- Hardhat
- Mencionar truffle y replit
- Proceso de desarrollo para desplegar un smart contract en polygon
- ¿Que es alchemy y como funciona?
- Crear un app y mostrar las keys
- Mostrar el dashboard
- ¿Que es Metamask y como funciona?
- Crear una cuenta
- Agregar una network para polygon mumbai con el app creada para alchemy
- ¿Que es alchemy faucet?
- Fundar cuenta de Metamask
- ¿Que es polygon scan?
- Mostrar general que es y como funciona, mostrar alguna transaccion.
- Explicar el smart contract de recompensas
- Subir el contrato creando un token nuevo.
- Usar ese contrato en un script para hacer un pago a una cuenta X.
- Mostrar resultado en polygonscan.
## El problema con Ethereum (Cristhian)
Antes de hablar de Polygon, hablemos de Ethereum el cual es la blockchain sobre la cual funciona Polygon.
Ethereum trajo muchos avances al mundo del blockchain y de crypto, como los smart contracts o la implementacion de dApps como plataformas descentralizadas, aun asi de la misma manera ha tenido muchos problemas relacionados a su capacidad como blockchain.
Uno de ellos es la concurrencia de transacciones, ya que Ethereum solo puede soportar de 13 a 30 transacciones por segundo, y debido a la cantidad de personas que utlizan Ethereum esto es muy lento, otras blockchains por ejemplo, pueden realizar desde 1000 hasta 65000 transacciones por segundo.
Otro es el problema de los costos de transaccion ya que, debido a la baja concurrecia de tranascciones, se realiza un proceso parecido al de una subasta. Por ejemplo, si queremos que una transaccion se ejcute mas rapido tendriamos que pagar mas fee o gas, aun asi los costos son demasiado altos para una transaccion simple, por ejemplo, si quisieramos enviar un dolar a un amigo, tendriamos que pagar un fee de entre 7 hasta 20 dolares.
Y estos problemas afectan a todas las dApps en la network, sin excepciones.
- Pasar diapositiva -
## ¿Que es Polygon? (Andres)
Por lo mencionado anteriormente con Ethereum nacio Polygon para abordar todos los problemas mencionados anteriormente, tanto de rendimiento como de costos. Está es una plataforma de blockchain de escalado de capa-2, es decir, que es una blockchain que se aprovecha de otra, en este caso de Ethereum. Polygon además, utiliza sidechains lo que le permite realizar mas transacciones por segundo que Ethereum llegando hasta las 65000, sin comprometer la seguridad, ya que al final los bloques procesados se envian a la main net de Ethereum.
- Pasar diapositiva
Actualmente la plataforma alberga mas de 37000 dApps y muchas de estas aplicaciones que estaban en la red de Ethereum se han migrado a la red de Polygon, esto basicamente porque Polygon es totalmente compatible con la Maquina Virtual de Ethereum (Que es el literalmente el software sobre el que corre ethereum), asi que todo el codigo de una dApp que sea ejecutado en Ethereum se puede mover y ejecutarse en Polygon, obteniendo los beneficios de mejor concurrencia y costos de transaccion mas bajos sin perder la capa de seguridad de Ethereum.
- Pasar diapositiva -
## ¿Que es una sidechain y plasma? (Andres)
Las side chain basicamente son cadenas hijas creadas con un objetivo especifico, esto permite que se fragmenten las tareas, agilizando su desarrollo. Al final los resultado son compartidos a la cadena padre. Debido a esto, Polygon tiene mejor rendimiento que Ethereum, ya puede generar infinitias side chains.
- Pasar diapositiva -
Por otro lado, Polygon tambien cuenta con sus propios mecanismos de validacion, nodos y su token propio llamado Matic. Esto significa que puede implementar distintos protocolos de consenso al de la red original, permitiendo mas transacciones por segundo.
- Pasar diapositiva -
Un ejemplo de estos mecanismos es Plasma. Plasma fue diseñado para solucionar los problemas de escalibilidad de la red Ethereum, basado en sidechains en donde usando smart contracts y la estructura arboles de merkel se logran crear un numero ilimitado de child chains, que funcionan de manera personalizada y con objetivos propios, apoyando a la cadena principal (Ethereum) para evitar que se vea congestionada, alivianando la carga del trabajo y comunicandose unicamente para compartir la informacion de los bloques validados.
- Pasar diapositiva -
## Bor y Heimdall (Cristhian)
La arquitectura de Polygon esta basada principalmente en tres layers, uno es Bor, el otro es Heimdall, y finalmente el ultimo es Ethereum.
Bor es el layer de sidechain de Polygon encargado de producir los bloques. Bor basicamente es una implementacion basica de Geth, es decir, del codigo de ejecucion de ethereum, en un fork, con algunos cambios en el algoritmo de concenso.
- Para el que quiera revisar acerca de la implementacion del protocol de Ethereum le dejo el repo https://github.com/ethereum/go-ethereum
- Y para los que quieran revisar a profundidad la implementacion de Bor tambien le dejo el repo https://github.com/maticnetwork/bor
Heimdall es el layer de Polygon para la validacion de las transacciones a traves del uso de Proof of Stake, y que maneja la agregación de los bloques producidos por Bor a un arbol de Merkle y luego publica la raiz de Merkle periodicamente a la cadena principal (Ethereum).
- Pasar diapositiva -
Los árboles Merkle son una estructura de datos creada con el objetivo de facilitar la verificación de grandes cantidades de datos organizados relacionando los mismos por medio de diversas técnicas criptográficas y de manejo de información.
La publicacion periodica de snapshots de la sidechain de Bor se llaman checkpoints, y se hace de la siguiente manera:
1. Se validan todos los bloques desde el ultimo checkpoint
2. Se crea un arbol de merkle de los hashes de los bloques
3. Se publica el hash de la raiz del arbol a la mainnet de Ethereum
Entonces como mencionamos todos los bloques validados se conectan a traves de tecnicas cryptograficas, lo que nos da como resultado un hash, a partir de ese hash es que podemos decir que todos esos bloques estan correctos, por lo tanto es lo unico que se necesita almacenar en Ethereum, y de esta manera funciona la seguridad en Polygon.
Hasta aqui seria respecto a la arquitectura de Polygon, si quieren profundizar mas, les dejo un blog donde pueden encontrar mas detalles
- https://wiki.polygon.technology/docs/pos/polygon-architecture
- Pasar diapositiva -
## ¿Que es un smart contract? (Andres)
En kommit ya hemos hablado varias veces de que es un smart contract, pero con el fin de dar un repaso para los que ya lo han escuchado y explicarle a las personas que no, vamos a ver que es un smart contract, bueno este es como un contrato de la vida real, la diferencia es que lo smart contracts son completamente digitales e inmutables, que se almacena y ejecuta dentro de una blockchain. Lo que significa que esta descentralizado por lo que nadie tiene un control sobre el, ningun intermediario o ente regulatorio. Esto quiere decir que una ves subido el smart contract nadie puede modificarlo.
- Pasar diapositiva -
## Solidity (Cristhian)
- Definir que es Solidity
- Explicar breve que son los modificadores
- Explicar breve porque toca definir los decimales
- Nombrar que se puede hacer herencia multiple y dar un simil con Java
Es un lenguaje de programacion desarrollado para ethereum usado para la creacion de smart contracts, es un lenguaje de turing completo, lo que significa que no tiene limitaciones, como por ejemplo pact que no permite ciclos ni recursion. Es un lenguaje muy similar en estructura a Java, que es un lenguaje orientado a objetos, donde los contratos son basicamente como clases en Java. Asi para el que conozca java se le hara muy facil aprender Solidity.
Ahora vamos a explicar algunos conceptos resaltables de Solidity, necesarios para comprender los samrt contracts de este lenguaje.
- Pasar diapositiva -
-- Modificadores
Los modificadores son atributos especiales que se puede adicionar a las funciones, en estos atributos se definen requerimientos que permiten que la funcion se ejecute o no. Por ejemplo, que solo una cuenta especifica pueda ejecutar dicha funcion, o que solo se pueda hacer despues de determinada fecha, entre otros. Esto realmente es una caracteristica muy de un lenguaje para smart contracts, y es algo similar a como pact de Kadena tambien nos permite adicionar condiciones para que una funcion o un contrato se ejecuten.
- Pasar diapositiva -
-- Decimales
Debido a que en Solidity no maneja variables de punto flotante, es necesario definir la cantidad de digitos decimales que se usaran, ya que en un principio se recibira el numero completo y luego segun esta los decimales definido, se coloca el punto deciamal.
-- Herencia (Como en java)
En Solidity podemos usar la herramienta de la herencia entre contratos. Usando esto podemos reutilizar codigo heredando de contratos padre sus funciones definidas como publicas y externas. Un claro ejemplo es el comportamiento visto en java, donde podemos heredar metodos o atributos de clases padres.
Para aquel que este interesado en aprender mas del lenguaje puede revisar el path que hemos creado en la pagina de notion y tambien esta lista de reproduccion sobre solidity, que tiene muchos conceptos del lenguaje desde lo mas basico a temas mas complejos.
- https://www.notion.so/kommit/Solidity-e1ef3e75158547d08448544bab590d0a
- https://youtu.be/OaNcF_xo-3g?list=PLDllzmccetSM7qd9I163lcgbiy4rMuBXH
- Pasar diapositiva -
## Smart contracts deplying tools (Andres)
Existen diferentes herramientas que nos ayudan con la compilación, testing, despliegue y el debugging de los contratos en la red de Polygon.
Algunas de estas herramientas son:
### Remix
Remix es un IDE online enfocado en Ethereum, para el desarrollo y despliegue de smart contracts, nos permite probar los desarrollos en sus sandbox online.
### Alchemy
Alchemy es una plataforma que proporciona la infraestructura para web3. Permite escalar, crear, testear y monitorear aplicaciones descentralizadas.
### Hardhat
Hardhat es una herramienta que proporcona librerias para hacer deploy y usar las funciones de los contratos desde programas realizados en JavaScript
Existen otras herramientas como Truffle, Replit, entre otras. Pero las que hemos mencionado son las mas utilizadas y actualizadas.
- https://wiki.polygon.technology/docs/category/deploying-contracts
- Pasar diapositiva -
## Project definition (Andres)
Para esta prueba de concepto ligera de Polygon decidimos hacer un smart contract que permita la retribucion automatica de un token a loss kommiters que realicen distintos aportes en la empresa. Un comportamiento similar al que se tenia con los mitkoins.
Estos aportes se visualizaron como "Contribuciones Open Source", "Contribuciones de investigaciones", "Aportes en el canal de discord", entre otros. La idea es que segun la contribución, se realice un pago correspondiente al kommiter.
Tniendo esto en mente, en pantalla podemos ver en el diagrama que representa la aplicacion, donde tenemos un script en javascript que hace uso del smart contract en polygon, y asi se encargaria de hacer los pagos automaticos.
## Development Process (Cristhian)
### Crear una app en alchemy (colocar solo las ideas por que se esta presentando la pantalla) (ALquemy nos da un nodo de acceso a la blockchain)
- entrar en el link [Alchemy](https://dashboard.alchemy.com) y enviarlo a las personas
- iniciar session con la cuenta personal
- crear una app seleccionando mumbai
- mostrar la app (Dashboard de analiticas y llaves)
Ahora, vamos a crear una app en Alchemy que mas adelante vamos a conectar con nuestra billetera virtual, esta app nos permitira conectarnos a traves de una API a la network de Polygon. Para ello entramos al siguiente link [Alchemy](https://dashboard.alchemy.com) ahi vamos a crear una nueva cuenta ya sea con google o como se les sea mas comodo. Luego vamos a crear una app seleccionando Polygon como blockchain y mumbai como la red (Que es la red de testing de Polygon).
Despues de creado podemos ver que alchemy nos proporciona un dashboard de analiticas de la cantidad de request a nuestra app asi como las llaves para acceder e interactur con la red.
### What is Metamask?
Es una crypto wallet basada en ethereum que nos permite almacenar, comprar, enviar y cambiar crypto assets, por lo tanto nos permite autenticar contratos para ser desplegados en la red de polygon, ethereum, entre otras, e interactuar con aplicaciones descentralizadas.
#### Crear una cuenta (solo explicar que se deben crear una cuenta y enviar el link)
- Enviar el link https://metamask.io/download/
- Decirles de crear la cuenta y que guarden las palabras de seguridad
Para usar nuestra app de alchemy necesitamos crear una cuenta en metamask, para ello es necesario descargar la aplicación, ya sea la extension o la aplicación mobile desde https://metamask.io/download/, para quienes no tengan aun una cuenta solo deben ingresar a la aplicación o extension y seguir estos pasos:
- https://myterablock.medium.com/how-to-create-or-import-a-metamask-wallet-a551fc2f5a6b
#### Conectar la billetera de Metamask con la app de Alchemy
- Conectar la billetera desde el boton Alchemy
- Adicionar Fondos en la billetera con el boton Get test
- Definir alchemy faucet de forma resumida
Finalmente, ya configuramos tanto la app de alchemy como la billetera de metamask, ahora es necesario conectarlas. Configurar nuestra billetera para que se conecte a la red de Mumbai (recordemos que es la test net de Polygon). Para esto Alchemy nos proporcionan un boton que realiza este proceso de una forma bastante simple.
**mostrar el dashboard de Alchemy**
Si presionamos el boton Add to Wallet nos abrira el plugin de Metamask y nos pedira la confirmacion de la conexion. Con esto es suficiente, ya tenemos conectadas nuestras cuentas. Ahora es necesario adicionarle dinero usando el boton de "Get test matic", este nos redireccionara a la pagina de Alchemy Faucet. Solo necesitamos copiar la direccion de nuestra billetera, damos click en "Send me Matic" y listo.
Esta pagina nos provee Matics de prueba para subir nuestros contratos y hacer transacciones en la red de Mumbai, hay que tener en cuenta que solo nos otorga 0.5 Matics cada 24 horas.
## Rewards contract (Cristhian + Andres)
## Andres
**Mostrar un poco el codigo del token a pedal**
- definir que es un estandar
Para la creacion de tokens personalizados en ethereum se usan los smart contracts, y existen diferentes estandares que nos definen las funcionalidades basicas de un token, y nos recomienda seguir unas practicas para facilitar las interacciones de aplicaciones y contratos, como una funcion para transferir, obtener balances, definir el supply, mintear, quemar tokens, entre otros. Para la creación de nuestro token personalizado usamos el estandar ERC20, el cual es uno de los mas basicos para tokens fungibles.
- https://academy.binance.com/es/articles/an-introduction-to-erc-20-tokens?utm_source=googleadwords_int&utm_medium=cpc&ref=HDYAHEES&gclid=Cj0KCQiAnsqdBhCGARIsAAyjYjR1aK_TH9P-NUBDjds4X2Z_uIJUPT18SO1PiyQpRkJ4fCntx_8qnEYaAiDNEALw_wcB
- explicar que el token se hizo cumpliendo un estandar (mostrar la definicion de la interfaz)
Nuestra primera version fue crear un smart contract implementando manualmente las funciones e interfaces del estandar
- Definir que es openZeppeling e introducir el smart contrat estandar que proporcionan
-
Mas adelante en nuestra investigacion encontramos que existe una organizacion llamada OpenZeppeling que proporciona librerias de codigo abierto que sintetizan procesos comunes de smart contracts como lo es la creacion de tokens personalizados con la diferencia de que ellos se enfocan en testear la seguridad de sus desarrollos, de tal forma que minimicen los riesgos mientras se implementan los estandares de tokens. [Pagina](https://www.openzeppelin.com/contracts)
**Mostrar el codigo del token con la libreria **
- Mostrar nuestro codigo final importando el contrato de IERC20
- mostrar como se estan heredando los smart contracts de open zeppelin
- mostrar el mapping para el registro de usuarios y las funciones addAccess, removeAccess, e isAllowed
- mostrar funcion de refundEmployeeTokens que sirve para devolver los tokens a la cuenta principal si alguien se va de la empresa
## Cristhian
- Mostrar configuracion de hardhat y pasar documentacion de la configuracion (https://hardhat.org/hardhat-runner/docs/config)
- Explicar script de deploy para el contrato de rewards, compilar y desplegar (con el valor deseado de tokens)
- Mostrar token en la pagina de polygonscan despues de desplegar (https://mumbai.polygonscan.com)
- Agregar el token en metamask y mostrar dicho token
- Configurar id del contrato en las variables de entorno
- Explicar script para agregar un usuario a los usuario permitidos en el contrato
- Explicar script para enviar un pago al usuario que aun no se ha registrado (Va a fallar porque no se ha registrado)
- Desplegar script para agregar usuario al token
- Desplegar nuevamente script para hacer el pago (Ahora si va a funcionar)
- Mostrar balances de las cuentas, transaccion en polygonscan, holders del token en polygonscan, y registro de analiticas en el app de alchemy.