Skip to content

Commit

Permalink
feat: add block hash to activities (#1098)
Browse files Browse the repository at this point in the history
  • Loading branch information
sborrazas committed Jan 4, 2023
1 parent 9b06e72 commit f743612
Show file tree
Hide file tree
Showing 2 changed files with 170 additions and 49 deletions.
120 changes: 73 additions & 47 deletions lib/ae_mdw/activities.ex
Expand Up @@ -42,6 +42,7 @@ defmodule AeMdw.Activities do
non_neg_integer()}
| {:int_transfer, IntTransfer.kind(), Txs.txi()}
| :claim
@typep activity_type() :: String.t()

@max_pos 4
@min_int Util.min_int()
Expand Down Expand Up @@ -165,15 +166,47 @@ defmodule AeMdw.Activities do
end
|> Collection.paginate(pagination)

events =
Enum.map(activities_locators_data, fn {{height, txi, _local_idx}, data} ->
render(state, account_pk, height, txi, data)
end)
events = render_activities(state, account_pk, activities_locators_data)

{:ok, serialize_cursor(prev_cursor), events, serialize_cursor(next_cursor)}
end
end

defp render_activities(state, account_pk, activities_locators_data) do
{activities_locators_data, _acc} =
Enum.map_reduce(activities_locators_data, nil, fn
{{_height, txi, _local_idx}, _data} = locator, {:txi, txi, enc_mb_hash} = block_info ->
{{enc_mb_hash, locator}, block_info}

{{height, -1, _local_idx}, _data} = locator, {:gen, height, enc_kb_hash} = block_info ->
{{enc_kb_hash, locator}, block_info}

{{height, -1, _local_idx}, _data} = locator, _block_info ->
Model.block(hash: kb_hash) = State.fetch!(state, Model.Block, {height, -1})
enc_kb_hash = Enc.encode(:key_block_hash, kb_hash)

{{enc_kb_hash, locator}, {:gen, height, enc_kb_hash}}

{{_height, txi, _local_idx}, _data} = locator, _block_info ->
Model.tx(block_index: block_index) = State.fetch!(state, Model.Tx, txi)
Model.block(hash: kb_hash) = State.fetch!(state, Model.Block, block_index)
enc_mb_hash = Enc.encode(:micro_block_hash, kb_hash)

{{enc_mb_hash, locator}, {:txi, txi, enc_mb_hash}}
end)

Enum.map(activities_locators_data, fn {block_hash, {{height, txi, _local_idx}, data}} ->
{type, payload} = render_payload(state, account_pk, height, txi, data)

%{
height: height,
block_hash: block_hash,
type: type,
payload: payload
}
end)
end

defp build_name_claims_stream(state, direction, name_hash, txi_scope, txi_cursor) do
with {:ok, Model.plain_name(value: plain_name)} <-
State.get(state, Model.PlainName, name_hash),
Expand Down Expand Up @@ -458,18 +491,15 @@ defmodule AeMdw.Activities do
end)
end

@spec render(state(), Db.pubkey(), height(), txi(), activity_value()) :: map()
defp render(state, _account_pk, height, txi, {:field, tx_type, _tx_pos}) do
@spec render_payload(state(), Db.pubkey(), height(), txi(), activity_value()) ::
{activity_type(), map()}
defp render_payload(state, _account_pk, _height, txi, {:field, tx_type, _tx_pos}) do
tx = state |> Txs.fetch!(txi) |> Map.delete("tx_index")

%{
height: height,
type: "#{Node.tx_name(tx_type)}Event",
payload: tx
}
{"#{Node.tx_name(tx_type)}Event", tx}
end

defp render(state, account_pk, height, txi, :claim) do
defp render_payload(state, account_pk, _height, txi, :claim) do
Model.tx(id: tx_hash, time: micro_time) = State.fetch!(state, Model.Tx, txi)

claim_aetx =
Expand All @@ -479,75 +509,71 @@ defmodule AeMdw.Activities do
name_hash == account_pk
end)

%{
height: height,
type: "NameClaimEvent",
payload: %{
micro_time: micro_time,
tx_hash: Enc.encode(:tx_hash, tx_hash),
tx: :aetx.serialize_for_client(claim_aetx)
}
payload = %{
micro_time: micro_time,
tx_hash: Enc.encode(:tx_hash, tx_hash),
tx: :aetx.serialize_for_client(claim_aetx)
}

{"NameClaimEvent", payload}
end

defp render(state, _account_pk, height, call_txi, {:int_contract_call, local_idx}) do
defp render_payload(state, _account_pk, _height, call_txi, {:int_contract_call, local_idx}) do
payload =
state
|> Format.to_map({call_txi, local_idx}, Model.IntContractCall)
|> Map.drop([:call_txi, :create_txi])

%{
height: height,
type: "InternalContractCallEvent",
payload: payload
}
{"InternalContractCallEvent", payload}
end

defp render(state, account_pk, height, txi, {:int_transfer, kind, ref_txi}) do
defp render_payload(state, account_pk, height, txi, {:int_transfer, kind, ref_txi}) do
transfer_key = {{height, txi}, kind, account_pk, ref_txi}
m_transfer = State.fetch!(state, Model.IntTransferTx, transfer_key)
amount = Model.int_transfer_tx(m_transfer, :amount)
ref_tx_hash = if ref_txi >= 0, do: Enc.encode(:tx_hash, Txs.txi_to_hash(state, ref_txi))

%{
height: height,
type: "InternalTransferEvent",
payload: %{
amount: amount,
kind: kind,
ref_tx_hash: ref_tx_hash
}
payload = %{
amount: amount,
kind: kind,
ref_tx_hash: ref_tx_hash
}

{"InternalTransferEvent", payload}
end

defp render(state, _account_pk, height, txi, {:aexn, :aex9, from_pk, to_pk, value, index}) do
defp render_payload(
state,
_account_pk,
_height,
txi,
{:aexn, :aex9, from_pk, to_pk, value, index}
) do
payload =
state
|> AexnView.sender_transfer_to_map({:aex9, from_pk, txi, to_pk, value, index})
|> Map.delete(:call_txi)
|> Util.map_rename(:sender, :sender_id)
|> Util.map_rename(:recipient, :recipient_id)

%{
height: height,
type: "Aex9TransferEvent",
payload: payload
}
{"Aex9TransferEvent", payload}
end

defp render(state, _account_pk, height, txi, {:aexn, :aex141, from_pk, to_pk, value, index}) do
defp render_payload(
state,
_account_pk,
_height,
txi,
{:aexn, :aex141, from_pk, to_pk, value, index}
) do
payload =
state
|> AexnView.sender_transfer_to_map({:aex141, from_pk, txi, to_pk, value, index})
|> Map.delete(:call_txi)
|> Util.map_rename(:sender, :sender_id)
|> Util.map_rename(:recipient, :recipient_id)

%{
height: height,
type: "Aex141TransferEvent",
payload: payload
}
{"Aex141TransferEvent", payload}
end

defp serialize_cursor(nil), do: nil
Expand Down

0 comments on commit f743612

Please sign in to comment.