## Descripción del proyecto Este proyecto consistió en el desarrollo de un ecosistema financiero basado en blockchain, para permitir la compra-venta de tokens fungibles a cambio de ethers. Se incluye un contrato ERC20 para ser utilizado como estándar a seguir por el token fungible. Por otro lado, se tiene el contrato Exchange encargado de gestionar los intercambios de valor entre tokens ERC-20 y ethers. A su vez, se desarrolló una interfaz gráfica que permite conectarse con nuestra Wallet de Metamask y llamar un método de Exchange, mostrando lo que ocurre. ## Componentes del proyecto ### Backend: - Contrato ERC-20: Token fungibles - Exchange ### Frontend: - Interfaz gráfica ### Video de demostración Link: ## Pasos para hacer el Setup del repositorio - Clonar el repositorio - Installar hardhat npm install hardhat --save-dev - Instalar dependencias npm install - Complete la información del archivo .env en el directorio raiz de la carpeta. Si no utilizará Ganache para sus pruebas quitelo de la configuración. - Configure el archivo hardhat.config.js según sus necesidades ## Pasos para hacer el Deploy del proyecto Para hacer el Deploy del proyecto, es necesario ejecutar el comando: npx hardhat run scripts/deploy.js El comando anterior deploya el contrato en la máquina virtual local. Para deployarlo en la red de prueba de Goerli, basta con agregar el comando --network goerli luego de la linea mencionada antes del deploy. Es decir, para deployarlo en la red de prueba de Goerli hay que utilizar el siguiente comando en consola: npx hardhat run scripts/deploy.js --network goerli Hay que tener en cuenta que esto solo va a funcionar correctamente si se tiene configurada la red correctamente en el archivo de hardhat.config. ## Pasos para hacer la ejecución de test en el proyecto Para este proyecto, se programaron algunas pruebas para corroborar las funcionalidades de los contratos inteligentes creados. La funcionalidad de estas puede que falle en algunos casos, ya que se nos dificultó la creación de los tests al enfocar el trabajo en clase en la programación de los contratos inteligentes. Para ejecutar las pruebas, es necesario utilizar el comando en consola: npx hardhat test ## Address de contratos deployados en testnet - Address del ERC20: - Address del Exchange: ## Como se construyó la solución Para poder hacer la solución se construyeron diferentes módulos. Para comenzar, empezamos construyendo el contrato del ERC20. Para hacer esto, se construyó la interfaz y luego la implementación del contrato, según lo que se había trabajado en clase. Luego de eso, hicimos algo parecido para la creación del contrato del Exchange: creamos la interfaz y luego instanciamos los métodos definidos en la interfaz. Para hacer esto último, tomamos las indicaciones de la especificación del contrato. ![Diagrama de contratos](https://user-images.githubusercontent.com/90796174/205141427-8287766e-a52e-426a-9f4b-795b923a15fb.jpg) Luego, esos contratos se deployaron. Manejamos tres cuentas: una para el owner del ERC20, otro para el owner del Exchange y una para el Token Vault. Primero, deployamos el contrato ERC20, y esperamos a que esto termine. Luego, se predice la dirección del contrato del exchange, a raiz de la dirección del contrato de la cuenta que maneja el exchange y el nonce. Luego, se transfieren los tokens al contrato del exchange, utilizando la dirección calculada anteriormente; esto es debido a que para comenzar el contrato de Exchange necesitamos tener tokens en el token vault. Luego de efectuar y aprobar esta transferencia con todos los elementos correspondientes, esperando por todas las transacciones realizadas, deployamos el contrato de Exchange, esperando nuevamente por esa transacción. Por último, se codificó una interfaz gráfica para utilizar el Exchange construido. Esto se detalla mas a continuación, en la sección de utilización de tecnologías. ## Utilización de tecnologías Para desarrollar este trabajo, no solo se usaron los conceptos aprendidos durante el semestre, si no que también se usaron conceptos aprendidos en otras materias. Para comenzar, utilizamos todas las tecnologías trabajadas en el curso. Fue importante que podamos entender el vocabulario y los conceptos teóricos necesarios para manejar un entorno de la blockchain, como las "wallets" y las "addresses". A su vez, para programar los contratos inteligentes, nos tuvimos que introducir al mundo de solidity, aprendiendo a programar en este lenguaje. Luego, tuvimos que entender como funciona el hecho de deployar un contrato, y aplicarlo a nuestra entrega. Para poder simular ese deploy, nos metimos en las redes de prueba de la blockchain, probando nuestros contratos en Goerli y Mumbai. Para poder hacer eso, tuvimos que manejar fluidamente faucets de estas redes y poder transferirlos a nuestras billeteras en Metamask. Luego, utilizamos otras tecnologías y formas de trabajar vistas en otras asignaturas. Se mantuvo el código lo más ordenado posible, utilizando estándares de Clean Code, e introduciéndonos a la forma de mantener limpio el código en Solidity. A su vez, se aplicaron principios de diseño para llevar a cabo nuestra solución. Principalmente, por el tamaño de la aplicación, utilizamos dos principios de diseño SOLID: principio de segregación de interfaces y principio de abierto y cerrado. El principio de segregación de interfaces fue usado al momento de poner las interfaces por separado de la instancia de los contratos, y hacer que la comunicación entre los contratos sea por medio de las interfaces. A su vez, el segundo principio mencionado se aplicó durante toda la solución. Se construyó todo teniendo en cuenta que era posible que en un futuro este proyecto puede ser expandido. Intentamos diseñar la solución para que sea lo mas abierta a la extensión posible, y lo mas cerrada a la modificación. Por último, para hacer la aplicación del "frontend", o sea, la interfaz con la que se comunica un usuario, se trabajó con html, css y javascript; utilizando css para darle estilo, html para conformar su estructura y js para darle funcionalidad. Para interactuar con las distintas vistas de la aplicación, jugamos con la visibilidad de los distintos divs que la conforman. Al usar la aplicacion, la misma pide que el usuario se conecte a su wallet mediante MetaMask. Al ingresar, nos muestra las opciones y el address de la cuenta conectada. ![](https://i.imgur.com/veYAqgQ.png) Siendo estas, opciones para usuarios y para dueño. ![](https://i.imgur.com/Q2QDjMj.png) Como usuario se puede comprar tanto ethers, como tokens. ![](https://i.imgur.com/gV9eh7G.png) Asi como calcular la cantidad de ethers necesarios para comprar la cantidad de tokens indicada, indicandole arriba la equivalencia del cambio. ![](https://i.imgur.com/36bRY2M.png) Como dueño se puede cambiar el address del Vault, depositar ethers y tokens, retirar las ganancias por las comisiones, modificar el porcentaje o comision por compra e ingresar como usuario. ![](https://i.imgur.com/UDSUgSv.png) ![](https://i.imgur.com/g0byssH.png) ## Uso de GitFlow Para el desarrollo de este trabajo, se utilizó GitHub, utilizando el equipo creado para en el GitHub Classroom. Para mantener el trabajo ordenado, usamos diferentes ramas, usando el estándar de gitflow ya utilizado en otras materias para nombrar las ramas y realizar los commits. Por ejemplo, para crear la rama del contrato exchange, se la nombró "feature/exchange".  Todos los integrantes del equipo forman parte del repositorio, y todos hicieron al menos un commit en el mismo. La cantidad de commits está desbalanceada, ya que en muchas instancias se trabajó en llamada, trabajando todos sobre un mismo código, y que sea la misma persona la que vaya haciendo commit a los cambios. ## Integrantes del equipo con nombres, número de estudiantes y address registradas Aramis Cicheski(228430) Benjamin Neri (253128) Bruno Facello (260694) Karen Hirschfeld (233805) Mateo Saravia (255917) Sofia Barreto (258216) Adress del Token Vault: Address del ERC20: Address del Exchange: