add more db fields for fixed fee
This commit is contained in:
parent
8ecc8ce510
commit
8cdad0bc15
10 changed files with 74 additions and 65 deletions
|
|
@ -45,7 +45,7 @@
|
|||
"cashInCommission",
|
||||
"cashOutCommission",
|
||||
"cashInFee",
|
||||
"cashOutFee"
|
||||
"minimumTx"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -131,9 +131,9 @@
|
|||
},
|
||||
{
|
||||
"code": "cashInFee",
|
||||
"displayTop": "Fixed Fees",
|
||||
"displayTop": "Cash-in",
|
||||
"displayBottom": "Fixed Fee",
|
||||
"displayTopCount": 2,
|
||||
"displayBottom": "Cash-in",
|
||||
"fieldType": "integer",
|
||||
"fieldClass": "fiat",
|
||||
"cryptoScope": "both",
|
||||
|
|
@ -150,8 +150,8 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"code": "cashOutFee",
|
||||
"displayBottom": "Cash-out",
|
||||
"code": "minimumTx",
|
||||
"displayBottom": "Minimum Tx",
|
||||
"displayTopCount": 0,
|
||||
"fieldType": "integer",
|
||||
"fieldClass": "fiat",
|
||||
|
|
@ -159,7 +159,6 @@
|
|||
"machineScope": "both",
|
||||
"default": 0,
|
||||
"enabledIf": [
|
||||
"cashOutEnabled"
|
||||
],
|
||||
"fieldValidation": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3,4 +3,8 @@ const BigNumber = require('bignumber.js')
|
|||
BigNumber.config({ROUNDING_MODE: BigNumber.ROUND_HALF_EVEN})
|
||||
|
||||
function BN (s, radix) { return new BigNumber(s, radix) }
|
||||
|
||||
BN.min = BigNumber.min
|
||||
BN.max = BigNumber.max
|
||||
|
||||
module.exports = BN
|
||||
|
|
|
|||
|
|
@ -5,8 +5,6 @@ const BN = require('./bn')
|
|||
const plugins = require('./plugins')
|
||||
const logger = require('./logger')
|
||||
|
||||
const mapValuesWithKey = _.mapValues.convert({cap: false})
|
||||
|
||||
module.exports = {post, monitorPending}
|
||||
|
||||
const PENDING_INTERVAL = '1 day'
|
||||
|
|
@ -84,12 +82,10 @@ function ensureRatchet (oldField, newField, fieldKey) {
|
|||
return true
|
||||
}
|
||||
|
||||
if (oldField.isBigNumber && newField.isBigNumber) return BN(oldField).eq(newField)
|
||||
if (oldField.toString() === newField.toString()) return true
|
||||
|
||||
logger.error('This field [%s] should never change', fieldKey)
|
||||
logger.error('oldField: %j', oldField)
|
||||
logger.error('newField: %j', newField)
|
||||
throw new Error(`This field [${fieldKey}] should never change`)
|
||||
return false
|
||||
}
|
||||
|
||||
function diff (oldTx, newTx) {
|
||||
|
|
@ -108,7 +104,7 @@ function diff (oldTx, newTx) {
|
|||
logger.warn('Value from lamassu-machine would violate ratchet [%s]', fieldKey)
|
||||
logger.warn('Old tx: %j', oldTx)
|
||||
logger.warn('New tx: %j', newTx)
|
||||
return
|
||||
throw new Error('Value from lamassu-machine would violate ratchet')
|
||||
}
|
||||
|
||||
updatedTx[fieldKey] = newField
|
||||
|
|
@ -125,7 +121,7 @@ function toObj (row) {
|
|||
|
||||
keys.forEach(key => {
|
||||
const objKey = _.camelCase(key)
|
||||
if (key === 'crypto_atoms' || key === 'fiat') {
|
||||
if (key === 'crypto_atoms' || key === 'fiat' || key === 'cash_in_fee') {
|
||||
newObj[objKey] = BN(row[key])
|
||||
return
|
||||
}
|
||||
|
|
@ -144,15 +140,11 @@ function toObj (row) {
|
|||
}
|
||||
|
||||
function convertBigNumFields (obj) {
|
||||
const convert = (value, key) => _.includes(key, ['cryptoAtoms', 'fiat'])
|
||||
const convert = value => value && value.isBigNumber
|
||||
? value.toString()
|
||||
: value
|
||||
|
||||
const convertKey = key => _.includes(key, ['cryptoAtoms', 'fiat'])
|
||||
? key + '#'
|
||||
: key
|
||||
|
||||
return _.mapKeys(convertKey, mapValuesWithKey(convert, obj))
|
||||
return _.mapValues(convert, obj)
|
||||
}
|
||||
|
||||
function pullNewBills (billRows, machineTx) {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ const _ = require('lodash/fp')
|
|||
|
||||
const db = require('./db')
|
||||
const configManager = require('./config-manager')
|
||||
const logger = require('./logger')
|
||||
const schema = require('../lamassu-schema.json')
|
||||
|
||||
function allScopes (cryptoScopes, machineScopes) {
|
||||
|
|
@ -122,7 +123,10 @@ function ensureConstraints (config) {
|
|||
config.every(fieldInstance => {
|
||||
const fieldCode = fieldInstance.fieldLocator.code
|
||||
const field = pickField(fieldCode)
|
||||
if (!field) throw new Error('No such field: ' + fieldCode)
|
||||
if (!field) {
|
||||
logger.error('No such field: %s, %j', fieldCode, fieldInstance.fieldLocator.fieldScope)
|
||||
throw new Error('No such field: ' + fieldCode)
|
||||
}
|
||||
|
||||
const fieldValue = fieldInstance.fieldValue
|
||||
|
||||
|
|
|
|||
|
|
@ -165,6 +165,19 @@ function plugins (settings, deviceId) {
|
|||
.then(row => row.id)
|
||||
}
|
||||
|
||||
function mapCoinSettings (coin) {
|
||||
const config = configManager.scoped(coin, deviceId, settings.config)
|
||||
const minimumTx = BN(config.minimumTx)
|
||||
const cashInFee = BN(config.cashInFee)
|
||||
|
||||
const coinSettings = {
|
||||
minimumTx: BN.max(minimumTx, cashInFee),
|
||||
cashInFee: cashInFee
|
||||
}
|
||||
|
||||
return [coin, coinSettings]
|
||||
}
|
||||
|
||||
function pollQueries (serialNumber, deviceTime, deviceRec) {
|
||||
const config = configManager.machineScoped(deviceId, settings.config)
|
||||
const fiatCode = config.fiatCurrency
|
||||
|
|
@ -184,7 +197,7 @@ function plugins (settings, deviceId) {
|
|||
return Promise.all(promises)
|
||||
.then(arr => {
|
||||
const cassettes = arr[0]
|
||||
const currentConfigVersion = arr[2]
|
||||
const configVersion = arr[2]
|
||||
const tickers = arr.slice(3, cryptoCodes.length + 3)
|
||||
const balances = arr.slice(cryptoCodes.length + 3)
|
||||
|
||||
|
|
@ -192,7 +205,8 @@ function plugins (settings, deviceId) {
|
|||
cassettes,
|
||||
rates: buildRates(tickers),
|
||||
balances: buildBalances(balances),
|
||||
currentConfigVersion
|
||||
coinSettings: _.fromPairs(_.map(mapCoinSettings, cryptoCodes)),
|
||||
configVersion
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,18 +63,14 @@ function poll (req, res, next) {
|
|||
twoWayMode: config.cashOutEnabled,
|
||||
zeroConfLimit: config.zeroConfLimit,
|
||||
fiatTxLimit: config.cashOutTransactionLimit,
|
||||
reboot,
|
||||
rates: results.rates,
|
||||
balances: results.balances,
|
||||
coins: config.cryptoCurrencies,
|
||||
configVersion: results.currentConfigVersion
|
||||
reboot
|
||||
}
|
||||
|
||||
if (response.idVerificationEnabled) {
|
||||
response.idVerificationLimit = config.idVerificationLimit
|
||||
}
|
||||
|
||||
return res.json(response)
|
||||
return res.json(_.assign(response, results))
|
||||
})
|
||||
.catch(next)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -131,9 +131,12 @@ function settings () {
|
|||
return settingsCache
|
||||
}
|
||||
|
||||
const pp = require('./pp')
|
||||
function save (config) {
|
||||
const sql = 'insert into user_config (type, data, valid) values ($1, $2, $3)'
|
||||
|
||||
console.log(pp('DEBUG101')(config))
|
||||
|
||||
return configValidate.validate(config)
|
||||
.then(() => db.none(sql, ['config', {config}, true]))
|
||||
.catch(() => db.none(sql, ['config', {config}, false]))
|
||||
|
|
|
|||
10
lib/tx.js
10
lib/tx.js
|
|
@ -21,7 +21,15 @@ function massage (tx) {
|
|||
const transformDate = (v, k) => isDateField(k) ? new Date(v) : v
|
||||
const mapValuesWithKey = _.mapValues.convert({'cap': false})
|
||||
const transformDates = r => mapValuesWithKey(transformDate, r)
|
||||
const mapBN = r => _.assign(r, {cryptoAtoms: BN(r.cryptoAtoms), fiat: BN(r.fiat)})
|
||||
|
||||
const mapBN = r => {
|
||||
const update = r.direction === 'cashIn'
|
||||
? {cryptoAtoms: BN(r.cryptoAtoms), fiat: BN(r.fiat), cashInFee: BN(r.cashInFee)}
|
||||
: {cryptoAtoms: BN(r.cryptoAtoms), fiat: BN(r.fiat)}
|
||||
|
||||
return _.assign(r, update)
|
||||
}
|
||||
|
||||
const mapper = _.flow(transformDates, mapBN, _.unset('dirty'))
|
||||
|
||||
return mapper(tx)
|
||||
|
|
|
|||
17
migrations/033-add_cash_in_fee.js
Normal file
17
migrations/033-add_cash_in_fee.js
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
var db = require('./db')
|
||||
|
||||
exports.up = function (next) {
|
||||
var sql = [
|
||||
'alter table cash_in_txs add column cash_in_fee numeric(14, 5) not null',
|
||||
'alter table cash_in_txs add column cash_in_fee_crypto bigint not null',
|
||||
'alter table cash_in_txs add column minimum_tx integer not null',
|
||||
'alter table bills add column cash_in_fee numeric(14, 5) not null',
|
||||
'alter table bills add column cash_in_fee_crypto bigint not null',
|
||||
'alter table bills add column crypto_atoms_after_fee bigint not null'
|
||||
]
|
||||
db.multi(sql, next)
|
||||
}
|
||||
|
||||
exports.down = function (next) {
|
||||
next()
|
||||
}
|
||||
|
|
@ -1,40 +1,12 @@
|
|||
'use strict'
|
||||
const settingsLoader = require('../lib/settings-loader')
|
||||
|
||||
const R = require('ramda')
|
||||
const db = require('../db')
|
||||
const fields = [
|
||||
settingsLoader.configDeleteField({crypto: 'global', machine: 'global'}, 'cashOutFee'),
|
||||
settingsLoader.configDeleteField({crypto: 'global', machine: 'global'}, 'minTx')
|
||||
]
|
||||
|
||||
function pp (o) {
|
||||
console.log(require('util').inspect(o, {depth: null, colors: true}))
|
||||
}
|
||||
|
||||
function dbFetchConfig () {
|
||||
return db.oneOrNone('select data from user_config where type=$1', ['config'])
|
||||
.then(row => row && row.data)
|
||||
}
|
||||
|
||||
dbFetchConfig()
|
||||
.then(c => {
|
||||
const groups = c.groups
|
||||
.filter(g => g.code !== 'fiat')
|
||||
.map(g => {
|
||||
if (g.code === 'currencies') {
|
||||
const values = g.values.filter(v => v.fieldLocator.code !== 'cryptoCurrencies')
|
||||
return R.assoc('values', values, g)
|
||||
}
|
||||
|
||||
return g
|
||||
})
|
||||
|
||||
return {groups: groups}
|
||||
})
|
||||
.then(config => {
|
||||
pp(config)
|
||||
return db.none('update user_config set data=$1 where type=$2', [config, 'config'])
|
||||
})
|
||||
settingsLoader.modifyConfig(fields)
|
||||
.then(() => {
|
||||
console.log('success.')
|
||||
process.exit(0)
|
||||
})
|
||||
.catch(e => {
|
||||
console.log(e)
|
||||
process.exit(1)
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue