From 940304626a403b30305e227a0c56c94aa9d0e14b Mon Sep 17 00:00:00 2001
From: boo <booblegum42@gmail.com>
Date: Thu, 8 Feb 2024 11:13:01 +0700
Subject: [PATCH] add mempool, net fee

---
 node/datums.py | 21 +++++++++++++++------
 node/net.py    | 30 +++++++++++++++++++++++++++++-
 2 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/node/datums.py b/node/datums.py
index a372f3e..3e90774 100644
--- a/node/datums.py
+++ b/node/datums.py
@@ -19,20 +19,23 @@ from .types import ticker, TSD
 
 
 class CFDatum:
-    __slots__ = ["_origin_datum", "hash", "type", "created_at", "atom", "size", "version"]
+    # __slots__ = ["_origin_datum", "hash", "type", "created_at", "atom", "size", "version", "net"]
 
-    def __init__(self, atom: CFBlock | CFEvent, datum: Datum):
+    def __init__(self, atom: CFBlock | CFEvent | None, datum: Datum, net: CFNet | None = None):
         self._origin_datum = datum
-        self.size = datum.getSize()
+        self.hash = str(datum.hash)
+        self.type = datum.getTypeStr()
         self.version = datum.versionStr
+        self.size = datum.getSize()
         try:
             self.created_at = datum.tsCreated
         except OSError:
             self.created_at = datetime.fromtimestamp(0)
             logIt.error(f"Datum [{datum.hash}] has invalid timestamp!")
-        self.type = datum.getTypeStr()
-        self.hash = str(datum.hash)
-        self.atom = atom
+        if atom is None and net is None:
+            raise AttributeError("A datum without a parent atom requires a net")
+        self.atom = atom  # atom == None - datum in mempool
+        self.net = net
 
     def get_sub_datum(
             self) -> CFDatumTX | CFDatumToken | CFDatumEmission | CFDatumAnchor | CFDatumDecree | CFDatumCustom:
@@ -53,6 +56,8 @@ class SubDatum:
 
     @property
     def net(self) -> 'CFNet':
+        if self._parent_datum.atom is None: # mempool datum
+            return self._parent_datum.net
         return self._parent_datum.atom.chain.net
 
 
@@ -70,6 +75,10 @@ class CFDatumTX(SubDatum):
         self.ticker = ledger.get_tx_ticker(self)
         self.accepted = bool(ticker)
 
+    @property
+    def items(self) -> list[CFItem]:
+        return self.get_items()
+
     def get_items(self, filter_type: type[T] | None = None) -> list[T]:
         from .mappings import CFItemMapper
         all_items = [CFItemMapper.build(item, self.net) for item in self._origin_sub_datum.getItems()
diff --git a/node/net.py b/node/net.py
index b3a4058..b171415 100644
--- a/node/net.py
+++ b/node/net.py
@@ -5,12 +5,24 @@ import traceback
 from DAP.Core import logIt
 from DAP.Crypto import HashFast
 from CellFrame.Network import Net
-from CellFrame.Chain import ChainAtomPtr, Ledger, ChainAddr
+from CellFrame.Chain import ChainAtomPtr, Ledger, ChainAddr, Mempool
 
 from .consensus import CFEvent, CFBlock
 from .datums import CFDatum, CFDatumTX
 from .types import CFNetState, ticker
 from ..common.types import ChainTypes
+from dataclasses import dataclass
+
+
+class NetFee:
+    def __init__(self, net: 'CFNet'):
+        self.net = net
+        self.tx_fee = str(self.net._origin_net.txFee)
+        self.tx_fee_addr = str(self.net._origin_net.txFeeAddr)
+        self.validator_avg_fee = str(self.net._origin_net.validatorAverageFee)
+        self.validator_max_fee = str(self.net._origin_net.validatorMaxFee)
+        self.validator_min_fee = str(self.net._origin_net.validatorMinFee)
+        self.native_ticker = self.net._origin_net.nativeTicker
 
 
 class CFNet:
@@ -21,6 +33,7 @@ class CFNet:
             raise RuntimeError(f"No such net: {name}")
         self.main = CFChain(self, 'main')
         self.zerochain = CFChain(self, 'zerochain')
+        self.fee_data = NetFee(self)
 
     @property
     def id(self) -> int:
@@ -89,6 +102,9 @@ class CFChain:
             if datum._origin_datum.isDatumTX():
                 yield datum.get_sub_datum()
 
+    def get_mempool(self) -> 'CFMempool':
+        return CFMempool(self)
+
     def register_mempool_notification_callback(self, callback, *args, **kwargs):
         def callback_wrapper(op_code, group, key, value, *other):
             logIt.message(f"{other=}")
@@ -140,3 +156,15 @@ class CFLedger:
             callback(ledger, tx, *args, net=self.net, **kwargs)
 
         self._origin_ledger.txAddNotify(callback_wrapper, (args, kwargs))
+
+
+class CFMempool:
+    def __init__(self, chain: CFChain):
+        self.chain = chain
+
+    def get_datums(self) -> list[CFDatum]:
+        data = Mempool.list(self.chain.net._origin_net, self.chain._origin_chain)
+        logIt.message(f"{data.keys()=}")
+        return [CFDatum(None, datum, net=self.chain.net) for datum in data.values()]
+
+    # def emissionExtract
-- 
GitLab