Skip to content

Commit ef307aa

Browse files
sizing up banks
1 parent 8d2b02b commit ef307aa

File tree

8 files changed

+123
-132
lines changed

8 files changed

+123
-132
lines changed

src/flamenco/runtime/context/fd_exec_slot_ctx.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,21 @@ fd_exec_slot_ctx_recover( fd_exec_slot_ctx_t * slot_ctx,
300300
fd_bank_next_epoch_stakes_end_locking_modify( slot_ctx->bank );
301301

302302

303+
/* Copy the vote states for the previous epoch E-2 */
304+
305+
fd_vote_states_t * vote_states_prev_prev = fd_vote_states_join( fd_vote_states_new( fd_bank_vote_states_prev_prev_locking_modify( slot_ctx->bank ), FD_RUNTIME_MAX_VOTE_ACCOUNTS ) );
306+
for( fd_vote_accounts_pair_global_t_mapnode_t * n = fd_vote_accounts_pair_global_t_map_minimum( vote_accounts_curr_stakes_pool, vote_accounts_curr_stakes_root );
307+
n;
308+
n = fd_vote_accounts_pair_global_t_map_successor( vote_accounts_curr_stakes_pool, n ) ) {
309+
uchar * account_data = fd_solana_account_data_join( &n->elem.value );
310+
ulong account_data_len = n->elem.value.data_len;
311+
fd_vote_states_update_from_account( vote_states_prev_prev, &n->elem.key, account_data, account_data_len );
312+
fd_vote_states_update_stake( vote_states_prev_prev, &n->elem.key, n->elem.stake );
313+
}
314+
fd_bank_vote_states_prev_prev_end_locking_modify( slot_ctx->bank );
315+
316+
/* Copy the vote states for the previous epoch E-1 */
317+
303318
fd_vote_states_t * vote_states_prev = fd_vote_states_join( fd_vote_states_new( fd_bank_vote_states_prev_locking_modify( slot_ctx->bank ), FD_RUNTIME_MAX_VOTE_ACCOUNTS ) );
304319
for( fd_vote_accounts_pair_global_t_mapnode_t * n = fd_vote_accounts_pair_global_t_map_minimum( pool, root );
305320
n;
@@ -316,7 +331,6 @@ fd_exec_slot_ctx_recover( fd_exec_slot_ctx_t * slot_ctx,
316331

317332
fd_bank_vote_states_prev_end_locking_modify( slot_ctx->bank );
318333

319-
320334
/* Copy the vote states for the current epoch E */
321335

322336
fd_vote_states_t * vote_states = fd_vote_states_join( fd_vote_states_new( fd_bank_vote_states_locking_modify( slot_ctx->bank ), FD_RUNTIME_MAX_VOTE_ACCOUNTS ) );

src/flamenco/runtime/fd_runtime.c

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -129,25 +129,15 @@ fd_runtime_update_leaders( fd_bank_t * bank,
129129

130130
fd_epoch_schedule_t const * epoch_schedule = fd_bank_epoch_schedule_query( bank );
131131

132-
fd_vote_accounts_global_t const * epoch_vaccs = fd_bank_epoch_stakes_locking_query( bank );
133-
fd_vote_accounts_pair_global_t_mapnode_t * vote_acc_pool = fd_vote_accounts_vote_accounts_pool_join( epoch_vaccs );
134-
fd_vote_accounts_pair_global_t_mapnode_t * vote_acc_root = fd_vote_accounts_vote_accounts_root_join( epoch_vaccs );
135-
136132
ulong epoch = fd_slot_to_epoch ( epoch_schedule, slot, NULL );
137133
ulong slot0 = fd_epoch_slot0 ( epoch_schedule, epoch );
138134
ulong slot_cnt = fd_epoch_slot_cnt( epoch_schedule, epoch );
139135

140-
fd_runtime_update_slots_per_epoch( bank, fd_epoch_slot_cnt( epoch_schedule, epoch ) );
141-
142-
ulong vote_acc_cnt = fd_vote_accounts_pair_global_t_map_size( vote_acc_pool, vote_acc_root );
143-
136+
fd_vote_states_t const * vote_states_prev_prev = fd_bank_vote_states_prev_prev_locking_query( bank );
137+
ulong vote_acc_cnt = fd_vote_states_cnt( vote_states_prev_prev ) ;
144138
fd_vote_stake_weight_t * epoch_weights = fd_spad_alloc_check( runtime_spad, alignof(fd_vote_stake_weight_t), vote_acc_cnt * sizeof(fd_vote_stake_weight_t) );
145-
ulong stake_weight_cnt = fd_stake_weights_by_node( epoch_vaccs, epoch_weights );
146-
147-
if( FD_UNLIKELY( stake_weight_cnt == ULONG_MAX ) ) {
148-
FD_LOG_ERR(( "fd_stake_weights_by_node() failed" ));
149-
}
150-
fd_bank_epoch_stakes_end_locking_query( bank );
139+
ulong stake_weight_cnt = fd_stake_weights_by_node_2( vote_states_prev_prev, epoch_weights );
140+
fd_bank_vote_states_prev_prev_end_locking_query( bank );
151141

152142
/* Derive leader schedule */
153143

@@ -164,14 +154,15 @@ fd_runtime_update_leaders( fd_bank_t * bank,
164154

165155
ulong vote_keyed_lsched = (ulong)fd_runtime_should_use_vote_keyed_leader_schedule( bank );
166156
void * epoch_leaders_mem = fd_bank_epoch_leaders_locking_modify( bank );
167-
fd_epoch_leaders_t * leaders = fd_epoch_leaders_join( fd_epoch_leaders_new( epoch_leaders_mem,
168-
epoch,
169-
slot0,
170-
slot_cnt,
171-
stake_weight_cnt,
172-
epoch_weights,
173-
0UL,
174-
vote_keyed_lsched ) );
157+
fd_epoch_leaders_t * leaders = fd_epoch_leaders_join( fd_epoch_leaders_new(
158+
epoch_leaders_mem,
159+
epoch,
160+
slot0,
161+
slot_cnt,
162+
stake_weight_cnt,
163+
epoch_weights,
164+
0UL,
165+
vote_keyed_lsched ) );
175166
fd_bank_epoch_leaders_end_locking_modify( bank );
176167
if( FD_UNLIKELY( !leaders ) ) {
177168
FD_LOG_ERR(( "Unable to init and join fd_epoch_leaders" ));
@@ -1410,6 +1401,13 @@ fd_update_epoch_stakes( fd_exec_slot_ctx_t * slot_ctx ) {
14101401

14111402
fd_bank_next_epoch_stakes_end_locking_query( slot_ctx->bank );
14121403

1404+
/********************************************************************/
1405+
1406+
fd_vote_states_t * vote_states_prev_prev = fd_bank_vote_states_prev_prev_locking_modify( slot_ctx->bank );
1407+
fd_vote_states_t const * vote_states_prev = fd_bank_vote_states_prev_locking_query( slot_ctx->bank );
1408+
fd_memcpy( vote_states_prev_prev, vote_states_prev, fd_bank_vote_states_footprint );
1409+
fd_bank_vote_states_prev_prev_end_locking_modify( slot_ctx->bank );
1410+
fd_bank_vote_states_prev_end_locking_query( slot_ctx->bank );
14131411
}
14141412

14151413
/* Copy stakes->vote_accounts into next_epoch_stakes. */
@@ -1429,6 +1427,14 @@ fd_update_next_epoch_stakes( fd_exec_slot_ctx_t * slot_ctx ) {
14291427
fd_bank_next_epoch_stakes_end_locking_modify( slot_ctx->bank );
14301428

14311429
fd_bank_curr_epoch_stakes_end_locking_query( slot_ctx->bank );
1430+
1431+
/********************************************************************/
1432+
1433+
fd_vote_states_t * vote_states_prev = fd_bank_vote_states_prev_locking_modify( slot_ctx->bank );
1434+
fd_vote_states_t const * vote_states = fd_bank_vote_states_locking_query( slot_ctx->bank );
1435+
fd_memcpy( vote_states_prev, vote_states, fd_bank_vote_states_footprint );
1436+
fd_bank_vote_states_prev_end_locking_modify( slot_ctx->bank );
1437+
fd_bank_vote_states_end_locking_query( slot_ctx->bank );
14321438
}
14331439

14341440
/* Mimics `bank.new_target_program_account()`. Assumes `out_rec` is a modifiable record.

src/flamenco/runtime/sysvar/fd_sysvar_clock.c

Lines changed: 29 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -202,105 +202,43 @@ fd_calculate_stake_weighted_timestamp( fd_exec_slot_ctx_t * slot_ctx,
202202

203203
ulong total_stake = 0;
204204

205-
fd_clock_timestamp_votes_global_t const * clock_timestamp_votes = fd_bank_clock_timestamp_votes_locking_query( bank );
206-
if( FD_UNLIKELY( !clock_timestamp_votes ) ) {
207-
fd_bank_clock_timestamp_votes_end_locking_query( bank );
208-
*result_timestamp = 0;
209-
return;
210-
}
205+
fd_vote_states_t const * vote_states = fd_bank_vote_states_locking_query( bank );
206+
fd_vote_state_ele_t * vote_state_pool = fd_vote_states_get_pool( vote_states );
207+
fd_vote_state_map_t * vote_state_map = fd_vote_states_get_map( vote_states );
211208

212-
fd_clock_timestamp_vote_t_mapnode_t * timestamp_votes_pool = fd_clock_timestamp_votes_votes_pool_join( clock_timestamp_votes );
213-
fd_clock_timestamp_vote_t_mapnode_t * timestamp_votes_root = fd_clock_timestamp_votes_votes_root_join( clock_timestamp_votes );
209+
for( fd_vote_state_map_iter_t iter = fd_vote_state_map_iter_init( vote_state_map, vote_state_pool );
210+
!fd_vote_state_map_iter_done( iter, vote_state_map, vote_state_pool );
211+
iter = fd_vote_state_map_iter_next( iter, vote_state_map, vote_state_pool ) ) {
212+
fd_vote_state_ele_t const * vote_state = fd_vote_state_map_iter_ele_const( iter, vote_state_map, vote_state_pool );
214213

215-
fd_vote_accounts_global_t const * epoch_stakes = fd_bank_epoch_stakes_locking_query( bank );
216-
fd_vote_accounts_pair_global_t_mapnode_t * vote_acc_pool = fd_vote_accounts_vote_accounts_pool_join( epoch_stakes );
217-
fd_vote_accounts_pair_global_t_mapnode_t * vote_acc_root = fd_vote_accounts_vote_accounts_root_join( epoch_stakes );
214+
ulong vote_timestamp = (ulong)vote_state->last_vote_timestamp;
215+
ulong vote_slot = vote_state->last_vote_slot;
218216

219-
for( fd_vote_accounts_pair_global_t_mapnode_t * n = fd_vote_accounts_pair_global_t_map_minimum(vote_acc_pool, vote_acc_root);
220-
n;
221-
n = fd_vote_accounts_pair_global_t_map_successor( vote_acc_pool, n ) ) {
222-
223-
/* get timestamp */
224-
fd_pubkey_t const * vote_pubkey = &n->elem.key;
225-
226-
if( timestamp_votes_pool == NULL ) {
217+
ulong slot_delta = fd_ulong_sat_sub(fd_bank_slot_get( bank ), vote_slot);
218+
fd_epoch_schedule_t const * epoch_schedule = fd_bank_epoch_schedule_query( bank );
219+
if( slot_delta > epoch_schedule->slots_per_epoch ) {
227220
continue;
228-
} else {
229-
fd_clock_timestamp_vote_t_mapnode_t query_vote_acc_node;
230-
query_vote_acc_node.elem.pubkey = *vote_pubkey;
231-
fd_clock_timestamp_vote_t_mapnode_t * vote_acc_node = fd_clock_timestamp_vote_t_map_find( timestamp_votes_pool,
232-
timestamp_votes_root,
233-
&query_vote_acc_node );
234-
ulong vote_timestamp = 0;
235-
ulong vote_slot = 0;
236-
if( vote_acc_node == NULL ) {
237-
int err;
238-
239-
uchar * data = fd_solana_account_data_join( &n->elem.value );
240-
ulong data_len = n->elem.value.data_len;
241-
242-
FD_SPAD_FRAME_BEGIN( spad ) {
243-
fd_vote_state_versioned_t * vsv = fd_bincode_decode_spad(
244-
vote_state_versioned, spad,
245-
data,
246-
data_len,
247-
&err );
248-
if( FD_UNLIKELY( err!=FD_BINCODE_SUCCESS ) ) {
249-
FD_LOG_WARNING(( "Vote state versioned decode failed" ));
250-
continue;
251-
}
252-
253-
switch( vsv->discriminant ) {
254-
case fd_vote_state_versioned_enum_v0_23_5:
255-
vote_timestamp = (ulong)vsv->inner.v0_23_5.last_timestamp.timestamp;
256-
vote_slot = vsv->inner.v0_23_5.last_timestamp.slot;
257-
break;
258-
case fd_vote_state_versioned_enum_v1_14_11:
259-
vote_timestamp = (ulong)vsv->inner.v1_14_11.last_timestamp.timestamp;
260-
vote_slot = vsv->inner.v1_14_11.last_timestamp.slot;
261-
break;
262-
case fd_vote_state_versioned_enum_current:
263-
vote_timestamp = (ulong)vsv->inner.current.last_timestamp.timestamp;
264-
vote_slot = vsv->inner.current.last_timestamp.slot;
265-
break;
266-
default:
267-
__builtin_unreachable();
268-
}
269-
}
270-
FD_SPAD_FRAME_END;
271-
272-
} else {
273-
vote_timestamp = (ulong)vote_acc_node->elem.timestamp;
274-
vote_slot = vote_acc_node->elem.slot;
275-
}
276-
277-
ulong slot_delta = fd_ulong_sat_sub(fd_bank_slot_get( bank ), vote_slot);
278-
fd_epoch_schedule_t const * epoch_schedule = fd_bank_epoch_schedule_query( bank );
279-
if( slot_delta > epoch_schedule->slots_per_epoch ) {
280-
continue;
281-
}
221+
}
282222

283-
ulong offset = fd_ulong_sat_mul(slot_duration, slot_delta);
284-
long estimate = (long)vote_timestamp + (long)(offset / NS_IN_S);
285-
/* get stake */
286-
total_stake += n->elem.stake;
287-
ulong treap_idx = stake_ts_treap_idx_query( treap, estimate, pool );
288-
if ( FD_LIKELY( treap_idx < ULONG_MAX ) ) {
289-
pool[ treap_idx ].stake += n->elem.stake;
290-
} else {
291-
if( 0 == stake_ts_pool_free( pool ) ) {
292-
FD_LOG_ERR(( "stake_ts_pool is empty" ));
293-
}
294-
ulong idx = stake_ts_pool_idx_acquire( pool );
295-
pool[ idx ].prio_cidx = fd_rng_ulong( rng );
296-
pool[ idx ].timestamp = estimate;
297-
pool[ idx ].stake = n->elem.stake;
298-
stake_ts_treap_idx_insert( treap, idx, pool );
223+
ulong offset = fd_ulong_sat_mul(slot_duration, slot_delta);
224+
long estimate = (long)vote_timestamp + (long)(offset / NS_IN_S);
225+
/* get stake */
226+
total_stake += vote_state->stake;
227+
ulong treap_idx = stake_ts_treap_idx_query( treap, estimate, pool );
228+
if ( FD_LIKELY( treap_idx < ULONG_MAX ) ) {
229+
pool[ treap_idx ].stake += vote_state->stake;
230+
} else {
231+
if( 0 == stake_ts_pool_free( pool ) ) {
232+
FD_LOG_ERR(( "stake_ts_pool is empty" ));
299233
}
234+
ulong idx = stake_ts_pool_idx_acquire( pool );
235+
pool[ idx ].prio_cidx = fd_rng_ulong( rng );
236+
pool[ idx ].timestamp = estimate;
237+
pool[ idx ].stake = vote_state->stake;
238+
stake_ts_treap_idx_insert( treap, idx, pool );
300239
}
301240
}
302-
fd_bank_epoch_stakes_end_locking_query( bank );
303-
fd_bank_clock_timestamp_votes_end_locking_query( bank );
241+
fd_bank_vote_states_end_locking_query( bank );
304242

305243
*result_timestamp = 0;
306244
if( total_stake == 0 ) {

src/flamenco/runtime/tests/harness/fd_exec_sol_compat.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ sol_compat_wksp_init( ulong wksp_page_sz ) {
7575
switch( wksp_page_sz )
7676
{
7777
case FD_SHMEM_GIGANTIC_PAGE_SZ:
78-
wksp = fd_wksp_new_anonymous( FD_SHMEM_GIGANTIC_PAGE_SZ, 6UL, fd_shmem_cpu_idx( fd_shmem_numa_idx( cpu_idx ) ), "wksp", 0UL );
78+
wksp = fd_wksp_new_anonymous( FD_SHMEM_GIGANTIC_PAGE_SZ, 7UL, fd_shmem_cpu_idx( fd_shmem_numa_idx( cpu_idx ) ), "wksp", 0UL );
7979
break;
8080
case FD_SHMEM_NORMAL_PAGE_SZ:
81-
wksp = fd_wksp_new_anonymous( FD_SHMEM_NORMAL_PAGE_SZ, 512UL * 512UL * 6UL, fd_shmem_cpu_idx( fd_shmem_numa_idx( cpu_idx ) ), "wksp", 0UL );
81+
wksp = fd_wksp_new_anonymous( FD_SHMEM_NORMAL_PAGE_SZ, 512UL * 512UL * 7UL, fd_shmem_cpu_idx( fd_shmem_numa_idx( cpu_idx ) ), "wksp", 0UL );
8282
break;
8383
default:
8484
FD_LOG_ERR(( "Unsupported page size %lu", wksp_page_sz ));

src/flamenco/stakes/fd_stakes.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,28 @@
66
#include "../runtime/sysvar/fd_sysvar_stake_history.h"
77
#include "fd_stake_delegations.h"
88

9+
ulong
10+
fd_stake_weights_by_node_2( fd_vote_states_t const * vote_states,
11+
fd_vote_stake_weight_t * weights ) {
12+
fd_vote_state_ele_t * vote_state_pool = fd_vote_states_get_pool( vote_states );
13+
fd_vote_state_map_t * vote_state_map = fd_vote_states_get_map( vote_states );
14+
15+
ulong weights_cnt = 0;
16+
for( fd_vote_state_map_iter_t iter = fd_vote_state_map_iter_init( vote_state_map, vote_state_pool );
17+
!fd_vote_state_map_iter_done( iter, vote_state_map, vote_state_pool );
18+
iter = fd_vote_state_map_iter_next( iter, vote_state_map, vote_state_pool ) ) {
19+
fd_vote_state_ele_t const * vote_state = fd_vote_state_map_iter_ele_const( iter, vote_state_map, vote_state_pool );
20+
if( FD_UNLIKELY( !vote_state->stake ) ) continue;
21+
22+
fd_memcpy( weights[ weights_cnt ].vote_key.uc, &vote_state->vote_account, sizeof(fd_pubkey_t) );
23+
fd_memcpy( weights[ weights_cnt ].id_key.uc, &vote_state->node_account, sizeof(fd_pubkey_t) );
24+
weights[ weights_cnt ].stake = vote_state->stake;
25+
weights_cnt++;
26+
}
27+
sort_vote_weights_by_stake_vote_inplace( weights, weights_cnt );
28+
return weights_cnt;
29+
}
30+
931
ulong
1032
fd_stake_weights_by_node( fd_vote_accounts_global_t const * accs,
1133
fd_vote_stake_weight_t * weights ) {

src/flamenco/stakes/fd_stakes.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "../fd_flamenco_base.h"
55
#include "../types/fd_types.h"
66
#include "fd_stake_delegations.h"
7+
#include "fd_vote_states.h"
78

89
FD_PROTOTYPES_BEGIN
910

@@ -21,6 +22,10 @@ FD_PROTOTYPES_BEGIN
2122
Returns the number of items in weights (which is <= no of vote accs). */
2223
#define STAKE_ACCOUNT_SIZE ( 200 )
2324

25+
ulong
26+
fd_stake_weights_by_node_2( fd_vote_states_t const * vote_states,
27+
fd_vote_stake_weight_t * weights );
28+
2429
ulong
2530
fd_stake_weights_by_node( fd_vote_accounts_global_t const * accs,
2631
fd_vote_stake_weight_t * weights );

src/flamenco/stakes/fd_vote_states.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ fd_vote_states_delete( void * mem ) {
178178
void
179179
fd_vote_states_update( fd_vote_states_t * self,
180180
fd_pubkey_t const * vote_account,
181+
fd_pubkey_t const * node_account,
181182
uchar commission,
182183
long last_vote_timestamp,
183184
ulong last_vote_slot,
@@ -220,6 +221,7 @@ fd_vote_states_update( fd_vote_states_t * self,
220221
vote_state->credits_cnt = credits_cnt;
221222
vote_state->last_vote_timestamp = last_vote_timestamp;
222223
vote_state->last_vote_slot = last_vote_slot;
224+
vote_state->node_account = *node_account;
223225
for( ulong i=0UL; i<credits_cnt; i++ ) {
224226
vote_state->epoch[i] = epoch[i];
225227
vote_state->credits[i] = credits[i];
@@ -240,6 +242,7 @@ fd_vote_states_update( fd_vote_states_t * self,
240242
}
241243

242244
vote_state->vote_account = *vote_account;
245+
vote_state->node_account = *node_account;
243246
vote_state->commission = commission;
244247
vote_state->last_vote_timestamp = last_vote_timestamp;
245248
vote_state->last_vote_slot = last_vote_slot;
@@ -315,19 +318,20 @@ fd_vote_states_update_from_account( fd_vote_states_t * vote_states,
315318
FD_LOG_CRIT(( "unable to decode vote state versioned" ));
316319
}
317320

318-
uchar commission;
319-
long last_vote_timestamp;
320-
ulong last_vote_slot;
321-
322-
ulong credits_cnt = 0UL;
323-
ushort epoch[EPOCH_CREDITS_MAX];
324-
ulong credits[EPOCH_CREDITS_MAX];
325-
ulong prev_credits[EPOCH_CREDITS_MAX];
321+
fd_pubkey_t node_account;
322+
uchar commission;
323+
long last_vote_timestamp;
324+
ulong last_vote_slot;
325+
ulong credits_cnt = 0UL;
326+
ushort epoch[EPOCH_CREDITS_MAX];
327+
ulong credits[EPOCH_CREDITS_MAX];
328+
ulong prev_credits[EPOCH_CREDITS_MAX];
326329

327330
fd_vote_epoch_credits_t * epoch_credits = NULL;
328331

329332
switch( vsv->discriminant ) {
330333
case fd_vote_state_versioned_enum_v0_23_5:
334+
node_account = vsv->inner.v0_23_5.node_pubkey;
331335
commission = vsv->inner.v0_23_5.commission;
332336
last_vote_timestamp = vsv->inner.v0_23_5.last_timestamp.timestamp;
333337
last_vote_slot = vsv->inner.v0_23_5.last_timestamp.slot;
@@ -347,6 +351,7 @@ fd_vote_states_update_from_account( fd_vote_states_t * vote_states,
347351

348352
break;
349353
case fd_vote_state_versioned_enum_v1_14_11:
354+
node_account = vsv->inner.v1_14_11.node_pubkey;
350355
commission = vsv->inner.v1_14_11.commission;
351356
last_vote_timestamp = vsv->inner.v1_14_11.last_timestamp.timestamp;
352357
last_vote_slot = vsv->inner.v1_14_11.last_timestamp.slot;
@@ -365,6 +370,7 @@ fd_vote_states_update_from_account( fd_vote_states_t * vote_states,
365370
}
366371
break;
367372
case fd_vote_state_versioned_enum_current:
373+
node_account = vsv->inner.current.node_pubkey;
368374
commission = vsv->inner.current.commission;
369375
last_vote_timestamp = vsv->inner.current.last_timestamp.timestamp;
370376
last_vote_slot = vsv->inner.current.last_timestamp.slot;
@@ -389,6 +395,7 @@ fd_vote_states_update_from_account( fd_vote_states_t * vote_states,
389395
fd_vote_states_update(
390396
vote_states,
391397
vote_account,
398+
&node_account,
392399
commission,
393400
last_vote_timestamp,
394401
last_vote_slot,

0 commit comments

Comments
 (0)