charli3_dendrite 1.5.9.dev0__tar.gz → 1.5.10.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.9.dev0 → charli3_dendrite-1.5.10.dev0}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/pyproject.toml +2 -2
  3. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +12 -1
  4. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +22 -4
  5. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +3 -2
  6. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +19 -3
  7. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +13 -8
  8. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/LICENSE +0 -0
  9. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/README.md +0 -0
  10. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/__init__.py +0 -0
  11. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
  12. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/backend_base.py +0 -0
  13. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  14. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  15. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
  16. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  17. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  18. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  19. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
  20. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  21. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  22. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
  23. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
  24. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  25. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  26. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  27. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/dano.py +0 -0
  28. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  29. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
  30. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
  31. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  32. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
  33. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  34. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  35. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  36. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/ob/cardanoswaps.py +0 -0
  37. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
  38. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  39. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  40. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  41. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
  42. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/__init__.py +0 -0
  43. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/base.py +0 -0
  44. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/__init__.py +0 -0
  45. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/constants.py +0 -0
  46. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/datums.py +0 -0
  47. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/loader.py +0 -0
  48. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/market.py +0 -0
  49. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/math.py +0 -0
  50. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/__init__.py +0 -0
  51. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator.py +0 -0
  52. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator_datums.py +0 -0
  53. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/deployments.py +0 -0
  54. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/forward.py +0 -0
  55. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/leaves.py +0 -0
  56. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/locator.py +0 -0
  57. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/lp_pricing.py +0 -0
  58. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/recipes.json +0 -0
  59. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/redeemer.py +0 -0
  60. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/reproduce.py +0 -0
  61. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/oracles/structured_datums.py +0 -0
  62. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/state.py +0 -0
  63. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/__init__.py +0 -0
  64. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/_common.py +0 -0
  65. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/build.py +0 -0
  66. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/builder.py +0 -0
  67. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/context.py +0 -0
  68. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/create_loan.py +0 -0
  69. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/datum_synth.py +0 -0
  70. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/increase_loan.py +0 -0
  71. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/loan_ids.py +0 -0
  72. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/modify_collateral.py +0 -0
  73. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_redeemer.py +0 -0
  74. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_synth.py +0 -0
  75. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/redeemers.py +0 -0
  76. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/repay.py +0 -0
  77. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/topup_withdraw.py +0 -0
  78. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/danogo/transactions/verify.py +0 -0
  79. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/__init__.py +0 -0
  80. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/constants.py +0 -0
  81. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/datums.py +0 -0
  82. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/loader.py +0 -0
  83. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/market.py +0 -0
  84. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/math.py +0 -0
  85. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/__init__.py +0 -0
  86. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/feeds.py +0 -0
  87. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/fluid_api.py +0 -0
  88. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/witness.py +0 -0
  89. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/state.py +0 -0
  90. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/__init__.py +0 -0
  91. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/_common.py +0 -0
  92. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow.py +0 -0
  93. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/builder.py +0 -0
  94. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/change_collateral.py +0 -0
  95. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/context.py +0 -0
  96. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/datum_synth.py +0 -0
  97. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/lend.py +0 -0
  98. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/pool.py +0 -0
  99. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/recast.py +0 -0
  100. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/redeemers.py +0 -0
  101. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/repay.py +0 -0
  102. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/request.py +0 -0
  103. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/resolve.py +0 -0
  104. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/math.py +0 -0
  105. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/oracles/__init__.py +0 -0
  106. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/oracles/charli3.py +0 -0
  107. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/oracles/dex_pooled.py +0 -0
  108. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/oracles/fluid.py +0 -0
  109. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/oracles/models.py +0 -0
  110. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/oracles/orcfax.py +0 -0
  111. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/oracles/qtoken.py +0 -0
  112. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/registry.py +0 -0
  113. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/transactions/__init__.py +0 -0
  114. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/transactions/base.py +0 -0
  115. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/transactions/infra.py +0 -0
  116. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/transactions/snapshot.py +0 -0
  117. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.dev0}/src/charli3_dendrite/lending/units.py +0 -0
  118. {charli3_dendrite-1.5.9.dev0 → charli3_dendrite-1.5.10.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.9.dev0
3
+ Version: 1.5.10.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.9-dev0"
3
+ version = "1.5.10-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.9-dev0"
53
+ current_version = "1.5.10-dev0"
54
54
  parse = """(?x)
55
55
  (?P<major>\\d+)\\.
56
56
  (?P<minor>\\d+)\\.
@@ -79,6 +79,7 @@ class AbstractPoolState(AbstractPairState):
79
79
  extra_assets: Assets | None = None,
80
80
  address_target: Address | None = None,
81
81
  datum_target: PlutusData | None = None,
82
+ minimum_receive: Assets | None = None,
82
83
  ) -> PlutusData:
83
84
  """Create a swap datum for the pool.
84
85
 
@@ -92,6 +93,8 @@ class AbstractPoolState(AbstractPairState):
92
93
  Defaults to None.
93
94
  datum_target (PlutusData | None, optional): The target datum for the swap.
94
95
  Defaults to None.
96
+ minimum_receive (Assets | None, optional): Overrides the baked on-chain
97
+ minimum; fee and deposit still size from out_assets. Defaults to None.
95
98
 
96
99
  Returns:
97
100
  PlutusData: The created swap datum.
@@ -104,10 +107,14 @@ class AbstractPoolState(AbstractPairState):
104
107
  f"{self.__class__.__name__} does not support swap forwarding.",
105
108
  )
106
109
 
110
+ # ``minimum_receive`` (when set) becomes the datum's baked floor; the batcher
111
+ # fee and deposit are still derived from the EXACT ``out_assets`` so relaxing
112
+ # the floor never under-fees the order — only the step's ``minimum_receive``
113
+ # loosens. Same output unit, so swap direction and lp_asset are unaffected.
107
114
  return self.order_datum_class().create_datum(
108
115
  address_source=address_source,
109
116
  in_assets=in_assets,
110
- out_assets=out_assets,
117
+ out_assets=out_assets if minimum_receive is None else minimum_receive,
111
118
  batcher_fee=self.batcher_fee(
112
119
  in_assets=in_assets,
113
120
  out_assets=out_assets,
@@ -127,6 +134,7 @@ class AbstractPoolState(AbstractPairState):
127
134
  extra_assets: Assets | None = None,
128
135
  address_target: Address | None = None,
129
136
  datum_target: PlutusData | None = None,
137
+ minimum_receive: Assets | None = None,
130
138
  ) -> tuple[TransactionOutput | None, PlutusData]:
131
139
  """Create a swap UTXO for the pool.
132
140
 
@@ -141,6 +149,8 @@ class AbstractPoolState(AbstractPairState):
141
149
  Defaults to None.
142
150
  datum_target (PlutusData | None, optional): The target datum for the swap.
143
151
  Defaults to None.
152
+ minimum_receive (Assets | None, optional): Overrides the baked on-chain
153
+ minimum; fee and deposit still size from out_assets. Defaults to None.
144
154
 
145
155
  Returns:
146
156
  tuple[TransactionOutput, PlutusData]: A tuple containing the created
@@ -163,6 +173,7 @@ class AbstractPoolState(AbstractPairState):
163
173
  extra_assets=extra_assets,
164
174
  address_target=address_target,
165
175
  datum_target=datum_target,
176
+ minimum_receive=minimum_receive,
166
177
  )
167
178
 
168
179
  in_assets.root["lovelace"] = (
@@ -32,6 +32,7 @@ from charli3_dendrite.dexs.amm.amm_types import AbstractConstantProductPoolState
32
32
  from charli3_dendrite.dexs.amm.sundae import SundaeV3PlutusNone
33
33
  from charli3_dendrite.dexs.amm.sundae import SundaeV3ReceiverDatumHash
34
34
  from charli3_dendrite.dexs.amm.sundae import SundaeV3ReceiverInlineDatum
35
+ from charli3_dendrite.dexs.amm.sundae import SundaeV3ReceiverInlineDatumHash
35
36
  from charli3_dendrite.utility import Assets
36
37
 
37
38
 
@@ -506,12 +507,14 @@ class MinswapV2OrderDatum(OrderDatum):
506
507
  refund_datum_hash: Union[
507
508
  SundaeV3PlutusNone,
508
509
  SundaeV3ReceiverDatumHash,
510
+ SundaeV3ReceiverInlineDatumHash,
509
511
  SundaeV3ReceiverInlineDatum,
510
512
  ]
511
513
  receiver_address: PlutusFullAddress
512
514
  receiver_datum_hash: Union[
513
515
  SundaeV3PlutusNone,
514
516
  SundaeV3ReceiverDatumHash,
517
+ SundaeV3ReceiverInlineDatumHash,
515
518
  SundaeV3ReceiverInlineDatum,
516
519
  ]
517
520
  lp_asset: AssetClass
@@ -546,16 +549,31 @@ class MinswapV2OrderDatum(OrderDatum):
546
549
  full_address_source = PlutusFullAddress.from_address(address_source)
547
550
  step = SwapExactInV2.from_assets(in_asset=in_assets, out_asset=out_assets)
548
551
 
549
- # `datum_target` is the INNER next-hop order datum (consistent with
550
- # Sundae / WingRiders); wrap it as the receiver's inline datum. No
551
- # target (or no datum) -> no receiver datum.
552
+ # Minswap V2's ExtraDatum carries only the 32-byte HASH of the datum the
553
+ # batcher attaches to the forwarded output (Constr 1 for a datum-hash output,
554
+ # Constr 2 for an inline-datum output) — never the datum itself; the validator
555
+ # un_b_data's the field, so an embedded datum is unspendable. `datum_target` is
556
+ # either a ready receiver form built by the caller (whose form encodes what the
557
+ # next-hop protocol expects) or a raw next-hop order datum, which is forwarded
558
+ # by inline-datum-hash. No target (or no datum) -> no receiver datum.
552
559
  if address_target is None:
553
560
  address_target = address_source
554
561
  receiver_datum = SundaeV3PlutusNone()
555
562
  elif datum_target is None:
556
563
  receiver_datum = SundaeV3PlutusNone()
564
+ elif isinstance(
565
+ datum_target,
566
+ (
567
+ SundaeV3PlutusNone,
568
+ SundaeV3ReceiverDatumHash,
569
+ SundaeV3ReceiverInlineDatumHash,
570
+ ),
571
+ ):
572
+ receiver_datum = datum_target
557
573
  else:
558
- receiver_datum = SundaeV3ReceiverInlineDatum(datum=datum_target)
574
+ receiver_datum = SundaeV3ReceiverInlineDatumHash(
575
+ datum_hash=datum_target.hash().payload,
576
+ )
559
577
 
560
578
  full_address_target = PlutusFullAddress.from_address(address_target)
561
579
 
@@ -3,7 +3,7 @@
3
3
  from dataclasses import dataclass
4
4
  from typing import Any
5
5
  from typing import ClassVar
6
- from typing import List # noqa: UP035
6
+ from typing import List
7
7
  from typing import Union
8
8
 
9
9
  from pycardano import Address
@@ -366,6 +366,7 @@ class SpectrumCPPState(AbstractConstantProductPoolState):
366
366
  extra_assets: Assets | None = None,
367
367
  address_target: Address | None = None,
368
368
  datum_target: PlutusData | None = None,
369
+ minimum_receive: Assets | None = None,
369
370
  ) -> PlutusData:
370
371
  """Create a PlutusData object representing a swap datum.
371
372
 
@@ -400,7 +401,7 @@ class SpectrumCPPState(AbstractConstantProductPoolState):
400
401
  return SpectrumOrderDatum.create_datum(
401
402
  address_source=address_source,
402
403
  in_assets=in_assets,
403
- out_assets=out_assets,
404
+ out_assets=out_assets if minimum_receive is None else minimum_receive,
404
405
  batcher_fee=self.batcher_fee(in_assets=in_assets, out_assets=out_assets)[
405
406
  "lovelace"
406
407
  ],
@@ -122,6 +122,19 @@ class SundaeV3ReceiverInlineDatum(PlutusData):
122
122
  datum: Datum
123
123
 
124
124
 
125
+ @dataclass
126
+ class SundaeV3ReceiverInlineDatumHash(PlutusData):
127
+ """Inline-datum receiver identified by the 32-byte hash of the datum the batcher
128
+ attaches inline to the forwarded output (``Constr 2 [B <hash>]``). Unlike
129
+ ``SundaeV3ReceiverInlineDatum``, which embeds the datum itself, receivers such as
130
+ Minswap V2 carry only the hash and verify the attached inline datum against it.
131
+ """
132
+
133
+ CONSTR_ID = 2
134
+
135
+ datum_hash: bytes
136
+
137
+
125
138
  @dataclass
126
139
  class SundaeAddressWithDatum(PlutusData):
127
140
  """SundaeSwap address with datum."""
@@ -602,6 +615,7 @@ class SundaeSwapCPPState(AbstractConstantProductPoolState):
602
615
  extra_assets: Assets | None = None,
603
616
  address_target: Address | None = None,
604
617
  datum_target: PlutusData | None = None,
618
+ minimum_receive: Assets | None = None,
605
619
  ) -> PlutusData:
606
620
  """Create a swap datum."""
607
621
  if self.swap_forward and address_target is not None:
@@ -613,7 +627,7 @@ class SundaeSwapCPPState(AbstractConstantProductPoolState):
613
627
  ident=ident,
614
628
  address_source=address_source,
615
629
  in_assets=in_assets,
616
- out_assets=out_assets,
630
+ out_assets=out_assets if minimum_receive is None else minimum_receive,
617
631
  fee=self.batcher_fee(in_assets=in_assets, out_assets=out_assets).quantity(),
618
632
  )
