lib/contract.ex

defmodule NearApi.Contract do
  @moduledoc """
  NearApi Contract struct
  Contains account, contract_id, and params for the contract call
  """

  @type t :: %__MODULE__{
          account: NearApi.Account.t(),
          contract_id: String.t(),
          params: map()
        }

  @gas 300_000_000_000_000

  defstruct [
    :account,
    :contract_id,
    :params
  ]

  @doc """
  Function to call a NEAR Contract method.
    `account` - an account strut NearApi.Account where `account_id` and `key_pair`
      - `key_pair` should contain public_key
    `contract_id` - string value of the Near Contract ID, e.g. `nft.mintbot.near`
    `method` - string value of the contract method, e.g. `mint_nft`
    `args` - arguments for the `method` of the contract
  """
  @spec call(caller_account :: NearApi.Account.t(), contract_id :: String.t(), method :: String.t(), params :: map) ::
          {:ok, body :: map} | NearApi.RPC.Errors.t()
  def call(caller_account, contract_id, method, args) do
    args_encoded = Jason.encode!(args)

    action = %NearApi.Actions.FunctionCall{
      method_name: method,
      args: args_encoded,
      gas: @gas,
      amount: 0
    }

    {:ok, tx} = NearApi.Transaction.create_transaction(caller_account, contract_id, [action])

    tx
    |> NearApi.Transaction.payload(caller_account.key_pair)
    |> NearApi.RPC.Transactions.send_transaction_commit()
  end
end