Skip to content

Commit 0a8f9cf

Browse files
authored
Merge pull request #642 from nervosnetwork/rc/v0.9.7
2 parents 8d6d735 + b1eb350 commit 0a8f9cf

34 files changed

+405
-205
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
# [v0.9.7](https://github.com/shaojunda/ckb-explorer/compare/v0.9.6...v0.9.7) (2020-06-05)
2+
3+
4+
### Features
5+
6+
* #[635](https://github.com/nervosnetwork/ckb-explorer/pull/635): add udts api
7+
8+
9+
### Performance Improvements
10+
11+
* #[625](https://github.com/nervosnetwork/ckb-explorer/pull/625): address dao and udt transactions api
12+
13+
114
# [v0.9.6](https://github.com/shaojunda/ckb-explorer/compare/v0.9.5...v0.9.6) (2020-06-01)
215

316

app/controllers/api/v1/address_dao_transactions_controller.rb

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

11-
presented_address = AddressPresenter.new(address)
12-
ckb_dao_transactions = presented_address.ckb_dao_transactions.recent.distinct.page(@page).per(@page_size)
11+
ckb_dao_transactions = address.ckb_dao_transactions.recent.page(@page).per(@page_size)
1312
options = FastJsonapi::PaginationMetaGenerator.new(request: request, records: ckb_dao_transactions, page: @page, page_size: @page_size).call
1413

1514
render json: CkbTransactionSerializer.new(ckb_dao_transactions, options.merge({ params: { previews: true } }))

app/controllers/api/v1/address_transactions_controller.rb

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

11-
presented_address = AddressPresenter.new(@address)
12-
@ckb_transactions = presented_address.ckb_transactions.recent.distinct.page(@page).per(@page_size)
11+
@ckb_transactions = @address.custom_ckb_transactions.recent.page(@page).per(@page_size)
1312
@options = FastJsonapi::PaginationMetaGenerator.new(request: request, records: @ckb_transactions, page: @page, page_size: @page_size).call
1413

1514
render json: json_result

app/controllers/api/v1/address_udt_transactions_controller.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ 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-
presented_address = AddressPresenter.new(address)
16-
ckb_dao_transactions = presented_address.ckb_udt_transactions(params[:type_hash]).recent.distinct.page(@page).per(@page_size)
15+
ckb_dao_transactions = address.ckb_udt_transactions(params[:type_hash]).recent.page(@page).per(@page_size)
1716
options = FastJsonapi::PaginationMetaGenerator.new(request: request, records: ckb_dao_transactions, page: @page, page_size: @page_size).call
1817

1918
render json: CkbTransactionSerializer.new(ckb_dao_transactions, options.merge({ params: { previews: true } }))

app/controllers/api/v1/addresses_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def json_response(address)
2626
if QueryKeyUtils.valid_hex?(params[:id])
2727
LockHashSerializer.new(address)
2828
else
29-
presented_address = address.is_a?(NullAddress) ? NullAddress.new(params[:id]) : AddressPresenter.new(address)
29+
presented_address = address.is_a?(NullAddress) ? NullAddress.new(params[:id]) : address
3030
AddressSerializer.new(presented_address)
3131
end
3232
end

app/controllers/api/v1/udt_transactions_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class Api::V1::UdtTransactionsController < ApplicationController
44

55
def show
66
udt = Udt.find_by!(type_hash: params[:id], published: true)
7-
ckb_transactions = udt.ckb_transactions.recent.distinct.page(@page).per(@page_size)
7+
ckb_transactions = udt.ckb_transactions.recent.page(@page).per(@page_size)
88
options = FastJsonapi::PaginationMetaGenerator.new(request: request, records: ckb_transactions, page: @page, page_size: @page_size).call
99

1010
render json: CkbTransactionSerializer.new(ckb_transactions, options.merge({ params: { previews: true } }))

app/controllers/api/v1/udts_controller.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
class Api::V1::UdtsController < ApplicationController
22
before_action :validate_query_params, only: :show
33

4+
def index
5+
udts = Udt.order(addresses_count: :desc).limit(1000)
6+
render json: UdtSerializer.new(udts)
7+
end
8+
49
def show
510
udt = Udt.find_by!(type_hash: params[:id], published: true)
611

app/controllers/validations/distribution_data.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,15 @@ def error_object
2525
attr_accessor :query_key
2626

2727
def query_key_format_must_be_correct
28-
if query_key.blank? || !(query_key.split("-") - ::DistributionData::VALID_INDICATORS).empty?
28+
if query_key.blank? || !query_key_valid?
2929
errors.add(:query_key, "indicator name is invalid")
3030
end
3131
end
32+
33+
def query_key_valid?
34+
query_keys = query_key.split("-")
35+
extra_keys = query_keys - ::DistributionData::VALID_INDICATORS
36+
extra_keys.blank? || extra_keys.size == 1 && /^miner_address_distribution(\d+)$/ =~ extra_keys.first
37+
end
3238
end
3339
end

app/controllers/validations/monetary_data.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def query_key_format_must_be_correct
3333
def query_key_valid?
3434
query_keys = query_key.split("-")
3535
extra_keys = query_keys - ::MonetaryData::VALID_INDICATORS
36-
extra_keys.blank? || extra_keys.size == 1 && extra_keys.first =~ /^nominal_apc(\d+)$/
36+
extra_keys.blank? || extra_keys.size == 1 && /^nominal_apc(\d+)$/ =~ extra_keys.first
3737
end
3838
end
3939
end

app/models/address.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,53 @@ class Address < ApplicationRecord
1717

1818
attr_accessor :query_address
1919

20+
def custom_ckb_transactions
21+
ckb_transaction_ids = account_books.select(:ckb_transaction_id).distinct
22+
CkbTransaction.where(id: ckb_transaction_ids)
23+
end
24+
25+
def ckb_dao_transactions
26+
ckb_transaction_ids = cell_outputs.where(cell_type: %w(nervos_dao_deposit nervos_dao_withdrawing)).select("ckb_transaction_id").distinct
27+
CkbTransaction.where(id: ckb_transaction_ids)
28+
end
29+
30+
def ckb_udt_transactions(type_hash)
31+
sql =
32+
<<-SQL
33+
SELECT
34+
generated_by_id ckb_transaction_id
35+
FROM
36+
cell_outputs
37+
WHERE
38+
address_id = #{id}
39+
AND
40+
cell_type = #{CellOutput::cell_types['udt']}
41+
AND
42+
type_hash = '#{type_hash}'
43+
44+
UNION
45+
46+
SELECT
47+
consumed_by_id ckb_transaction_id
48+
FROM
49+
cell_outputs
50+
WHERE
51+
address_id = #{id}
52+
AND
53+
cell_type = #{CellOutput::cell_types['udt']}
54+
AND
55+
type_hash = '#{type_hash}'
56+
AND
57+
consumed_by_id is not null
58+
SQL
59+
ckb_transaction_ids = CellOutput.select("ckb_transaction_id").from("(#{sql}) as cell_outputs")
60+
CkbTransaction.where(id: ckb_transaction_ids.distinct)
61+
end
62+
63+
def lock_info
64+
lock_script.lock_info
65+
end
66+
2067
def lock_script
2168
LockScript.where(address: self).first
2269
end

0 commit comments

Comments
 (0)