<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Andrés Orozco </title>
    <description>The latest articles on Forem by Andrés Orozco  (@moonify).</description>
    <link>https://forem.com/moonify</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F859649%2Fc8d4968c-d4d1-4ed0-99e7-26b9f9f3b6a2.png</url>
      <title>Forem: Andrés Orozco </title>
      <link>https://forem.com/moonify</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/moonify"/>
    <language>en</language>
    <item>
      <title>Crear fácilmente tokens ERC20</title>
      <dc:creator>Andrés Orozco </dc:creator>
      <pubDate>Mon, 09 May 2022 03:43:54 +0000</pubDate>
      <link>https://forem.com/moonify/crear-facilmente-tokens-erc20-25il</link>
      <guid>https://forem.com/moonify/crear-facilmente-tokens-erc20-25il</guid>
      <description>&lt;p&gt;Apenas voy unos meses aprendiendo de "Blockchain Development" y uno de sus temas apasionantes son los tokens. No voy a ahondar en detalle como estos funcionan, sus varios estándares etc. Esto queda de tarea para el lector, sin embargo, si haré un repaso de como crear un token con el estándar ERC20 de una forma muy sencilla. Antes que nada, si no deseas leer, también dejo un video con toda la guía. &lt;br&gt;
&lt;a href="http://www.youtube.com/watch?v=gk_EXjq6kxY"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mZEa04Mr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://img.youtube.com/vi/gk_EXjq6kxY/0.jpg" alt="IMAGE ALT TEXT" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para este proyecto estaremos usando OpenZepellin. OpenZepellin tiene una serie de productos para crear y manejar contratos, pero en este caso en concreto estaremos usando su librería para crear contratos de manera fácil y segura. La ventaja de OpenZepellin es que este ya tiene implementado distintos estándares como el ERC20 (Fungible Tokens) y ERC721 (NFTs) esto nos ayuda a ahorrar tiempo de desarrollo y nos provee de seguridad para nuestro contrato.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pre-Requisitos
&lt;/h2&gt;

&lt;p&gt;Tanto &lt;a href="https://openzeppelin.com/"&gt;OpenZepellin&lt;/a&gt; como el framework que usaremos para realizar el deploy del contrato (&lt;a href="https://www.trufflesuite.com/"&gt;Truffle&lt;/a&gt;), están construidos con JavaScript por lo que necesitaremos de &lt;a href="https://nodejs.org/en/download/package-manager/"&gt;Node&lt;/a&gt; para este proyecto. Una vez hayas instalado node abriremos un terminal y escribimos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node --version&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Si la instalación ha sido correcta el comando nos lanzara nuestra versión de node, ahora podremos usar npm (Node Package Manager) para instalar los paquetes necesarios. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.trufflesuite.com/"&gt;Truffle&lt;/a&gt; es un framework que nos brinda varias herramientas para manejar nuestros contratos, en este caso lo usaremos para hacer el deploy de nuestro contrato a una red de pruebas:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install truffle -g&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ahora crearemos nuestra carpeta del proyecto, puedes ponerle el nombre que desees, por ejemplo crear la carpeta test.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora usando el terminal, entraremos en esta carpeta&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y correremos el comando &lt;br&gt;
&lt;code&gt;truffle init&lt;/code&gt; &lt;br&gt;
En el caso de que nos de error, podemos intentar correrlo con el comando &lt;code&gt;npx truffle init&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Este comando creara la jerarquía de directorios necesarios para crear nuestro token. &lt;br&gt;
 Finalmente usaremos npm para instalar OpenZepellin&lt;br&gt;
&lt;code&gt;npm install @openzeppelin/contracts&lt;/code&gt;&lt;br&gt;
Muy bien ahora si ya tenemos todo listo para empezar a crear nuestro token.&lt;/p&gt;
&lt;h2&gt;
  
  
  Entendiendo OpenZepellin
&lt;/h2&gt;

&lt;p&gt;OpenZeppelin nos provee de varios contratos ya implementados, por ejemplo el contrato ERC20 ya tiene implementado el estándar ERC20 para construir nuestro contrato. Además de esto tenemos extensiones para añadir nuevas características a nuestro contrato. &lt;/p&gt;
&lt;h3&gt;
  
  
  ERC20Burnable
&lt;/h3&gt;

