<?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: Hypermid</title>
    <description>The latest articles on DEV Community by Hypermid (@hypermid).</description>
    <link>https://dev.to/hypermid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3969437%2Ff8d50b13-99ab-40fb-a77a-494cb7845e9a.png</url>
      <title>DEV Community: Hypermid</title>
      <link>https://dev.to/hypermid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hypermid"/>
    <language>en</language>
    <item>
      <title>Cross-chain swap in 10 lines — without signing up for anything</title>
      <dc:creator>Hypermid</dc:creator>
      <pubDate>Fri, 05 Jun 2026 08:12:50 +0000</pubDate>
      <link>https://dev.to/hypermid/cross-chain-swap-in-10-lines-without-signing-up-for-anything-29pl</link>
      <guid>https://dev.to/hypermid/cross-chain-swap-in-10-lines-without-signing-up-for-anything-29pl</guid>
      <description>&lt;p&gt;Most cross-chain SDKs gate "hello world" behind a signup form, an API key, and a dashboard. The reason isn't security — it's billing. You only find out after you've already lost twenty minutes you wanted to spend on your actual app.&lt;/p&gt;

&lt;p&gt;I just shipped a swap/bridge/on-ramp SDK that flips that. &lt;strong&gt;Anonymous tier works out of the box. No API key required to ship.&lt;/strong&gt; Custom partner fees are opt-in once you actually need them.&lt;/p&gt;

&lt;p&gt;Here's a real cross-chain swap from Ethereum USDC to Base USDC in 10 lines:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Hypermid&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="s2"&gt;@hypermid/sdk&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;hm&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;Hypermid&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;                          &lt;span class="c1"&gt;// no signup&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;quote&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;hm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getQuote&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;fromChain&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="na"&gt;fromToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// USDC ETH&lt;/span&gt;
  &lt;span class="na"&gt;toChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="mi"&gt;8453&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;toToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// USDC Base&lt;/span&gt;
  &lt;span class="na"&gt;fromAmount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1000000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                            &lt;span class="c1"&gt;// 1 USDC (6 decimals)&lt;/span&gt;
  &lt;span class="na"&gt;fromAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;toAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&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;exec&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;hm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="cm"&gt;/* same params */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;    &lt;span class="c1"&gt;// returns the tx to sign&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&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;hm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStatus&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;txHash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;chainId&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same shape works in &lt;strong&gt;Python, Go, and Rust&lt;/strong&gt; — same method names, same params, same anonymous tier. Pick whichever fits your stack:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Install&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript / JS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @hypermid/sdk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install hypermid&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;&lt;code&gt;go get github.com/Hypermid/hypermid-sdk-go@v1.0.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cargo add hypermid-sdk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why I built it this way
&lt;/h2&gt;

&lt;p&gt;I run &lt;a href="https://hypermid.io" rel="noopener noreferrer"&gt;Hypermid&lt;/a&gt;, a routing layer that picks the best bridge/swap provider per pair across 90+ chains — EVM, Solana, Bitcoin, NEAR, Sui, Tron, TON, XRP and Doge. The routing is the interesting part. But every time I integrated us into a partner project, the first 20 minutes were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign up.&lt;/li&gt;
&lt;li&gt;Get an API key.&lt;/li&gt;
&lt;li&gt;Add it to the partner's secret manager.&lt;/li&gt;
&lt;li&gt;Wire it through their config.&lt;/li&gt;
&lt;li&gt;Realise the key needs a different scope.&lt;/li&gt;
&lt;li&gt;Repeat step 2.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That friction kills the demo. So anonymous tier is the default. API keys only matter when you need partner-specific things (custom fee splits, fee discounts, higher rate limits, scoped webhooks). You can ship to production on the anonymous tier — and most indie projects will.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the box
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quote → Execute → Status&lt;/strong&gt; — the swap pipeline. Returns the on-chain tx for EVM, or a deposit address for NEAR Intents / Bitcoin / Tron / TON / XRP / Doge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;getChains&lt;/code&gt; / &lt;code&gt;getTokens&lt;/code&gt;&lt;/strong&gt; — the registry. 90+ chains, growing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;getBalances(address)&lt;/code&gt;&lt;/strong&gt; — multi-ecosystem wallet balances + USD totals in one call. Auto-detects the address ecosystem and queries the right indexers (Alchemy + Blockstream + multicall + Sui/NEAR/Tron RPC). Returns priced holdings + dust classification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook events&lt;/strong&gt; — &lt;code&gt;swap.completed&lt;/code&gt;, &lt;code&gt;onramp.completed&lt;/code&gt;, etc., with HMAC-SHA256 verification helpers shipped in every SDK.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fiat on-ramp&lt;/strong&gt; — RampNow integration, same SDK.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in routing&lt;/strong&gt; across LI.FI + NEAR Intents + Hypermid SuperSwap (our PulseChain-native route), per pair.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One trick I wish I'd learned earlier
&lt;/h2&gt;

&lt;p&gt;For the TypeScript SDK I shipped a &lt;strong&gt;dual ESM + CJS&lt;/strong&gt; build. Modern Next/Vite/Bun stacks are ESM-native, but a lot of partners are still on CJS — AWS Lambda's Node defaults, older Express backends. ESM-only packages give them &lt;code&gt;ERR_PACKAGE_PATH_NOT_EXPORTED&lt;/code&gt; and you spend a day debugging.&lt;/p&gt;

&lt;p&gt;The fix is small: two &lt;code&gt;tsconfig.json&lt;/code&gt;s, two &lt;code&gt;dist/&lt;/code&gt; subfolders, and this &lt;code&gt;exports&lt;/code&gt; block in &lt;code&gt;package.json&lt;/code&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exports"&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;"."&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;"types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"./dist/esm/index.d.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"import"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"./dist/esm/index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"require"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./dist/cjs/index.js"&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;Plus a &lt;code&gt;dist/cjs/package.json&lt;/code&gt; containing &lt;code&gt;{"type":"commonjs"}&lt;/code&gt; so Node treats those &lt;code&gt;.js&lt;/code&gt; files as CJS even though the root says &lt;code&gt;"type":"module"&lt;/code&gt;. Both &lt;code&gt;import&lt;/code&gt; and &lt;code&gt;require&lt;/code&gt; work in the same package. No extra dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The packages are live now — no signup required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 npm: &lt;a href="https://www.npmjs.com/package/@hypermid/sdk" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@hypermid/sdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🦀 crates.io: &lt;a href="https://crates.io/crates/hypermid-sdk" rel="noopener noreferrer"&gt;https://crates.io/crates/hypermid-sdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐍 PyPI: &lt;a href="https://pypi.org/project/hypermid/" rel="noopener noreferrer"&gt;https://pypi.org/project/hypermid/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐹 Go: &lt;code&gt;go get github.com/Hypermid/hypermid-sdk-go@v1.0.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;📖 Docs: &lt;a href="https://docs.hypermid.io" rel="noopener noreferrer"&gt;https://docs.hypermid.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feedback / issues / "I tried it and X broke" — open an issue on any of the SDK repos and I read them all. If you build something with it I'd love to see it.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>dex</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
