Feat: compliance blacklisted addresses notifications
This commit is contained in:
parent
3b3bdf839b
commit
204e421b3d
9 changed files with 55 additions and 21 deletions
|
|
@ -8,6 +8,7 @@ const plugins = require('../plugins')
|
|||
const logger = require('../logger')
|
||||
const settingsLoader = require('../new-settings-loader')
|
||||
const configManager = require('../new-config-manager')
|
||||
const notifier = require("../notifier/index")
|
||||
|
||||
const cashInAtomic = require('./cash-in-atomic')
|
||||
const cashInLow = require('./cash-in-low')
|
||||
|
|
@ -30,10 +31,11 @@ function post (machineTx, pi) {
|
|||
|
||||
if (_.some(it => it.created_by_operator === true)(blacklistItems)) {
|
||||
blacklisted = true
|
||||
notifier.addBlacklistNotification(r.tx, false)
|
||||
} else if (_.some(it => it.created_by_operator === false)(blacklistItems) && rejectAddressReuseActive) {
|
||||
notifier.addBlacklistNotification(r.tx, true)
|
||||
addressReuse = true
|
||||
}
|
||||
|
||||
return postProcess(r, pi, blacklisted, addressReuse)
|
||||
})
|
||||
.then(changes => cashInLow.update(db, updatedTx, changes))
|
||||
|
|
|
|||
|
|
@ -44,6 +44,18 @@ const configSql = 'insert into user_config (type, data, valid, schema_version) v
|
|||
function saveConfig (config) {
|
||||
return loadLatestConfigOrNone()
|
||||
.then(currentConfig => {
|
||||
if(config.notifications_cryptoHighBalance || config.notifications_cryptoLowBalance) {
|
||||
clearCryptoBalanceNotifications(currentConfig, config, false)
|
||||
}
|
||||
if(config.notifications_cryptoBalanceOverrides) {
|
||||
clearCryptoBalanceNotifications(currentConfig.notifications_cryptoBalanceOverrides, config.notifications_cryptoBalanceOverrides, true)
|
||||
}
|
||||
if(config.notifications_fiatBalanceCassette1 || config.notifications_fiatBalanceCassette2) {
|
||||
clearCassetteNotifications(currentConfig, config, false)
|
||||
}
|
||||
if(config.notifications_fiatBalanceOverrides) {
|
||||
clearCassetteNotifications(currentConfig.notifications_fiatBalanceOverrides, config.notifications_fiatBalanceOverrides, true)
|
||||
}
|
||||
const newConfig = _.assign(currentConfig, config)
|
||||
return db.none(configSql, ['config', { config: newConfig }, true, NEW_SETTINGS_LOADER_SCHEMA_VERSION])
|
||||
})
|
||||
|
|
|
|||
|
|
@ -363,11 +363,26 @@ const errorAlertsNotify = (alertRec) => {
|
|||
}, alerts)
|
||||
}
|
||||
|
||||
const addBlacklistNotification = (tx, isAddressReuse) => {
|
||||
let detail = ''
|
||||
let message = ''
|
||||
if(isAddressReuse) {
|
||||
detail = `${tx.cryptoCode}_REUSED_${tx.toAddress}`
|
||||
message = `Blocked address reuse: ${tx.cryptoCode} ${tx.toAddress.substr(0,10)}...`
|
||||
} else {
|
||||
detail = `${tx.cryptoCode}_BLOCKED_${tx.toAddress}`
|
||||
message = `Blocked blacklisted address: ${tx.cryptoCode} ${tx.toAddress.substr(0,10)}...`
|
||||
}
|
||||
|
||||
queries.addComplianceNotification(tx.deviceId, detail, message)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
transactionNotify,
|
||||
checkNotification,
|
||||
checkPings,
|
||||
checkStuckScreen,
|
||||
sendRedemptionMessage,
|
||||
cashCassettesNotify
|
||||
cashCassettesNotify,
|
||||
addBlacklistNotification
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,6 +60,11 @@ const invalidateNotification = (id) => {
|
|||
return db.none(sql, [id])
|
||||
}
|
||||
|
||||
const addComplianceNotification = (deviceId, detail, message) => {
|
||||
const sql = `INSERT INTO notifications (id, type, detail, device_id, message, created) values ($1, 'compliance', $2, $3, $4, CURRENT_TIMESTAMP)`
|
||||
return db.oneOrNone(sql, [uuidv4(), detail, deviceId, message])
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
machineEvents: dbm.machineEvents,
|
||||
addHighValueTx,
|
||||
|
|
@ -70,4 +75,5 @@ module.exports = {
|
|||
getAllValidNotifications,
|
||||
getValidNotifications,
|
||||
invalidateNotification,
|
||||
addComplianceNotification
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,11 +134,7 @@ const Blacklist = () => {
|
|||
return (
|
||||
<>
|
||||
<TitleSection title="Blacklisted addresses">
|
||||
<div>
|
||||
<Link onClick={() => setShowModal(true)}>
|
||||
Blacklist new addresses
|
||||
</Link>
|
||||
</div>
|
||||
<Link onClick={() => setShowModal(true)}>Blacklist new addresses</Link>
|
||||
</TitleSection>
|
||||
<Grid container className={classes.grid}>
|
||||
<Sidebar
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import {
|
|||
TransactionsList,
|
||||
ComplianceDetails
|
||||
} from './components'
|
||||
import { getFormattedPhone, getName } from './helper'
|
||||
import { /* getFormattedPhone, */ getName } from './helper'
|
||||
|
||||
const useStyles = makeStyles(styles)
|
||||
|
||||
|
|
@ -147,12 +147,13 @@ const CustomerProfile = memo(() => {
|
|||
Customers
|
||||
</Label1>
|
||||
<Label2 noMargin className={classes.labelLink}>
|
||||
{name.length
|
||||
{name.length ? name : R.path(['phone'])(customerData)}
|
||||
{/* {name.length
|
||||
? name
|
||||
: getFormattedPhone(
|
||||
R.path(['phone'])(customerData),
|
||||
locale.country
|
||||
)}
|
||||
)} */}
|
||||
</Label2>
|
||||
</Breadcrumbs>
|
||||
<div>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,11 @@ import { ReactComponent as TxOutIcon } from 'src/styling/icons/direction/cash-ou
|
|||
import { ifNotNull } from 'src/utils/nullCheck'
|
||||
|
||||
import styles from './CustomersList.styles'
|
||||
import { getAuthorizedStatus, getFormattedPhone, getName } from './helper'
|
||||
import {
|
||||
getAuthorizedStatus,
|
||||
getName
|
||||
/* getFormattedPhone */
|
||||
} from './helper'
|
||||
|
||||
const useStyles = makeStyles(styles)
|
||||
|
||||
|
|
@ -22,7 +26,7 @@ const CustomersList = ({ data, locale, onClick, loading }) => {
|
|||
{
|
||||
header: 'Phone',
|
||||
width: 172,
|
||||
view: it => getFormattedPhone(it.phone, locale.country)
|
||||
view: it => it.phone // getFormattedPhone(it.phone, locale.country)
|
||||
},
|
||||
{
|
||||
header: 'Name',
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import { ReactComponent as LawIconInverse } from 'src/styling/icons/circle butto
|
|||
import { ReactComponent as LawIcon } from 'src/styling/icons/circle buttons/law/zodiac.svg'
|
||||
|
||||
import mainStyles from '../CustomersList.styles'
|
||||
import { getFormattedPhone, getName } from '../helper'
|
||||
import { /* getFormattedPhone, */ getName } from '../helper'
|
||||
|
||||
import FrontCameraPhoto from './FrontCameraPhoto'
|
||||
|
||||
|
|
@ -22,7 +22,7 @@ const CustomerDetails = memo(({ customer, locale, setShowCompliance }) => {
|
|||
{
|
||||
header: 'Phone number',
|
||||
size: 172,
|
||||
value: getFormattedPhone(customer.phone, locale.country)
|
||||
value: customer.phone // getFormattedPhone(customer.phone, locale.country)
|
||||
},
|
||||
{
|
||||
header: 'ID number',
|
||||
|
|
@ -47,9 +47,8 @@ const CustomerDetails = memo(({ customer, locale, setShowCompliance }) => {
|
|||
<div className={classes.name}>
|
||||
<IdIcon className={classes.idIcon} />
|
||||
<H2 noMargin>
|
||||
{name.length
|
||||
? name
|
||||
: getFormattedPhone(R.path(['phone'])(customer), locale.country)}
|
||||
{name.length ? name : R.path(['phone'])(customer)}
|
||||
{/* getFormattedPhone(R.path(['phone'])(customer), locale.country)} */}
|
||||
</H2>
|
||||
<SubpageButton
|
||||
className={classes.subpageButton}
|
||||
|
|
|
|||
|
|
@ -11,10 +11,9 @@ const getAuthorizedStatus = it =>
|
|||
: { label: 'Authorized', type: 'success' }
|
||||
|
||||
const getFormattedPhone = (phone, country) => {
|
||||
const phoneNumber =
|
||||
phone && country ? parsePhoneNumberFromString(phone, country) : null
|
||||
|
||||
return phoneNumber ? phoneNumber.formatInternational() : phone
|
||||
return phone && country
|
||||
? parsePhoneNumberFromString(phone, country).formatInternational()
|
||||
: ''
|
||||
}
|
||||
|
||||
const getName = it => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue