<?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>DEV Community: Robert </title>
    <description>The latest articles on DEV Community by Robert  (@rtagl).</description>
    <link>https://dev.to/rtagl</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F460249%2Fece81426-9bec-4cef-b6e8-3fa748393bd2.png</url>
      <title>DEV Community: Robert </title>
      <link>https://dev.to/rtagl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rtagl"/>
    <language>en</language>
    <item>
      <title>How to use libvmaf_cuda on Windows: an easy-to-follow guide (WSL2 + Docker + NVIDIA)</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Wed, 16 Sep 2026 19:21:17 +0000</pubDate>
      <link>https://dev.to/rtagl/-how-to-use-libvmafcuda-on-windows-an-easy-to-follow-guide-wsl2-docker-nvidia-59mc</link>
      <guid>https://dev.to/rtagl/-how-to-use-libvmafcuda-on-windows-an-easy-to-follow-guide-wsl2-docker-nvidia-59mc</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Running GPU-accelerated VMAF on Windows is surprisingly painful. After spending hours fighting broken builds and undocumented errors, the only reliable path I found is &lt;strong&gt;WSL2 + Docker Desktop + NVIDIA Container Toolkit + a CUDA-enabled FFmpeg&lt;/strong&gt;. This guide walks you through the whole setup using the &lt;a href="https://github.com/gdavila/easyVmaf" rel="noopener noreferrer"&gt;easyVmaf&lt;/a&gt; project, so you can skip the trial-and-error I went through.&lt;/p&gt;

&lt;p&gt;This guide uses &lt;strong&gt;easyVmaf&lt;/strong&gt;, a project that ships a &lt;code&gt;Dockerfile.cuda&lt;/code&gt; specifically built for this purpose. We'll run it inside WSL2, with Docker Desktop and the NVIDIA Container Toolkit handling the GPU passthrough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result:&lt;/strong&gt; VMAF running at ~15x real-time speed on an RTX 3060 Mobile. A 46-minute video gets analyzed in about 3 minutes. On CPU, the same task would take like an hour.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;AMD and Intel GPUs will not work with this guide.&lt;/strong&gt; &lt;code&gt;libvmaf_cuda&lt;/code&gt; is NVIDIA-exclusive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The Problem&lt;/li&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;
Part 1 — Setting up the environment

&lt;ul&gt;
&lt;li&gt;1.1 Install WSL2&lt;/li&gt;
&lt;li&gt;1.2 Accessing Windows drives from WSL&lt;/li&gt;
&lt;li&gt;1.3 Verify GPU access from WSL&lt;/li&gt;
&lt;li&gt;1.4 Install Docker Desktop&lt;/li&gt;
&lt;li&gt;1.5 Install the NVIDIA Container Toolkit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Part 2 — Building the easyVmaf image

&lt;ul&gt;
&lt;li&gt;2.1 Clone the repository&lt;/li&gt;
&lt;li&gt;2.2 Critical fix: pin nv-codec-headers&lt;/li&gt;
&lt;li&gt;2.3 Build the image&lt;/li&gt;
&lt;li&gt;2.4 Verify the libvmaf_cuda filter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Part 3 — Running VMAF with GPU acceleration