&lt;p&gt;Nos permite añadir la opción de quemar tokens tanto de nuestra wallet como de la wallet de otros, esto lo puede hacer tanto el dueño de los tokens o aquellos que tengan el permiso, lo mas común es que el owner del contrato tenga estos permisos. &lt;/p&gt;
&lt;h3&gt;
  
  
  ERC20Capped
&lt;/h3&gt;

&lt;p&gt;Nos permite añadir un límite a la cantidad existentes de tokens. &lt;/p&gt;
&lt;h3&gt;
  
  
  ERC20Pausable
&lt;/h3&gt;

&lt;p&gt;Nos permite añadir la opción de pausar tanto las transferencias, como el minting y el quemado de los tokens. &lt;/p&gt;
&lt;h3&gt;
  
  
  ERC20Snapshot
&lt;/h3&gt;

&lt;p&gt;Nos permite implementar mecanismos de snapshot. Cuando creamos la snapshot los balances y el suministro total (total supply) son guardados para que puedan ser accedidos en futuro. &lt;/p&gt;
&lt;h3&gt;
  
  
  ERC20Permit
&lt;/h3&gt;

&lt;p&gt;Con esta extensión podemos implementar permisos para otras cuentas, por ejemplo para crear varios roles y a que funciones tienen acceso estos roles. &lt;/p&gt;

&lt;p&gt;Además de estas extensiones mencionadas, existen otras, que al momento de la creación de este post, siguen estando en versiones de prueba. &lt;/p&gt;
&lt;h2&gt;
  
  
  Creación del token
&lt;/h2&gt;

&lt;p&gt;OpenZepellin recientemente añadió una nueva herramienta a su suite, se trata de &lt;a href="https://wizard.openzeppelin.com/"&gt;Wizzard&lt;/a&gt; esta herramienta nos sirve como un esquema de partida para la creación de tokens mas complejos.&lt;br&gt;
En mi caso el contrato que estaremos creando para nuestro token tendrá la propiedad de crear nuevos tokens (mintable), quemar tokens (burnable) y pausar tanto las transferencias, como la creación y quemado de los tokens (pausable). No nos olvidemos, también, de poner el nombre y símbolo de nuestro token, ademas de una cantidad pre-acuñada (pre-mint) para el deployer del contrato. Con todas estas configuraciones el Wizzard nos generara un código parecido a este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight solidity"&gt;&lt;code&gt;&lt;span class="c1"&gt;// SPDX-License-Identifier: MIT
&lt;/span&gt;&lt;span class="k"&gt;pragma&lt;/span&gt; &lt;span class="n"&gt;solidity&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"@openzeppelin/contracts/token/ERC20/ERC20.sol"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"@openzeppelin/contracts/security/Pausable.sol"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"@openzeppelin/contracts/access/Ownable.sol"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;contract&lt;/span&gt; &lt;span class="n"&gt;Moonify&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;ERC20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ERC20Burnable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pausable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Ownable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;ERC20&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Moonify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"MFY"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_mint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;onlyOwner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_pause&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;unpause&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;onlyOwner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_unpause&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;mint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;address&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;onlyOwner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_mint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;_beforeTokenTransfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;address&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;address&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;uint256&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;internal&lt;/span&gt;
        &lt;span class="n"&gt;whenNotPaused&lt;/span&gt;
        &lt;span class="k"&gt;override&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_beforeTokenTransfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copiamos el código del Wizzard y creamos un nuevo archivo dentro de la carpeta &lt;strong&gt;contracts&lt;/strong&gt; que fue creada por truffle. En mi caso el nombre del archivo es Moonify.sol (extensión de solidity) y dentro de este archivo pegamos el código de nuestro contrato. &lt;/p&gt;

&lt;p&gt;Listo con esto quedaría nuestro contrato terminado, a primera vista parece un contrato muy simple. Pero en realidad contiene varias funcionalidades, con las cuales no solo podemos hacer transferencias de nuestro token, si no también, crear más tokens o quemar tokens. &lt;br&gt;
Nota: Si deseas conocer a mas profundidad que hace cada linea del contrato te recomiendo ver mi video tutorial.&lt;/p&gt;
&lt;h2&gt;
  
  
  Deployment del contrato
&lt;/h2&gt;

