charli3_dendrite 1.5.5.dev0__tar.gz → 1.5.6.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 (118) hide show
  1. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/pyproject.toml +2 -2
  3. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/__init__.py +1 -0
  4. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/ob/cardanoswaps.py +193 -0
  5. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/LICENSE +0 -0
  6. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/README.md +0 -0
  7. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
  8. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/backend_base.py +0 -0
  9. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  10. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  11. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
  12. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  13. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  14. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  15. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
  16. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  17. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  18. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
  19. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
  20. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  21. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
  22. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  23. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  24. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/dano.py +0 -0
  25. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
  26. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  27. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
  28. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
  29. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
  30. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
  31. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
  32. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  33. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
  34. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  35. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  36. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  37. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
  38. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  39. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  40. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  41. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
  42. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/__init__.py +0 -0
  43. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/base.py +0 -0
  44. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/__init__.py +0 -0
  45. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/constants.py +0 -0
  46. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/datums.py +0 -0
  47. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/loader.py +0 -0
  48. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/market.py +0 -0
  49. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/math.py +0 -0
  50. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/__init__.py +0 -0
  51. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator.py +0 -0
  52. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator_datums.py +0 -0
  53. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/deployments.py +0 -0
  54. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/forward.py +0 -0
  55. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/leaves.py +0 -0
  56. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/locator.py +0 -0
  57. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/lp_pricing.py +0 -0
  58. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/recipes.json +0 -0
  59. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/redeemer.py +0 -0
  60. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/reproduce.py +0 -0
  61. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/oracles/structured_datums.py +0 -0
  62. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/state.py +0 -0
  63. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/__init__.py +0 -0
  64. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/_common.py +0 -0
  65. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/build.py +0 -0
  66. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/builder.py +0 -0
  67. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/context.py +0 -0
  68. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/create_loan.py +0 -0
  69. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/datum_synth.py +0 -0
  70. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/increase_loan.py +0 -0
  71. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/loan_ids.py +0 -0
  72. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/modify_collateral.py +0 -0
  73. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_redeemer.py +0 -0
  74. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_synth.py +0 -0
  75. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/redeemers.py +0 -0
  76. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/repay.py +0 -0
  77. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/topup_withdraw.py +0 -0
  78. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/danogo/transactions/verify.py +0 -0
  79. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/__init__.py +0 -0
  80. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/constants.py +0 -0
  81. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/datums.py +0 -0
  82. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/loader.py +0 -0
  83. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/market.py +0 -0
  84. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/math.py +0 -0
  85. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/__init__.py +0 -0
  86. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/feeds.py +0 -0
  87. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/fluid_api.py +0 -0
  88. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/witness.py +0 -0
  89. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/state.py +0 -0
  90. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/__init__.py +0 -0
  91. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/_common.py +0 -0
  92. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow.py +0 -0
  93. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/builder.py +0 -0
  94. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/change_collateral.py +0 -0
  95. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/context.py +0 -0
  96. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/datum_synth.py +0 -0
  97. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/lend.py +0 -0
  98. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/pool.py +0 -0
  99. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/recast.py +0 -0
  100. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/redeemers.py +0 -0
  101. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/repay.py +0 -0
  102. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/request.py +0 -0
  103. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/resolve.py +0 -0
  104. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/math.py +0 -0
  105. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/oracles/__init__.py +0 -0
  106. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/oracles/charli3.py +0 -0
  107. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/oracles/dex_pooled.py +0 -0
  108. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/oracles/fluid.py +0 -0
  109. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/oracles/models.py +0 -0
  110. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/oracles/orcfax.py +0 -0
  111. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/oracles/qtoken.py +0 -0
  112. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/registry.py +0 -0
  113. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/transactions/__init__.py +0 -0
  114. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/transactions/base.py +0 -0
  115. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/transactions/infra.py +0 -0
  116. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/transactions/snapshot.py +0 -0
  117. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.dev0}/src/charli3_dendrite/lending/units.py +0 -0
  118. {charli3_dendrite-1.5.5.dev0 → charli3_dendrite-1.5.6.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.5.5.dev0
3
+ Version: 1.5.6.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.5.5-dev0"
3
+ version = "1.5.6-dev0"
4
4
  description = ""
5
5
  authors = ["Elder Millenial <eldermillenial@protonmail.com>"]
6
6
  readme = "README.md"
@@ -50,7 +50,7 @@ module = ["pycardano", "pycardano.*", "dotenv", "nox", "uplc", "uplc.*"]
50
50
  ignore_missing_imports = true
51
51
 
52
52
  [tool.bumpversion]
53
- current_version = "1.5.5-dev0"
53
+ current_version = "1.5.6-dev0"
54
54
  parse = """(?x)
55
55
  (?P<major>\\d+)\\.
56
56
  (?P<minor>\\d+)\\.
@@ -24,6 +24,7 @@ from charli3_dendrite.dexs.amm.wingriders import WingRidersCPPState
24
24
  from charli3_dendrite.dexs.amm.wingriders import WingRidersSSPState
25
25
  from charli3_dendrite.dexs.amm.wingriders import WingRidersV2CPPState
26
26
  from charli3_dendrite.dexs.amm.wingriders import WingRidersV2SSPState
27
+ from charli3_dendrite.dexs.ob.cardanoswaps import CardanoSwapsOrderBook
27
28
  from charli3_dendrite.dexs.ob.cardanoswaps import CardanoSwapsOrderState
28
29
  from charli3_dendrite.dexs.ob.chadswap import ChadSwapOrderBook
29
30
  from charli3_dendrite.dexs.ob.chadswap import ChadSwapOrderState
@@ -14,6 +14,7 @@ are implemented separately.
14
14
  import hashlib
15
15
  import time
16
16
  from dataclasses import dataclass
17
+ from decimal import Decimal
17
18
  from typing import Union
18
19
 
19
20
  from pycardano import Address
@@ -30,12 +31,17 @@ from pycardano import UTxO
30
31
  from pycardano import plutus_script_hash
31
32
  from pycardano.utils import min_lovelace
32
33
 
34
+ from charli3_dendrite.backend import get_backend
33
35
  from charli3_dendrite.dataclasses.datums import OrderDatum
34
36
  from charli3_dendrite.dataclasses.datums import PlutusNone
35
37
  from charli3_dendrite.dataclasses.models import Assets
36
38
  from charli3_dendrite.dataclasses.models import OrderType
37
39
  from charli3_dendrite.dataclasses.models import PoolSelector
40
+ from charli3_dendrite.dexs.ob.ob_base import AbstractOrderBookState
38
41
  from charli3_dendrite.dexs.ob.ob_base import AbstractOrderState
42
+ from charli3_dendrite.dexs.ob.ob_base import BuyOrderBook
43
+ from charli3_dendrite.dexs.ob.ob_base import OrderBookOrder
44
+ from charli3_dendrite.dexs.ob.ob_base import SellOrderBook
39
45
  from charli3_dendrite.utility import asset_to_value
40
46
 
41
47
  # v2 one-way beacon minting policy id (also stored verbatim in the datum's
@@ -262,6 +268,13 @@ class CardanoSwapsOrderState(AbstractOrderState):
262
268
  datum_hash: str
263
269
  inactive: bool = False
264
270
  fee: int = 0
271
+ # The resting UTxO's on-chain address. Unlike every other order-book DEX, a
272
+ # Cardano-Swaps order carries no owner in its datum — the owner is the resting
273
+ # address's staking credential (the beacon-tagged swap address = validator
274
+ # payment part + owner staking part). Retaining it here lets an aggregate fill
275
+ # (:class:`CardanoSwapsOrderBook`) recover each maker's owner without a separate
276
+ # lookup; it is populated from the backend UTxO record on ingest.
277
+ address: str | None = None
265
278
 
266
279
  _batcher: Assets = Assets(lovelace=0)
267
280
  _datum_parsed: PlutusData | None = None
@@ -806,3 +819,183 @@ class CardanoSwapsOrderState(AbstractOrderState):
806
819
  # script must be executed (a withdrawal). This builder only assembles the
807
820
  # spend + burn; signing/withdrawal is the caller's responsibility.
808
821
  return self.order_datum
822
+
823
+
824
+ class CardanoSwapsOrderBook(AbstractOrderBookState):
825
+ """Aggregate order book over resting Cardano-Swaps one-way swap UTxOs.
826
+
827
+ The batcher-less, fee-less sibling of the other order-book aggregates: it
828
+ holds many individual :class:`CardanoSwapsOrderState` orders for a token pair
829
+ and prices/fills across them. Because a Cardano-Swaps order carries no
830
+ protocol fee (``fee = 0``), the base level-walk ``get_amount_out`` /
831
+ ``get_amount_in`` are inherited unchanged; only ``price`` (and construction)
832
+ diverge, and ``swap_utxo`` folds a fill across the individual orders.
833
+ """
834
+
835
+ fee: int = 0
836
+ _deposit: Assets = Assets(lovelace=0)
837
+
838
+ @classmethod
839
+ def get_book(
840
+ cls,
841
+ assets: Assets,
842
+ orders: list[CardanoSwapsOrderState] | None = None,
843
+ ) -> "CardanoSwapsOrderBook":
844
+ """Build an order book from Cardano-Swaps orders for the given pair.
845
+
846
+ Args:
847
+ assets: The token pair to build the book for (unit(0) + unit(1)).
848
+ orders: Pre-fetched orders, or None to discover from the backend by
849
+ beacon policy (``pool_selector`` is beacon-based, not address-based).
850
+ """
851
+ if orders is None:
852
+ selector = CardanoSwapsOrderState.pool_selector()
853
+ result = get_backend().get_pool_utxos(
854
+ limit=10000,
855
+ historical=False,
856
+ **selector.model_dump(),
857
+ )
858
+ orders = [
859
+ CardanoSwapsOrderState.model_validate(r.model_dump()) for r in result
860
+ ]
861
+
862
+ buy_orders = []
863
+ sell_orders = []
864
+ for order in orders:
865
+ if order.inactive:
866
+ continue
867
+ num, denom = order.price
868
+ o = OrderBookOrder(
869
+ price=num / denom,
870
+ quantity=int(order.available.quantity()),
871
+ state=order,
872
+ )
873
+ if order.in_unit == assets.unit() and order.out_unit == assets.unit(1):
874
+ sell_orders.append(o)
875
+ elif order.in_unit == assets.unit(1) and order.out_unit == assets.unit(0):
876
+ buy_orders.append(o)
877
+
878
+ return CardanoSwapsOrderBook(
879
+ assets=assets,
880
+ plutus_v2=True,
881
+ block_time=int(time.time()),
882
+ block_index=0,
883
+ sell_book_full=SellOrderBook(sell_orders),
884
+ buy_book_full=BuyOrderBook(buy_orders),
885
+ )
886
+
887
+ @classmethod
888
+ def dex(cls) -> str:
889
+ """Official dex name."""
890
+ return "CardanoSwaps"
891
+
892
+ @classmethod
893
+ def order_selector(cls) -> list[str]:
894
+ """Order selection: discovery is by beacon policy, not address."""
895
+ return CardanoSwapsOrderState.order_selector()
896
+
897
+ @classmethod
898
+ def pool_selector(cls) -> PoolSelector:
899
+ """Pool/order selection: by beacon policy id."""
900
+ return CardanoSwapsOrderState.pool_selector()
901
+
902
+ @classmethod
903
+ def default_script_class(cls) -> type[PlutusV2Script]:
904
+ """The swap spending validator is a Plutus V2 script."""
905
+ return CardanoSwapsOrderState.default_script_class()
906
+
907
+ @classmethod
908
+ def order_datum_class(cls) -> type[PlutusData]:
909
+ """The PlutusData class for parsing order datums."""
910
+ return CardanoSwapsOrderState.order_datum_class()
911
+
912
+ @property
913
+ def swap_forward(self) -> bool:
914
+ """Swap forwarding is supported on the individual orders."""
915
+ return False
916
+
917
+ @property
918
+ def stake_address(self) -> Address | None:
919
+ """Batcher-less: no order-book stake address."""
920
+ return None
921
+
922
+ @property
923
+ def pool_id(self) -> str:
924
+ """Unique identifier for the Cardano-Swaps order book."""
925
+ return "CardanoSwaps"
926
+
927
+ @property
928
+ def price(self) -> tuple[Decimal, Decimal]:
929
+ """Mid price of assets based on the full order books.
930
+
931
+ Overridden with an empty-book guard: Cardano-Swaps books are frequently
932
+ one-sided (all orders offering one direction of the pair), and the base
933
+ ``price`` dereferences the never-populated optional ``buy_book[0]`` /
934
+ ``sell_book[0]``.
935
+ """
936
+ if not self.buy_book_full or not self.sell_book_full:
937
+ return Decimal(0), Decimal(0)
938
+ buy = Decimal(self.buy_book_full[0].price)
939
+ sell = Decimal(self.sell_book_full[0].price)
940
+ return (
941
+ Decimal((buy + (Decimal(1) / sell)) / 2),
942
+ Decimal((sell + (Decimal(1) / buy)) / 2),
943
+ )
944
+
945
+ def swap_utxo(
946
+ self,
947
+ address_source: Address,
948
+ in_assets: Assets,
949
+ out_assets: Assets,
950
+ tx_builder: TransactionBuilder,
951
+ extra_assets: Assets | None = None,
952
+ address_target: Address | None = None,
953
+ datum_target: PlutusData | None = None,
954
+ ) -> tuple[TransactionOutput | None, PlutusData]:
955
+ """Build a fill by walking the book, folding one fill per resting order.
956
+
957
+ Iterates the appropriate side (sell or buy) best-price-first, filling each
958
+ resting order via its own ``swap_utxo`` until the input is exhausted. Each
959
+ fill is threaded the maker's real owner — the resting UTxO's staking
960
+ credential, carried on the order's ``address`` — so the continuing output
961
+ lands back at the correct beacon-tagged swap address (defaulting the owner
962
+ to the taker would reconstruct the wrong input and fail validation).
963
+ """
964
+ if in_assets.unit() == self.assets.unit():
965
+ book = self.sell_book_full
966
+ else:
967
+ book = self.buy_book_full
968
+
969
+ in_remaining = Assets.model_validate(in_assets.model_dump())
970
+ txo = None
971
+ datum = None
972
+
973
+ for order in book:
974
+ state = order.state
975
+
976
+ order_out, _ = state.get_amount_out(in_remaining)
977
+ order_in, _ = state.get_amount_in(order_out)
978
+
979
+ # Stop once the remaining budget cannot satisfy a meaningful fill.
980
+ if order_out.quantity() <= 0 or order_in.quantity() <= 0:
981
+ break
982
+
983
+ if state.address is None:
984
+ raise ValueError(
985
+ "Cardano-Swaps order-book fill requires each resting order's "
986
+ "address (the maker's owner staking credential).",
987
+ )
988
+
989
+ txo, datum = state.swap_utxo(
990
+ address_source=address_source,
991
+ in_assets=order_in,
992
+ out_assets=order_out,
993
+ tx_builder=tx_builder,
994
+ owner_address=Address.decode(state.address),
995
+ )
996
+
997
+ in_remaining -= order_in
998
+ if in_remaining.quantity() <= state.price[0] / state.price[1]:
999
+ break
1000
+
1001
+ return txo, datum