charli3_dendrite 1.5.16.dev0__tar.gz → 1.5.17.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 (154) hide show
  1. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/pyproject.toml +2 -2
  3. charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/fluidtokens_v4/market.py +418 -0
  4. charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/fluidtokens_v4/rates.py +274 -0
  5. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/state.py +40 -0
  6. charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/markets.py +226 -0
  7. charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/normalized.py +535 -0
  8. charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/rates.py +138 -0
  9. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/LICENSE +0 -0
  10. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/README.md +0 -0
  11. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/__init__.py +0 -0
  12. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
  13. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/backend_base.py +0 -0
  14. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  15. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  16. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
  17. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  18. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  19. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  20. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
  21. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  22. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  23. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
  24. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
  25. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  26. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
  27. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  28. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  29. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/dano.py +0 -0
  30. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
  31. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  32. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/multi_asset.py +0 -0
  33. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
  34. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
  35. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
  36. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/sundae_v4.py +0 -0
  37. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/sundae_v4_deployments.json +0 -0
  38. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
  39. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
  40. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  41. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
  42. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  43. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  44. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  45. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/cardanoswaps.py +0 -0
  46. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
  47. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  48. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  49. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  50. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
  51. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/__init__.py +0 -0
  52. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/base.py +0 -0
  53. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/__init__.py +0 -0
  54. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/constants.py +0 -0
  55. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/datums.py +0 -0
  56. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/loader.py +0 -0
  57. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/market.py +0 -0
  58. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/math.py +0 -0
  59. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/__init__.py +0 -0
  60. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator.py +0 -0
  61. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator_datums.py +0 -0
  62. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/deployments.py +0 -0
  63. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/forward.py +0 -0
  64. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/leaves.py +0 -0
  65. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/locator.py +0 -0
  66. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/lp_pricing.py +0 -0
  67. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/recipes.json +0 -0
  68. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/redeemer.py +0 -0
  69. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/reproduce.py +0 -0
  70. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/structured_datums.py +0 -0
  71. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/state.py +0 -0
  72. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/__init__.py +0 -0
  73. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/_common.py +0 -0
  74. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/build.py +0 -0
  75. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/builder.py +0 -0
  76. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/context.py +0 -0
  77. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/create_loan.py +0 -0
  78. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/datum_synth.py +0 -0
  79. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/increase_loan.py +0 -0
  80. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/loan_ids.py +0 -0
  81. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/modify_collateral.py +0 -0
  82. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_redeemer.py +0 -0
  83. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_synth.py +0 -0
  84. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/redeemers.py +0 -0
  85. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/repay.py +0 -0
  86. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/topup_withdraw.py +0 -0
  87. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/verify.py +0 -0
  88. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/__init__.py +0 -0
  89. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/constants.py +0 -0
  90. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/datums.py +0 -0
  91. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/loader.py +0 -0
  92. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/market.py +0 -0
  93. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/math.py +0 -0
  94. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/__init__.py +0 -0
  95. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/feeds.py +0 -0
  96. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/fluid_api.py +0 -0
  97. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/witness.py +0 -0
  98. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/state.py +0 -0
  99. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/__init__.py +0 -0
  100. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/_common.py +0 -0
  101. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow.py +0 -0
  102. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow_terms.py +0 -0
  103. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/builder.py +0 -0
  104. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/change_collateral.py +0 -0
  105. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/context.py +0 -0
  106. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/datum_synth.py +0 -0
  107. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/lend.py +0 -0
  108. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/pool.py +0 -0
  109. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/recast.py +0 -0
  110. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/redeemers.py +0 -0
  111. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/repay.py +0 -0
  112. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/request.py +0 -0
  113. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/resolve.py +0 -0
  114. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/utxos.py +0 -0
  115. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/__init__.py +0 -0
  116. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/constants.py +0 -0
  117. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/datums.py +0 -0
  118. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/indexing.py +0 -0
  119. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/loader.py +0 -0
  120. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/__init__.py +0 -0
  121. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/borrow.py +0 -0
  122. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/builder.py +0 -0
  123. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/change_collateral.py +0 -0
  124. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/claim.py +0 -0
  125. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/common.py +0 -0
  126. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/lender_bond.py +0 -0
  127. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/loan_action.py +0 -0
  128. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/loan_terms.py +0 -0
  129. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/oracle.py +0 -0
  130. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_action.py +0 -0
  131. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_cancel.py +0 -0
  132. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_create.py +0 -0
  133. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_edit.py +0 -0
  134. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_terms.py +0 -0
  135. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/recast.py +0 -0
  136. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/redeemers.py +0 -0
  137. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/repay.py +0 -0
  138. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/resolve.py +0 -0
  139. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/math.py +0 -0
  140. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/__init__.py +0 -0
  141. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/charli3.py +0 -0
  142. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/dex_pooled.py +0 -0
  143. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/fluid.py +0 -0
  144. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/models.py +0 -0
  145. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/orcfax.py +0 -0
  146. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/qtoken.py +0 -0
  147. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/plutus.py +0 -0
  148. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/registry.py +0 -0
  149. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/transactions/__init__.py +0 -0
  150. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/transactions/base.py +0 -0
  151. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/transactions/infra.py +0 -0
  152. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/transactions/snapshot.py +0 -0
  153. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/units.py +0 -0
  154. {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.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.16.dev0
3
+ Version: 1.5.17.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.16-dev0"
3
+ version = "1.5.17-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.16-dev0"
53
+ current_version = "1.5.17-dev0"
54
54
  parse = """(?x)
55
55
  (?P<major>\\d+)\\.
56
56
  (?P<minor>\\d+)\\.
@@ -0,0 +1,418 @@
1
+ """FluidTokens V4 states as common lending views, and the V4 market source.
2
+
3
+ A V4 pool is one market, a loan one position and a request one borrow request. The
4
+ conversions read only the UTxO (and, for a pool's lender, its pool manager); every
5
+ number comes from the datum and the contract-exact maths.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import time
11
+ from fractions import Fraction
12
+ from typing import TYPE_CHECKING
13
+ from typing import Any
14
+
15
+ from pycardano import RawCBOR
16
+
17
+ from charli3_dendrite.lending.fluidtokens.transactions.borrow_terms import (
18
+ min_output_lovelace,
19
+ )
20
+ from charli3_dendrite.lending.fluidtokens_v4 import constants as c
21
+ from charli3_dendrite.lending.fluidtokens_v4.indexing import EntityKind
22
+ from charli3_dendrite.lending.fluidtokens_v4.indexing import entity_selectors
23
+ from charli3_dendrite.lending.fluidtokens_v4.indexing import parse_utxo
24
+ from charli3_dendrite.lending.fluidtokens_v4.rates import PROTOCOL_NAME
25
+ from charli3_dendrite.lending.fluidtokens_v4.rates import FluidAmortizedRate
26
+ from charli3_dendrite.lending.fluidtokens_v4.rates import FluidFlatTermRate
27
+ from charli3_dendrite.lending.fluidtokens_v4.rates import FluidPerpetualRate
28
+ from charli3_dendrite.lending.fluidtokens_v4.state import PERMISSIONLESS_MARKER
29
+ from charli3_dendrite.lending.fluidtokens_v4.state import AuthMethod
30
+ from charli3_dendrite.lending.fluidtokens_v4.state import FluidV4LoanState
31
+ from charli3_dendrite.lending.fluidtokens_v4.state import FluidV4PoolState
32
+ from charli3_dendrite.lending.fluidtokens_v4.state import FluidV4RequestState
33
+ from charli3_dendrite.lending.fluidtokens_v4.state import auth_method
34
+ from charli3_dendrite.lending.fluidtokens_v4.state import collateral_asset_unit
35
+ from charli3_dendrite.lending.fluidtokens_v4.state import decode_repayment_mode
36
+ from charli3_dendrite.lending.fluidtokens_v4.state import names_under
37
+ from charli3_dendrite.lending.markets import LendingSnapshot
38
+ from charli3_dendrite.lending.markets import WatchSpec
39
+ from charli3_dendrite.lending.normalized import BorrowRequest
40
+ from charli3_dendrite.lending.normalized import CollateralHolding
41
+ from charli3_dendrite.lending.normalized import CollateralTerms
42
+ from charli3_dendrite.lending.normalized import DefaultRule
43
+ from charli3_dendrite.lending.normalized import LendingMarket
44
+ from charli3_dendrite.lending.normalized import LendingParseError
45
+ from charli3_dendrite.lending.normalized import LendingPosition
46
+ from charli3_dendrite.lending.normalized import Origin
47
+ from charli3_dendrite.lending.normalized import Party
48
+ from charli3_dendrite.lending.normalized import PartyKind
49
+ from charli3_dendrite.lending.oracles.models import OracleRef
50
+ from charli3_dendrite.lending.oracles.models import OracleSource
51
+ from charli3_dendrite.lending.units import constr
52
+
53
+ if TYPE_CHECKING:
54
+ from charli3_dendrite.backend.backend_base import AbstractBackend
55
+ from charli3_dendrite.dataclasses.models import Assets
56
+ from charli3_dendrite.dataclasses.models import PoolStateInfo
57
+ from charli3_dendrite.lending.fluidtokens_v4.datums import CollateralAsset
58
+ from charli3_dendrite.lending.fluidtokens_v4.datums import ConfigDatum
59
+ from charli3_dendrite.lending.fluidtokens_v4.state import FluidV4PoolManagerState
60
+ from charli3_dendrite.lending.rates import RateModel
61
+
62
+ # Constructor alternatives of RepaymentMode, LiquidationMode and Option.
63
+ _AMORTIZED, _FLAT_TERM, _PERPETUAL = 0, 1, 2
64
+ _FULL_CLAIM, _DUTCH_AUCTION, _LIQUIDATION = 0, 1, 2
65
+ _OPTION_NONE = 1
66
+
67
+ # The oracle-token placeholder of a collateral with no price feed.
68
+ _NO_ORACLE = b"NONE"
69
+
70
+ _PER_MILLE = 1000
71
+
72
+ # Errors a malformed datum field raises while it is converted.
73
+ _CONVERSION_ERRORS = (ValueError, TypeError, IndexError, AttributeError)
74
+
75
+
76
+ def party_of(auth: AuthMethod) -> Party:
77
+ """A V4 ``AuthorizationMethod`` as a party; the auth kind is kept as ``detail``."""
78
+ kind = PartyKind.KEY if auth.kind == "signature" else PartyKind.SCRIPT
79
+ return Party(kind=kind, identifier=auth.hash_hex, detail=auth.kind)
80
+
81
+
82
+ def rate_model_of(terms: Any) -> RateModel: # noqa: ANN401 - CommonData or LoanDatum
83
+ """The rate model of a V4 ``CommonData`` or ``LoanDatum``'s loan terms."""
84
+ alt, fields = decode_repayment_mode(terms.repayment_mode)
85
+ shared = {
86
+ "interest_rate": int(terms.interest_rate),
87
+ "total_installments": int(terms.total_installments),
88
+ "installment_period": int(terms.installment_period),
89
+ "initial_grace_period": int(terms.initial_grace_period),
90
+ "repayment_time_window": int(terms.repayment_time_window),
91
+ "penalty_fee_for_late_repayment": int(terms.penalty_fee_for_late_repayment),
92
+ }
93
+ if alt == _PERPETUAL:
94
+ return FluidPerpetualRate(**shared, apy_coef=int(fields[0]))
95
+ if alt == _FLAT_TERM:
96
+ return FluidFlatTermRate(**shared)
97
+ return FluidAmortizedRate(**shared)
98
+
99
+
100
+ class _Liquidation:
101
+ """What a V4 ``LiquidationMode`` means for the common views."""
102
+
103
+ def __init__(self, mode: Any) -> None: # noqa: ANN401 - a LiquidationMode
104
+ """Decode ``mode``; raises LendingParseError on an unknown or bad variant."""
105
+ alt, fields = constr(mode)
106
+ self.ltv: Fraction | None = None
107
+ self.penalty: Fraction | None = None
108
+ self.equity_to_borrower = False
109
+ if alt == _LIQUIDATION:
110
+ l_tv, divider, penalty = int(fields[0]), int(fields[1]), int(fields[2])
111
+ if l_tv < 0 or divider <= 0:
112
+ raise LendingParseError(f"invalid liquidation LTV {l_tv}/{divider}")
113
+ self.rule = DefaultRule.PRICE_LIQUIDATION
114
+ self.ltv = Fraction(l_tv, divider)
115
+ # A negative penalty means the borrower forfeits all collateral.
116
+ self.equity_to_borrower = penalty >= 0
117
+ self.penalty = Fraction(penalty, _PER_MILLE) if penalty >= 0 else None
118
+ elif alt == _FULL_CLAIM:
119
+ self.rule = DefaultRule.FULL_COLLATERAL_CLAIM
120
+ elif alt == _DUTCH_AUCTION:
121
+ self.rule = DefaultRule.DUTCH_AUCTION
122
+ else:
123
+ raise LendingParseError(f"unknown liquidation mode {alt}")
124
+
125
+
126
+ def _ratio(numerator: int, denominator: int, what: str) -> Fraction:
127
+ """A positive datum ratio; the contract cannot use a zero or negative one."""
128
+ if numerator <= 0 or denominator <= 0:
129
+ raise LendingParseError(f"invalid {what} {numerator}/{denominator}")
130
+ return Fraction(numerator, denominator)
131
+
132
+
133
+ def _is_policy_wide(collateral: CollateralAsset) -> bool:
134
+ return constr(collateral.maybe_asset_name)[0] == _OPTION_NONE
135
+
136
+
137
+ def _price_source(
138
+ collateral: CollateralAsset,
139
+ unit: str,
140
+ *,
141
+ dynamic: bool,
142
+ ) -> OracleRef | None:
143
+ """The feed pricing ``collateral`` in lovelace; None when not oracle-priced.
144
+
145
+ The contract's feeds price every token in lovelace, the principal included.
146
+ """
147
+ feed = collateral.oracle_token_asset
148
+ if not dynamic or feed.policy_id == _NO_ORACLE:
149
+ return None
150
+ return OracleRef(
151
+ source=OracleSource.FLUID_AGGREGATED,
152
+ token=unit,
153
+ quote="lovelace",
154
+ feed_policy=feed.policy_id.hex(),
155
+ feed_name=feed.asset_name.hex(),
156
+ )
157
+
158
+
159
+ def _collateral_terms(
160
+ collateral: CollateralAsset,
161
+ ratio: Fraction,
162
+ liquidation: _Liquidation,
163
+ *,
164
+ dynamic: bool,
165
+ ) -> CollateralTerms:
166
+ unit = collateral_asset_unit(collateral)
167
+ return CollateralTerms(
168
+ unit=unit,
169
+ policy_wide=_is_policy_wide(collateral),
170
+ max_ltv=ratio if dynamic else None,
171
+ fixed_ratio=None if dynamic else ratio,
172
+ liquidation_ltv=liquidation.ltv,
173
+ liquidation_penalty=liquidation.penalty,
174
+ liquidation_discount=None,
175
+ equity_to_borrower=liquidation.equity_to_borrower,
176
+ price_source=_price_source(collateral, unit, dynamic=dynamic),
177
+ )
178
+
179
+
180
+ def _holding(
181
+ assets: Assets,
182
+ collateral: CollateralAsset,
183
+ ) -> list[CollateralHolding]:
184
+ """The collateral a UTxO holds: one unit, or each token of a policy-wide option."""
185
+ unit = collateral_asset_unit(collateral)
186
+ if not _is_policy_wide(collateral):
187
+ return [CollateralHolding(unit, assets[unit])]
188
+ return [
189
+ CollateralHolding(unit + name, assets[unit + name])
190
+ for name in names_under(assets, unit)
191
+ ]
192
+
193
+
194
+ def lendable_principal(pool: FluidV4PoolState) -> int:
195
+ """How much principal ``pool`` can lend now.
196
+
197
+ A borrow must leave the pool output holding exactly its input less the principal,
198
+ so an ADA pool keeps the continuing output's min-ADA: the same floor the borrow
199
+ builder enforces. A token pool lends its whole token quantity.
200
+ """
201
+ unit = pool.borrowable_unit
202
+ if unit != "lovelace":
203
+ return pool.assets[unit]
204
+ others = {u: q for u, q in pool.assets.items() if u != "lovelace" and q}
205
+ floor = min_output_lovelace(
206
+ address=pool.address,
207
+ assets=others,
208
+ datum=RawCBOR(bytes.fromhex(pool.datum_cbor)),
209
+ slot=0,
210
+ )
211
+ return max(pool.assets["lovelace"] - floor, 0)
212
+
213
+
214
+ def _converted(what: str, exc: Exception) -> LendingParseError:
215
+ if isinstance(exc, LendingParseError):
216
+ return exc
217
+ return LendingParseError(f"{what}: {exc}")
218
+
219
+
220
+ def pool_to_market(
221
+ pool: FluidV4PoolState,
222
+ pool_manager: FluidV4PoolManagerState | None = None,
223
+ ) -> LendingMarket:
224
+ """``pool`` as a market; its lender is the pool manager's owner when given."""
225
+ if pool_manager is not None and pool_manager.pool_id != pool.pool_id:
226
+ raise ValueError(
227
+ f"pool manager {pool_manager.out_ref} does not manage pool {pool.out_ref}",
228
+ )
229
+ try:
230
+ datum = pool.pool_datum
231
+ common = datum.common_data # type: ignore[attr-defined]
232
+ quote = common.principal_asset.unit()
233
+ liquidation = _Liquidation(common.liquidation_mode)
234
+ dynamic = pool.market.is_dynamic
235
+ collateral = tuple(
236
+ _collateral_terms(
237
+ option,
238
+ _ratio(int(minimum), int(divider), "collateral ratio"),
239
+ liquidation,
240
+ dynamic=dynamic,
241
+ )
242
+ for option, minimum, divider in zip(
243
+ datum.collateral_options, # type: ignore[attr-defined]
244
+ datum.min_collateral, # type: ignore[attr-defined]
245
+ datum.min_collateral_divider, # type: ignore[attr-defined]
246
+ strict=True,
247
+ )
248
+ )
249
+ owner = (
250
+ pool_manager.owner_auth
251
+ if pool_manager is not None
252
+ else auth_method(datum.lender_auth) # type: ignore[attr-defined]
253
+ )
254
+ return LendingMarket(
255
+ protocol=PROTOCOL_NAME,
256
+ market_id=c.POOL_POLICY + pool.pool_id,
257
+ borrow_unit=quote,
258
+ lender=party_of(owner),
259
+ available_liquidity=lendable_principal(pool),
260
+ rate_model=rate_model_of(common),
261
+ supply_rate=None,
262
+ receipt_unit=None,
263
+ utilization=None,
264
+ collateral=collateral,
265
+ on_default=liquidation.rule,
266
+ permissioned=pool.is_permissioned,
267
+ )
268
+ except _CONVERSION_ERRORS as exc:
269
+ raise _converted(f"pool {pool.out_ref}", exc) from exc
270
+
271
+
272
+ def _origin(loan: FluidV4LoanState) -> Origin | None:
273
+ kind, name = loan.origin
274
+ if kind == "pool":
275
+ return Origin("market", c.POOL_POLICY + name)
276
+ if kind == "request":
277
+ return Origin("request", c.REQUEST_POLICY + name)
278
+ return None
279
+
280
+
281
+ def loan_to_position(loan: FluidV4LoanState) -> LendingPosition:
282
+ """``loan`` as a position; its bonds' holders are the borrower and the lender."""
283
+ try:
284
+ datum = loan.loan_datum
285
+ loan_id = loan.loan_id
286
+ liquidation = _Liquidation(datum.liquidation_mode) # type: ignore[attr-defined]
287
+ return LendingPosition(
288
+ protocol=PROTOCOL_NAME,
289
+ position_id=c.LOAN_POLICY + loan_id,
290
+ origin=_origin(loan),
291
+ borrower=Party(PartyKind.TOKEN, c.BORROWER_BOND_POLICY + loan_id),
292
+ lender=Party(PartyKind.TOKEN, c.LENDER_BOND_POLICY + loan_id),
293
+ borrow_unit=loan.borrowed_unit,
294
+ principal=int(datum.principal_amount), # type: ignore[attr-defined]
295
+ installments_paid=int(datum.repaid_installments), # type: ignore[attr-defined]
296
+ collateral=tuple(
297
+ _holding(loan.assets, datum.collateral), # type: ignore[attr-defined]
298
+ ),
299
+ rate_model=rate_model_of(datum),
300
+ liquidation_ltv=liquidation.ltv,
301
+ on_default=liquidation.rule,
302
+ opened_ms=int(datum.lend_date), # type: ignore[attr-defined]
303
+ )
304
+ except _CONVERSION_ERRORS as exc:
305
+ raise _converted(f"loan {loan.out_ref}", exc) from exc
306
+
307
+
308
+ def request_to_borrow_request(request: FluidV4RequestState) -> BorrowRequest:
309
+ """``request`` as a borrow request."""
310
+ try:
311
+ datum = request.request_datum
312
+ common = datum.common_data
313
+ quote = common.principal_asset.unit()
314
+ liquidation = _Liquidation(common.liquidation_mode)
315
+ held = _holding(request.assets, datum.collateral)
316
+ holding = CollateralHolding(
317
+ collateral_asset_unit(datum.collateral),
318
+ sum(h.amount for h in held),
319
+ )
320
+ return BorrowRequest(
321
+ protocol=PROTOCOL_NAME,
322
+ request_id=c.REQUEST_POLICY + request.request_id,
323
+ borrower=party_of(auth_method(datum.borrower_auth)),
324
+ borrow_unit=quote,
325
+ collateral=holding,
326
+ principal_limit=_collateral_terms(
327
+ datum.collateral,
328
+ _ratio(
329
+ int(datum.min_principal),
330
+ int(datum.min_principal_divider),
331
+ "principal ratio",
332
+ ),
333
+ liquidation,
334
+ dynamic=request.is_dynamic,
335
+ ),
336
+ principal_max=int(datum.max_principal),
337
+ rate_model=rate_model_of(common),
338
+ on_default=liquidation.rule,
339
+ expires_ms=int(datum.request_expiration),
340
+ expiry_penalty=int(datum.request_expiration_penalty),
341
+ permissioned=datum.permissioned_condition_script_hash
342
+ != PERMISSIONLESS_MARKER,
343
+ )
344
+ except _CONVERSION_ERRORS as exc:
345
+ raise _converted(f"request {request.out_ref}", exc) from exc
346
+
347
+
348
+ _VIEW_KINDS = (EntityKind.POOL, EntityKind.LOAN, EntityKind.REQUEST)
349
+
350
+
351
+ class FluidTokensV4MarketSource:
352
+ """FluidTokens V4 pools, loans and requests as common views."""
353
+
354
+ name = PROTOCOL_NAME
355
+
356
+ def __init__(self, config: ConfigDatum | None = None) -> None:
357
+ """Watch the deployment ``config`` names; mainnet by default."""
358
+ selectors = entity_selectors(config)
359
+ self._selectors = {kind: selectors[kind] for kind in _VIEW_KINDS}
360
+
361
+ def selectors(self) -> list[WatchSpec]:
362
+ """The pool, loan and request credentials and identity policies."""
363
+ return [
364
+ WatchSpec(s.payment_credential, s.identity_policy)
365
+ for s in self._selectors.values()
366
+ ]
367
+
368
+ def parse(
369
+ self,
370
+ info: PoolStateInfo,
371
+ ) -> LendingMarket | LendingPosition | BorrowRequest | None:
372
+ """One UTxO as its view; None when it is not a V4 pool, loan or request.
373
+
374
+ Raises LendingParseError for a pool, loan or request it cannot convert.
375
+ """
376
+ state = parse_utxo(info, self._selectors)
377
+ if isinstance(state, FluidV4PoolState):
378
+ return pool_to_market(state)
379
+ if isinstance(state, FluidV4LoanState):
380
+ return loan_to_position(state)
381
+ if isinstance(state, FluidV4RequestState):
382
+ return request_to_borrow_request(state)
383
+ return None
384
+
385
+ def load(
386
+ self,
387
+ backend: AbstractBackend,
388
+ now_ms: int | None = None,
389
+ ) -> LendingSnapshot:
390
+ """Every live V4 pool, loan and request, each pool with its manager's owner.
391
+
392
+ UTxOs that raise LendingParseError are left out.
393
+ """
394
+ from charli3_dendrite.lending.fluidtokens_v4.loader import snapshot
395
+
396
+ found = snapshot(
397
+ backend,
398
+ now_ms=int(time.time() * 1000) if now_ms is None else now_ms,
399
+ )
400
+ managers = {manager.pool_id: manager for manager in found.pool_managers}
401
+ return LendingSnapshot(
402
+ markets=_convertible(
403
+ lambda pool: pool_to_market(pool, managers.get(pool.pool_id)),
404
+ found.pools,
405
+ ),
406
+ positions=_convertible(loan_to_position, found.loans),
407
+ requests=_convertible(request_to_borrow_request, found.requests),
408
+ )
409
+
410
+
411
+ def _convertible(convert: Any, states: list[Any]) -> tuple[Any, ...]: # noqa: ANN401
412
+ out = []
413
+ for state in states:
414
+ try:
415
+ out.append(convert(state))
416
+ except LendingParseError:
417
+ continue
418
+ return tuple(out)