charli3_dendrite 1.5.13.dev1__tar.gz → 1.5.14.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 (128) hide show
  1. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/pyproject.toml +2 -2
  3. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/constants.py +7 -21
  4. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/datums.py +44 -20
  5. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/state.py +8 -1
  6. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/datum_synth.py +3 -16
  7. charli3_dendrite-1.5.14.dev0/src/charli3_dendrite/lending/fluidtokens_v4/__init__.py +1 -0
  8. charli3_dendrite-1.5.14.dev0/src/charli3_dendrite/lending/fluidtokens_v4/constants.py +149 -0
  9. charli3_dendrite-1.5.14.dev0/src/charli3_dendrite/lending/fluidtokens_v4/datums.py +250 -0
  10. charli3_dendrite-1.5.14.dev0/src/charli3_dendrite/lending/fluidtokens_v4/indexing.py +191 -0
  11. charli3_dendrite-1.5.14.dev0/src/charli3_dendrite/lending/fluidtokens_v4/loader.py +163 -0
  12. charli3_dendrite-1.5.14.dev0/src/charli3_dendrite/lending/fluidtokens_v4/state.py +586 -0
  13. charli3_dendrite-1.5.14.dev0/src/charli3_dendrite/lending/plutus.py +71 -0
  14. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/units.py +15 -0
  15. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/LICENSE +0 -0
  16. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/README.md +0 -0
  17. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/__init__.py +0 -0
  18. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
  19. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/backend_base.py +0 -0
  20. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  21. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  22. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
  23. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  24. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  25. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  26. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
  27. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  28. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  29. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
  30. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
  31. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  32. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
  33. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  34. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  35. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/dano.py +0 -0
  36. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
  37. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  38. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/multi_asset.py +0 -0
  39. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
  40. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
  41. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
  42. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/sundae_v4.py +0 -0
  43. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/sundae_v4_deployments.json +0 -0
  44. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
  45. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
  46. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  47. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
  48. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  49. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  50. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  51. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/ob/cardanoswaps.py +0 -0
  52. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
  53. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  54. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  55. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  56. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
  57. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/__init__.py +0 -0
  58. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/base.py +0 -0
  59. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/__init__.py +0 -0
  60. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/constants.py +0 -0
  61. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/datums.py +0 -0
  62. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/loader.py +0 -0
  63. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/market.py +0 -0
  64. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/math.py +0 -0
  65. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/__init__.py +0 -0
  66. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator.py +0 -0
  67. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator_datums.py +0 -0
  68. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/deployments.py +0 -0
  69. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/forward.py +0 -0
  70. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/leaves.py +0 -0
  71. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/locator.py +0 -0
  72. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/lp_pricing.py +0 -0
  73. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/recipes.json +0 -0
  74. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/redeemer.py +0 -0
  75. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/reproduce.py +0 -0
  76. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/oracles/structured_datums.py +0 -0
  77. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/state.py +0 -0
  78. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/__init__.py +0 -0
  79. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/_common.py +0 -0
  80. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/build.py +0 -0
  81. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/builder.py +0 -0
  82. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/context.py +0 -0
  83. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/create_loan.py +0 -0
  84. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/datum_synth.py +0 -0
  85. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/increase_loan.py +0 -0
  86. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/loan_ids.py +0 -0
  87. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/modify_collateral.py +0 -0
  88. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_redeemer.py +0 -0
  89. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_synth.py +0 -0
  90. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/redeemers.py +0 -0
  91. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/repay.py +0 -0
  92. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/topup_withdraw.py +0 -0
  93. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/danogo/transactions/verify.py +0 -0
  94. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/__init__.py +0 -0
  95. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/loader.py +0 -0
  96. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/market.py +0 -0
  97. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/math.py +0 -0
  98. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/__init__.py +0 -0
  99. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/feeds.py +0 -0
  100. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/fluid_api.py +0 -0
  101. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/witness.py +0 -0
  102. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/__init__.py +0 -0
  103. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/_common.py +0 -0
  104. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow.py +0 -0
  105. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/builder.py +0 -0
  106. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/change_collateral.py +0 -0
  107. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/context.py +0 -0
  108. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/lend.py +0 -0
  109. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/pool.py +0 -0
  110. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/recast.py +0 -0
  111. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/redeemers.py +0 -0
  112. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/repay.py +0 -0
  113. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/request.py +0 -0
  114. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/resolve.py +0 -0
  115. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/math.py +0 -0
  116. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/oracles/__init__.py +0 -0
  117. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/oracles/charli3.py +0 -0
  118. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/oracles/dex_pooled.py +0 -0
  119. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/oracles/fluid.py +0 -0
  120. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/oracles/models.py +0 -0
  121. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/oracles/orcfax.py +0 -0
  122. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/oracles/qtoken.py +0 -0
  123. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/registry.py +0 -0
  124. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/transactions/__init__.py +0 -0
  125. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/transactions/base.py +0 -0
  126. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/transactions/infra.py +0 -0
  127. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.dev0}/src/charli3_dendrite/lending/transactions/snapshot.py +0 -0
  128. {charli3_dendrite-1.5.13.dev1 → charli3_dendrite-1.5.14.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.13.dev1
3
+ Version: 1.5.14.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.13-dev1"
3
+ version = "1.5.14-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.13-dev1"
53
+ current_version = "1.5.14-dev0"
54
54
  parse = """(?x)
55
55
  (?P<major>\\d+)\\.
56
56
  (?P<minor>\\d+)\\.
@@ -14,9 +14,8 @@ from typing import TYPE_CHECKING
14
14
  from typing import TypedDict
15
15
 
16
16
  import cbor2 # type: ignore[import-not-found]
17
- from pycardano import Address
18
- from pycardano import Network
19
- from pycardano import ScriptHash
17
+
18
+ from charli3_dendrite.lending.units import script_payment_address
20
19
 
21
20
  if TYPE_CHECKING:
22
21
  from charli3_dendrite.backend.backend_base import AbstractBackend
@@ -156,19 +155,6 @@ class FluidConfig:
156
155
  )
157
156
 
158
157
 
159
- def _payment_address(script_hash_hex: str) -> str:
160
- """A mainnet payment-credential (enterprise) address for a spend script hash.
161
-
162
- Entity UTxOs sit at base addresses whose stake part is not carried by the config
163
- datum, but the backend discovers them by payment credential only, so a
164
- payment-credential address is the stable, redeploy-proof identity to match on.
165
- """
166
- return Address(
167
- payment_part=ScriptHash(bytes.fromhex(script_hash_hex)),
168
- network=Network.MAINNET,
169
- ).encode()
170
-
171
-
172
158
  def resolve_config(backend: AbstractBackend) -> FluidConfig:
173
159
  """Read the live config NFT datum into a :class:`FluidConfig`.
174
160
 
@@ -183,7 +169,7 @@ def resolve_config(backend: AbstractBackend) -> FluidConfig:
183
169
  )
184
170
 
185
171
  utxo = resolve_config_utxo(backend)
186
- return FluidConfig.parse(utxo.datum)
172
+ return FluidConfig.parse(utxo.datum or "")
187
173
  except (TypeError, ValueError, IndexError, KeyError, AttributeError):
188
174
  return FluidConfig.defaults()
189
175
 
@@ -194,13 +180,13 @@ def resolve_addresses(backend: AbstractBackend) -> FluidScriptAddresses:
194
180
  Re-reads the config datum through `backend` so pool / loan / request discovery
195
181
  self-heals across a protocol redeploy (new spend scripts / policies); falls back to
196
182
  the static mainnet constants when the datum cannot be read. Addresses are
197
- payment-credential identities (see :func:`_payment_address`).
183
+ payment-credential identities (see :func:`script_payment_address`).
198
184
  """
199
185
  config = resolve_config(backend)
200
186
  return FluidScriptAddresses(
201
- pool=_payment_address(config.pool_spend_skh),
202
- loan=_payment_address(config.loan_spend_skh),
203
- request=_payment_address(config.request_spend_skh),
187
+ pool=script_payment_address(config.pool_spend_skh),
188
+ loan=script_payment_address(config.loan_spend_skh),
189
+ request=script_payment_address(config.request_spend_skh),
204
190
  pool_policy=config.pool_policy,
205
191
  loan_policy=config.loan_policy,
206
192
  request_policy=config.request_policy,
@@ -1,19 +1,38 @@
1
- """pycardano mirrors of the deployed FluidTokens V3 datums (mainnet)."""
1
+ """pycardano mirrors of the deployed FluidTokens V3 datums (mainnet).
2
+
3
+ Every class decodes strictly: a constructor with more or fewer fields than the class
4
+ raises ``DeserializeException`` instead of decoding a different layout silently.
5
+ """
2
6
  from __future__ import annotations
3
7
 
4
8
  from dataclasses import dataclass
5
9
  from typing import List
6
10
  from typing import TypeAlias
11
+ from typing import Union
7
12
 
8
13
  from pycardano import Datum
9
14
  from pycardano import IndefiniteList
10
- from pycardano import PlutusData
11
15
 
16
+ from charli3_dendrite.lending.plutus import StrictPlutusData
12
17
  from charli3_dendrite.lending.units import asset_unit
13
18
 
19
+ # A loan datum's ``origin_id`` is one of these tags followed by the originating pool's
20
+ # or request's NFT asset name.
21
+ ORIGIN_POOL_TAG = b"POOL"
22
+ ORIGIN_REQUEST_TAG = b"REQUEST"
23
+
24
+
25
+ @dataclass
26
+ class TxOutRef(StrictPlutusData):
27
+ """A transaction output reference == Constr0([tx_id_bytes, index])."""
28
+
29
+ CONSTR_ID = 0
30
+ tx_id: bytes
31
+ index: int
32
+
14
33
 
15
34
  @dataclass
16
- class Asset(PlutusData):
35
+ class Asset(StrictPlutusData):
17
36
  """(policy_id, asset_name) as a `Constr`; ADA is (b"", b"")."""
18
37
 
19
38
  CONSTR_ID = 0
@@ -26,7 +45,7 @@ class Asset(PlutusData):
26
45
 
27
46
 
28
47
  @dataclass
29
- class CollateralAsset(PlutusData):
48
+ class CollateralAsset(StrictPlutusData):
30
49
  """A collateral type: policy, optional asset name, and its oracle token."""
31
50
 
32
51
  CONSTR_ID = 0
@@ -36,21 +55,21 @@ class CollateralAsset(PlutusData):
36
55
 
37
56
 
38
57
  @dataclass
39
- class NoLiquidationFullCollateralClaim(PlutusData):
58
+ class NoLiquidationFullCollateralClaim(StrictPlutusData):
40
59
  """LiquidationMode variant: on default the lender claims all collateral."""
41
60
 
42
61
  CONSTR_ID = 0
43
62
 
44
63
 
45
64
  @dataclass
46
- class NoLiquidationDutchAuctionClaim(PlutusData):
65
+ class NoLiquidationDutchAuctionClaim(StrictPlutusData):
47
66
  """LiquidationMode variant: on default the collateral is dutch-auctioned."""
48
67
 
49
68
  CONSTR_ID = 1
50
69
 
51
70
 
52
71
  @dataclass
53
- class Liquidation(PlutusData):
72
+ class Liquidation(StrictPlutusData):
54
73
  """LiquidationMode variant: liquidate against a loan-to-value threshold.