&lt;ul&gt;
&lt;li&gt;3.1 capabilities=video&lt;/li&gt;
&lt;li&gt;3.2 Full analysis command&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Troubleshooting&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;li&gt;Let's Connect&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;If you've ever tried to calculate VMAF on Windows, you already know that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The standard &lt;code&gt;libvmaf&lt;/code&gt; filter works, but it runs on the &lt;strong&gt;CPU&lt;/strong&gt; (slow).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;libvmaf_cuda&lt;/code&gt; &lt;strong&gt;does not exist in any prebuilt Windows binary&lt;/strong&gt; (not in gyan.dev, not in BtbN, not anywhere &lt;em&gt;that I know&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Most information online is scattered, outdated, or simply missing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, make sure you have:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Minimum requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows 10 (version 2004+) or Windows 11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA GPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any CUDA-capable GPU (I'm using an RTX 3060 Mobile)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA drivers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Version 525+ (for CUDA 12.x) — &lt;a href="https://www.nvidia.com/Download/index.aspx" rel="noopener noreferrer"&gt;download here&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disk space&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~30 GB free (WSL + Docker + images)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16 GB recommended (WSL2 is memory-hungry)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Do not install NVIDIA drivers inside WSL.&lt;/strong&gt; WSL automatically uses the drivers from Windows. Installing Linux drivers inside WSL will break GPU passthrough.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Part 1 — Setting up the environment
&lt;/h2&gt;

&lt;p&gt;This part covers everything needed to get a working Linux + Docker + GPU stack: WSL2, Docker Desktop, and the NVIDIA Container Toolkit.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Install WSL2
&lt;/h3&gt;

&lt;p&gt;Open &lt;strong&gt;PowerShell as Administrator&lt;/strong&gt; and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;download and install WSL2 kernel&lt;/li&gt;
&lt;li&gt;install Ubuntu distro by default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Restart Windows&lt;/strong&gt; when prompted.&lt;/p&gt;

&lt;p&gt;After the restart, open PowerShell again and verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--verbose&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  NAME      STATE           VERSION
* Ubuntu    Running         2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure &lt;code&gt;VERSION&lt;/code&gt; is &lt;code&gt;2&lt;/code&gt;. If it says &lt;code&gt;1&lt;/code&gt;, upgrade with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--set-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Ubuntu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--set-default-version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Ubuntu update
&lt;/h4&gt;

&lt;p&gt;Open your Ubuntu terminal either by typing in PowerShell&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once in Ubuntu terminal enter:&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;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.2 Accessing Windows drives from WSL
&lt;/h3&gt;

&lt;p&gt;If you're new to Linux, one of the first things to understand is that WSL doesn't use &lt;code&gt;C:\&lt;/code&gt;, &lt;code&gt;D:\&lt;/code&gt;, etc. Instead, it mounts every Windows drive under &lt;code&gt;/mnt/&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Windows path&lt;/th&gt;
&lt;th&gt;WSL path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;C:\Users\YourName\Videos&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/mnt/c/Users/YourName/Videos&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;D:\Movies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/mnt/d/Movies&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;E:\Backups\2026&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/mnt/e/Backups/2026&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1.3 Verify GPU access from WSL
&lt;/h3&gt;

&lt;p&gt;if you already have installed NVIDIA drivers on Windows, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the &lt;code&gt;nvidia-smi&lt;/code&gt; table with your GPU listed. If it doesn't work, your Windows drivers are outdated or WSL isn't configured properly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Wed Sep 16 09:30:35 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 615.71.08              KMD Version: 616.92        CUDA UMD Version: 13.4     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|&lt;span class="o"&gt;=========================================&lt;/span&gt;+&lt;span class="o"&gt;========================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;|
|   0  NVIDIA GeForce RTX 3060 ...    On  |   00000000:01:00.0  On |                  N/A |
| N/A   55C    P8             14W /  115W |    1085MiB /   6144MiB |      6%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|&lt;span class="o"&gt;=========================================================================================&lt;/span&gt;|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.4 Install Docker Desktop
&lt;/h3&gt;

&lt;p&gt;Download Docker Desktop from: &lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;https://www.docker.com/products/docker-desktop/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During installation, make sure to check &lt;strong&gt;"Use WSL 2 instead of Hyper-V"&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configure WSL2 integration
&lt;/h4&gt;

&lt;p&gt;Once installed, open Docker Desktop and go to Settings &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgo2mb3uznao3j4f1k0a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgo2mb3uznao3j4f1k0a.png" alt="docker_desktop_settings" width="735" height="49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;General tab:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check &lt;strong&gt;Use the WSL 2 based engine&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Apply &amp;amp; Restart&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwqvj0mop2gt63j8nlgg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwqvj0mop2gt63j8nlgg9.png" alt="docker_desktop_WSL_integration_backend" width="800" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources → WSL Integration:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check &lt;strong&gt;Enable integration with my default WSL distro&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Turn on the Ubuntu toggle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fctaic7q9wphbrxpbaqex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fctaic7q9wphbrxpbaqex.png" alt="docker_desktop_WSL_integration" width="762" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources → Advanced (optional):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uncheck &lt;strong&gt;"Enable Resource Saver"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F78jcn5pqbixuvz85q0yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F78jcn5pqbixuvz85q0yw.png" alt="docker_desktop_settings_resources" width="578" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If "Resource Saver" is enabled, Docker will suspend WSL2 after inactivity, and you'll have to restart it manually.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Verify Docker works in WSL
&lt;/h4&gt;

&lt;p&gt;In your Ubuntu terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Docker version 27.3.1, build ce12230
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ If you get &lt;code&gt;var/run/docker.sock: connect: permission denied.&lt;/code&gt; jump to the Troubleshooting section.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1.5 Install the NVIDIA Container Toolkit
&lt;/h3&gt;

&lt;p&gt;This is the component that allows Docker containers to access the GPU.&lt;/p&gt;

&lt;h4&gt;
  
  
  Install
&lt;/h4&gt;

&lt;p&gt;In your WSL Ubuntu terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://nvidia.github.io/libnvidia-container/gpgkey | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/nvidia-container-toolkit.list

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nvidia-container-toolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Configure the Docker runtime
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nvidia-ctk runtime configure &lt;span class="nt"&gt;--runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INFO[0000] Config file does not exist; using empty config
INFO[0000] Wrote updated config to /etc/docker/daemon.json
INFO[0000] It is recommended that docker daemon be restarted.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Restart Docker
&lt;/h4&gt;

&lt;p&gt;Restart &lt;strong&gt;Docker Desktop&lt;/strong&gt; from Windows (either via the restart icon or by quitting and reopening it).&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify Docker can see the GPU
&lt;/h4&gt;

&lt;p&gt;Once Docker Desktop is running again, execute in your WSL terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt; all nvidia/cuda:12.3.2-base-ubuntu22.04 nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the &lt;code&gt;nvidia-smi&lt;/code&gt; table with your GPU listed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 615.71.08              KMD Version: 616.92        CUDA UMD Version: 13.4     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|&lt;span class="o"&gt;=========================================&lt;/span&gt;+&lt;span class="o"&gt;========================&lt;/span&gt;+&lt;span class="o"&gt;======================&lt;/span&gt;|
|   0  NVIDIA GeForce RTX 3060 ...    On  |   00000000:01:00.0  On |                  N/A |
| N/A   55C    P8             14W /  115W |    1085MiB /   6144MiB |      6%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|&lt;span class="o"&gt;=========================================================================================&lt;/span&gt;|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Part 2 — Building the easyVmaf image
&lt;/h2&gt;

&lt;p&gt;We'll use the &lt;a href="https://github.com/gdavila/easyVmaf" rel="noopener noreferrer"&gt;easyVmaf&lt;/a&gt; project, which ships a &lt;code&gt;Dockerfile.cuda&lt;/code&gt; configured for GPU-accelerated VMAF.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Clone the repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~
git clone &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 https://github.com/gdavila/easyVmaf.git
&lt;span class="nb"&gt;cd &lt;/span&gt;easyVmaf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Critical fix: pin nv-codec-headers
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;This step is undocumented anywhere else.&lt;/strong&gt; I figured it out after spending hours debugging the compilation error with the help of AI. Skip it and your build will fail.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The original &lt;code&gt;Dockerfile.cuda&lt;/code&gt; clones the &lt;strong&gt;latest&lt;/strong&gt; version of &lt;code&gt;nv-codec-headers&lt;/code&gt;, which is &lt;strong&gt;incompatible with FFmpeg 8.1&lt;/strong&gt;. You'll get this error during the build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;libavcodec/nvenc.c:2529:42: error: 'NV_ENC_CLOCK_TIMESTAMP_SET' 
has no member named 'countingType'; did you mean 'countingTypeLSB'?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In recent versions, NVIDIA renamed &lt;code&gt;countingType&lt;/code&gt; to &lt;code&gt;countingTypeLSB/countingTypeMSB&lt;/code&gt;, but FFmpeg 8.1 still uses &lt;code&gt;countingType&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Pin &lt;code&gt;nv-codec-headers&lt;/code&gt; to version &lt;code&gt;n12.1.14.0&lt;/code&gt;, which still uses &lt;code&gt;countingType&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; already includes the modern CUDA functions (&lt;code&gt;cuStreamCreateWithPriority&lt;/code&gt;, &lt;code&gt;cuMemHostAlloc&lt;/code&gt;, etc.) that &lt;code&gt;libvmaf_cuda&lt;/code&gt; needs.&lt;/p&gt;

&lt;p&gt;Edit the Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano Dockerfile.cuda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;CTRL+W&lt;/code&gt;, type &lt;code&gt;nv-codec-headers&lt;/code&gt;, press &lt;code&gt;ENTER&lt;/code&gt;. You'll land on this line:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;git clone &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;cd &lt;/span&gt;nv-codec-headers &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change it by adding &lt;code&gt;n12.1.14.0&lt;/code&gt; before --depth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;git clone &lt;span class="nt"&gt;--branch&lt;/span&gt; n12.1.14.0 &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 https://git.videolan.org/git/ffmpeg/nv-codec-headers.git &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;cd &lt;/span&gt;nv-codec-headers &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save with &lt;code&gt;CTRL+X&lt;/code&gt;, then &lt;code&gt;Y&lt;/code&gt;, then &lt;code&gt;ENTER&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Build the image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-f&lt;/span&gt; Dockerfile.cuda &lt;span class="nt"&gt;-t&lt;/span&gt; easyvmaf:cuda &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.4 Verify the &lt;code&gt;libvmaf_cuda&lt;/code&gt; filter
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ The &lt;code&gt;easyvmaf:cuda&lt;/code&gt; image defines &lt;code&gt;easyVmaf&lt;/code&gt; (its own CLI) as the &lt;code&gt;ENTRYPOINT&lt;/code&gt;. To run raw &lt;code&gt;ffmpeg&lt;/code&gt;, you must override the entrypoint.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--gpus&lt;/span&gt; all &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; ffmpeg easyvmaf:cuda &lt;span class="nt"&gt;-filters&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"libvmaf|scale_cuda"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.. libvmaf           VV-&amp;gt;V      Calculate the VMAF between two video streams.
.. libvmaf_cuda      VV-&amp;gt;V      Calculate the VMAF between two video streams.
.. scale_cuda        V-&amp;gt;V       GPU accelerated video resizer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If you see &lt;code&gt;libvmaf_cuda&lt;/code&gt;, you're done with the setup.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3 — Running VMAF with GPU acceleration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 capabilities=video
&lt;/h3&gt;

&lt;p&gt;By default, &lt;code&gt;--gpus all&lt;/code&gt; alone only grants the compute and utility capabilities. It does not mount the video decode/encode libraries &lt;code&gt;libnvcuvid.so.1&lt;/code&gt; (NVDEC) and &lt;code&gt;libnvidia-encode.so.1&lt;/code&gt; (NVENC). Since we tell FFmpeg to decode with &lt;code&gt;-hwaccel cuda&lt;/code&gt;, it needs those libraries. Without them, FFmpeg fails with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cannot load libnvcuvid.so.1
Failed loading nvcuvid.
Failed setup for format cuda: hwaccel initialisation returned error.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; explicitly request the &lt;code&gt;video&lt;/code&gt; capability:&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="nt"&gt;--gpus&lt;/span&gt; all,capabilities&lt;span class="o"&gt;=&lt;/span&gt;video
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Docker mounts &lt;code&gt;libcuda.so.1&lt;/code&gt; (CUDA compute), &lt;code&gt;libnvcuvid.so.1&lt;/code&gt; (NVDEC), and &lt;code&gt;libnvidia-encode.so.1&lt;/code&gt; (NVENC). FFmpeg can then decode, filter, and analyze entirely on the GPU.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Full analysis command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--gpus&lt;/span&gt; all,capabilities&lt;span class="o"&gt;=&lt;/span&gt;video &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; ffmpeg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"/path/to/your/videos"&lt;/span&gt;:/videos &lt;span class="se"&gt;\&lt;/span&gt;
  easyvmaf:cuda &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-hwaccel&lt;/span&gt; cuda &lt;span class="nt"&gt;-hwaccel_output_format&lt;/span&gt; cuda &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"/videos/distorted.mkv"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-hwaccel&lt;/span&gt; cuda &lt;span class="nt"&gt;-hwaccel_output_format&lt;/span&gt; cuda &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"/videos/reference.mkv"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-filter_complex&lt;/span&gt; &lt;span class="s2"&gt;"[0:v]scale_cuda=format=yuv420p[dis];[1:v]scale_cuda=format=yuv420p[ref];[dis][ref]libvmaf_cuda=log_fmt=json:log_path=/videos/vmaf_full.json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; null -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Real-world result
&lt;/h4&gt;

&lt;p&gt;Here's the output from a test on a 46-minute video file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Parsed_libvmaf_cuda_2 @ 0x760b44004f80] VMAF score: 93.558906
speed=14.9x elapsed=0:03:05.05
[out#0/null @ 0x5ef225e22140] video:27438KiB audio:2072848KiB subtitle:0KiB
frame=66265 fps=350 q=-0.0 Lsize=N/A time=00:46:03.79 bitrate=N/A speed=14.6x elapsed=0:03:09.43
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3 minutes for a 46-minute video at ~15x real-time speed.&lt;/strong&gt; That's the whole point of using &lt;code&gt;libvmaf_cuda&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;var/run/docker.sock: connect: permission denied&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your user doesn't belong to the &lt;code&gt;docker&lt;/code&gt; group, which owns &lt;code&gt;/var/run/docker.sock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;fix: &lt;/p&gt;

&lt;p&gt;enter this command in your WSL Ubuntu terminal&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;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This adds your user to the &lt;code&gt;docker&lt;/code&gt; group. Then &lt;strong&gt;close and reopen WSL&lt;/strong&gt; (group changes only apply to new sessions), and verify:&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;groups&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;youruser adm cdrom sudo dip plugdev users docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;Cannot load libnvcuvid.so.1&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Missing &lt;code&gt;,capabilities=video&lt;/code&gt; in the &lt;code&gt;--gpus&lt;/code&gt; flag. See section 3.1.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;NV_ENC_CLOCK_TIMESTAMP_SET has no member named 'countingType'&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;You didn't pin &lt;code&gt;nv-codec-headers&lt;/code&gt; to &lt;code&gt;n12.1.14.0&lt;/code&gt;. See section 2.2.&lt;/p&gt;

&lt;h3&gt;
  
  
  WSL2 hangs after inactivity
&lt;/h3&gt;

&lt;p&gt;Edit &lt;code&gt;C:\Users\YOUR_USER\.wslconfig&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[wsl2]&lt;/span&gt;
&lt;span class="py"&gt;vmIdleTimeout&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;code&gt;wsl --shutdown&lt;/code&gt; in PowerShell. Also disable "Resource Saver" in Docker Desktop (see section 1.3).&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Setting up &lt;code&gt;libvmaf_cuda&lt;/code&gt; on Windows was a long journey. At the start, I couldn't find much information about it — most guides either stop at "use &lt;code&gt;libvmaf&lt;/code&gt; on CPU" or assume you're on Linux. Even though this isn't 100% native to Windows (it runs through WSL2 + Docker), it's a solid alternative that is absolutely worth the effort.&lt;/p&gt;

&lt;p&gt;Once it's working, you get VMAF analysis at &lt;strong&gt;15x real-time speed&lt;/strong&gt;, which completely changes what's practical for video quality workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/gdavila/easyVmaf" rel="noopener noreferrer"&gt;easyVmaf&lt;/a&gt; — the project powering this guide&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html" rel="noopener noreferrer"&gt;NVIDIA Container Toolkit docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/wsl/tutorials/gpu-compute" rel="noopener noreferrer"&gt;WSL2 GPU support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Netflix/vmaf" rel="noopener noreferrer"&gt;Netflix VMAF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;If you found this post useful and you're looking for a Full Stack Developer or a technical writer, feel free to reach out!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rtagliaviaz" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram&lt;/strong&gt;: &lt;a href="https://t.me/rtaglia" rel="noopener noreferrer"&gt;@rtaglia&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading! 🙌&lt;/p&gt;

</description>
      <category>ffmpeg</category>
      <category>nvidia</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I Fixed My HLS Seeking Lag with One Keyframe Trick (GOP explained)</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Wed, 09 Sep 2026 19:14:34 +0000</pubDate>
      <link>https://dev.to/rtagl/how-i-fixed-my-hls-seeking-lag-with-one-keyframe-trick-gop-explained-2gh6</link>
      <guid>https://dev.to/rtagl/how-i-fixed-my-hls-seeking-lag-with-one-keyframe-trick-gop-explained-2gh6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I’ve been building a self‑hosted HLS streaming system from scratch – &lt;strong&gt;Node.js + TypeScript on the backend, React and hls.js on the frontend, and FFmpeg doing the heavy lifting&lt;/strong&gt;. Adaptive bitrate, multiple qualities, audio tracks, subtitles, the whole thing.&lt;/p&gt;

&lt;p&gt;Everything worked perfectly until I clicked anywhere on the progress bar.&lt;/p&gt;

&lt;p&gt;The audio resumed instantly. But the video? It took &lt;strong&gt;5 to 7 seconds&lt;/strong&gt; to catch up.&lt;/p&gt;

&lt;p&gt;After a deep dive, I discovered a concept I should have understood from day one: &lt;strong&gt;GOP (Group of Pictures)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;My HLS segments were 2 seconds long. But I hadn’t set the GOP size explicitly in my FFmpeg command. &lt;strong&gt;FFmpeg’s default GOP is usually 250 frames&lt;/strong&gt; (around 10 seconds for 25 fps). This meant that keyframes were far apart, and &lt;strong&gt;most segments didn’t start with one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you click on the progress bar, the player requests a new segment at that timestamp. If that segment doesn’t begin with a keyframe, the player cannot decode it immediately. It has to wait for the &lt;em&gt;next&lt;/em&gt; keyframe inside that segment – which could be several seconds away.&lt;/p&gt;

&lt;p&gt;The audio is independent, so it plays right away. The video waits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is GOP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GOP = Group of Pictures.&lt;/strong&gt; It’s the distance between two keyframes (I‑frames) in a video stream.&lt;/p&gt;

&lt;p&gt;A GOP contains three types of frames:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frame&lt;/th&gt;
&lt;th&gt;What it is?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;I‑frame&lt;/strong&gt; (Intra)&lt;/td&gt;
&lt;td&gt;Complete, standalone image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;P‑frame&lt;/strong&gt; (Predictive)&lt;/td&gt;
&lt;td&gt;Only changes from previous frame&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;B‑frame&lt;/strong&gt; (Bi‑directional)&lt;/td&gt;
&lt;td&gt;Changes from both past and future frames&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The smaller the GOP, the more I‑frames you have. More I‑frames = larger file size, but better seeking and faster quality switches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How GOP affects HLS streaming?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In HLS, segments are independent files. For a segment to be playable from scratch, it must start with an I‑frame.&lt;/p&gt;

&lt;p&gt;If your GOP is larger than your segment duration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Segments often start with a P‑frame or B‑frame.&lt;/li&gt;
&lt;li&gt;The player must wait until the next I‑frame within that segment.&lt;/li&gt;
&lt;li&gt;This introduces &lt;strong&gt;seeking delay&lt;/strong&gt; in adaptive bitrate streaming.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;I changed two settings in my FFmpeg pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set GOP size = 2 seconds&lt;/strong&gt; (matching my segment duration)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forced keyframes at segment boundaries&lt;/strong&gt; (using &lt;code&gt;-force_key_frames&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This ensures that &lt;strong&gt;every segment starts with an I‑frame&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-g&lt;/span&gt; 48 &lt;span class="se"&gt;\ &lt;/span&gt;    &lt;span class="c"&gt;# 48 frames at 24 fps = 2 seconds&lt;/span&gt;
  &lt;span class="nt"&gt;-force_key_frames&lt;/span&gt; &lt;span class="s2"&gt;"expr:gte(t,n_forced*2)"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-hls_time&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-hls_segment_type&lt;/span&gt; fmp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-hls_flags&lt;/span&gt; independent_segments+program_date_time &lt;span class="se"&gt;\&lt;/span&gt;
  output.m3u8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After those changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seeking is now instant and smooth&lt;/li&gt;
&lt;li&gt;Quality changes in adaptive bitrate are fluid (no more stutter)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In HLS, the relationship between segment duration and GOP size is critical.&lt;/li&gt;
&lt;li&gt;Always align your GOP with your segment duration for VOD content.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building a streaming system from scratch is a fantastic way of learning video fundamentals. If you’re working with HLS, take a moment to check your GOP settings – it could save you hours of debugging later.&lt;/p&gt;

&lt;p&gt;Have you ever struggled with seeking or adaptive bitrate switching? I’d like to hear(read) your experience&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rtagliaviaz/video-streaming-service" rel="noopener noreferrer"&gt;Github Repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ffmpeg</category>
      <category>react</category>
      <category>node</category>
      <category>todayilearned</category>
    </item>
    <item>
      <title>Construyendo un audio track remover con Node.js, React y FFmpeg</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Wed, 02 Sep 2026 19:54:43 +0000</pubDate>
      <link>https://dev.to/rtagl/construyendo-un-sistema-de-streaming-local-con-nodejs-react-y-ffmpeg-42m5</link>
      <guid>https://dev.to/rtagl/construyendo-un-sistema-de-streaming-local-con-nodejs-react-y-ffmpeg-42m5</guid>
      <description>&lt;p&gt;&lt;em&gt;No he escrito en dev.to desde el 2022. Ha habido muchos cambios en estos 4 años. Nuevos empleos, nuevos proyectos, nuevas tecnologías, etc. He regresado con un proyecto que me ha causado mucho interes&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla de Contenido
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;li&gt;El Problema&lt;/li&gt;
&lt;li&gt;Tecnologías&lt;/li&gt;
&lt;li&gt;Retos y Soluciones&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;li&gt;Contacto&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;¿Alguna vez has querido eliminar una o varias pistas de audio de un video?&lt;/p&gt;

&lt;p&gt;Quizas tienes una pelicula o el episodio de alguna serie con mas de un audio pero quieres conservarlo solo con la pista de audio que te interesa. O tambien esta la posibilidad de que quisieras dejarlo sin pistas de audio para poder editarlo o por motivos de accesibilidad&lt;/p&gt;

&lt;p&gt;para esa cuestión ejecutaba un comando como este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; test-video.1080p-Dual.mkv &lt;span class="nt"&gt;-map&lt;/span&gt; 0:v &lt;span class="nt"&gt;-map&lt;/span&gt; 0:a:1 &lt;span class="nt"&gt;-c&lt;/span&gt; copy D:test-video.es.mkv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;¿Qué hace el comando?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parte&lt;/th&gt;
&lt;th&gt;Explicación&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ffmpeg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;El programa que ejecuta el comando&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i test-video.1080p-Dual.mkv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archivo de entrada (el video original)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-map 0:v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selecciona todas las pistas de video del archivo 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-map 0:a:1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selecciona la pista de audio número 1 del archivo 0 (en este caso, español)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c copy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copia los codecs (sin re-codificar)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;D:test-video.es.mkv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archivo de salida (el video procesado)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  El Problema
&lt;/h2&gt;

&lt;p&gt;Los archivos de video suelen contener múltiples pistas de audio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diferentes idiomas (inglés, español, francés, etc.)&lt;/li&gt;
&lt;li&gt;Pistas de comentarios&lt;/li&gt;
&lt;li&gt;Descripciones de audio para accesibilidad&lt;/li&gt;
&lt;li&gt;Múltiples formatos o bitrates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La mayoría de los editores de video son excesivos para esta tarea. Quería una herramienta ligera, rápida y gratuita que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Funcione localmente (sin subir archivos a la nube)&lt;/li&gt;
&lt;li&gt;Procese varios videos a la vez&lt;/li&gt;
&lt;li&gt;Muestre el progreso en tiempo real&lt;/li&gt;
&lt;li&gt;Recuerde las selecciones de pistas por video&lt;/li&gt;
&lt;li&gt;Tenga una interfaz limpia y fácil de usar&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tecnologías
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capa (Layer)&lt;/th&gt;
&lt;th&gt;Tecnología&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;React, TypeScript, Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Node.js, Express, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Procesamiento de Video&lt;/td&gt;
&lt;td&gt;FFmpeg (fluent-ffmpeg)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actualizaciones en Tiempo Real&lt;/td&gt;
&lt;td&gt;Server-Sent Events (SSE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colas&lt;/td&gt;
&lt;td&gt;Cola de procesamiento en memoria&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests&lt;/td&gt;
&lt;td&gt;Vitest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Retos y Soluciones
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Procesar videos sin subirlos
&lt;/h3&gt;

&lt;p&gt;Como esta es una herramienta local, no quería subir archivos a un servidor. El backend lee los videos directamente del sistema de archivos usando la ruta configurada en &lt;code&gt;.env&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getVideoFolder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;envPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VIDEO_FOLDER_PATH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;envPath&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;envPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../videos&lt;/span&gt;&lt;span class="dl"&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;&lt;strong&gt;¿Por qué importa?&lt;/strong&gt; La herramienta es 100% local. No hay subidas, no hay límites de tamaño, no hay dependencia de internet y tus archivos nunca salen de tu computadora.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Progreso en tiempo real con SSE
&lt;/h3&gt;

&lt;p&gt;FFmpeg emite eventos de progreso, pero necesitaba transmitirlos al frontend. Elegí Server-Sent Events en lugar de WebSockets porque es más simple para comunicación unidireccional.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Backend - emitiendo eventos de progreso&lt;/span&gt;
&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;progress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;percent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;percent&lt;/span&gt; &lt;span class="o"&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;job-progress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;percent&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Frontend - escuchando eventos&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/events?jobId=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;jobId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setProcessProgress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;progress&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;&lt;strong&gt;¿Por qué SSE?&lt;/strong&gt; Está integrado en los navegadores, maneja reconexiones automáticamente y es perfecto para actualizaciones servidor-cliente.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Persistencia de selección de pistas por video
&lt;/h3&gt;

&lt;p&gt;Necesitaba recordar qué pistas seleccionó el usuario para cada video. Usé un Map en el estado del frontend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectedTracksMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSelectedTracksMap&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al cambiar entre videos, las pistas seleccionadas/deseleccionadas se mantienen.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Procesamiento por lotes con cola
&lt;/h3&gt;

&lt;p&gt;Procesar varios videos simultáneamente saturaría el sistema. Por lo que implementé una cola simple en memoria&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Manejo de videos sin pistas de audio
&lt;/h3&gt;

&lt;p&gt;Quise colocar la opción de poder eliminar todas las pistas de audio solo para probar. El backend soporta &lt;code&gt;tracksToKeep: []&lt;/code&gt; usando el flag &lt;code&gt;-an&lt;/code&gt; de FFmpeg.&lt;/p&gt;

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

&lt;p&gt;Este proyecto empezo como una solucion personal a un problema, ejecutar manualmente comandos para eliminar pistas de audio o tener que crear scripts para lotes de videos era muy repetitivo. Este proyecto termino siendo un ejercicio practico para construir una aplicacion local.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lo que hace este proyecto interesante:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Integracion con FFmpeg&lt;/strong&gt; – Trabajar con una herramienta CLI desde Node.js me enseñó a como manejar subprocesos, analiza la salida, y streamear eventos de progreso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;comunicación en tiempo real&lt;/strong&gt; – Los eventos Server-sent demostraron ser una simple pero efectiva alternativa a websockets, es el segundo proyecto donde hago uso de esa herramienta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architectura&lt;/strong&gt; – Separar el frontend en componentes y custom hooks, y el backend en controladores y servicios hace que el codigo sea mantenible y escalable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-first&lt;/strong&gt; – Desde mi punto de vista tiene mucho valor haber construido una herramienta útil como esta que se ejecuta completamente en la máquina del usuario sin depender de la nube.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El proyecto es de código abierto. Siéntete libre de usarlo, modificarlo, o aprender de el.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/rtagliaviaz/audio-track-remover/blob/main/README.es.md" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://youtu.be/vQuJTb5Qt9A" rel="noopener noreferrer"&gt;Video Demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Contacto
&lt;/h2&gt;

&lt;p&gt;Si te ha parecido interesante este proyecto y estás buscando un desarrollador Full Stack, no dudes en contactarme.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="//github.com/rtagliaviaz"&gt;github.com/rtagliaviaz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram&lt;/strong&gt;: &lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;@rtagliajs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord&lt;/strong&gt;: &lt;code&gt;appulino&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: &lt;a href="mailto:rtagliavia.pp@gmail.com"&gt;rtagliavia.pp@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¡Gracias por leer! 🙌&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>node</category>
      <category>ffmpeg</category>
    </item>
    <item>
      <title>I haven't posted in 4 years. Here's what I built: A Local Audio Track Remover with React, Node.js, and FFmpeg</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Wed, 02 Sep 2026 19:44:48 +0000</pubDate>
      <link>https://dev.to/rtagl/i-havent-posted-in-4-years-heres-what-i-built-a-local-audio-track-remover-with-react-nodejs-5d6k</link>
      <guid>https://dev.to/rtagl/i-havent-posted-in-4-years-heres-what-i-built-a-local-audio-track-remover-with-react-nodejs-5d6k</guid>
      <description>&lt;p&gt;&lt;em&gt;I haven't written on Dev.to since 2022. A lot has changed in 4 years — new jobs, new projects, and new tech. I'm back with a project I'm genuinely excited about.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;The Problem&lt;/li&gt;
&lt;li&gt;Tech Stack&lt;/li&gt;
&lt;li&gt;Key Challenges &amp;amp; Solutions&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Let's Connect&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Have you ever wanted to remove one or more audio tracks from a video?&lt;/p&gt;

&lt;p&gt;Maybe you have a movie or a TV series episode with multiple audio tracks, but you only want to keep the one you need. Or perhaps you want to remove all audio tracks for editing purposes or accessibility reasons.&lt;/p&gt;

&lt;p&gt;To solve this, I used to run a command like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; test-video.1080p-Dual.mkv &lt;span class="nt"&gt;-map&lt;/span&gt; 0:v &lt;span class="nt"&gt;-map&lt;/span&gt; 0:a:1 &lt;span class="nt"&gt;-c&lt;/span&gt; copy D:test-video.es.mkv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What does this command do?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Explanation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ffmpeg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The program that executes the command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i test-video.1080p-Dual.mkv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Input file (the original video)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-map 0:v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects all video tracks from file 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-map 0:a:1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects audio track number 1 from file 0 (in this case, Spanish)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c copy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copies the codecs (no re-encoding)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;D:test-video.es.mkv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output file (the processed video)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It worked, but every time I had to remember the syntax, check which track was which, and wait without knowing the progress. It was tedious and error-prone.&lt;/p&gt;

&lt;p&gt;So I built a tool that does the same thing, but with a clean UI, real-time progress, and batch processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Video files often contain multiple audio tracks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different languages (English, Spanish, French, etc.)&lt;/li&gt;
&lt;li&gt;Commentary tracks&lt;/li&gt;
&lt;li&gt;Audio descriptions for accessibility&lt;/li&gt;
&lt;li&gt;Multiple formats or bitrates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most video editors are overkill for this task. I wanted a lightweight, fast, and free tool that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works locally (no uploads to the cloud)&lt;/li&gt;
&lt;li&gt;Processes multiple videos at once&lt;/li&gt;
&lt;li&gt;Shows real-time progress&lt;/li&gt;
&lt;li&gt;Remembers track selections per video&lt;/li&gt;
&lt;li&gt;Has a clean and easy-to-use interface&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;React, TypeScript, Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Node.js, Express, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video Processing&lt;/td&gt;
&lt;td&gt;FFmpeg (fluent-ffmpeg)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time Updates&lt;/td&gt;
&lt;td&gt;Server-Sent Events (SSE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queue&lt;/td&gt;
&lt;td&gt;In-memory processing queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;Vitest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Processing Videos Without Uploading
&lt;/h3&gt;

&lt;p&gt;Since this is a local tool, I didn't want to upload files to a server. The backend reads videos directly from the filesystem using the path configured in &lt;code&gt;.env&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getVideoFolder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;envPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VIDEO_FOLDER_PATH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;envPath&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;envPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../videos&lt;/span&gt;&lt;span class="dl"&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;&lt;strong&gt;Why does this matter?&lt;/strong&gt; The tool is 100% local. There are no uploads, no file size limits, no internet dependency, and your files never leave your computer.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Real-time Progress with SSE
&lt;/h3&gt;

&lt;p&gt;FFmpeg emits progress events, but I needed to stream them to the frontend. I chose Server-Sent Events over WebSockets because it's simpler for one-way communication.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Backend - emitting progress events&lt;/span&gt;
&lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;progress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;percent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;percent&lt;/span&gt; &lt;span class="o"&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;job-progress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;percent&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Frontend - listening for events&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/events?jobId=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;jobId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setProcessProgress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;progress&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;&lt;strong&gt;Why SSE?&lt;/strong&gt; It's built into browsers, handles reconnections automatically, and is perfect for server-to-client updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Each video remembers its own track choices
&lt;/h3&gt;

&lt;p&gt;I needed to remember which tracks the user selected for each video. I used a Map in the frontend state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectedTracksMap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSelectedTracksMap&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you switch between videos, the selected/deselected tracks are preserved.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Batch Processing with a Queue
&lt;/h3&gt;

&lt;p&gt;Processing multiple videos simultaneously would overwhelm the system. So I implemented a simple in-memory queue.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Handling Videos with No Audio Tracks
&lt;/h3&gt;

&lt;p&gt;I wanted to add the option to remove all audio tracks just to try it out. The backend supports tracksToKeep: [] using FFmpeg's -an flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This project started as a personal solution to a problem: manually running commands to remove audio tracks or having to create scripts for video batches was very repetitive. This project ended up being a practical exercise in building a local application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes this project interesting:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FFmpeg integration&lt;/strong&gt; – Working with a powerful CLI tool from Node.js taught me how to handle subprocesses, parse output, and stream progress events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time communication&lt;/strong&gt; – Server-Sent Events proved to be a simple yet effective alternative to WebSockets for pushing progress updates to the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt; – Separating the frontend into components and custom hooks, and the backend into controllers and services, kept the codebase maintainable as the project grew.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-first&lt;/strong&gt; – Building a tool that runs entirely on the user's machine without cloud dependencies has real value for privacy and speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is open source. Feel free to use it, modify it, or learn from it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/rtagliaviaz/audio-track-remover" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://youtu.be/vQuJTb5Qt9A" rel="noopener noreferrer"&gt;Video Demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;If you found this project interesting and are looking for a Full Stack Developer, feel free to reach out!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="//github.com/rtagliaviaz"&gt;github.com/rtagliaviaz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram&lt;/strong&gt;: &lt;a href="https://t.me/rtaglia" rel="noopener noreferrer"&gt;@rtaglia&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord&lt;/strong&gt;: &lt;code&gt;appulino&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: &lt;a href="mailto:rtagliavia.pp@gmail.com"&gt;rtagliavia.pp@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading! 🙌&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>ffmpeg</category>
    </item>
    <item>
      <title>¿Cómo mintear NFTs en Solana?</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Mon, 19 Sep 2022 13:59:05 +0000</pubDate>
      <link>https://dev.to/rtagl/como-mintear-nfts-en-solana-5b3j</link>
      <guid>https://dev.to/rtagl/como-mintear-nfts-en-solana-5b3j</guid>
      <description>&lt;p&gt;En el siguiente post explicaré paso a paso a como "mintear" un NFT en Solana.&lt;/p&gt;

&lt;p&gt;Para seguir este post no es necesario utilizar el CLI de Metaplex, &lt;em&gt;en caso de contar con una alternativa, te agradeceria mucho que me la comentaras&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerrequisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.solana.com/cli/install-solana-cli-tools" rel="noopener noreferrer"&gt;Solana CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/download" rel="noopener noreferrer"&gt;Typescript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/ts-node#installation" rel="noopener noreferrer"&gt;ts-node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CalebEverett/arloader/releases/tag/v0.1.61" rel="noopener noreferrer"&gt;arloader CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/metaplex-foundation/deprecated-clis" rel="noopener noreferrer"&gt;metaplex CLI&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;El equipo de Metaplex ha dejado de actualizar el CLI, pero sigue funcionando y no tendrás ningún problema para seguir este post. Planeo incluir otra opción si puedo encontrarla más adelante&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Metaplex CLI
&lt;/h2&gt;

&lt;p&gt;Para instalar Metaplex CLI debemos hacer lo siguiente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dirigirnos al siguiente &lt;a href="https://github.com/metaplex-foundation/deprecated-clis" rel="noopener noreferrer"&gt;link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Clonar el proyecto con &lt;code&gt;$ git clone https://github.com/metaplex-foundation/deprecated-clis.git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ubicarnos en la carpeta del proyecto e instalar las dependencias&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tabla de Contenido
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Creación de cartera local&lt;/li&gt;
&lt;li&gt;Agregar saldo a nuestra cartera&lt;/li&gt;
&lt;li&gt;Subir la imagen que usaremos como NFT&lt;/li&gt;
&lt;li&gt;Crear y Subir la metadata de nuestro NFT &lt;/li&gt;
&lt;li&gt;Mintear el Token&lt;/li&gt;
&lt;li&gt;Agregar nuestra cartera local a Phantom&lt;/li&gt;
&lt;li&gt;Quemar NFTs en Phantom&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Creación de cartera local &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Asumiendo que ya instalaste &lt;a href="https://docs.solana.com/cli/install-solana-cli-tools" rel="noopener noreferrer"&gt;Solana CLI&lt;/a&gt;, lo primero que debemos hacer es apuntar a la mainnet con el siguiente comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ solana config set --url https://api.mainnet-beta.solana.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Obtendremos un mensaje similar al siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Config File: C:\Users\Rob\.config\solana\cli\config.yml
RPC URL: https://api.mainnet-beta.solana.com
WebSocket URL: wss://api.mainnet-beta.solana.com/ (computed)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez hecho esto procederemos a crear la cartera local con el siguiente comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ solana-keygen new --outfile ~/.solana/tu-cartera.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A continuación nos pedirá que ingresemos una frase de acceso (passphrase) que usaremos para recuperar la cartera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;For added security, enter a BIP39 passphrase

NOTE! This passphrase improves security of the recovery seed phrase NOT the
keypair file itself, which is stored as insecure plain text

BIP39 Passphrase (empty for none):
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez ingresada obtendremos el siguiente mensaje:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Wrote new keypair to /Users/Rob/.config/solana/[wallet_name].json ==================================================================== pubkey: [wallet_pub_key] ==================================================================== Save this seed phrase and your BIP39 passphrase to recover your new keypair:
[REDACTED] ====================================================================
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;La pubkey sera nuestra wallet address&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ahora procederemos a asignarla como nuestra cartera predeterminada con el siguiente comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ solana config set --keypair ~/.solana/tu-cartera.json&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Agregar saldo a nuestra cartera &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Para poder realizar todo el proceso necesitaremos menos de 2 USD en SOL&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En caso de tener una cartera con SOL en Phantom podemos simplemente enviar SOL a la nueva cartera&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Caso contrario podemos adquirir SOL usando &lt;a href="https://ftx.com/" rel="noopener noreferrer"&gt;FTX&lt;/a&gt; siguiendo los siguientes pasos:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://ftx.com/#a=codenjobs" rel="noopener noreferrer"&gt;Crear una cuenta&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://ftx.com/wallet" rel="noopener noreferrer"&gt;Dirigirnos a la página de wallet&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  3. Depositar USD o EUR
&lt;/h3&gt;

&lt;p&gt;En la página de Wallet nos ubicamos en la moneda (USD o EUR) que deseemos depositar y haremos click en &lt;strong&gt;DEPOSIT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1krcv5qvn5468ktdn8tn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1krcv5qvn5468ktdn8tn.png" alt="Alt text" width="798" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seguido de esto Seleccionaremos tarjeta de débito, seguiremos los pasos y confirmaremos el depósito&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp14dmt9q76i1obbcds7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp14dmt9q76i1obbcds7v.png" alt="Alt text" width="699" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Convertir a SOL
&lt;/h3&gt;

&lt;p&gt;Una vez realizado el paso anterior y que ya tengamos disponible el saldo en USD o EUR, podemos convertirlo a SOL haciendo click en &lt;strong&gt;CONVERT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F805femvcq9vqe8q7dgc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F805femvcq9vqe8q7dgc4.png" alt="Alt text" width="800" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seguido de esto seleccionaremos la moneda a la que deseemos convertir, en este caso &lt;strong&gt;SOL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94eamgjp3zzv7x0a7sep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94eamgjp3zzv7x0a7sep.png" alt="Alt text" width="690" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczrfcngrwcbpzixdbxk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczrfcngrwcbpzixdbxk0.png" alt="Alt text" width="629" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Pasaremos la cantidad que convertimos a SOL a nuestra cartera local
&lt;/h3&gt;

&lt;p&gt;Ahora nos ubicamos en el icono de búsqueda y buscaremos &lt;em&gt;SOL&lt;/em&gt;, y procederemos a hacer clic en retirar &lt;strong&gt;WITHDRAW&lt;/strong&gt;, colocaremos el monto que deseemos retirar y la pubkey que es nuestra wallet address&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnng1s7q5lbzc59aytaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnng1s7q5lbzc59aytaj.png" alt="Alt text" width="798" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbq47bi2xib9tgvmhy9tg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbq47bi2xib9tgvmhy9tg.png" alt="Alt text" width="628" height="570"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Una vez hayamos pasado fondos a nuestra cartera local podemos chequearlos haciendo uso del siguiente comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ solana balance pubkey&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Subir la imagen que usaremos como NFT &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Para este ejemplo usaremos el Logo de Code&amp;amp;Jobs, siéntete libre de usar o crear la imagen que desees&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codenjobs.com%2Fstatic%2Flogo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codenjobs.com%2Fstatic%2Flogo.png" alt="codenjobs-logo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Subiremos la imagen haciendo uso de &lt;a href="https://github.com/CalebEverett/arloader/blob/master/README.md#installation" rel="noopener noreferrer"&gt;arloader CLI&lt;/a&gt;, pero en caso de que desees hacerlo manualmente puedes seguir las instrucciones en el siguiente &lt;a href="https://www.codenjobs.com/blog?&amp;amp;title=%C2%BFC%C3%B3mo-subir-archivos-con-ardrive-manualmente-y-con-ardrive-CLI?&amp;amp;id=2fd45e9f-37cc-4018-81d8-3c1ba6006d54" rel="noopener noreferrer"&gt;post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con el siguiente comando especificaremos la ruta de la imagen que vamos a subir, y que realizaremos el pago con nuestra cartera de Solana:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ arloader upload &amp;lt;logo-de-codenjobs.png&amp;gt; --with-sol --sol-keypair-path ~/.config/solana/tu-cartera.json --ar-default-keypair --no-bundle&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Vamos a obtener el siguiente mensaje por consola:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;id:             [tx_id]
status:         Submitted
file_path:      [ruta/de/la/imagen.png]
created_at:     2022-08-21 15:43:13
last_modified:  2022-08-21 15:43:13
Uploaded 1 files. Run `arloader update-status  --file-paths ` to confirm transaction(s).
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Asegurate de guardar el tx_id&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una vez hecho esto tendremos que esperar un poco para que el archivo esté disponible, podemos revisar el estado con el siguiente comando &lt;code&gt;$ arloader get-status [tx_id]&lt;/code&gt; o con la siguiente URL &lt;a href="https://arweave.net/tx_id" rel="noopener noreferrer"&gt;https://arweave.net/tx_id&lt;/a&gt; (en caso de estar confirmada podremos obtener la imagen)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mientras esperamos podemos avanzar con el siguiente paso&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Crear y Subir la metadata de nuestro NFT &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;A continuación crearemos la metadata de nuestro NFT utilizando el estándar de &lt;a href=""&gt;METAPLEX&lt;/a&gt;. Para esto debemos abrir un editor de código y crear un archivo que llevará por nombre &lt;em&gt;metadata.json&lt;/em&gt;, copiaremos lo siguiente dentro de ese archivo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NFT MINT TEST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ANYSYMBOL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TEST NFT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"seller_fee_basis_points"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/[tx_id]?ext=png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"external_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.codenjobs.com/user/rtagliavia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"attributes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"trait_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Whatever Trait 1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fire"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"trait_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Whatever Trait 2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sunglasses"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/[tx_id]?ext=png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"creators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[pub_key]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"share"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;En esta línea colocaremos el transaction ID que recibimos en el paso anterior, y  la estension puede ser .jpg o .png&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/[tx_id]?ext=png"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Igualmente en la siguientes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/[arweave_img_tx_id]?ext=png"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;En esta línea debemos agregar el pubKey de nuestra cartera local&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[pub_key]"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez que se hayan llenado debidamente los campos y guardado nuestro archivo, procederemos a subirlo de la misma manera que subimos la imagen en el paso anterior.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ arloader upload [ruta/de/la/metadata.json] --with-sol --sol-keypair-path ~/.config/solana/tu-cartera.json --ar-default-keypair --no-bundle&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Obtendremos un mensaje similar a este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;id:             [tx_id]
status:         Submitted
file_path:      [ruta/de/la/metadata.json]
created_at:     2022-08-21 15:48:49
last_modified:  2022-08-21 15:48:49
Uploaded 1 files. Run `arloader update-status  --file-paths ` to confirm transaction(s).
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nuevamente debemos esperar por las confirmaciones, podremos chequear el avance con el siguiente comando &lt;code&gt;$ arloader get-status [tx_id]&lt;/code&gt; o con la siguiente URL &lt;a href="https://arweave.net/tx_id" rel="noopener noreferrer"&gt;https://arweave.net/tx_id&lt;/a&gt; (si se muestra la metadata quiere decir que ya esta listo)&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Mintear el Token &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Finalmente para &lt;em&gt;mintear&lt;/em&gt; nuestro token vamos a usar MetaPlex CLI (&lt;em&gt;como mencione anteriormente esta obsoleto pero funciona perfectamente&lt;/em&gt;) una vez instalado nos ubicamos en la carpeta del proyecto&lt;/p&gt;

&lt;p&gt;&lt;code&gt;C:\Users\User\deprecated-clis&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Una vez en el proyecto debemos ir a la carpeta src y ejecutar los siguiente comandos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd src
$ ts-node cli-nft.ts mint --env mainnet-beta --keypair ~/.config/solana/tu-cartera.json --url https://arweave.net/[tx_id] --max-supply 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;En esta linea debemos agregar el tx-id que obtuvimos al subir la metadata&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://arweave.net/[tx_id]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Obtendremos dos URL una nos mostrará los detalles de la transacción y la otra el Token que acabamos de &lt;em&gt;mintear&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhr9nfqev46g0n92e3810.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhr9nfqev46g0n92e3810.png" alt="Alt text" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Agregar nuestra cartera local a Phantom &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;En caso de que deseemos añadir nuestra cartera local a Phantom, el proceso es muy sencillo, basta con seguir estos sencillos pasos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abrir la extensión de Phantom en nuestro navegador&lt;/li&gt;
&lt;li&gt;Hacer clic en el botón de la esquina superior izquierda&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feadpds5hu8spelyqtq6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feadpds5hu8spelyqtq6m.png" alt="Alt text" width="354" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hacer clic en "Add / Connect Wallet"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Figbdgn7zfpnrds7l9us5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Figbdgn7zfpnrds7l9us5.png" alt="Alt text" width="355" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ahora haremos clic en import private key&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgddq6erei9p2uvxfvd7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgddq6erei9p2uvxfvd7.png" alt="Alt text" width="349" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Por último abriremos nuestra cartera local dirigiéndonos a la carpeta donde esta ubicada y abriendo el archivo .json con un editor de código, copiaremos todo el contenido y lo pegaremos en el campo &lt;em&gt;private key&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v51v77vrohe1zwde1gb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v51v77vrohe1zwde1gb.png" alt="Alt text" width="350" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con esto podremos visualizar nuestros NFT desde la extensión de wallet, así como poder incluirlos en la sección de crypto de &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt; y escoger uno para mostrarlo en nuestro perfil de usuario.&lt;/p&gt;

&lt;p&gt;Te dejo información mas detallada de como realizar esto en la &lt;a href="https://docs.codenjobs.com/es/guides/account/settings.html" rel="noopener noreferrer"&gt;documentacion oficial&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Quemar NFTs en Phantom &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Phantom cuenta con la opción de poder &lt;em&gt;quemar&lt;/em&gt; nuestros NFTs, con esto eliminaremos el nft y obtendremos el reembolso del dinero al momento de mintear el Token, para esto debemos seguir los siguientes pasos&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abrir la extensión de Phantom Wallet.&lt;/li&gt;
&lt;li&gt;Hacer click en el botón de &lt;em&gt;Your Collectibles&lt;/em&gt; en la barra inferior.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffprvriol08o25n7dmbi7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffprvriol08o25n7dmbi7.png" alt="Alt text" width="354" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Seguido de esto seleccionaremos el NFT que queramos &lt;em&gt;quemar&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vqwhkq2ifkmo46p9zbp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vqwhkq2ifkmo46p9zbp.png" alt="Alt text" width="355" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Haremos clic en el botón con los tres puntos &lt;em&gt;...&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81egykcx6jxgaijc19p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81egykcx6jxgaijc19p7.png" alt="Alt text" width="359" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ahora clic en &lt;em&gt;burn all tokens tokens&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo6uvcep7734aemnacv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo6uvcep7734aemnacv2.png" alt="Alt text" width="238" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aparecerá una ventana de confirmación, tendremos que tildar la casilla seguido de hacer clic en &lt;em&gt;Burn&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0m7xhvlcod3zdj2c31y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0m7xhvlcod3zdj2c31y.png" alt="Alt text" width="336" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Veremos un mensaje diciendo que el token fue quemado y el importe en SOL que fue depositado en la cartera.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vwxr4ubsauz4s1ti3kx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vwxr4ubsauz4s1ti3kx.png" alt="Alt text" width="356" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Conclusión &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Aprendimos a mintear un NFT en la red SOLANA manualmente con ayuda de varias herramientas.&lt;/p&gt;

&lt;p&gt;Realmente espero que hayas podido llegar hasta aquí sin ningún problema, en caso de que hayas encontrado algún obstáculo por favor házmelo saber con un comentario o sientete libre de contactarme por &lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;telegram&lt;/a&gt; o agregandome a Discord como &lt;strong&gt;Appu#9136&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Muchas gracias por tu tiempo&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>blockchain</category>
      <category>spanish</category>
      <category>node</category>
    </item>
    <item>
      <title>How to mint a NFT on Solana?</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Mon, 19 Sep 2022 13:56:59 +0000</pubDate>
      <link>https://dev.to/rtagl/how-to-mint-a-nft-on-solana-3d35</link>
      <guid>https://dev.to/rtagl/how-to-mint-a-nft-on-solana-3d35</guid>
      <description>&lt;p&gt;We will learn how to mint a NFT manually on Solana.&lt;/p&gt;

&lt;p&gt;To follow this post it is not necessary to use the Metaplex CLI, &lt;em&gt;if you have an alternative, I would be very grateful if you could tell me about it&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.solana.com/cli/install-solana-cli-tools" rel="noopener noreferrer"&gt;Solana CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/download" rel="noopener noreferrer"&gt;Typescript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/ts-node#installation" rel="noopener noreferrer"&gt;ts-node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CalebEverett/arloader/releases/tag/v0.1.61" rel="noopener noreferrer"&gt;arloader CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/metaplex-foundation/deprecated-clis" rel="noopener noreferrer"&gt;metaplex CLI&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Metaplex CLI was deprecated by Metaplex team but still works and you will have no issue following this post. I plan to include another option if I can find it later&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Metaplex CLI
&lt;/h2&gt;

&lt;p&gt;In order to install Metaplex CLI we need to do the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open this &lt;a href="https://github.com/metaplex-foundation/deprecated-clis" rel="noopener noreferrer"&gt;link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Clone the project with &lt;code&gt;$ git clone https://github.com/metaplex-foundation/deprecated-clis.git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Locate the project folder and install the dependencies with &lt;code&gt;$ yarn install&lt;/code&gt; or &lt;code&gt;$ npm i&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Creation of the local wallet&lt;/li&gt;
&lt;li&gt;Buy Solana for our wallet&lt;/li&gt;
&lt;li&gt;Upload the image we will use as NFT&lt;/li&gt;
&lt;li&gt;Create and Upload the metadata of our NFT&lt;/li&gt;
&lt;li&gt;Minting the Token&lt;/li&gt;
&lt;li&gt;Add our local wallet to Phantom&lt;/li&gt;
&lt;li&gt;Burn NFTs in Phantom&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Creation of the local wallet &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Assuming you have already installed &lt;a href="https://docs.solana.com/cli/install-solana-cli-tools" rel="noopener noreferrer"&gt;Solana CLI&lt;/a&gt;), the first thing to do is to point to the mainnet with the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ solana config set --url https://api.mainnet-beta.solana.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We will get a message similar to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Config File: C:\Users\Rob\.config\solana\cli\config.yml
RPC URL: https://api.mainnet-beta.solana.com
WebSocket URL: wss://api.mainnet-beta.solana.com/ (computed)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once this is done we will proceed to create the local wallet with the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ solana-keygen new --outfile ~/.solana/your-wallet.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We will then be asked to enter a passphrase that we will use to retrieve the wallet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;For added security, enter a BIP39 passphrase

NOTE! This passphrase improves security of the recovery seed phrase NOT the
keypair file itself, which is stored as insecure plain text

BIP39 Passphrase (empty for none):
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once entered we will get the following message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Wrote new keypair to /Users/Rob/.config/solana/your-wallet.json ==================================================================== pubkey: [wallet_pub_key] ==================================================================== Save this seed phrase and your BIP39 passphrase to recover your new keypair:
[REDACTED] ====================================================================
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;The pubkey will be our wallet address.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now we will proceed to assign it as our default wallet with the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ solana config set --keypair ~/.solana/your-wallet.json&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Buy Solana for our wallet &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;To be able to perform the whole process we will need less than 2 USD in SOL.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In case we have a Phantom Wallet with SOL in it we can just send SOL to the new wallet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Otherwise we can acquire SOL using &lt;a href="https://ftx.com/#a=codenjobs" rel="noopener noreferrer"&gt;FTX&lt;/a&gt; by following the steps below:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://ftx.com/onboarding/signup" rel="noopener noreferrer"&gt;Create an account&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://ftx.com/wallet" rel="noopener noreferrer"&gt;Go to wallet page&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  3. Deposit USD or EUR
&lt;/h3&gt;

&lt;p&gt;In the Wallet page we go to the currency (USD or EUR) we want to deposit and click on &lt;strong&gt;DEPOSIT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1krcv5qvn5468ktdn8tn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1krcv5qvn5468ktdn8tn.png" alt="Alt text" width="798" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that we will select debit card, follow the steps and confirm the deposit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp14dmt9q76i1obbcds7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp14dmt9q76i1obbcds7v.png" alt="Alt text" width="699" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Convert to SOL
&lt;/h3&gt;

&lt;p&gt;Once we have done the previous step and we have the balance available in USD or EUR, we can convert it to SOL by clicking on &lt;strong&gt;CONVERT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F805femvcq9vqe8q7dgc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F805femvcq9vqe8q7dgc4.png" alt="Alt text" width="800" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After this we will select the currency to which we want to convert, in this case &lt;strong&gt;SOL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94eamgjp3zzv7x0a7sep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94eamgjp3zzv7x0a7sep.png" alt="Alt text" width="690" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczrfcngrwcbpzixdbxk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczrfcngrwcbpzixdbxk0.png" alt="Alt text" width="629" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. We will pass the amount we converted to SOL to our local wallet.
&lt;/h3&gt;

&lt;p&gt;Now we go to the search icon and search for &lt;em&gt;SOL&lt;/em&gt;, and proceed to click on withdraw &lt;strong&gt;WITHDRAW&lt;/strong&gt;, enter the amount we want to withdraw and the pubkey which is our wallet address&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnng1s7q5lbzc59aytaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnng1s7q5lbzc59aytaj.png" alt="Alt text" width="798" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4g2vqt16vbzbm3w984l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4g2vqt16vbzbm3w984l.png" alt="Alt text" width="628" height="570"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Once we have transferred funds to our local wallet we can check them using the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ solana balance pubkey&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Upload the image we will use as NFT &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;For this example we will use the Code&amp;amp;Jobs Logo, feel free to use or create the image of your choice.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codenjobs.com%2Fstatic%2Flogo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.codenjobs.com%2Fstatic%2Flogo.png" alt="codenjobs-logo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will upload the image using &lt;a href="https://github.com/CalebEverett/arloader/blob/master/README.md#installation" rel="noopener noreferrer"&gt;arloader CLI&lt;/a&gt;, but in case you want to do it manually you can follow the instructions in the following &lt;a href="https://www.codenjobs.com/blog?&amp;amp;title=%C2%BFC%C3%B3mo-subir-archivos-con-ardrive-manualmente-y-con-ardrive-CLI?&amp;amp;id=2fd45e9f-37cc-4018-81d8-3c1ba6006d54" rel="noopener noreferrer"&gt;post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the following command we will specify the path of the image that we are going to upload, and that we will make the payment with our Solana wallet:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ arloader upload &amp;lt;code&amp;amp;jobs_logo.png&amp;gt; --with-sol --sol-keypair-path ~/.config/solana/your-wallet.json --ar-default-keypair --no-bundle&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We are going to get the following message by console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;id:             &amp;lt;tx_id&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;status:         Submitted
&lt;/span&gt;&lt;span class="gp"&gt;file_path:      &amp;lt;code&amp;amp;jobs_logo.png&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;created_at:     2022-08-21 15:43:13
last_modified:  2022-08-21 15:43:13
Uploaded 1 files. Run `arloader update-status  --file-paths ` to confirm transaction(s).
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Be sure to save the tx_id&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Once this is done we will have to wait a bit for the file to be available, we can check the status with the following command &lt;code&gt;$ arloader get-status [tx_id]&lt;/code&gt; or with the following URL &lt;a href="https://arweave.net/tx_id" rel="noopener noreferrer"&gt;https://arweave.net/tx_id&lt;/a&gt; (in case it is confirmed we will be able to get the image)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;While we wait we can move on to the next step.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Create and Upload the metadata of our NFT &lt;a&gt;&lt;/a&gt;.
&lt;/h2&gt;

&lt;p&gt;Next we will create the metadata of our NFT using the &lt;a href="https://docs.metaplex.com/token-metadata/specification#token-standards" rel="noopener noreferrer"&gt;metaplex standard&lt;/a&gt;. For this we must open a code editor and create a file named &lt;em&gt;metadata.json&lt;/em&gt;, we will copy the following inside that file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your Solana NFT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ANYSYMBOL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your first Solana NFT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"seller_fee_basis_points"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/&amp;lt;tx_id&amp;gt;?ext=png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"external_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.codenjobs.com/user/rtagliavia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"attributes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"trait_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Whatever Trait 1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fire"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"trait_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Whatever Trait 2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sunglasses"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/&amp;lt;tx_id&amp;gt;?ext=png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"creators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[pub_key]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"share"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In this line we will place the transaction ID we received in the previous step, and the extension can be .jpg or .png&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/[tx_id]?ext=png"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Also in the following&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/[arweave_img_tx_id]?ext=png"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In this line we must add the pubKey of our local wallet&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[pub_key]"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the fields have been filled and our file has been saved, we will proceed to upload it in the same way as we uploaded the image in the previous step.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ arloader upload [ruta/de/la/metadata.json] --with-sol --sol-keypair-path ~/.config/solana/[nombre-de-la-cartera].json --ar-default-keypair --no-bundle&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We will get a message similar to this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;id:             [tx_id]
status:         Submitted
file_path:      [ruta/de/la/metadata.json]
created_at:     2022-08-21 15:48:49
last_modified:  2022-08-21 15:48:49
Uploaded 1 files. Run `arloader update-status  --file-paths ` to confirm transaction(s).
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again we must wait for the confirmations, we can check the progress with the following command &lt;code&gt;$ arloader get-status [tx_id]&lt;/code&gt; or with the following URL &lt;a href="https://arweave.net/tx_id" rel="noopener noreferrer"&gt;https://arweave.net/tx_id&lt;/a&gt; (if the metadata is shown it means it is ready)&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Minting the Token &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Finally we will mint our token we are going to use MetaPlex CLI &lt;em&gt;as I mentioned before it is obsolete but works perfectly fine&lt;/em&gt;, once installed we go to the project folder&lt;/p&gt;

&lt;p&gt;&lt;code&gt;C:\Users\User\deprecated-clis&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once in the project we must go to the src folder and execute the following commands&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;src
&lt;span class="nv"&gt;$ &lt;/span&gt;ts-node cli-nft.ts mint &lt;span class="nt"&gt;--env&lt;/span&gt; mainnet-beta &lt;span class="nt"&gt;--keypair&lt;/span&gt; ~/.config/solana/[nombre-de-la-cartera].json &lt;span class="nt"&gt;--url&lt;/span&gt; https://arweave.net/[tx_id] &lt;span class="nt"&gt;--max-supply&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;In this line we must add the tx-id we obtained when uploading the metadata.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://arweave.net/[tx_id]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We will get two URLs, one will show us the details of the transaction and the other the token we just &lt;em&gt;minted&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhr9nfqev46g0n92e3810.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhr9nfqev46g0n92e3810.png" alt="Alt text" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Add our local wallet to Phantom &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;In case we want to add our local wallet to Phantom, the process is very simple, just follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Phantom extension in our browser.&lt;/li&gt;
&lt;li&gt;Click on the button in the upper left corner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feadpds5hu8spelyqtq6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feadpds5hu8spelyqtq6m.png" alt="Alt text" width="354" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on "Add / Connect Portfolio"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Figbdgn7zfpnrds7l9us5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Figbdgn7zfpnrds7l9us5.png" alt="Alt text" width="355" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Now click on import private key&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgddq6erei9p2uvxfvd7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgddq6erei9p2uvxfvd7.png" alt="Alt text" width="349" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finally we will open our local wallet by going to the folder where it is located and opening the .json file with a code editor, copy all the content and paste it in the &lt;em&gt;private key&lt;/em&gt; field.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v51v77vrohe1zwde1gb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v51v77vrohe1zwde1gb.png" alt="Alt text" width="350" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this we will be able to visualize our NFTs from the wallet extension, as well as being able to include them in the crypto section of &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt; and choose one to show it in our user profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Burn NFTs in Phantom &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Phantom has the option of being able to &lt;em&gt;burn&lt;/em&gt; our NFTs, with this we will eliminate the NFT and we will obtain the refund of the money at the moment of mining the Token, for this we must follow the following steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Phantom Wallet extension.&lt;/li&gt;
&lt;li&gt;Click on the &lt;em&gt;Your Collectibles&lt;/em&gt; button in the bottom bar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffprvriol08o25n7dmbi7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffprvriol08o25n7dmbi7.png" alt="Alt text" width="354" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Next select the NFT you want to &lt;em&gt;burn&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vqwhkq2ifkmo46p9zbp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vqwhkq2ifkmo46p9zbp.png" alt="Alt text" width="355" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on the button with the three dots &lt;em&gt;...&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81egykcx6jxgaijc19p7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81egykcx6jxgaijc19p7.png" alt="Alt text" width="359" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Now click on &lt;em&gt;burn all tokens tokens&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo6uvcep7734aemnacv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo6uvcep7734aemnacv2.png" alt="Alt text" width="238" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A confirmation window will appear, we will have to check the box followed by clicking &lt;em&gt;Burn&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0m7xhvlcod3zdj2c31y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0m7xhvlcod3zdj2c31y.png" alt="Alt text" width="336" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We will see a message saying that the token was burned and the amount in SOL that was deposited in the wallet.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  8. Conclusion &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;We learned how to mint an NFT on the Solana network manually with the help of various tools.&lt;/p&gt;

&lt;p&gt;I really hope you were able to get this far without any problems, in case you encountered any issues please let me know with a comment or feel free to contact me by &lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;telegram&lt;/a&gt; or by adding me on Discord as &lt;strong&gt;Appu#9136&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Thank you very much for your time.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>typescript</category>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Bot de criptomonedas de discord con discord.js y node.js</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Thu, 15 Sep 2022 15:47:51 +0000</pubDate>
      <link>https://dev.to/rtagl/bot-de-criptomonedas-de-discord-con-discordjs-y-nodejs-590a</link>
      <guid>https://dev.to/rtagl/bot-de-criptomonedas-de-discord-con-discordjs-y-nodejs-590a</guid>
      <description>&lt;p&gt;En este post aprenderemos a crear un bot de discord para obtener el valor de criptomonedas en moneda local, para eso estaremos usando la &lt;a href="https://www.coingecko.com/en/api" rel="noopener noreferrer"&gt;API de Coingecko&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;En caso de que te interese aprender a realizar el mismo bot para Telegram has clic &lt;a href="https://dev.to/rtagliavia/how-to-make-a-cryptocurrency-telegram-bot-with-node-and-telegraf-4572"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;Me puedes contactar por telegram en caso de que necesites un Full Stack developer o si necesitas un bot de discord para tu servidor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;También puedes agregarme a discord como &lt;strong&gt;Appu#9136&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Te dejo el &lt;a href="https://github.com/rtagliaviaz/cryptocurrency-discord-bot" rel="noopener noreferrer"&gt;repo&lt;/a&gt; del proyecto en caso de que quieras clonarlo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerrequisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; instalado&lt;/li&gt;
&lt;li&gt;Una cuenta de Discord&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creación del proyecto
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Abre la consola y escribe los siguientes comandos.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;node-telegram-tut
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;node-telegram-tut
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm init &lt;span class="nt"&gt;--y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Abre el proyecto con tu editor de código de preferencia.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Dependencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;axios&lt;/li&gt;
&lt;li&gt;dotenv&lt;/li&gt;
&lt;li&gt;discord.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para instalar las dependencias abriremos la consola y nos ubicamos en la carpeta del proyecto, y luego escribiremos los siguientes comandos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npm i axios dotenv discord.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abriremos el archivo &lt;strong&gt;package.json&lt;/strong&gt; y agregaremos esto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node ./src index.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Estrucutra del proyecto
&lt;/h2&gt;

&lt;p&gt;cryptocurrency-discord-bot/&lt;br&gt;
├── node_modules/&lt;br&gt;
├── src/&lt;br&gt;
│   └── index.js&lt;br&gt;
├── .env&lt;br&gt;
└── package.json&lt;/p&gt;
&lt;h2&gt;
  
  
  Tabla de Contenido
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Creación de nuestro servidor de Discord&lt;/li&gt;
&lt;li&gt;Creación del bot y añadirlo a nuestro servidor&lt;/li&gt;
&lt;li&gt;Programando nuestro bot&lt;/li&gt;
&lt;li&gt;Comandos del bot&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  1. Creación de nuestro servidor de Discord &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Para poder probar nuestro bot, primero debemos crear un servidor de discord, para eso debemos seguir los siguientes pasos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abriremos Discord.&lt;/li&gt;
&lt;li&gt;Haremos clic en el botón de &lt;strong&gt;+&lt;/strong&gt; en la parte inferior izquierda.&lt;/li&gt;
&lt;li&gt;Seleccionaremos &lt;strong&gt;Crear un servidor&lt;/strong&gt; y seleccionaremos la opción &lt;strong&gt;para mi y mis amigos&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4v89q29k9iic8qp82jnd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4v89q29k9iic8qp82jnd.png" alt="New server button" width="61" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dc59wszee1t66t2slgl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6dc59wszee1t66t2slgl.png" alt="create server option" width="488" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Después de crear el servidor, haremos clic en el icono de engranaje para abrir los &lt;em&gt;ajustes de usuario&lt;/em&gt;, luego haremos clic en la opción &lt;em&gt;Avanzado&lt;/em&gt;, y activamos el &lt;strong&gt;modo desarrollador&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffh7dfxqp4j51c0dxv9bh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffh7dfxqp4j51c0dxv9bh.png" alt="Developer mode" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Creacion del bot y añadirlo a nuestro servidor &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Abriremos nuestro explorador y nos dirigiremos a &lt;a href="https://discord.com/developers/applications" rel="noopener noreferrer"&gt;Discord Developer Portal&lt;/a&gt;, y haremos clic donde dice &lt;strong&gt;Applications&lt;/strong&gt;, luego haremos clic en &lt;strong&gt;New Application&lt;/strong&gt;, nos mostrara un &lt;em&gt;modal&lt;/em&gt; donde podremos elegir el nombre de nuestra nueva aplicación.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbdumxoo46bcg399fs4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbdumxoo46bcg399fs4n.png" alt="Create a new discord application" width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora en el panel izquierdo hacemos clic en &lt;strong&gt;Bot&lt;/strong&gt; y luego en &lt;strong&gt;Add Bot&lt;/strong&gt;. En esta parte podremos elegir el nombre y el icono que tendrá nuestro bot, abajo veremos el &lt;strong&gt;token&lt;/strong&gt;, lo vamos a copiar y guardar en un archivo de texto, ya que lo necesitaremos más adelante.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9mtd7j7uokhdw6qxcya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9mtd7j7uokhdw6qxcya.png" alt="bot tab" width="324" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejf53xwz5qx38jm674p8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejf53xwz5qx38jm674p8.png" alt=" " width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deslizamos hacia abajo y haremos clic en &lt;em&gt;Privileged Gateway Intents&lt;/em&gt;, aquí tildamos algunos &lt;em&gt;intents&lt;/em&gt; para que se nos haga posible interactuar con nuestro bot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1o6zu0rraoq02n4higb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1o6zu0rraoq02n4higb.png" alt="discord intents" width="799" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora iremos a &lt;strong&gt;OAuth2&lt;/strong&gt; -&amp;gt; &lt;strong&gt;URL Generator&lt;/strong&gt;, encontraremos un panel con la etiqueta &lt;strong&gt;SCOPES&lt;/strong&gt;, tildamos donde dice &lt;strong&gt;bot&lt;/strong&gt; y se generará una URL, la copiaremos y la pegaremos en una nueva pestaña de nuestro explorador.&lt;/p&gt;

&lt;p&gt;Podremos observar algo similar a la imagen de abajo, ahora seleccionaremos nuestro servidor y haremos clic en el boton &lt;strong&gt;Authorize&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpp2m6bxewihlg3kae2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpp2m6bxewihlg3kae2a.png" alt="oauth tab" width="799" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdd3yp2f871yalsu72ikt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdd3yp2f871yalsu72ikt.png" alt="adding the bot" width="638" height="884"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finalmente podremos ver que el bot esta en nuestro servidor, ahora podemos emepzar a programarlo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4w168dak6pz1bu8ku85b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4w168dak6pz1bu8ku85b.png" alt="bot in the server" width="659" height="112"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Programando nuestro Bot &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Empezaremos a programar nuestro bot, primero crearemos un archivo &lt;strong&gt;.env&lt;/strong&gt; en la raíz de nuestro proyecto, agregaremos una variable de entorno llamada &lt;strong&gt;BOT_TOKEN&lt;/strong&gt; y le asignaremos el token que guardamos en la sección anterior.&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;BOT_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;colocar&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;aqui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora iremos a &lt;em&gt;index.js&lt;/em&gt;, y vamos a importar los discord.js, axios y dotenv.&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;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;axios&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;Discord&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;discord.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&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;dotenv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego crearemos un objeto client desde la clase Discord utilizando el constructor Client, y pasaremos los intents de la siguiente manera.&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;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Discord&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;intents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GUILDS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GUILD_MEMBERS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GUILD_MESSAGES&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GUILD_MESSAGE_REACTIONS&lt;/span&gt;&lt;span class="dl"&gt;"&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;Ahora haremos que nuestro bot aparezca online usando el método &lt;em&gt;login&lt;/em&gt; y agregaremos un event listener para que nos muestre un mensaje en la consola cuando el bot esté listo.&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ready&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hello my name is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BOT_TOKEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deberíamos obtener un mensaje como este.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;Hello my name is cryptocurrency-bot#&lt;/span&gt;0235!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsyxcmoytib1rh88cb9u5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsyxcmoytib1rh88cb9u5.png" alt="Bot online" width="223" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Creando los comandos de nuestro bot &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Para este ejemplo solo creare tres comandos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;!help&lt;/em&gt; para obtener un listado de todos los comandos asi como una descripción.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;!currencies&lt;/em&gt; para obtener todas las monedas disponibles.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;!crypto_price&lt;/em&gt; para obtener el precio de la criptomoneda en la moneda deseada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  1. Empecemos creando nuestro comando &lt;strong&gt;!help&lt;/strong&gt;.
&lt;/h4&gt;

&lt;p&gt;Usaremos el objeto cliente con el escuchador de eventos, estaremos escuchando el evento &lt;strong&gt;messageCreate&lt;/strong&gt; que se emitirá cada vez que un mensaje sea creado, y usaremos async/await porque estaremos haciendo peticiones HTTP a la API de Coingecko.&lt;/p&gt;

&lt;p&gt;Por favor asegurate de leer la documentación de &lt;a href="https://discord.js.org/#/docs/discord.js/main/class/Client?scrollTo=e-messageCreate" rel="noopener noreferrer"&gt;discord.js&lt;/a&gt; y &lt;a href="https://discord.com/developers/docs/topics/rpc#messagecreatemessageupdatemessagedelete" rel="noopener noreferrer"&gt;discord&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con &lt;code&gt;msg.content&lt;/code&gt; podremos obtener el texto que envió el usuario, si el mensaje es igual a &lt;code&gt;!help&lt;/code&gt; entonces responderemos al usuario con los comandos y la descripción de cada uno.&lt;/p&gt;

&lt;p&gt;Los &lt;em&gt;Embeds&lt;/em&gt; son una manera de darle formato y estilos a nuestro a mensajes, puedes encontrar mas informacion en la &lt;a href="https://discord.js.org/#/docs/builders/main/class/EmbedBuilder" rel="noopener noreferrer"&gt;documentación&lt;/a&gt;&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messageCreate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;!help&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;embed1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Discord&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MessageEmbed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Command list&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**!help** - shows the command list &lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**!currencies** to get all the suppported currencies. &lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**!crypto_price** *&amp;lt;currencies&amp;gt;* *&amp;lt;cryptocurrencies&amp;gt;* to get the value of the cryptocurrency in another currency, to use it first type the **currency** and then the **cryptocurrency** e.g. (**!crypto_price usd bitcoin**), can also add more currencies and cryptos separating them with commas but without spaces e.g. (**!crypto_price usd,eur,btc bitcoin,ethereum**) &lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;embeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;embed1&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;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora si probamos nuestro comando &lt;em&gt;!help&lt;/em&gt; obtendremos algo similar a esto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqw3qv0i8crlzl4780git.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqw3qv0i8crlzl4780git.png" alt="help command" width="598" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Sigamos con nuestro comando &lt;strong&gt;!currencies&lt;/strong&gt;.
&lt;/h3&gt;

&lt;p&gt;Volvamos a nuestro codigo, y en lugar de un bloque if, usaremos un bloque switch con &lt;code&gt;msg.content&lt;/code&gt; de esta manera, y de momento solo enviamos un mensaje que diga &lt;em&gt;!currencies command&lt;/em&gt; cuando el usuario escriba &lt;em&gt;!currencies&lt;/em&gt;.&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messageCreate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!help&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!commands&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;embed1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Discord&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MessageEmbed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Command list&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**!help** or **!commands** - shows the command list &lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**!currencies** to get all the suppported currencies. &lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**!crypto_price** *&amp;lt;currencies&amp;gt;* *&amp;lt;cryptocurrencies&amp;gt;* to get the value of the cryptocurrency in another currency, to use it first type the **currency** and then the **cryptocurrency** e.g. (**!crypto_price usd bitcoin**), can also add more currencies and cryptos separating them with commas but without spaces e.g. (**!crypto_price usd,eur,btc bitcoin,ethereum**) &lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;embeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;embed1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!currencies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;!currencies command&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;break&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;Ahora borraremos esta linea &lt;code&gt;msg.channel.send('!currencies command')&lt;/code&gt;, y haremos una petición GET a la &lt;a href="https://www.coingecko.com/en/api/documentation" rel="noopener noreferrer"&gt;API de Coingecko&lt;/a&gt; y obtendremos todas las monedas disponibles.&lt;/p&gt;

&lt;p&gt;Utilice el método map para obtener cada moneda en cursiva y luego asignarla a una constante llamada &lt;strong&gt;currencies&lt;/strong&gt;, luego cree un nuevo embed.&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;res&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;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.coingecko.com/api/v3/simple/supported_vs_currencies&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;currencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`*&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;embed2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Discord&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MessageEmbed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Supported Currencies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currencies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#0099ff&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setFooter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Powered by CoinGecko&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;embeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;embed2&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 si probamos el comando &lt;em&gt;!currencies&lt;/em&gt; obtendremos esto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnavfnclg10u8qwbiq3d6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnavfnclg10u8qwbiq3d6.png" alt="!currencies" width="604" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Por último el comando &lt;em&gt;!crypto_price&lt;/em&gt;.
&lt;/h4&gt;

&lt;p&gt;Para este comando el usuario enviará un mensaje como este &lt;code&gt;!crypto_price usd,eur bitcoin&lt;/code&gt;, por lo que debemos separar el string por espacios con &lt;code&gt;.split(' ')&lt;/code&gt;. Esto va a separar el string en tres partes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La primera parte será &lt;code&gt;!crypto_price&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La segunda parte será &lt;code&gt;usd,eur&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La tercera parte será &lt;code&gt;bitcoin&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crearemos dos variables, una llamada &lt;strong&gt;curencies&lt;/strong&gt; y otra llamada *&lt;em&gt;cryptoCurrencies&lt;/em&gt; y asignaremos a cada una los valores correspondientes.&lt;/p&gt;

&lt;p&gt;Para obtener las palabras después de !crypto_proce debemos hacer uso de &lt;code&gt;msg.content.startsWith("!crypto_price")&lt;/code&gt; de otra manera el comando no funcionará.&lt;/p&gt;

&lt;p&gt;Antes del bloque &lt;code&gt;switch&lt;/code&gt; usaremos un bloque &lt;code&gt;if&lt;/code&gt;, si el mensaje empieza con &lt;code&gt;!crypto_price&lt;/code&gt; entonces ejecutaremos nuestro 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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messageCreate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!crypto_price&lt;/span&gt;&lt;span class="dl"&gt;"&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;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&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;span class="p"&gt;.&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;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora asignamos los valores respectivos de &lt;strong&gt;currencies&lt;/strong&gt; y &lt;strong&gt;cryptoCurrencies&lt;/strong&gt;separando el string.&lt;/p&gt;

&lt;p&gt;Necesitamos crear una condicional en caso de que el usuario coloque los datos de forma incorrecta, o en caso de que el usuario no coloque ningún dato en el comando. Si este es el caso necesitamos enviar un mensaje al usuario, en este caso enviaremos un mensaje al usuario para que recuerde cómo hacer uso del comando.&lt;/p&gt;

&lt;p&gt;Ahora haremos una petición GET a la API, además debemos chequear si el objeto que recibimos de la respuesta no este vacío, en caso de estarlo es por algun dato fue escrito de forma incorrecta, en este caso enviaremos nuevamente el mismo mensaje al usuario para que haga uso adecuado del comando.&lt;/p&gt;

&lt;p&gt;Obtendremos los datos de la siguiente manera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;data: {
    bitcoin: { usd: 21816, eur: 20872 },
    ethereum: { usd: 1177.46, eur: 1126.54 }
  }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;usaremos un &lt;em&gt;for loop&lt;/em&gt; dentro de otro &lt;em&gt;for loop&lt;/em&gt; para manipular los datos, luego usaremos un embed para darle formato al texto.&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!crypto_price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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;currencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cryptoCurrencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cryptoCurrencies&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;currencies&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&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;embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Discord&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MessageEmbed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Please provide a currency and a cryptocurrency, remember to separate them with commas but without spaces e.g. (!crypto_price usd,eur bitcoin,ethereum)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#ff0000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;embeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;embed&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="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;`https://api.coingecko.com/api/v3/simple/price?ids=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cryptoCurrencies&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;vs_currencies=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;currencies&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

      &lt;span class="c1"&gt;//if res is empty&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Discord&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MessageEmbed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Please enter the **currency** and the **cryptocurrency** you want to convert to, remember to separate them with commas but without spaces e.g. (*!crypto_price usd,eur,btc bitcoin,ethereum*).&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#ff0000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;embeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;embed&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;cryptoCurrency&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;currency&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cryptoCurrency&lt;/span&gt;&lt;span class="p"&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;embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Discord&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;MessageEmbed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
          &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`**&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cryptoCurrency&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;** price in **&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;** ➡️ &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cryptoCurrency&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

          &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;embeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;embed&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;span class="p"&gt;}&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;Si intentamos usar &lt;strong&gt;!crypto_price&lt;/strong&gt; obtendremos algo similar a esto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqms7rd18nuqeiktqoy9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqms7rd18nuqeiktqoy9.png" alt="!crypto_price command" width="367" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Conclusión &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;En este post aprendimos a crear un bot de criptomonedas para discord, utilizando &lt;strong&gt;discord.js&lt;/strong&gt; y &lt;strong&gt;node.js&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Realmente espero que hayas podido llegar hasta aquí, en caso de que hayas tenido algún problema por favor no dudes en ponerte en contacto o dejar un comentario.&lt;/p&gt;

&lt;p&gt;Puedes contactarme a traves de &lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt; o puedes encontrarme en Discord como &lt;strong&gt;Appu#9136&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gracias por tu tiempo.&lt;/p&gt;

</description>
      <category>discord</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>spanish</category>
    </item>
    <item>
      <title>How to get started with cryptocurrencies?</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Fri, 02 Sep 2022 21:34:04 +0000</pubDate>
      <link>https://dev.to/rtagl/how-to-get-started-with-cryptocurrencies-41df</link>
      <guid>https://dev.to/rtagl/how-to-get-started-with-cryptocurrencies-41df</guid>
      <description>&lt;h1&gt;
  
  
  How to get started with cryptocurrencies?
&lt;/h1&gt;

&lt;p&gt;The following post is made in order to understand in a simple way what cryptocurrencies are, how to buy/sell them, what benefits are obtained from them, and what can be done with them.&lt;/p&gt;

&lt;p&gt;I have written this post with the intention of helping users to start with cryptocurrencies, and also to those who want to learn how to use them, because nowadays there are many jobs or sources of income that make payments only through cryptocurrencies (in case you are interested in &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt; you can find jobs that pay with cryptocurrencies) and perhaps due to lack of knowledge users prefer to discard these offers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are cryptocurrencies?
&lt;/h2&gt;

&lt;p&gt;To explain it briefly we could say that cryptocurrencies are &lt;em&gt;digital currencies&lt;/em&gt; that are characterized by being &lt;em&gt;decentralized&lt;/em&gt;, that is to say they are not regulated by any organization, they do not need to go through an intermediary to be transferred (banks).&lt;/p&gt;

&lt;h2&gt;
  
  
  What are stable cryptocurrencies?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;They are a solution to try to reduce the volatility of cryptocurrencies&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Imagine living in a country where the currency is constantly devaluating and you cannot save money, and in addition to this it is difficult to buy foreign currency or open a bank account to save it.&lt;/p&gt;

&lt;p&gt;A simple solution would be to buy stable cryptocurrencies, such as (&lt;strong&gt;USDT&lt;/strong&gt;, &lt;strong&gt;USDC&lt;/strong&gt;) are cryptocurrencies whose value is backed by the dollar or euro, i.e. 1 dollar would be  1 USDT or USDC for example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to buy cryptocurrencies?
&lt;/h2&gt;

&lt;p&gt;Today there are several ways to get cryptocurrencies, among the most popular are Binance and FTX.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I will explain how to use Binance as it is the option I personally use the most and the most popular at present.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to buy cryptocurrencies on Binance?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=""&gt;Account creation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;Identification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;Buy cryptocurrencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;Sell cryptocurrencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;Convert cryptocurrencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;Receive cryptocurrencies&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Below I will explain step by step how to buy your first cryptocurrencies in Binance in a very simple way.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Account creation
&lt;/h2&gt;

&lt;p&gt;The first thing we will do is to create our account in &lt;a href="https://accounts.binance.com/en/register?ref=165992986" rel="noopener noreferrer"&gt;Binance&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Identification
&lt;/h2&gt;

&lt;p&gt;Once registered we will go to the identification section, where we must follow a series of steps, this will be necessary to start buying and selling cryptocurrencies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw6snq9nlpg6cl10f5ht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw6snq9nlpg6cl10f5ht.png" alt="Alt text" width="246" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Buy cryptocurrencies
&lt;/h2&gt;

&lt;p&gt;Once the previous step has been completed and verified we will go to the &lt;em&gt;Trade&lt;/em&gt; the clic on &lt;em&gt;P2P&lt;/em&gt;. Perhaps the interface may look a bit overwhelming but it is very simple to use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzwrr5ntt4y4mr4rgull.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzwrr5ntt4y4mr4rgull.png" alt="Alt text" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to follow.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We are going to find a &lt;strong&gt;Buy/Sell&lt;/strong&gt; switch button, as we are going to buy we will leave it on &lt;strong&gt;Buy&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next we will see eight cryptocurrencies with which we can trade, we will leave it in USDT or BUSD which are stable cryptocurrencies (its value is backed by to the value of the dollar, ie 1 USDT = $1).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0uzzauuaqj04exx0912.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0uzzauuaqj04exx0912.png" alt="Alt text" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Optionally select the amount of FIAT or local currency we are going to use to buy the cryptocurrencies, this will help us to better filter the search.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will select the FIAT which will be the currency we are going to use to buy the cryptocurrencies, by clicking you can find Euro, US Dollar, Mexican Peso, Argentine Peso, Bolivar, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We can also filter by payment method, by clicking we will be able to see a list of banks, as well as other payment methods such as in Venezuela Pago Móvil, or in Argentina MercadoPago, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoz6asc9m2jfb9pv71uj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoz6asc9m2jfb9pv71uj.png" alt="Alt text" width="799" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After this we will see a list of advertisers, where we can see information such as number of transactions made, and percentage of transaction completion &lt;em&gt;use this as a guide before making any transaction, if a person has low percentage I recommend jumping to another advertiser with higher percentage to avoid being scammed&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuc8sn08actdv64g8khm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuc8sn08actdv64g8khm.png" alt="Alt text" width="799" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The price at which the advertiser sells the cryptocurrency, in the example of the image we can see that the advertiser sells each unit of USDT at 1.003 EUR.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The limit and availability, in the first line we can see how much USDT he has, and in the next one the minimum and maximum we can buy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The type of payment we will use in this transaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After agreeing with the price, limit, and being sure we want to buy from the advertiser we will proceed to click &lt;strong&gt;Buy USDT&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When clicking on &lt;strong&gt;Buy USDT&lt;/strong&gt; a page with two sections will be displayed, on the left we will be able to see the data we saw before, followed by the advertiser's Terms and Conditions, and on the right two fields, the first of how much we are going to pay, and the second will automatically show us when we are going to receive according to what we have paid. It remains to click again on &lt;strong&gt;Buy USDT&lt;/strong&gt; and complete the transaction.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8njnhfkokzq2no3vn7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8njnhfkokzq2no3vn7h.png" alt="Alt text" width="798" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once the previous operation is successfully completed, we will be able to see our USDT in the following &lt;a href="https://www.binance.com/en/my/wallet/funding" rel="noopener noreferrer"&gt;link&lt;/a&gt;, or by clicking on Wallet and then on Funding.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661872520%2Fuser%2Ffile%2Fodeefqniuqgghjeyx957.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661872520%2Fuser%2Ffile%2Fodeefqniuqgghjeyx957.png" width="203" height="509"&gt;&lt;/a&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661872529%2Fuser%2Ffile%2Fgsphvir53jqjdflk1c4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661872529%2Fuser%2Ffile%2Fgsphvir53jqjdflk1c4i.png" width="800" height="546"&gt;&lt;/a&gt;
&lt;/p&gt;
 




&lt;h2&gt;
  
  
  4. Selling cryptocurrencies
&lt;/h2&gt;

&lt;p&gt;The process to sell cryptocurrencies is similar to buying them, here are a series of steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Assign a payment method
&lt;/h3&gt;

&lt;p&gt;The first thing we must do is to assign a payment method that we will use to get the money from the sale.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We must go to our &lt;em&gt;User Panel&lt;/em&gt; and once there look in the left panel for the &lt;em&gt;Payment&lt;/em&gt; option.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661873024%2Fuser%2Ffile%2Fhzxmmm3inudabuucfzbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661873024%2Fuser%2Ffile%2Fhzxmmm3inudabuucfzbv.png" width="248" height="490"&gt;&lt;/a&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661873043%2Fuser%2Ffile%2Feskmorahdumzvd9drgys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661873043%2Fuser%2Ffile%2Feskmorahdumzvd9drgys.png" width="235" height="501"&gt;&lt;/a&gt;
&lt;/p&gt;
 

&lt;ol&gt;
&lt;li&gt;In the Payment page we will be able to observe a button &lt;em&gt;Add a payment method&lt;/em&gt; in which we must click.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqef852jj1rl520nqh15k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqef852jj1rl520nqh15k.png" alt="Alt text" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A window will open where we will be able to choose between multiple methods, we can search by Letter or use the search engine to make a more exact search.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhif2u4ozs1z6bkozla94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhif2u4ozs1z6bkozla94.png" alt="Alt text" width="557" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After choosing, it will take us to a form that we must fill with the required data. Once filled we will click on confirm, and we will have our payment method added.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthxkel8p4ys3y0fjplrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthxkel8p4ys3y0fjplrm.png" alt="Alt text" width="786" height="703"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Steps to follow to sell.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Now click on &lt;em&gt;Trade&lt;/em&gt; followed by &lt;em&gt;P2P&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzwrr5ntt4y4mr4rgull.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzwrr5ntt4y4mr4rgull.png" alt="Alt text" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We will click on the switch button and leave it on &lt;em&gt;Sell&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh23jz5j5dz221556um7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh23jz5j5dz221556um7.png" alt="Alt text" width="637" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We will select among the options of cryptocurrencies to sell.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will be able to indicate the &lt;em&gt;Amount&lt;/em&gt;, the FIAT or the currency that we are going to receive, and the method of payment that we will use to receive the money of our sale.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhd91ghsm6lzdur8dif8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhd91ghsm6lzdur8dif8l.png" alt="Alt text" width="800" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Next we will see a list of advertised &lt;em&gt;number of orders placed&lt;/em&gt; and the &lt;em&gt;completion rate&lt;/em&gt; of the transactions, followed by the &lt;em&gt;price&lt;/em&gt;, the &lt;em&gt;availability&lt;/em&gt; and &lt;em&gt;limit&lt;/em&gt;, and &lt;em&gt;the method of payment&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5m1kuukyt9ykaxm5egd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5m1kuukyt9ykaxm5egd0.png" alt="Alt text" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Once we are sure of which advertiser to make the transaction with, we will click on &lt;em&gt;sell&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A window divided in two panels will be shown, where on the left it will show us the information we read previously, and on the right two fields, in the first one the amount of cryptocurrency we will sell, and in the second one the amount we will receive will be shown. Once this is confirmed we will click again on Sell.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zvxjkljz08knb76jh1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zvxjkljz08knb76jh1r.png" alt="Alt text" width="799" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once the advertiser has confirmed that the payment has been made, &lt;strong&gt;we must check that the funds are available in our bank account&lt;/strong&gt; and we will proceed to release the cryptocurrencies.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5. Convert cryptocurrencies
&lt;/h2&gt;

&lt;p&gt;When buying cryptocurrencies we can only choose between 8 options in the P2P section, so in case we need another cryptocurrency we can take advantage of this functionality.&lt;/p&gt;

&lt;p&gt;We will click on convert or we will go to the following &lt;a href="https://www.binance.com/en/convert?fromCoin=USDT" rel="noopener noreferrer"&gt;link&lt;/a&gt; where we can see a window with two fields, in the first one we can select which cryptocurrency we want to convert, in this case the USDT we bought in the previous step, and we will place the amount, and in the second field we can select to which cryptocurrency we want to convert, Finally we click on convert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi355szae3xhe4zwcfon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi355szae3xhe4zwcfon.png" alt="Alt text" width="789" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9k4gicnh6fym6mkbivzh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9k4gicnh6fym6mkbivzh.png" alt="Alt text" width="746" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. How to receive cryptocurrencies?
&lt;/h2&gt;

&lt;p&gt;It may be the case that we have found a job that pays in cryptocurrencies, like many of those we can find in &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt; or that we simply want someone to pay us in cryptocurrencies. In order to receive, we simply need to search in the Wallet for the cryptocurrency we want to receive and click on &lt;em&gt;Deposit&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For example, if we want to receive Solana we look for &lt;strong&gt;SOL&lt;/strong&gt; or solana, and click on &lt;em&gt;Deposit&lt;/em&gt;, once here we will see a window with two fields, the first one corresponds to the cryptocurrency, and the second one to the network from where the cryptocurrencies will be sent to us, once we select the network we will obtain the address of our wallet which we will copy and send to the person who is going to send us the cryptocurrencies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh91vnw2a1qrcxjgiued.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh91vnw2a1qrcxjgiued.png" alt="Alt text" width="799" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuy9o210jrwzzcys4lguc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuy9o210jrwzzcys4lguc.png" alt="Alt text" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coingecko
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.coingecko.com/" rel="noopener noreferrer"&gt;Coingecko&lt;/a&gt; is a website, which provides information about the performance of a large number of available cryptocurrencies. It uses real time data, shows price fluctuation in various time periods.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In short for those who need to check the price of a cryptocurrency can use this web application&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  PancakeSwap
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pancakeswap.finance/" rel="noopener noreferrer"&gt;PancakeSwap&lt;/a&gt; is a decentralized exchange platform &lt;strong&gt;DEX&lt;/strong&gt; for tokens within the Binance Smart Chain or also known as &lt;strong&gt;BSC&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;PancakeSwap cuts out the intermediaries on centralized exchanges, letting other users take those commissions instead. If you're willing to lock up your tokens for a while, the rewards can be very plentiful, especially with some of the liquidity pools and betting options.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PancakeSwap may be a bit of a challenge for those new to cryptocurrencies, but it may be worth checking out.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sites that accept payments in cryptocurrency
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.coinsbee.com/en/#pagetop" rel="noopener noreferrer"&gt;Coinsbee&lt;/a&gt; in this site you can find a variety of gift cards (Amazon, Google Play, Steam, Netflix, etc).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitrefill.com/buy/?hl=en" rel="noopener noreferrer"&gt;Bitrefill&lt;/a&gt; is a site similar to Coinsbee, with sales of gift cards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.newegg.com/" rel="noopener noreferrer"&gt;Newegg&lt;/a&gt; Here you can buy PC components, laptops, monitors, game consoles, gadgets, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terms
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bitcoin
&lt;/h3&gt;

&lt;p&gt;When we talk about Bitcoin, we talk about the first platform based on blockchain that sought from its beginnings to be a secure, fast and decentralized payment method. And the cryptocurrency also known as &lt;strong&gt;BTC&lt;/strong&gt;, whose current value you can check &lt;a href="https://www.coingecko.com/en/coins/bitcoin" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Blockchain
&lt;/h3&gt;

&lt;p&gt;Blockchain is a chain of blocks, which contain encrypted information of a transaction that was made on the network. And being in chain allows data to be transferred securely thanks to cryptographic encryption.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exchange
&lt;/h3&gt;

&lt;p&gt;They are sites where we can buy and sell cryptocurrencies. Currently there are many, some with more catalog than others, as well as higher commissions on some than others. Some examples of these sites are Binance, FTX, LocalBitcoins, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fiat
&lt;/h3&gt;

&lt;p&gt;Fiat is a government approved currency that is backed by physical commodities, e.g. USD, EUR, your country's local currency, etc. &lt;/p&gt;

&lt;h3&gt;
  
  
  P2P
&lt;/h3&gt;

&lt;p&gt;Its acronym stands for "Peer to Peer", and in the context of &lt;em&gt;Blockchain&lt;/em&gt; it refers to a network of computers that are connected to each other without the need for a server or centralized entity. In other words, it is a direct connection between two computers or users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transaction
&lt;/h3&gt;

&lt;p&gt;Any action that is performed within a blockchain. Example: receive or send cryptocurrencies to another person. &lt;br&gt;
another person.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wallet
&lt;/h3&gt;

&lt;p&gt;We can think of a wallet as an account or address to receive cryptocurrencies. They can be online, physical or a local application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wallets
&lt;/h2&gt;

&lt;p&gt;Wallets are instruments to receive and send cryptocurrencies. They exist online, physical or local applications.&lt;/p&gt;

&lt;p&gt;Among the most popular ones we can find the following.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://metamask.io/" rel="noopener noreferrer"&gt;Metamask&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;It is a browser extension that also works as a &lt;strong&gt;wallet&lt;/strong&gt; serves to receive and send cryptocurrencies. as well as to be able to interact with web applications that are based on the Ethereum blockchain as &lt;strong&gt;PancakeSwap&lt;/strong&gt; for example.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://phantom.app/" rel="noopener noreferrer"&gt;Phantom&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;As well as &lt;strong&gt;Metamask&lt;/strong&gt;, Phantom is a browser extension that works as a &lt;em&gt;wallet&lt;/em&gt; serves to receive and send cryptocurrencies in &lt;strong&gt;Solana&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is required to interact with web applications that use the Solana blockchain, such as &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This wallet has a special functionality that consists of &lt;strong&gt;Burn NFTs&lt;/strong&gt; this is a process in which the NFT is removed and the wallet owner is refunded the amount that was used at the time of &lt;em&gt;Burning&lt;/em&gt; the NFT.&lt;/p&gt;

&lt;p&gt;If you are interested in learning more about it you can go to the following &lt;a href="https://www.codenjobs.com/blog?&amp;amp;title=How-to-mint-a-NFT-on-Solana?&amp;amp;id=c5f20b8b-c68d-4b3f-bf08-50fe1110c7c8" rel="noopener noreferrer"&gt;post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this post we learned a little about cryptocurrencies, what we can do with them, how to acquire them, sell them and even learned about some stores where we can use them directly.&lt;/p&gt;

&lt;p&gt;If you have any questions or suggestions feel free to leave a comment on this post, I will answer as soon as possible.&lt;/p&gt;

&lt;p&gt;Feel free to contact me by &lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;telegram&lt;/a&gt; or adding me to Discord as &lt;strong&gt;Appu#9136&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Thank you very much for your time.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>¿Cómo iniciar con las criptomonedas?</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Fri, 02 Sep 2022 21:33:03 +0000</pubDate>
      <link>https://dev.to/rtagl/como-iniciar-con-las-criptomonedas-44d1</link>
      <guid>https://dev.to/rtagl/como-iniciar-con-las-criptomonedas-44d1</guid>
      <description>&lt;h1&gt;
  
  
  ¿Cómo iniciar con las criptomonedas?
&lt;/h1&gt;

&lt;p&gt;El siguiente post está hecho con el fin de entender de una forma sencilla qué son las criptomonedas, como comprarlas/venderlas, qué beneficios se obtienen de las mismas, y que es lo que se puede hacer con ellas.&lt;/p&gt;

&lt;p&gt;Este post lo he escrito con la intención de ayudar a los usuarios a iniciar con las criptomonedas, y también a los que quieren aprender a usarlas, ya que en la actualidad hay muchos empleos o fuentes de ingresos que realizan pagos únicamente mediante criptomonedas (en caso de que te interese en &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt; puedes encontrar empleos que paguen con criptomonedas) y quizás por falta de conocimiento los usuarios prefieren descartar estas ofertas.&lt;/p&gt;

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

&lt;p&gt;Para explicarlo de forma breve se podría decir que las criptomonedas son &lt;em&gt;monedas digitales&lt;/em&gt; que se caracterizan por ser &lt;em&gt;descentralizadas&lt;/em&gt; es decir no están reguladas por ninguna organización, no necesitan pasar por un intermediario para ser transferidas (bancos).&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué son las criptomonedas estables?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Son una solución para tratar de reducir la volatilidad de las criptomonedas.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Imaginemos estar en la situación de vivir en un país donde la moneda se devalúa constantemente y no puedas ahorrar dinero, y sumado a esto se dificulte comprar divisas o aperturar una cuenta bancaria para el ahorro de estas.&lt;/p&gt;

&lt;p&gt;Una solución sencilla sería comprar criptomonedas estables, como por ejemplo (USDT, USDC) son criptomonedas cuyo valor está respaldado por el dólar o euro, es decir 1 dólar sería igual a 1 USDT o USDC por ejemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Dónde comprar criptomonedas?
&lt;/h2&gt;

&lt;p&gt;A día de hoy existen varias formas de conseguir criptomonedas, entre las más populares estan Binance y FTX.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicaré como usar Binance ya que personalmente es la opción que más uso y la más popular en la actualidad.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo comprar criptomonedas en Binance?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Creación de cuenta&lt;/li&gt;
&lt;li&gt;Identificación&lt;/li&gt;
&lt;li&gt;Comprar criptomonedas&lt;/li&gt;
&lt;li&gt;Vender criptomonedas&lt;/li&gt;
&lt;li&gt;Convertir criptomonedas&lt;/li&gt;
&lt;li&gt;Recibir criptomonedas&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;A continuación te explicaré paso a paso cómo comprar tus primeras criptomonedas en Binance de forma muy sencilla.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Creación de cuenta &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Lo primero que haremos será crear nuestra cuenta en &lt;a href="https://accounts.binance.com/en/register?ref=165992986" rel="noopener noreferrer"&gt;Binance&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Identificación &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Una vez registrados nos dirigiremos a la sección de identificación, donde debemos seguir una serie de pasos, esto será necesario para empezar a comprar y vender criptomonedas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtw50v4n8vflo4f7as6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxtw50v4n8vflo4f7as6q.png" alt="Alt text" width="799" height="41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw6snq9nlpg6cl10f5ht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw6snq9nlpg6cl10f5ht.png" alt="Alt text" width="246" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Comprar criptomonedas &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Una vez se haya completado y verificado el paso anterior nos vamos a dirigir a la sección de &lt;em&gt;Trade&lt;/em&gt; y &lt;em&gt;cuenta P2P&lt;/em&gt;. Quizás la interfaz pueda lucir un poco abrumadora pero es muy sencilla de usar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzwrr5ntt4y4mr4rgull.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzwrr5ntt4y4mr4rgull.png" alt="Alt text" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pasos a seguir.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Vamos a encontrarnos un botón switch de &lt;strong&gt;Buy/Sell&lt;/strong&gt;, como vamos a comprar lo dejaremos en &lt;strong&gt;Buy&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seguido veremos ocho criptomonedas con las que podremos tradear, no es necesario que te hagas mucha cabezas con esto, vamos a dejarlo en USDT o BUSD que son criptomonedas estables (su valor está anclado al valor del dólar, es decir 1 USDT = $1).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0uzzauuaqj04exx0912.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0uzzauuaqj04exx0912.png" alt="Alt text" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Una vez seleccionemos opcionalmente la cantidad de FIAT o moneda local que vamos a utilizar para comprar las criptomonedas, esto nos ayudará a filtrar mejor la búsqueda.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Seleccionaremos el FIAT que será la moneda que vamos a utilizar para comprar las criptomonedas, al hacer clic podras encontrar Euro, Dolar americano, Peso Mexicano, Peso Argentino, Bolívares, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;También podemos filtrar por medio de pago, al hacer clic podremos ver un listado de bancos, así como otros medio de pago como por ejemplo en Venezuela Pago Móvil, o en Argentina MercadoPago, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoz6asc9m2jfb9pv71uj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoz6asc9m2jfb9pv71uj.png" alt="Alt text" width="799" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Después de esto veremos una lista de anunciantes, donde podremos ver información como cantidad de transacciones realizadas, y porcentaje de completación de transacciones &lt;em&gt;usa esto de guía antes de realizar cualquier transacción, si una persona tiene porcentaje bajo recomiendo saltar a otro anunciantes con mayor porcentaje para evitar ser estafado&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuc8sn08actdv64g8khm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftuc8sn08actdv64g8khm.png" alt="Alt text" width="799" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;El precio en el que anunciante vende la criptomoneda, en el ejemplo de la imagen podemos ver que el anunciante vende cada unidad de USDT a 1.003 EUR.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El límite y la disponibilidad, en la primera línea podemos ver de cuanto USDT dispone, y en la siguiente el mínimo y el máximo que podemos comprar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El tipo de pago que utilizaremos en esta transacción.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Después de estar de acuerdo con el precio, límite, y estar seguros de querer comprar al anunciante procederemos a hacer clic en &lt;strong&gt;Buy USDT&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Al hacer clic en &lt;strong&gt;Buy USDT&lt;/strong&gt; se desplegará una página con dos secciones, a la izquierda podremos observar los datos que vimos anteriormente, seguido de Términos y Condiciones del anunciante, y a la derecha dos campos, el primero de cuanto vamos a pagar, y el segundo nos mostrará de forma automática cuando vamos a recibir según lo pagado. Queda hacer clic nuevamente en &lt;strong&gt;Buy USDT&lt;/strong&gt; y completar la transacción.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8njnhfkokzq2no3vn7h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8njnhfkokzq2no3vn7h.png" alt="Alt text" width="798" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Una vez completada con éxito la operación anterior, podremos ver nuestros USDT en el siguiente &lt;a href="https://www.binance.com/en/my/wallet/funding" rel="noopener noreferrer"&gt;enlance&lt;/a&gt;, o haciendo clic en Wallet y luego en Funding.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661872520%2Fuser%2Ffile%2Fodeefqniuqgghjeyx957.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661872520%2Fuser%2Ffile%2Fodeefqniuqgghjeyx957.png" width="203" height="509"&gt;&lt;/a&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661872529%2Fuser%2Ffile%2Fgsphvir53jqjdflk1c4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661872529%2Fuser%2Ffile%2Fgsphvir53jqjdflk1c4i.png" width="800" height="546"&gt;&lt;/a&gt;
&lt;/p&gt;
 




&lt;h2&gt;
  
  
  4. Vender criptomonedas &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;El proceso para vender criptomonedas es similar al de comprarlas, a continuación dejaré una serie de pasos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Asignar un método de pago
&lt;/h3&gt;

&lt;p&gt;Lo primero que debemos hacer es asignar un método de pago que usaremos para que nos llegue el dinero de la venta.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Debemos ir a nuestro &lt;em&gt;Panel de usuario&lt;/em&gt; y una vez ahí buscar en el panel izquierdo la opción de &lt;em&gt;Pago&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661873024%2Fuser%2Ffile%2Fhzxmmm3inudabuucfzbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661873024%2Fuser%2Ffile%2Fhzxmmm3inudabuucfzbv.png" width="248" height="490"&gt;&lt;/a&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661873043%2Fuser%2Ffile%2Feskmorahdumzvd9drgys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcodenjobs%2Fimage%2Fupload%2Fv1661873043%2Fuser%2Ffile%2Feskmorahdumzvd9drgys.png" width="235" height="501"&gt;&lt;/a&gt;
&lt;/p&gt;
 

&lt;ol&gt;
&lt;li&gt;En la página de Pago podremos observar un botón de &lt;em&gt;Agregar un método de pago&lt;/em&gt; en el que debemos hacer clic.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqef852jj1rl520nqh15k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqef852jj1rl520nqh15k.png" alt="Alt text" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se abrirá una ventana donde podremos elegir entre múltiples métodos, podemos buscar por Letra o usar el buscador para hacer una búsqueda más exacta.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhif2u4ozs1z6bkozla94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhif2u4ozs1z6bkozla94.png" alt="Alt text" width="557" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Después de elegir, nos llevará a un formulario que debemos llenar con los datos requeridos. Una vez llenado haremos clic en confirmar, y ya tendremos nuestro método de pago añadido.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthxkel8p4ys3y0fjplrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthxkel8p4ys3y0fjplrm.png" alt="Alt text" width="786" height="703"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Pasos a seguir para vender.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ahora haremos clic en &lt;em&gt;Trade&lt;/em&gt; seguido de &lt;em&gt;cuenta P2P&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzwrr5ntt4y4mr4rgull.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzwrr5ntt4y4mr4rgull.png" alt="Alt text" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Haremos clic en el botón de switch y lo dejaremos en &lt;em&gt;Venta&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh23jz5j5dz221556um7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh23jz5j5dz221556um7.png" alt="Alt text" width="637" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Seleccionaremos entre las opciones de criptomonedas para vender.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Podremos señalar el &lt;em&gt;Monto&lt;/em&gt;, el FIAT o la moneda que vamos a recibir, y el método de pago que usaremos para recibir el dinero de nuestra venta.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhd91ghsm6lzdur8dif8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhd91ghsm6lzdur8dif8l.png" alt="Alt text" width="800" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A continuación veremos una lista de anunciarse con &lt;em&gt;número de órdenes realizadas&lt;/em&gt; y el &lt;em&gt;porcentaje de completación&lt;/em&gt; de las transacciones, seguido del &lt;em&gt;precio&lt;/em&gt;, la &lt;em&gt;disponibilidad&lt;/em&gt; y el &lt;em&gt;límite&lt;/em&gt;, y &lt;em&gt;el método de pago&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5m1kuukyt9ykaxm5egd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5m1kuukyt9ykaxm5egd0.png" alt="Alt text" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Una vez estemos seguros de con qué anunciante realizar la transacción, haremos clic en &lt;em&gt;vender&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se mostrará una ventana dividida en dos paneles, donde a la izquierda nos mostrará la información que leímos anteriormente, y en el derecho dos campos, en el primero la cantidad de criptomoneda que venderemos, y en el segundo se mostrará la cantidad que recibiremos. Una vez confirmado esto haremos clic nuevamente en Vender.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zvxjkljz08knb76jh1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zvxjkljz08knb76jh1r.png" alt="Alt text" width="799" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Una vez el anunciate haya confirmado que realizado el pago, &lt;strong&gt;debemos revisar que los fondos estén disponibles en nuestra cuenta&lt;/strong&gt; y procederemos a liberar las criptomonedas.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5. Convertir criptomonedas &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Al momento de comprar criptomonedas solo podemos elegir entre 8 opciones en la sección de P2P, por lo que en caso de necesitar otra criptomoneda podemos aprovechar esta funcionalidad.&lt;/p&gt;

&lt;p&gt;Haremos clic en convert o nos dirigiremos al siguiente &lt;a href="https://www.binance.com/en/convert?fromCoin=USDT" rel="noopener noreferrer"&gt;enlace&lt;/a&gt; donde podremos observar una ventana con dos campos, en el primero podremos seleccionar que criptomoneda deseamos convertir, en este caso los USDT que compramos en el paso anterior, y colocaremos la cantidad, y en el segundo campo podremos seleccionar a que criptomoneda deseamos convertir, Finalmente hacemos clic en convertir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi355szae3xhe4zwcfon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbi355szae3xhe4zwcfon.png" alt="Alt text" width="789" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9k4gicnh6fym6mkbivzh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9k4gicnh6fym6mkbivzh.png" alt="Alt text" width="746" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. ¿Cómo recibir criptomonedas? &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Puede darse el caso de que hayamos encontrado un empleo que pague en criptomonedas, como muchos de los que podemos encontrar en &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt; o que simplemente queramos que alguien nos pague en criptomonedas. Para poder recibir simplemente debemos buscar en el Wallet la criptomoneda que deseemos recibir y hacer clic en &lt;em&gt;Deposit&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Por ejemplo, si queremos recibir Solana buscamos SOL o solana, y hacemos clic en &lt;em&gt;Deposit&lt;/em&gt;, una vez aquí  veremos una ventana con dos campos, el primero corresponde a la criptomoneda, y el segundo a la red desde donde nos enviaran las criptomonedas, una vez seleccionemos la red obtendremos la dirección de nuestro wallet la cual copiaremos y enviaremos a la persona que nos va a enviar las criptomonedas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh91vnw2a1qrcxjgiued.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh91vnw2a1qrcxjgiued.png" alt="Alt text" width="799" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuy9o210jrwzzcys4lguc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuy9o210jrwzzcys4lguc.png" alt="Alt text" width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Coingecko
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.coingecko.com/" rel="noopener noreferrer"&gt;Coingecko&lt;/a&gt; es un sitio web, que nos brinda la información acerca del rendimiento de una gran cantidad de criptomonedas disponibles. Usa datos en tiempo real, muestra fluctuación de precios en varios periodos de tiempo.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;En resumen para los que necesiten consultar el precio de una criptomoneda pueden usar esta aplicación web&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  PancakeSwap
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pancakeswap.finance/" rel="noopener noreferrer"&gt;PancakeSwap&lt;/a&gt;es una plataforma de intercambio descentralizada (DEX) de tokens dentro la Binance Smart Chain o tambien conocida &lt;strong&gt;BSC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PancakeSwap elimina a los intermediarios de los intercambios centralizados, dejando que otros usuarios se hagan con esas comisiones en su lugar. Si estás dispuesto a bloquear tus tokens durante un tiempo, los premios pueden ser muy abundantes, sobre todo con algunos de los pools de liquidez y opciones de apuestas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Quizas pancakeSwap sea un poco dificil para aquellos que se esten iniciando en el mundo de las criptomonedas, pero quias valga la pena revisarla.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sitios ue aceptan pagos en criptomonedas
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.coinsbee.com/en/#pagetop" rel="noopener noreferrer"&gt;Coinsbee&lt;/a&gt; en esta página podrás encontrar distinta variedad de gift cards (Amazon, Google Play, Steam, Netflix, etc)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitrefill.com/buy/?hl=en" rel="noopener noreferrer"&gt;Bitrefill&lt;/a&gt; Es un sitio similar a Coinsbee, con ventas de gift cards&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.newegg.com/" rel="noopener noreferrer"&gt;Newegg&lt;/a&gt; Aqui podras comprar componentes de PC, Laptops, Monitores, Consola de Videojuegos, gadgets, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terminos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bitcoin
&lt;/h3&gt;

&lt;p&gt;Cuando se habla de Bitcoin se habla tanto de la primera plataforma basada en blockchain que busco desde sus inicios se una forma de pago segura, rapida y descentralizada. Y de la criptomoneda tambien conocida como &lt;strong&gt;BTC&lt;/strong&gt;, cuyo valor actual puedes consultar &lt;a href="https://www.coingecko.com/en/coins/bitcoin" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Blockchain
&lt;/h3&gt;

&lt;p&gt;Blockchain es una cadena de bloques, los cuales contienen informacion cifrada de una transaccion que se realizo en la red. y al estar en cadena permiten que los datos puedan transferirse de forma seguro gracias a la codificacion criptografica.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exchange
&lt;/h3&gt;

&lt;p&gt;Son sitios donde podemos comprar y vender criptomonedas. En la actualdiad hay muchos, unos con mayor catalogo que otros, asi como comisiones mayores en unas que otros. Algunos ejemplos de estos sitios serian Binance, FTX, LocalBitcoins, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fiat
&lt;/h3&gt;

&lt;p&gt;El Fiat es la moneda aprobada por un gobierno que estan respaldadas por mercancia fisica, por ejemplo el USD, el EUR, la moneda local de tu pais, etc. &lt;/p&gt;

&lt;h3&gt;
  
  
  P2P
&lt;/h3&gt;

&lt;p&gt;Sus siglas significan "Peer to Peer" (en español red entre pares), y en el contexto de &lt;em&gt;Blockchain&lt;/em&gt; se refiere a una red de ordenadores que estan conectados entre si si necesidad de que haya un servidor o ente centralizado. Es decir es una conexion directa entre los dos ordenadores o usuarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transaccion
&lt;/h3&gt;

&lt;p&gt;Cualquier accion que se realice dentro de una blockchain. Ejemplo: recibir o enviar criptomonedas a &lt;br&gt;
otra persona.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wallet
&lt;/h3&gt;

&lt;p&gt;Podemos pensar que una wallet es cuenta o direccion para recibir criptomonedas. Pueden ser en linea, fisicas o una aplicación local.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wallets
&lt;/h2&gt;

&lt;p&gt;Las wallets son instrumentos para poder recibir y enviar criptomonedas. Existen en línea, físicas o aplicaciones locales.&lt;/p&gt;

&lt;p&gt;Entre los más populares podemos encontrar los siguientes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://metamask.io/" rel="noopener noreferrer"&gt;Metamask&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Es una extensión para el navegador que también funciona como &lt;strong&gt;wallet&lt;/strong&gt; sirve para recibir y enviar criptomonedas. así como para poder interactuar con aplicaciones web que estén basadas en el blockchain de Ethereum como &lt;strong&gt;PancakeSwap&lt;/strong&gt; por ejemplo.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://phantom.app/" rel="noopener noreferrer"&gt;Phantom&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Así como &lt;strong&gt;Metamask&lt;/strong&gt;, Phantom es una extensión del navegador que funciona como &lt;em&gt;wallet&lt;/em&gt; sirve para recibir y enviar criptomonedas en &lt;strong&gt;Solana&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Es necesaria para interactuar con aplicaciones web que utilicen el blockchain de Solana, como es el caso de &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta wallet cuenta con una funcionalidad especial que consiste en &lt;strong&gt;Quemar NFTs&lt;/strong&gt; esto es un proceso en el que se elimina el NFT y se reembolsa al propietario de la wallet el importe que se utilizó al momento de &lt;em&gt;Mintear&lt;/em&gt; el NFT.&lt;/p&gt;

&lt;p&gt;Si estás interesado en aprender mas al respecto puedes dirigirte al siguiente &lt;a href="https://www.codenjobs.com/blog?&amp;amp;title=%C2%BFC%C3%B3mo-mintear-NFT-manualmente-en-Solana?&amp;amp;id=c516f1db-56a6-4833-b59a-aa231243bc71" rel="noopener noreferrer"&gt;post&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;En este post aprendimos un poco sobre las criptomonedas, que podemos hacer con ellas, como adquirirlas, venderlas e incluso aprendimos de algunos comercios donde podemos usarlas directamente.&lt;/p&gt;

&lt;p&gt;Si tienes alguna duda o sugerencia no dudes en dejar un comentario en el post, te responderé lo mas pronto posible.&lt;/p&gt;

&lt;p&gt;Sientete libre de contactarme por &lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;telegram&lt;/a&gt; o agregandome a Discord como &lt;strong&gt;Appu#9136&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Muchas gracias por tu tiempo.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>spanish</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>¿Cómo subir archivos con ardrive manualmente y con ardrive CLI?</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Thu, 25 Aug 2022 12:50:00 +0000</pubDate>
      <link>https://dev.to/rtagl/como-subir-archivos-con-ardrive-manualmente-y-con-ardrive-cli-4lpe</link>
      <guid>https://dev.to/rtagl/como-subir-archivos-con-ardrive-manualmente-y-con-ardrive-cli-4lpe</guid>
      <description>&lt;p&gt;En el siguiente post voy a hablar sobre Arweave, como crear una billetera o wallet, y también como subir archivos de forma manual y con su CLI.&lt;/p&gt;

&lt;p&gt;Para este ejemplo voy a subir algunas imágenes gratuitas de &lt;a href="https://unsplash.com/" rel="noopener noreferrer"&gt;unsplash&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es Arweave?
&lt;/h2&gt;

&lt;p&gt;Según la página oficial de &lt;a href="https://arweave.org/" rel="noopener noreferrer"&gt;Arweave&lt;/a&gt;, Arweave es un protocolo que permite alojar datos de forma permanente, sustentable y con una única cuota inicial.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;podemos considerarlo como una alternativa a IPFS&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Con &lt;a href="https://app.ardrive.io/#/sign-in" rel="noopener noreferrer"&gt;Ardrive&lt;/a&gt;, podremos subir y compartir achivos, ademas también disponen de una &lt;a href="https://ardrive.io/pricing/" rel="noopener noreferrer"&gt;calculadora de tarifas&lt;/a&gt; en caso de que desees saber cuanto tendrás que pagar para subir la cantidad de datos que desees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Si deseas enconntrar mas contenido o empleos relacionados a blockchain te recomiendo que entres y te registres en &lt;a href="https://www.codenjobs.com/register?ref_username=rtagliavia" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerrequisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; instalado&lt;/li&gt;
&lt;li&gt;&lt;a href="https://faucet.arweave.net/" rel="noopener noreferrer"&gt;Arweave Wallet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ardriveapp/ardrive-cli" rel="noopener noreferrer"&gt;Ardrive CLI&lt;/a&gt; instalado&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creando nuestro Proyecto
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Abre la consola y escribe los siguiente comandos&lt;/li&gt;
&lt;li&gt;mkdir ardrive-tutorial&lt;/li&gt;
&lt;li&gt;cd ardrive-tutorial&lt;/li&gt;
&lt;li&gt;npm init --y&lt;/li&gt;
&lt;li&gt;Ahora abre el proyecto con tu editor de código preferido.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Dependencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/ipfs-core" rel="noopener noreferrer"&gt;ardrive-core-js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;dotenv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/prompt-sync" rel="noopener noreferrer"&gt;prompt-sync&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para instalar las dependencias nos ubicaremos en la carpeta de tu proyecto con la consola y escribe los siguientes comandos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npm i ardrive-core-js dotenv prompt-sync
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usarémos &lt;em&gt;import&lt;/em&gt; por lo que debemos abrir &lt;code&gt;package.json&lt;/code&gt; y agregar la siguiente linea &lt;strong&gt;"type" : "module"&lt;/strong&gt;,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;"type" : "module",
"scripts": {
  "start": "node ./src index.js"
},
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Estructura del proyecto
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arDrive-tutorial/
├── node_modules/
├── tutorial-images/
├── src/
│   └── index.js
├── .env
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tabla de contenidos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Autenticación en ArDrive&lt;/li&gt;
&lt;li&gt;Subir archivos a ArDrive&lt;/li&gt;
&lt;li&gt;Subir archvivos con ArDrive CLI&lt;/li&gt;
&lt;li&gt;Script para crear un .json con la información de los archivos&lt;/li&gt;
&lt;li&gt;Conclusión&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Autenticación en ArDrivee &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Este no es un paso complejo, asumiré que ya creaste tu wallet, así que lo siguiente es ir a la &lt;a href="https://app.ardrive.io/#/sign-in" rel="noopener noreferrer"&gt;página de autenticación de Ardrive&lt;/a&gt;, y autenticarte con tu wallet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio8m41knegay4vmuy6f0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio8m41knegay4vmuy6f0.png" alt="login screen" width="747" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsjt24l7m0emxz46o4j3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsjt24l7m0emxz46o4j3.png" alt="user_pass" width="711" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;el usuario y constraseña se utilizan para las carpetas privadas al momento de compartirlas&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Subir archivos a ArDrive &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Recuerda que todos los archivos serán alojados de forma permanente por lo que los archivos no podrán ser borrados.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lo primero que haremos será crear un nuevo &lt;em&gt;drive&lt;/em&gt; haciendo clic en el botón &lt;strong&gt;New&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro6tkgaaga1wtyg47xxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro6tkgaaga1wtyg47xxw.png" alt="step1" width="230" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego colocaremos un nombre y escogeremos entre público o privado, yo voy a elegir &lt;em&gt;público&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fworv9127o2br8jow73lm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fworv9127o2br8jow73lm.png" alt="step2" width="472" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego vamos a hacer clic nuevamente en el botón &lt;strong&gt;New&lt;/strong&gt;, y esta vez vamos a seleccionar &lt;em&gt;"upload folder"&lt;/em&gt; porque vamos a subir una carpeta con archivos, como dije anteriormente en este ejemplo voy a subir algunas imágenes de &lt;a href="https://unsplash.com/" rel="noopener noreferrer"&gt;unsplash&lt;/a&gt;. Eres libre de escoger el archivo que desees, solo asegurate de que tengas los permisos necesarios para hacerlo.&lt;/p&gt;

&lt;p&gt;También podrás observar el precio para subir esos archivos, así podrás decidir si subirlos o no.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1grn59n8y15ugakyn7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1grn59n8y15ugakyn7f.png" alt="step3" width="510" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqsy34jt8dp0cpzaoy1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqsy34jt8dp0cpzaoy1p.png" alt="upload_cost" width="443" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora podrás ver la nueva carpeta creada en el drive, y si la abrimos los archivos que estan en ella, vamos a poder descargarlos, ver más información sobre ellos, un link para previsualizar, un link para comaprtir, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3753j2f7i5nrvqrwrjhh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3753j2f7i5nrvqrwrjhh.png" alt="file list" width="784" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Subir archvivos con ArDrive CLI &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Vamos a repetir el proceso anterior, pero esta vez haciendo uso de ardrive CLI, para eso lo primero que vamos a hacer será abrir nuestra terminal y verificar de que este instalado con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ardrive --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si esta instalado verás un mensaje similar a este.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;1.19.0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Para obtener mas informacion sobre los comandos que pueden ser usados escribe el siguiente comando &lt;code&gt;ardrive -h&lt;/code&gt; o en caso de que desees mas información de como usar cierto comando, solo escribe el comando seguido de -h, por ejemplo  &lt;code&gt;ardrive create-drive -h&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ahora crearemos un nuevo drive, para eso debemos especificar la ruta donde se encuentra el archivo de nuestro Wallet, y el nombre que le vamos a asignar a nuestro drive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ardrive create-drive -w &amp;lt;YOUR\WALLET\LOCATION\FOLDER\wallet-file.json&amp;gt; -n cli-tut
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deberías obtener un objeto con la información del nuevo drive parecido al siguiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;{
  "created": [
    {
      "type": "drive",
      "metadataTxId": "0fzTAOPqIK4Imk2xGf3e9CDCXxO_k-xFFlOkAA-IXRg",
      "entityId": "5e219c5e-ed6a-497d-b225-b5d621eed097",
      "bundledIn": "GL725mzIbYgisddpaimoxs6lAdN9CjASmhhxqdP3agk",
      "entityName": "cli-tut"
    },
    {
      "type": "folder",
      "metadataTxId": "LGeONqTaoiE1m6_OXK2RcmsBZbkN0yxl-AKNUEn4ahs",
      "entityId": "1739f7e2-baa2-491a-a2ab-f406d778041a",
      "bundledIn": "GL725mzIbYgisddpaimoxs6lAdN9CjASmhhxqdP3agk",
      "entityName": "cli-tut"
    },
    {
      "type": "bundle",
      "bundleTxId": "GL725mzIbYgisddpaimoxs6lAdN9CjASmhhxqdP3agk"
    }
  ],
  "tips": [],
  "fees": {
    "GL725mzIbYgisddpaimoxs6lAdN9CjASmhhxqdP3agk": "52221667"
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora lo que vamos a hacer es subir algunos archivos (pueden ser los mismos archivos del ejemplo anterior), si deseamos subirlos a la carpeta raíz como en el caso anterior debemos especificar el &lt;code&gt;entityId&lt;/code&gt; de esta, vas a poder encontrarlo en el objeto que obtuvimos anteriormente en el objeto que contiene &lt;code&gt;"type": "folder"&lt;/code&gt;, y luego la información que estamos buscando esta en &lt;code&gt;entityId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;De todas maneras si abres la página de arDrive vas a encontrar el nuevo drive, y podrás obtener el id de la carpeta raíz de la siguiente manera.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foa5l4j23fopal1gllwr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foa5l4j23fopal1gllwr0.png" alt="drive id and folder id" width="799" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tabién vamos a necesitar especificar la ubicación del archivo o carpeta que vamos a subir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ardrive upload-file -w &amp;lt;YOUR\WALLET\LOCATION\FOLDER\wallet-file.json&amp;gt; --local-path &amp;lt;FILE\OR\FOLDER\LOCATION\THAT\WANT\TO\UPLOAD&amp;gt; -F &amp;lt;folder-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;vas a obtener un mensaje como este.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;{
  "created": [
    {
      "type": "folder",
      "entityId": "4de053e3-cf7f-4da6-88bc-e238e7478226",
      "metadataTxId": "rhML7VdZDfm2R1sASWwiCVt-_eeGb38VOFMUOszgvlM",
      "bundledIn": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4",
      "entityName": "ardrive-cli-files",
    },
    {
      "type": "file",
      "entityName": "1.jpg",
      "entityId": "6cb92418-bf77-4edd-a271-a4981abb92bc",
      "dataTxId": "8y5PVi1V2WAF4etKv0lgbfx2tO2P_ekDu7PBFjhu4us",
      "metadataTxId": "LD2QI5erLPuvM39ptN0-G9vpLEGh4VXIdglhzS_oHEI",
      "bundledIn": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4",
    },
    {
      "type": "file",
      "entityName": "2.jpg",
      "entityId": "48c33090-a7e6-47d3-b974-924a09defbb4",
      "dataTxId": "oMEPmy2LIKL0RI2WSfMyT3XEo2aZ86zqDQrEcfteqVo",
      "metadataTxId": "m3cDLllbgTwg4rlKF_FivP5nSHRd7BZ9WIUY31NVlxE",
      "bundledIn": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4",
      "sourceUri": "file://C:\\Users\\Rob\\Downloads\\ardrive-cli-files\\2.txt"
    },
    {
      "type": "bundle",
      "bundleTxId": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4"
    }
  ],
  "tips": [
    {
      "recipient": "aVHpFhSorIljeZ9so8unOEnPkW3YqRbqG5cfM4aXxBI",
      "txId": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4",
      "winston": "10000000"
    }
  ],
  "fees": {
    "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4": "52221667"
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entonces como pudiste observar, una nueva carpeta fue creada, y también dos archivos (en mi caso)&lt;/p&gt;

&lt;p&gt;Ahora descargarrmos esa carpeta de archivos (se va a descargar en la ubicación actual de la terminal) con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ardrive download-folder -w &amp;lt;YOUR\WALLET\LOCATION\FOLDER\wallet-file.json&amp;gt; -f &amp;lt;folder-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Script para crear un .json con la información de los archivos &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Ahora vamos a crear un script personalizado para obtener la información de los archivos y carpetas que hayamos subido, finalmente vamos a crear un archivo .json que va a contener toda esta información &lt;em&gt;esto será de ayuda en un proyecto real de NFT&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lo primero que vamos a hacer es crear un archivo &lt;code&gt;.env&lt;/code&gt; en la raíz de nuestro proyecto, y crearemos una variable &lt;code&gt;WALLET_PATH&lt;/code&gt; que le asignaremos la ubicación de nuestro wallet &lt;code&gt;C:\\YOUR\\WALLET\\PATH&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Luego iremos a la carpeta &lt;code&gt;src&lt;/code&gt; y vamos a abrir &lt;code&gt;index.js&lt;/code&gt;, copia y pega el siguiente código, no te preocupes lo voy a explicar paso a paso.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yo usare la carpeta que subimos en el ejemplo anterior, pero este script también puede funcionar con una estructura similar a la que voy a enseñarte a continuación&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;driveName
├── imagesFolder/ //si queremos la información de imagesFolder entonces 
│   ├── folder1/  //debemos dar el folder id correspondiente
│   │   ├── 0.jpg
│   │   └── 1.jpg
│   ├── folder2/
│   │   ├── 2.jpg
│   │   └── 3.jpg
│   ├── folder3/
│   │   ├── 4.jpg
│   │   └── 5.jpg
│   ├── folder4/
│   │   ├── 6.jpg
│   │   └── 7.jpg
│   └── folder5/
│       ├── 8.jpg
│       └── 9.jpg
├── metadatasFolder/
└── anotherFolder/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Vamos a importar &lt;code&gt;import {readJWKFile, arDriveFactory} from 'ardrive-core-js'&lt;/code&gt;. &lt;code&gt;readJWKFile&lt;/code&gt; nos va a permitir poder leer el archivo de nuestro wallet, y con &lt;code&gt;arDriveFactory&lt;/code&gt; vamos a poder realizar operaciones de arDrive.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vamos a crear un archivo .json file al final del script por lo que vamos a necesitar utilizar &lt;code&gt;fs&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;El script va a solicitar al usuario que introduzca el folder ID, con el folder ID vamos a poder obtener todas las carpetas internas, así como también el drive ID que lo vamos a necesitar para crear el link para dirigirnos a la carpeta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vamos a ordenar las carpetas en caso de que hayan mas de una y contengan un nombre de proyecto similar al siguiente (PROJECT_NAME_1, PROJECT_NAME_2, PROJECT_NAME_3, etc) porque no vamos a poder obtener ordenadas por defecto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vamos a crear una &lt;code&gt;const foldersId = []&lt;/code&gt; donde vamos a almacenar los nombres y id de las carpetas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ahora vamos a usar un &lt;em&gt;for loop&lt;/em&gt; para recorrer el array &lt;code&gt;foldersId&lt;/code&gt; y obtener los archivos de cada carpeta con&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;getFiles&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;arDrive&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listPublicFolder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folderId&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ordenaremos los archivos porque los podemos obtener desordenados&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Luego vamos a crear un array &lt;code&gt;const filesInformation = []&lt;/code&gt; que va a almacenar la información de cada uno de los archivos por cada carpeta&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Después vamos a utilizar otro &lt;em&gt;for loop&lt;/em&gt; para recorrerlos dentro del mismo loop, con este enfoque vamos a obtener toda la informacion de los archivos de la carpeta actual.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ahora almacenaremos el folderName, folderLink, and also the filesInformation (fileName, fileId, and fileLink del loop anterior) en el array &lt;code&gt;Files&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finalmente vamos a crear un archivo .json que va a contener toda la informacion contenida en &lt;code&gt;Files&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;readJWKFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arDriveFactory&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ardrive-core-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dotenv&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;dotenv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../.env&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ps&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prompt-sync&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;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ps&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;//read wallet from file&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myWallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;readJWKFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WALLET_PATH&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;arDrive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;arDriveFactory&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;myWallet&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;folderID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;insert the folder id &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;getFolders&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;arDrive&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listPublicFolder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folderID&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;driveId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getFolders&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="nx"&gt;driveId&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LINK_TO_FOLDERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://app.ardrive.io/#/drives/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;driveId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/folders/`&lt;/span&gt;

&lt;span class="nx"&gt;getFolders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&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;foldersId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="nx"&gt;getFolders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;folder&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;foldersId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;folderName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entityId&lt;/span&gt;
  &lt;span class="p"&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;Files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;foldersId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&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;folderId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;foldersId&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;folderId&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;folderName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;foldersId&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;folderName&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getFiles&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;arDrive&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listPublicFolder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folderId&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="c1"&gt;//create an array for eachFoldername&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filesInformation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;



&lt;span class="nx"&gt;getFiles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;getFiles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&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;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getFiles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;filesInformation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;fileId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fileId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entityId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;fileLink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://arweave.net/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataTxId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transactionId&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;


  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;folderName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;folderLink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LINK_TO_FOLDERS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;filesInformation&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`filesInfo.json`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resultado final va a ser similar al siguiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"folderName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arweave-images"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"folderLink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://app.ardrive.io/#/drives/5791d389-438c-4af5-820f-a2fe0fb782a8/folders/3d124a11-ebb5-4c2e-9d2c-02d6f1700b4b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesInformation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b2ca111f-54c5-4515-b700-e055c3a4e7c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileLink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/SrERAlYcB1v8D6ABRkP_QbHfRR6RdKTO3akSghPz3dM"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2e791441-9404-4211-b618-2e580e110a15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileLink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/fsnAIp1VFBMqBhNYsejaI5BqqOuUNat0gnUE2CHevqY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1c40d120-fe1d-4394-93e3-f9df3bf0f176"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileLink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/mSgGn1D_WPudzm0uROiJxegbZ760rhSNI8p5DGiy7hI"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Conclusión &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;En este post aprendimos a subir y compartir archivos manualmente con arDrive, asi como también con su CLI, además a como crear un script personalizado para interactuar con los archivos subidos.&lt;/p&gt;

&lt;p&gt;Realmente espero que hayas podido seguirme hasta aquí sin ningún inconveniente, de otra manera me disculpo, por favor puedes dejarme tus dudas y comentarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Si deseas enconntrar mas contenido o empleos relacionados a blockchain te recomiendo que entres y te registres en &lt;a href="https://www.codenjobs.com/register?ref_username=rtagliavia" rel="noopener noreferrer"&gt;Code&amp;amp;Jobs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;Puedes contactarme por telegram en caso de que necesites contratar a un Full Stack Developer.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;También te dejo mi usuario de Discord &lt;strong&gt;Appu#9136&lt;/strong&gt; en caso de que desees agregarme.&lt;/p&gt;

&lt;p&gt;Muchas Gracias por tu tiempo.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>blockchain</category>
      <category>node</category>
      <category>spanish</category>
    </item>
    <item>
      <title>How to upload files to ardrive manually and with ardrive CLI?</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Wed, 10 Aug 2022 23:04:00 +0000</pubDate>
      <link>https://dev.to/rtagl/how-to-upload-files-to-ardrive-manually-and-with-ardrive-cli-1ggc</link>
      <guid>https://dev.to/rtagl/how-to-upload-files-to-ardrive-manually-and-with-ardrive-cli-1ggc</guid>
      <description>&lt;p&gt;In the following post I will explaining what is Arweave, how to create a wallet, and also how to upload files manually and with the CLI.&lt;/p&gt;

&lt;p&gt;For this example I will be uploading some free images from &lt;a href="https://unsplash.com/" rel="noopener noreferrer"&gt;unsplash&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Arweave?.
&lt;/h2&gt;

&lt;p&gt;According to the &lt;a href="https://arweave.org/" rel="noopener noreferrer"&gt;Arweave website&lt;/a&gt;, Arweave is a protocol that allows you to store data permanently, sustainably, with a single upfront fee.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can think of it as an alternative to IPFS&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://app.ardrive.io/#/sign-in" rel="noopener noreferrer"&gt;Ardrive&lt;/a&gt;, we will able to upload and share our files, there is also a &lt;a href="https://ardrive.io/pricing/" rel="noopener noreferrer"&gt;fee calculator&lt;/a&gt; in case you want to know how much you will pay for the amount of data that you want store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href="https://faucet.arweave.net/" rel="noopener noreferrer"&gt;Arweave Wallet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ardriveapp/ardrive-cli" rel="noopener noreferrer"&gt;Ardrive CLI&lt;/a&gt; installed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating Our Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open your terminal and type the following commands&lt;/li&gt;
&lt;li&gt;mkdir ardrive-tutorial&lt;/li&gt;
&lt;li&gt;cd ardrive-tutorial&lt;/li&gt;
&lt;li&gt;npm init --y&lt;/li&gt;
&lt;li&gt;Open the project with your preferred code editor&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Dependencies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/ipfs-core" rel="noopener noreferrer"&gt;ardrive-core-js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;dotenv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/prompt-sync" rel="noopener noreferrer"&gt;prompt-sync&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install dependencies go to your project folder open a terminal and type the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npm i ardrive-core-js dotenv prompt-sync
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will be using &lt;em&gt;import&lt;/em&gt; so open &lt;code&gt;package.json&lt;/code&gt; and add the following line &lt;strong&gt;"type" : "module"&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node ./src index.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Project File Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arDrive-tutorial/
├── node_modules/
├── tutorial-images/
├── src/
│   └── index.js
├── .env
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Log in to ArDrive&lt;/li&gt;
&lt;li&gt;Uploading files to ArDrive&lt;/li&gt;
&lt;li&gt;Uploading files with ArDrive CLI&lt;/li&gt;
&lt;li&gt;Script to create a .json with files info&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Log in to ArDrive &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This is not difficult to do, assuming that you created your wallet, you just go to &lt;a href="https://app.ardrive.io/#/sign-in" rel="noopener noreferrer"&gt;Ardrive login page&lt;/a&gt;, and log in with your wallet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio8m41knegay4vmuy6f0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio8m41knegay4vmuy6f0.png" alt="login screen" width="747" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsjt24l7m0emxz46o4j3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsjt24l7m0emxz46o4j3.png" alt="user_pass" width="711" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The user and password are for private folders&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Uploading Files to ArDrive &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Remember that all the files will be permanently stored, that means that the files cannot be deleted&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The first thing that we will do is create a new drive by clicking on the &lt;strong&gt;New&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro6tkgaaga1wtyg47xxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro6tkgaaga1wtyg47xxw.png" alt="step1" width="230" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then set a name and choose between public or private, I am going to choose &lt;em&gt;public&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fworv9127o2br8jow73lm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fworv9127o2br8jow73lm.png" alt="step2" width="472" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we are going to click the &lt;strong&gt;New&lt;/strong&gt; button again, and this time select &lt;em&gt;"upload folder"&lt;/em&gt; because we are going to upload a folder with files in it, like I said before in this example I will be using some free images from &lt;a href="https://unsplash.com/" rel="noopener noreferrer"&gt;unsplash&lt;/a&gt;. you can use whatever you want, just make sure that you have the permission to upload the files. &lt;/p&gt;

&lt;p&gt;You will also be able to see the price to upload those files, so you can decide if you want to upload them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1grn59n8y15ugakyn7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1grn59n8y15ugakyn7f.png" alt="step3" width="510" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqsy34jt8dp0cpzaoy1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdqsy34jt8dp0cpzaoy1p.png" alt="upload_cost" width="443" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you will be able to see a new folder in your drive, and if we open it we will be able to see the files in it, also we can download them, get details of each file, a preview link, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3753j2f7i5nrvqrwrjhh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3753j2f7i5nrvqrwrjhh.png" alt="file list" width="784" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Uploading files with ArDrive CLI &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;To get more info about the commands that can be used type &lt;code&gt;ardrive -h&lt;/code&gt; or in case you want more usage information about a command &lt;code&gt;ardrive create-drive -h&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Now we are going to repeat the process but using ardrive cli instead, so the first thing that we are going to do is open our terminal and check if the ardrive CLI is installed with this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ardrive --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get your ardrive CLI version.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;1.19.0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we are going to create a new drive, we must specify our wallet location and a name for the new drive, you can also specify if you want it to be a private drive with &lt;strong&gt;-p&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ardrive create-drive -w &amp;lt;YOUR\WALLET\LOCATION\FOLDER\wallet-file.json&amp;gt; -n cli-tut
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get an object with information about the drive and the folder like the following one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;{
  "created": [
    {
      "type": "drive",
      "metadataTxId": "0fzTAOPqIK4Imk2xGf3e9CDCXxO_k-xFFlOkAA-IXRg",
      "entityId": "5e219c5e-ed6a-497d-b225-b5d621eed097",
      "bundledIn": "GL725mzIbYgisddpaimoxs6lAdN9CjASmhhxqdP3agk",
      "entityName": "cli-tut"
    },
    {
      "type": "folder",
      "metadataTxId": "LGeONqTaoiE1m6_OXK2RcmsBZbkN0yxl-AKNUEn4ahs",
      "entityId": "1739f7e2-baa2-491a-a2ab-f406d778041a",
      "bundledIn": "GL725mzIbYgisddpaimoxs6lAdN9CjASmhhxqdP3agk",
      "entityName": "cli-tut"
    },
    {
      "type": "bundle",
      "bundleTxId": "GL725mzIbYgisddpaimoxs6lAdN9CjASmhhxqdP3agk"
    }
  ],
  "tips": [],
  "fees": {
    "GL725mzIbYgisddpaimoxs6lAdN9CjASmhhxqdP3agk": "52221667"
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we are going to upload some files to it, if we want upload them to the root folder we will need to add  the &lt;code&gt;entityId&lt;/code&gt; of the previous object with &lt;code&gt;"type": "folder"&lt;/code&gt;, anyways if you open your ardrive and look for the drive that you created you can get the root folder id like this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foa5l4j23fopal1gllwr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foa5l4j23fopal1gllwr0.png" alt="drive id and folder id" width="799" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also need the file location, or folder location that we want to upload&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ardrive upload-file -w &amp;lt;YOUR\WALLET\LOCATION\FOLDER\wallet-file.json&amp;gt; --local-path &amp;lt;FILE\OR\FOLDER\LOCATION\THAT\WANT\TO\UPLOAD&amp;gt; -F &amp;lt;folder-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will get a message like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;{
  "created": [
    {
      "type": "folder",
      "entityId": "4de053e3-cf7f-4da6-88bc-e238e7478226",
      "metadataTxId": "rhML7VdZDfm2R1sASWwiCVt-_eeGb38VOFMUOszgvlM",
      "bundledIn": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4",
      "entityName": "ardrive-cli-files",
    },
    {
      "type": "file",
      "entityName": "1.jpg",
      "entityId": "6cb92418-bf77-4edd-a271-a4981abb92bc",
      "dataTxId": "8y5PVi1V2WAF4etKv0lgbfx2tO2P_ekDu7PBFjhu4us",
      "metadataTxId": "LD2QI5erLPuvM39ptN0-G9vpLEGh4VXIdglhzS_oHEI",
      "bundledIn": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4",
    },
    {
      "type": "file",
      "entityName": "2.jpg",
      "entityId": "48c33090-a7e6-47d3-b974-924a09defbb4",
      "dataTxId": "oMEPmy2LIKL0RI2WSfMyT3XEo2aZ86zqDQrEcfteqVo",
      "metadataTxId": "m3cDLllbgTwg4rlKF_FivP5nSHRd7BZ9WIUY31NVlxE",
      "bundledIn": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4",
      "sourceUri": "file://C:\\Users\\Rob\\Downloads\\ardrive-cli-files\\2.txt"
    },
    {
      "type": "bundle",
      "bundleTxId": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4"
    }
  ],
  "tips": [
    {
      "recipient": "aVHpFhSorIljeZ9so8unOEnPkW3YqRbqG5cfM4aXxBI",
      "txId": "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4",
      "winston": "10000000"
    }
  ],
  "fees": {
    "CjI3RTkum17KI5GHEiI6dC_gjq1dznylrA4pR5hk0E4": "52221667"
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So as you can see, a new folder was created, also two files with it.&lt;/p&gt;

&lt;p&gt;Now we can download that folder (it will be downloaded in your current console location) with this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ardrive download-folder -w &amp;lt;YOUR\WALLET\LOCATION\FOLDER\wallet-file.json&amp;gt; -f &amp;lt;folder-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Script to create a .json with files info &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Now we are going to create a custom script to get files and folder information and finally create a .json file with it &lt;em&gt;that would be helpful for a real life NFT project&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;First create a &lt;code&gt;.env&lt;/code&gt; file in the root of your project and create a &lt;code&gt;WALLET_PATH&lt;/code&gt; variable and add your wallet path like this &lt;code&gt;C:\\YOUR\\WALLET\\PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then go to &lt;code&gt;src&lt;/code&gt; folder and open &lt;code&gt;index.js&lt;/code&gt;, copy and paste the following code, don't worry I will explain it step by step.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I am going to use a folder form our previous example, but you can also work for a folder arDrive structure like this&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;driveName
├── imagesFolder/ //if we want imagesFolder info then we should provide this folder id
│   ├── folder1/
│   │   ├── 0.jpg
│   │   └── 1.jpg
│   ├── folder2/
│   │   ├── 2.jpg
│   │   └── 3.jpg
│   ├── folder3/
│   │   ├── 4.jpg
│   │   └── 5.jpg
│   ├── folder4/
│   │   ├── 6.jpg
│   │   └── 7.jpg
│   └── folder5/
│       ├── 8.jpg
│       └── 9.jpg
├── metadatasFolder/
└── anotherFolder/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We are going to &lt;code&gt;import {readJWKFile, arDriveFactory} from 'ardrive-core-js'&lt;/code&gt;. we'll be able to read our wallet with &lt;code&gt;readJWKFile&lt;/code&gt; and use arDrive operations with &lt;code&gt;arDriveFactory&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We are going to create a .json file at the end of our script so we need to use &lt;code&gt;fs&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The script will prompt the user for the folder ID, with the folder ID we can get all folders inside that folder and we can also get the drive ID that will be needed to build the link to the folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We need sort the folders in case there are more than one and have a project name e.g. (PROJECT_NAME_1, PROJECT_NAME_2, PROJECT_NAME_3, etc) because probably we won't get them sorted by default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will create a &lt;code&gt;const foldersId = []&lt;/code&gt; that will store every folder name and folder id.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now we will use a &lt;em&gt;for loop&lt;/em&gt; to loop through foldersId and will get the files of each folder with .&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;getFiles&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;arDrive&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listPublicFolder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folderId&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We will sort those files because we could obtain them unsorted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then we are going to create a &lt;code&gt;const filesInformation = []&lt;/code&gt; that will store the information of each one of the files per folder.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After that we are going to use another &lt;em&gt;for loop&lt;/em&gt; trough them inside our current loop, So with this approach we will get all the files info from the current folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now we will store the folderName, folderLink, and also the filesInformation (fileName, fileId, and fileLink from the previous loop) and will be stored in a Files array.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally we will create a json file and we will write the stored data in Files.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;readJWKFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arDriveFactory&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ardrive-core-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dotenv&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;dotenv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../.env&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ps&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prompt-sync&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;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ps&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;//read wallet from file&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myWallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;readJWKFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WALLET_PATH&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;arDrive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;arDriveFactory&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;myWallet&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;folderID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;insert the folder id &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;getFolders&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;arDrive&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listPublicFolder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folderID&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;driveId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getFolders&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="nx"&gt;driveId&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LINK_TO_FOLDERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://app.ardrive.io/#/drives/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;driveId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/folders/`&lt;/span&gt;

&lt;span class="nx"&gt;getFolders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&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;foldersId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="nx"&gt;getFolders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;folder&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;foldersId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;folderName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entityId&lt;/span&gt;
  &lt;span class="p"&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;Files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;foldersId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&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;folderId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;foldersId&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;folderId&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;folderName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;foldersId&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;folderName&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getFiles&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;arDrive&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listPublicFolder&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;folderId&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="c1"&gt;//create an array for eachFoldername&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filesInformation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

  &lt;span class="c1"&gt;// Format here&lt;/span&gt;
  &lt;span class="nx"&gt;getFiles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;getFiles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&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;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getFiles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;filesInformation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;fileId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fileId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entityId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;fileLink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://arweave.net/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataTxId&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transactionId&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;


  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;folderName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;folderLink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LINK_TO_FOLDERS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;folderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;filesInformation&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`filesInfo.json`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Files&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final output will be similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"folderName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"arweave-images"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"folderLink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://app.ardrive.io/#/drives/5791d389-438c-4af5-820f-a2fe0fb782a8/folders/3d124a11-ebb5-4c2e-9d2c-02d6f1700b4b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"filesInformation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b2ca111f-54c5-4515-b700-e055c3a4e7c1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileLink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/SrERAlYcB1v8D6ABRkP_QbHfRR6RdKTO3akSghPz3dM"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2e791441-9404-4211-b618-2e580e110a15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileLink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/fsnAIp1VFBMqBhNYsejaI5BqqOuUNat0gnUE2CHevqY"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1c40d120-fe1d-4394-93e3-f9df3bf0f176"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fileLink"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://arweave.net/mSgGn1D_WPudzm0uROiJxegbZ760rhSNI8p5DGiy7hI"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Conclusion &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;We have learned how to upload and share files with arDrive manually and with the CLI, also how to create a custom script to interact with the files uploaded.&lt;/p&gt;

&lt;p&gt;I really hope you have been able to follow the post without any trouble, otherwise I apologize, please leave me your doubts or comments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;You can contact me by telegram if you need to hire a Full Stack developer.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also find me on Discord &lt;strong&gt;Appu#9136&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thank you for your time.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>arweave</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Deploy and Verify a Smart Contract to Testnet using Hardhat</title>
      <dc:creator>Robert </dc:creator>
      <pubDate>Mon, 08 Aug 2022 21:28:00 +0000</pubDate>
      <link>https://dev.to/rtagl/deploy-and-verify-a-smart-contract-to-testnet-using-hardhat-9fp</link>
      <guid>https://dev.to/rtagl/deploy-and-verify-a-smart-contract-to-testnet-using-hardhat-9fp</guid>
      <description>&lt;p&gt;In the following post will be learn how to deploy and verify a smart contract to Rinkeby testnet using hardhat.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTE: Rinkeby will be deprecated soon, click &lt;a href="https://blog.ethereum.org/2022/06/21/testnet-deprecation/" rel="noopener noreferrer"&gt;here&lt;/a&gt; if you want to know more about it,  anyways&lt;/em&gt; &lt;strong&gt;this example can work for any other testnet like Goerli, Kovan,  etc.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Hardhat?
&lt;/h2&gt;

&lt;p&gt;According to official &lt;a href="https://hardhat.org/docs" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; Hardhat is a development environment for Ethereum software. It consists of different components for editing, compiling, debugging and deploying your smart contracts and dApps, all of which work together to create a complete development environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metamask.io/" rel="noopener noreferrer"&gt;Metamask Wallet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://infura.io/dashboard" rel="noopener noreferrer"&gt;Infura API Key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://etherscan.io/register" rel="noopener noreferrer"&gt;Etherscan Account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Have some Rinkeby funds in your wallet, in case you need some can use this &lt;a href="https://faucets.chain.link/rinkeby" rel="noopener noreferrer"&gt;faucet&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating Our Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;open your terminal and type the following commands&lt;/li&gt;
&lt;li&gt;mkdir hardhat-tutorial&lt;/li&gt;
&lt;li&gt;cd hardhat-tutorial&lt;/li&gt;
&lt;li&gt;npm init --y&lt;/li&gt;
&lt;li&gt;Open the project with your preferred code editor&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Dependencies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;dotenv&lt;/li&gt;
&lt;li&gt;hardhat&lt;/li&gt;
&lt;li&gt;@nomiclabs/hardhat-etherscan&lt;/li&gt;
&lt;li&gt;@nomicfoundation/hardhat-toolbox&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To install dependencies go to your project folder and open a terminal and type the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npm i dotenv
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npm i hardhat --save-dev hardhat @nomiclabs/hardhat-etherscan @nomicfoundation/hardhat-toolbox
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now execute the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npx hardhat
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use the JavaScript option for this example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vwdnf7230zkna59401s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vwdnf7230zkna59401s.png" alt="hardhat CLI" width="448" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project File Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hardhat-tutorial/
├── contracts/
├── node_modules/
├── scripts/
├── test/
├── .env
├── hardhat.config.js
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Config our .env file&lt;/li&gt;
&lt;li&gt;Set Up hardhat.config.js&lt;/li&gt;
&lt;li&gt;Creating the contract to deploy&lt;/li&gt;
&lt;li&gt;Deploy Script&lt;/li&gt;
&lt;li&gt;Deploying and Verifying&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Config our .env file &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Let's create a &lt;code&gt;.env&lt;/code&gt; file in case you haven't already and open it.&lt;/p&gt;

&lt;p&gt;We will need to set the following 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="nx"&gt;INFURA_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;infura&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;
&lt;span class="nx"&gt;METAMASK_ACCOUNT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;metamask&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;
&lt;span class="nx"&gt;ETHERSCAN_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;your&lt;/span&gt; &lt;span class="nx"&gt;etherscan&lt;/span&gt; &lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In case you don't know how to get your Metamask account, just follow the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your Metamask browser extension, click on the three dots.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mnoa9au6xy97d1pyinc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mnoa9au6xy97d1pyinc.png" alt="step-one" width="356" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;strong&gt;Account details&lt;/strong&gt; .&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk87jcaxbz2rbghvge9wc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk87jcaxbz2rbghvge9wc.png" alt="step-two" width="347" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;strong&gt;Export Private Key&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x0i66rlm8uuz0etsrd9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x0i66rlm8uuz0etsrd9.png" alt="step-three" width="307" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finally type your password.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby5jlosuv3fawde4avcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby5jlosuv3fawde4avcy.png" alt="step-four" width="318" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Set Up hardhat.config.js &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;First we need to set up the configuration file, so let's open &lt;code&gt;hardhat.config.js&lt;/code&gt;, you will see something similar to this&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="nf"&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;@nomicfoundation/hardhat-toolbox&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&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;@nomiclabs/hardhat-etherscan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;solidity&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.9&lt;/span&gt;&lt;span class="dl"&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;We need to specify the networks we want to use, for this example we are only going to use Rinkeby.&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="nf"&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;@nomicfoundation/hardhat-toolbox&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&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;@nomiclabs/hardhat-etherscan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;//dotenv&lt;/span&gt;
&lt;span class="nf"&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;dotenv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&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="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;solidity&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.9&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;rinkeby&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://rinkeby.infura.io/v3/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INFURA_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;METAMASK_ACCOUNT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;span class="na"&gt;etherscan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ETHERSCAN_API_KEY&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;h2&gt;
  
  
  3. Creating the contract to deploy &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;For this example will be using a Dummy contract called &lt;code&gt;Greeter.sol&lt;/code&gt;, so let's open it.&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;//SPDX-License-Identifier: Unlicense&lt;/span&gt;
&lt;span class="nx"&gt;pragma&lt;/span&gt; &lt;span class="nx"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hardhat/console.sol&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;contract&lt;/span&gt; &lt;span class="nx"&gt;Greeter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;setGreeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="nx"&gt;memory&lt;/span&gt; &lt;span class="nx"&gt;_greeting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kr"&gt;public&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Changing greeting from '%s' to '%s'&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;_greeting&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_greeting&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;h2&gt;
  
  
  4. Deploy Script &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Go to scripts folder and open deploy.js, delete everything inside.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First let's require ethers from hardhat.&lt;/li&gt;
&lt;li&gt;Then we will create a function that will be executed when the script is executed.&lt;/li&gt;
&lt;li&gt;we will use ethers.getSigners() to get a object with our ethereum account information .&lt;/li&gt;
&lt;li&gt;then we with getContractFactory() we are going to abstract the contract information, in this case of &lt;strong&gt;Greeter.sol&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;we will deploy that information with deploy().&lt;/li&gt;
&lt;li&gt;Finally we wait for the contract to be deployed and get the address of the contract.
&lt;/li&gt;
&lt;/ol&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;hardhat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&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="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="kd"&gt;const&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="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSigners&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deploying contracts with the account: &lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&gt;address&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;DummyContract&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;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContractFactory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Greeter&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;dummyContract&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;DummyContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deploy&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;dummyContract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deployed&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DummyContract deployed to: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dummyContract&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="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&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;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&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="o"&gt;=&amp;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="nf"&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;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Deploying and Verifying &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Finally we will execute the following commands to deploy and verify our contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npx hardhat run scripts/deploy.js --network rinkeby
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will get something similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;DummyContract deployed to:  0x5c2E1BD82EDC0695cbA5AE64dA7aE34f073E167C
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then to verify the contract type the following command:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The address used in the next command will be the value that you previously get from the console&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zx9d5ssdf86px5g3moo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zx9d5ssdf86px5g3moo.png" alt="Address" width="536" height="21"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npx hardhat verify --network rinkeby 0x5c2E1BD82EDC0695cbA5AE64dA7aE34f07
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally you will get a message similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Successfully verified contract Greeter on Etherscan
&lt;/span&gt;&lt;span class="gp"&gt;https://rinkeby.etherscan.io/address/0x5c2E1BD82EDC0695cbA5AE64dA7aE34f073E167C#&lt;/span&gt;code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if you visit that link you will be able to see your contract as well as the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0lj1b7tkmtquvw08fur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0lj1b7tkmtquvw08fur.png" alt="deployed-contract" width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Conclusion &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;We learned how to deploy and verify a smart contract using Hardhat.&lt;/p&gt;

&lt;p&gt;I really hope you have been able to follow the post without any trouble, otherwise I apologize, please leave me your doubts or comments.&lt;/p&gt;

&lt;p&gt;If you're looking for a blockchain dev position, or more content related, you should check &lt;a href="https://www.codenjobs.com/" rel="noopener noreferrer"&gt;codenjobs&lt;/a&gt; web&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.codenjobs.com/blog?&amp;amp;title=C%C3%B3mo-desplegar-y-verificar-un-smart-contract-con-Hardhat&amp;amp;id=83bc155d-2f32-402e-8725-5554d972e82c" rel="noopener noreferrer"&gt;You can also visit the Spanish version of this post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.me/rtagliajs" rel="noopener noreferrer"&gt;You can contact me by telegram if you need to hire a Full Stack developer.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also find me on &lt;strong&gt;Discord as Appu#9136&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thank you for your time.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
