aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib/pending-balance-calculator.js
diff options
context:
space:
mode:
authorkumavis <kumavis@users.noreply.github.com>2017-09-28 07:04:51 +0800
committerGitHub <noreply@github.com>2017-09-28 07:04:51 +0800
commit15b2823e546cfefd7e867f078b4385ddc6be3a0f (patch)
tree448a321264f3d648d6edee7e90c6f487bc31084b /app/scripts/lib/pending-balance-calculator.js
parent734490c58c25587a247e48eea086880bcb6a14fe (diff)
parentecf909e140b2fc99afbd15f6f0882dd17e3ecb88 (diff)
downloadtangerine-wallet-browser-15b2823e546cfefd7e867f078b4385ddc6be3a0f.tar
tangerine-wallet-browser-15b2823e546cfefd7e867f078b4385ddc6be3a0f.tar.gz
tangerine-wallet-browser-15b2823e546cfefd7e867f078b4385ddc6be3a0f.tar.bz2
tangerine-wallet-browser-15b2823e546cfefd7e867f078b4385ddc6be3a0f.tar.lz
tangerine-wallet-browser-15b2823e546cfefd7e867f078b4385ddc6be3a0f.tar.xz
tangerine-wallet-browser-15b2823e546cfefd7e867f078b4385ddc6be3a0f.tar.zst
tangerine-wallet-browser-15b2823e546cfefd7e867f078b4385ddc6be3a0f.zip
Merge branch 'master' into new-currency-test
Diffstat (limited to 'app/scripts/lib/pending-balance-calculator.js')
-rw-r--r--app/scripts/lib/pending-balance-calculator.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/app/scripts/lib/pending-balance-calculator.js b/app/scripts/lib/pending-balance-calculator.js
new file mode 100644
index 000000000..cea642f1a
--- /dev/null
+++ b/app/scripts/lib/pending-balance-calculator.js
@@ -0,0 +1,51 @@
+const BN = require('ethereumjs-util').BN
+const normalize = require('eth-sig-util').normalize
+
+class PendingBalanceCalculator {
+
+ // Must be initialized with two functions:
+ // getBalance => Returns a promise of a BN of the current balance in Wei
+ // getPendingTransactions => Returns an array of TxMeta Objects,
+ // which have txParams properties, which include value, gasPrice, and gas,
+ // all in a base=16 hex format.
+ constructor ({ getBalance, getPendingTransactions }) {
+ this.getPendingTransactions = getPendingTransactions
+ this.getNetworkBalance = getBalance
+ }
+
+ async getBalance() {
+ const results = await Promise.all([
+ this.getNetworkBalance(),
+ this.getPendingTransactions(),
+ ])
+
+ const [ balance, pending ] = results
+ if (!balance) return undefined
+
+ const pendingValue = pending.reduce((total, tx) => {
+ return total.add(this.calculateMaxCost(tx))
+ }, new BN(0))
+
+ return `0x${balance.sub(pendingValue).toString(16)}`
+ }
+
+ calculateMaxCost (tx) {
+ const txValue = tx.txParams.value
+ const value = this.hexToBn(txValue)
+ const gasPrice = this.hexToBn(tx.txParams.gasPrice)
+
+ const gas = tx.txParams.gas
+ const gasLimit = tx.txParams.gasLimit
+ const gasLimitBn = this.hexToBn(gas || gasLimit)
+
+ const gasCost = gasPrice.mul(gasLimitBn)
+ return value.add(gasCost)
+ }
+
+ hexToBn (hex) {
+ return new BN(normalize(hex).substring(2), 16)
+ }
+
+}
+
+module.exports = PendingBalanceCalculator