55
74
 
56
75
  Three fields, matching the deployed datum and `ft-cardano-loans-v3` lib
@@ -67,7 +86,7 @@ class Liquidation(PlutusData):
67
86
 
68
87
 
69
88
  @dataclass
70
- class InterestOnRemainingPrincipal(PlutusData):
89
+ class InterestOnRemainingPrincipal(StrictPlutusData):
71
90
  """RepaymentMode variant: interest accrues on the remaining principal."""
72
91
 
73
92
  CONSTR_ID = 0
@@ -75,14 +94,14 @@ class InterestOnRemainingPrincipal(PlutusData):
75
94
 
76
95
 
77
96
  @dataclass
78
- class PrincipalAndInterestOnInstallments(PlutusData):
97
+ class PrincipalAndInterestOnInstallments(StrictPlutusData):
79
98
  """RepaymentMode variant: principal and interest split across installments."""
80
99
 
81
100
  CONSTR_ID = 1
82
101
 
83
102
 
84
103
  @dataclass
85
- class PerpetualLoan(PlutusData):
104
+ class PerpetualLoan(StrictPlutusData):
86
105
  """RepaymentMode variant: perpetual loan with a linear APY increase."""
87
106
 
88
107
  CONSTR_ID = 2
@@ -90,13 +109,18 @@ class PerpetualLoan(PlutusData):
90
109
  max_possible_recasts: int
91
110
 
92
111
 
