Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48522d02e7 | ||
| 92794a2e3b | |||
|
|
6f04de8d7e | ||
| 71bf1e15c4 | |||
| 32ba29354a | |||
|
|
fb818a529c | ||
| f7d0503c7b | |||
|
|
a862a73d7c | ||
| f4e370cb5d | |||
|
|
69bbbd7c8b | ||
| b51d1e92d7 |
@@ -1,4 +0,0 @@
|
|||||||
- 0.0.2
|
|
||||||
* Add executable entry point in package install
|
|
||||||
- 0.0.1
|
|
||||||
* Token creation setup for eth
|
|
||||||
23
CHANGELOG.md
23
CHANGELOG.md
@@ -2,6 +2,29 @@
|
|||||||
|
|
||||||
<!--next-version-placeholder-->
|
<!--next-version-placeholder-->
|
||||||
|
|
||||||
|
## v0.2.3 (2022-03-22)
|
||||||
|
### Fix
|
||||||
|
* Remove this ([`92794a2`](https://git.grassecon.net/cicnet/cic-cli/commit/92794a2e3b2fc5ace63f519bbe5b23c542afc853))
|
||||||
|
|
||||||
|
## v0.2.2 (2022-03-22)
|
||||||
|
### Fix
|
||||||
|
* Enfore upper case symbol name ([`71bf1e1`](https://git.grassecon.net/cicnet/cic-cli/commit/71bf1e15c4a217111ae6f6568814985a9d5b960f))
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
* Update bange urls ([`32ba293`](https://git.grassecon.net/cicnet/cic-cli/commit/32ba29354ae53bf8166bef4d117667aa314a6cfe))
|
||||||
|
|
||||||
|
## v0.2.1 (2022-03-16)
|
||||||
|
### Fix
|
||||||
|
* Update config paths ([`f7d0503`](https://git.grassecon.net/cicnet/cic-cli/commit/f7d0503c7b85d96588bf1a75fdf1cce27acf1460))
|
||||||
|
|
||||||
|
## v0.2.0 (2022-03-16)
|
||||||
|
### Feature
|
||||||
|
* Copy base configs to user configs ([`f4e370c`](https://git.grassecon.net/cicnet/cic-cli/commit/f4e370cb5db79c74abe26179f5b15bd079bdd066))
|
||||||
|
|
||||||
|
## v0.1.1 (2022-03-16)
|
||||||
|
### Fix
|
||||||
|
* Update configs ([`b51d1e9`](https://git.grassecon.net/cicnet/cic-cli/commit/b51d1e92d7ae1e3b91ca50c036ffd58e762df24b))
|
||||||
|
|
||||||
## v0.1.0 (2022-03-16)
|
## v0.1.0 (2022-03-16)
|
||||||
### Feature
|
### Feature
|
||||||
* Add interactive deployment and switch to poetry' ([#2](https://git.grassecon.net/cicnet/cic-cli/issues/2)) ([`0fcf2eb`](https://git.grassecon.net/cicnet/cic-cli/commit/0fcf2eb3bc807111db02e9e47e469ec0a965797f))
|
* Add interactive deployment and switch to poetry' ([#2](https://git.grassecon.net/cicnet/cic-cli/issues/2)) ([`0fcf2eb`](https://git.grassecon.net/cicnet/cic-cli/commit/0fcf2eb3bc807111db02e9e47e469ec0a965797f))
|
||||||
|
|||||||
71
README.md
71
README.md
@@ -1,53 +1,23 @@
|
|||||||
# CIC Token Deployment Tool
|
# CIC Token Deployment Tool
|
||||||
[](https://ci.grassecon.net/grassrootseconomics/cic)
|
[](https://ci.grassecon.net/grassrootseconomics/cic)
|
||||||
[](https://pypi.org/project/cic/)
|
[](https://pypi.org/project/cic/)
|
||||||
|
|
||||||
CIC-CLI provides tooling to generate and publish metadata in relation to
|
CIC-CLI provides tooling to generate and publish metadata in relation to
|
||||||
token deployments.
|
token deployments.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
pip install --extra-index-url https://pip.grassrootseconomics.net cic[eth]
|
pip install cic-cli[eth]
|
||||||
```
|
```
|
||||||
## Setup
|
|
||||||
### Requirements
|
|
||||||
- Install [poetry](https://python-poetry.org/docs/#installation)
|
|
||||||
<details>
|
|
||||||
<summary>Install Kubectl</summary>
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y apt-transport-https ca-certificates curl
|
|
||||||
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
|
|
||||||
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y kubectl
|
|
||||||
```
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### Deploy to the testnet
|
|
||||||
|
|
||||||
- Download testnet cluster config from https://cloud.digitalocean.com/kubernetes/clusters
|
|
||||||
- Move the config to `$HOME/.kube/`
|
|
||||||
- Run `kubectl -n grassroots --kubeconfig=$HOME/.kube/<config_file_name>.yaml get pods`
|
|
||||||
- Copy the name of the meta pod (e.g `cic-meta-server-67dc7c6468-8rhdq`)
|
|
||||||
- Port foward the meta pod to the local machine using `kubectl port-forward pods/<name_of_meta_pod> 6700:8000 -n grassroots --kubeconfig=$HOME/.kube/<config_file_name>.yaml`
|
|
||||||
- Clone this repository to your local machine
|
|
||||||
- Run `poetry install -E eth` in the repo root
|
|
||||||
- Open `./config/testnet/config.ini` and change
|
|
||||||
- [auth]keyfile_path
|
|
||||||
- [wallet]key_file
|
|
||||||
- Open a new terminal and run `poetry run cic wizard -c ./config/testnet ./somewhere`
|
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
### Using the wizard
|
### Using the wizard
|
||||||
|
First make sure that you edit the configs below to add your paths for `[auth]keyfile_path` and `[wallet]keyfile`
|
||||||
|
The configs are located in `~/.config/cic/cli/config/`
|
||||||
```
|
```
|
||||||
# Local
|
# Local
|
||||||
cic wizard ./somewhere -c ./config/docker
|
cic wizard ./somewhere -c ~/.config/cic/cli/config/docker
|
||||||
|
|
||||||
# Test Net
|
# Test Net
|
||||||
cic wizard ./somewhere -c ./config/testnet
|
cic wizard ./somewhere -c ~/.config/cic/cli/config/testnet
|
||||||
|
|
||||||
```
|
```
|
||||||
### Modular
|
### Modular
|
||||||
Some of the concepts described below assume familiarity with base
|
Some of the concepts described below assume familiarity with base
|
||||||
@@ -76,6 +46,8 @@ state of the package contains interface to EVM only. Thus, the examples
|
|||||||
below are limited to the context of the EVM.
|
below are limited to the context of the EVM.
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
### Requirements
|
||||||
|
- Install [poetry](https://python-poetry.org/docs/#installation)
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
|
|
||||||
@@ -97,6 +69,31 @@ below are limited to the context of the EVM.
|
|||||||
- Save the private key to a file
|
- Save the private key to a file
|
||||||
- Run `eth-keyfile -k <file> > ~/.config/cic/keystore/keyfile.json`
|
- Run `eth-keyfile -k <file> > ~/.config/cic/keystore/keyfile.json`
|
||||||
|
|
||||||
|
### Port Forwarding
|
||||||
|
<details>
|
||||||
|
<summary>Install Kubectl</summary>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y apt-transport-https ca-certificates curl
|
||||||
|
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
|
||||||
|
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y kubectl
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
- Download testnet cluster config from https://cloud.digitalocean.com/kubernetes/clusters
|
||||||
|
- Move the config to `$HOME/.kube/`
|
||||||
|
- Run `kubectl -n grassroots --kubeconfig=$HOME/.kube/<config_file_name>.yaml get pods`
|
||||||
|
- Copy the name of the meta pod (e.g `cic-meta-server-67dc7c6468-8rhdq`)
|
||||||
|
- Port foward the meta pod to the local machine using `kubectl port-forward pods/<name_of_meta_pod> 6700:8000 -n grassroots --kubeconfig=$HOME/.kube/<config_file_name>.yaml`
|
||||||
|
- Clone this repository to your local machine
|
||||||
|
- Run `poetry install -E eth` in the repo root
|
||||||
|
- Open `./cic/config/testnet/config.ini` and change
|
||||||
|
- [auth]keyfile_path
|
||||||
|
- [wallet]key_file
|
||||||
|
- Open a new terminal and run `poetry run cic wizard -c ./cic/config/testnet ./somewhere`
|
||||||
### Tests
|
### Tests
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
__version__ = "0.1.0"
|
__version__ = "0.2.3"
|
||||||
|
|||||||
15
cic/config.py
Normal file
15
cic/config.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
default_module_configs = os.path.join(os.path.dirname(os.path.realpath(__file__)), '.', 'configs')
|
||||||
|
|
||||||
|
def ensure_base_configs(config_dir: str):
|
||||||
|
"""
|
||||||
|
Ensure that the base configs are present.
|
||||||
|
"""
|
||||||
|
if not os.path.exists(config_dir):
|
||||||
|
os.makedirs(config_dir)
|
||||||
|
for f in os.listdir(default_module_configs):
|
||||||
|
if not os.path.exists(os.path.join(config_dir, f)):
|
||||||
|
shutil.copytree(os.path.join(default_module_configs, f), os.path.join(config_dir, f))
|
||||||
|
|
||||||
@@ -8,11 +8,11 @@ ext_writer = cic.writers.KVWriter
|
|||||||
registry_address = 0x999487d8B1EC2b2ac9F4a9D1A6D35a24D75D7EF4
|
registry_address = 0x999487d8B1EC2b2ac9F4a9D1A6D35a24D75D7EF4
|
||||||
|
|
||||||
[meta]
|
[meta]
|
||||||
url = https://meta.grassecon.net
|
url = https://meta.grassecon.org
|
||||||
http_origin =
|
http_origin =
|
||||||
|
|
||||||
[rpc]
|
[rpc]
|
||||||
provider = https://rpc.kitabu.grassecon.net
|
provider = https://rpc.kitabu.grassecon.org
|
||||||
|
|
||||||
[auth]
|
[auth]
|
||||||
type = gnupg
|
type = gnupg
|
||||||
@@ -8,7 +8,7 @@ ext_writer = cic.writers.KVWriter
|
|||||||
registry_address = 0xcf60ebc445b636a5ab787f9e8bc465a2a3ef8299
|
registry_address = 0xcf60ebc445b636a5ab787f9e8bc465a2a3ef8299
|
||||||
|
|
||||||
[meta]
|
[meta]
|
||||||
url = http://localhost:6700
|
url = https://meta.grassecon.net
|
||||||
http_origin =
|
http_origin =
|
||||||
|
|
||||||
[rpc]
|
[rpc]
|
||||||
@@ -40,7 +40,7 @@ class Token(Data):
|
|||||||
):
|
):
|
||||||
super(Token, self).__init__()
|
super(Token, self).__init__()
|
||||||
self.name = name
|
self.name = name
|
||||||
self.symbol = symbol
|
self.symbol = symbol.upper()
|
||||||
self.supply = supply
|
self.supply = supply
|
||||||
self.precision = precision
|
self.precision = precision
|
||||||
self.code = code
|
self.code = code
|
||||||
@@ -57,6 +57,7 @@ class Token(Data):
|
|||||||
|
|
||||||
self.name = input(f"Enter Token Name ({self.name}): ") or self.name
|
self.name = input(f"Enter Token Name ({self.name}): ") or self.name
|
||||||
self.symbol = input(f"Enter Token Symbol ({self.symbol}): ") or self.symbol
|
self.symbol = input(f"Enter Token Symbol ({self.symbol}): ") or self.symbol
|
||||||
|
self.symbol = self.symbol.upper()
|
||||||
self.precision = input(f"Enter Token Precision ({self.precision}): ") or self.precision
|
self.precision = input(f"Enter Token Precision ({self.precision}): ") or self.precision
|
||||||
self.supply = input(f"Enter Token Supply ({self.supply}): ") or self.supply
|
self.supply = input(f"Enter Token Supply ({self.supply}): ") or self.supply
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ class Token(Data):
|
|||||||
o = json.load(f)
|
o = json.load(f)
|
||||||
|
|
||||||
self.name = o["name"]
|
self.name = o["name"]
|
||||||
self.symbol = o["symbol"]
|
self.symbol = o["symbol"].upper()
|
||||||
self.precision = o["precision"]
|
self.precision = o["precision"]
|
||||||
self.code = o["code"]
|
self.code = o["code"]
|
||||||
self.supply = o["supply"]
|
self.supply = o["supply"]
|
||||||
@@ -100,7 +101,7 @@ class Token(Data):
|
|||||||
with open(token_template_file_path, encoding="utf-8") as f:
|
with open(token_template_file_path, encoding="utf-8") as f:
|
||||||
o = json.load(f)
|
o = json.load(f)
|
||||||
o["name"] = self.name
|
o["name"] = self.name
|
||||||
o["symbol"] = self.symbol
|
o["symbol"] = self.symbol.upper()
|
||||||
o["precision"] = self.precision
|
o["precision"] = self.precision
|
||||||
o["code"] = self.code
|
o["code"] = self.code
|
||||||
o["supply"] = self.supply
|
o["supply"] = self.supply
|
||||||
@@ -115,7 +116,7 @@ class Token(Data):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
s = f"name = {self.name}\n"
|
s = f"name = {self.name}\n"
|
||||||
s += f"symbol = {self.symbol}\n"
|
s += f"symbol = {self.symbol.upper()}\n"
|
||||||
s += f"precision = {self.precision}\n"
|
s += f"precision = {self.precision}\n"
|
||||||
s += f"supply = {self.supply}\n"
|
s += f"supply = {self.supply}\n"
|
||||||
for idx, extra in enumerate(self.extra_args):
|
for idx, extra in enumerate(self.extra_args):
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import cic.cmd.show as cmd_show
|
|||||||
import cic.cmd.ext as cmd_ext
|
import cic.cmd.ext as cmd_ext
|
||||||
import cic.cmd.export as cmd_export
|
import cic.cmd.export as cmd_export
|
||||||
import cic.cmd.wizard as cmd_wizard
|
import cic.cmd.wizard as cmd_wizard
|
||||||
|
from cic.config import ensure_base_configs
|
||||||
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
logging.basicConfig(level=logging.WARNING)
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
@@ -21,6 +22,7 @@ script_dir = os.path.dirname(os.path.realpath(__file__))
|
|||||||
data_dir = os.path.join(script_dir, '..', 'data')
|
data_dir = os.path.join(script_dir, '..', 'data')
|
||||||
base_config_dir = os.path.join(data_dir, 'config')
|
base_config_dir = os.path.join(data_dir, 'config')
|
||||||
schema_dir = os.path.join(script_dir, '..', 'schema')
|
schema_dir = os.path.join(script_dir, '..', 'schema')
|
||||||
|
user_config_dir = os.path.join(os.path.expanduser("~"), ".config", "cic", "cli", "config")
|
||||||
|
|
||||||
arg_flags = chainlib.cli.argflag_std_read | chainlib.cli.Flag.SEQ
|
arg_flags = chainlib.cli.argflag_std_read | chainlib.cli.Flag.SEQ
|
||||||
argparser = chainlib.cli.ArgumentParser(
|
argparser = chainlib.cli.ArgumentParser(
|
||||||
@@ -62,6 +64,7 @@ cmd_mod = importlib.import_module(modname)
|
|||||||
extra_args = {
|
extra_args = {
|
||||||
'p': 'RPC_PROVIDER',
|
'p': 'RPC_PROVIDER',
|
||||||
}
|
}
|
||||||
|
ensure_base_configs(user_config_dir)
|
||||||
|
|
||||||
config = chainlib.cli.Config.from_args(args, arg_flags=arg_flags, base_config_dir=base_config_dir, extra_args=extra_args)
|
config = chainlib.cli.Config.from_args(args, arg_flags=arg_flags, base_config_dir=base_config_dir, extra_args=extra_args)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "cic-cli"
|
name = "cic-cli"
|
||||||
version = "0.1.0"
|
version = "0.2.3"
|
||||||
description = "Generic cli tooling for the CIC token network"
|
description = "Generic cli tooling for the CIC token network"
|
||||||
authors = [
|
authors = [
|
||||||
"Louis Holbrook <dev@holbrook.no>",
|
"Louis Holbrook <dev@holbrook.no>",
|
||||||
|
|||||||
Reference in New Issue
Block a user