Tracks crypto balances across enabled wallet accounts.
This Exodus SDK feature tracks the crypto-denominated balances for all enabled wallet accounts. For fiat-denominated balances, check out @exodus/fiat-balances.
``sh`
yarn add @exodus/balances
This feature is designed to be used together with @exodus/headless. See using the sdk.
1. Open the playground https://exodus-hydra.pages.dev/
2. Run selectors.balances.byAsset(store.getState()) in the Dev Tools Console to get balances by asset aggregated across enabled wallet accounts.selectors.balances
3. Try out some other selectors from . See example usage in tests.
4. Mock an address with a balance, tick the blockchain monitor and check your balance.
`js`
// mock your ethereum address with one that has a balance
await exodus.debug.addressProvider.mockAddress({
assetName: 'ethereum',
walletAccount: 'exodus_0',
address: '0x1111111111111111111111111111111111111111',
})
// force tick the ethereum monitor, or wait a while
await exodus.txLogMonitors.update({ assetName: 'ethereum', refresh: true })
// check your balance
selectors.balances
.createTotal({ assetName: 'ethereum', walletAccount: 'exodus_0' })(store.getState())
.toString()
See using the sdk for more details on how features plug into the SDK. Note that the balances feature currently doesn't provide a top level API and is meant to be used purely through selectors.
If you're building a feature that requires balances, add a dependency on the balancesAtom as below. See also the available balance fields.
`js
const myModuleDefinition = {
id: 'myModule',
type: 'module',
factory: ({ balancesAtom }) => {
const doSomethingSpecial = async () => {
// {
// [walletAccount]: {
// [assetName]: {
// // e.g. 'total', 'spendable', 'unconfirmedSent', 'unconfirmedReceived'
// [balanceField]: NumberUnit, // see @exodus/currency
// }
// }
// }
const { balances } = await balancesAtom.get()
// ...
}
return {
doSomethingSpecial,
}
},
dependencies: ['balancesAtom'],
}
`
See using the sdk for more details on basic UI-side setup.
`js
import { selectors } from '~/ui/flux'
const MyComponent = () => {
const bitcoinBalance = useSelector(
selectors.balances.createSpendable({
assetName: 'bitcoin',
walletAccount: 'exodus_0',
})
) // returns a NumberUnit
}
`
Do NOT introduce any asset specifics like if (assetName === 'dogicorn') balance = balance.mul(2). All asset-specifics belong in asset.api.getBalances` or other APIs inside the asset libraries.