Skip to content

Instantly share code, notes, and snippets.

@lukeledet
Created October 10, 2021 08:59

Revisions

  1. lukeledet created this gist Oct 10, 2021.
    64 changes: 64 additions & 0 deletions meeting.exs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,64 @@
    Mix.install([
    {:ethereumex, "~> 0.7.0"},
    {:ex_abi, "~> 0.5.2"},
    {:ex_keccak, path: "../ex_keccak", override: true} # fixed a bug locally
    ])

    # Application.put_env(:ethereumex, :url, "https://polygon-rpc.com/")
    Application.put_env(:ethereumex, :url, "https://rpc-mumbai.matic.today")

    defmodule MeetingScheduler do
    # testnet contract address
    @contract_address "0x9C55AE6cB109Bded7ee8336161D0a5c90EAAB897"

    def generate_schedule(start_date) do
    start_date = Date.from_iso8601!(start_date)

    engineers = get_engineers()

    engineers
    |> Enum.reduce([], fn engineer, [{date, _}|_] = acc ->
    next_date = Date.add(date, 7)

    if next_date.day <= 7 do
    [{Date.add(next_date, 7), engineer} | [{next_date, "Planning"} | acc]]
    else
    [{next_date, engineer} | acc]
    end
    engineer, acc ->
    if start_date.day <= 7 do
    [{Date.add(start_date, 7), engineer} | [{start_date, "Planning"} | acc]]
    else
    [{start_date, engineer} | acc]
    end
    end)
    |> Enum.reverse()
    |> IO.inspect
    end

    def get_engineers() do
    abi_encoded_data =
    ABI.encode("getAgenda()", [])
    |> Base.encode16(case: :lower)

    ethereum_call(@contract_address, abi_encoded_data)
    end

    defp ethereum_call(address, data) do
    {:ok, result} =
    Ethereumex.HttpClient.eth_call(%{
    data: "0x" <> data,
    to: address
    })

    result
    |> String.slice(2..-1)
    |> Base.decode16!(case: :lower)
    |> ABI.TypeDecoder.decode_raw([{:array, :string}])
    |> List.first()
    end
    end

    [start_date|_] = System.argv()

    MeetingScheduler.generate_schedule(start_date)