Descubre las funciones claves del contrato inteligente tipo DAO en Aurora utilizando Solidity y Hardhat

NEAR_ES
7 min readMay 19, 2023

--

Autor: Juan Peña. Publicado 19/ Mayo /2023

En la guía anterior, empezamos a construir este Smart Contract, en ese artículo, explicamos qué son los modificadores, y de paso creamos todos los necesarios para darle forma a este Smart Contract, a continuación te dejamos el enlace para que lo repases:

Ha llegado el tiempo de ver las funciones.

Primera Función: La función “crearDao” es pública, recibe el parámetro “otrosPropietarios” el cual es una lista de direcciones de wallets (“address[]”) como “calldata” (En la primera guía comentamos que esto reduce el costo de la transacción haciendo uso más eficiente de la memoria.) Si recordamos los modificadores de la guía anterior nos daremos cuenta que estamos usando el modificador, que revisa qué sean menos de 8 direcciones en total, contando la que llama a la función, y revisa que no haya duplicados.

Dentro de la función creamos una lista a la que no asignamos valor todavía, pero le asignamos tamaño fijo, dicho tamaño fijo será la cantidad de valores que hayamos ingresado como parámetros más uno (El que llama la función), usamos la palabra reservada memory para alojar por ahora en la memoria temporal y no en la blockchain permanentemente.

Creamos una variable “idDeDao” y le asignamos el valor de “siguienteIdDeDao”, incrementamos “siguienteIdDeDao” cada vez que creamos una nueva DAO. Luego, en un ciclo “for” recorremos la lista de propietarios y agregamos cada dirección a la lista de DAOs del usuario correspondiente a través del mapeo “usuarioDaos”.

Dentro del ciclo “for”, también agregamos cada dirección de la lista “otrosPropietarios” a la lista “propietarios”, excepto la última dirección, la cual ya se agregó al principio de la función.

Una vez que hemos terminado de agregar las direcciones de los propietarios a la lista y actualizar los mapeos, asignamos la lista de “propietarios” a la propiedad “propietarios” de la nueva DAO que estamos creando en el mapping “daos”.

Finalmente, incrementamos el valor de “siguienteIdDeDao” y emitimos un evento “CreacionDeDao” con los detalles de la nueva DAO creada.

La función “peticionDeRetiro” es pública y recibe dos parámetros: “idDeDao” de la cual se va a retirar la cantidad y la “cantidad” a retirar. También hace uso de dos modificadores: “propietarioDeDao”, el cual verifica que el usuario que llama a la función sea propietario de la DAO especificada, y “cuentaConFondosSuficientes”, el cual verifica que la DAO tenga suficientes fondos para realizar el retiro.

Creamos una variable llamada “idDeRetiro” y le asignamos el valor de “siguienteIdDeRetiro”. Luego, accedemos a la estructura PeticionDeRetiro almacenada en el mapeo “peticionesDeRetiro” de la DAO especificada por el idDeDao y la almacenamos en la variable “peticionDeRetiroActual”.

Asignamos el valor de la dirección del usuario que llama la función a la propiedad “usuario” de “peticionDeRetiroActual” y asignamos la cantidad de tokens a retirar a la propiedad “cantidad”.

Incrementamos “siguienteIdDeRetiro” para que el próximo retiro tenga un ID distinto y emitimos un evento “PeticionesDeRetiro” con la dirección del usuario que realizó la petición, el ID de la DAO, el ID de la petición de retiro, la cantidad de tokens y la marca de tiempo actual.

La función “aprobarPeticionDeRetiro” es pública y recibe dos parámetros de tipo uint256: “idDeDao” e “idDeRetiro”. Utilizamos el modificador “propietarioDeDao” para asegurarnos de que la llamada provenga de un propietario válido de la DAO con el ID especificado.

Luego, definimos una variable de tipo “PeticionDeRetiro” y le asignamos la correspondiente solicitud de retiro del DAO y el ID de retiro especificados. La variable se declara con el tipo “storage”, lo que significa que cualquier cambio realizado en ella afectará directamente los datos almacenados en la blockchain.

