various token instance fethcer fixes

1. Handle invalid json / uri
2. Do not fetch instance metadata for empty token id
pull/2755/head
Ayrat Badykov 5 years ago
parent 0955b10a8b
commit 82f4eb4a24
No known key found for this signature in database
GPG Key ID: B44668E265E9396F
  1. 2
      apps/explorer/lib/explorer/chain.ex
  2. 5
      apps/explorer/lib/explorer/token/instance_metadata_retriever.ex
  3. 22
      apps/explorer/test/explorer/chain_test.exs

@ -2946,7 +2946,7 @@ defmodule Explorer.Chain do
on: token.contract_address_hash == token_transfer.token_contract_address_hash, on: token.contract_address_hash == token_transfer.token_contract_address_hash,
left_join: instance in Instance, left_join: instance in Instance,
on: token_transfer.token_id == instance.token_id, on: token_transfer.token_id == instance.token_id,
where: token.type == ^"ERC-721" and is_nil(instance.token_id), where: token.type == ^"ERC-721" and is_nil(instance.token_id) and not is_nil(token_transfer.token_id),
distinct: [token_transfer.token_contract_address_hash, token_transfer.token_id], distinct: [token_transfer.token_contract_address_hash, token_transfer.token_id],
select: %{contract_address_hash: token_transfer.token_contract_address_hash, token_id: token_transfer.token_id} select: %{contract_address_hash: token_transfer.token_contract_address_hash, token_id: token_transfer.token_id}
) )

@ -61,6 +61,11 @@ defmodule Explorer.Token.InstanceMetadataRetriever do
{:error, %Error{reason: reason}} -> {:error, %Error{reason: reason}} ->
{:error, reason} {:error, reason}
end end
rescue
e ->
Logger.error(fn -> ["Could not send request to token uri #{inspect(token_uri)}. error #{inspect(e)}"] end)
{:error, :request_error}
end end
defp fetch_json(result) do defp fetch_json(result) do

@ -3645,6 +3645,28 @@ defmodule Explorer.ChainTest do
assert result.contract_address_hash == token_transfer.token_contract_address_hash assert result.contract_address_hash == token_transfer.token_contract_address_hash
end end
test "does not fetch token transfers without token id" do
token_contract_address = insert(:contract_address)
token = insert(:token, contract_address: token_contract_address, type: "ERC-721")
transaction =
:transaction
|> insert()
|> with_block(insert(:block, number: 1))
insert(
:token_transfer,
block_number: 1000,
to_address: build(:address),
transaction: transaction,
token_contract_address: token_contract_address,
token: token,
token_id: nil
)
assert {:ok, []} = Chain.stream_unfetched_token_instances([], &[&1 | &2])
end
test "do not fetch records with token instances" do test "do not fetch records with token instances" do
token_contract_address = insert(:contract_address) token_contract_address = insert(:contract_address)
token = insert(:token, contract_address: token_contract_address, type: "ERC-721") token = insert(:token, contract_address: token_contract_address, type: "ERC-721")

Loading…
Cancel
Save