This is the developer source repository, general information, and download page can be found at Asgardex
✔️ implemented
✅ planned
- not needed
| RUNE | BTC | BCH | DOGE | ETH / ERC20 | LTC | COSMOS | BSC | AVAX | MAYA | DASH | KUJI | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Keystore | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Ledger * | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | - | - | |
| Send ** | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Receive | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Deposit | ✔️ | - | - | - | - | - | - | - | - | ✔️ | - | - | 
| Shares | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| History | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Synths | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | - | - | - | 
(*) Ledger RUNE is not supported at stagenet. Ledger LTC/BCH/DOGE are not supported at testnet. Maya is not supported on Ledger.
(**) With or without memo
| RUNE | BSC /BEP20 | BTC | BCH | DOGE | ETH / ERC20 | LTC | COSMOS | AVAX | |
|---|---|---|---|---|---|---|---|---|---|
| Pools overview | - | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Pool detail | - | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Swap | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Deposit * | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Withdraw * | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Recovery tool | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 
(*) Symmetrical deposit/withdraw only
| MAYA | RUNE | BTC | ETH / ERC20 | KUJI | DASH | ARB | |
|---|---|---|---|---|---|---|---|
| Pools overview | - | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Pool detail | - | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Swap | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Deposit * | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Withdraw * | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Recovery tool | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 
| Synths | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Savers | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | ✖️ | 
(*) Symmetrical deposit/withdraw only
| Overview | Status | BOND | UNBOND | LEAVE | THORName | 
|---|---|---|---|---|---|
| ✔️ | ✅ | ✔️ | ✔️ | ✔️ | ✔️ | 
| Overview | Status | BOND | UNBOND | LEAVE | MAYAName | 
|---|---|---|---|---|---|
| ✔️ | ✅ | ✔️ | ✔️ | ✖️ | ✔️ | 
| ENGLISH 🇺🇸 | GERMAN 🇩🇪 | FRENCH 🇫🇷 | RUSSIAN 🇷🇺 | HINDI :hi: | SPANISH 🇪🇸 | KOREAN :ko: | 
|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | 
- 100% open-source (built by the community)
 - Security first
 - 30 bps affiliate fees only on swaps over $1001
 - No affiliate fee on: RunePool, LP actions
 
(in alphabetical order)
- Ant Design
 - Vite
 - ESLint
 - Electron
 - fp-ts
 - Vitest
 - Observable Hooks
 - Prettier
 - ReactJS
 - Styled Components
 - RxJS
 - Typescript
 - xchainjs-lib
 - and others ...
 
It's recommended to use a Node version as same as Electron is running with (currently: Electron 35 / Node 22.14). It's recommended to install nvm to run as the same Node version locally as used for building ASGARDEX on CI.
git clone https://github.com/asgardex/asgardex-desktop.git asgardex
cd asgardex
yarnIn case you get an an ENAMETOOLONG: name too long error or similar by running yarn install, e.g.
YN0001: │ Error: @storybook/react-docgen-typescript-plugin@npm:1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0: ENAMETOOLONG: name too long, unlink '~/.yarn/berry/cache/@storybook-react-docgen-typescript-plugin-npm-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0-b31cc57c40-8.zip' -> 'asgardex-desktop/.yarn/cache/@storybook-react-docgen-typescript-plugin-npm-1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0-b31cc57c40-91a3015d38.zip-3439e0483605ccee.tmp'change cache folder as described in Unable to install latest SB version: Error: ENAMETOOLONG: name too long, unlink... #18441 to run yarn install as follow:
- Check your cache dir
 
yarn cache dir
~/.cache/yarn/v6- Point it to another (short) folder using 
YARN_CACHE_FOLDER(see Change the cache path for yarn), e.g. 
YARN_CACHE_FOLDER=/tmp/y/ yarn installWhile environment variables are not required (defaults are set), you can configure them. Create an .env file by copying all content of .env.sample and change these for your needs.
- Build everything needed (main, preload and renderer) and run application in 
watchmode 
yarn devIn case Node might run into memory issues locally set --max-old-space-size as follow:
export NODE_OPTIONS="--max-old-space-size=4096"You may need to install the following dependencies in your local machine in order to build the native libraries used by Asgardex
- Install python3
 - Install 'Microsoft C++ build tools'
 
You may need to install the following dependencies in your local machine in order to build the native libraries used by Asgardex
- Install python3
 - Install dependency build-essential
 
sudo apt-get install build-essential- Install dependency libudev-dev
 
