Account Balance Calculation

If you send the request getaccountinfo, you will get responses as below:

Please refer to accountbalance for the meaning of the fields.

{
  "AccountInfo": {
    "RP": "Speculation",
    "G": "dt",
    "BL": [
      {
        "CR": "BCH",
        "SOD": 0.0,
        "C": 1000.0
      },
      {
        "CR": "BTC",
        "SOD": 0.0,
        "C": 999.9933
      },
      {
        "CR": "ETC",
        "SOD": 0.0,
        "C": 1000.0
      },
      {
        "CR": "ETH",
        "SOD": 0.0,
        "C": 1000.0
      },
      {
        "CR": "USD",
        "SOD": 0.0,
        "C": 1000066.471996
      },
      {
        "CR": "MONA",
        "SOD": 0.0,
        "C": 0.0
      }
    ],
    "CDL": [
      {
        "S": "ETH_USD",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      },
      {
        "S": "BCH_BTC",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      },
      {
        "S": "BCH_USD",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      },
      {
        "S": "ETC_BTC",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      },
      {
        "S": "ETC_USD",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      },
      {
        "S": "ETH_BTC",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      },
      {
        "S": "BTC_USD",
        "TSS": 0.0,
        "TBS": 0.0036,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.02574,
        "LKP": 0.0
      },
      {
        "S": "LTC_USD",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      },
      {
        "S": "DASH_USD",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      },
      {
        "S": "MONA_USD",
        "TSS": 0.0,
        "TBS": 0.0,
        "OS": 0.0,
        "AP": 0.0,
        "P": 0.0,
        "MV": 0.0,
        "IMF": 1.0,
        "LP": 0.0,
        "BIMR": 0.0,
        "QIMR": 0.0,
        "LKP": 0.0
      }
    ],
    "IsLocked": false,
    "Account": "275d51ea9ba74291b2bdcc7400e17a22",
    "MsgType": "AccountInfo"
  },
  "RC": 0,
  "CRID": "e3206a45-fa5d-4944-90a1-896c966e5822",
  "Reason": "OK",
  "MsgType": "GetAccountInfoResponse"
}

Account Balance Calculation Method

// accuracy calculation for floating number
const Big = require('big.js')

// Calculate frozen balance
const sumFrozen = (cdl, coin) => {
  let sum = new Big('0')
  cdl.forEach(c => {
    // split symbol
    const tmp = c.S.split('_')
    if (tmp.length !== 2) {
      // invalid symbol
      return
    }
    if (tmp[0] === coin) {
      // + BIMR
      sum = sum.plus(c.BIMR)
      return
    }
    if (tmp[1] === coin) {
      // + QIMR
      sum = sum.plus(c.QIMR)
      return
    }
  })
  return sum.toString()
}

const getBalanceFromInfoObject = info => {
  const obj = {}
  info.BL.forEach(bl => {
    const frozen = sumFrozen(info.CDL, bl.CR)
    obj[bl.CR] = {
      total: bl.C,
      frozen,
      avail: new Big(bl.C).minus(frozen).toString() // avail = total - frozen
    }
  })
  return obj
}

console.log(getBalanceFromInfoObject(info.AccountInfo))

/*
{ BCH: { total: 1000, frozen: '0', avail: '1000' },
  BTC: { total: 999.9933, frozen: '0', avail: '999.9933' },
  ETC: { total: 1000, frozen: '0', avail: '1000' },
  ETH: { total: 1000, frozen: '0', avail: '1000' },
  USD:
   { total: 1000066.471996,
     frozen: '0.02574',
     avail: '1000066.446256' },
  MONA: { total: 0, frozen: '0', avail: '0' } }
*/