# Fireblocks Contract

An Elixir library for reading Solidity ABI JSON files and turning them into
Elixir modules with proper documentation on each method, built on top of the
[Fireblocks SDK](https://github.com/csokun/fireblocks_sdk).

## Installation

Add `fireblocks_contract` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:fireblocks_contract, "~> 0.1"},
    {:fireblocks_sdk, "~> 0.2"}
  ]
end
```

## Usage

### 1. Define a contract module

Point `use Fireblocks.Evm.Contract` at your ABI file:

```elixir
defmodule MyApp.Contracts.ERC20 do
  use Fireblocks.Evm.Contract,
    abi_file: "priv/abi/erc20.json"
end
```

You can also supply a default deployed address and a default Fireblocks base
asset ID so you don't have to repeat them on every call:

```elixir
defmodule MyApp.Contracts.ERC20 do
  use Fireblocks.Evm.Contract,
    abi_file: "priv/abi/erc20.json",
    default_address: "0xA0b8...FeAb",
    default_base_asset_id: "ETH"
end
```

### 2. Reading contract state

Every ABI function becomes a snake\_cased Elixir function that returns an
`%Fireblocks.Evm.Contract.Call{}` struct. Pipe it into `Fireblocks.Evm.Contract.read/2`:

```elixir
# Read the token name
MyApp.Contracts.ERC20.name()
|> Fireblocks.Evm.Contract.read(
  baseAssetId: "ETH",
  contractAddress: "0xA0b8...FeAb"
)
# {:ok, ["My Token"]}

# Read a token balance
MyApp.Contracts.ERC20.balance_of("0x...")
|> Fireblocks.Evm.Contract.read(
  baseAssetId: "ETH",
  contractAddress: "0xA0b8...FeAb"
)
# {:ok, [raw_balance]}
```

### 3. Writing contract state

Use `Fireblocks.Evm.Contract.write/2` for state-changing functions.  The call is
executed as a Fireblocks on-chain transaction and returns a transaction ID:

```elixir
MyApp.Contracts.ERC20.transfer("0xDest...", 1_000_000)
|> Fireblocks.Evm.Contract.write(
  baseAssetId: "ETH",
  contractAddress: "0xA0b8...FeAb",
  vaultAccountId: "1",
  feeLevel: :medium,
  note: "monthly distribution",
  useGasless: false
)
# {:ok, %{"txId" => "4514c3e5-6520-400d-8980-1a1b940a0cb0"}}
```

## License

MIT
