|
|
|
@ -4881,6 +4881,28 @@ defmodule Explorer.Chain do |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
@spec erc721_or_erc1155_token_instance_from_token_id_and_token_address(binary(), Hash.Address.t()) :: |
|
|
|
|
{:ok, TokenTransfer.t()} | {:error, :not_found} |
|
|
|
|
def erc721_or_erc1155_token_instance_from_token_id_and_token_address(token_id, token_contract_address) do |
|
|
|
|
query = |
|
|
|
|
from(tt in TokenTransfer, |
|
|
|
|
left_join: instance in Instance, |
|
|
|
|
on: |
|
|
|
|
tt.token_contract_address_hash == instance.token_contract_address_hash and |
|
|
|
|
(tt.token_id == instance.token_id or instance.token_id in tt.token_ids), |
|
|
|
|
where: |
|
|
|
|
tt.token_contract_address_hash == ^token_contract_address and |
|
|
|
|
(tt.token_id == ^token_id or ^token_id in tt.token_ids), |
|
|
|
|
limit: 1, |
|
|
|
|
select: %{tt | instance: instance} |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
case Repo.one(query) do |
|
|
|
|
nil -> {:error, :not_found} |
|
|
|
|
token_instance -> {:ok, token_instance} |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
defp fetch_coin_balances(address_hash, paging_options) do |
|
|
|
|
address = Repo.get_by(Address, hash: address_hash) |
|
|
|
|
|
|
|
|
@ -5505,7 +5527,7 @@ defmodule Explorer.Chain do |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
@doc """ |
|
|
|
|
Checks if a `t:Explorer.Chain.TokenTransfer.t/0` with the given `hash` and `token_id` exists. |
|
|
|
|
Checks if a `t:Explorer.Chain.TokenTransfer.t/0` of type ERC-721 with the given `hash` and `token_id` exists. |
|
|
|
|
|
|
|
|
|
Returns `:ok` if found |
|
|
|
|
|
|
|
|
@ -5533,7 +5555,46 @@ defmodule Explorer.Chain do |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
@doc """ |
|
|
|
|
Checks if a `t:Explorer.Chain.TokenTransfer.t/0` with the given `hash` and `token_id` exists. |
|
|
|
|
Checks if a `t:Explorer.Chain.TokenTransfer.t/0` of type ERC-721 or ERC-1155 with the given `hash` and `token_id` exists. |
|
|
|
|
|
|
|
|
|
Returns `:ok` if found |
|
|
|
|
|
|
|
|
|
iex> contract_address = insert(:address) |
|
|
|
|
iex> token_id = 10 |
|
|
|
|
iex> insert(:token_transfer, |
|
|
|
|
...> from_address: contract_address, |
|
|
|
|
...> token_contract_address: contract_address, |
|
|
|
|
...> token_id: token_id |
|
|
|
|
...> ) |
|
|
|
|
iex> Explorer.Chain.check_erc721_or_erc1155_token_instance_exists(token_id, contract_address.hash) |
|
|
|
|
:ok |
|
|
|
|
|
|
|
|
|
iex> contract_address = insert(:address) |
|
|
|
|
iex> token_id = 10 |
|
|
|
|
iex> insert(:token_transfer, |
|
|
|
|
...> from_address: contract_address, |
|
|
|
|
...> token_contract_address: contract_address, |
|
|
|
|
...> token_ids: [token_id] |
|
|
|
|
...> ) |
|
|
|
|
iex> Explorer.Chain.check_erc721_or_erc1155_token_instance_exists(token_id, contract_address.hash) |
|
|
|
|
:ok |
|
|
|
|
|
|
|
|
|
Returns `:not_found` if not found |
|
|
|
|
|
|
|
|
|
iex> {:ok, hash} = Explorer.Chain.string_to_address_hash("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed") |
|
|
|
|
iex> Explorer.Chain.check_erc721_or_erc1155_token_instance_exists(10, hash) |
|
|
|
|
:not_found |
|
|
|
|
""" |
|
|
|
|
@spec check_erc721_or_erc1155_token_instance_exists(binary() | non_neg_integer(), Hash.Address.t()) :: |
|
|
|
|
:ok | :not_found |
|
|
|
|
def check_erc721_or_erc1155_token_instance_exists(token_id, hash) do |
|
|
|
|
token_id |
|
|
|
|
|> erc721_or_erc1155_token_instance_exist?(hash) |
|
|
|
|
|> boolean_to_check_result() |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
@doc """ |
|
|
|
|
Checks if a `t:Explorer.Chain.TokenTransfer.t/0` of type ERC-721 with the given `hash` and `token_id` exists. |
|
|
|
|
|
|
|
|
|
Returns `true` if found |
|
|
|
|
|
|
|
|
@ -5563,6 +5624,47 @@ defmodule Explorer.Chain do |
|
|
|
|
Repo.exists?(query) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
@doc """ |
|
|
|
|
Checks if a `t:Explorer.Chain.TokenTransfer.t/0` of type ERC-721 or ERC-1155 with the given `hash` and `token_id` exists. |
|
|
|
|
|
|
|
|
|
Returns `true` if found |
|
|
|
|
|
|
|
|
|
iex> contract_address = insert(:address) |
|
|
|
|
iex> token_id = 10 |
|
|
|
|
iex> insert(:token_transfer, |
|
|
|
|
...> from_address: contract_address, |
|
|
|
|
...> token_contract_address: contract_address, |
|
|
|
|
...> token_id: token_id |
|
|
|
|
...> ) |
|
|
|
|
iex> Explorer.Chain.erc721_or_erc1155_token_instance_exist?(token_id, contract_address.hash) |
|
|
|
|
true |
|
|
|
|
|
|
|
|
|
iex> contract_address = insert(:address) |
|
|
|
|
iex> token_id = 10 |
|
|
|
|
iex> insert(:token_transfer, |
|
|
|
|
...> from_address: contract_address, |
|
|
|
|
...> token_contract_address: contract_address, |
|
|
|
|
...> token_ids: [token_id] |
|
|
|
|
...> ) |
|
|
|
|
iex> Explorer.Chain.erc721_or_erc1155_token_instance_exist?(token_id, contract_address.hash) |
|
|
|
|
true |
|
|
|
|
|
|
|
|
|
Returns `false` if not found |
|
|
|
|
|
|
|
|
|
iex> {:ok, hash} = Explorer.Chain.string_to_address_hash("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed") |
|
|
|
|
iex> Explorer.Chain.erc721_or_erc1155_token_instance_exist?(10, hash) |
|
|
|
|
false |
|
|
|
|
""" |
|
|
|
|
@spec erc721_or_erc1155_token_instance_exist?(binary() | non_neg_integer(), Hash.Address.t()) :: boolean() |
|
|
|
|
def erc721_or_erc1155_token_instance_exist?(token_id, hash) do |
|
|
|
|
query = |
|
|
|
|
from(tt in TokenTransfer, |
|
|
|
|
where: tt.token_contract_address_hash == ^hash and (tt.token_id == ^token_id or ^token_id in tt.token_ids) |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
Repo.exists?(query) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
defp boolean_to_check_result(true), do: :ok |
|
|
|
|
|
|
|
|
|
defp boolean_to_check_result(false), do: :not_found |
|
|
|
|