El documento presenta una sofisticada arquitectura para un ecosistema financiero descentralizado, EmpowerAction. Se centra en la dinámica de un mercado de empleos descentralizado, intercambiando a traves activos criptográficos y los mecanismos de crédito.
Conceptos clave:
Equilibrio del mercado: La fijación de precios oferta-demanda se regula estrictamente mediante mecanismos algorítmicos, garantizando la estabilidad del mercado.
Asignación dinámica de reservas: La colateralización para la emisión de créditos emplea el posicionamiento de activos en tiempo real, optimizando así la cantidad de garantía requerida.
Colateralización Stablecoin: Para la emisión de Tokens EMP y DUS (ERC20), la plataforma acepta stablecoins como activo mitigador del riesgo.
Oráculos de precios: Los oráculos basados en Chainlink suministran valoraciones de activos en tiempo real y datos de volatilidad del mercado para facilitar operaciones de intercambio precisas.
Liquidación de creditos: Al vencimiento del contrato, el contrato inteligente de emisión de crédito se liquida en fiat, lo que permite la quema de tokens por parte de los titulares.
Gestión de impagos: En escenarios con restricciones de liquidez, el emisor registra una transacción de préstamo contra la parte morosa, marcando un devengo de interés nominal hasta la resolución.
Fichas de crédito: Los tokens DUS actúan como garantía en ausencia de una garantía stablecoin adecuada, manteniendo una paridad de valor 1:1 con las stablecoins. Se emiten para preservar la continuidad operativa durante las crisis de liquidez.
Canje y retirada: Los titulares de tokens de crédito pueden canjear o quemar tokens por stablecoins cuando estén disponibles; de lo contrario, se producen colas FIFO de solicitudes de retirada, con intereses devengados que compensan los retrasos.
La carpeta deployment
contiene contratos esenciales para el despliegue y la gestión de los contratos inteligentes de la dApp. A continuación, se describen los archivos clave:
Este contrato permite la actualización de contratos. Actúa como un proxy que redirige llamadas a una dirección lógica donde reside la implementación real del contrato.
- Redirección de llamadas a contratos implementados.
- Gestión de estados.
Este contrato gestiona otros contratos en el ecosistema. Funciona como una capa intermedia que facilita la interacción entre diferentes contratos.
- Inicialización y gestión de contratos.
- Funciones auxiliares para la interacción entre contratos.
Este contrato es responsable del despliegue de otros contratos en la cadena de bloques. Facilita la automatización del proceso de despliegue.
- Despliegue de contratos inteligentes.
- Configuración inicial durante el despliegue.
La carpeta feeds
contiene contratos relacionados con la alimentación de datos externos en la dApp. Actualmente, se utiliza Chainlink para esta función.
Este contrato implementa la interfaz de UnderlyingFeed y utiliza el oráculo de Chainlink para obtener datos en tiempo real.
- Integración con la interfaz AggregatorV3 de Chainlink.
- Utilización de distintas librerías para operaciones matemáticas y de tipo seguro.
- Obtención de datos en tiempo real para la dApp.
La carpeta finance
contiene contratos relacionados con las funciones financieras de la dApp, como la gestión de créditos, tokens canjeables e intercambios financieros.
Estos contratos gestionan la provisión y el seguimiento de créditos dentro de la dApp.
// Ejemplo de uso
CreditProvider.issueCredit(to, amount);
Estos contratos permiten la creación y el intercambio de acciónes.
// Ejemplo de uso
OptionsExchange.createOption(strikePrice, expiry);
Contrato para tokens que pueden ser canjeados por activos subyacentes.
// Ejemplo de uso
RedeemableToken.redeem(amount);
Almacena los activos subyacentes para los tokens canjeables y creditos.
// Ejemplo de uso
UnderlyingVault.deposit(amount);
La carpeta governance
contiene contratos que gestionan la gobernanza de la dApp, incluyendo la creación y gestión de propuestas y ajustes del protocolo.
Contrato del token de gobernanza utilizado para votar en propuestas.
// Ejemplo de uso
GovToken.mint(to, amount);
Contratos para la creación y gestión de propuestas en el sistema de gobernanza.
// Ejemplo de uso
ProposalsManager.createProposal(subject, details);
Contrato que envuelve propuestas para la ejecución de acciones específicas.
// Ejemplo de uso
ProposalWrapper.execute();
Contrato para ajustar parámetros del protocolo y la dApp.
// Ejemplo de uso
ProtocolSettings.setSetting(key, value);
La carpeta interfaces
contiene definiciones de interfaces que son implementadas por otros contratos en la dApp. Estas interfaces establecen los métodos obligatorios que los contratos deben implementar.
Interfaz para el oráculo de precios Chainlink.
// Ejemplo de uso
AggregatorV3Interface.latestRoundData();
Interfaces para la implementación de tokens ERC20, con detalles adicionales y permisos.
// Ejemplo de uso
IERC20.transfer(to, amount);
Interfaz para la gestión de pools de liquidez.
// Ejemplo de uso
ILiquidityPool.addLiquidity(amount);
Interfaz para interactuar con el router de Uniswap V2.
// Ejemplo de uso
IUniswapV2Router01.swapExactTokensForTokens(amountIn, amountOut, path, to);
Interfaces para proveer tiempo y datos subyacentes, respectivamente.
// Ejemplo de uso
TimeProvider.getBlockTime();
UnderlyingFeed.getPrice();
La carpeta utils
contiene contratos de utilidad que ofrecen funciones comunes y reutilizables. Estas funciones auxilian en tareas como operaciones matemáticas seguras, manipulación de direcciones y manejo de tokens ERC20, entre otras.
Proporciona utilidades para la manipulación y verificación de direcciones Ethereum.
// Ejemplo de uso
require(Address.isContract(someAddress), "Given address is not a contract");
Ofrece métodos para la manipulación de arrays en Solidity.
// Ejemplo de uso
Arrays.removeAtIndex(someArray, index);
Permite acceder al tiempo de bloque de Ethereum dentro de los contratos.
// Ejemplo de uso
uint256 currentBlockTime = BlockTimeProvider.getBlockTime();
Implementaciones de la interfaz ERC20 y métodos seguros para interactuar con tokens ERC20.
// Ejemplo de uso
IERC20(someToken).safeTransfer(recipient, amount);
Estos contratos proporcionan funciones para realizar operaciones matemáticas seguras, conversiones de tipo y operaciones aritméticas con signo.
// Ejemplo de uso
uint256 result = SafeMath.add(a, b);
Esta subcarpeta contiene pruebas unitarias y de integración para los contratos que representan a los diferentes actores en la plataforma, ubicada en la subcarpeta common/actors
del repositorio.
Pruebas para validar las funcionalidades asociadas con los titulares de acciones.
// Ejemplo de uso
ShareHolder.testShareHolding();
Pruebas para validar las funcionalidades asociadas con los comerciantes del pool de liquidez.
// Ejemplo de uso
PoolTrader.testPoolTrading();
Pruebas para validar las funcionalidades asociadas con los comerciantes de opciones.
// Ejemplo de uso
OptionsTrader.testOptionsTrading();
Pruebas para validar las funcionalidades asociadas con los titulares de crédito.
// Ejemplo de uso
CreditHolder.testCreditHolding();
Esta subcarpeta está ubicada dentro de common/mock
y contiene contratos simulados que imitan el comportamiento de ciertos contratos y servicios externos para fines de prueba.
Mock del router de Uniswap V2 para simular operaciones de swap y liquidez.
// Ejemplo de uso
UniswapV2RouterMock.swapExactTokensForTokens(...);
Mock del proveedor de tiempo para simular diferentes marcas de tiempo en las pruebas.
// Ejemplo de uso
TimeProviderMock.setBlockTime(...);
Mock del contrato administrado para probar su inicialización y gestión.
// Ejemplo de uso
ManagedContractMock.init(...);
Mock para simular una fuente de datos de precio de Ether.
// Ejemplo de uso
EthFeedMock.setPrice(...);
Mock del contrato ERC20 para simular operaciones de tokens.
// Ejemplo de uso
ERC20Mock.mint(...);
Mock de la interfaz AggregatorV3 para simular feeds de datos.
// Ejemplo de uso
AggregatorV3Mock.setLatestPrice(...);
Esta subcarpeta contiene pruebas unitarias y de integración para los contratos relacionados con el token de crédito en la subcarpeta finance/creditToken
del repositorio.
Archivo base que contiene utilidades comunes para las pruebas.
Pruebas para validar la acumulación de intereses en el token de crédito.
// Ejemplo de uso
TestCreditTokenInterest.testAccumulateInterest();
Pruebas para validar la emisión correcta de tokens de crédito.
// Ejemplo de uso
TestCreditTokenIssuance.testIssueToken();
Pruebas para validar la retirada de tokens de crédito.
// Ejemplo de uso
TestCreditTokenWithdraw.testWithdrawToken();
Esta subcarpeta contiene pruebas unitarias y de integración para los contratos relacionados con el intercambio de talentos en la subcarpeta finance/TalentsExchange
del repositorio.
Archivo base que contiene utilidades comunes para las pruebas.
Pruebas para validar el valor intrínseco de las acciones en el intercambio.
// Ejemplo de uso
TestActionIntrinsicValue.testIntrinsicValue();
Pruebas para validar la funcionalidad de trading de acciones.
// Ejemplo de uso
TestActionTrading.testTrading();
Pruebas para validar las opciones cubiertas en el intercambio.
// Ejemplo de uso
TestCoveredOption.testCoveredOption();
Pruebas para validar los depósitos en el intercambio.
// Ejemplo de uso
TestExchangeDeposit.testDeposit();
Pruebas para validar el cálculo del pago esperado en el intercambio.
// Ejemplo de uso
TestExpectedPayout.testExpectedPayout();
Pruebas para validar la escritura de acciones en el intercambio.
// Ejemplo de uso
TestWriteAction.testWriteAction();
Esta subcarpeta contiene pruebas unitarias y de integración para los contratos de utilidad en la subcarpeta contracts/utils
del repositorio.
Pruebas para validar las operaciones matemáticas más complejas proporcionadas por el contrato MoreMath
.
// Ejemplo de uso
TestMoreMath.testComplexOperation();
SPDX-License-Identifier: LGPL-3.0
EmpowerAction - Copyright (C) 2023 Santiago Canepa | Sebastian Leandro | Victoria Quiroga This project is licensed under the GNU Lesser General Public License, Version 3 (LGPL-3.0). See the file LICENSE.md for more details.