<?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: opensource-crypto</title>
    <description>The latest articles on DEV Community by opensource-crypto (@opensourcecrypto).</description>
    <link>https://dev.to/opensourcecrypto</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%2F4011762%2F1d27f01a-1a1f-4c93-ad16-b4891e003375.png</url>
      <title>DEV Community: opensource-crypto</title>
      <link>https://dev.to/opensourcecrypto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/opensourcecrypto"/>
    <language>en</language>
    <item>
      <title>How to Encode and Decode Base58 in TypeScript (Zero Dependencies)</title>
      <dc:creator>opensource-crypto</dc:creator>
      <pubDate>Thu, 02 Jul 2026 06:28:47 +0000</pubDate>
      <link>https://dev.to/opensourcecrypto/how-to-encode-and-decode-base58-in-typescript-zero-dependencies-3c6k</link>
      <guid>https://dev.to/opensourcecrypto/how-to-encode-and-decode-base58-in-typescript-zero-dependencies-3c6k</guid>
      <description>&lt;p&gt;Base58 is everywhere in crypto — Solana addresses, Bitcoin wallets, IPFS CIDs. Here's how to work with it in TypeScript without pulling in a dependency tree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Base58?
&lt;/h2&gt;

&lt;p&gt;Base58 is like Base64 but without characters that look similar: no 0, O, I, or l. This makes it perfect for addresses and keys that humans need to read or type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install base58-core

&lt;p&gt;import { encode, decode } from 'base58-core';&lt;/p&gt;

&lt;p&gt;const encoded = encode(new Uint8Array([72, 101, 108, 108, 111]));&lt;br&gt;
console.log(encoded); // "9Ajdvzr"&lt;/p&gt;

&lt;p&gt;const decoded = decode(encoded);&lt;br&gt;
console.log(decoded); // Uint8Array&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  With Checksum (Base58Check)&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Bitcoin and Solana addresses use Base58Check — base58 with a 4-byte SHA-256 checksum:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { encodeChecked, decodeChecked } from 'base58-core';

&lt;p&gt;const address = encodeChecked(publicKeyBytes);&lt;br&gt;
const verified = decodeChecked(address);&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  CLI Usage&lt;br&gt;
&lt;/h2&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx base58-cli encode "hello"&lt;br&gt;
// 9Ajdvzr&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Why Not bs58?&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;bs58 is the most popular option, but it depends on base-x. If you want something with zero dependencies, native TypeScript types, and ESM/CJS dual builds, base58-core covers the same API.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/opensource-crypto/base58-core" rel="noopener noreferrer"&gt;https://github.com/opensource-crypto/base58-core&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>solana</category>
      <category>web3</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
