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.
Installation
Add fireblocks_contract to your list of dependencies in mix.exs:
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:
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:
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:
# 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:
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