sudo apt-get install libudev-devWhenever THORChain ERC20 asset whitelist has been updated (usually with a new release of THORNode), run following script to auto-generate this list for ASGARDEX
For synths to have an icon the asset in the whitelist needs to be duplicated and the synth boolean flipped true
yarn generate:erc20whitelist
yarn generate:avaxerc20whitelist
yarn generate:bscerc20whitelist
yarn generate:arberc20whitelistHow to auto-unlock a locked wallet while hot-reloading the app (for development only, disabled in production build)
Use VITE_WALLET_PASSWORD to run the app by replacing password with your own password
VITE_WALLET_PASSWORD=password yarn devOr add to VITE_WALLET_PASSWORD=password to .env file and run yarn dev
yarn testyarn lintyarn storybookvisualize the bundle map using source-map-explorer
yarn analyzeTo check locally if auto-update works correctly create dev-app-update.yml file at the root
directory with a content based on dev-app-update.sample.yml with providing
your GutHub personal access token. After that just play locally with version provided by package.json
src
├── main # sources of Electron's main process
├── renderer # sources of Electron's renderer process (aka webapp)
└── shared # shared sources for Electron's main and renderer processessrc/main
├── electron.ts # entry point
├── i18n # internationalization (needed for menus)
└── menu # "native" menussrc/renderer
├── assets # static files (svg, fonts etc.)
├── components # basic components
├── contexts # React contexts to provide "global" accessible states (RxJS based)
├── helpers # helper functions
├── hooks # custom hooks
├── i18n # internationalization (translations etc.)
├── index.tsx # entry point
├── routes # routing
├── services # RxJS based IO handler and states (consumed by contexts)
├── types # TypeScript types (e.g. generated types for Midgard API)
└── views # "Container" componentsASGARDEX follows security recommendation made by Electron team, such as:
- Disable the Node.js integration in renderers that display remote content
 - Enable context isolation in renderers that display remote content
 - Expose IPC-based APIs to provide one method per IPC message
 - Disable the remote module
 - Do not use openExternal with untrusted content. Provided hostnames are defined in 
EXTERNALS_WHITELIST, all others are blocked. This list has to be extended if needed. - Use a current version of Electron
 
Important note for macOS users: Please follow guide of "How to package ASGARDEX on macOS" before running following command.
yarn package:electronBy creating or importing a keystore wallet, ASGARDEX is adding its encrypted keystore into wallets.json in Electron's appData folder at following location:
# ASGARDEX installed from *.exe
%APPDATA%/ASGARDEX/storage/wallets.json
# ASGARDEX built and run locally
%APPDATA%/Electron/storage/wallets.json# ASGARDEX installed from *.dmg
~/Library/Application Support/ASGARDEX/storage/wallets.json
# ASGARDEX built and run locally
~/Library/Application Support/Electron/storage/wallets.json# ASGARDEX installed from *.deb
~/.config/ASGARDEX/storage/wallets.json
# ASGARDEX built and run locally
~/.config/Electron/storage/wallets.jsonBy removing a wallet in Wallet -> Settings its data will be removed from wallets.json. ASGARDEX will prompt a message to users to inform about saving its phrase on a save place before removing the wallet.
After removing all wallets wallets.json will be empty and won't include any wallet related data.
By adding a Ledger account to a wallet, ASGARDEX saves its address and some extra information (chain, network, walletIndex, hdMode) into ledgers.json located in Electron's appData folder:
# ASGARDEX installed from *.exe
%APPDATA%/ASGARDEX/storage/ledgers.json
# ASGARDEX built and run locally
%APPDATA%/Electron/storage/ledgers.json# ASGARDEX installed from *.dmg
~/Library/Application Support/ASGARDEX/storage/ledgers.json
# ASGARDEX built and run locally
~/Library/Application Support/Electron/storage/ledgers.json# ASGARDEX installed from *.deb
~/.config/ASGARDEX/storage/ledgers.json
# ASGARDEX built and run locally
~/.config/Electron/storage/ledgers.jsonWhenever a Ledger has been removed in Wallet -> Settings, its data will be removed from ledgers.json. By removing all Ledger accounts from each wallet ledgers.json will be empty and won't include any Ledger related data. The same by removing all wallets.
See RELEASE.md
See the docs and guides here
Everyone is welcome to contribute. Check open issues or create a new one to start your work with and open a PR afterwards. Newcomers might want to check issues labeled as good first issues.
Please use bug report template to file any bugs.

