Skip to content

Commit 54ec756

Browse files
KINGH242HareemAtWavenielstroncffls
authored
Cardano cli chain context (#274)
* feat: add cardano-cli chain context * fix: allow instances of str to submit_tx_cbor * fix: cast to int for asset amount and check for None in get_min_utxo * test: add test for cardano-cli chain context * Black formatting * Fix some QA issues * refactor: use `--out-file /dev/stdout` to get utxo data as json * fix: remove unused offline/online mode code * fix: remove unused fraction parser method * fix: add docker configuration to use cardano-cli in a Docker container and network args method to use custom networks * test: add integration tests for cardano-cli * test: fix cardano-node container name * Add more integration tests for cardano cli context --------- Co-authored-by: Hareem Adderley <[email protected]> Co-authored-by: Niels Mündler <[email protected]> Co-authored-by: Jerry <[email protected]>
1 parent 590c49a commit 54ec756

File tree

11 files changed

+1656
-215
lines changed

11 files changed

+1656
-215
lines changed

integration-test/docker-compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ services:
1313
entrypoint: bash
1414
environment:
1515
NETWORK: "${NETWORK:-local-alonzo}"
16+
CARDANO_NODE_SOCKET_PATH: "/ipc/node.socket"
1617
command: /code/run_node.sh
1718

1819
networks:
@@ -21,6 +22,7 @@ services:
2122

2223
volumes:
2324
- .:/code
25+
- /tmp:/tmp
2426
- node-db:/data/db
2527
- node-ipc:/ipc
2628
ports:
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import os
2+
from pathlib import Path
3+
4+
from pycardano import (
5+
CardanoCliChainContext,
6+
CardanoCliNetwork,
7+
GenesisParameters,
8+
Network,
9+
ProtocolParameters,
10+
)
11+
from pycardano.backend.cardano_cli import DockerConfig
12+
13+
14+
class TestCardanoCli:
15+
network_env = os.getenv("NETWORK", "local-alonzo")
16+
host_socket = os.getenv("DOCKER_HOST", None)
17+
network_magic = os.getenv("NETWORK_MAGIC", 42)
18+
19+
configs_dir = Path(__file__).parent.parent / "configs"
20+
21+
chain_context = CardanoCliChainContext(
22+
binary=Path("cardano-cli"),
23+
socket=Path("/ipc/node.socket"),
24+
config_file=configs_dir / network_env / "config.json",
25+
network=CardanoCliNetwork.CUSTOM,
26+
docker_config=DockerConfig(
27+
container_name="integration-test_cardano-node_1",
28+
host_socket=Path(host_socket) if host_socket else None,
29+
),
30+
network_magic_number=int(network_magic),
31+
)
32+
33+
def test_protocol_param(self):
34+
protocol_param = self.chain_context.protocol_param
35+
36+
assert protocol_param is not None
37+
assert isinstance(protocol_param, ProtocolParameters)
38+
39+
cost_models = protocol_param.cost_models
40+
for _, cost_model in cost_models.items():
41+
assert "addInteger-cpu-arguments-intercept" in cost_model
42+
assert "addInteger-cpu-arguments-slope" in cost_model
43+
44+
def test_genesis_param(self):
45+
genesis_param = self.chain_context.genesis_param
46+
47+
assert genesis_param is not None
48+
assert isinstance(genesis_param, GenesisParameters)
49+
50+
def test_network(self):
51+
network = self.chain_context.network
52+
53+
assert network is not None
54+
assert isinstance(network, Network)
55+
56+
def test_epoch(self):
57+
epoch = self.chain_context.epoch
58+
59+
assert epoch is not None
60+
assert isinstance(epoch, int)
61+
assert epoch > 0
62+
63+
def test_last_block_slot(self):
64+
last_block_slot = self.chain_context.last_block_slot
65+
66+
assert isinstance(last_block_slot, int)
67+
assert last_block_slot > 0

integration-test/test/test_plutus.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import collections
12
import time
3+
from typing import Dict, Union
24

35
import cbor2
46
import pytest
@@ -7,6 +9,7 @@
79
from pycardano import *
810

911
from .base import TEST_RETRIES, TestBase
12+
from .test_cardano_cli import TestCardanoCli
1013

1114

1215
class TestPlutus(TestBase):
@@ -371,3 +374,22 @@ class TestPlutusOgmiosOnly(TestPlutus):
371374
@classmethod
372375
def setup_class(cls):
373376
cls.chain_context._kupo_url = None
377+
378+
379+
def evaluate_tx(tx: Transaction) -> Dict[str, ExecutionUnits]:
380+
redeemers = tx.transaction_witness_set.redeemer
381+
execution_units = {}
382+
383+
if redeemers:
384+
for r in redeemers:
385+
k = f"{r.tag.name.lower()}:{r.index}"
386+
execution_units[k] = ExecutionUnits(1000000, 1000000000)
387+
388+
return execution_units
389+
390+
391+
class TestPlutusCardanoCLI(TestPlutus):
392+
@classmethod
393+
def setup_class(cls):
394+
cls.chain_context = TestCardanoCli.chain_context
395+
cls.chain_context.evaluate_tx = evaluate_tx

poetry.lock

Lines changed: 269 additions & 214 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pycardano/backend/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
from .base import *
44
from .blockfrost import *
5+
from .cardano_cli import *
56
from .ogmios import *

pycardano/backend/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def submit_tx(self, tx: Union[Transaction, bytes, str]):
171171
"""
172172
if isinstance(tx, Transaction):
173173
return self.submit_tx_cbor(tx.to_cbor())
174-
elif isinstance(tx, bytes):
174+
elif isinstance(tx, bytes) or isinstance(tx, str):
175175
return self.submit_tx_cbor(tx)
176176
else:
177177
raise InvalidArgumentException(

0 commit comments

Comments
 (0)