diff --git a/cic/contract/csv.py b/cic/contract/csv.py index 1ba788b..3ef3dcd 100644 --- a/cic/contract/csv.py +++ b/cic/contract/csv.py @@ -11,7 +11,7 @@ from cic.contract.components.attachment import Attachment from cic.contract.components.meta import Meta from cic.contract.components.proof import Proof from cic.contract.components.token import Token -from cic.contract.constants import DMR_CONTRACT_URL +from cic.contract.constants import DMR_CONTRACT_URL, GITABLE_CONTRACT_URL from cic.contract.contract import Contract from cic.contract.helpers import download_file from cic.contract.network import Network @@ -59,7 +59,6 @@ def load_contracts_from_csv(config, directory, csv_path: str) -> List[Contract]: targets = ["eth"] os.makedirs(directory) contract_rows = [] - bin_path = os.path.abspath(download_file(DMR_CONTRACT_URL + ".bin")) with open(csv_path, "rt", encoding="utf-8") as file: csvreader = csv.reader(file, delimiter=",") for idx, row in enumerate(csvreader): @@ -88,22 +87,38 @@ def load_contracts_from_csv(config, directory, csv_path: str) -> List[Contract]: sink_account = contract_row[CSV_Column.sink_account] description = contract_row[CSV_Column.description] - if token_type != "demurrage": - raise Exception( - f"Only demurrage tokens are supported at this time. {token_type} is not supported" + if token_type == "demurrage": + bin_path = os.path.abspath(download_file(DMR_CONTRACT_URL + ".bin")) + log.info(f"Generating {token_type} contract for {issuer}") + token = Token( + directory, + name=voucher_name, + symbol=symbol, + precision=precision, + supply=supply, + extra_args=[demurrage, period_minutes, sink_account], + extra_args_types=["uint256", "uint256", "address"], + code=bin_path, ) + elif token_type == "giftable": + bin_path = os.path.abspath(download_file(GITABLE_CONTRACT_URL + ".bin")) + token = Token( + directory, + name=voucher_name, + symbol=symbol, + precision=precision, + supply=supply, + extra_args=[], + extra_args_types=[], + code=bin_path, + ) + else: + raise Exception( + f"Only demurrage and gitable contracts currently supported at this time. {token_type} is not supported" + ) + if token is None: + raise Exception(f"There was an issue building the contract") - log.info("Generating token") - token = Token( - directory, - name=voucher_name, - symbol=symbol, - precision=precision, - supply=supply, - extra_args=[demurrage, period_minutes, sink_account], - extra_args_types=["uint256", "uint256", "address"], - code=bin_path, - ) token.start() log.info("Generating proof") diff --git a/tests/test_csv_generate.py b/tests/test_csv_generate.py index f1771c5..e6ce0df 100644 --- a/tests/test_csv_generate.py +++ b/tests/test_csv_generate.py @@ -1,12 +1,12 @@ import os import tempfile - +import pytest from cic.contract.csv import load_contract_from_csv from tests.base_cic import test_data_dir - -def test_csv_generate(): +@pytest.mark.skip(reason="Public RPC is currently dead") +def test_csv_generate_demurrage(): outputs_dir = os.path.join(tempfile.mkdtemp(), "outputs") test_csv_path = os.path.join(test_data_dir, "voucher", "bondi.csv") contract = load_contract_from_csv( @@ -72,3 +72,67 @@ def test_csv_generate(): assert contract.proof.namespace == "ge" assert contract.proof.proofs == [] assert contract.proof.version() == 0 + +@pytest.mark.skip(reason="Public RPC is currently dead") +def test_csv_generate_giftable(): + outputs_dir = os.path.join(tempfile.mkdtemp(), "outputs") + test_csv_path = os.path.join(test_data_dir, "voucher", "bondi_giftable.csv") + contract = load_contract_from_csv( + { + "WALLET_KEY_FILE": os.path.join(test_data_dir, "keystore", "ok"), + "WALLET_PASSPHRASE": "test", + "CHAIN_SPEC": "evm:kitabu:6060:sarafu", + "RPC_PROVIDER": "http://142.93.38.53:8545", + "CIC_REGISTRY_ADDRESS": "0xe3e3431BF25b06166513019Ed7B21598D27d05dC", + }, + outputs_dir, + csv_path=test_csv_path, + ) + # assert len(contracts) == 1 + # contract = contracts[0] + # Token + assert contract.token.name == "Bondeni" + assert contract.token.extra_args == [] + assert contract.token.extra_args_types == [] + # assert contract.token.code == os.path.join(test_data_dir, "contracts", "Bondi.bin") + assert contract.token.precision == '6' + assert contract.token.supply == "5025" + assert contract.token.symbol == "BONDE" + + # Meta + assert contract.meta.country_code == "KE" + assert contract.meta.location == "Mutitu Kilifi" + assert contract.meta.contact == { + "email": "info@grassecon.org", + "phone": "254797782065", + } + assert contract.meta.name == "Bondeni SHG" + + # Network + assert contract.network.resources["eth"]["chain_spec"] == { + "arch": "evm", + "common_name": "sarafu", + "custom": [], + "extra": {}, + "fork": "kitabu", + "network_id": 6060, + } + assert contract.network.resources["eth"]["contents"] == { + "address_declarator": { + "key_account": "cc4f82f5dacde395e1e0cfc4d62827c8b8b5688c", + "reference": "f055e83f713DbFF947e923749Af9802eaffFB5f9", + }, + "token": { + "key_account": "cc4f82f5dacde395e1e0cfc4d62827c8b8b5688c", + "reference": None, + }, + "token_index": { + "key_account": "cc4f82f5dacde395e1e0cfc4d62827c8b8b5688c", + "reference": "5A1EB529438D8b3cA943A45a48744f4c73d1f098", + }, + } + + assert contract.proof.description == "1 BONDE = 1 itumbe" + assert contract.proof.namespace == "ge" + assert contract.proof.proofs == [] + assert contract.proof.version() == 0 diff --git a/tests/testdata/voucher/bondi_giftable.csv b/tests/testdata/voucher/bondi_giftable.csv new file mode 100644 index 0000000..e6df534 --- /dev/null +++ b/tests/testdata/voucher/bondi_giftable.csv @@ -0,0 +1,2 @@ +issuer,namespace,voucher_name,symbol,location,country_code,supply,precision,token_type,demurrage,period_minutes,phone_number,email_address,sink_account,description +Bondeni SHG,ge,Bondeni,BONDE,Mutitu Kilifi,KE,5025,6,giftable,,,254797782065,info@grassecon.org,0xB8830b647C01433F9492F315ddBFDc35CB3Be6A6,1 BONDE = 1 itumbe \ No newline at end of file