charli3_dendrite 1.2.5.dev4__tar.gz → 1.2.5.dev6__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.
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/PKG-INFO +1 -1
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/pyproject.toml +2 -2
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/minswap.py +5 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/splash.py +202 -201
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/LICENSE +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/README.md +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/backend_base.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/utils.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dataclasses/datums.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dataclasses/models.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/core/base.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/core/errors.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
- {charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/utility.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "charli3_dendrite"
|
|
3
|
-
version = "1.2.5-
|
|
3
|
+
version = "1.2.5-dev6"
|
|
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.2.5-
|
|
52
|
+
current_version = "1.2.5-dev6"
|
|
53
53
|
parse = """(?x)
|
|
54
54
|
(?P<major>\\d+)\\.
|
|
55
55
|
(?P<minor>\\d+)\\.
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/minswap.py
RENAMED
|
@@ -613,6 +613,11 @@ class MinswapV2OrderDatum(OrderDatum):
|
|
|
613
613
|
"asset_b": self.step.minimum_asset_b,
|
|
614
614
|
},
|
|
615
615
|
)
|
|
616
|
+
elif isinstance(self.step, SwapMultiRoutingV2):
|
|
617
|
+
if isinstance(self.step.routings[-1].a_to_b_direction, BoolTrue):
|
|
618
|
+
return Assets({"asset_b": self.step.minimum_receive})
|
|
619
|
+
else:
|
|
620
|
+
return Assets({"asset_a": self.step.minimum_receive})
|
|
616
621
|
else:
|
|
617
622
|
return Assets({})
|
|
618
623
|
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/splash.py
RENAMED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"""Minswap DEX Module."""
|
|
2
2
|
|
|
3
|
-
from dataclasses import dataclass
|
|
4
|
-
from
|
|
5
|
-
from string import hexdigits
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from dataclasses import field
|
|
6
5
|
from typing import Any
|
|
7
6
|
from typing import List
|
|
8
7
|
from typing import Union
|
|
@@ -36,14 +35,20 @@ from charli3_dendrite.dexs.core.errors import NotAPoolError
|
|
|
36
35
|
from charli3_dendrite.utility import Assets
|
|
37
36
|
from charli3_dendrite.utility import asset_to_value
|
|
38
37
|
|
|
38
|
+
LIQUIDITY_THRESHOLD = 100000000
|
|
39
|
+
|
|
39
40
|
|
|
40
41
|
@dataclass
|
|
41
42
|
class BoolFalse(PlutusData):
|
|
43
|
+
"""Plutus data representation of boolean false."""
|
|
44
|
+
|
|
42
45
|
CONSTR_ID = 0
|
|
43
46
|
|
|
44
47
|
|
|
45
48
|
@dataclass
|
|
46
49
|
class BoolTrue(PlutusData):
|
|
50
|
+
"""Plutus data representation of boolean true."""
|
|
51
|
+
|
|
47
52
|
CONSTR_ID = 1
|
|
48
53
|
|
|
49
54
|
|
|
@@ -75,8 +80,8 @@ class SplashOrderDatum(OrderDatum):
|
|
|
75
80
|
cancel_pkh: bytes
|
|
76
81
|
permitted_executors: List[bytes] = field(
|
|
77
82
|
default_factory=lambda: [
|
|
78
|
-
b"\\\xb2\xc9h\xe5\xd1\xc7\x19zl\xe7aYg1\n7UE\xd9\xbce\x06:\x96C5\xb2"
|
|
79
|
-
]
|
|
83
|
+
b"\\\xb2\xc9h\xe5\xd1\xc7\x19zl\xe7aYg1\n7UE\xd9\xbce\x06:\x96C5\xb2",
|
|
84
|
+
],
|
|
80
85
|
)
|
|
81
86
|
|
|
82
87
|
def address_source(self) -> Address:
|
|
@@ -94,42 +99,6 @@ class SplashOrderDatum(OrderDatum):
|
|
|
94
99
|
"""This method should return the type of the order."""
|
|
95
100
|
return OrderType.swap
|
|
96
101
|
|
|
97
|
-
@classmethod
|
|
98
|
-
def create_datum(
|
|
99
|
-
cls,
|
|
100
|
-
address_source: Address,
|
|
101
|
-
in_assets: Assets,
|
|
102
|
-
out_assets: Assets,
|
|
103
|
-
batcher_fee: Assets,
|
|
104
|
-
deposit: Assets,
|
|
105
|
-
address_target: Address | None = None,
|
|
106
|
-
datum_target: PlutusData | None = None,
|
|
107
|
-
) -> "CSwapOrderDatum":
|
|
108
|
-
"""Create a CSwap order datum."""
|
|
109
|
-
# Validate ADA-only restriction
|
|
110
|
-
merged_assets = in_assets + out_assets
|
|
111
|
-
|
|
112
|
-
full_address = PlutusFullAddress.from_address(address_source)
|
|
113
|
-
|
|
114
|
-
beacon = bytes.fromhex("".join(choice(hexdigits) for _ in range(56)))
|
|
115
|
-
|
|
116
|
-
return cls(
|
|
117
|
-
tag=b"\x00",
|
|
118
|
-
beacon=beacon,
|
|
119
|
-
in_asset=AssetClass.from_assets(in_assets),
|
|
120
|
-
tradable_input=in_assets.quantity(),
|
|
121
|
-
cost_per_ex_step=batcher_fee.quantity(),
|
|
122
|
-
min_marginal_output=out_assets.quantity(),
|
|
123
|
-
output=AssetClass.from_assets(out_assets),
|
|
124
|
-
base_price=Rationale(
|
|
125
|
-
numerator=out_assets.quantity(),
|
|
126
|
-
denominator=in_assets.quantity(),
|
|
127
|
-
),
|
|
128
|
-
fee=batcher_fee.quantity(),
|
|
129
|
-
redeemer_address=full_address,
|
|
130
|
-
cancel_pkh=address_source.payment_part.payload,
|
|
131
|
-
)
|
|
132
|
-
|
|
133
102
|
|
|
134
103
|
@dataclass
|
|
135
104
|
class SplashSSPPoolDatum(PoolDatum):
|
|
@@ -216,7 +185,7 @@ class SplashCPPRoyaltyPoolDatum(PoolDatum):
|
|
|
216
185
|
treasury_y: int
|
|
217
186
|
royalty_x: int
|
|
218
187
|
royalty_y: int
|
|
219
|
-
admin_address:
|
|
188
|
+
admin_address: RawDatum
|
|
220
189
|
treasury_address: bytes
|
|
221
190
|
royalty_pub_key: bytes
|
|
222
191
|
nonce: int
|
|
@@ -228,6 +197,8 @@ class SplashCPPRoyaltyPoolDatum(PoolDatum):
|
|
|
228
197
|
|
|
229
198
|
@dataclass
|
|
230
199
|
class SwapAction(PlutusData):
|
|
200
|
+
"""Plutus data for swap action."""
|
|
201
|
+
|
|
231
202
|
CONSTR_ID = 0
|
|
232
203
|
|
|
233
204
|
context_values_list: List[int]
|
|
@@ -235,25 +206,29 @@ class SwapAction(PlutusData):
|
|
|
235
206
|
|
|
236
207
|
@dataclass
|
|
237
208
|
class PDAOAction(PlutusData):
|
|
209
|
+
"""Plutus data for PDAO action."""
|
|
210
|
+
|
|
238
211
|
CONSTR_ID = 1
|
|
239
212
|
|
|
240
213
|
|
|
241
214
|
@dataclass
|
|
242
215
|
class SSPoolRedeemer(PlutusData):
|
|
216
|
+
"""Plutus data for stable swap pool."""
|
|
217
|
+
|
|
243
218
|
CONSTR_ID = 0
|
|
244
219
|
|
|
245
220
|
pool_in_idx: int
|
|
246
221
|
pool_out_idx: int
|
|
247
222
|
action: Union[SwapAction, PDAOAction]
|
|
248
223
|
|
|
249
|
-
def set_idx(self, tx_builder: TransactionBuilder):
|
|
224
|
+
def set_idx(self, tx_builder: TransactionBuilder) -> None:
|
|
250
225
|
"""Set the pool in and out indexes.
|
|
251
226
|
|
|
252
227
|
It is necessary to make sure that redeemer indices are already set before
|
|
253
228
|
calling this function.
|
|
254
229
|
"""
|
|
255
230
|
contract_hash = Address.from_primitive(
|
|
256
|
-
"addr1w9wnm7vle7al9q4aw63aw63wxz7aytnpc4h3gcjy0yufxwc3mr3e5"
|
|
231
|
+
"addr1w9wnm7vle7al9q4aw63aw63wxz7aytnpc4h3gcjy0yufxwc3mr3e5",
|
|
257
232
|
).payment_part.payload
|
|
258
233
|
|
|
259
234
|
# Set the input index
|
|
@@ -265,18 +240,21 @@ class SSPoolRedeemer(PlutusData):
|
|
|
265
240
|
for i, txo in enumerate(tx_builder.outputs):
|
|
266
241
|
if txo.address.payment_part.payload == contract_hash:
|
|
267
242
|
pool_index = i
|
|
268
|
-
|
|
243
|
+
if pool_index is None:
|
|
244
|
+
raise RuntimeError("Pool output not found in transaction outputs")
|
|
269
245
|
self.pool_out_idx = pool_index
|
|
270
246
|
|
|
271
247
|
|
|
272
248
|
@dataclass
|
|
273
249
|
class CPPoolRedeemer(PlutusData):
|
|
250
|
+
"""Plutus data for constant product pool."""
|
|
251
|
+
|
|
274
252
|
CONSTR_ID = 0
|
|
275
253
|
|
|
276
254
|
action: int
|
|
277
255
|
self_index: int
|
|
278
256
|
|
|
279
|
-
def set_idx(self, tx_builder: TransactionBuilder):
|
|
257
|
+
def set_idx(self, tx_builder: TransactionBuilder) -> None:
|
|
280
258
|
"""Set the pool in and out indexes.
|
|
281
259
|
|
|
282
260
|
It is necessary to make sure that redeemer indices are already set before
|
|
@@ -289,24 +267,31 @@ class CPPoolRedeemer(PlutusData):
|
|
|
289
267
|
|
|
290
268
|
|
|
291
269
|
class SplashBaseState(AbstractPairState):
|
|
270
|
+
"""Base state class for Splash DEX pools."""
|
|
271
|
+
|
|
292
272
|
@classmethod
|
|
293
273
|
def dex(cls) -> str:
|
|
274
|
+
"""Return the name of the DEX."""
|
|
294
275
|
return "Splash"
|
|
295
276
|
|
|
296
277
|
@classmethod
|
|
297
|
-
def order_selector(
|
|
278
|
+
def order_selector(cls) -> list[str]:
|
|
279
|
+
"""Return the order selector addresses."""
|
|
298
280
|
return ["addr1w9ryamhgnuz6lau86sqytte2gz5rlktv2yce05e0h3207qssa8euj"]
|
|
299
281
|
|
|
300
282
|
@property
|
|
301
283
|
def stake_address(self) -> Address | None:
|
|
284
|
+
"""Return the stake address for orders."""
|
|
302
285
|
return Address.decode(self.order_selector()[0])
|
|
303
286
|
|
|
304
287
|
@property
|
|
305
288
|
def swap_forward(self) -> bool:
|
|
289
|
+
"""Return whether this DEX supports swap forwarding."""
|
|
306
290
|
return False
|
|
307
291
|
|
|
308
292
|
@classmethod
|
|
309
|
-
def order_datum_class(cls):
|
|
293
|
+
def order_datum_class(cls) -> type[SplashOrderDatum]:
|
|
294
|
+
"""Return the order datum class for this DEX."""
|
|
310
295
|
return SplashOrderDatum
|
|
311
296
|
|
|
312
297
|
@classmethod
|
|
@@ -316,6 +301,7 @@ class SplashBaseState(AbstractPairState):
|
|
|
316
301
|
|
|
317
302
|
@classmethod
|
|
318
303
|
def script_class(cls) -> type[PlutusV2Script]:
|
|
304
|
+
"""Return the script class for this DEX."""
|
|
319
305
|
return PlutusV2Script
|
|
320
306
|
|
|
321
307
|
@classmethod
|
|
@@ -365,15 +351,16 @@ class SplashBaseState(AbstractPairState):
|
|
|
365
351
|
return pool_nft
|
|
366
352
|
|
|
367
353
|
@classmethod
|
|
368
|
-
def skip_init(cls, values) -> bool:
|
|
354
|
+
def skip_init(cls, values: dict[str, Any]) -> bool:
|
|
355
|
+
"""Check if initialization should be skipped for already parsed values."""
|
|
369
356
|
if "pool_nft" in values and "lp_tokens" in values:
|
|
370
357
|
order_class = cls.pool_datum_class()
|
|
371
358
|
try:
|
|
372
359
|
datum: SplashSSPPoolDatum | SplashCPPPoolDatum = order_class.from_cbor(
|
|
373
360
|
values["datum_cbor"],
|
|
374
361
|
)
|
|
375
|
-
except DeserializeException:
|
|
376
|
-
raise NotAPoolError("Invalid datum")
|
|
362
|
+
except DeserializeException as err:
|
|
363
|
+
raise NotAPoolError("Invalid datum") from err
|
|
377
364
|
|
|
378
365
|
if datum.pool_nft.assets.unit() not in values["pool_nft"]:
|
|
379
366
|
raise NotAPoolError("Invalid pool NFT")
|
|
@@ -382,8 +369,8 @@ class SplashBaseState(AbstractPairState):
|
|
|
382
369
|
|
|
383
370
|
values["assets"] = Assets.model_validate(values["assets"])
|
|
384
371
|
return True
|
|
385
|
-
|
|
386
|
-
|
|
372
|
+
|
|
373
|
+
return False
|
|
387
374
|
|
|
388
375
|
@property
|
|
389
376
|
def pool_id(self) -> str:
|
|
@@ -416,8 +403,7 @@ class SplashBaseState(AbstractPairState):
|
|
|
416
403
|
if lp_token not in assets:
|
|
417
404
|
raise InvalidLPError("A pool must have pool lp tokens.")
|
|
418
405
|
|
|
419
|
-
|
|
420
|
-
lp_tokens = Assets(**{lp_token: assets.root.pop(lp_token)})
|
|
406
|
+
lp_tokens = Assets(**{lp_token: assets.root.pop(lp_token)})
|
|
421
407
|
|
|
422
408
|
values["lp_tokens"] = lp_tokens
|
|
423
409
|
|
|
@@ -434,6 +420,7 @@ class SplashSSPState(SplashBaseState, AbstractCommonStableSwapPoolState):
|
|
|
434
420
|
|
|
435
421
|
@classmethod
|
|
436
422
|
def pool_selector(cls) -> PoolSelector:
|
|
423
|
+
"""Return the pool selector for this DEX."""
|
|
437
424
|
return PoolSelector(
|
|
438
425
|
addresses=["addr1w9wnm7vle7al9q4aw63aw63wxz7aytnpc4h3gcjy0yufxwc3mr3e5"],
|
|
439
426
|
)
|
|
@@ -449,11 +436,13 @@ class SplashSSPState(SplashBaseState, AbstractCommonStableSwapPoolState):
|
|
|
449
436
|
return self.pool_datum.an2n // 4
|
|
450
437
|
|
|
451
438
|
@classmethod
|
|
452
|
-
def pool_datum_class(
|
|
439
|
+
def pool_datum_class(cls) -> type[SplashSSPPoolDatum]:
|
|
440
|
+
"""Return the pool datum class for stable swap pools."""
|
|
453
441
|
return SplashSSPPoolDatum
|
|
454
442
|
|
|
455
443
|
@classmethod
|
|
456
|
-
def post_init(cls, values):
|
|
444
|
+
def post_init(cls, values: dict[str, Any]) -> None:
|
|
445
|
+
"""Post-initialization processing for stable swap pools."""
|
|
457
446
|
super().post_init(values)
|
|
458
447
|
|
|
459
448
|
datum: SplashSSPPoolDatum = SplashSSPPoolDatum.from_cbor(values["datum_cbor"])
|
|
@@ -472,7 +461,7 @@ class SplashSSPState(SplashBaseState, AbstractCommonStableSwapPoolState):
|
|
|
472
461
|
# Verify pool is active
|
|
473
462
|
# TODO: should be updated to match the validator:
|
|
474
463
|
# https://github.com/splashprotocol/splash-core/blob/main/validators/stable_pool/pool.ak
|
|
475
|
-
values["inactive"] = assets.quantity() <
|
|
464
|
+
values["inactive"] = assets.quantity() < LIQUIDITY_THRESHOLD
|
|
476
465
|
|
|
477
466
|
def get_amount_out(
|
|
478
467
|
self,
|
|
@@ -480,6 +469,7 @@ class SplashSSPState(SplashBaseState, AbstractCommonStableSwapPoolState):
|
|
|
480
469
|
precise: bool = False,
|
|
481
470
|
fee_on_input: bool = False,
|
|
482
471
|
) -> tuple[Assets, float]:
|
|
472
|
+
"""Calculate output amount for a given input asset amount."""
|
|
483
473
|
return super().get_amount_out(asset=asset, precise=precise, fee_on_input=False)
|
|
484
474
|
|
|
485
475
|
def get_amount_in(
|
|
@@ -488,6 +478,7 @@ class SplashSSPState(SplashBaseState, AbstractCommonStableSwapPoolState):
|
|
|
488
478
|
precise: bool = False,
|
|
489
479
|
fee_on_input: bool = False,
|
|
490
480
|
) -> tuple[Assets, float]:
|
|
481
|
+
"""Calculate input amount required for a given output asset amount."""
|
|
491
482
|
return super().get_amount_in(asset=asset, precise=precise, fee_on_input=False)
|
|
492
483
|
|
|
493
484
|
def swap_utxo(
|
|
@@ -500,10 +491,15 @@ class SplashSSPState(SplashBaseState, AbstractCommonStableSwapPoolState):
|
|
|
500
491
|
address_target: Address | None = None,
|
|
501
492
|
datum_target: PlutusData | None = None,
|
|
502
493
|
) -> tuple[TransactionOutput | None, PlutusData]:
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
494
|
+
"""Create a swap UTXO for the stable swap pool."""
|
|
495
|
+
if self.tx_hash is None:
|
|
496
|
+
raise ValueError("Transaction hash is required for swap operation")
|
|
497
|
+
if self.pool_nft is None:
|
|
498
|
+
raise ValueError("Pool NFT is required for swap operation")
|
|
499
|
+
if self.lp_tokens is None:
|
|
500
|
+
raise ValueError("LP tokens are required for swap operation")
|
|
501
|
+
if tx_builder is None:
|
|
502
|
+
raise ValueError("Transaction builder is required for swap operation")
|
|
507
503
|
|
|
508
504
|
order_info = get_backend().get_pool_in_tx(
|
|
509
505
|
self.tx_hash,
|
|
@@ -564,13 +560,14 @@ class SplashSSPState(SplashBaseState, AbstractCommonStableSwapPoolState):
|
|
|
564
560
|
class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
|
|
565
561
|
"""Splash StableSwap Pool State."""
|
|
566
562
|
|
|
567
|
-
fee: int = 30
|
|
563
|
+
fee: Union[int, list[int]] = 30
|
|
568
564
|
fee_basis: int = 100000
|
|
569
565
|
_batcher = Assets(lovelace=0)
|
|
570
566
|
_deposit = Assets(lovelace=0)
|
|
571
567
|
|
|
572
568
|
@classmethod
|
|
573
569
|
def pool_selector(cls) -> PoolSelector:
|
|
570
|
+
"""Return the pool selector for constant product pools."""
|
|
574
571
|
return PoolSelector(
|
|
575
572
|
addresses=[
|
|
576
573
|
"addr1w8cq97k066w4rd37wprvd4qrfxctzlyd6a67us2uv6hnenqrkvy2j",
|
|
@@ -579,15 +576,17 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
|
|
|
579
576
|
)
|
|
580
577
|
|
|
581
578
|
@classmethod
|
|
582
|
-
def pool_datum_class(
|
|
579
|
+
def pool_datum_class(cls) -> type[SplashCPPPoolDatum]:
|
|
580
|
+
"""Return the pool datum class for constant product pools."""
|
|
583
581
|
return SplashCPPPoolDatum
|
|
584
582
|
|
|
585
583
|
@classmethod
|
|
586
|
-
def post_init(cls, values):
|
|
584
|
+
def post_init(cls, values: dict[str, Any]) -> None:
|
|
585
|
+
"""Post-initialization processing for constant product pools."""
|
|
587
586
|
super().post_init(values)
|
|
588
587
|
|
|
589
588
|
datum: SplashCPPPoolDatum = cls.pool_datum_class().from_cbor(
|
|
590
|
-
values["datum_cbor"]
|
|
589
|
+
values["datum_cbor"],
|
|
591
590
|
)
|
|
592
591
|
|
|
593
592
|
values["fee"] = 100000 - datum.pool_fee + datum.treasury_fee
|
|
@@ -599,7 +598,7 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
|
|
|
599
598
|
# Verify pool is active
|
|
600
599
|
# TODO: should be updated to match the validator:
|
|
601
600
|
# https://github.com/splashprotocol/splash-core/blob/9fd951054ac7143de6acf491f36d1073e729ba90/plutarch-validators/WhalePoolsDex/PContracts/PPool.hs#L367
|
|
602
|
-
values["inactive"] = assets.quantity() <
|
|
601
|
+
values["inactive"] = assets.quantity() < LIQUIDITY_THRESHOLD
|
|
603
602
|
|
|
604
603
|
def _treasury_x(self) -> int:
|
|
605
604
|
return self.pool_datum.treasury_x
|
|
@@ -612,10 +611,11 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
|
|
|
612
611
|
asset: Assets,
|
|
613
612
|
precise: bool = True,
|
|
614
613
|
) -> tuple[Assets, float]:
|
|
614
|
+
"""Calculate output amount for constant product pool with treasury fees."""
|
|
615
615
|
amount_out, slippage = super().get_amount_out(asset=asset, precise=precise)
|
|
616
616
|
|
|
617
|
-
if isinstance(self.fee, (int, float))
|
|
618
|
-
fee = self.fee
|
|
617
|
+
if isinstance(self.fee, (int, float)):
|
|
618
|
+
fee: int = self.fee
|
|
619
619
|
else:
|
|
620
620
|
fee = self.fee[0] if asset.unit() == self.assets.unit_a else self.fee[1]
|
|
621
621
|
|
|
@@ -634,17 +634,27 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
|
|
|
634
634
|
# Check to make sure the output passes invariant, and decrease until it does
|
|
635
635
|
dy = -amount_out.quantity()
|
|
636
636
|
dyf = dy * fee
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
637
|
+
|
|
638
|
+
# First invariant check - if it fails, adjust the output amount
|
|
639
|
+
if not (
|
|
640
|
+
-dy * (rx * 100000 + dxf) <= ry * dxf
|
|
641
|
+
and -dx * (ry * 100000 + dyf) <= rx * dyf
|
|
642
|
+
):
|
|
641
643
|
amount_out.root[amount_out.unit()] = int(ry * dxf / (rx * 100000 + dxf))
|
|
642
644
|
|
|
643
645
|
dy = -amount_out.quantity()
|
|
644
646
|
dyf = dy * fee
|
|
645
647
|
|
|
646
|
-
|
|
647
|
-
|
|
648
|
+
# Final invariant check - if this fails, it's a serious error
|
|
649
|
+
if not (
|
|
650
|
+
-dy * (rx * 100000 + dxf) <= ry * dxf
|
|
651
|
+
and -dx * (ry * 100000 + dyf) <= rx * dyf
|
|
652
|
+
):
|
|
653
|
+
raise ValueError(
|
|
654
|
+
"AMM violation: mathematical constraints cannot be satisfied. "
|
|
655
|
+
f"dy={dy}, dx={dx}, rx={rx}, ry={ry}, "
|
|
656
|
+
f"dxf={dxf}, dyf={dyf}",
|
|
657
|
+
)
|
|
648
658
|
|
|
649
659
|
return amount_out, slippage
|
|
650
660
|
|
|
@@ -658,10 +668,15 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
|
|
|
658
668
|
address_target: Address | None = None,
|
|
659
669
|
datum_target: PlutusData | None = None,
|
|
660
670
|
) -> tuple[TransactionOutput | None, PlutusData]:
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
671
|
+
"""Create a swap UTXO for the constant product pool."""
|
|
672
|
+
if self.tx_hash is None:
|
|
673
|
+
raise ValueError("Transaction hash is required for swap operation")
|
|
674
|
+
if self.pool_nft is None:
|
|
675
|
+
raise ValueError("Pool NFT is required for swap operation")
|
|
676
|
+
if self.lp_tokens is None:
|
|
677
|
+
raise ValueError("LP tokens are required for swap operation")
|
|
678
|
+
if tx_builder is None:
|
|
679
|
+
raise ValueError("Transaction builder is required for swap operation")
|
|
665
680
|
|
|
666
681
|
order_info = get_backend().get_pool_in_tx(
|
|
667
682
|
self.tx_hash,
|
|
@@ -742,12 +757,12 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
|
|
|
742
757
|
class SplashCPPBidirState(SplashCPPState):
|
|
743
758
|
"""Splash StableSwap Pool State."""
|
|
744
759
|
|
|
745
|
-
fee: int = [30, 30]
|
|
746
760
|
_batcher = Assets(lovelace=0)
|
|
747
761
|
_deposit = Assets(lovelace=0)
|
|
748
762
|
|
|
749
763
|
@classmethod
|
|
750
764
|
def pool_selector(cls) -> PoolSelector:
|
|
765
|
+
"""Return the pool selector for bidirectional constant product pools."""
|
|
751
766
|
return PoolSelector(
|
|
752
767
|
addresses=[
|
|
753
768
|
"addr1w95q755yrsr0xt8vmn007tpqee4hps49yjdef5dzknhl99qntsmh0",
|
|
@@ -755,11 +770,13 @@ class SplashCPPBidirState(SplashCPPState):
|
|
|
755
770
|
)
|
|
756
771
|
|
|
757
772
|
@classmethod
|
|
758
|
-
def pool_datum_class(
|
|
773
|
+
def pool_datum_class(cls) -> type[SplashCPPBidirPoolDatum]:
|
|
774
|
+
"""Return the pool datum class for bidirectional pools."""
|
|
759
775
|
return SplashCPPBidirPoolDatum
|
|
760
776
|
|
|
761
777
|
@classmethod
|
|
762
|
-
def post_init(cls, values):
|
|
778
|
+
def post_init(cls, values: dict[str, Any]) -> None:
|
|
779
|
+
"""Post-initialization processing for bidirectional constant product pools."""
|
|
763
780
|
super().post_init(values)
|
|
764
781
|
|
|
765
782
|
datum: SplashCPPBidirPoolDatum = SplashCPPBidirPoolDatum.from_cbor(
|
|
@@ -776,15 +793,14 @@ class SplashCPPBidirState(SplashCPPState):
|
|
|
776
793
|
assets.root[assets.unit(1)] -= datum.treasury_y
|
|
777
794
|
|
|
778
795
|
# Verify pool is active
|
|
779
|
-
values["inactive"] = assets.quantity() <
|
|
796
|
+
values["inactive"] = assets.quantity() < LIQUIDITY_THRESHOLD
|
|
780
797
|
|
|
781
798
|
|
|
782
799
|
class SplashCPPRoyaltyState(SplashCPPState):
|
|
783
800
|
"""Splash StableSwap Pool State."""
|
|
784
801
|
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
_deposit = Assets(lovelace=1500000)
|
|
802
|
+
_batcher = Assets(lovelace=0)
|
|
803
|
+
_deposit = Assets(lovelace=0)
|
|
788
804
|
|
|
789
805
|
def _treasury_x(self) -> int:
|
|
790
806
|
return self.pool_datum.treasury_x + self.pool_datum.royalty_x
|
|
@@ -794,6 +810,7 @@ class SplashCPPRoyaltyState(SplashCPPState):
|
|
|
794
810
|
|
|
795
811
|
@classmethod
|
|
796
812
|
def pool_selector(cls) -> PoolSelector:
|
|
813
|
+
"""Return the pool selector for royalty constant product pools."""
|
|
797
814
|
return PoolSelector(
|
|
798
815
|
addresses=[
|
|
799
816
|
"addr1w89ksjnfu7ys02tedvslc9g2wk90tu5qte0dt4dge60hdugfqe64t",
|
|
@@ -801,25 +818,24 @@ class SplashCPPRoyaltyState(SplashCPPState):
|
|
|
801
818
|
)
|
|
802
819
|
|
|
803
820
|
@classmethod
|
|
804
|
-
def pool_datum_class(
|
|
821
|
+
def pool_datum_class(cls) -> type[SplashCPPRoyaltyPoolDatum]:
|
|
822
|
+
"""Return the pool datum class for royalty pools."""
|
|
805
823
|
return SplashCPPRoyaltyPoolDatum
|
|
806
824
|
|
|
807
825
|
@classmethod
|
|
808
|
-
def post_init(cls, values):
|
|
826
|
+
def post_init(cls, values: dict[str, Any]) -> None:
|
|
827
|
+
"""Post-initialization processing for royalty constant product pools."""
|
|
809
828
|
super().post_init(values)
|
|
810
829
|
|
|
811
830
|
datum: SplashCPPRoyaltyPoolDatum = SplashCPPRoyaltyPoolDatum.from_cbor(
|
|
812
831
|
values["datum_cbor"],
|
|
813
832
|
)
|
|
814
833
|
|
|
815
|
-
values["fee"]
|
|
834
|
+
values["fee"] += datum.royalty_fee
|
|
816
835
|
|
|
817
836
|
assets = values["assets"]
|
|
818
|
-
assets.root[assets.unit(0)] -= datum.
|
|
819
|
-
assets.root[assets.unit(1)] -= datum.
|
|
820
|
-
|
|
821
|
-
# Verify pool is active
|
|
822
|
-
values["inactive"] = assets.quantity() < 100000000
|
|
837
|
+
assets.root[assets.unit(0)] -= datum.royalty_x
|
|
838
|
+
assets.root[assets.unit(1)] -= datum.royalty_y
|
|
823
839
|
|
|
824
840
|
def swap_utxo(
|
|
825
841
|
self,
|
|
@@ -831,112 +847,97 @@ class SplashCPPRoyaltyState(SplashCPPState):
|
|
|
831
847
|
address_target: Address | None = None,
|
|
832
848
|
datum_target: PlutusData | None = None,
|
|
833
849
|
) -> tuple[TransactionOutput | None, PlutusData]:
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
850
|
+
"""Create a swap UTXO for the royalty constant product pool."""
|
|
851
|
+
if self.tx_hash is None:
|
|
852
|
+
raise ValueError("Transaction hash is required for swap operation")
|
|
853
|
+
if self.pool_nft is None:
|
|
854
|
+
raise ValueError("Pool NFT is required for swap operation")
|
|
855
|
+
if self.lp_tokens is None:
|
|
856
|
+
raise ValueError("LP tokens are required for swap operation")
|
|
857
|
+
if tx_builder is None:
|
|
858
|
+
raise ValueError("Transaction builder is required for swap operation")
|
|
859
|
+
|
|
860
|
+
order_info = get_backend().get_pool_in_tx(
|
|
861
|
+
self.tx_hash,
|
|
862
|
+
assets=[self.pool_nft.unit()],
|
|
863
|
+
addresses=self.pool_selector().addresses,
|
|
864
|
+
)
|
|
865
|
+
|
|
866
|
+
# Get the output assets
|
|
867
|
+
out_assets, _ = self.get_amount_out(asset=in_assets)
|
|
868
|
+
|
|
869
|
+
# Create the output redeemer
|
|
870
|
+
redeemer = Redeemer(
|
|
871
|
+
CPPoolRedeemer(
|
|
872
|
+
action=2,
|
|
873
|
+
self_index=-1,
|
|
874
|
+
),
|
|
875
|
+
)
|
|
876
|
+
|
|
877
|
+
# Create the pool input UTxO
|
|
878
|
+
pool_datum_class = self.pool_datum_class()
|
|
879
|
+
pool_datum = pool_datum_class.from_cbor(
|
|
880
|
+
self.pool_datum.to_cbor(),
|
|
881
|
+
)
|
|
882
|
+
assets = self.assets + self.pool_nft + self.lp_tokens
|
|
883
|
+
assets.root[self.assets.unit()] += (
|
|
884
|
+
pool_datum.treasury_x + self.pool_datum.royalty_x
|
|
885
|
+
)
|
|
886
|
+
assets.root[self.assets.unit(1)] += (
|
|
887
|
+
pool_datum.treasury_y + self.pool_datum.royalty_y
|
|
888
|
+
)
|
|
889
|
+
input_utxo = UTxO(
|
|
890
|
+
TransactionInput(
|
|
891
|
+
transaction_id=TransactionId(bytes.fromhex(self.tx_hash)),
|
|
892
|
+
index=self.tx_index,
|
|
893
|
+
),
|
|
894
|
+
output=TransactionOutput(
|
|
895
|
+
address=order_info[0].address,
|
|
896
|
+
amount=asset_to_value(assets),
|
|
897
|
+
datum=self.pool_datum,
|
|
898
|
+
),
|
|
842
899
|
)
|
|
843
900
|
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
# )
|
|
888
|
-
# input_utxo = UTxO(
|
|
889
|
-
# TransactionInput(
|
|
890
|
-
# transaction_id=TransactionId(bytes.fromhex(self.tx_hash)),
|
|
891
|
-
# index=self.tx_index,
|
|
892
|
-
# ),
|
|
893
|
-
# output=TransactionOutput(
|
|
894
|
-
# address=order_info[0].address,
|
|
895
|
-
# amount=asset_to_value(assets),
|
|
896
|
-
# datum=self.pool_datum,
|
|
897
|
-
# ),
|
|
898
|
-
# )
|
|
899
|
-
|
|
900
|
-
# # Create the pool output UTxO
|
|
901
|
-
# new_assets = Assets.model_validate(assets.model_dump())
|
|
902
|
-
# new_assets.root[in_assets.unit()] += in_assets.quantity()
|
|
903
|
-
# new_assets.root[out_assets.unit()] += -out_assets.quantity()
|
|
904
|
-
# new_pool_datum = pool_datum_class.from_cbor(
|
|
905
|
-
# self.pool_datum.to_cbor(),
|
|
906
|
-
# )
|
|
907
|
-
|
|
908
|
-
# if in_assets.unit() == new_pool_datum.asset_x.assets.unit():
|
|
909
|
-
# new_pool_datum.treasury_x += int(
|
|
910
|
-
# in_assets.quantity() * new_pool_datum.treasury_fee // 100000,
|
|
911
|
-
# )
|
|
912
|
-
# new_pool_datum.royalty_x += int(
|
|
913
|
-
# in_assets.quantity() * new_pool_datum.royalty_fee // 100000,
|
|
914
|
-
# )
|
|
915
|
-
# elif in_assets.unit() == new_pool_datum.asset_y.assets.unit():
|
|
916
|
-
# new_pool_datum.treasury_y += int(
|
|
917
|
-
# in_assets.quantity() * new_pool_datum.treasury_fee // 100000,
|
|
918
|
-
# )
|
|
919
|
-
# new_pool_datum.royalty_y += int(
|
|
920
|
-
# in_assets.quantity() * new_pool_datum.royalty_fee // 100000,
|
|
921
|
-
# )
|
|
922
|
-
# else:
|
|
923
|
-
# raise ValueError("Invalid input asset")
|
|
924
|
-
|
|
925
|
-
# txo = TransactionOutput(
|
|
926
|
-
# address=order_info[0].address,
|
|
927
|
-
# amount=asset_to_value(new_assets),
|
|
928
|
-
# datum=new_pool_datum,
|
|
929
|
-
# )
|
|
930
|
-
|
|
931
|
-
# # Add the script input
|
|
932
|
-
# pool_hash = Address.decode(order_info[0].address).payment_part.payload
|
|
933
|
-
# script = (
|
|
934
|
-
# get_backend()
|
|
935
|
-
# .get_script_from_address(
|
|
936
|
-
# Address(payment_part=ScriptHash(payload=pool_hash)),
|
|
937
|
-
# )
|
|
938
|
-
# .to_utxo()
|
|
939
|
-
# )
|
|
940
|
-
# tx_builder.add_script_input(utxo=input_utxo, script=script, redeemer=redeemer)
|
|
941
|
-
|
|
942
|
-
# return txo, self.pool_datum
|
|
901
|
+
# Create the pool output UTxO
|
|
902
|
+
new_assets = Assets.model_validate(assets.model_dump())
|
|
903
|
+
new_assets.root[in_assets.unit()] += in_assets.quantity()
|
|
904
|
+
new_assets.root[out_assets.unit()] += -out_assets.quantity()
|
|
905
|
+
new_pool_datum = pool_datum_class.from_cbor(
|
|
906
|
+
self.pool_datum.to_cbor(),
|
|
907
|
+
)
|
|
908
|
+
|
|
909
|
+
if in_assets.unit() == new_pool_datum.asset_x.assets.unit():
|
|
910
|
+
new_pool_datum.treasury_x += int(
|
|
911
|
+
in_assets.quantity() * new_pool_datum.treasury_fee // 100000,
|
|
912
|
+
)
|
|
913
|
+
new_pool_datum.royalty_x += int(
|
|
914
|
+
in_assets.quantity() * new_pool_datum.royalty_fee // 100000,
|
|
915
|
+
)
|
|
916
|
+
elif in_assets.unit() == new_pool_datum.asset_y.assets.unit():
|
|
917
|
+
new_pool_datum.treasury_y += int(
|
|
918
|
+
in_assets.quantity() * new_pool_datum.treasury_fee // 100000,
|
|
919
|
+
)
|
|
920
|
+
new_pool_datum.royalty_y += int(
|
|
921
|
+
in_assets.quantity() * new_pool_datum.royalty_fee // 100000,
|
|
922
|
+
)
|
|
923
|
+
else:
|
|
924
|
+
raise ValueError("Invalid input asset")
|
|
925
|
+
|
|
926
|
+
txo = TransactionOutput(
|
|
927
|
+
address=order_info[0].address,
|
|
928
|
+
amount=asset_to_value(new_assets),
|
|
929
|
+
datum=new_pool_datum,
|
|
930
|
+
)
|
|
931
|
+
|
|
932
|
+
# Add the script input
|
|
933
|
+
pool_hash = Address.decode(order_info[0].address).payment_part.payload
|
|
934
|
+
script = (
|
|
935
|
+
get_backend()
|
|
936
|
+
.get_script_from_address(
|
|
937
|
+
Address(payment_part=ScriptHash(payload=pool_hash)),
|
|
938
|
+
)
|
|
939
|
+
.to_utxo()
|
|
940
|
+
)
|
|
941
|
+
tx_builder.add_script_input(utxo=input_utxo, script=script, redeemer=redeemer)
|
|
942
|
+
|
|
943
|
+
return txo, self.pool_datum
|
|
File without changes
|
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/__init__.py
RENAMED
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/backend/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/cswap.py
RENAMED
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/muesli.py
RENAMED
|
File without changes
|
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/sundae.py
RENAMED
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/amm/vyfi.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/core/base.py
RENAMED
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/core/errors.py
RENAMED
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/__init__.py
RENAMED
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/axo.py
RENAMED
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/djed.py
RENAMED
|
File without changes
|
|
File without changes
|
{charli3_dendrite-1.2.5.dev4 → charli3_dendrite-1.2.5.dev6}/src/charli3_dendrite/dexs/ob/ob_base.py
RENAMED
|
File without changes
|
|
File without changes
|