charli3_dendrite 1.4.5.dev0__tar.gz → 1.4.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 (40) hide show
  1. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/pyproject.toml +2 -2
  3. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +35 -0
  4. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +20 -1
  5. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/LICENSE +0 -0
  6. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/README.md +0 -0
  7. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/__init__.py +0 -0
  8. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
  9. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/backend_base.py +0 -0
  10. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  11. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  12. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
  13. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  14. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  15. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  16. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
  17. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  18. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  19. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
  20. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
  21. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  22. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
  23. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  24. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  25. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  26. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
  27. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
  28. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
  29. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
  30. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  31. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
  32. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  33. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  34. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  35. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
  36. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  37. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  38. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  39. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.6.dev0}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
  40. {charli3_dendrite-1.4.5.dev0 → charli3_dendrite-1.4.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.4.5.dev0
3
+ Version: 1.4.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.4.5-dev0"
3
+ version = "1.4.6-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.5-dev0"
52
+ current_version = "1.4.6-dev0"
53
53
  parse = """(?x)
54
54
  (?P<major>\\d+)\\.
55
55
  (?P<minor>\\d+)\\.
@@ -618,6 +618,41 @@ class MinswapV2OrderDatum(OrderDatum):
618
618
  return Assets({"asset_b": self.step.minimum_receive})
619
619
  else:
620
620
  return Assets({"asset_a": self.step.minimum_receive})
621
+ elif isinstance(self.step, StopLossV2):
622
+ if isinstance(self.step.a_to_b_direction, BoolTrue):
623
+ return Assets({"asset_b": self.step.stop_loss_receive})
624
+ else:
625
+ return Assets({"asset_a": self.step.stop_loss_receive})
626
+ elif isinstance(self.step, OCOV2):
627
+ # OCO carries a take-profit (minimum_receive) and a stop-loss
628
+ # (stop_loss_receive); report the take-profit limit as the requested
629
+ # amount, mirroring the minimum_receive used for SwapExactInV2.
630
+ if isinstance(self.step.a_to_b_direction, BoolTrue):
631
+ return Assets({"asset_b": self.step.minimum_receive})
632
+ else:
633
+ return Assets({"asset_a": self.step.minimum_receive})
634
+ elif isinstance(self.step, ZapOutV2):
635
+ if isinstance(self.step.a_to_b_direction, BoolTrue):
636
+ return Assets({"asset_b": self.step.minimum_receive})
637
+ else:
638
+ return Assets({"asset_a": self.step.minimum_receive})
639
+ elif isinstance(self.step, PartialSwapV2):
640
+ # PartialSwap has no minimum_receive field; io_ratio is the limit
641
+ # price, so the requested output is total_swap_amount scaled by
642
+ # io_ratio_numerator / io_ratio_denominator.
643
+ requested = (
644
+ self.step.total_swap_amount
645
+ * self.step.io_ratio_numerator
646
+ // self.step.io_ratio_denominator
647
+ )
648
+ if isinstance(self.step.a_to_b_direction, BoolTrue):
649
+ return Assets({"asset_b": requested})
650
+ else:
651
+ return Assets({"asset_a": requested})
652
+ elif isinstance(self.step, WithdrawImbalanceV2):
653
+ # Only asset_a carries a guaranteed minimum (minimum_asset_a); the
654
+ # asset_b amount is governed by the withdrawal ratio, not a floor.
655
+ return Assets({"asset_a": self.step.minimum_asset_a})
621
656
  else:
622
657
  return Assets({})
623
658
 
@@ -324,7 +324,26 @@ class VyFiCPPState(AbstractConstantProductPoolState):
324
324
 
325
325
  @staticmethod
326
326
  def _encode_asset(policy_id: str, asset_name: str) -> str:
327
- """Encode an asset by combining policy ID and hex-encoded asset name."""
327
+ r"""Encode an asset by combining policy ID and the on-chain asset name.
328
+
329
+ VyFi's API returns ``token_name`` in two forms: a human-readable string
330
+ (e.g. ``"PUDGY"``), or the on-chain asset name *already hex-encoded* and
331
+ marked with a ``"0x"`` prefix, optionally preceded by a NUL byte
332
+ (e.g. ``"\x000x55534441"`` for ``"USDA"``). For the latter the hex is
333
+ the real on-chain asset name and must be used verbatim -- re-encoding it
334
+ as UTF-8 double-encodes the name and corrupts the unit, frequently
335
+ pushing it past the 32-byte asset-name limit (and mangling names with
336
+ non-UTF-8 bytes, e.g. ``"\x000xf6..."``).
337
+ """
338
+ marked = asset_name.lstrip("\x00")
339
+ if marked.startswith("0x"):
340
+ hex_name = marked[2:]
341
+ try:
342
+ bytes.fromhex(hex_name)
343
+ except ValueError:
344
+ pass
345
+ else:
346
+ return policy_id + hex_name.lower()
328
347
  encoded_name = asset_name.encode("utf-8").hex()
329
348
  return policy_id + encoded_name
330
349