A continuación, aprobamos la solicitud de retiro para el propietario que llama a la función, actualizando la propiedad “propietariosAprobados” de la variable “peticionDeRetiroActual”.

Incrementamos el contador de aprobaciones en la variable “peticionDeRetiroActual” y verificamos si se ha alcanzado la cantidad necesaria de aprobaciones para aprobar la solicitud de retiro. Si es así, establecemos el valor de la propiedad “aprobado” de “peticionDeRetiroActual” en “true”. La cantidad necesaria de aprobaciones es (propietarios.length / 2) + 1.

La función “retirar” es pública y recibe dos parámetros de tipo uint256: “idDeDao” e “idDeRetiro”. El modificador “propietarioDeDao” se utiliza para garantizar que el mensaje provenga de un propietario válido de la DAO con el ID especificado.

Luego, se define una variable de tipo “PeticionDeRetiro” y se le asigna la correspondiente peticionDeRetiro del DAO y el ID de retiro especificados. La variable es de tipo “storage”, lo que significa que los cambios realizados en ella afectarán directamente a los datos almacenados en la blockchain.

Se define una variable “cantidad” y se le asigna el valor de la propiedad “cantidad” de “peticionDeRetiroActual”.

Se verifica que la DAO tenga suficientes fondos para cubrir la cantidad solicitada en la petición de retiro. Si la DAO no tiene suficientes fondos, se lanzará un mensaje de error.

Se resta la cantidad retirada del balance de la DAO y se elimina la petición de retiro de la lista de peticiones de retiro de la DAO.

Se utiliza la función “payable” para enviar la cantidad retirada al usuario que realizó la solicitud de retiro. Se emite un evento “Retiro” con el ID de retiro y el timestamp del bloque actual. Si el envío de dinero es exitoso, no se produce ningún efecto secundario. Si no se pudo enviar el dinero, se lanzará un mensaje de error.

La función “depositar” es pública y recibe un parámetro de tipo uint256 llamado “idDeDao”. Verificamos que el valor enviado con la transacción sea mayor que cero y luego sumamos el valor al balance del DAO correspondiente utilizando el operador “+=”. Antes de hacerlo, verificamos que la suma no cause un desbordamiento por número grande. Finalmente, emitimos un evento “Deposito” con los detalles de la transacción.

La función “obtenerBalanceDeDao” es pública y recibe un parámetro de tipo uint256 llamado “idDeDao”. Retorna el balance actual del DAO con el ID especificado.

La función “obtenerDaosDeUsuario” es pública y recibe un parámetro de tipo “address” llamado “usuario”. Retorna un arreglo de uint256 con los ID de los DAOs a los que pertenece el usuario especificado.

La función “obtenerPropietariosDeDao” es pública y recibe un parámetro de tipo uint256 llamado “idDeDao”. Retorna un arreglo de “address” con las direcciones de los propietarios del DAO con el ID especificado.

La función “obtenerAprobacionesDePeticionDeRetiro” es pública y recibe dos parámetros de tipo uint256: “idDeDao” e “idDeRetiro”. Retorna la cantidad de aprobaciones que tiene la solicitud de retiro con el ID especificado en el DAO con el ID especificado.

Con esto concluye nuestra entrega para entender las funciones del contrato inteligente tipo DAO. Mantente atento a nuestra próxima entrega sobre el tema, si tienes una duda, deja tu comentario, que con gusto te respondemos.

Renuncia de responsabilidad: La información proporcionada es solo con fines educativos y no debe interpretarse como una recomendación o asesoramiento financiero para realizar cualquier tipo de inversión.

Sigue las cuentas de Aurora y la comunidad de Aurora en Español

Twitter oficial de Aurora: @auroraisnear

Twitter oficial de Aurora Venezuela: @venezuelaaurora

Canal YouTube Mundo Aurora: @mundo_aurora

NEAR Social: mundoaurora.near

Telegram oficial de Aurora Venezuela: @venezuelaaurora

Telegram canal de Noticias Aurora en Español

--

--

NEAR_ES
NEAR_ES

Written by NEAR_ES

Espacio informativo y educativo sobre NEAR Protocol, Aurora, web3 y blockchain en Español para toda la comunidad

No responses yet