&lt;p&gt;Ahora que nuestro contrato esta terminado, nos queda hacer el deploy del contrato para que podamos empezar a hacer uso de nuestro token. En este caso haremos el deploy sobre una test network, ya que en este tipo de redes no necesitaremos de ETHER "real" para pagar los costos de gas, en este caso, estaremos usando la red de Kovan. &lt;br&gt;
Lo primero que haremos es crear una cuenta en &lt;a href="https://infura.io/"&gt;infura&lt;/a&gt;. Una vez creada la cuenta, nos dirigimos a create new project, le ponemos cualquier nombre y lo importante aquí es copiar el endpoint que empieza por https.  &lt;/p&gt;

&lt;p&gt;Lo siguiente es crear una wallet en kovan usando metamask, la creacion de la wallet en metamask es sencillo, solo recuerda que una vez tengas tu wallet poner como red Kovan. &lt;br&gt;
IMAGEN&lt;/p&gt;

&lt;p&gt;Finalmente, necesitamos es conseguir ETHER, recordando que este ETHER no tiene valor real ya que estamos en una test network. Para esto vamos a la siguiente página: &lt;a href="https://faucet.kovan.network/"&gt;https://faucet.kovan.network/&lt;/a&gt; pegamos nuestra llaves pública y esperamos unos minutos hasta que la transacción haya sido verificada.  &lt;/p&gt;
&lt;h2&gt;
  
  
  Configurar Deployment
&lt;/h2&gt;

