Skip to content

Commit 997d3d2

Browse files
authored
Use Fraction for protocol parameters (#314)
* Use Fraction for protocol parameters * Fix testcase
1 parent 4b1c1d4 commit 997d3d2

File tree

5 files changed

+28
-25
lines changed

5 files changed

+28
-25
lines changed

pycardano/backend/base.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Defines interfaces for client codes to interact (read/write) with the blockchain."""
22

33
from dataclasses import dataclass
4+
from fractions import Fraction
45
from typing import Dict, List, Union
56

67
from pycardano.address import Address
@@ -24,7 +25,7 @@
2425
class GenesisParameters:
2526
"""Cardano genesis parameters"""
2627

27-
active_slots_coefficient: float
28+
active_slots_coefficient: Fraction
2829

2930
update_quorum: int
3031

@@ -63,13 +64,13 @@ class ProtocolParameters:
6364

6465
pool_deposit: int
6566

66-
pool_influence: float
67+
pool_influence: Fraction
6768

68-
monetary_expansion: float
69+
monetary_expansion: Fraction
6970

70-
treasury_expansion: float
71+
treasury_expansion: Fraction
7172

72-
decentralization_param: float
73+
decentralization_param: Fraction
7374

7475
extra_entropy: str
7576

@@ -81,9 +82,9 @@ class ProtocolParameters:
8182

8283
min_pool_cost: int
8384

84-
price_mem: float
85+
price_mem: Fraction
8586

86-
price_step: float
87+
price_step: Fraction
8788

8889
max_tx_ex_mem: int
8990

pycardano/backend/blockfrost.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import tempfile
33
import time
44
import warnings
5+
from fractions import Fraction
56
from typing import Dict, List, Optional, Union
67

78
import cbor2
@@ -133,17 +134,17 @@ def protocol_param(self) -> ProtocolParameters:
133134
max_block_header_size=int(params.max_block_header_size),
134135
key_deposit=int(params.key_deposit),
135136
pool_deposit=int(params.pool_deposit),
136-
pool_influence=float(params.a0),
137-
monetary_expansion=float(params.rho),
138-
treasury_expansion=float(params.tau),
139-
decentralization_param=float(params.decentralisation_param),
137+
pool_influence=Fraction(params.a0),
138+
monetary_expansion=Fraction(params.rho),
139+
treasury_expansion=Fraction(params.tau),
140+
decentralization_param=Fraction(params.decentralisation_param),
140141
extra_entropy=params.extra_entropy,
141142
protocol_major_version=int(params.protocol_major_ver),
142143
protocol_minor_version=int(params.protocol_minor_ver),
143144
min_utxo=int(params.min_utxo),
144145
min_pool_cost=int(params.min_pool_cost),
145-
price_mem=float(params.price_mem),
146-
price_step=float(params.price_step),
146+
price_mem=Fraction(params.price_mem),
147+
price_step=Fraction(params.price_step),
147148
max_tx_ex_mem=int(params.max_tx_ex_mem),
148149
max_tx_ex_steps=int(params.max_tx_ex_steps),
149150
max_block_ex_mem=int(params.max_block_ex_mem),

pycardano/backend/cardano_cli.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def __init__(
143143
self._genesis_param = None
144144
self._protocol_param = None
145145
if refetch_chain_tip_interval is None:
146-
self._refetch_chain_tip_interval = (
146+
self._refetch_chain_tip_interval = float(
147147
self.genesis_param.slot_length
148148
/ self.genesis_param.active_slots_coefficient
149149
)

pycardano/backend/ogmios.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import time
33
from datetime import datetime, timezone
44
from enum import Enum
5+
from fractions import Fraction
56
from typing import Any, Dict, List, Optional, Tuple, Union
67

78
import requests
@@ -77,7 +78,7 @@ def __init__(
7778
self._genesis_param = None
7879
self._protocol_param = None
7980
if refetch_chain_tip_interval is None:
80-
self._refetch_chain_tip_interval = (
81+
self._refetch_chain_tip_interval = float(
8182
self.genesis_param.slot_length
8283
/ self.genesis_param.active_slots_coefficient
8384
)
@@ -146,9 +147,8 @@ def _is_chain_tip_updated(self):
146147
return False
147148

148149
@staticmethod
149-
def _fraction_parser(fraction: str) -> float:
150-
x, y = fraction.split("/")
151-
return int(x) / int(y)
150+
def _fraction_parser(fraction: str) -> Fraction:
151+
return Fraction(fraction)
152152

153153
@property
154154
def protocol_param(self) -> ProtocolParameters:

test/pycardano/backend/test_ogmios.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from fractions import Fraction
12
from unittest.mock import patch
23

34
import pytest
@@ -130,17 +131,17 @@ def test_protocol_param(self, chain_context):
130131
max_block_header_size=1100,
131132
key_deposit=0,
132133
pool_deposit=0,
133-
pool_influence=0.0,
134-
monetary_expansion=0.1,
135-
treasury_expansion=0.1,
136-
decentralization_param=1.0,
134+
pool_influence=Fraction("0"),
135+
monetary_expansion=Fraction("1/10"),
136+
treasury_expansion=Fraction("1/10"),
137+
decentralization_param=Fraction("1"),
137138
extra_entropy="neutral",
138139
protocol_major_version=5,
139140
protocol_minor_version=0,
140141
min_utxo=1000000,
141142
min_pool_cost=0,
142-
price_mem=0.1,
143-
price_step=0.1,
143+
price_mem=Fraction("1/10"),
144+
price_step=Fraction("1/10"),
144145
max_tx_ex_mem=500000000000,
145146
max_tx_ex_steps=500000000000,
146147
max_block_ex_mem=500000000000,
@@ -158,7 +159,7 @@ def test_protocol_param(self, chain_context):
158159
def test_genesis(self, chain_context):
159160
assert (
160161
GenesisParameters(
161-
active_slots_coefficient=0.1,
162+
active_slots_coefficient=Fraction("1/10"),
162163
update_quorum=2,
163164
max_lovelace_supply=1000000000000,
164165
network_magic=42,

0 commit comments

Comments
 (0)