93
- # Unions; parse via from_primitive dispatch where needed.
94
- LiquidationMode: TypeAlias = Datum
112
+ # LiquidationMode is typed so a constructor with another layout (such as the V4
113
+ # four-field Liquidation) fails to decode. RepaymentMode stays an untyped Datum.
114
+ LiquidationMode: TypeAlias = Union[
115
+ NoLiquidationFullCollateralClaim,
116
+ NoLiquidationDutchAuctionClaim,
117
+ Liquidation,
118
+ ]
95
119
  RepaymentMode: TypeAlias = Datum
96
120
 
97
121
 
98
122
  @dataclass
99
- class CommonData(PlutusData):
123
+ class CommonData(StrictPlutusData):
100
124
  """Loan terms shared by pool, request, and loan datums."""
101
125
 
102
126
  CONSTR_ID = 0
@@ -114,7 +138,7 @@ class CommonData(PlutusData):
114
138
 
115
139
 
116
140
  @dataclass
117
- class AuthCardanoSignature(PlutusData):
141
+ class AuthCardanoSignature(StrictPlutusData):
118
142
  """AuthorizationMethod variant: authorize by a verification-key hash."""
119
143
 
120
144
  CONSTR_ID = 0
@@ -122,7 +146,7 @@ class AuthCardanoSignature(PlutusData):
122
146
 
123
147
 
124
148
  @dataclass
125
- class AuthCardanoSpendScript(PlutusData):
149
+ class AuthCardanoSpendScript(StrictPlutusData):
126
150
  """AuthorizationMethod variant: authorize by a spending script hash."""
127
151
 
128
152
  CONSTR_ID = 1
@@ -130,7 +154,7 @@ class AuthCardanoSpendScript(PlutusData):
130
154
 
131
155
 
132
156
  @dataclass
133
- class AuthCardanoWithdrawScript(PlutusData):
157
+ class AuthCardanoWithdrawScript(StrictPlutusData):
134
158
  """AuthorizationMethod variant: authorize by a withdrawal script hash."""
135
159
 
136
160
  CONSTR_ID = 2
@@ -138,7 +162,7 @@ class AuthCardanoWithdrawScript(PlutusData):
138
162
 
139
163
 
140
164
  @dataclass
141
- class AuthCardanoMintScript(PlutusData):
165
+ class AuthCardanoMintScript(StrictPlutusData):
142
166
  """AuthorizationMethod variant: authorize by a minting script hash."""
143
167
 
144
168
  CONSTR_ID = 3
@@ -146,7 +170,7 @@ class AuthCardanoMintScript(PlutusData):
146
170
 
147
171
 
148
172
  @dataclass