&lt;p&gt;Estamos llegando a la parte final, ahora ya solo nos resta configurar el deployment de nuestro contrato, para esto tendremos que instalar una libreria extra con npm, para esto en una terminal escribimos el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; hdwallet-provider 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora si abrimos nuestro archivo de configuración &lt;strong&gt;truffle-config.js&lt;/strong&gt; con nuestro editor de texto de preferencia y vamos a crear las siguientes variables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;HDWalletProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@truffle/hdwallet-provider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;privateKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TU_LLAVES_PRIVADA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endpointUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;INFURA_ENDPOINT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="cm"&gt;/**
* Use this file to configure your truffle project. It's seeded with some...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ahora nos dirigimos a la parte de networks en el archivo de configuración y vamos a definir la red de Kovan&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;kovan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;HDWalletProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="c1"&gt;//private keys array&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;privateKey&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="c1"&gt;//url to ethereum node&lt;/span&gt;
      &lt;span class="nx"&gt;endpointUrl&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;gas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;gasPrice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25000000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;network_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora necesitamos poner que versión del compilador de solidity deseamos usar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Configure your compilers&lt;/span&gt;
  &lt;span class="nx"&gt;compilers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;solc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;^0.8.1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// Fetch exact version from solc-bin (default: truffle's version)&lt;/span&gt;
      &lt;span class="c1"&gt;// docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)&lt;/span&gt;
      &lt;span class="c1"&gt;// settings: {          // See the solidity docs for advice about optimization and evmVersion&lt;/span&gt;
      &lt;span class="c1"&gt;//  optimizer: {&lt;/span&gt;
      &lt;span class="c1"&gt;//    enabled: false,&lt;/span&gt;
      &lt;span class="c1"&gt;//    runs: 200&lt;/span&gt;
      &lt;span class="c1"&gt;//  },&lt;/span&gt;
      &lt;span class="c1"&gt;//  evmVersion: "byzantium"&lt;/span&gt;
      &lt;span class="c1"&gt;// }&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora entraremos a la carpeta de migrations y creamos un archivo con el nombre de &lt;strong&gt;2_deploy.js&lt;/strong&gt; y pegamos el siguiente código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contrato&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Moonify&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//require(nombreContrato)&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deployer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;deployer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contrato&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto hemos finalizado la configuración para el deploy del contrato, se que parece tedioso, pero es un proceso que lo repetirás tanto que ya se hará natural.&lt;/p&gt;

&lt;p&gt;Listo! ahora si estamos listos para hacer el deploy de nuestro contrato. Primero vamos a compilar el contrato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;truffle&lt;/span&gt; &lt;span class="nx"&gt;compile&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finalmente vamos a hacer el deploy con:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;truffle&lt;/span&gt; &lt;span class="nx"&gt;migrate&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="nx"&gt;kovan&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si todo ha salido bien has hecho el deploy de tu token ERC20 a la red de Kovan. Felicidades! Recuerda copiar la address de tu token para que la puedas añadir a metamask.&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>tokens</category>
      <category>openzepellin</category>
    </item>
    <item>
      <title>Interactuar con contratos en Ethereum</title>
      <dc:creator>Andrés Orozco </dc:creator>
      <pubDate>Mon, 09 May 2022 03:37:00 +0000</pubDate>
      <link>https://forem.com/moonify/interactuar-con-contratos-en-ethereum-19m6</link>
      <guid>https://forem.com/moonify/interactuar-con-contratos-en-ethereum-19m6</guid>
      <description>&lt;p&gt;En el blog &lt;a href="https://dev.to/moonify/crear-facilmente-tokens-erc20-25il"&gt;anterior&lt;/a&gt; describí como crear un token ERC20 de forma sencilla usando OpenZepellin. Este contrato nos brindaba la posibilidad de acuñar tokens (mint), quemar tokens (burnable) y pausar la transferencia de los tokens (pausable), sin embargo aun no mostré como se puede llamar a las funciones del contrato con estas propiedades. Hoy aprenderemos a hacerlo.&lt;/p&gt;

&lt;p&gt;Antes de empezar debemos entender la diferencia entre una call y una transacción. &lt;/p&gt;

&lt;h2&gt;
  
  
  Call
&lt;/h2&gt;

&lt;p&gt;Cuando hacemos una call ejecutamos código que la blockchain, pero esta ejecución no cambiara ningún dato en la blockchain. Por lo tanto las calls no cuestan ETH, es decir que el principal uso de las calls es para leer datos de la blockchain. En general las calls nos retornan un valor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transacción
&lt;/h2&gt;

&lt;p&gt;Por otro lado, las transacciones cambian el estado de la blockchain, es decir, escriben (o cambian) datos de la red. Por lo tanto; las transacciones tienen un costo de gas. En general las transacciones nos retornan una id de transacción. &lt;/p&gt;

&lt;p&gt;Es vital conocer esta diferencia tanto cuando programamos contratos inteligentes como cuando queremos obtener o escribir datos en la blockchain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactuar con contratos usando truffle.
&lt;/h2&gt;

&lt;p&gt;Truffle nos brinda la posibilidad de interactuar con los contratos a través de sus abstracciones. Podemos crear estas abstracciones tanto en la consola de desarrollo como creando scripts usando JavaScript.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consola
&lt;/h3&gt;

&lt;p&gt;Primeramente necesitamos ingresar a la consola de desarrollador espécificando la red en la que hicimos el deploy del contrato.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;truffle console &lt;span class="nt"&gt;--network&lt;/span&gt; kovan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La consola de truffle nos permite interactuar con nuestros contratos usando JavaScript. Ahora necesitamos obtener la abstracción de nuestro contrato, si seguiste el tutorial anterior recordaras que el nombre del contrato de mi token ERC20 es Moonify.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;truffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;kovan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Moonify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deployed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora por ejemplo, si llamamos a nuestra variable &lt;strong&gt;instance&lt;/strong&gt; observaremos como nos devuelve la abstracción de nuestro contrato.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;truffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;kovan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;instance&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podrás notar la abstracción del contrato contiene tanto las funciones, variables, eventos y address de nuestro token. Con la abstracción lista ya podemos empezar a usar las funciones de nuestro contrato. &lt;/p&gt;

&lt;p&gt;Probemos pausar las transferencias de nuestro token, para esto habiamos creado una función pause que no recibe ningún parametro pero que solo puede ser llamada por el dueño del contrato.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight solidity"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;onlyOwner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_pause&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para llamarla basta con escribir el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;truffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;kovan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora por ejemplo si queremos enviar nuestros tokens a otra cuenta usando metamask, veremos que nuestra transacción tendrá un error. De hecho, podemos revisar nuestra transacción fallida en Etherscan y observar que la transacción ha sido revertida y nuestro ETH devuelto. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sPNiHj8Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/05nv23cvplte3rj5mvkj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sPNiHj8Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/05nv23cvplte3rj5mvkj.png" alt="Image description" width="880" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por supuesto, para volver a activar las transacciones de nuestro token basta con correr:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;truffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;kovan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;unpause&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como habrás notado hemos llamado solo a funciones que no requiren de parámetros. Nuestra función &lt;strong&gt;mint&lt;/strong&gt;, por ejemplo, require de una address y de una cantidad. Esto tranquilamente lo podríamos hacer desde la consola, pero esto trae muchos incovenientes como andar copiando y pegando distintas address, como también, que una vez cerrado la consola tendriamos que repetir todo este procedimiento. ¿Solución? Crear un script y ejectuarlo con Truffle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scripts
&lt;/h3&gt;

&lt;p&gt;Como acabo de mencionar, los scripts nos traen muchas ventajas. Empezemos creado una carpeta llamada scripts, donde hubicaremos los scripts para ser reutilizados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;scripts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora creemos rápidamente un script que nos permita acuñar tokens para una cuenta. El nombre del script será &lt;strong&gt;mint.js&lt;/strong&gt;, recuerda guardarlo dentro de la carpeta de scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;web3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;web3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;cantidad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x8A7320D4E9bcA258E73f8ec61F4e4149f22f6F96&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Obtenemos la abstracción del contrato&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contrato&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;artifacts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Moonify&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;deployed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;// Convertimos la cantidad a acuñar en Big Number&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;web3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toBN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cantidad&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;// Llamamos a nuestra función mint con una address y valor a acuñar&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contrato&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El script es bastante sencillo y es una buena base para crear otros scripts para otras funciones. De todas formas he dejado comentarios explicando las lineas mas importantes. &lt;/p&gt;

&lt;p&gt;Finalmente, para ejectuar nuestro script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;truffle &lt;span class="nb"&gt;exec &lt;/span&gt;mint.js &lt;span class="nt"&gt;--network&lt;/span&gt; kovan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si todo ha salido bien habremos acuñado 100 tokens a la cuenta especificada en la variable address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Como lo acabamos de observar, interactuar con nuestros contrato es bastante sencillo usando truffle. Cabe aclarar que hemos interactuado con un Token creado por nosotros. Para interactuar con contratos de terceros necesitaremos la ABI del contrato y hacer uso del paquete &lt;a href="https://www.npmjs.com/package/@truffle/contract"&gt;@truffle/contract&lt;/a&gt;. También te invito a estudiar los contratos de OpenZepellin para que puedas llamar a muchas otras funciones, por ejemplo, &lt;strong&gt;owner()&lt;/strong&gt; es una call que nos permite saber el address del dueño del contrato.&lt;/p&gt;

</description>
      <category>espanol</category>
      <category>ethereum</category>
      <category>truffle</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Mejora tu productividad como desarrollador: Window Managers</title>
      <dc:creator>Andrés Orozco </dc:creator>
      <pubDate>Mon, 09 May 2022 03:26:00 +0000</pubDate>
      <link>https://forem.com/moonify/mejora-tu-productividad-como-desarrollador-window-managers-555c</link>
      <guid>https://forem.com/moonify/mejora-tu-productividad-como-desarrollador-window-managers-555c</guid>
      <description>&lt;p&gt;Probablemente nunca habías escuchado del termino window manger. Y es que la gran mayoría de sistemas operativos y distribuciones de linux usan por defecto desktop enviroments (entornos de escritorio). Estos entornos de escritorio manejan las ventanas apilándolas una encima de otra y a estas ventanas apiladas las podemos mover, cambiar su tamaño, minimizarlas, etc. Es decir, todo el tiempo trabajamos con ventanas flotantes. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qTaxZSQV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ghje8z2y9t6ukzwt0ls.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qTaxZSQV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ghje8z2y9t6ukzwt0ls.png" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué son?
&lt;/h2&gt;

&lt;p&gt;Por otro lado, como su nombre lo dice, los window managers se dedican exclusivamente al manejo de ventanas y hacen este trabajo de manera diferente. Las ventanas que abrimos son ubicadas de manera automática siguiendo un patrón predefinido, siendo el patrón de tiling window el preferido por muchos. Pero, además de esto, los window managers tienen otras ventajas sobre los típicos entornos de escritorio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H0V4uhhx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ztpwmgen54gs3vvqll8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H0V4uhhx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9ztpwmgen54gs3vvqll8.png" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ventajas de los window managers
&lt;/h2&gt;

&lt;p&gt;Los window managers tienen muchas ventajas sobre su contra parte, aquí mencionare algunas de esas ventajas: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Recursos:&lt;/strong&gt; Al tener control total sobre nuestro gestor de ventanas, este no carga programas innecesarios de fondo. Esto se traduce a un consumo de recursos muy reducido, tanto es así, que los sistemas que ocupan que ocupan window managers no llegan ni a consumir 500MiB o menos. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debloated:&lt;/strong&gt; Los entornos de escritorio vienen con una gran cantidad de aplicaciones adicionales para que puedan funcionar de manera correcta. Programas que muchas veces ni usaremos. Mientras, los window managers no vienen con programas adicionales instalados, quitándonos mucha basura de encima. Es decir, se manejan de manera minimalista. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilidad para trabajar con los espacios de trabajo:&lt;/strong&gt; A pesar de que los entornos de escritorio si nos brindan la opción de crear distintos espacios de trabajo, raramente los usamos ya que no les encontramos motivo alguno. En cambio, los window manager dependen mucho de la creación de distintos espacios de trabajo. Esto nos permite tener todo mas organizado y controlado. Por ejemplo, podemos tener un espacio de trabajo solo para tareas en el navegador, otro para terminales, otro para nuestro IDE, etc. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Programables:&lt;/strong&gt; Tenemos entornos de escritorio a los que poco se les puede personalizar como el entorno de MacOS o Windows, hasta otros con alto nivel de personalización como Gnome o KDE. Pero los window managers llevan esto a otro nivel, ya que podemos programar cada parte de nuestro window manager para agregar cualquier funcionalidad que literalmente nosotros queramos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evitamos el uso del mouse:&lt;/strong&gt; Seguramente en alguna ocasión te topaste con algún entusiasta de Vim y te explicó que una de sus ventajas es que nunca debes usar el mouse, ya que evitamos perder tiempo con el constante movimiento que hacemos al obtener el mouse. Pues los window managers apuntan a esta misma filosofía. Todo, absolutamente todo, lo podemos hacer con atajos de teclado, haciendo que usemos el mouse la menor cantidad de tiempo posible. Por ejemplo, en awesomeWM nos movemos con las mismas teclas con las que navegamos en Vim (h,j,k y l).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Desventajas
&lt;/h2&gt;

&lt;p&gt;Por supuesto todo lo bueno viene con un costo a pagar. Y es que los window manager tienen unas pequeñas desventajas que tal vez nos desmotiven a intentar usarlos, pero si te gusta aprender y tienes el tiempo para hacerlo estas desventajas desaparecerán con el tiempo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Alta curva de aprendizaje:&lt;/strong&gt; Alguna vez intentaste aprender vim y terminaste frustrado por su curva de aprendizaje? Pues con los window managers puede ser parecido, a pesar de que muchos de ellos vienen ya con una configuración inicial, configurarlos a nuestra medida implica aprender el lenguaje de programación en el que estos son programados, además de su API para poder entender que podemos y no podemos hacer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memorizar los atajos de teclado:&lt;/strong&gt; Cuando uno esta acostumbrado a usar el mouse como su herramienta principal, empezar a aprender atajos de teclado parece algo tedioso. Pero creeme que aprender atajos de teclado vale la pena, ya sean atajos de tu gestor de ventanas o aplicaciones, invierte algo de tiempo en aprenderlos. El tiempo que invertimos en aprender atajos de teclado lo recuperaremos en un futuro. Ya que tareas que costaban unos cuantos clicks, ahora las haremos con un solo atajo de teclado.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Como puedes observar son pocas las desventajas, desventajas que con el paso del tiempo son reducidas. Pero tengo ser sincero en este aspecto, si no posees del tiempo para configurar y aprender a usar un gestor de ventanas lo mejor es que consideres no intentarlo. Pero si te gusta aprender nuevas herramientas, te preocupa la organización y productividad de tu espacio de trabajo, y sobre todo tienes el tiempo para llevar el gestor de ventanas a tu medida, te recomiendo que lo intentes. Es algo de lo que no te arrepentirás, ya que este cambia totalmente la manera en la que usas tu computador, y una vez lo domines no hay vuelta atrás.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos
&lt;/h2&gt;

&lt;p&gt;Te dejo unos cuantos recursos para que puedas empezar a probar con window managers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/fosslife/awesome-ricing#window-managers"&gt;Una lista de window managers para todos los OS&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/unixporn/"&gt;Configuraciones y soporte para distintos window managers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://awesomewm.org/"&gt;Window Manager de preferencia: AwesomeWM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JavaCafe01/awedots"&gt;Configuración que uso para AwesomeWM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Obzf9ppODJU"&gt;Guía de Window Managers (Inglés)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>espanol</category>
      <category>windowmanagers</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
