From ec9f419ce9c95d884183fe7a6cc5165f6d3fa39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aim=C3=A9=20Risson?= Date: Fri, 13 Jan 2023 11:52:39 +0100 Subject: [PATCH] Add genesisAddress query to graphql (#808) --- lib/archethic.ex | 2 +- lib/archethic_web/graphql_schema.ex | 11 +++++ lib/archethic_web/graphql_schema/resolver.ex | 10 +++++ test/archethic_web/graphql_schema_test.exs | 47 ++++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/lib/archethic.ex b/lib/archethic.ex index 26467129c..004951e9f 100644 --- a/lib/archethic.ex +++ b/lib/archethic.ex @@ -340,7 +340,7 @@ defmodule Archethic do TransactionChain.fetch_genesis_address_remotely(address) genesis_address -> - genesis_address + {:ok, genesis_address} end end diff --git a/lib/archethic_web/graphql_schema.ex b/lib/archethic_web/graphql_schema.ex index bec808e5a..5713a3423 100644 --- a/lib/archethic_web/graphql_schema.ex +++ b/lib/archethic_web/graphql_schema.ex @@ -50,6 +50,17 @@ defmodule ArchethicWeb.GraphQLSchema do end) end + @desc """ + Query the network to find the genesis address of a transaction + """ + field :genesis_address, :address do + arg(:address, non_null(:address)) + + resolve(fn %{address: address}, _ -> + Resolver.get_genesis_address(address) + end) + end + @desc """ Query the network to find the last transaction from an address """ diff --git a/lib/archethic_web/graphql_schema/resolver.ex b/lib/archethic_web/graphql_schema/resolver.ex index 0ccc076eb..5e1b4477f 100644 --- a/lib/archethic_web/graphql_schema/resolver.ex +++ b/lib/archethic_web/graphql_schema/resolver.ex @@ -22,6 +22,16 @@ defmodule ArchethicWeb.GraphQLSchema.Resolver do @limit_page 10 + def get_genesis_address(address) do + case Archethic.fetch_genesis_address_remotely(address) do + {:ok, genesis_address} -> + {:ok, genesis_address} + + _ -> + {:ok, address} + end + end + def get_balance(address) do case Archethic.get_balance(address) do {:ok, %{uco: uco, token: token_balances}} -> diff --git a/test/archethic_web/graphql_schema_test.exs b/test/archethic_web/graphql_schema_test.exs index 8cf4942f5..ba5e6f20b 100644 --- a/test/archethic_web/graphql_schema_test.exs +++ b/test/archethic_web/graphql_schema_test.exs @@ -519,6 +519,53 @@ defmodule ArchethicWeb.GraphQLSchemaTest do end end + describe "query: genesis_address" do + test "should return the genesis address", %{conn: conn} do + addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + + genesis_addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + + MockClient + |> stub(:send_message, fn _, %GetFirstAddress{}, _ -> + {:ok, %FirstAddress{address: genesis_addr}} + end) + + conn = + post(conn, "/api", %{ + "query" => "query { + genesisAddress(address: \"#{Base.encode16(addr)}\") + }" + }) + + assert %{ + "data" => %{ + "genesisAddress" => genesis + } + } = json_response(conn, 200) + + assert genesis == Base.encode16(genesis_addr) + end + + test "should return same address", %{conn: conn} do + addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + + conn = + post(conn, "/api", %{ + "query" => "query { + genesisAddress(address: \"#{Base.encode16(addr)}\") + }" + }) + + assert %{ + "data" => %{ + "genesisAddress" => genesis + } + } = json_response(conn, 200) + + assert genesis == Base.encode16(addr) + end + end + describe "query: transaction_inputs" do test "should return a list of ledger inputs", %{conn: conn} do addr = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>>