Skip to main content

Exchange Operator Migration Guide

This page has not been fully updated to represent the latest state of the Helium Network following the migration to Solana on April 18, 2023.
Updated for Solana Mainnet

The Migration Widget and description provided below have been updated to reflect Solana Mainnet.

The Helium Network is migrating to the Solana blockchain. All Helium Network Tokens (HNT, IOT, and MOBILE), will become Solana SPL tokens.

If an exchange already supports SPL tokens, follow the steps below.

SPL token Support

Please refer to the Solana Documentation on how to Add Solana to Your Exchange for details.

Mint IDs

All Helium Network Tokens are available on the TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA program, and mint IDs exist both on mainnet-beta and devnet for testing.

The mint IDs are as follows:

NameID
HNThntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux
MOBILEmb1eu7TzEc71KxDpsmsKoucSSuuoGLv1drys1oP2jh6
IOTiotEVVZLEywoTn1QdwNPddxPWszn3zFhEot3MfL9fns
DCdcuc8Amr83Wz27ZkQ2K9NS6r8zRpf1J6cvArEBDZDmm

Mapping Helium Wallets to Solana Wallets

Helium Wallets use the same ED25519 curve as Solana Wallets, resulting in Helium public keys and secret keys mapping directly to Solana Wallets.

You can either migrate your wallet using this widget:

Helium Address:
Solana Address:

Or continue reading for manual instructions:

JavaScript

To get the Solana public key equivalent of a Helium public key in javascript run:

import Address from "@helium/address";
import { PublicKey } from "@solana/web3.js"

const addr = Address.fromB58("...helium pubkey...");

// Gets the solana pubkey
new PublicKey(addr.publicKey).toBase58()

To get a Solana equivalent Keypair from a Helium Keypair:

import { Keypair } from "@helium/crypto";
import { Keypair as SolanaKeypair } from "@solana/web3.js"

const solanaKeypair = SolanaKeypair.fromSecretKey(heliumKeypair.privateKey);

Rust

In rust, to get a pubkey:

let helium_pubkey_bytes = helium_pubkey.to_vec();

let solana_pubkey = solana_sdk::pubkey::Pubkey::new(&helium_pubkey_bytes[1..]);
println!("solana public key: {}", solana_pubkey);

To map a keypair:

solana_sdk::signature::Keypair::from_bytes(helium_keypair.secret_to_vec())
Migration API

The Migration API can be used to retrieve the Solana Wallet address from a Helium Wallet address.

https://migration.web.helium.io/helium/*helium-wallet-address*


Wallet Migration

Wallets will need to be inflated on Solana. In essence this is recreating the Wallet's Helium state on Solana.

The migration-service can be used to migrate wallet(s) to Solana.

For the Helium Wallet app users, the Wallet requests the migration-service to get the needed transaction and submits them to the Solana blockchain when the app is opened for the first time after the Migration is complete.

Since exchange Wallets may not use the Helium Wallet app, the migration service can instead be used directly by following the below steps:

For mainnet:

  1. Get the Solana Wallet address from a Helium Wallet address: https://migration.web.helium.io/helium/*helium-wallet-address*

  2. Get the list of serialized transactions, which should be sent to Solana: https://migration.web.helium.io/migrate/*solana-wallet-address*?limit=1000&offset=0

  3. Submit the transactions to Solana. You can see typescript code demonstrating how to use this here.

    Note: Each transaction is only allowed to execute once.

Alternatively, you can use the command line utility for steps 2-3.

$ env MIGRATION_SERVICE_URL=https://migration.web.helium.io env SOLANA_URL=https:/api.mainnet-beta.solana.com env SOLANA_WSS_URL=wss://api.mainnet-beta.solana.com ./migration-tx-executor --wallet *your-solana-wallet*

Trustless Wallet Migration

The tools listed above are convenient but rely on the migration service provided by the Helium Foundation.

The on-chain implementation of the migration is trustless, and the full state of the Helium blockchain will be converted to a list of Solana transactions and compressed into a Merkle Tree root on Solana.

Any entity providing the proper proof that the provided transactions are valid can execute the transactions to inflate a wallet. Each transaction is only allowed to execute once.

If you would like a copy of the database serving the proofs for the migration service, please contact the Helium Foundation.

This database copy can be used to run an instance of the migration service