@@ -21,10 +21,13 @@ const {
21
21
Logger,
22
22
} = require ( 'lisk-service-framework' ) ;
23
23
24
+ const regex = require ( '../regex' ) ;
24
25
const config = require ( '../../config' ) ;
26
+ const accountBalancesTableSchema = require ( '../database/schema/accountBalances' ) ;
27
+
25
28
const { MODULE } = require ( '../constants' ) ;
26
29
const { getTokenBalances } = require ( '../dataService' ) ;
27
- const accountBalancesTableSchema = require ( '../database/schema/accountBalances ' ) ;
30
+ const { getPosTokenID } = require ( '../dataService/business/pos/constants ' ) ;
28
31
29
32
const logger = Logger ( ) ;
30
33
@@ -34,9 +37,10 @@ const MYSQL_ENDPOINT = config.endpoints.mysql;
34
37
35
38
const getAccountBalancesTable = ( ) => getTableInstance ( accountBalancesTableSchema , MYSQL_ENDPOINT ) ;
36
39
37
- const updateAccountBalances = async address => {
40
+ const updateAccountBalances = async addressTokenID => {
38
41
const accountBalancesTable = await getAccountBalancesTable ( ) ;
39
- const { data : balanceInfos } = await getTokenBalances ( { address } ) ;
42
+ const [ address , cTokenID ] = addressTokenID . split ( '_' ) ;
43
+ const { data : balanceInfos } = await getTokenBalances ( { address, tokenID : cTokenID } ) ;
40
44
41
45
const updatedTokenBalances = balanceInfos . map ( balanceInfo => {
42
46
const { tokenID, availableBalance, lockedBalances } = balanceInfo ;
@@ -56,14 +60,20 @@ const updateAccountBalances = async address => {
56
60
await accountBalancesTable . upsert ( updatedTokenBalances ) ;
57
61
} ;
58
62
59
- const scheduleAddressesBalanceUpdate = async addresses => {
60
- if ( addresses . length ) {
61
- redis . sadd ( config . set . accountBalanceUpdate . name , addresses ) ;
63
+ const scheduleAddressesBalanceUpdate = async addressTokens => {
64
+ if ( addressTokens . length ) {
65
+ addressTokens . forEach ( addressToken => {
66
+ if ( ! regex . ADDRESS_LISK32_TOKEN_ID . test ( addressToken ) ) {
67
+ throw new Error ( `Invalid address tokenID format: ${ addressToken } ` ) ;
68
+ }
69
+ } ) ;
70
+
71
+ redis . sadd ( config . set . accountBalanceUpdate . name , addressTokens ) ;
62
72
}
63
73
} ;
64
74
65
- const getAddressesFromTokenEvents = events => {
66
- const addressesToUpdate = [ ] ;
75
+ const getAddressesFromTokenEvents = async events => {
76
+ const addressTokensToUpdate = [ ] ;
67
77
const tokenModuleEvents = events . filter ( event => event . module === MODULE . TOKEN ) ;
68
78
69
79
// eslint-disable-next-line no-restricted-syntax
@@ -74,33 +84,37 @@ const getAddressesFromTokenEvents = events => {
74
84
for ( const key of eventDataKeys ) {
75
85
if ( key . toLowerCase ( ) . includes ( 'address' ) ) {
76
86
const address = eventData [ key ] ;
77
- addressesToUpdate . push ( address ) ;
87
+ const tokenID = eventData . tokenID || eventData . messageFeeTokenID || ( await getPosTokenID ( ) ) ;
88
+ addressTokensToUpdate . push ( `${ address } _${ tokenID } ` ) ;
78
89
}
79
90
}
80
91
}
81
92
82
- return addressesToUpdate ;
93
+ return addressTokensToUpdate ;
83
94
} ;
84
95
85
96
const triggerAccountsBalanceUpdate = async ( ) => {
86
- const addresses = await redis . spop (
97
+ const addressTokenEntries = await redis . spop (
87
98
config . set . accountBalanceUpdate . name ,
88
99
config . set . accountBalanceUpdate . batchSize ,
89
100
) ;
90
101
91
- const numAddressesScheduled = addresses . length ;
102
+ const numAddressesScheduled = addressTokenEntries . length ;
92
103
try {
93
104
// eslint-disable-next-line no-restricted-syntax
94
- while ( addresses . length ) {
95
- const address = addresses . shift ( ) ;
96
- await updateAccountBalances ( address ) ;
105
+ while ( addressTokenEntries . length ) {
106
+ const addressToken = addressTokenEntries . shift ( ) ;
107
+ await updateAccountBalances ( addressToken ) . catch ( err => {
108
+ addressTokenEntries . push ( addressToken ) ;
109
+ throw err ;
110
+ } ) ;
97
111
}
98
112
logger . info ( `Successfully updated account balances for ${ numAddressesScheduled } account(s).` ) ;
99
113
} catch ( err ) {
100
114
// Reschedule accounts balance update on error for remaining addresses
101
- await scheduleAddressesBalanceUpdate ( addresses ) ;
115
+ await scheduleAddressesBalanceUpdate ( addressTokenEntries ) ;
102
116
103
- const numPending = addresses . length ;
117
+ const numPending = addressTokenEntries . length ;
104
118
const numSuccess = numAddressesScheduled - numPending ;
105
119
logger . info (
106
120
`Successfully updated account balances for ${ numSuccess } account(s). Rescheduling updates for ${ numPending } account(s).` ,
0 commit comments