Contratos Inteligentes de W-Project

Es importante verificar siempre que el código del contrato no sea malicioso y que la dirección sea correcta (consulte la página Lista de Direcciones). En esta sección proporcionamos una referencia detallada de las funciones de nuestros contratos para que los usuarios y desarrolladores puedan verificarlos.

Funciones para el usuario

Los usuarios pueden interactuar directamente con nuestros contratos inteligentes sin necesidad de una aplicación utilizando un explorador de bloques como Etherscan (consulte la página Comenzar para obtener instrucciones detalladas) utilizando las funciones deposit() y withdraw().

Code of the deposit() function

deposit()

Nuestros contratos inteligentes cuentan con una función "deposit()" que permite a los usuarios envolver sus tokens de monedas estables.

Esta función acepta un parámetro, cantidad, que representa la cantidad de tokens de moneda estable que se envolverán. El importe debe expresarse con 18 decimales.

Para evitar errores de redondeo, la función comienza calculando unWrappedAmount, que ajusta los lugares decimales de 18 al número apropiado para el token específico. Luego, vuelve a multiplicar el monto unWrappedAmount, invirtiendo la operación anterior y recuperando el monto original sin errores de redondeo.

Una vez que la cantidad se ajusta correctamente, la función transfiere esta cantidad sin envolver de la dirección del usuario a la dirección del contrato.

Finalmente, se llama a la función "fulfillDeposit()" para finalizar la operación de depósito. Esta función verifica que el contrato haya recibido una cantidad suficiente de tokens y emite la cantidad equivalente de tokens envueltos para el usuario.

Code of the withdraw() function

withdraw()

La función "withdraw()" en nuestros contratos inteligentes permite a los usuarios desenvolver sus tokens recuperando sus monedas estables.

Esta función acepta un parámetro, "amount", que representa la cantidad de tokens de moneda estable que se desenvolverán. El importe debe expresarse con 18 decimales.

La función simplemente llama a la función "withdrawTo()" para ejecutar la operación de retiro, pasando la dirección de la persona que envía la transacción y la cantidad como argumentos.

La función "withdrawTo()" primero calcula el monto no envuelto, similar a la operación de depósito, para ajustar los decimales de 18 a los decimales del token subyacente.

Después de ajustar los posibles errores de redondeo, la función quema los tokens envueltos de la cuenta del usuario. Luego, la función transfiere la cantidad unWrappedAmount de tokens de moneda estable al usuario.

Finalmente, la función verifica que la cantidad de tokens en el contrato sea al menos igual al suministro total de tokens envueltos después del retiro.

Funciones para desarrolladores

Nuestros contratos inteligentes incluyen métodos de bajo nivel que permiten la integración directa con otros contratos, evitando que los usuarios tengan que aprobar nuestro contrato, con el consiguiente ahorro de gas. En esta sección proporcionamos una descripción y ejemplos de cómo llevar a cabo la integración de W-Project con otros protocolos.

Code of the fulfillDeposit() function

fulfillDeposit()

La función "fulfillDeposit()" es una función de nivel inferior diseñada para facilitar la integración de nuestros tokens envueltos en los contratos inteligentes de otros proyectos.

Esta función tiene la principal ventaja de que evita la necesidad de que los usuarios, o el contrato de integración, aprueben el contrato de nuestro token envuelto. La eliminación de este paso ahorra gas y abstrae a los usuarios de la complejidad subyacente. En cambio, la función verifica que el paso de transferencia ya se haya ejecutado al verificar si el saldo del token en el contrato es suficiente. Si se cumple este requisito, acuña los tokens envueltos para el remitente de la transacción.

La función "fulfillDeposit()" acepta un parámetro: la cantidad de tokens de stablecoin que se envolverán. El importe debe expresarse con 18 decimales. Primero, la función calcula el saldo envuelto, que es el saldo total de tokens en el contrato ajustado a 18 decimales. A continuación, la función verifica si el saldo envuelto es mayor o igual a la suma del suministro total de tokens envueltos y la cantidad a depositar. Esta verificación es crucial ya que garantiza que el contrato haya recibido suficientes tokens de stablecoin para envolver.

Finalmente, si se cumple el requisito, la función emite la cantidad correspondiente de tokens envueltos para el remitente de la transacción.

Tenga en cuenta: el uso manual directo de esta función no se recomienda a los usuarios debido a los posibles ataques de "front-running", en los que un actor malicioso podría crear tokens envueltos para ellos mismos. Esta función solo debe llamarse de manera segura desde un contrato inteligente, ya que la transferencia del token y la llamada a la función se ejecutan atómicamente en una sola transacción, frustrando así el ataque antes mencionado.

Code of the withdrawTo() function

withdrawTo()

La función "withdrawTo()" es una función de bajo nivel que facilita la integración sin esfuerzo de la desenvoltura de tokens en los contratos inteligentes de otros proyectos. A diferencia de la función fulfillDeposit(), los usuarios pueden invocar de forma manual y segura "withdrawTo()".

La distinción entre la función "withdraw()", documentada anteriormente, y la función "withdrawTo()" es que esta última permite que los tokens de moneda estable desenvueltos se envíen a una dirección diferente a la del remitente de la transacción. Esta característica es particularmente beneficiosa cuando el remitente es otro contrato inteligente que busca devolver fondos a un usuario.

La función "withdrawTo()" toma dos parámetros: la dirección a la que se enviarán los tokens desenvueltos y la cantidad de tokens que se desenvolverán. La cantidad debe expresarse con 18 decimales.

Primero, calcula unWrappedAmount, que es la cantidad de tokens de moneda estable que se desenvolverán, ajustados a los decimales del token. Luego, la función ajusta la cantidad de entrada para eliminar cualquier error de redondeo que pueda ocurrir debido a la precisión decimal.

Después de esto, quema la cantidad especificada de tokens envueltos del saldo del remitente y transfiere los tokens de moneda estable desenvueltos a la dirección especificada por el parámetro "to".

Finalmente, verifica que el saldo resultante de tokens envueltos en el contrato, ajustado a 18 decimales, sea igual o mayor que el suministro total de tokens envueltos. Esta verificación del invariante del contrato en cada transacción garantiza la seguridad de los fondos del contrato.

Code of integration example

Ejemplo de Integración

En este ejemplo, demostramos cómo integrar tokens envueltos de W-Project en un contrato inteligente de prueba. El código presenta dos funciones, "wrapUserDeposit()" y "unwrapUserWithdrawal()", que representan las dos interacciones principales que un usuario puede tener con el contrato: depositar (envolver) y retirar (desenvolver).

Es importante tener en cuenta que el segundo paso en ambas funciones, donde los decimales del parámetro de cantidad se ajustan a 18, depende de cómo la interfaz de usuario (UI) envía la cantidad a este contrato. Si la interfaz de usuario siempre usa 18 decimales, es posible que este ajuste no sea necesario. Por otro lado, si la interfaz de usuario usa la cantidad de decimales definidos por el token para envolver, entonces este ajuste se vuelve relevante.

En la función "wrapUserDeposit()", el contrato primero transfiere los tokens del usuario desde la dirección del usuario al contrato de token envuelto, evitando la necesidad de enviar tokens primero a este contrato. A continuación, calcula wAmount, que es la cantidad a envolver, ajustada a 18 decimales. Por último, llama a "fulfillDeposit()" en el contrato de token envuelto, acuñando la cantidad equivalente de tokens envueltos para el contrato.

La función "unwrapUserWithdrawal()" es similar. Comienza calculando wAmount, ajustando a 18 decimales si es necesario. Luego llama a "withdrawTo()" en el contrato de token envuelto, que desenvuelve los tokens y transfiere los tokens subyacentes al usuario.

Soporte de comisión por transferencia

Aprovechando este patrón de codificación, también es posible crear ganchos para contratos inteligentes de W-Project que admitan tokens que tengan implementada una comisión por transferencia, simplemente aumentando la cantidad del token enviado en comparación con la cantidad que se desea envolver, o reducir la cantidad que se quiere desenvolver en el importe de la comisión.