@@ -21,7 +21,6 @@ def perform(local_tip_block = nil)
2121 uniq . concat ( local_tip_block . cell_outputs . m_nft_token . pluck ( :type_hash ) . uniq )
2222 end
2323 benchmark :recalculate_udt_transactions_count , local_tip_block
24- benchmark :recalculate_dao_contract_transactions_count , local_tip_block
2524 benchmark :decrease_records_count , local_tip_block
2625
2726 ApplicationRecord . benchmark "invalid! block" do
@@ -51,7 +50,7 @@ def update_address_balance_and_ckb_transactions_count(local_tip_block)
5150 address . live_cells_count = address . cell_outputs . live . count
5251 # address.ckb_transactions_count = address.custom_ckb_transactions.count
5352 address . ckb_transactions_count = AccountBook . where ( address_id : address . id ) . count
54- address . dao_transactions_count = AddressDaoTransaction . where ( address_id : address . id ) . count
53+ address . dao_transactions_count = DaoEvent . processed . where ( address_id : address . id ) . distinct ( :ckb_transaction_id ) . count
5554 address . cal_balance!
5655 address . save!
5756 end
@@ -60,14 +59,6 @@ def update_address_balance_and_ckb_transactions_count(local_tip_block)
6059 AddressBlockSnapshot . where ( block_id : local_tip_block . id ) . delete_all
6160 end
6261
63- def recalculate_dao_contract_transactions_count ( local_tip_block )
64- dao_transactions_count = local_tip_block . ckb_transactions . where ( "tags @> array[?]::varchar[]" , [ "dao" ] ) . count
65- if dao_transactions_count > 0
66- DaoContract . default_contract . decrement! ( :ckb_transactions_count ,
67- dao_transactions_count )
68- end
69- end
70-
7162 def recalculate_udt_transactions_count ( local_tip_block )
7263 udt_ids = local_tip_block . ckb_transactions . map ( &:contained_udt_ids ) . flatten
7364 udt_counts = udt_ids . each_with_object ( Hash . new ( 0 ) ) { |udt_id , counts | counts [ udt_id ] += 1 }
@@ -85,16 +76,6 @@ def recalculate_udt_transactions_count(local_tip_block)
8576 Udt . upsert_all ( udt_counts_value ) if udt_counts_value . present?
8677 end
8778
88- def revert_dao_contract_related_operations ( local_tip_block )
89- dao_events = DaoEvent . where ( block : local_tip_block ) . processed
90- dao_contract = DaoContract . default_contract
91- revert_withdraw_from_dao ( dao_contract , dao_events )
92- revert_issue_interest ( dao_contract , dao_events )
93- revert_deposit_to_dao ( dao_contract , dao_events )
94- revert_new_dao_depositor ( dao_contract , dao_events )
95- revert_take_away_all_deposit ( dao_contract , dao_events )
96- end
97-
9879 def recalculate_udt_accounts ( udt_type_hashes , local_tip_block )
9980 return if udt_type_hashes . blank?
10081
@@ -125,61 +106,90 @@ def revert_mining_info(local_tip_block)
125106
126107 def revert_dao_contract_related_operations ( local_tip_block )
127108 dao_events = DaoEvent . where ( block : local_tip_block ) . processed
109+ dao_transactions_count = local_tip_block . ckb_transactions . where ( "tags @> array[?]::varchar[]" , [ "dao" ] ) . count
128110 dao_contract = DaoContract . default_contract
129- revert_withdraw_from_dao ( dao_contract , dao_events )
130- revert_issue_interest ( dao_contract , dao_events )
131- revert_deposit_to_dao ( dao_contract , dao_events )
132- revert_new_dao_depositor ( dao_contract , dao_events )
133- revert_take_away_all_deposit ( dao_contract , dao_events )
134- end
135111
136- def revert_take_away_all_deposit ( dao_contract , dao_events )
137- take_away_all_deposit_dao_events = dao_events . where ( event_type : "take_away_all_deposit" )
138- take_away_all_deposit_dao_events . each do |event |
139- dao_contract . increment! ( :depositors_count )
140- event . reverted!
141- end
112+ withdraw_transactions_count , withdraw_total_deposit = revert_withdraw_from_dao ( dao_events )
113+ claimed_compensation = revert_issue_interest ( dao_events )
114+ deposit_transactions_count , deposit_total_deposit = revert_deposit_to_dao ( dao_events )
115+
116+ dao_events . update_all ( status : "reverted" )
117+ dao_contract . update! ( deposit_transactions_count : dao_contract . deposit_transactions_count - deposit_transactions_count ,
118+ withdraw_transactions_count : dao_contract . withdraw_transactions_count - withdraw_transactions_count ,
119+ total_deposit : dao_contract . total_deposit + withdraw_total_deposit - deposit_total_deposit ,
120+ claimed_compensation : dao_contract . claimed_compensation - claimed_compensation ,
121+ ckb_transactions_count : dao_contract . ckb_transactions_count - dao_transactions_count ,
122+ depositors_count : DaoEvent . depositor . count )
142123 end
143124
144- def revert_issue_interest ( dao_contract , dao_events )
145- issue_interest_dao_events = dao_events . where ( event_type : "issue_interest" )
125+ def revert_issue_interest ( dao_events )
126+ issue_interest_dao_events = dao_events . issue_interest
127+ claimed_compensation = 0
128+ address_attrs = { }
146129 issue_interest_dao_events . each do |event |
147- dao_contract . decrement! ( :claimed_compensation , event . value )
130+ claimed_compensation += event . value
131+
148132 address = event . address
149- address . decrement! ( :interest , event . value )
150- event . reverted!
133+ address_attrs [ address . id ] ||= {
134+ id : address . id ,
135+ interest : address . interest ,
136+ }
137+ address_attrs [ address . id ] [ :interest ] -= event . value
151138 end
139+ upsert_data = address_attrs . values
140+ Address . upsert_all ( upsert_data , unique_by : :id ) if upsert_data . present?
141+ claimed_compensation
152142 end
153143
154- def revert_withdraw_from_dao ( dao_contract , dao_events )
155- withdraw_from_dao_events = dao_events . where ( event_type : "withdraw_from_dao" )
144+ def revert_withdraw_from_dao ( dao_events )
145+ withdraw_from_dao_events = dao_events . includes ( :address ) . withdraw_from_dao
146+
147+ ids = withdraw_from_dao_events . pluck ( :ckb_transaction_id )
148+ DaoEvent . processed . where ( withdrawn_transaction_id : ids ) . update_all ( withdrawn_transaction_id : nil )
149+
150+ redundant_total_deposit = 0
151+ address_attrs = { }
156152 withdraw_from_dao_events . each do |event |
157- dao_contract . decrement! ( :withdraw_transactions_count )
158- dao_contract . increment! ( :total_deposit , event . value )
153+ redundant_total_deposit += event . value
154+
159155 address = event . address
160- address . increment! ( :dao_deposit , event . value )
161- event . reverted!
156+ address_attrs [ address . id ] ||= {
157+ id : address . id ,
158+ dao_deposit : address . dao_deposit ,
159+ is_depositor : address . is_depositor ,
160+ }
161+ address_attrs [ address . id ] [ :dao_deposit ] += event . value
162+ address_attrs [ address . id ] [ :is_depositor ] = true
162163 end
163- end
164164
165- def revert_new_dao_depositor ( dao_contract , dao_events )
166- new_dao_depositor_events = dao_events . where ( event_type : "new_dao_depositor" )
167- new_dao_depositor_events . each do |event |
168- dao_contract . decrement! ( :depositors_count )
169- dao_contract . decrement! ( :total_depositors_count )
170- event . reverted!
171- end
165+ upsert_data = address_attrs . values
166+ Address . upsert_all ( upsert_data , unique_by : :id ) if upsert_data . present?
167+
168+ [ withdraw_from_dao_events . size , redundant_total_deposit ]
172169 end
173170
174- def revert_deposit_to_dao ( dao_contract , dao_events )
175- deposit_to_dao_events = dao_events . where ( event_type : "deposit_to_dao" )
171+ def revert_deposit_to_dao ( dao_events )
172+ deposit_to_dao_events = dao_events . deposit_to_dao
173+ redundant_total_deposit = 0
174+ address_attrs = { }
175+
176176 deposit_to_dao_events . each do |event |
177+ redundant_total_deposit += event . value
178+
177179 address = event . address
178- address . decrement! ( :dao_deposit , event . value )
179- dao_contract . decrement! ( :total_deposit , event . value )
180- dao_contract . decrement! ( :deposit_transactions_count )
181- event . reverted!
180+ address_attrs [ address . id ] ||= {
181+ id : address . id ,
182+ dao_deposit : address . dao_deposit ,
183+ }
184+ address_attrs [ address . id ] [ :dao_deposit ] -= event . value
182185 end
186+
187+ upsert_data = address_attrs . values
188+ address_ids = address_attrs . values . map { |hash | hash [ :id ] }
189+ Address . upsert_all ( upsert_data , unique_by : :id ) if upsert_data . present?
190+ Address . where ( id : address_ids , dao_deposit : 0 ) . update_all ( is_depositor : false )
191+
192+ [ deposit_to_dao_events . size , redundant_total_deposit ]
183193 end
184194
185195 def revert_block_rewards ( local_tip_block )
0 commit comments