619
633
 
@@ -754,6 +768,7 @@ class SundaeSwapV3CPPState(AbstractConstantProductPoolState):
754
768
  extra_assets: Assets | None = None,
755
769
  address_target: Address | None = None,
756
770
  datum_target: PlutusData | None = None,
771
+ minimum_receive: Assets | None = None,
757
772
  ) -> PlutusData:
758
773
  ident = bytes.fromhex(self.pool_nft.unit()[64:])
759
774
 
@@ -761,7 +776,7 @@ class SundaeSwapV3CPPState(AbstractConstantProductPoolState):
761
776
  ident=ident,
762
777
  address_source=address_source,
763
778
  in_assets=in_assets,
764
- out_assets=out_assets,
779
+ out_assets=out_assets if minimum_receive is None else minimum_receive,
765
780
  fee=self.batcher_fee(in_assets=in_assets, out_assets=out_assets).quantity(),
766
781
  address_target=address_target,
767
782
  datum_target=datum_target,
@@ -932,6 +947,7 @@ class SundaeSwapV3StableSwap(AbstractStableSwapPoolState):
932
947
  extra_assets: Assets | None = None,
933
948
  address_target: Address | None = None,
934
949
  datum_target: PlutusData | None = None,
950
+ minimum_receive: Assets | None = None,
935
951
  ) -> PlutusData:
