diff --git a/lib/archethic/transaction_chain/transaction/data/recipient.ex b/lib/archethic/transaction_chain/transaction/data/recipient.ex index 37d8532674..9f56311ad1 100644 --- a/lib/archethic/transaction_chain/transaction/data/recipient.ex +++ b/lib/archethic/transaction_chain/transaction/data/recipient.ex @@ -14,8 +14,8 @@ defmodule Archethic.TransactionChain.TransactionData.Recipient do @type t :: %__MODULE__{ address: Crypto.prepended_hash(), - action: String.t(), - args: list(any()) + action: String.t() | nil, + args: list(any()) | nil } @doc """ diff --git a/lib/archethic/utils/regression/api.ex b/lib/archethic/utils/regression/api.ex index 8429a13192..615292b2f7 100644 --- a/lib/archethic/utils/regression/api.ex +++ b/lib/archethic/utils/regression/api.ex @@ -14,6 +14,7 @@ defmodule Archethic.Utils.Regression.Api do alias Archethic.TransactionChain.TransactionData.TokenLedger alias Archethic.TransactionChain.TransactionData.TokenLedger.Transfer, as: TokenTransfer alias Archethic.TransactionChain.TransactionData.Ownership + alias Archethic.TransactionChain.TransactionData.Recipient alias Archethic.TransactionChain.TransactionData.UCOLedger alias Archethic.TransactionChain.TransactionData.UCOLedger.Transfer, as: UCOTransfer @@ -31,7 +32,7 @@ defmodule Archethic.Utils.Regression.Api do ) |> Enum.at(0) - @faucet_seed Application.compile_env(:archethic, [ArchethicWeb.FaucetController, :seed]) + @faucet_seed Application.compile_env(:archethic, [ArchethicWeb.Explorer.FaucetController, :seed]) defstruct [ :host, @@ -559,7 +560,10 @@ defmodule Archethic.Utils.Regression.Api do }, "code" => code, "content" => Base.encode16(content), - "recipients" => Enum.map(recipients, &Base.encode16(&1)), + "recipients" => + Enum.map(recipients, fn %Recipient{address: address, action: action, args: args} -> + %{"address" => Base.encode16(address), "action" => action, "arg" => args} + end), "ownerships" => Enum.map(ownerships, fn %Ownership{ secret: secret, diff --git a/lib/archethic/utils/regression/playbooks/smart_contract.ex b/lib/archethic/utils/regression/playbooks/smart_contract.ex index 54b548f3dc..ef1b8086c4 100644 --- a/lib/archethic/utils/regression/playbooks/smart_contract.ex +++ b/lib/archethic/utils/regression/playbooks/smart_contract.ex @@ -10,13 +10,13 @@ defmodule Archethic.Utils.Regression.Playbook.SmartContract do alias Archethic.TransactionChain.TransactionData alias Archethic.TransactionChain.TransactionData.Ownership + alias Archethic.TransactionChain.TransactionData.Recipient alias Archethic.Utils.Regression.Api alias Archethic.Utils.WebSocket.Client, as: WSClient alias __MODULE__.Counter alias __MODULE__.Legacy - alias __MODULE__.Faucet alias __MODULE__.UcoAth require Logger @@ -42,8 +42,6 @@ defmodule Archethic.Utils.Regression.Playbook.SmartContract do Counter.play(storage_nonce_pubkey, endpoint) Logger.info("============== CONTRACT: LEGACY ==============") Legacy.play(storage_nonce_pubkey, endpoint) - Logger.info("============== CONTRACT: FAUCET ==============") - Faucet.play(storage_nonce_pubkey, endpoint) Logger.info("============== CONTRACT: UCO ATH ==============") UcoAth.play(storage_nonce_pubkey, endpoint) end @@ -103,7 +101,7 @@ defmodule Archethic.Utils.Regression.Playbook.SmartContract do :transfer, %TransactionData{ content: Keyword.get(opts, :content, ""), - recipients: [contract_address] + recipients: [%Recipient{address: contract_address}] }, endpoint ) diff --git a/lib/archethic/utils/regression/playbooks/smart_contract/faucet.ex b/lib/archethic/utils/regression/playbooks/smart_contract/faucet.ex deleted file mode 100644 index a4b3a821b5..0000000000 --- a/lib/archethic/utils/regression/playbooks/smart_contract/faucet.ex +++ /dev/null @@ -1,103 +0,0 @@ -defmodule Archethic.Utils.Regression.Playbook.SmartContract.Faucet do - @moduledoc """ - This contract is triggered at a specific date and will transfer some UCOs - to all callers (only once per chain) - """ - - alias Archethic.TransactionChain.TransactionData - alias Archethic.Utils - alias Archethic.Utils.Regression.Api - alias Archethic.Utils.Regression.Playbook.SmartContract - - require Logger - - def play(storage_nonce_pubkey, endpoint) do - contract_seed = SmartContract.random_seed() - trigger1_seed = SmartContract.random_seed() - trigger2_seed = SmartContract.random_seed() - trigger3_seed = SmartContract.random_seed() - - now = DateTime.utc_now() - - faucet_time = - if now.second > 50 do - # if we're too close to the next tick, we'll add one more minute to be sure - %DateTime{(now |> DateTime.add(2, :minute)) | second: 0, microsecond: {0, 0}} - else - %DateTime{(now |> DateTime.add(1, :minute)) | second: 0, microsecond: {0, 0}} - end - - Api.send_funds_to_seeds( - %{ - contract_seed => 1000, - trigger1_seed => 1, - trigger2_seed => 1, - trigger3_seed => 1 - }, - endpoint - ) - - contract_address = - SmartContract.deploy( - contract_seed, - %TransactionData{ - code: contract_code(faucet_time) - }, - storage_nonce_pubkey, - endpoint - ) - - _ = SmartContract.trigger(trigger1_seed, contract_address, endpoint) - trigger1_tx = SmartContract.trigger(trigger1_seed, contract_address, endpoint) - trigger2_tx = SmartContract.trigger(trigger2_seed, contract_address, endpoint) - trigger3_tx = SmartContract.trigger(trigger3_seed, contract_address, endpoint) - - # wait for the tick (+ delta) - sleep_time = DateTime.diff(faucet_time, DateTime.utc_now(), :millisecond) + 1_000 - Logger.debug("Sleeping for (#{div(sleep_time, 1000)} seconds)") - Process.sleep(sleep_time) - - faucet_amount = Utils.to_bigint(5) - inputs1 = Api.get_inputs(trigger1_tx, endpoint) - inputs2 = Api.get_inputs(trigger2_tx, endpoint) - inputs3 = Api.get_inputs(trigger3_tx, endpoint) - - if Enum.all?([inputs1, inputs2, inputs3], fn inputs -> - 1 == - inputs - |> Enum.filter(&(&1["amount"] == faucet_amount)) - |> Enum.count() - end) do - Logger.info("Smart contract 'faucet' transferred the correct funds") - else - Logger.error("Smart contract 'faucet' did not transfer the funds correctly") - end - end - - defp contract_code(datetime) do - ~S""" - @version 1 - - # GENERATED BY PLAYBOOK - - condition transaction: [] - - actions triggered_by: datetime, at: ##DATETIME## do - now = Time.now() - - content = "" - for call in Contract.get_calls() do - genesis_address = Chain.get_genesis_address(call.address) - - if Regex.extract(content, genesis_address) == "" do - Contract.add_uco_transfer(to: genesis_address, amount: 5) - content = "#{content}#{genesis_address},#{now}\n" - end - end - - Contract.set_content(content) - end - """ - |> String.replace("##DATETIME##", datetime |> DateTime.to_unix() |> Integer.to_string()) - end -end