Exchange Operator Migration Guide
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.
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:
Name | ID |
---|---|
HNT | hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux |
MOBILE | mb1eu7TzEc71KxDpsmsKoucSSuuoGLv1drys1oP2jh6 |
IOT | iotEVVZLEywoTn1QdwNPddxPWszn3zFhEot3MfL9fns |
DC | dcuc8Amr83Wz27ZkQ2K9NS6r8zRpf1J6cvArEBDZDmm |
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:
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())
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:
-
Get the Solana Wallet address from a Helium Wallet address:
https://migration.web.helium.io/helium/*helium-wallet-address*
-
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
-
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