936
952
  ident = bytes.fromhex(self.pool_nft.unit()[64:])
937
953
 
@@ -939,7 +955,7 @@ class SundaeSwapV3StableSwap(AbstractStableSwapPoolState):
939
955
  ident=ident,
940
956
  address_source=address_source,
941
957
  in_assets=in_assets,
942
- out_assets=out_assets,
958
+ out_assets=out_assets if minimum_receive is None else minimum_receive,
943
959
  fee=self.batcher_fee(in_assets=in_assets, out_assets=out_assets).quantity(),
944
960
  address_target=address_target,
945
961
  datum_target=datum_target,
@@ -388,8 +388,14 @@ class WingRidersV2OrderDatum(OrderDatum):
388
388
  compensation_datum = b""
389
389
  compensation_datum_type = NoDatum()
390
390
 
391
+ # ``oil`` declares the lovelace the batcher passes through to the beneficiary
392
+ # (it swaps the rest). A forwarded order must ride the full deposit through to
393
+ # fund the next hop, so oil follows ``deposit``; a plain owner-paid swap keeps
394
+ # the standard 2-ADA buffer.
395
+ oil = deposit.quantity() if address_target is not None else 2000000
396
+
391
397
  return WingRidersV2OrderDatum(
392
- oil=2000000,
398
+ oil=oil,
393
399
  beneficiary=beneficiary,
394
400
  owner_address=plutus_address,
395
401
  compensation_datum=compensation_datum,
@@ -833,12 +839,10 @@ class WingRidersV2CPPState(AbstractConstantProductPoolState):
833
839
  out_assets: Assets | None = None,
834
840
  extra_assets: Assets | None = None,
835
841
  ):
836
- merged_assets = in_assets + out_assets
837
- if "lovelace" in merged_assets:
838
- if merged_assets["lovelace"] <= 250000000:
839
- return Assets(lovelace=850000)
840
- elif merged_assets["lovelace"] <= 500000000:
841
- return Assets(lovelace=1500000)
842
+ """The V2 batcher charges a flat 2 ADA regardless of swap size (an order
843
+ fill deducts exactly ``2_000_000`` from the order value; the V1-era ADA
844
+ size tiers do not apply to V2).
845
+ """
842
846
  return Assets(lovelace=2000000)
843
847
 
844
848
 
@@ -887,11 +891,12 @@ class WingRidersV2SSPState(AbstractStableSwapPoolState, WingRidersV2CPPState):
887
891
  extra_assets: Assets | None = None,
888
892
  address_target: Address | None = None,
889
893
  datum_target: PlutusData | None = None,
894
+ minimum_receive: Assets | None = None,
890
895
  ) -> PlutusData:
891
896
  return self.order_datum_class().create_datum(
892
897
  address_source=address_source,
893
898
  in_assets=in_assets,
894
- out_assets=out_assets,
899
+ out_assets=out_assets if minimum_receive is None else minimum_receive,
895
900
  batcher_fee=self.batcher_fee(
896
901
  in_assets=in_assets,
897
902
  out_assets=out_assets,