charli3_dendrite 1.2.4.dev0__tar.gz → 1.2.5.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 (38) hide show
  1. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/pyproject.toml +2 -2
  3. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/__init__.py +1 -0
  4. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/splash.py +191 -11
  5. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/LICENSE +0 -0
  6. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/README.md +0 -0
  7. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
  8. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/backend_base.py +0 -0
  9. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  10. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  11. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
  12. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  13. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  14. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  15. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
  16. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  17. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  18. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
  19. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
  20. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  21. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
  22. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  23. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  24. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
  25. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  26. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
  27. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
  28. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
  29. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
  30. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  31. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
  32. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  33. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  34. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  35. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  36. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  37. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  38. {charli3_dendrite-1.2.4.dev0 → charli3_dendrite-1.2.5.dev0}/src/charli3_dendrite/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: charli3_dendrite
3
- Version: 1.2.4.dev0
3
+ Version: 1.2.5.dev0
4
4
  Summary:
5
5
  Author: Elder Millenial
6
6
  Author-email: eldermillenial@protonmail.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "charli3_dendrite"
3
- version = "1.2.4-dev0"
3
+ version = "1.2.5-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.2.4-dev0"
52
+ current_version = "1.2.5-dev0"
53
53
  parse = """(?x)
54
54
  (?P<major>\\d+)\\.
55
55
  (?P<minor>\\d+)\\.
@@ -14,6 +14,7 @@ from charli3_dendrite.dexs.amm.spectrum import SpectrumCPPState
14
14
  from charli3_dendrite.dexs.amm.splash import SplashCPPBidirState
15
15
  from charli3_dendrite.dexs.amm.splash import SplashCPPState
16
16
  from charli3_dendrite.dexs.amm.splash import SplashSSPState
17
+ from charli3_dendrite.dexs.amm.splash import SplashCPPRoyaltyState
17
18
  from charli3_dendrite.dexs.amm.sundae import SundaeSwapCPPState
18
19
  from charli3_dendrite.dexs.amm.sundae import SundaeSwapV3CPPState
19
20
  from charli3_dendrite.dexs.amm.vyfi import VyFiCPPState
@@ -159,6 +159,31 @@ class SplashCPPBidirPoolDatum(PoolDatum):
159
159
  return self.asset_x.assets + self.asset_y.assets
160
160
 
161
161
 
162
+ @dataclass
163
+ class SplashCPPRoyaltyPoolDatum(PoolDatum):
164
+ """The pool datum for the Spectrum DEX."""
165
+
166
+ pool_nft: AssetClass
167
+ asset_x: AssetClass
168
+ asset_y: AssetClass
169
+ lp_token: AssetClass
170
+ pool_fee: int
171
+ treasury_fee: int
172
+ royalty_fee: int
173
+ treasury_x: int
174
+ treasury_y: int
175
+ royalty_x: int
176
+ royalty_y: int
177
+ admin_address: List[PlutusFullAddress]
178
+ treasury_address: bytes
179
+ royalty_pub_key: bytes
180
+ nonce: int
181
+
182
+ def pool_pair(self) -> Assets | None:
183
+ """Returns the pool pair assets if available."""
184
+ return self.asset_x.assets + self.asset_y.assets
185
+
186
+
162
187
  @dataclass
163
188
  class SwapAction(PlutusData):
164
189
  CONSTR_ID = 0
@@ -519,7 +544,9 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
519
544
  def post_init(cls, values):
520
545
  super().post_init(values)
521
546
 
522
- datum: SplashCPPPoolDatum = SplashCPPPoolDatum.from_cbor(values["datum_cbor"])
547
+ datum: SplashCPPPoolDatum = cls.pool_datum_class().from_cbor(
548
+ values["datum_cbor"]
549
+ )
523
550
 
524
551
  values["fee"] = 100000 - datum.pool_fee + datum.treasury_fee
525
552
 
@@ -532,25 +559,35 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
532
559
  # https://github.com/splashprotocol/splash-core/blob/9fd951054ac7143de6acf491f36d1073e729ba90/plutarch-validators/WhalePoolsDex/PContracts/PPool.hs#L367
533
560
  values["inactive"] = assets.quantity() < 100000000
534
561
 
562
+ def _treasury_x(self) -> int:
563
+ return self.pool_datum.treasury_x
564
+
565
+ def _treasury_y(self) -> int:
566
+ return self.pool_datum.treasury_y
567
+
535
568
  def get_amount_out(
536
569
  self,
537
570
  asset: Assets,
538
571
  precise: bool = True,
539
572
  ) -> tuple[Assets, float]:
540
- amount_out, float = super().get_amount_out(asset=asset, precise=precise)
573
+ amount_out, slippage = super().get_amount_out(asset=asset, precise=precise)
541
574
 
542
- pool_datum = self.pool_datum
543
- fee = pool_datum.pool_fee - pool_datum.treasury_fee
575
+ if isinstance(self.fee, (int, float)) or len(self.fee) == 1:
576
+ fee = self.fee
577
+ else:
578
+ fee = self.fee[0] if asset.unit() == self.assets.unit_a else self.fee[1]
579
+
580
+ fee = 100000 - fee
544
581
  dx = asset.quantity()
545
582
  dxf = dx * fee
546
583
  rx = self.assets[asset.unit()]
547
584
 
548
585
  if asset.unit() == self.assets.unit():
549
- ry = self.assets.quantity(1) + pool_datum.treasury_y
550
- rx += pool_datum.treasury_x
586
+ ry = self.assets.quantity(1) + self._treasury_y()
587
+ rx += self._treasury_x()
551
588
  else:
552
- ry = self.assets.quantity(0) + pool_datum.treasury_x
553
- rx += pool_datum.treasury_y
589
+ ry = self.assets.quantity(0) + self._treasury_x()
590
+ rx += self._treasury_y()
554
591
 
555
592
  # Check to make sure the output passes invariant, and decrease until it does
556
593
  dy = -amount_out.quantity()
@@ -567,7 +604,7 @@ class SplashCPPState(SplashBaseState, AbstractConstantProductPoolState):
567
604
  assert -dy * (rx * 100000 + dxf) <= ry * dxf
568
605
  assert -dx * (ry * 100000 + dyf) <= rx * dyf
569
606
 
570
- return amount_out, float
607
+ return amount_out, slippage
571
608
 
572
609
  def swap_utxo(
573
610
  self,
@@ -688,8 +725,8 @@ class SplashCPPBidirState(SplashCPPState):
688
725
  )
689
726
 
690
727
  values["fee"] = [
691
- (100000 - datum.pool_fee_x + datum.treasury_fee) // 10,
692
- (100000 - datum.pool_fee_y + datum.treasury_fee) // 10,
728
+ (100000 - datum.pool_fee_x + datum.treasury_fee),
729
+ (100000 - datum.pool_fee_y + datum.treasury_fee),
693
730
  ]
694
731
 
695
732
  assets = values["assets"]
@@ -698,3 +735,146 @@ class SplashCPPBidirState(SplashCPPState):
698
735
 
699
736
  # Verify pool is active
700
737
  values["inactive"] = assets.quantity() < 100000000
738
+
739
+
740
+ class SplashCPPRoyaltyState(SplashCPPState):
741
+ """Splash StableSwap Pool State."""
742
+
743
+ fee: int = 30
744
+ _batcher = Assets(lovelace=0)
745
+ _deposit = Assets(lovelace=0)
746
+
747
+ def _treasury_x(self) -> int:
748
+ return self.pool_datum.treasury_x + self.pool_datum.royalty_x
749
+
750
+ def _treasury_y(self) -> int:
751
+ return self.pool_datum.treasury_y + self.pool_datum.royalty_y
752
+
753
+ @classmethod
754
+ def pool_selector(cls) -> PoolSelector:
755
+ return PoolSelector(
756
+ addresses=[
757
+ "addr1w89ksjnfu7ys02tedvslc9g2wk90tu5qte0dt4dge60hdugfqe64t",
758
+ ],
759
+ )
760
+
761
+ @classmethod
762
+ def pool_datum_class(self) -> type[SplashCPPRoyaltyPoolDatum]:
763
+ return SplashCPPRoyaltyPoolDatum
764
+
765
+ @classmethod
766
+ def post_init(cls, values):
767
+ super().post_init(values)
768
+
769
+ datum: SplashCPPRoyaltyPoolDatum = SplashCPPRoyaltyPoolDatum.from_cbor(
770
+ values["datum_cbor"],
771
+ )
772
+
773
+ values["fee"] = 100000 - datum.pool_fee + datum.treasury_fee + datum.royalty_fee
774
+
775
+ assets = values["assets"]
776
+ assets.root[assets.unit(0)] -= datum.treasury_x + datum.royalty_x
777
+ assets.root[assets.unit(1)] -= datum.treasury_y + datum.royalty_y
778
+
779
+ # Verify pool is active
780
+ values["inactive"] = assets.quantity() < 100000000
781
+
782
+ def swap_utxo(
783
+ self,
784
+ address_source: Address,
785
+ in_assets: Assets,
786
+ out_assets: Assets,
787
+ tx_builder: TransactionBuilder | None = None,
788
+ extra_assets: Assets | None = None,
789
+ address_target: Address | None = None,
790
+ datum_target: PlutusData | None = None,
791
+ ) -> tuple[TransactionOutput | None, PlutusData]:
792
+ assert self.tx_hash is not None
793
+ assert self.pool_nft is not None
794
+ assert self.lp_tokens is not None
795
+ assert tx_builder is not None
796
+
797
+ order_info = get_backend().get_pool_in_tx(
798
+ self.tx_hash,
799
+ assets=[self.pool_nft.unit()],
800
+ addresses=self.pool_selector().addresses,
801
+ )
802
+
803
+ # Get the output assets
804
+ out_assets, _ = self.get_amount_out(asset=in_assets)
805
+
806
+ # Create the output redeemer
807
+ redeemer = Redeemer(
808
+ CPPoolRedeemer(
809
+ action=2,
810
+ self_index=-1,
811
+ ),
812
+ )
813
+
814
+ # Create the pool input UTxO
815
+ pool_datum_class = self.pool_datum_class()
816
+ pool_datum = pool_datum_class.from_cbor(
817
+ self.pool_datum.to_cbor(),
818
+ )
819
+ assets = self.assets + self.pool_nft + self.lp_tokens
820
+ assets.root[self.assets.unit()] += (
821
+ pool_datum.treasury_x + self.pool_datum.royalty_x
822
+ )
823
+ assets.root[self.assets.unit(1)] += (
824
+ pool_datum.treasury_y + self.pool_datum.royalty_y
825
+ )
826
+ input_utxo = UTxO(
827
+ TransactionInput(
828
+ transaction_id=TransactionId(bytes.fromhex(self.tx_hash)),
829
+ index=self.tx_index,
830
+ ),
831
+ output=TransactionOutput(
832
+ address=order_info[0].address,
833
+ amount=asset_to_value(assets),
834
+ datum=self.pool_datum,
835
+ ),
836
+ )
837
+
838
+ # Create the pool output UTxO
839
+ new_assets = Assets.model_validate(assets.model_dump())
840
+ new_assets.root[in_assets.unit()] += in_assets.quantity()
841
+ new_assets.root[out_assets.unit()] += -out_assets.quantity()
842
+ new_pool_datum = pool_datum_class.from_cbor(
843
+ self.pool_datum.to_cbor(),
844
+ )
845
+
846
+ if in_assets.unit() == new_pool_datum.asset_x.assets.unit():
847
+ new_pool_datum.treasury_x += int(
848
+ in_assets.quantity() * new_pool_datum.treasury_fee // 100000,
849
+ )
850
+ new_pool_datum.royalty_x += int(
851
+ in_assets.quantity() * new_pool_datum.royalty_fee // 100000,
852
+ )
853
+ elif in_assets.unit() == new_pool_datum.asset_y.assets.unit():
854
+ new_pool_datum.treasury_y += int(
855
+ in_assets.quantity() * new_pool_datum.treasury_fee // 100000,
856
+ )
857
+ new_pool_datum.royalty_y += int(
858
+ in_assets.quantity() * new_pool_datum.royalty_fee // 100000,
859
+ )
860
+ else:
861
+ raise ValueError("Invalid input asset")
862
+
863
+ txo = TransactionOutput(
864
+ address=order_info[0].address,
865
+ amount=asset_to_value(new_assets),
866
+ datum=new_pool_datum,
867
+ )
868
+
869
+ # Add the script input
870
+ pool_hash = Address.decode(order_info[0].address).payment_part.payload
871
+ script = (
872
+ get_backend()
873
+ .get_script_from_address(
874
+ Address(payment_part=ScriptHash(payload=pool_hash)),
875
+ )
876
+ .to_utxo()
877
+ )
878
+ tx_builder.add_script_input(utxo=input_utxo, script=script, redeemer=redeemer)
879
+
880
+ return txo, self.pool_datum