⚠️
eosiac
is currently under active development and a beta release. It is not yet recommended for production use. If you want to get involved, see the Contributing guidelines.
eosiac
eosiac
(EOS Infrastructure-as-code) is an Infrastructure-as-code tool to manage EOS accounts for complex dapps.
Dapps involve many accounts that require non-trivial setup (permissions, code, tokens, RAM, CPU, NET) often in multiple environments (mainnet, testnet, dev).
eosiac
automates the whole process by defining these environments in a declarative way through human-readable files that are easy to understand even for non-developers.
Features
- configured through simple-to-read configuration files
- support for several environments
- create accounts
- create/update permissions including keys, accounts, and weights
- stake CPU/NET
- buy RAM
- link permissions (only on EOS Mainnet, Jungle, and Kylin environmnets)
- upload code / abi
- distribute any token
- sign with hard-coded private keys or Scatter
- use ONLY_BILL_FIRST_AUTHORIZER to pay for transactions (see cpu_payer object)
- fully idempotent: only runs actions that are necessary to bring the environment to the specified setup - making it safe to script abortions, re-runs, running in CI
Additional features:
- scaffold contract actions through the
create-actions
command - create vanity EOS public keys (
eosiac create-keys --help
) - get public key for a private key (
eosiac key-to-public --help
)
Configuration Example
Configurations are stored in an eosiac.yml
YAML-file and define environments and accounts in a declarative way by specifying the desired state of the accounts.
---dev: chain_id: cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f node_endpoint: http://localhost:7777 accounts_manager: eosio # account signing the new_account actions (needed when creating the accounts for the first time) funds_manager: eosio # account distributing tokens to accounts (liquid ones but also for staking) ram_manager: eosio # account buying RAM for accounts accounts: eosio: signature: type: key private_keys: - 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 account123: signature: type: key private_keys: - 5JxfmGBJkKqHhcfmbGnwuhjrzxg3bd7D46hEpT8V634L2G7ptLr # active - 5K5stUB6Do1XKvNCKv4Qh7JtPWzGd6sm12bBnRSD5gaA76a8TFE # owner, for _updateauth_ auth: owner: permissions: - EOS8ktnmUMpc5GLFwBa5bp3n2djwBUuV7BcZR3fS1dxQ7RFzQLf6v active: # parent: owner # implicit for active threshold: 2 permissions: - EOS7RTtzjKfoTBt4WR6ZMVgCfuM51fj4AbyzexhCqFWUk8BbK2EG7 2 - dapptoken@eosio.code 1 - wait@600 1 ops: parent: owner threshold: 1 permissions: - EOS62mKPAN7T48aPdi8ZYRcPFWURgw9JMjz52yxijDAwRV8GwCzmY tokens: - account: eosio.token amount: 1.0000 EOS code: examples/contracts/hello/hello.wasm abi: examples/contracts/hello/hello.abi kylin: chain_id: 5fff1dae8dc8e2fc4d5b23b2c7665c97f9e9d8edf2b6485a86ba311c25639191 node_endpoint: https://api-kylin.eoslaomao.com accounts_manager: eosiactester # account signing the new_account actions (needed when creating the accounts for the first time) funds_manager: eosiactester # account distributing tokens to accounts (liquid ones but also for staking) ram_manager: eosiactester # account buying RAM for accounts # if you want to use the OBFA feature to pay for CPU/NET cpu_payer: account: cmichelkylin permission: payforcpu key: 5KMMoB5yStEbHsWNTaCie55rN2ZswnxqDiWuta2nG88AfEPo3X4 action: cmichelkylin@payforcpu # the noop action to insert as first action of the tx accounts: eosiactester: signature: type: scatter cpu: - delegate_to: eosiactester amount: 100000 - delegate_to: eosiactestxx amount: 100000 net: - delegate_to: eosiactester amount: 10000 - delegate_to: eosiactestxx amount: 10000 auth: owner: permissions: - EOS7dbJSQxad9BwYVBSugD4J9fBWEkZXYLuVjhQTPUTRqmmpQDzqq active: permissions: - EOS7dbJSQxad9BwYVBSugD4J9fBWEkZXYLuVjhQTPUTRqmmpQDzqq eosiactestxx: signature: type: scatter auth: owner: permissions: - EOS7hf99wqEqmibs9VC5Tvmv94ym6JaRgbjGVLGFkffdZZYxLrweR active: permissions: - EOS7hf99wqEqmibs9VC5Tvmv94ym6JaRgbjGVLGFkffdZZYxLrweR xtransfer: parent: active permissions: - EOS6TJmDVcHe94P4i3rtRMRS8rveE4oG7Zqxz2s1zj9sL5ekvLtkH links: - eosio.token@transfer - eosio.token@issue ram: 100000 tokens: - account: eosio.token amount: 0.1337 EOS code: examples/contracts/hello/hello.wasm abi: examples/contracts/hello/hello.abi jungle: chain_id: e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473 node_endpoint: https://jungle2.cryptolions.io:443 accounts_manager: someaccnt funds_manager: someaccnt ram_manager: someaccnt waxtest: chain_id: f16b1833c747c43682f4386fca9cbb327929334a762755ebec17f6f23c9b8a12 system_contract: eosio.token system_symbol: 8,WAX node_endpoint: https://waxtestnet.greymass.com accounts_manager: someaccnt funds_manager: someaccnt ram_manager: someaccnt wax: chain_id: 1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4 system_contract: eosio.token system_symbol: 8,WAX node_endpoint: https://chain.wax.io:443 accounts_manager: someaccnt funds_manager: someaccnt ram_manager: someaccnt mainnet: chain_id: aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906 node_endpoint: https://public.eosinfra.io accounts_manager: someaccnt funds_manager: someaccnt ram_manager: someaccnt
Usage
eosiac apply <environment> [--config path] eosiac apply dev # will look for an `eosiac.yml` file in current directory eosiac apply mainnet --config 'configs/eos_config.yml'
Upon running the tool on a configuration, it will determine the actions that need to be run to bring the accounts to the desired state.
To sign the transactions, signatures need to be configured on the *_manager
accounts.
Currently supported signature providers are:
- directly providing the private-keys (recommened for
dev
environments only) - Scatter
The tool's execution is idempotent - meaning if the blockchain is already in the desired state, it will do nothing.
Scaffolding actions
eosiac create-actions <environment> <account>
Contributing
To get involved please join or create a discussion in the GitHub issues.