charli3_dendrite 1.4.11.dev0__tar.gz → 1.4.12.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 (42) hide show
  1. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/pyproject.toml +2 -2
  3. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/splash.py +69 -0
  4. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/LICENSE +0 -0
  5. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/README.md +0 -0
  6. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/__init__.py +0 -0
  7. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
  8. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/backend_base.py +0 -0
  9. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  10. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  11. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
  12. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  13. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  14. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  15. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
  16. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  17. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  18. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
  19. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
  20. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  21. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
  22. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  23. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  24. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/dano.py +0 -0
  25. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
  26. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  27. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
  28. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
  29. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
  30. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
  31. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  32. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
  33. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  34. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  35. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  36. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/ob/cardanoswaps.py +0 -0
  37. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
  38. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  39. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  40. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  41. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.dev0}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
  42. {charli3_dendrite-1.4.11.dev0 → charli3_dendrite-1.4.12.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.11.dev0
3
+ Version: 1.4.12.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.11-dev0"
3
+ version = "1.4.12-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.4.11-dev0"
53
+ current_version = "1.4.12-dev0"
54
54
  parse = """(?x)
55
55
  (?P<major>\\d+)\\.
56
56
  (?P<minor>\\d+)\\.
@@ -2,10 +2,13 @@
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from dataclasses import field
5
+ from dataclasses import replace
6
+ from hashlib import blake2b
5
7
  from typing import Any
6
8
  from typing import List
7
9
  from typing import Union
8
10
 
11
+ import cbor2 # type: ignore[import-not-found]
9
12
  from pycardano import Address
10
13
  from pycardano import DeserializeException
11
14
  from pycardano import PlutusData
@@ -61,6 +64,21 @@ class Rationale(PlutusData):
61
64
  denominator: int
62
65
 
63
66
 
67
+ def _canonical_plutus_cbor(data: PlutusData) -> bytes:
68
+ """Serialise Plutus data to canonical, definite-length CBOR.
69
+
70
+ pycardano encodes Plutus constructors with indefinite-length arrays. The
71
+ Splash order contract recomputes the order beacon over the canonical
72
+ (definite-length) encoding of the datum, so any hash that must agree with the
73
+ on-chain validator has to be taken over this form rather than pycardano's
74
+ default encoding.
75
+ """
76
+ raw = data.to_cbor()
77
+ if isinstance(raw, str):
78
+ raw = bytes.fromhex(raw)
79
+ return cbor2.dumps(cbor2.loads(raw), canonical=True)
80
+
81
+
64
82
  @dataclass
65
83
  class SplashOrderDatum(OrderDatum):
66
84
  """Order Datum."""
@@ -99,6 +117,57 @@ class SplashOrderDatum(OrderDatum):
99
117
  """This method should return the type of the order."""
100
118
  return OrderType.swap
101
119
 
120
+ def compute_beacon(
121
+ self,
122
+ seed_tx_hash: bytes | str,
123
+ seed_index: int,
124
+ order_index: int = 0,
125
+ ) -> bytes:
126
+ """Derive the 28-byte beacon that binds this order to its funding input.
127
+
128
+ The beacon commits to the seed UTxO that funds the order
129
+ (``seed_tx_hash`` at ``seed_index``), the order's position among the
130
+ orders created in the same transaction (``order_index``), and the rest of
131
+ the datum. The on-chain contract reproduces it as::
132
+
133
+ blake2b_224(
134
+ seed_tx_hash
135
+ + seed_index.to_bytes(8, "big")
136
+ + order_index.to_bytes(8, "big")
137
+ + blake2b_224(canonical_cbor(datum with beacon = 28 zero bytes))
138
+ )
139
+
140
+ The inner digest is taken with the ``beacon`` field zeroed and over the
141
+ canonical CBOR encoding, matching the validator.
142
+ """
143
+ if isinstance(seed_tx_hash, str):
144
+ seed_tx_hash = bytes.fromhex(seed_tx_hash)
145
+
146
+ placeholder = replace(self, beacon=bytes(28))
147
+ inner = blake2b(
148
+ _canonical_plutus_cbor(placeholder),
149
+ digest_size=28,
150
+ ).digest()
151
+ preimage = (
152
+ seed_tx_hash
153
+ + seed_index.to_bytes(8, "big")
154
+ + order_index.to_bytes(8, "big")
155
+ + inner
156
+ )
157
+ return blake2b(preimage, digest_size=28).digest()
158
+
159
+ def with_beacon(
160
+ self,
161
+ seed_tx_hash: bytes | str,
162
+ seed_index: int,
163
+ order_index: int = 0,
164
+ ) -> "SplashOrderDatum":
165
+ """Return a copy of this datum with the ``beacon`` field set correctly."""
166
+ return replace(
167
+ self,
168
+ beacon=self.compute_beacon(seed_tx_hash, seed_index, order_index),
169
+ )
170
+
102
171
 
103
172
  @dataclass
104
173
  class SplashSSPPoolDatum(PoolDatum):