149
- class PoolDatum(PlutusData):
173
+ class PoolDatum(StrictPlutusData):
150
174
  """Deployed PoolDatum — Constr0, 10 fields.
151
175
 
152
176
  ``collateral_options``, ``min_collateral``, and ``min_collateral_divider`` follow
@@ -190,7 +214,7 @@ class PoolDatum(PlutusData):
190
214
 
191
215
 
192
216
  @dataclass
193
- class LoanDatum(PlutusData):
217
+ class LoanDatum(StrictPlutusData):
194
218
  """Deployed LoanDatum — Constr0, 17 fields."""
195
219
 
196
220
  CONSTR_ID = 0
@@ -214,7 +238,7 @@ class LoanDatum(PlutusData):
214
238
 
215
239
 
216
240
  @dataclass
217
- class RequestDatum(PlutusData):
241
+ class RequestDatum(StrictPlutusData):
218
242
  """Deployed RequestDatum — Constr0, 12 fields."""
219
243
 
220
244
  CONSTR_ID = 0
@@ -336,11 +336,18 @@ class FluidRequestState(DendriteBaseModel):
336
336
 
337
337
  _request_datum_parsed: RequestDatum | None = PrivateAttr(default=None)
338
338
 
339
+ @classmethod
340
+ def request_datum_class(cls) -> type[RequestDatum]:
341
+ """Request datum type."""
342
+ return RequestDatum
343
+
339
344
  @property
340
345
  def request_datum(self) -> RequestDatum:
341
346
  """Parsed request datum (lazily decoded from CBOR)."""
342
347
  if self._request_datum_parsed is None:
343
- self._request_datum_parsed = RequestDatum.from_cbor(self.datum_cbor)
348
+ self._request_datum_parsed = self.request_datum_class().from_cbor(
349
+ self.datum_cbor,
350
+ )
344
351
  return self._request_datum_parsed
345
352
 
346
353
  @property
@@ -14,32 +14,19 @@ from dataclasses import dataclass
14
14
  from pycardano import Datum
15
15
  from pycardano import PlutusData
16
16
 
17
+ from charli3_dendrite.lending.fluidtokens.datums import ORIGIN_POOL_TAG
18
+ from charli3_dendrite.lending.fluidtokens.datums import ORIGIN_REQUEST_TAG
17
19
  from charli3_dendrite.lending.fluidtokens.datums import CollateralAsset
18
20
  from charli3_dendrite.lending.fluidtokens.datums import CommonData
19
21
  from charli3_dendrite.lending.fluidtokens.datums import LoanDatum
20
22
  from charli3_dendrite.lending.fluidtokens.datums import PoolDatum
21
23
  from charli3_dendrite.lending.fluidtokens.datums import RequestDatum
22
-
23
- # Origin-id tag a pool-origin loan datum carries: the loan's ``origin_id`` is this tag
24
- # followed by the originating pool's NFT asset name (`b"POOL" + pool_id`).
25
- ORIGIN_POOL_TAG = b"POOL"
26
-
27
- # Origin-id tag a request-origin loan datum carries: ``b"REQUEST" + request_id``.
28
- ORIGIN_REQUEST_TAG = b"REQUEST"
24
+ from charli3_dendrite.lending.fluidtokens.datums import TxOutRef
29
25
 
30
26
  # The receipt's tag bytestring identifying an installment repayment.
31
27
  INSTALLMENT_REPAYMENT_TAG = b"installment_repayment"
32
28
 
33
29
 
34
- @dataclass
35
- class TxOutRef(PlutusData):
36
- """A transaction output reference == Constr0([tx_id_bytes, index])."""
37
-
38
- CONSTR_ID = 0
39
- tx_id: bytes
40
- index: int
41
-
42
-
43
30
  @dataclass
44
31
  class RepaymentInfo(PlutusData):
45
32
  """The loan terms recorded on the receipt == Constr0([...]).
