diff --git a/lib/archethic/contracts/interpreter/legacy.ex b/lib/archethic/contracts/interpreter/legacy.ex index cbb47f89a..49979877c 100644 --- a/lib/archethic/contracts/interpreter/legacy.ex +++ b/lib/archethic/contracts/interpreter/legacy.ex @@ -66,21 +66,22 @@ defmodule Archethic.Contracts.Interpreter.Legacy do address: nil, authorized_keys: nil, code: nil, - content: { - :>, - [line: 11], + content: {:>, [line: 11], [ - { - :==, - [line: 11], - [ - {:get_in, [line: 11], [{:scope, [line: 11], nil}, ["transaction", "content"]]}, - {{:., [line: 11], [{:__aliases__, [alias: Archethic.Contracts.Interpreter.Legacy.Library], [:Library]}, :json_path_extract]}, [line: 11], [{:get_in, [line: 11], [{:scope, [line: 11], nil}, ["transaction", "content"]]}, "$.uco.eur"]} - ] - }, - 1 - ] - }, + {{:., [line: 11], + [ + {:__aliases__, + [alias: Archethic.Contracts.Interpreter.Legacy.Library], + [:Library]}, + :json_path_extract + ]}, [line: 11], + [ + {:get_in, [line: 11], + [{:scope, [line: 11], nil}, ["transaction", "content"]]}, + "$.uco.eur" + ]}, + 1 + ]}, origin_family: :all, previous_public_key: nil, secrets: nil, diff --git a/lib/archethic/contracts/interpreter/legacy/condition_interpreter.ex b/lib/archethic/contracts/interpreter/legacy/condition_interpreter.ex index 192039037..265d2a37f 100644 --- a/lib/archethic/contracts/interpreter/legacy/condition_interpreter.ex +++ b/lib/archethic/contracts/interpreter/legacy/condition_interpreter.ex @@ -476,7 +476,7 @@ defmodule Archethic.Contracts.Interpreter.Legacy.ConditionInterpreter do # Flatten comparison operations defp to_boolean_expression({op, _, [{:==, metadata, [{:get_in, _, _}, comp_a]}, comp_b]}, _, _) - when op in [:==, :>=, :<=] do + when op in [:==, :>=, :<=, :>, :<] do {op, metadata, [comp_a, comp_b]} end diff --git a/test/archethic/contracts/interpreter/legacy/condition_interpreter_test.exs b/test/archethic/contracts/interpreter/legacy/condition_interpreter_test.exs index cc92efe27..89753e1cb 100644 --- a/test/archethic/contracts/interpreter/legacy/condition_interpreter_test.exs +++ b/test/archethic/contracts/interpreter/legacy/condition_interpreter_test.exs @@ -364,5 +364,57 @@ defmodule Archethic.Contracts.Interpreter.Legacy.ConditionInterpreterTest do } }) end + + test "should validate condition on uco_transfers size" do + address = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + + assert Interpreter.sanitize_code(~s""" + condition transaction: [ + uco_transfers: size() < 10 + ] + """) + |> elem(1) + |> ConditionInterpreter.parse() + |> elem(2) + |> ConditionInterpreter.valid_conditions?(%{ + "transaction" => %{ + "uco_transfers" => %{"#{address}" => 12} + } + }) + end + + test "should invalidate condition on uco_transfers size" do + address = <<0::8, 0::8, :crypto.strong_rand_bytes(32)::binary>> + + refute Interpreter.sanitize_code(~s""" + condition transaction: [ + uco_transfers: size() > 10 + ] + """) + |> elem(1) + |> ConditionInterpreter.parse() + |> elem(2) + |> ConditionInterpreter.valid_conditions?(%{ + "transaction" => %{ + "uco_transfers" => %{"#{address}" => 12} + } + }) + end + + test "should validate oracle condition" do + assert Interpreter.sanitize_code(~s""" + condition oracle: [ + content: json_path_extract(\"$.uco.eur\") > 1 + ] + """) + |> elem(1) + |> ConditionInterpreter.parse() + |> elem(2) + |> ConditionInterpreter.valid_conditions?(%{ + "transaction" => %{ + "content" => Jason.encode!(%{uco: %{eur: 2}}) + } + }) + end end end