UNPKG

20.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"balance.js","sourceRoot":"","sources":["balance.ts"],"names":[],"mappings":"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","sourcesContent":["import { create as createLogger } from '../common/log'\nconst log = createLogger('balance-middleware')\nimport { Middleware, MiddlewareCallback, MiddlewareServices, Pipelines } from '../types/middleware'\nimport { AccountInfo } from '../types/accounts'\nimport BigNumber from 'bignumber.js'\nimport * as IlpPacket from 'ilp-packet'\nimport Stats from '../services/stats'\n\nconst { InsufficientLiquidityError } = IlpPacket.Errors\n\ninterface BalanceOpts {\n initialBalance?: BigNumber\n minimum?: BigNumber\n maximum?: BigNumber\n}\n\nclass Balance {\n private balance: BigNumber\n private minimum: BigNumber\n private maximum: BigNumber\n constructor ({\n initialBalance = new BigNumber(0),\n minimum = new BigNumber(0),\n maximum = new BigNumber(Infinity)\n }: BalanceOpts) {\n this.balance = initialBalance\n this.minimum = minimum\n this.maximum = maximum\n }\n\n add (amount: BigNumber | string | number) {\n const newBalance = this.balance.plus(amount)\n\n if (newBalance.gt(this.maximum)) {\n log.error('rejected balance update. oldBalance=%s newBalance=%s amount=%s', this.balance, newBalance, amount)\n throw new InsufficientLiquidityError('exceeded maximum balance.')\n }\n\n this.balance = newBalance\n }\n\n subtract (amount: BigNumber | string | number) {\n const newBalance = this.balance.minus(amount)\n\n if (newBalance.lt(this.minimum)) {\n log.error('rejected balance update. oldBalance=%s newBalance=%s amount=%s', this.balance, newBalance, amount)\n throw new Error(`insufficient funds. oldBalance=${this.balance} proposedBalance=${newBalance}`)\n }\n\n this.balance = newBalance\n }\n\n getValue () {\n return this.balance\n }\n\n toJSON () {\n return {\n balance: this.balance.toString(),\n minimum: this.minimum.toString(),\n maximum: this.maximum.toString()\n }\n }\n}\n\nexport default class BalanceMiddleware implements Middleware {\n private stats: Stats\n private getInfo: (accountId: string) => AccountInfo\n private sendMoney: (amount: string, accountId: string) => Promise<void>\n private balances: Map<string, Balance> = new Map()\n\n constructor (opts: {}, { getInfo, sendMoney, stats }: MiddlewareServices) {\n this.getInfo = getInfo\n this.sendMoney = sendMoney\n this.stats = stats\n }\n\n async applyToPipelines (pipelines: Pipelines, accountId: string) {\n const accountInfo = this.getInfo(accountId)\n if (!accountInfo) {\n throw new Error('could not load info for account. accountId=' + accountId)\n }\n const account = { accountId, accountInfo }\n if (accountInfo.balance) {\n const {\n minimum = '-Infinity',\n maximum\n } = accountInfo.balance\n\n const balance = new Balance({\n minimum: new BigNumber(minimum),\n maximum: new BigNumber(maximum)\n })\n this.balances.set(accountId, balance)\n\n log.info('initializing balance for account. accountId=%s minimumBalance=%s maximumBalance=%s', accountId, minimum, maximum)\n\n pipelines.startup.insertLast({\n name: 'balance',\n method: async (dummy: void, next: MiddlewareCallback<void, void>) => {\n // When starting up, check if we need to pre-fund / settle\n // tslint:disable-next-line:no-floating-promises\n this.maybeSettle(accountId)\n\n this.stats.balance.setValue(account, {}, balance.getValue().toNumber())\n return next(dummy)\n }\n })\n\n pipelines.incomingData.insertLast({\n name: 'balance',\n method: async (data: Buffer, next: MiddlewareCallback<Buffer, Buffer>) => {\n if (data[0] === IlpPacket.Type.TYPE_ILP_PREPARE) {\n const parsedPacket = IlpPacket.deserializeIlpPrepare(data)\n\n // Ignore zero amount packets\n if (parsedPacket.amount === '0') {\n return next(data)\n }\n\n // Increase balance on prepare\n balance.add(parsedPacket.amount)\n log.trace('balance increased due to incoming ilp prepare. accountId=%s amount=%s newBalance=%s', accountId, parsedPacket.amount, balance.getValue())\n this.stats.balance.setValue(account, {}, balance.getValue().toNumber())\n\n let result\n try {\n result = await next(data)\n } catch (err) {\n // Refund on error\n balance.subtract(parsedPacket.amount)\n log.debug('incoming packet refunded due to error. accountId=%s amount=%s newBalance=%s', accountId, parsedPacket.amount, balance.getValue())\n this.stats.balance.setValue(account, {}, balance.getValue().toNumber())\n this.stats.incomingDataPacketValue.increment(account, { result : 'failed' }, +parsedPacket.amount)\n throw err\n }\n\n if (result[0] === IlpPacket.Type.TYPE_ILP_REJECT) {\n // Refund on reject\n balance.subtract(parsedPacket.amount)\n log.debug('incoming packet refunded due to ilp reject. accountId=%s amount=%s newBalance=%s', accountId, parsedPacket.amount, balance.getValue())\n this.stats.balance.setValue(account, {}, balance.getValue().toNumber())\n this.stats.incomingDataPacketValue.increment(account, { result : 'rejected' }, +parsedPacket.amount)\n } else if (result[0] === IlpPacket.Type.TYPE_ILP_FULFILL) {\n this.maybeSettle(accountId).catch(log.error)\n this.stats.incomingDataPacketValue.increment(account, { result : 'fulfilled' }, +parsedPacket.amount)\n }\n\n return result\n } else {\n return next(data)\n }\n }\n })\n\n pipelines.incomingMoney.insertLast({\n name: 'balance',\n method: async (amount: string, next: MiddlewareCallback<string, void>) => {\n balance.subtract(amount)\n log.trace('balance reduced due to incoming settlement. accountId=%s amount=%s newBalance=%s', accountId, amount, balance.getValue())\n this.stats.balance.setValue(account, {}, balance.getValue().toNumber())\n return next(amount)\n }\n })\n\n pipelines.outgoingData.insertLast({\n name: 'balance',\n method: async (data: Buffer, next: MiddlewareCallback<Buffer, Buffer>) => {\n if (data[0] === IlpPacket.Type.TYPE_ILP_PREPARE) {\n const parsedPacket = IlpPacket.deserializeIlpPrepare(data)\n\n // Ignore zero amount packets\n if (parsedPacket.amount === '0') {\n return next(data)\n }\n\n // We do nothing here (i.e. unlike for incoming packets) and wait until the packet is fulfilled\n // This means we always take the most conservative view of our balance with the upstream peer\n let result\n try {\n result = await next(data)\n } catch (err) {\n log.debug('outgoing packet not applied due to error. accountId=%s amount=%s newBalance=%s', accountId, parsedPacket.amount, balance.getValue())\n this.stats.outgoingDataPacketValue.increment(account, { result : 'failed' }, +parsedPacket.amount)\n throw err\n }\n\n if (result[0] === IlpPacket.Type.TYPE_ILP_REJECT) {\n log.debug('outgoing packet not applied due to ilp reject. accountId=%s amount=%s newBalance=%s', accountId, parsedPacket.amount, balance.getValue())\n this.stats.outgoingDataPacketValue.increment(account, { result : 'rejected' }, +parsedPacket.amount)\n } else if (result[0] === IlpPacket.Type.TYPE_ILP_FULFILL) {\n // Decrease balance on prepare\n balance.subtract(parsedPacket.amount)\n this.maybeSettle(accountId).catch(log.error)\n log.trace('balance decreased due to outgoing ilp fulfill. accountId=%s amount=%s newBalance=%s', accountId, parsedPacket.amount, balance.getValue())\n this.stats.balance.setValue(account, {}, balance.getValue().toNumber())\n this.stats.outgoingDataPacketValue.increment(account, { result : 'fulfilled' }, +parsedPacket.amount)\n }\n\n return result\n } else {\n return next(data)\n }\n }\n })\n\n pipelines.outgoingMoney.insertLast({\n name: 'balance',\n method: async (amount: string, next: MiddlewareCallback<string, void>) => {\n balance.add(amount)\n log.trace('balance increased due to outgoing settlement. accountId=%s amount=%s newBalance=%s', accountId, amount, balance.getValue())\n this.stats.balance.setValue(account, {}, balance.getValue().toNumber())\n\n return next(amount)\n }\n })\n } else {\n log.warn('(!!!) balance middleware NOT enabled for account, this account can spend UNLIMITED funds. accountId=%s', accountId)\n }\n }\n\n getStatus () {\n const accounts = {}\n this.balances.forEach((balance, accountId) => {\n accounts[accountId] = balance.toJSON()\n })\n return { accounts }\n }\n\n modifyBalance (accountId: string, _amountDiff: BigNumber.Value): BigNumber {\n const accountInfo = this.getInfo(accountId)\n if (!accountInfo) {\n throw new Error('could not load info for account. accountId=' + accountId)\n }\n const account = { accountId, accountInfo }\n const amountDiff = new BigNumber(_amountDiff)\n const balance = this.getBalance(accountId)\n log.warn('modifying balance accountId=%s amount=%s', accountId, amountDiff.toString())\n if (amountDiff.isPositive()) {\n balance.add(amountDiff)\n } else {\n balance.subtract(amountDiff.negated())\n this.maybeSettle(accountId).catch(log.error)\n }\n this.stats.balance.setValue(account, {}, balance.getValue().toNumber())\n return balance.getValue()\n }\n\n private getBalance (accountId: string): Balance {\n const balance = this.balances.get(accountId)\n if (!balance) {\n throw new Error('account not found. accountId=' + accountId)\n }\n return balance\n }\n\n private async maybeSettle (accountId: string): Promise<void> {\n const accountInfo = this.getInfo(accountId)\n const { settleThreshold, settleTo = '0' } = accountInfo.balance!\n const bnSettleThreshold = settleThreshold ? new BigNumber(settleThreshold) : undefined\n const bnSettleTo = new BigNumber(settleTo)\n const balance = this.getBalance(accountId)\n\n const settle = bnSettleThreshold && bnSettleThreshold.gt(balance.getValue())\n if (!settle) return\n\n const settleAmount = bnSettleTo.minus(balance.getValue())\n log.debug('settlement triggered. accountId=%s balance=%s settleAmount=%s', accountId, balance.getValue(), settleAmount)\n\n await this.sendMoney(settleAmount.toString(), accountId)\n .catch(e => {\n let err = e\n if (!err || typeof err !== 'object') {\n err = new Error('Non-object thrown: ' + e)\n }\n log.error('error occurred during settlement. accountId=%s settleAmount=%s errInfo=%s', accountId, settleAmount, err.stack ? err.stack : err)\n })\n }\n}\n"]}
\No newline at end of file