charli3_dendrite 1.4.6.dev0__tar.gz → 1.4.7.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/pyproject.toml +2 -2
  3. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/__init__.py +1 -0
  4. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/backend_base.py +18 -0
  5. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +37 -3
  6. charli3_dendrite-1.4.7.dev0/src/charli3_dendrite/dexs/amm/dano.py +1087 -0
  7. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/ob/saturnswap.py +100 -18
  8. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/LICENSE +0 -0
  9. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/README.md +0 -0
  10. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
  11. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  12. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  13. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  14. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  15. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  16. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
  17. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  18. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  19. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
  20. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
  21. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  22. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
  23. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  24. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  25. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
  26. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  27. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
  28. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
  29. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
  30. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
  31. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
  32. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  33. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
  34. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  35. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  36. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  37. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
  38. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  39. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  40. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  41. {charli3_dendrite-1.4.6.dev0 → charli3_dendrite-1.4.7.dev0}/src/charli3_dendrite/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: charli3_dendrite
3
- Version: 1.4.6.dev0
3
+ Version: 1.4.7.dev0
4
4
  Summary:
5
5
  License-File: LICENSE
6
6
  Author: Elder Millenial
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "charli3_dendrite"
3
- version = "1.4.6-dev0"
3
+ version = "1.4.7-dev0"
4
4
  description = ""
5
5
  authors = ["Elder Millenial <eldermillenial@protonmail.com>"]
6
6
  readme = "README.md"
@@ -49,7 +49,7 @@ module = ["pycardano", "pycardano.*", "dotenv", "nox"]
49
49
  ignore_missing_imports = true
50
50
 
51
51
  [tool.bumpversion]
52
- current_version = "1.4.6-dev0"
52
+ current_version = "1.4.7-dev0"
53
53
  parse = """(?x)
54
54
  (?P<major>\\d+)\\.
55
55
  (?P<minor>\\d+)\\.
@@ -1,5 +1,6 @@
1
1
  # noqa
2
2
  from charli3_dendrite.dexs.amm.cswap import CSwapCPPState
3
+ from charli3_dendrite.dexs.amm.dano import DanoCLMMState
3
4
  from charli3_dendrite.dexs.amm.minswap import MinswapCPPState
4
5
  from charli3_dendrite.dexs.amm.minswap import MinswapDJEDiUSDStableState
5
6
  from charli3_dendrite.dexs.amm.minswap import MinswapDJEDUSDCStableState
@@ -99,6 +99,24 @@ class AbstractBackend(ABC):
99
99
  """
100
100
  pass
101
101
 
102
+ def get_stake_rewards(self, address: Address) -> int:
103
+ """Withdrawable staking-reward balance (lovelace) for a reward address.
104
+
105
+ Direct-spend DEXs whose pools stake their ADA (e.g. Dano) must withdraw
106
+ the pool's accrued rewards as part of a swap; the withdrawal amount must
107
+ equal the account's current withdrawable balance. Not every backend can
108
+ answer this — those raise ``NotImplementedError``.
109
+
110
+ Args:
111
+ address (Address): A stake/reward address (delegation part only).
112
+
113
+ Returns:
114
+ int: Withdrawable reward balance in lovelace (0 if none).
115
+ """
116
+ raise NotImplementedError(
117
+ f"{type(self).__name__} does not implement get_stake_rewards",
118
+ )
119
+
102
120
  @abstractmethod
103
121
  def get_historical_order_utxos(
104
122
  self,
@@ -5,6 +5,7 @@ import logging
5
5
  import os
6
6
  from datetime import datetime
7
7
  from threading import Lock
8
+ from typing import Any
8
9
 
9
10
  import psycopg_pool # type: ignore
10
11
  from dotenv import load_dotenv # type: ignore
@@ -296,7 +297,7 @@ OFFSET %(offset)s"""
296
297
  tx_hash: str,
297
298
  addresses: list[str],
298
299
  assets: list[str] | None = None,
299
- ) -> tuple[str, dict[str, list]]:
300
+ ) -> tuple[str, dict[str, Any]]:
300
301
  """Get transactions by policy or address."""
301
302
  # Use the pool selector to format the output
302
303
  datum_selector = PoolSelector.select()
@@ -399,7 +400,7 @@ AND ma.policy = ANY(%(policies)b) AND ma.name = ANY(%(names)b)"""
399
400
  def _get_pool_utxos_in_block(self, block_no: int) -> tuple[str, dict]:
400
401
  # Use this for gathering all assets for multiple addresses
401
402
  datum_selector = (
402
- PoolSelector.select()
403
+ PoolSelector.select() # noqa: S608
403
404
  + """
404
405
  FROM (
405
406
  SELECT txo.*, address.address, address.payment_cred
@@ -469,6 +470,39 @@ LIMIT 1"""
469
470
 
470
471
  return UTxOSelector.parse(r[0])
471
472
 
473
+ def _get_stake_rewards(self, address: Address) -> tuple[str, dict]:
474
+ # Withdrawable balance = spendable rewards (member/leader + treasury/
475
+ # reserves "rest") minus everything already withdrawn. spendable_epoch
476
+ # gates rewards by the ~2-epoch maturation delay.
477
+ query = """
478
+ SELECT (
479
+ COALESCE((SELECT SUM(r.amount) FROM reward r
480
+ JOIN stake_address sa ON sa.id = r.addr_id
481
+ WHERE sa.hash_raw = %(raw)b
482
+ AND r.spendable_epoch <= (SELECT MAX(epoch_no) FROM block)), 0)
483
+ + COALESCE((SELECT SUM(rr.amount) FROM reward_rest rr
484
+ JOIN stake_address sa ON sa.id = rr.addr_id
485
+ WHERE sa.hash_raw = %(raw)b
486
+ AND rr.spendable_epoch <= (SELECT MAX(epoch_no) FROM block)), 0)
487
+ - COALESCE((SELECT SUM(w.amount) FROM withdrawal w
488
+ JOIN stake_address sa ON sa.id = w.addr_id
489
+ WHERE sa.hash_raw = %(raw)b), 0)
490
+ ) AS balance
491
+ """
492
+ return query, {"raw": bytes(address)}
493
+
494
+ def get_stake_rewards(self, address: Address) -> int:
495
+ """Withdrawable staking-reward balance (lovelace) for a reward address."""
496
+ query, values = self._get_stake_rewards(address)
497
+ r = self.db_query(query, values)
498
+ return int((r[0]["balance"] if r else 0) or 0)
499
+
500
+ async def get_stake_rewards_async(self, address: Address) -> int:
501
+ """Withdrawable staking-reward balance (lovelace) for a reward address."""
502
+ query, values = self._get_stake_rewards(address)
503
+ r = await self.db_query_async(query, values)
504
+ return int((r[0]["balance"] if r else 0) or 0)
505
+
472
506
  def _get_datum_from_address(
473
507
  self,
474
508
  address: Address,
@@ -631,7 +665,7 @@ OFFSET %(offset)s"""
631
665
 
632
666
  import pprint
633
667
 
634
- pprint.pprint(r, indent=4)
668
+ pprint.pprint(r, indent=4) # noqa: T203
635
669
 
636
670
  return OrderSelector.parse(r)
637
671