
Fuente: Gryphsis Academy
Este informe de investigación proporciona una interpretación detallada del principio de trabajo, la composición del proyecto, el análisis del código fuente y otras partes del protocolo UNISWAPV2.工作原理主要是涉及自动做市商( AMM ),本篇研报会描述流动性池的创建和管理过程,以及如何通过提供流动性赚取手续费;在项目构成方面,我们主要概述 UniswapV2 的架构,包括主要合约(如工厂合约、交换合约)及其功能;在源码分析部分我们分析 UniswapV2 的智能合约源码,解释关键函数和数据结构的设计理念。
1. Introducción al acuerdo
UNISWAPV2 es un protocolo de transacción descentralizado basado en la cadena de bloques Ethereum, lo que permite a los usuarios intercambiar criptomonedas sin confiar en intermediarios.与传统的中心化交易所不同,UniswapV2 采用了自动做市商( AMM )模型,通过智能合约来管理交易和流动性池,从而实现完全的去中心化。
El núcleo de uniswapv2 es su fórmula de producto constante (x * y = k),enincógnitayYRepresenta el número de dos activos diferentes en el grupo de liquidez respectivamente.kes una constante.Esta fórmula asegura que después de cada transacción, la proporción de activos en el grupo se reequilibre, lo que proporciona liquidez a los usuarios.Este diseño hace que el proceso de negociación sea transparente y justo, y los usuarios pueden agregar o eliminar la liquidez en cualquier momento y obtener ganancias a través de tarifas de transacción.
El protocolo UNISWAPV2 consta de múltiples contratos inteligentes, el más importante de los cuales son contratos de fábrica y contratos de intercambio.Los contratos de fábrica son responsables de crear y administrar grupos de liquidez, mientras que cada contrato de cambio corresponde a un par de negociación específico (por ejemplo, ETH/DAI).
Además, UNISWAPV2 también introdujo los contratos de enrutadores y las funciones de la biblioteca para mejorar la eficiencia y la seguridad de las transacciones.En comparación con su predecesor, UNISWAPV1, UNISWAPV2 trae varias mejoras importantes.Primero, la función Lightning Exchange permite a los usuarios pedir prestados activos en una sola transacción y devolverlos antes de que termine la transacción.El segundo es el Oracle de precios, que proporciona datos de precios más confiables al acumular el promedio de tiempo ponderado en el tiempo (TWAP).
Además, UNISWAPV2 admite transacciones directas de cualquier token ERC-20 sin la necesidad de usar Ethereum como intermediario.El éxito de UNISWAPV2 se encuentra no solo en su innovación tecnológica, sino también en su modelo de desarrollo abierto y impulsado por la comunidad.El protocolo UNISWAP es gratuito y se expande en cualquier persona, lo que aporta posibilidades ilimitadas al ecosistema de finanzas descentralizadas (DEFI).Muchos otros proyectos Defi, como las plataformas de préstamo y los protocolos de stablecoin, se basan en UNISWAP para formar un ecosistema próspero.
总的来说,UniswapV2 通过其创新的协议设计和去中心化的运营模式,彻底改变了加密货币交易的方式,成为 DeFi 领域的重要基石。随着技术的不断发展和社区的持续创新,UniswapV2 的影响力将进一步扩大,为全球用户带来更多的金融自由和机会。
2. Características del protocolo
2.1 pares ERC-20
UNISWAPV1 usará Ethereum (ETH) como la moneda de transición, es decir, si el usuario quiere intercambiar tokena y tokenb, necesita usar Tokena para intercambiar ETH primero, y luego usar ETH para intercambiar tokenB. Liquidez, ejerce una gran presión de costo sobre los proveedores de liquidez.Cada proveedor de liquidez debe tener una interfaz para intercambiar con ETH.
Cuando se asocian dos activos ABC y XYZ (por ejemplo, ambos son establo en dólares estadounidenses), los proveedores de liquidez en UNISWAP generalmente sufrirán pérdidas permanentes más pequeñas en el par ABC/XYZ en comparación con ABC/ETH o XYZ/ETH.Además, el uso de ETH como una moneda de transición forzada aumenta los costos de los operadores.El comerciante pagará el doble que la compra directa de ABC/XYZ, y también sufrirá dos deslizamientos.
En UNISWAP2, los proveedores de liquidez pueden crear contratos de pares para dos tokens ERC-20.Si bien el aumento en el número de pares de transacciones entre cualquier tokens ERC-20 puede hacer que sea más complicado encontrar una ruta específica de transacción de activos, este problema puede resolverse mediante un enrutamiento de nivel superior (a través de enrutadores o agregadores fuera de cadena o en cadena ).
2.2 Precio Oracle
El precio de UNISWAPV1 se calcula en el momento T, el precio marginal proporcionado por UNISWAP (excluyendo las tarifas de manejo) se puede obtener dividiendo el monto de reserva del activo A por el monto de la reserva del activo b.La fórmula de cálculo específica es la siguiente:
Sin embargo, UNISWAPV1 no es seguro de usar como un oráculo de precio en la cadena porque es muy fácil de manipular.操纵者会在一个区块的开头大量卖出某种资产 a 以影响价格 , 然后在该区块中间根据波动的价格执行其他合约操作(非 uniswap 交易对合约) 最后在区块结束时买回 最后在区块结束时买回La misma cantidad de activo A devuelve el precio a los niveles normales.UNISWAP V2 presenta un mecanismo de acumulación de precios, lo que permite que los terceros usen el precio promedio de un cierto rango, lo que aumenta en gran medida la dificultad de la manipulación de precios y hace que el comportamiento de manipulación no tenga beneficios sustanciales.
Específicamente, Uniswap V2 acumula este precio registrando la suma acumulada de los precios al comienzo de cada bloque, donde alguien interactúa con el contrato.Cada precio se ponderó en función del tiempo transcurrido ya que se actualiza el bloque anterior, según la marca de tiempo del bloque.Esto significa que en cualquier momento dado (después de la actualización), el valor del acumulador debe ser la suma del precio spot por cada segundo en el historial del contrato.
Para estimar el precio promedio ponderado en el tiempo desde el tiempo T₁ a T₂, una persona que llama externa puede verificar el valor del acumulador en T₁, luego verificar nuevamente en T₂, reste el primer valor y dividir por los segundos transcurridos.(Tenga en cuenta que el contrato en sí no almacena el valor histórico de este acumulador: la persona que llama debe llamar al contrato al comienzo del ciclo para leer y almacenar este valor).
El usuario de Oracle puede elegir cuándo comenzar y finalizar el ciclo.Elegir un ciclo más largo hará que sea más costoso que un atacante manipule el precio promedio ponderado por tiempo (TWAP), aunque esto dará como resultado un precio más bajo.Debido a que se usa el valor promedio, el valor promedio de A/B y B/A en un cierto intervalo ya no es una relación recíproca, por lo que Uniswap V2 ofrece ambos precios.
2.3 Precisión de cálculo del precio
Dado que la solidez no admite tipos de datos numéricos no integrales, UnISWAPV2 adopta el formato de datos UQ112.112 para mejorar la precisión de los cálculos de precios y utiliza UINT112 para almacenar el número de activos en el par de transacciones y utiliza 32 bits para registrar la creación de la creación Tiempo del bloque actual.Este método de grabación de tiempo hará que las marcas de tiempo Unix se desborden 100 años después, el 7 de febrero de 2106.Esto se debe a que las marcas de tiempo Unix representan el tiempo en segundos desde el 1 de enero de 1970 (llamada Era Unix), y UINT32 puede representar un rango de 0 a 2^{32} – 1 segundo, eso es aproximadamente 136 años.
Para garantizar que el sistema todavía funcione correctamente el 7 de febrero de 2106 y más allá, UNISWAPV2 está diseñado para requerir que los oráculos verifiquen el precio al menos una vez que cualquier otro ciclo de desbordamiento (aproximadamente 136 años).Esto se debe a que en este diseño, el método de acumular precios sigue siendo seguro de desbordamiento, incluso si las marcas de tiempo se desbordan, y el cambio de precio se puede calcular correctamente incluso si la transacción abarca el intervalo de desbordamiento.De esta manera, el sistema se asegura de permanecer preciso y confiable durante mucho tiempo.
2.4 Redención de rayos
Lightning Exchange es un intercambio de criptomonedas instantáneo realizado en una plataforma de blockchain, donde los usuarios pueden completar rápidamente las transacciones entre diferentes criptomonedas sin esperar que los bloques múltiples confirmen.Dichas transacciones generalmente se ejecutan automáticamente por contratos inteligentes, asegurando que ambas partes de la transacción cumplan con sus compromisos de intercambio al mismo tiempo, reduciendo así los riesgos de transacción y mejorando la eficiencia.En resumen, el intercambio de rayos significa intercambiar primero y luego pagar.
Expliquemos la redención del rayo a través de un ejemplo práctico. cantidad de A.A través del proceso anterior, completamos el arbitraje de la diferencia de precio entre A0-A al costo de 0.No necesitamos ningún director, solo necesitamos pagar una tarifa de gasolina.Si encuentra que hay una diferencia de precio entre otros DEXES en la cadena, también puede realizar operaciones similares en ellas con arbitraje de costo cero.
2.5 Tarifa de protocolo
UNISWAPV2 presenta una tarifa de protocolo del 0.05% que se puede activar y desactivar.Si está habilitado, esta tarifa se enviará a la dirección FISO especificada en el contrato de fábrica.Inicialmente, Feeto no se estableció, por lo que no se cobró ninguna tarifa.Una dirección previamente especificada Feetosetter puede llamar a la función SetFeeto en el contrato de fábrica UnISWAPV2 y establecer FeetO a un valor diferente.Feetosetter también se puede llamar setfeTosetter para cambiar la dirección de Feetosetter.
Si se establece la dirección FISO, el protocolo comenzará a cobrar una tarifa de 5 puntos básicos, que es la tarifa de 30 puntos básicas obtenida por los proveedores de liquidez \ frac {1} {6}.Es decir, los comerciantes continuarán pagando el 0.30% de todas las tarifas de transacción, de las cuales el 83.3% (es decir, el 0.25%) se pagarán a los proveedores de liquidez y el 16.6% (es decir, 0.05%) se pagará a la dirección de FeetO.El cobro de esta tarifa del 0.05% en cada transacción agrega costos de gas adicionales.Para evitar esto, las tarifas acumuladas solo se cobran cuando se deposita o retira la liquidez.El contrato calcula las tarifas acumuladas y las mentas nuevas tokens de liquidez a los beneficiarios de la tarifa inmediatamente antes de que el token sea acuñado o destruido.
累计费用可以通过测量√k 的增长来计算(即 √(x·y) ),自上次收取费用以来。这公式给出了在 t₁ 和 t₂ 之间,作为 t₂ 时流动池中流动性的百分比的累计费用:
如果费用在 t₁ 之前被激活,feeTo 地址应当捕获 t₁ 到 t₂ 之间累计费用到 ⅙。Por lo tanto, queremos acuñar un nuevo token de liquidez a la dirección de los pies, que representa el grupo de φ · f₁, ₂, donde φ = ⅙.
Es decir, queremos elegir Sₘ para satisfacer la siguiente relación, donde S₁ es la cantidad total de acciones en circulación en el momento T₁:
Después de algunos cálculos, incluido el uso de 1-
En lugar de f₁, ₂ y resolver Sₘ, podemos reescribirlo como:
Establecer φ a ⅙ y obtendremos la siguiente fórmula
A continuación, expliquemos con un ejemplo específico.Supongamos que los depósitos iniciales de depósitos 100 Dai y 1 ETH en un par y obtienen 10 acciones.Después de un tiempo (ningún otro depositantes estuvieron involucrados en el emparejamiento), intentaron retirar fondos, momento en el que había 96 DAI y 1.5 ETH en el emparejamiento.Sustituyendo estos valores en la fórmula anterior, obtenemos el siguiente resultado:
2.6 Cálculo de la tarifa de transacción
UniSwapv1 El cálculo de la tarifa de transacción es la fórmula
Esta fórmula significa que la fórmula constante del producto solo se reduce primero y luego se ejecuta en la versión de UNISWAPV2, debido a la existencia del mecanismo de Swaps Flash, la fórmula de cálculo para las tarifas de transacción se ajusta a
2.7 Sync () y Skim ()
Sync () se utiliza para actualizar el número de activos almacenados temporalmente en el contrato al valor real actual del contrato, principalmente para manejar casos en los que hay desequilibrios proporcionales y no hay proveedores de liquidez disponibles.Skim () se usa para manejar la situación en la que el número de activos en el contrato excede el valor máximo de UINT112, lo que permite al usuario retirar la parte de los activos que exceden el valor máximo de UINT112.
2.8 Manejo de tokens no estándar y con poca frecuencia
El contrato de token ERC20 estándar debe devolver un valor booleano después de transferir el token para indicar si la transferencia es exitosa, pero no todos los tokens lo harán.Algunas fichas no devuelven valores.En UNISWAPV1, las transferencias de token sin valores de retorno se consideran como una falla por defecto, y la transacción completa se restablece.Y en UNISWAP V2, las transferencias de token sin valores de retorno se consideran exitosos.
Además, UNISWAPV1 supone que las transferencias de tokens no activan la reingreso del par de transacciones, pero algunos tokens ERC20 que admiten los ganchos ERC777 rompen esta suposición.Para admitir estos tokens, UNISWAPV2 agrega la función de bloqueo contra el reentrado a todas las funciones de modificación variable de estado público, y también evita el reingreso de las devoluciones de llamada definidas por el usuario en Swaps Flash.
2.9 Configuración de inicialización de liquidez
Si el usuario proporciona liquidez para un par de negociación existente A/B, entonces, según la relación actual de A y B, puede calcular cuántas relaciones A y B proporcionar.Sin embargo, cuando se inicializa un par de transacciones, no hay una relación de referencia.En la versión de UNISWAPV1, cuando un nuevo proveedor de liquidez deposita tokens en un par token uniswap existente, el número de tokens de liquidez acuados se calculará en función del número de tokens existentes.La fórmula de cálculo específica es la siguiente:
Para que la primera persona proporcione liquidez, la fórmula esXtarSi 0.Frente a esta situación, el método adoptado por UNISWAPV1 es que el valor de la liquidez inicial es directamente igual a la cantidad de ETH proporcionada inicialmente. Determinado por la proporción de la liquidez inicial.En uniSwapv2, la inicialización de la liquidez se puede hacer mediante la siguiente fórmula
Esta fórmula significaTantosEsta es la cantidad de tokens de liquidez que recibirá,XDepositadoEste es el número de los primeros tokens que deposita.XDepositadoEs la cantidad de ETH que deposita.YdepositadoEste es el número de la segunda token que deposita.
Por ejemplo, si deposita Dai,YdepositadoEs la cantidad de dai que deposita.Esta fórmula puede garantizar que la participación en el grupo de liquidez nunca sea más baja que el promedio geométrico en el grupo, pero el valor de esta fórmula también cambiará con el cambio del número de tokens en el grupo, para debilitar el número De los tokens en el grupo de fondos debido al impacto del cambio, UNISWAPV2 destruyó la liquidez inicial de 1e-esa, que es 1000 veces la liquidez mínima de 1e-bly..Aunque esto es trivial para cualquier par de transacciones, aumenta significativamente el costo de los atacantes que se benefician de este mecanismo.
2.10 Weth
Dado que la interfaz para el comercio de ETH de Ethereum nativa es diferente de la de la negociación de tokens ERC20, muchos protocolos no admiten directamente ETH, sino que usan un Weth alternativo (token ETH empaquetado).UNISWAPV1 es una excepción porque sus pares comerciales incluyen directamente ETH, lo que permite a los usuarios comerciar directamente con ETH.Sin embargo, UNISWAP V2 está diseñado para admitir pares de negociación entre los tokens ERC20, y el apoyo directo para ETH puede complicar el sistema y aumentar el riesgo.
Por lo tanto, ETH no se admite directamente en UNISWAPV2, y los usuarios deben convertir ETH a Weth antes de usar el par de transacciones.De hecho, UnISWAPV2 convierte internamente en ETH a Weth, que simplifica las operaciones de los usuarios sin convertir manualmente ETH a Weth.Si bien esta conversión es trivial para cualquier par de transacciones, mejora efectivamente la seguridad y la facilidad de funcionamiento del sistema.
2.11 Dirección de pares de negociación determinista
Ya sea que se trate de UNISWAPV1 o UNISWAPV2, todos los pares se crean a través de un solo contrato de fábrica.En UNISWAPV1, se usa el Cine OpCode, y la dirección de la transacción a contrato se verá afectada por el orden en que se crea.En UNISWAPV2, se utiliza un nuevo Código de Opto2 y se determina la dirección generada por este método.Esto significa que la dirección del par de transacciones se puede calcular por adelantado sin consultar el estado en la cadena.
2.12 Número máximo de tokens
Para implementar eficientemente las funciones de Oracle, UNISWAP V2 usa UINT112 para guardar el número de tokens, lo que significa que su número máximo de tokens es 2¹¹² – 1.Para los tokens con una precisión de 18, este valor es suficiente, aproximadamente 5192296858534828 (5.19e¹⁵), es decir, 5.19 billones.Si el valor de registro en el contrato excede este límite, la transacción fallará y se restablecerá.Como se mencionó anteriormente, cualquiera puede recuperarse usando la función Skim (), resolviendo este problema eliminando el exceso de activos del grupo de liquidez.
3. Análisis del principio de uniswapv2
UNISWAP es un protocolo de liquidez automatizado impulsado por fórmulas de productos constantes e implementado en sistemas de contrato inteligentes no actualizables en la cadena de bloques Ethereum.Elimina la necesidad de intermediarios de confianza, priorizando la descentralización, la resistencia a la censura y la seguridad.Cada contrato inteligente o moneda de UNISWAP administra un grupo de liquidez que consta de dos reservas de tokens ERC-20.Cualquiera puede intercambiar tokens del grupo depositando el valor equivalente de cada token subyacente, convirtiéndose así en un proveedor de liquidez (LP) del grupo de fondos.Estos tokens rastrean las acciones de LP prorrateadas en la reserva total y pueden canjear los activos subyacentes en cualquier momento.
Primero, presentaremos el mecanismo automático de fabricantes de mercado de UniSWAP.
en,incógnitaRepresenta el número de token a,YRepresenta el número de token b,kes una constante que indica que el producto de los dos tokens en la piscina permanece sin cambios.Cuando un comerciante cotiza en UNISWAP, cambia el número de tokens en el grupo agregando o eliminando tokens a la piscina.Según la fórmula del producto constante, el número de otro token cambiará en consecuencia para mantener el productokconstante.Este cambio determina el precio de la transacción.
Por ejemplo, si un comerciante quiere intercambiar token B con token A, necesita agregar un cierto número de tokens A al grupo, lo que hará que el número de token B en el grupo disminuya, cambiando así el precio.Las operaciones del comerciante se moverán a lo largo de esta curva, cambiando el número y el precio de los tokens.Cualquier punto en la curva satisface la relación constante del producto.
El principio de funcionamiento de UNISWAPV2 se puede dividir aproximadamente en tres partes: proveedor de liquidez, piscina uniswap y comerciante.El papel de los proveedores de liquidez es que los proveedores de liquidez depositan dos tokens (por ejemplo, token A y Token B) en una piscina Uniswap.
En el ejemplo que se muestra en la figura, el proveedor de liquidez deposita 10 token A y 1 Token B;
La participación de liquidez en la piscina está representada por el token de liquidez, que muestra que hay 12 tokens de liquidez en la figura;Por ejemplo, un comerciante puede depositar 10 tokens A y pagar una tarifa de manejo del 0.3% para obtener 1 token B del grupo.
Primero veamos cómo los proveedores de liquidez (LPS) proporcionan liquidez.Como se muestra en la figura a continuación, los proveedores de liquidez depositan los tokens en grupos Uniswap para aumentar la liquidez.
Por ejemplo, en la figura, el proveedor de liquidez deposita 3 token A y 1 token B.Cuando los proveedores de liquidez depositan tokens, reciben tokens de piscina que representan su participación en liquidez.En la figura, el proveedor de liquidez obtuvo 12.4 fichas de piscina.Las reservas de tokens en la piscina aumentarán, por ejemplo, las reservas de tokens en la piscina en la cifra se convertirán en 1210 token A y 399 Token B.Más liquidez ayuda a reducir el deslizamiento de precios y hacer que el comercio sea más estable.
La fórmula de producto constante utilizada por uniswapx · y = kPara determinar la curva de precios.El aumento de la liquidez expande el área de bajo deslizamiento y mejora la estabilidad de los precios de las transacciones.Los proveedores de liquidez aumentan la liquidez en la piscina depositando los tokens y obtienen los tokens de liquidez correspondientes a cambio.Esto no solo ayuda a los comerciantes a obtener precios más estables, sino que también aporta beneficios a los proveedores de liquidez de las tarifas de transacción.
A continuación, desde la perspectiva de los comerciantes, cómo los comerciantes intercambian tokens y qué impacto tendrá el comportamiento comercial en uniswap en el grupo.
Como se muestra en la figura a continuación, los comerciantes quieren intercambiar tokens en UNISWAP.Por ejemplo, en la figura, el comerciante tiene la intención de intercambiar 3 tokens.Los operadores ingresan 3 fichas A y pagan una tarifa de manejo del 0.3%.Finalmente, el comerciante obtendrá aproximadamente 0.997 bs de token como salida.La transacción cambia el saldo de reserva en el grupo, lo que resulta en un nuevo precio.Antes de la transacción, había 1200 tokens A y 400 tokens B en la piscina.
Según la fórmula de producto constantex · y = kHabrá alrededor de 1203.009 Token A y alrededor de 399.003 Token B en el grupo de transacción posterior.Uso de uniswapx · y = kSe define la fórmula de producto constante de la curva de precios.A medida que el comerciante intercambia, el número de tokens en el grupo cambia y la curva de precios también se ajusta para determinar el nuevo precio.
4. Análisis del código fuente
4.1 Análisis del diagrama de flujo de operación central
En esta sección, introduciremos las tres operaciones más utilizadas en UNISWAPV2, a saber, agregar liquidez, eliminar liquidez e intercambiar tokens.Analizaremos los contratos que llaman y las funciones que llaman a través del diagrama de flujo para obtener una comprensión más profunda del código fuente de UNISWAPV2.
4.1.1 Agregar liquidez
Cuando un usuario agrega liquidez, el usuario primero llama al contrato uniswapv2router.sol para proporcionar el número de token A y token B. La función de addliquidez del contrato de UNISWAPV2ROUTER.SOL recibe la solicitud y los procesos del usuario.
La función de AddLiquidy llama además el contrato de UNISWAPV2Pair.sol. B proporcionado por el usuario (: :::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::: el número de tokens LP) y asignar estos tokens LP al usuario. Actualizar la reserva.
4.1.2 Tokens de intercambio
Cuando un usuario quiere intercambiar tokens, primero llama al contrato de UNISWAPV2ROUTER.SOL para proporcionar el número de tokens de entrada y el número mínimo de tokens de salida.
Luego, la función SwapExactTokensfortokens de la función UNISWAPV2Router recibe la solicitud del usuario y la procesa en uniswapv2pair.sol sobre la función de swap se llama a realizar el intercambio real. se basa en el número de tokens y reservas.El proceso específico es el siguiente:
4.1.3 Desmontaje de liquidez
El usuario primero llama al contrato de UNISWAPV2Router.sol para proporcionar el número de tokens LP que se retirarán. .Sol Contrato, Llame a la función de quemaduras realiza la operación de retiro de liquidez real.
4.2 Contrato central
UniSWAPV2 Core Contract es una parte central de UNISWAP, una plataforma de negociación descentralizada, y es responsable de implementar sus funciones automatizadas de fabricantes de mercado (AMM).A diferencia de los libros de pedidos tradicionales, Uniswap pasa grupos de liquidez y fórmulas de productos constantesx · y = kpara realizar la transacción.El proveedor de liquidez deposita dos tokens en la piscina y obtiene tokens de liquidez como credenciales.Cuando un usuario realiza una transacción, el contrato calcula el precio de la transacción en función del número de tokens en el grupo y la fórmula del producto constante.UNISWAPV2 introdujo varias mejoras, incluidas las transacciones directas de pares ERC20, mejoras de Oracle de precios, préstamos flash y ajustes de tarifas de protocolo.Los componentes centrales del contrato central incluyen los siguientes tres archivos:
-
Uniswapv2pair.sol: administra grupos de liquidez para cada par de negociación, maneja intercambios de tokens, adiciones de liquidez y mudanzas
-
Uniswapv2factory.sol: responsable de crear y administrar pares de transacciones
-
UniSWAPV2ERC20.SOL: Implementación estándar de tokens de liquidez, que representa la proporción de proveedores de liquidez
4.2.1 UNISWAPV2 Factory.sol
El papel del contrato UNISWAPV2Factory es responsable de crear y administrar pares comerciales (grupos de liquidez).Este contrato permite a los usuarios crear nuevos pares de negociación y registrar todos los pares de negociación creados.Además, gestiona direcciones de recepción de tarifas de transacción y direcciones establecidas.Uniswapv2Factory.sol tiene cinco funciones, echemos un vistazo por separado
-
Función del constructor: función del constructor, utilizada para inicializar unisWAPV2Factory Contract.La entrada es la dirección del establecimiento de tarifas de transacción _feTosetter, y la salida es ninguna.
-
Función AllPairsLength: Devuelve el número de todos los pares de transacciones creados.La entrada es ninguna, y la salida es la unidad del número de todos los pares de transacciones.
-
Función de createPair: crea un nuevo par de transacciones.La entrada son las dos direcciones tokens de Tokena y TokenB, y la salida es el par de direcciones de par de transacciones creado.
-
Función SetFeeto: Establezca la dirección de aceptación de la tarifa de transacción.La entrada es la nueva dirección de aceptación de la tarifa de transacción _feeto, y la salida es ninguna.
-
Función SetFeTosetter: establece la nueva dirección de establecimiento de tarifas de transacción.La entrada es la nueva dirección de establecimiento de tarifas de transacción _feTosetter, y la salida es ninguna.
El análisis de código específico es el siguiente:
Función de createPair
La función de la función CreatePair es crear un par de transacciones con Tokena y TokenB. TokenB, seguido de verificar la dirección de token0 y requerir que la dirección de token0 no pueda ser 0;
Luego verifique si este par de tokens existe requerir (getPair [token0] [token1] == dirección (0), ‘uniswapv2: par_exists’); el contrato;
Luego use los valores hash de Token0 y Token1 como el valor de la sal para garantizar que la dirección de cada par token sea única, porque si la dirección del par de tokens no es única, entonces la liquidez del comerciante puede agregarse al grupo incorrecto ; Entonces, cree un contrato utilizando la instrucción de ensamblaje en línea2 para garantizar la singularidad y la previsibilidad de la dirección del contrato;
Luego, inicialice el contrato de par de token recién creado, luego actualice la tabla de mapeo, registre la dirección del contrato de par de tokens y luego agregue la dirección del contrato de par de token recién creado a la lista de todos los pares de tokens, y finalmente active eventos creados por pares para notificar Fuera de los nuevos pares de tokens que se crearán.
4.2.2 UNISWAPV2 ERC20.SOL
La función principal de UNISWAPV2ERC20.SOL es implementar tokens ERC-20, lo que implementa la función de token estándar ERC20, utilizada específicamente en los grupos de liquidez UNISWAPV2.El contrato incluye operaciones básicas como fundición, quema, aprobación y transferencia.Además, admite la función de permiso, lo que permite el uso de firmas para aprobar transferencias de token.Veamos las funciones que contiene una por una:
-
Función del constructor: inicialice el contrato, establezca dominio_separador para la función de permiso.Ingrese ninguno, salida Ninguno.
-
_ Función menta: tokens nuevos de menta, la entrada es la dirección receptora «a» y la cantidad de menta «valor», la salida es no
-
_ Función de Burn: destruir tokens, la entrada es la dirección de destrucción desde el valor de la cantidad destruida, la salida es ninguna.
-
_Approve Función: apruebe la transferencia del token, el propietario del propietario del propietario, el gastador de dirección aprobado y el valor de cantidad aprobado, la salida ninguno.
-
_ Función de transferencia: Token de transferencia, la entrada es la dirección de transferencia desde la dirección de recepción y el valor de la cantidad de transferencia, la salida es ninguna.
-
Función de aprobación: la función de aprobación pública, la función es llamar a la función _Approve, la entrada es la función de aprobación pública de la función de aprobación y la salida es devolver un valor booleano verdadero para indicar que la operación es exitosa.
-
Función de transferencia: la función es llamar a la función _transfer, la entrada es aceptar la dirección y el valor del número de transferencia, y la salida es devolver el valor booleano verdadero significa que la operación es exitosa
-
Transferencia de la función: una función de transferencia de autorización expuesta.La entrada es la dirección de transferencia desde la dirección receptora y el valor de la cantidad de transferencia, la salida es el valor booleano de retorno verdadero indica que la operación es exitosa
-
Función de permiso: use la firma para aprobar la transferencia de token, verificar la firma y llamar a la función _approve. La salida es ninguna.
El análisis oficial del código fuente es el siguiente:
4.2.3 par uniswapv2.sol
UNISWAPV2PAIR es un contrato de pares de negociación, que se da cuenta de la función central de UNISWAP V2, a saber, administra y opera el grupo de liquidez de cada par de negociación.Este contrato es responsable de manejar el intercambio de tokens, la adición y eliminación de liquidez, y el cálculo de acumulación de precios.Asegura que después de cada transacción, la información de reserva y precio del par de transacciones se actualice y desencadena las notificaciones de eventos correspondientes.Hay 11 funciones en uniswapv2pair.sol, que se muestran en la siguiente tabla:
El código y los comentarios oficiales de uniswapv2pair.sol son los siguientes:
UniSwapv2Pair hereda IUNISWAPV2PAIR, unisWAPV2ERC20.
Luego se definen variables y modificadores globales
El mínimo de la liquidez anterior es una constante que establece el número mínimo de tokens de liquidez que deben retenirse en el grupo de liquidez para garantizar que los proveedores de liquidez retengan al menos una cierta cantidad de tokens en cualquier momento, evitando así el agotamiento de liquidez. 10, que se quema al proporcionar liquidez inicial; Se utiliza la firma de función correcta al ejecutar transferencias de token;
La fábrica se utiliza para almacenar la dirección del contrato de fábrica UNISWAP V2 para el contrato de par de transacciones, Token0, Token1 se usa para almacenar la dirección token, Reserve0, Reserve1 y BlocktimeStamplast, las tres variables de estado registran el número de dos activos en la última constante constante Producto y tiempo de bloqueo de tiempo de transacción (creación);
Las variables Price0CumulativeLast y Price1CumulativeLast se utilizan para registrar los valores acumulados de los dos precios en el par de negociación, y Klast se usa para rastrear el estado reciente del producto de las dos reservas de tokens en el par de negociación UnisWAPV2, como un parámetro clave Para mantener la estabilidad del precio del grupo de liquidez y calcular las tarifas de transacción, utilizadas principalmente para el cálculo de las tarifas de manejo del equipo.
La siguiente sección del decorador proporciona un mecanismo de bloqueo para evitar ataques de reingreso.
El _ en el código anterior representa el cuerpo de la función modificado. ataques reentradores y condiciones de carrera.
La siguiente función es proporcionar una forma de consultar públicamente y devolver la información sobre las dos reservas tokens actuales y la última marca de tiempo actualizada del contrato de par de transacciones UnISWAPV2.
La función de la función _safetransfer es realizar operaciones de transferencia de tokens dentro del contrato inteligente y verificar si la transferencia es exitosa. es el código detallado de esta sección.
El siguiente constructor simplemente se usa para inicializar la fábrica:
La función de la función de inicialización es establecer las direcciones de los dos tokens involucrados en el contrato del par de transacciones, y solo puede ser llamado por el contrato de fábrica donde se implementa el par de transacciones, asegurando que el proceso de inicialización del par de transacciones sea seguro y revisado.
La función principal de la función _Update es garantizar que la cantidad de reserva y el acumulador de precios de la transacción a contrato puedan reflejar el último estado. uno.Los cuatro parámetros de entrada de la función _Update son: Balance0 y Balance1, que representan el saldo actual de los dos tokens en el par de transacciones;A continuación, utilizaremos el método Bullet Point para explicar cómo se implementa la función _Update:
-
Compruebe si el valor del saldo puede causar desbordamiento: use la instrucción requerir que se asegure de que el saldo entrante0 y el balance1 no exceda el valor máximo de UINT112, porque Reserve0 y Reserve1 usan el tipo UINT112 al almacenar, y se requiere la seguridad de la conversión de tipo de datos .
-
Registre el tiempo de bloque actual: obtenga la marca de tiempo del bloque actual y realice la operación Modulo 2^32 con blocktimeStamplast para obtener blocktimeStamp.Esta operación se debe a que la marca de tiempo de bloque de Ethereum es de 32 bits, y solo nos importa la diferencia de tiempo dentro de un bloque, no el tiempo absoluto.
-
Calcule la diferencia de tiempo: Calcule la diferencia entre el tiempo de bloque actual y el último tiempo de actualización.Si el tiempo de tiempo es 0, significa que esta es una llamada continua dentro del mismo bloque, por lo que el valor del precio acumulado no se actualizará.
-
Actualización acumulativa del precio: si la diferencia de tiempo es mayor que 0 y la reserva no es 0, use la biblioteca de matemáticas de punto fijo UQ112x112 para calcular la relación de precio y actualizar el precio 0cumulativeLast y el precio1cumulativeLast.»Nunca se desborde» aquí significa que debido a que el intervalo de tiempo elaborado es de tipo UINT32, multiplicarse con el valor del precio acumulado (UINT224) no causará desbordamiento.»Se desea el desbordamiento» se refiere al valor acumulado del precio para permitir el desbordamiento, porque el cálculo del precio usa el delta en lugar del valor absoluto.
-
Actualización de la reserva: asigne el nuevo saldo a Reserve0 y Reserve1 para actualizar la reserva del grupo de liquidez.
-
Actualizar la marca de tiempo: asigne la marca de tiempo de bloque actual para blocktimeStamplast para prepararse para la próxima actualización.
-
Evento de sincronización de activación: emita un evento de sincronización a través de la palabra clave EMIT para informar al oyente externo que la reserva ha sido actualizada.
Este diseño permite que UNISWAP2 mantenga la continuidad y la precisión del precio al procesar grandes cantidades de transacciones, y puede calcular con precisión el precio promedio de la transacción a través del volumen de cambio, incluso cuando la marca de tiempo de bloque o el valor acumulado del precio puede desbordarse.Esto se logra utilizando hábilmente las matemáticas de punto fijo y la diferencia de tiempo.
En UNISWAP2, a los usuarios se les cobrará una tarifa de manejo del 0.3% por transacción.Una sexta parte de esta tarifa se asignará al equipo de desarrollo, y el cinco sexto restante se entregará al proveedor de liquidez como recompensa.Sin embargo, si la tarifa de manejo se calcula una vez por transacción, esto inevitablemente aumentará la tarifa de gas del usuario.
Por lo tanto, en UNISWAP2, la tarifa de manejo se acumulará y la tarifa de manejo se asignará solo cuando cambie la liquidez.La función _Mintfee primero verifica si la tarifa de transacción está habilitada y determina la dirección de recepción de la tarifa.Si la tarifa de transacción no está habilitada y ha habido una tarifa de acuñación (_klast no es 0), restablezca el valor de Klast.Este mecanismo de casting es parte de UNISWAPV2 para proporcionar incentivos adicionales para los proveedores de liquidez;
Sₘ representa el número de tokens líquidos que deben acuquejarse, K₁ representa el producto de reservas después del evento de liquidez anterior, K₂ representa el producto de reserva actual K, S₁ representa el suministro de token líquido total después de la cantidad anterior del evento de liquidez.
4.3 Contrato de periferia
La función principal de los contratos periféricos de UNISWAPV2 es servir como un puente entre las cuentas externas y los contratos centrales, incluidas cuatro piezas: definición de interfaz, biblioteca de herramientas, enrutador e implementación de muestras.
4.3.1 Bibliotecas
La carpeta de bibliotecas contiene cuatro archivos
-
Safemath.sol
-
Uniswapv2library.sol
-
Uniswapv2liquityMathlibrary.sol
-
Uniswapv2oraclelibrary.sol
A continuación, analizaremos estos cuatro archivos SOL en detalle
Safemath.sol
Safemath.sol se utiliza para realizar operaciones matemáticas seguras de desbordamiento, que son muy importantes para evitar errores de desbordamiento y subflujo de enteros, especialmente en blockchain y desarrollo de contratos inteligentes.Contiene principalmente tres funciones.
-
Agregar función: se utiliza para realizar operaciones adicionales de dos enteros sin firmar
-
Sub Función: Se utiliza para realizar operaciones de sustracción de forma segura de dos enteros sin firmar
-
Función MUL: se utiliza para realizar de forma segura operaciones de multiplicación de dos enteros sin firmar
Los comentarios de código específico son los siguientes
Uniswapv2library.sol
UNISWAPV2Library.SOL proporciona algunas funciones prácticas para interactuar y operar con pares de intercambio V2 UnisWAP.
Estas funciones se utilizan principalmente para calcular las rutas de transacción, obtener reservas, calcular los precios y realizar cálculos de la cadena.Esta biblioteca utiliza una biblioteca llamada Safemath para garantizar la seguridad de las operaciones matemáticas y evitar el desbordamiento y el bajo flujo de enteros.Uniswapv2library.sol Este archivo contiene ocho funciones:
-
Función SortTokens: devuelve dos direcciones tokens ordenadas por dirección.La entrada es dos direcciones de token Tokena y TokenB.La salida es la dirección token ordenada token0 y token1.
-
FUNCIÓN DE PARFOR: Cálula la dirección de la dirección de fábrica dada y el par de dos direcciones tokens sin hacer llamadas externas.La entrada es la fábrica de fábrica, las dos direcciones de token tokena y tokenB;
-
Función GetReserves: obtenga y ordene un par de reservas.La entrada es la fábrica de direcciones de fábrica, las dos direcciones de token y tokenb;
-
Función de cotización: devuelve la cantidad equivalente de otro activo basado en la cantidad de activos dada y la reserva del par.Ingrese: Activos Cantidad A, Reserva y ReserveB.La salida es la cantidadb de otro activo.
-
Función GetAmountOut: devuelve el número de salida máximo de otro activo en función del número de activos de entrada y las reservas del par.La entrada es el número de activos de entrada cantidad, ReserveIn y ReserveOut;
-
Función Getamountin: devuelve el número de otro activo que se ingresará en función del número de activos de salida y las reservas del par.La entrada es la cantidad de activo de salida de cantidad, ReserveIn y ReserveOut.
-
Función GetAmountSout: Realice el cálculo de la cadena GetAmlount en cualquier número de pares, la entrada es la fábrica de la fábrica de fábrica, el número de activos de la ruta, la ruta de la ruta es la matriz de activos para cada nodo de ruta.
-
Función getamountsin: Realice la cadena de cálculo de getAmountin en cualquier número de pares, la entrada es la fábrica de direcciones de fábrica, el número de salida de activos, la ruta de ruta es la matriz de activos para cada número de nodo de ruta del número de activos.
Los comentarios detallados sobre el código fuente de UNISWAPV2Libray son los siguientes:
Uniswapv2oraclelibrary.sol
El archivo uniSwapv2oracLelibrary.sol proporciona algunos métodos auxiliares para operaciones relacionadas con los precios promedio de Cálculo de Oracle.La biblioteca incluye métodos para obtener la marca de tiempo de bloque actual y calcular el precio acumulativo, ayudar a ahorrar costos de gas y evitar llamadas sincrónicas frecuentes.Contiene dos funciones, como sigue:
-
Función CurrentBlockTimestamp: Devuelve la marca de tiempo de bloqueo actual.Ingrese Ninguno, la salida es la marca de tiempo de bloque actual, escriba UINT32.
-
Función de PRIMICES CURTUCUMULATIVO: calcula y devuelve el precio acumulativo.La entrada es el par de direcciones del par de transacciones, y la salida es el precio acumulativo de precio 0Cumulativo y Price1Cumulativo y la campaña de marca de bloqueo actual.
El código fuente oficial de uniswapv2oracLelibrary.sol es el siguiente:
Uniswapv2liquityMathlibrary.sol
El código fuente oficial de uniswapv2liquidityMathlibrary.sol es el siguiente
-
ComputerProfitMaximizingTrade Función: calcula la dirección y el tamaño de la transacción que maximiza las ganancias.
-
Función GetReservesAfterbitrage: bajo el «precio real» observado, las reservas del grupo de liquidez se obtienen después de las transacciones de arbitraje.
-
Función de Valor Comequeliquity: calcula el valor de liquidez, todos los parámetros de un grupo de liquidez dado.
-
Función GetLiquityValue: obtiene todos los parámetros actuales y calcula el valor del monto de liquidez.
-
GetLiquidityValuAfterarbitRageToprice Función: dados dos tokens y su «precio real», así como el monto de la liquidez, devuelve el valor de la liquidez.
Uniswapv2router02.sol
Primero veamos el código fuente de UNISWAPV2Router02.
Constructores y modificadores
-
constructor (dirección _factory, dirección _weth): inicializar la dirección del contrato de fábrica y la dirección del contrato de Weth.
-
Modificador Asegúrese de (fecha límite UINT): asegúrese de que la transacción se complete antes de la fecha límite.
Funciones que reciben ETH
-
Recibir () por pagar externo: recibe ETH, solo se permiten llamadas de los contratos de Weth.
Agregar liquidez
-
_Addliquity: una función interna, utilizada para agregar liquidez, calcule el número óptimo de tokens en función de las reservas existentes.
-
AddLiquidity: agregue liquidez de dos tokens ERC-20.
-
AddLiquidityeth: agregue liquidez de tokens ERC-20 y ETH.
Eliminar liquidez
-
RemoveLiquity: elimina la liquidez de dos tokens ERC-20.
-
Elimiliquidadidad: elimina la liquidez de los tokens ERC-20 y ETH.
-
removeliquitywithpermit: elimina la liquidez de dos tokens ERC-20 con licencia.
-
removeliquidez el ojo por cuenta: eliminó los tokens ERC-20 y la liquidez ETH con la licencia.
-
eliminar la capacidad de soporte de los fueos: elimina la liquidez de los tokens ERC-20 y ETH, y respalda los tokens de tarifas.
-
eliminar el suplente de soporte de superación a la medición de la liquidez de los tokens ERC-20 y ETH con licencia, respalda los tokens de tarifas.
Intercambio de tokenses
-
_swap: función interna, ejecuta la lógica de intercambio de token.
-
SwapExactTokensfortokens: use el número exacto de tokens para intercambiar otra token.
-
SwaptokensForeChatTokens: use tokens para intercambiar un número exacto de otros tokens.
-
swapexactThortOkens: use el número exacto de ETH para intercambiar tokens.
-
Swaptokensforexacteth: Use tokens para intercambiar la cantidad exacta de ETH.
-
SwapExactTokensforeth: intercambie ETH con el número exacto de tokens.
-
SwapethForExactTokens: use ETH para intercambiar el número exacto de tokens.
-
SwapExactTokensfortokenssupportingFeeontransferTokens: use el número exacto de tokens para intercambiar otra token, respaldo de tokens de tarifas.
-
SwapexActethortOkenSsupportingFeeontransferTokens: Use el número exacto de tokens de intercambio ETH, que respalda los tokens de tarifas.
-
SwapExactTokensforethSupportingFeeontransferTokens: use el número exacto de tokens para intercambiar ETH, respaldo de tokens de tarifas.
Funciones de la biblioteca
-
Cita: Calcule el número de token B correspondiente a una cantidad dada de token A basado en la cantidad de reserva.
-
GetAmountOut: calcula el número de salidas que se pueden obtener dado el número de entradas y reservas.
-
getamountin: calcula el número de entradas requeridas para una cantidad de salida dada y cantidad de reserva.
-
GetAmountSout: Calcule el número de salida en función de la ruta y el número de entrada.
-
getamountsin: calcule el número de entradas según la ruta y el número de salidas.
Veamos las funciones una por una a continuación.
El contrato UniSWAPV2Router02 implementa la interfaz IUNISWAPV2Router02, proporcionando las siguientes funciones clave:
-
Agregue liquidez: permite a los usuarios agregar dos tokens al grupo de liquidez a cambio de tokens de proveedor de liquidez.
-
Elimine la liquidez: permita que los proveedores de liquidez intercambien sus tokens de proveedor de liquidez a ambos tokens.
-
Transacciones: permite a los usuarios comerciar entre diferentes tokens, admite transacciones y rutas directas a través de múltiples pares comerciales.
-
Cálculo de cotización: proporciona una serie de funciones para calcular los detalles de la transacción cuando un volumen de entrada o salida dado.
El modificador ASEGUAR se utiliza para verificar si el tiempo de bloque actual excede el último tiempo de transacción, asegurando que la transacción especificada por el usuario no falle debido al tiempo de espera, lo que ayuda a mejorar la seguridad y la confiabilidad de la transacción.
El constructor inicializa la dirección del contrato del proyecto y la dirección del contrato de Weth, que no cambian durante el ciclo de vida del contrato.
La función de recepción generalmente se usa para permitir que un contrato reciba éter directamente, en lugar de a través de una llamada de función.En este ejemplo particular, la función de recepción utiliza la declaración ASSERT para garantizar que solo el contrato de Weth pueda enviarle éter.
El propósito de la función _addliquent es calcular el número óptimo de dos tokens que el usuario necesita depositar al agregar liquidez.Hay seis parámetros para que esta función acepte. El usuario agregará una cantidad para evitar que el deslizamiento sea demasiado bajo.
Este cálculo tiene en cuenta el monto de las reservas de token que ya están en el grupo de liquidez para garantizar que la liquidez agregada por el usuario esté equilibrada.Si el grupo de liquidez es nuevo y no hay reserva existente, los usuarios pueden agregar directamente la cantidad que desean.Si ya hay reserva en el grupo, la función calculará el número óptimo de adiciones en función de la proporción actual, asegurando que la proporción de tokens en el grupo permanezca sin cambios después de que se agregue liquidez.
La función pública de AddLiquent para agregar liquidez al conjunto de liquidez de los dos tokens especificados (tokena y tokenB)
La función AddLiqueth permite a los usuarios agregar tokens no ETER y éter al grupo de liquidación UNISWAPV2 a cambio de la liquidación correspondiente, esta función tiene seis parámetros aceptados. De los tokens que no son EETH que el usuario desea agregar, MidingTokenmin es el número mínimo de tokens que no son ETER que el usuario puede aceptar, utilizado para evitar que el deslizamiento sea demasiado bajo, la cantidad de mínimo es el número mínimo de tokens de éter, y también es Solía evitar que el deslizamiento sea demasiado bajo, a la dirección de recibir tokens de liquidez recién acuñados, la fecha límite es la fecha límite para la transacción, utilizada para prevenir tiempos de transacción.
La función devuelve tres parámetros: MidingToken y Midings son la cantidad de monedas no ETER y éter que realmente se agregan al grupo de liquidez, y la liquidez es el número de tokens de liquidez recién acuñados.
La función de removeliquidez permite a los usuarios eliminar la liquidez que agregaron previamente del grupo de liquidez y obtener dos tokens proporcionalmente.La función de quemaduras es una función subyacente en el contrato de grupo de liquidez IUNISWAPV2PAIR, que se utiliza para realizar operaciones reales de destrucción de liquidez y asignación de tokens.
La función removeliquidad en el que permite a los usuarios eliminar la liquidez que agregaron anteriormente con Ether del grupo de liquidez de UNISWAPV2 y obtener el correspondiente no ETER y Ether respectivamente.La función primero llama la eliminación de la eliminación, luego extrae el token correspondiente a través de Safetransfer, luego reemplaza el Weth extraído de la liquidez de combustión con ETH, y luego transfiere el ETH redimido al destinatario.
La función de removeliquidez con poste de por ciento permite a los usuarios autorizar a través de la firma ECDSA, lo que permite que los contratos eliminen la liquidez en nombre de los usuarios sin la autorización previa del usuario a través de la función de aprobación.
La eliminación de la función de Permit Combina la eliminación de los mecanismos de autorización de eliminación y permita, lo que permite a los usuarios eliminar la liquidez al firmar un contrato de autorización único sin la necesidad de usar el modo de aprobación estándar.Esto proporciona una mejor experiencia y seguridad del usuario al tiempo que reduce los costos de gas de las transacciones.
La eliminación de la función de suministro de la función de control de los famosos permite a los usuarios eliminar la liquidez que agregaron anteriormente con tokens y éter específicos del grupo de liquidez UNISWAPV2, teniendo en cuenta que algunos tokens pueden cobrar tarifas al transferir.
La función primero llama la eliminación de la eliminación para realizar la eliminación de liquidez, luego maneja la transferencia de tokens, asegurando que el usuario obtenga el número de tokens que se merece, y finalmente convierte al Weth en éter y lo transfiere al usuario.Todo el proceso debe completarse antes de la fecha límite de transacción especificada por el usuario.
La eliminación de la función de suministro de la función de suministro de controles de Feeontransfertokens, que combina los mecanismos de autorización y de permisos de permiso, lo que permite que los usuarios eliminen un contrato de autorización único.
Este enfoque proporciona una forma de autorizar los contratos para operar los activos del usuario sin usar el modo de aprobación, reducir los costos de gas y mejorar la experiencia del usuario.
La función _swap es una función interna que realiza una serie de operaciones de intercambio de tokens.Se intercambia de una token a otra de acuerdo con la ruta y la cantidad especificadas hasta que se alcanza el token final.Esta función es la parte central de la interacción del grupo de liquidez, utilizada para implementar actualizaciones de conversión de tokens y grupo de liquidez.
La función SwapExactTokensfortokens es una característica clave del enrutador UnisWAPV2 que permite a los usuarios intercambiar al menos un token de salida mínimo con una cantidad de entrada exacta.Esta función primero calcula la salida de toda la ruta de intercambio, luego garantiza que la salida final cumpla con los requisitos mínimos del usuario, luego transfiere de forma segura los tokens del usuario al grupo de liquidez y realiza la operación de intercambio.
La función SwaptokensForeChatekens permite a los usuarios especificar el número de tokens que desean obtener y proporciona tokens que no exceden el valor máximo para el intercambio.Esta función primero calcula la entrada máxima requerida para obtener cantidad de cantidad, y luego asegura que esta entrada no exceda el montoinmax especificado por el usuario.
La función SwapExactThortokens permite al usuario intercambiar al menos un cierto número de otros tokens con una cantidad exacta de ETH.Esta función primero verifica si la ruta de intercambio es válida, luego calcula el número requerido de Weth, guarda el ETH en el contrato de Weth, luego realiza la operación de intercambio y envía los tokens intercambiados a la dirección especificada por el usuario.Todo el proceso debe completarse antes de la fecha límite de transacción especificada por el usuario.
La función de la función SwapExactThortokens es vender un número establecido de ETH a cambio de otros tokens.Primero, realice verificaciones de ruta efectivas para garantizar que el primer elemento de la matriz de ruta sea la dirección WETH, porque el par de transacciones uniswap es un par de transacciones ERC20/ERC20;
Lo siguiente es calcular la cantidad de salida, use la función uniswapv2library.getAmountSout para calcular el número de cada token que el usuario puede obtener en función del número de ETH enviado por el usuario Msg.Value y la ruta de token ruta, y almacenar el resultado en La matriz de cantidades a continuación;
Si no está satisfecho, se lanzará un error; A la dirección del contrato del par de transacciones especificada, si falla, la transacción retrocedirá y finalmente se llama a la función interna _swap para ejecutar el proceso de intercambio de token real.
SwaptokensForExacteth es un proceso de venta de otros tokens a cambio de una cierta cantidad de ETH. , la dirección a la que se recibe el ETH y la fecha límite para las transacciones;
Primero, la verificación de validez de la ruta se verifica para garantizar que el último elemento de la ruta de intercambio sea la dirección Weth, y si no, se lanza una excepción; que el usuario debe proporcionar para obtener el número de monedas ETH; la función SafETransferFrom de TransferHelper para transferir de forma segura los tokens de la dirección de Msg.Sender;
A continuación, llame a la función interna_swap para ejecutar el proceso de intercambio de tokens real; usuario.
La función de la función SwapExactTokensforeth se utiliza para intercambiar al menos un número de minúsculas de ETH con un número fijo de tokens. Para obtener cantidad de minúscula, la ruta de intercambio de tokens, la dirección a la que se recibe el ETH y la fecha límite de la transacción es una fecha límite;
La función de SwapethForExactTokens permite a los usuarios intercambiar un número fijo de tokens usando ETH, y la lógica de implementación es similar a la SwapExactTokensForeth anterior, Swaptokensforexacteth.
La función _swapsupportingFeeontransferTokens admite la lógica del intercambio de tokens para las tarifas de transacción.
SwapExactTokensfandokenssupportingFeeontransfertokens El número fijo de tokens se intercambia con precisión por al menos el número esperado de otro token, al tiempo que maneja el caso de los tokens de tarifas de transacción.
swapexactThorthiffenssportingFeeontransfertokens implementa el uso de un número específico de ETH para intercambiar por otros tokens
La función SwapExactTokensForethSupportingFeeontransferTokens permite al usuario intercambiar con precisión al menos la cantidad esperada de ETH con un número fijo de tokens, al tiempo que maneja los tokens de tarifas de transacción y garantizar una transferencia precisa de ETH.
La función de cita implementa la función de calcular y devolver el número de otros tokens que el usuario puede intercambiar en función del número de tokens especificados por el usuario y la reserva de dos tokens en el grupo de liquidez.
Los principios de cálculo de la función GetAmountout y la función GetAmountSout son algoritmos de productos constantes.Defina la función getAmountOut para calcular la cantidad de salida que el usuario puede obtener después de una cantidad de entrada dada y la cantidad de reserva;
El principio de cálculo de getamountin y getamountsin es calcular el número de activos vendidos en función del algoritmo de producto constante.
4.3.2 Migrator UniSwapv2.sol
UNISWAPV2MIGRATOR.SOL se usa para migrar la liquidez de UNISWAP V1 a UNISWAP V2.Este contrato incluye la capacidad de recibir ETH y utiliza enrutadores UNISWAP V1 y V2 y contratos de intercambio para la migración.Asegura que los usuarios puedan transferir su liquidez de manera segura en UNISWAP V1 a UNISWAP V2.Hay tres funciones, y las funciones específicas de cada función son las siguientes:
-
Función del constructor: función del constructor, utilizada para inicializar el contrato uniswapv2migrator.La entrada es la dirección de fábrica V1 _FactoryV1 y V2 Dirección de enrutador _router;
-
Función de recepción: recibe ETH, lo que permite que el contrato reciba ETH de cualquier interruptor V1 y enrutador.Ingrese ninguno, salida Ninguno.
-
Función de migración: la entrada es la dirección de token token, número de token mínimo de token, Cantidad, cantidad Mínima de la cantidad de ETH, la dirección de recepción a la fecha límite;
El código fuente oficial de uniswapv2migrator se analiza en detalle de la siguiente manera:
4.3.3 Carpeta de interfaces
La carpeta de interfaces contiene definiciones de interfaz para interactuar con intercambios de UNISWAPV1 y V2, enrutadores, fábricas y contratos Weth y ERC20.Las características clave incluyen administrar y migrar liquidez, manejo del comercio de tokens, agregar y eliminar liquidez, y empaquetar y desempacar ETH.Estas interfaces aseguran interacciones estandarizadas entre contratos.Veamos el contenido de cada archivo en detalle.
Iuniswapv1exchange.sol
Este archivo define una interfaz IUNISWAPV1Exchange, que se utiliza para interactuar con los contratos de intercambio UNISWAPV1.El contrato de intercambio es el principal responsable de manejar transacciones y gestión de liquidez entre tokens y ETH.Contiene las siguientes cuatro funciones:
-
Balance de función: devuelve el saldo de una dirección en el contrato de intercambio.
-
transferir desde la función: transfiere tokens de una dirección a otra.
-
Función de tokentoethswapinput: se usa para intercambiar tokens en éter.
-
Función EthTotokensWapInput: intercambiar éter por tokens.
Iuniswapv1factory.sol
Iuniswapv1factory.sol Se utiliza para interactuar con los contratos de fábrica de UNISWAPV1.El análisis de código específico es el siguiente:
Ierc20.sol
IERC20.SOL Define una interfaz llamada IERC20, que sigue al estándar de token Ethereum (ERC-20)
Iuniswapv2migrator.sol
IUNISWAPV2MIGRATY.SOL se usa para interactuar con el contrato de migración de UNISWAP V2.
Iuniswapv2router01.sol
La interfaz IUNISWAPV2Router01 proporciona una variedad de funciones, incluida la adición y eliminación de liquidez, el intercambio de tokens, etc. Estas funciones son el núcleo de construir una plataforma de comercio descentralizada y un grupo de liquidez.A través de esta interfaz, los usuarios pueden interactuar fácilmente con el protocolo UNISWAPV2.
Iuniswapv2router02.sol
El método en la interfaz iuniswapv2router02.Sol agrega principalmente soporte para las tarifas de transferencia, lo que permite a los proveedores de liquidez o titulares de tokens recibir una parte de las tarifas a cambio al transferir tokens.La implementación de estos métodos generalmente llama al contrato de token correspondiente en la parte inferior para realizar la tarifa cobrada durante la transferencia.
Iweth.sol
IWETH.SOL define una interfaz llamada IWeth, que representa una interfaz estándar en Ethereum para interactuar con contratos de éter envuelto (Weth).