@@ -0,0 +1 @@
1
+ """FluidTokens V4 lending protocol integration (read side and indexing)."""
@@ -0,0 +1,149 @@
1
+ """FluidTokens V4 mainnet coordinates.
2
+
3
+ The protocol is parameterized by a config NFT whose UTxO carries a
4
+ :class:`~charli3_dendrite.lending.fluidtokens_v4.datums.ConfigDatum` with every
5
+ policy id and script hash. The constants below are the live mainnet values:
6
+ :func:`default_config` assembles them into that datum as an offline fallback, and
7
+ :func:`resolve_config` re-reads the live datum through the backend so discovery
8
+ follows a config update.
9
+
10
+ The lender-manager spend script is not listed in the config datum: pools opt into it
11
+ by pointing ``lender_bond_address`` at it, and it ships as a constant here. Its own
12
+ action scripts are listed in the lender-manager config datum, held with a separate
13
+ config NFT.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ from typing import TYPE_CHECKING
19
+
20
+ import cbor2 # type: ignore[import-not-found]
21
+ from pycardano import IndefiniteList
22
+ from pycardano import RawPlutusData
23
+ from pycardano.exception import DeserializeException
24
+
25
+ from charli3_dendrite.lending.fluidtokens_v4.datums import ConfigDatum
26
+
27
+ if TYPE_CHECKING:
28
+ from charli3_dendrite.backend.backend_base import AbstractBackend
29
+
30
+ CONFIG_NFT_POLICY = "235b32040fe1177c03b1d34febc470440c6eaaa2228a9c1b0e375200"
31
+ CONFIG_NFT_NAME = "706172616d6574657273" # "parameters"
32
+ LENDER_MANAGER_CONFIG_NFT_POLICY = (
33
+ "fb6ae2027358b4a0b62710eb95102d87fa13f66ecf55d8943699c492"
34
+ )
35
+ LENDER_MANAGER_CONFIG_NFT_NAME = "706172616d6574657273" # "parameters"
36
+
37
+ # Config datum values, in datum field order.
38
+ SMART_TOKENS_SPEND_SKH = "fca77bcce1e5e73c97a0bfa8c90f7cd2faff6fd6ed5b6fec1c04eefa"
39
+ ADMIN_SCRIPT_HASH = "d5940dc2ad9e3f43544fb02a28240f215602603a7519588532b72c53"
40
+ POOL_POLICY = "20f765d25da3a36644371f7619d97bdccf034f3067921921d9dce0f7"
41
+ REQUEST_POLICY = "9b2e325cc15d14fa23101741e6cc17e8ba977a1563738439968356d2"
42
+ BORROWER_BOND_POLICY = "eadc69a5d2d1357acc9b9d49ec5390fcdf6e080c7a40139917223dcb"
43
+ LENDER_BOND_POLICY = "bcd713bb7858d4b08738bed90ee7068d8f9b38d02e0cae0b45ac7a9b"
44
+ LOAN_POLICY = "20256f557cec14f61cc662468f7812a1e6531e628af257a5fc5dd0c5"
45
+ REPAYMENT_POLICY = "addd060da203f54e8ffc8a5d363094bc5e63d85734fe9d2869614d79"
46
+ POOL_SPEND_SKH = "ecd0c0fc554beb43ade65d45dd471ede4d9cfc9b22bb70de8e113458"
47
+ REQUEST_SPEND_SKH = "390d27f97868840864922fb0b5657ae4982b5be8bf03bf9cec81125e"
48
+ LOAN_SPEND_SKH = "b5763e3c9cb7f1a2167f74f76cb635d24d138a4cc5cf9d87659c662d"
49
+ LOAN_CLAIM_ACTION_SKH = "63b26ff93c96ae391e0f838de5d62053ec562ea82371c3aaab444902"
50
+ LOAN_REPAY_ACTION_SKH = "41ac9c9f0bd2acc2db8af9882b772daee90fcf1ad877f0451bd7af28"
51
+ LOAN_CHANGE_COLLATERAL_ACTION_SKH = (
52
+ "7aa6795463a8dcb3534246a6c3d6b1f29a72f920ae1dad6d0bacd43d"
53
+ )
54
+ LOAN_RECAST_ACTION_SKH = "c0af09a3656074f444e1daec043896c235d18aba0567aba7afb55fe8"
55
+ ASSET_MANAGER_SPEND_SKH = "b256da41be022ba1a28fe92b32eeea00109310e3f0aea1cb7791d98f"
56
+ POOL_CANCEL_ACTION_SKH = "f7ed285d6a9b9772666c7f379ac3e70d777b9d651026385fd26c3e4d"
57
+ POOL_BORROW_ACTION_SKH = "d86664db37ebf149386d3b26cc9b2e9c73bc11319052a6b4927c0a8f"
58
+ POOL_SELL_LENDER_POSITION_ACTION_SKH = (
59
+ "fc16ccaa435f24833da06681fdc8a71ae460c41517e87d12baf644fa"
60
+ )
61
+ POOL_COMPOUND_ACTION_SKH = "fef12ea655d7d562bd419cad05723e201b1f292e6b6be5a874f073ba"
62
+ POOL_EDIT_ACTION_SKH = "1ec1853344febb4f5de40fceca2316deb68baa3300161afed4ed6ae0"
63
+ POOL_MANAGER_SPEND_SKH = "dfb1d21e529af28d82004eee5689e3304bb896c35ce8fe65c85612b0"
64
+ POOL_MANAGER_POLICY = "1e0bf58a4ef7f8f7579b58e290ea9f9283239bb4f7932fe8f29df03a"
65
+ LOCKED_BORROWER_MANAGER_SPEND_SKH = (
66
+ "072eee302404c8d869bbc61a2c45502d371d96ec7d6aae7b179bfaa3"
67
+ )
68
+
69
+ # Not carried by the config datum (see the module docstring).
70
+ LENDER_MANAGER_SPEND_SKH = "6743f4b69446b4e066cfb89daa3d01ef041b6d2646968993be4cec09"
71
+
72
+ # Plutus ``Credential``: ``ScriptCredential`` is constructor alternative 1 (tag 122).
73
+ _SCRIPT_CREDENTIAL_TAG = 122
74
+
75
+
76
+ def default_config() -> ConfigDatum:
77
+ """The mainnet config datum rebuilt from this module's constants.
78
+
79
+ The Dutch auction is disabled on mainnet: its script hashes are empty and its
80
+ parameters are zero.
81
+ """
82
+ return ConfigDatum(
83
+ smart_tokens_spend_script_hash=bytes.fromhex(SMART_TOKENS_SPEND_SKH),
84
+ admin_credential=RawPlutusData(
85
+ cbor2.CBORTag(
86
+ _SCRIPT_CREDENTIAL_TAG,
87
+ IndefiniteList([bytes.fromhex(ADMIN_SCRIPT_HASH)]),
88
+ ),
89
+ ),
90
+ pool_policy_id=bytes.fromhex(POOL_POLICY),
91
+ request_policy_id=bytes.fromhex(REQUEST_POLICY),
92
+ borrower_bond_policy_id=bytes.fromhex(BORROWER_BOND_POLICY),
93
+ lender_bond_policy_id=bytes.fromhex(LENDER_BOND_POLICY),
94
+ loan_policy_id=bytes.fromhex(LOAN_POLICY),
95
+ repayment_policy_id=bytes.fromhex(REPAYMENT_POLICY),
96
+ pool_spend_script_hash=bytes.fromhex(POOL_SPEND_SKH),
97
+ request_spend_script_hash=bytes.fromhex(REQUEST_SPEND_SKH),
98
+ loan_spend_script_hash=bytes.fromhex(LOAN_SPEND_SKH),
99
+ loan_claim_action_script_hash=bytes.fromhex(LOAN_CLAIM_ACTION_SKH),
100
+ loan_repay_action_script_hash=bytes.fromhex(LOAN_REPAY_ACTION_SKH),
101
+ loan_change_collateral_action_script_hash=bytes.fromhex(
102
+ LOAN_CHANGE_COLLATERAL_ACTION_SKH,
103
+ ),
104
+ loan_recast_action_script_hash=bytes.fromhex(LOAN_RECAST_ACTION_SKH),
105
+ asset_manager_spend_script_hash=bytes.fromhex(ASSET_MANAGER_SPEND_SKH),
106
+ dutch_auction_spend_script_hash=b"",
107
+ dutch_auction_withdraw_script_hash=b"",
108
+ dutch_auction_starting_increase_per_mille=0,
109
+ dutch_auction_lowering_amount=0,
110
+ dutch_auction_lowering_frequency=0,
111
+ dutch_auction_min_price_to_cancel=0,
112
+ pool_cancel_action_script_hash=bytes.fromhex(POOL_CANCEL_ACTION_SKH),
113
+ pool_borrow_action_script_hash=bytes.fromhex(POOL_BORROW_ACTION_SKH),
114
+ pool_sell_lender_position_action_script_hash=bytes.fromhex(
115
+ POOL_SELL_LENDER_POSITION_ACTION_SKH,
116
+ ),
117
+ pool_compound_action_script_hash=bytes.fromhex(POOL_COMPOUND_ACTION_SKH),
118
+ pool_edit_action_script_hash=bytes.fromhex(POOL_EDIT_ACTION_SKH),
119
+ pool_manager_spend_script_hash=bytes.fromhex(POOL_MANAGER_SPEND_SKH),
120
+ pool_manager_policy_id=bytes.fromhex(POOL_MANAGER_POLICY),
121
+ locked_borrower_manager_spend_script_hash=bytes.fromhex(
122
+ LOCKED_BORROWER_MANAGER_SPEND_SKH,
123
+ ),
124
+ )
125
+
126
+
127
+ def resolve_config(backend: AbstractBackend) -> ConfigDatum:
128
+ """Read the live config datum held with the config NFT.
129
+
130
+ Falls back to :func:`default_config` when the datum cannot be read or decoded (a
131
+ backend without dbsync queries, a missing config UTxO or datum, or a datum whose
132
+ layout no longer matches :class:`ConfigDatum`), so discovery keeps working offline.
133
+ Database errors propagate.
134
+ """
135
+ # Imported lazily: the V3 resolver pulls in the V3 transaction context.
136
+ from charli3_dendrite.lending.fluidtokens.transactions.resolve import (
137
+ resolve_utxo_by_asset,
138
+ )
139
+
140
+ try:
141
+ utxo = resolve_utxo_by_asset(backend, CONFIG_NFT_POLICY, CONFIG_NFT_NAME)
142
+ except (TypeError, ValueError):
143
+ return default_config()
144
+ if not utxo.datum:
145
+ return default_config()
146
+ try:
147
+ return ConfigDatum.from_cbor(utxo.datum)
148
+ except (DeserializeException, ValueError, cbor2.CBORDecodeError):
149
+ return default_config()