{"mappings":";;;;;;;;;;;;;AAAO,SAAS,0CACd,MAAgB,EAChB,eAAe,KAAK;IAEpB,MAAM,wBAAwB,qDAA+B;IAC7D,MAAM,UAAU,MAAM,IAAI,CAAC,sBAAsB,MAAM,IAAI,GAAG,CAAC,CAAC,MAC9D,kCAAY,KAAK;IAEnB,QAAQ,IAAI,CAAC,CAAC,IAAI;QAChB,0FAA0F;QAC1F,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,aAAa;QACtD,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,aAAa;QAEtD,IAAI,SAAS,QACX,OAAO;QAET,IAAI,SAAS,QACX,OAAO;QAET,OAAO;IACT;IACA,OAAO;AACT;AAEA;;;CAGC,GACD,SAAS,kCAAY,MAAgB,EAAE,eAAe,KAAK;IACzD,sEAAsE;IACtE,IAAI,OAAO,MAAM,KAAK,GAAG;QACvB,MAAM,QAAQ,MAAM,CAAC,EAAE;QACvB,MAAM,OAAqB;YACzB,QAAQ,MAAM,QAAQ,GAAG;YACzB,KAAK;YACL,QAAQ;gBACN;oBACE,WAAW,MAAM,SAAS;oBAC1B,UAAU,MAAM,QAAQ;oBACxB,OAAO,MAAM,QAAQ,GAAG;gBAC1B;aACD;YACD,aAAa,MAAM,MAAM;YACzB,eAAe,MAAM,IAAI;QAC3B;QACA,OAAO;IACT,OAAO;QACL,MAAM,iBAAiB,CAAC;QACxB,OAAO,GAAG,CAAC,CAAC;YACV,cAAc,CAAC,MAAM,SAAS,CAAC,GAAG,cAAc,CAAC,MAAM,SAAS,CAAC,IAAI;YACrE,cAAc,CAAC,MAAM,SAAS,CAAC,IAAI,MAAM,QAAQ;QACnD;QAEA,MAAM,MAAM,yCAAmB,QAAQ;QACvC,IAAI,MAAM,GACR,cAAc,CAAC,aAAa,IAAI;QAElC,IAAI,SAAS;QAEb,IAAI,SAA6B,OAAO,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAChE,0DAA0D;YAC1D,IAAI,cAAc,CAAC,KAAK,GAAG,GACzB,SAAS;YAGX,MAAM,MAAM;gBACV,WAAW;gBACX,UAAU,cAAc,CAAC,KAAK;gBAC9B,OAAO,cAAc,CAAC,KAAK,GAAG;YAChC;YAEA,OAAO;QACT;QAEA,iCAAiC;QACjC,MAAM,iBAAiB,CAAC,CAAC,OAAO,IAAI,CAClC,CAAC,QAAU,MAAM,SAAS,KAAK;QAGjC,MAAM,gBAAgB,UAAU,mBAAmB;QAEnD,8BAA8B;QAC9B,wEAAwE;QACxE,qGAAqG;QAErG,YAAY;QACZ,IAAI,kBAAkB,MACpB,SAAS,OAAO,MAAM,CAAC,CAAC;YACtB,IAAI,MAAM,SAAS,KAAK,gBAAgB,MAAM,KAAK,GAAG,GACpD,OAAO;YAET,OAAO;QACT;QAEF,MAAM,WAAyB;oBAC7B;YACA,aAAa,MAAM,CAAC,EAAE,CAAC,MAAM;YAC7B,eAAe,MAAM,CAAC,EAAE,CAAC,IAAI;oBAC7B;YACA,KAAK;QACP;QACA,OAAO;IACT;AACF;AACA,SAAS,qDAA+B,MAAgB;IACtD,IAAI,CAAC,QACH,MAAM,MAAM;IAEd,MAAM,MAA6B,IAAI;IACvC,OAAO,GAAG,CAAC,CAAC;QACV,MAAM,MAAgB,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE;QAC/C,IAAI,IAAI,CAAC;QACT,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;IACtB;IACA,OAAO;AACT;IAuBA,2CAAe;gBACb;AACF;AAEA,SAAS,yCAAmB,MAAgB,EAAE,eAAe,KAAK;IAChE,iDAAiD;IACjD,iEAAiE;IACjE,OAAO;AACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAgCW,GACb","sources":["index.ts"],"sourcesContent":["export function getHistory(\n  deltas: IDelta[],\n  baseCurrency = \"RVN\"\n): IHistoryItem[] {\n  const deltasByTransactionId = getDeltasMappedToTransactionId(deltas);\n  const history = Array.from(deltasByTransactionId.values()).map((obj) =>\n    getListItem(obj, baseCurrency)\n  );\n  history.sort((h1, h2) => {\n    //Sort on blockheight AND transaction, you can send multiple transaction in the same block\n    const value1 = h1.blockHeight + \"_\" + h1.transactionId;\n    const value2 = h2.blockHeight + \"_\" + h2.transactionId;\n\n    if (value1 > value2) {\n      return -1;\n    }\n    if (value2 < value1) {\n      return 1;\n    }\n    return 0;\n  });\n  return history;\n}\n\n/**\n *\n * @param deltas Address deltas from the same transaction\n */\nfunction getListItem(deltas: IDelta[], baseCurrency = \"RVN\"): IHistoryItem {\n  //Very simple if only one delta, like you received two LEMONADE tokens\n  if (deltas.length === 1) {\n    const delta = deltas[0];\n    const item: IHistoryItem = {\n      isSent: delta.satoshis < 0,\n      fee: 0,\n      assets: [\n        {\n          assetName: delta.assetName,\n          satoshis: delta.satoshis,\n          value: delta.satoshis / 1e8,\n        },\n      ],\n      blockHeight: delta.height,\n      transactionId: delta.txid,\n    };\n    return item;\n  } else {\n    const balanceByAsset = {};\n    deltas.map((delta) => {\n      balanceByAsset[delta.assetName] = balanceByAsset[delta.assetName] || 0;\n      balanceByAsset[delta.assetName] += delta.satoshis;\n    });\n\n    const fee = getBaseCurrencyFee(deltas, baseCurrency);\n    if (fee > 0) {\n      balanceByAsset[baseCurrency] -= fee;\n    }\n    let isSent = false;\n\n    let assets: INeedABetterName[] = Object.keys(balanceByAsset).map((name) => {\n      //If any of the values are negative, it means we have sent\n      if (balanceByAsset[name] < 0) {\n        isSent = true;\n      }\n\n      const obj = {\n        assetName: name,\n        satoshis: balanceByAsset[name],\n        value: balanceByAsset[name] / 1e8,\n      };\n\n      return obj;\n    });\n\n    //Did we transfer asset (not RVN)\n    const containsAssets = !!assets.find(\n      (asset) => asset.assetName !== baseCurrency\n    );\n\n    const hasSentAssets = isSent && containsAssets === true;\n\n    //OK we have transfered assets\n    //If we find RVN transferes less than 5 RVN, assume it is the miners fee\n    //Sure, technically you can send 4 RVN and 1 LEMONADE in the same transaction but that is exceptional\n\n    //@ts-ignore\n    if (hasSentAssets === true) {\n      assets = assets.filter((asset) => {\n        if (asset.assetName === baseCurrency && asset.value < 5) {\n          return false;\n        }\n        return true;\n      });\n    }\n    const listItem: IHistoryItem = {\n      assets,\n      blockHeight: deltas[0].height,\n      transactionId: deltas[0].txid,\n      isSent,\n      fee: fee,\n    };\n    return listItem;\n  }\n}\nfunction getDeltasMappedToTransactionId(deltas: IDelta[]) {\n  if (!deltas) {\n    throw Error(\"Argument deltas is mandatory and cannot be nullish\");\n  }\n  const map: Map<string, IDelta[]> = new Map();\n  deltas.map((delta) => {\n    const arr: IDelta[] = map.get(delta.txid) || [];\n    arr.push(delta);\n    map.set(delta.txid, arr);\n  });\n  return map;\n}\nexport interface IDelta {\n  assetName: string;\n  satoshis: number;\n  txid: string;\n  index: number;\n  blockindex: number;\n  height: number;\n  address: string;\n}\n\ninterface INeedABetterName {\n  assetName: string;\n  value: number;\n  satoshis: number;\n}\nexport interface IHistoryItem {\n  isSent: boolean;\n  assets: INeedABetterName[];\n  blockHeight: number;\n  transactionId: string;\n  fee: number;\n}\nexport default {\n  getHistory,\n};\n\nfunction getBaseCurrencyFee(deltas: IDelta[], baseCurrency = \"RVN\"): number {\n  //We currently do not support calculation of fee.\n  //Why? because we need to get the full transaction to get the fee\n  return 0;\n  /*\n  //Check all inputed RVN and match with outputted RVN\n  //The diff is the tansaction fee.\n\n  //this only applies to SENT transactions\n\n  let inputted = 0;\n  let outputted = 0;\n\n  //It is sent if we have a RVN transfer that is negative\n  const isSent = !!deltas.find(\n    (delta) => delta.assetName === \"RVN\" && delta.satoshis < 0\n  );\n\n  if (isSent === true) {\n    console.log(\"Think that \", deltas[0].txid, \"is sent\");\n  }\n  if (isSent === false) {\n    return 0;\n  }\n\n  for (let delta of deltas) {\n    if (delta.assetName === \"RVN\") {\n      if (delta.satoshis < 0) {\n        inputted = inputted + delta.satoshis;\n      } else if (delta.satoshis > 0) {\n        outputted = outputted + delta.satoshis;\n      }\n    }\n  }\n\n  const fee = inputted - outputted;\n  return fee;*/\n}\n"],"names":[],"version":3,"file":"index.cjs.map"}