diff --git a/web/lib/zk_arcade/nft_poller.ex b/web/lib/zk_arcade/nft_poller.ex index 63cb3702..939cf483 100644 --- a/web/lib/zk_arcade/nft_poller.ex +++ b/web/lib/zk_arcade/nft_poller.ex @@ -49,6 +49,7 @@ defmodule ZkArcade.NftPoller do true -> with {:ok, latest_hex} <- Ethereumex.HttpClient.eth_block_number(url: rpc_url), latest_block <- hex_to_integer(latest_hex) do + from_block = max(from_block - 10, 0) process_range(contract_address, from_block, latest_block, state) else error -> @@ -82,7 +83,7 @@ defmodule ZkArcade.NftPoller do end end - defp fetch_logs(contract_address, from_block, to_block) do + def fetch_logs(contract_address, from_block, to_block) do filter = %{ address: contract_address, fromBlock: integer_to_hex(from_block), diff --git a/web/lib/zk_arcade/proofs.ex b/web/lib/zk_arcade/proofs.ex index 5ad31a4a..68e67f92 100644 --- a/web/lib/zk_arcade/proofs.ex +++ b/web/lib/zk_arcade/proofs.ex @@ -341,6 +341,8 @@ defmodule ZkArcade.Proofs do {:ok, updated_proof} -> Logger.info("Updated proof #{proof_id} status to claimed") + ZkArcade.PrometheusMetrics.increment_claims() + broadcast_proof_claimed_notification(updated_proof, address) {:ok, updated_proof} diff --git a/web/lib/zk_arcade/submission_poller.ex b/web/lib/zk_arcade/submission_poller.ex index 903ed86f..bdd5b928 100644 --- a/web/lib/zk_arcade/submission_poller.ex +++ b/web/lib/zk_arcade/submission_poller.ex @@ -36,7 +36,7 @@ defmodule ZkArcade.SubmissionPoller do with {:ok, latest_block} <- Ethereumex.HttpClient.eth_block_number(url: rpc_url), to_block <- String.to_integer(String.trim_leading(latest_block, "0x"), 16) do - + from_block = max(from_block - 10, 0) # Add a buffer of 10 block to avoid possible missing events Logger.info("Polling Claim Events from block #{from_block} to #{to_block}") with {:ok, logs} <- fetch_logs(from_block, to_block, contract_address) do @@ -66,7 +66,7 @@ defmodule ZkArcade.SubmissionPoller do # This function fetches logs from the blockchain based on the specified block range and contract address. # Constructs a filter for the logs and uses the Ethereumex HTTP client to retrieve them. If successful, # returns the logs; otherwise, it returns an error. - defp fetch_logs(from_block, to_block, contract_address) do + def fetch_logs(from_block, to_block, contract_address) do filter = %{ address: contract_address, fromBlock: "0x" <> Integer.to_string(from_block, 16), @@ -108,14 +108,6 @@ defmodule ZkArcade.SubmissionPoller do event_proof = ZkArcade.Proofs.get_proofs_by_address(user) |> Enum.find(fn proof -> proof.level_reached == level and proof.game_config == game_config_hex end) - ZkArcade.PrometheusMetrics.increment_claims() - if event_proof.status != "claimed" do - ZkArcade.Proofs.update_proof_status_claimed(user, event_proof.id, transaction_hash) - Logger.info("Proof for user #{user}, level #{level}, game config #{game_config_hex} marked as claimed.") - else - Logger.info("Proof for user #{user}, level #{level}, game config #{game_config_hex} already set as claimed.") - end - case ZkArcade.Leaderboard.insert_or_update_entry(%{ "user_address" => user, "score" => score @@ -126,6 +118,13 @@ defmodule ZkArcade.SubmissionPoller do {:error, changeset} -> Logger.error("Failed to create/update leaderboard entry: #{inspect(changeset)}") end + + if event_proof.status != "claimed" do + ZkArcade.Proofs.update_proof_status_claimed(user, event_proof.id, transaction_hash) + Logger.info("Proof for user #{user}, level #{level}, game config #{game_config_hex} marked as claimed.") + else + Logger.info("Proof for user #{user}, level #{level}, game config #{game_config_hex} already set as claimed.") + end end # This function extracts the user address, level, and score from the log data, and determines the event type.