Skip to content

Commit a96540f

Browse files
authored
Merge pull request #2379 from nervosnetwork/develop
Deploy to testnet
2 parents b0df727 + 57ef816 commit a96540f

26 files changed

+271
-567
lines changed

app/controllers/api/v1/address_dao_transactions_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ def show
88
address = Address.find_address!(params[:id])
99
raise Api::V1::Exceptions::AddressNotFoundError if address.is_a?(NullAddress)
1010

11-
ckb_dao_transactions = address.ckb_dao_transactions.select(:id, :tx_hash, :block_id, :block_number, :tags, :block_timestamp, :is_cellbase, :updated_at, :created_at).
12-
recent.page(@page).per(@page_size).fast_page
11+
ckb_dao_transactions = address.ckb_dao_transactions.select(:id, :tx_hash, :block_id, :block_number, :tags, :block_timestamp, :is_cellbase, :updated_at, :created_at, :tx_index).
12+
recent.page(@page).per(@page_size)
1313
json =
1414
Rails.cache.realize(ckb_dao_transactions.cache_key, version: ckb_dao_transactions.cache_version) do
1515
records_counter = RecordCounters::AddressDaoTransactions.new(address)

app/controllers/api/v1/address_udt_transactions_controller.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ def show
1212
udt = Udt.find_by(type_hash: params[:type_hash], published: true)
1313
raise Api::V1::Exceptions::UdtNotFoundError if udt.blank?
1414

15-
ckb_dao_transactions = address.ckb_udt_transactions(udt.id).
15+
ckb_udt_transactions = address.ckb_udt_transactions(udt.id).
1616
select(:id, :tx_hash, :block_id, :block_number, :block_timestamp, :is_cellbase, :updated_at, :created_at, :tags).
1717
recent.page(@page).per(@page_size).fast_page
1818
json =
19-
Rails.cache.realize(ckb_dao_transactions.cache_key, version: ckb_dao_transactions.cache_version) do
19+
Rails.cache.realize(ckb_udt_transactions.cache_key, version: ckb_udt_transactions.cache_version) do
2020
records_counter = RecordCounters::AddressUdtTransactions.new(address, udt.id)
21-
options = FastJsonapi::PaginationMetaGenerator.new(request:, records: ckb_dao_transactions, page: @page, page_size: @page_size, records_counter:).call
22-
CkbTransactionsSerializer.new(ckb_dao_transactions, options.merge(params: { previews: true })).serialized_json
21+
options = FastJsonapi::PaginationMetaGenerator.new(request:, records: ckb_udt_transactions, page: @page, page_size: @page_size, records_counter:).call
22+
CkbTransactionsSerializer.new(ckb_udt_transactions, options.merge(params: { previews: true })).serialized_json
2323
end
2424

2525
render json:

app/jobs/revert_block_job.rb

Lines changed: 67 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

app/models/address.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class Address < ApplicationRecord
1313
has_many :udt_accounts
1414
has_many :dao_events
1515
belongs_to :lock_script, optional: true
16+
has_many :ckb_dao_transactions, -> { distinct }, through: :dao_events, source: :ckb_transaction
1617

1718
has_one :bitcoin_address_mapping, foreign_key: "ckb_address_id"
1819
has_one :bitcoin_address, through: :bitcoin_address_mapping
@@ -33,8 +34,6 @@ def custom_ckb_transactions
3334
ckb_transactions
3435
end
3536

36-
has_and_belongs_to_many :ckb_dao_transactions, class_name: "CkbTransaction", join_table: "address_dao_transactions"
37-
3837
def ckb_udt_transactions(udt)
3938
udt = Udt.find_by_id(udt) unless udt.is_a?(Udt)
4039
udt&.ckb_transactions || []

app/models/address_dao_transaction.rb

Lines changed: 0 additions & 16 deletions
This file was deleted.

0 commit comments

Comments
 (0)