@@ -487,44 +487,53 @@ def update_mining_info(local_block)
487487 def update_addresses_info ( addrs_change , local_block , refresh_balance )
488488 return unless refresh_balance
489489
490+ snapshot_attrs = [ ]
490491 ### because `upsert` don't validate record, so it may pass invalid data into database.
491492 ### here we use one by one update (maybe slower)
492493 addrs_change . each do |addr_id , values |
493494 addr = Address . find addr_id
494495 check_invalid_address ( addr )
495496
496- balance_diff = values [ :balance_diff ]
497- balance_occupied_diff = values [ :balance_occupied_diff ] . presence || 0
498- live_cells_diff = values [ :cells_diff ]
499- dao_txs_count = values [ :dao_txs ] . present? ? values [ :dao_txs ] . size : 0
500- ckb_txs_count = values [ :ckb_txs ] . present? ? values [ :ckb_txs ] . size : 0
501-
502- addr . update! (
503- balance : addr . balance + balance_diff ,
504- balance_occupied : addr . balance_occupied + balance_occupied_diff ,
505- ckb_transactions_count : addr . ckb_transactions_count + ckb_txs_count ,
506- live_cells_count : addr . live_cells_count + live_cells_diff ,
507- dao_transactions_count : addr . dao_transactions_count + dao_txs_count ,
508- )
509-
510- save_address_block_snapshot! ( addr , local_block )
497+ if addr . last_updated_block_number . nil?
498+ addr . last_updated_block_number = local_block . number
499+ addr . live_cells_count = addr . cell_outputs . live . count
500+ addr . ckb_transactions_count = AccountBook . where ( address_id : addr . id ) . count
501+ addr . dao_transactions_count = DaoEvent . processed . where ( address_id : addr . id ) . distinct ( :ckb_transaction_id ) . count
502+ addr . cal_balance!
503+ addr . save!
504+ else
505+ balance_diff = values [ :balance_diff ]
506+ balance_occupied_diff = values [ :balance_occupied_diff ] . presence || 0
507+ live_cells_diff = values [ :cells_diff ]
508+ dao_txs_count = values [ :dao_txs ] . present? ? values [ :dao_txs ] . size : 0
509+ ckb_txs_count = values [ :ckb_txs ] . present? ? values [ :ckb_txs ] . size : 0
510+
511+ addr . update! (
512+ last_updated_block_number : local_block . number ,
513+ balance : addr . balance + balance_diff ,
514+ balance_occupied : addr . balance_occupied + balance_occupied_diff ,
515+ ckb_transactions_count : addr . ckb_transactions_count + ckb_txs_count ,
516+ live_cells_count : addr . live_cells_count + live_cells_diff ,
517+ dao_transactions_count : addr . dao_transactions_count + dao_txs_count ,
518+ )
519+ end
520+ addr . reload
521+ snapshot_attrs << {
522+ block_number : local_block . number ,
523+ final_state : {
524+ balance : addr . balance ,
525+ balance_occupied : addr . balance_occupied ,
526+ ckb_transactions_count : addr . ckb_transactions_count ,
527+ live_cells_count : addr . live_cells_count ,
528+ dao_transactions_count : addr . dao_transactions_count ,
529+ last_updated_block_number : local_block . number
530+ } ,
531+ address_id : addr . id ,
532+ block_id : local_block . id ,
533+ }
511534 end
512- end
513535
514- def save_address_block_snapshot! ( addr , local_block )
515- AddressBlockSnapshot . create_with (
516- block_number : local_block . number ,
517- final_state : {
518- balance : addr . balance ,
519- balance_occupied : addr . balance_occupied ,
520- ckb_transactions_count : addr . ckb_transactions_count ,
521- live_cells_count : addr . live_cells_count ,
522- dao_transactions_count : addr . dao_transactions_count ,
523- } ,
524- ) . find_or_create_by! (
525- address_id : addr . id ,
526- block_id : local_block . id ,
527- )
536+ AddressBlockSnapshot . upsert_all ( snapshot_attrs , unique_by : %i[ block_id address_id ] ) if snapshot_attrs . present?
528537 end
529538
530539 def update_block_info! ( local_block )
0 commit comments