charli3_dendrite 1.5.14.dev0__tar.gz → 1.5.14.dev2__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 (143) hide show
  1. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/PKG-INFO +1 -1
  2. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/pyproject.toml +2 -2
  3. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/wingriders.py +21 -3
  4. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/math.py +115 -8
  5. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens/transactions/borrow_terms.py +195 -0
  6. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/context.py +51 -297
  7. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/datum_synth.py +4 -2
  8. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/resolve.py +6 -6
  9. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens/transactions/utxos.py +160 -0
  10. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/datums.py +18 -0
  11. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/__init__.py +1 -0
  12. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/borrow.py +869 -0
  13. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/builder.py +193 -0
  14. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/change_collateral.py +371 -0
  15. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/common.py +127 -0
  16. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/lender_bond.py +93 -0
  17. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/loan_action.py +436 -0
  18. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/loan_terms.py +240 -0
  19. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/oracle.py +153 -0
  20. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/recast.py +274 -0
  21. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/redeemers.py +215 -0
  22. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/repay.py +335 -0
  23. charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/resolve.py +218 -0
  24. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/registry.py +4 -0
  25. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/LICENSE +0 -0
  26. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/README.md +0 -0
  27. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/__init__.py +0 -0
  28. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/__init__.py +0 -0
  29. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/backend_base.py +0 -0
  30. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
  31. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
  32. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
  33. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
  34. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
  35. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
  36. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/utils.py +0 -0
  37. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
  38. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dataclasses/datums.py +0 -0
  39. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dataclasses/models.py +0 -0
  40. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/__init__.py +0 -0
  41. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
  42. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
  43. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
  44. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
  45. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/dano.py +0 -0
  46. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
  47. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
  48. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/multi_asset.py +0 -0
  49. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
  50. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
  51. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
  52. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/sundae_v4.py +0 -0
  53. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/sundae_v4_deployments.json +0 -0
  54. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
  55. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
  56. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/core/base.py +0 -0
  57. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/core/errors.py +0 -0
  58. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
  59. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
  60. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/cardanoswaps.py +0 -0
  61. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
  62. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
  63. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
  64. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
  65. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
  66. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/__init__.py +0 -0
  67. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/base.py +0 -0
  68. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/__init__.py +0 -0
  69. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/constants.py +0 -0
  70. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/datums.py +0 -0
  71. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/loader.py +0 -0
  72. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/market.py +0 -0
  73. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/math.py +0 -0
  74. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/__init__.py +0 -0
  75. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/aggregator.py +0 -0
  76. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/aggregator_datums.py +0 -0
  77. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/deployments.py +0 -0
  78. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/forward.py +0 -0
  79. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/leaves.py +0 -0
  80. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/locator.py +0 -0
  81. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/lp_pricing.py +0 -0
  82. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/recipes.json +0 -0
  83. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/redeemer.py +0 -0
  84. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/reproduce.py +0 -0
  85. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/structured_datums.py +0 -0
  86. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/state.py +0 -0
  87. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/__init__.py +0 -0
  88. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/_common.py +0 -0
  89. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/build.py +0 -0
  90. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/builder.py +0 -0
  91. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/context.py +0 -0
  92. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/create_loan.py +0 -0
  93. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/datum_synth.py +0 -0
  94. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/increase_loan.py +0 -0
  95. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/loan_ids.py +0 -0
  96. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/modify_collateral.py +0 -0
  97. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/oracle_redeemer.py +0 -0
  98. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/oracle_synth.py +0 -0
  99. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/redeemers.py +0 -0
  100. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/repay.py +0 -0
  101. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/topup_withdraw.py +0 -0
  102. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/verify.py +0 -0
  103. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/__init__.py +0 -0
  104. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/constants.py +0 -0
  105. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/datums.py +0 -0
  106. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/loader.py +0 -0
  107. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/market.py +0 -0
  108. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/oracles/__init__.py +0 -0
  109. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/oracles/feeds.py +0 -0
  110. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/oracles/fluid_api.py +0 -0
  111. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/oracles/witness.py +0 -0
  112. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/state.py +0 -0
  113. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/__init__.py +0 -0
  114. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/_common.py +0 -0
  115. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow.py +0 -0
  116. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/builder.py +0 -0
  117. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/change_collateral.py +0 -0
  118. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/lend.py +0 -0
  119. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/pool.py +0 -0
  120. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/recast.py +0 -0
  121. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/redeemers.py +0 -0
  122. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/repay.py +0 -0
  123. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/request.py +0 -0
  124. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/__init__.py +0 -0
  125. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/constants.py +0 -0
  126. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/indexing.py +0 -0
  127. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/loader.py +0 -0
  128. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/state.py +0 -0
  129. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/math.py +0 -0
  130. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/__init__.py +0 -0
  131. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/charli3.py +0 -0
  132. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/dex_pooled.py +0 -0
  133. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/fluid.py +0 -0
  134. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/models.py +0 -0
  135. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/orcfax.py +0 -0
  136. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/qtoken.py +0 -0
  137. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/plutus.py +0 -0
  138. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/transactions/__init__.py +0 -0
  139. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/transactions/base.py +0 -0
  140. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/transactions/infra.py +0 -0
  141. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/transactions/snapshot.py +0 -0
  142. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/units.py +0 -0
  143. {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/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.14.dev0
3
+ Version: 1.5.14.dev2
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.14-dev0"
3
+ version = "1.5.14-dev2"
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.14-dev0"
53
+ current_version = "1.5.14-dev2"
54
54
  parse = """(?x)
55
55
  (?P<major>\\d+)\\.
56
56
  (?P<minor>\\d+)\\.
@@ -696,6 +696,12 @@ class WingRidersSSPState(AbstractStableSwapPoolState, WingRidersCPPState):
696
696
  return ["980e8c567670d34d4ec13a0c3b6de6199f260ae5dc9dc9e867bc5c934c"]
697
697
 
698
698
 
699
+ # WingRiders V2 agent fee tiers: the most ADA an order can move and still pay the
700
+ # small (0.85 ADA) or medium (1.5 ADA) fee.
701
+ _V2_SMALL_ORDER_MAX_LOVELACE = 250_000_000
702
+ _V2_MEDIUM_ORDER_MAX_LOVELACE = 500_000_000
703
+
704
+
699
705
  class WingRidersV2CPPState(AbstractConstantProductPoolState):
700
706
  """WingRiders CPP state."""
701
707
 
@@ -839,10 +845,22 @@ class WingRidersV2CPPState(AbstractConstantProductPoolState):
839
845
  out_assets: Assets | None = None,
840
846
  extra_assets: Assets | None = None,
841
847
  ):
842
- """The V2 batcher charges a flat 2 ADA regardless of swap size (an order
843
- fill deducts exactly ``2_000_000`` from the order value; the V1-era ADA
844
- size tiers do not apply to V2).
848
+ """The agent fee the batcher keeps, tiered by the order's ADA amount.
849
+
850
+ An order always attaches 4 ADA on top of the swap: this fee plus the
851
+ refundable :meth:`deposit`. The batcher keeps 0.85 ADA when the order moves
852
+ at most 250 ADA, 1.5 ADA up to 500 ADA, and 2 ADA above that or when no ADA
853
+ is swapped, and returns the rest of the 4 ADA with the swap output.
845
854
  """
855
+ if in_assets is None or out_assets is None:
856
+ return Assets(lovelace=2000000)
857
+ merged_assets = in_assets + out_assets
858
+ if "lovelace" in merged_assets:
859
+ lovelace = merged_assets["lovelace"]
860
+ if lovelace <= _V2_SMALL_ORDER_MAX_LOVELACE:
861
+ return Assets(lovelace=850000)
862
+ if lovelace <= _V2_MEDIUM_ORDER_MAX_LOVELACE:
863
+ return Assets(lovelace=1500000)
846
864
  return Assets(lovelace=2000000)
847
865
 
848
866
 
@@ -40,21 +40,50 @@ def perpetual_outstanding_debt(
40
40
  repaid_installments: int = 0,
41
41
  installment_period: int = 0,
42
42
  initial_grace_period: int = 0,
43
+ ) -> int:
44
+ """Perpetual remaining debt for analytics: the principal before ``lend_date``.
45
+
46
+ Equal to :func:`perpetual_debt` once ``now_ms`` is past ``lend_date_ms``. A loan's
47
+ ``lend_date`` is its borrow transaction's validity upper bound, so for up to an
48
+ hour after the borrow ``now_ms`` can precede it; analytics report the principal
49
+ there, where the contract's own formula dips below it.
50
+ """
51
+ elapsed_ms = now_ms - lend_date_ms
52
+ if elapsed_ms <= 0:
53
+ return principal
54
+ return perpetual_debt(
55
+ principal=principal,
56
+ interest_rate=interest_rate,
57
+ apy_coef=apy_coef,
58
+ elapsed_ms=elapsed_ms,
59
+ repaid_installments=repaid_installments,
60
+ installment_period=installment_period,
61
+ initial_grace_period=initial_grace_period,
62
+ )
63
+
64
+
65
+ def perpetual_debt(
66
+ *,
67
+ principal: int,
68
+ interest_rate: int,
69
+ apy_coef: int,
70
+ elapsed_ms: int,
71
+ repaid_installments: int = 0,
72
+ installment_period: int = 0,
73
+ initial_grace_period: int = 0,
43
74
  ) -> int:
44
75
  """Perpetual remaining debt == ``finance.ak`` get_remaining_debt (PerpetualLoan).
45
76
 
46
77
  ``remainingInterest = principal * (c * dh + m * H^2) / 8760`` where
47
78
  ``c = interest_rate/10000``, ``m = apy_coef/1_000_000``, ``H`` is the exact
48
- fractional hours since ``lend_date`` and
79
+ fractional hours elapsed since ``lend_date`` and
49
80
  ``dh = H - accumulatedHoursOfRepaidInstallments``; the debt is
50
- ``ceil(principal + remainingInterest)``. The on-chain validator measures time to the
51
- transaction's validity upper bound; analytics use ``now_ms`` as that proxy.
81
+ ``ceil(principal + remainingInterest)``. The validators measure ``elapsed_ms`` to
82
+ the transaction's validity upper bound and apply the formula at any sign, so a
83
+ transaction amount must use this, not :func:`perpetual_outstanding_debt`.
52
84
  """
53
- t = now_ms - lend_date_ms
54
- if t <= 0:
55
- return principal
56
- hours = Fraction(t, _MS_PER_HOUR)
57
- hours_squared = Fraction(t * t, _MS_PER_HOUR * _MS_PER_HOUR)
85
+ hours = Fraction(elapsed_ms, _MS_PER_HOUR)
86
+ hours_squared = Fraction(elapsed_ms * elapsed_ms, _MS_PER_HOUR * _MS_PER_HOUR)
58
87
  m = Fraction(apy_coef, 1_000_000)
59
88
  c = Fraction(interest_rate, _BASIS)
60
89
  accumulated = _accumulated_installment_hours(
@@ -69,6 +98,33 @@ def perpetual_outstanding_debt(
69
98
  return ceil(Fraction(principal) + remaining_interest)
70
99
 
71
100
 
101
+ def is_repayment_late(
102
+ *,
103
+ is_perpetual: bool,
104
+ now_ms: int,
105
+ lend_date_ms: int,
106
+ initial_grace_period: int,
107
+ repaid_installments: int,
108
+ installment_period: int,
109
+ repayment_time_window: int,
110
+ ) -> bool:
111
+ """``finance.ak`` is_repayment_late: past the next installment's repayment window.
112
+
113
+ A perpetual loan without installments is never late. Otherwise the next installment
114
+ is due ``initial_grace_period + (repaid_installments + 1) * installment_period``
115
+ hours after ``lend_date``, with ``repayment_time_window`` hours of slack; ``now_ms``
116
+ past that deadline (strictly) is late.
117
+ """
118
+ if is_perpetual and installment_period == 0:
119
+ return False
120
+ hours = (
121
+ initial_grace_period
122
+ + (repaid_installments + 1) * installment_period
123
+ + repayment_time_window
124
+ )
125
+ return now_ms > lend_date_ms + hours * _MS_PER_HOUR
126
+
127
+
72
128
  def amortization_installment(
73
129
  *,
74
130
  principal: int,
@@ -164,3 +220,54 @@ def health_factor(
164
220
  if debt <= 0 or l_tv_divider <= 0:
165
221
  return Decimal("Infinity")
166
222
  return (collateral_value * Decimal(l_tv)) / (debt * Decimal(l_tv_divider))
223
+
224
+
225
+ def amortized_remaining_principal(
226
+ *,
227
+ principal: int,
228
+ interest_rate: int,
229
+ total_installments: int,
230
+ repaid_installments: int,
231
+ ) -> int:
232
+ """Principal left after ``repaid_installments`` amortized installments.
233
+
234
+ ``loan_recast_action.ak``: with ``R = 1 + (interest_rate/10000)/n`` and the annuity
235
+ ``A`` of :func:`amortization_installment`, the remaining principal is
236
+ ``ceil(P * R^k - A * (R^k - 1) / (R - 1))``. A zero rate or no installments has no
237
+ on-chain value (the contract divides by zero) and raises ``ValueError``.
238
+ """
239
+ if total_installments <= 0 or interest_rate == 0:
240
+ raise ValueError("an amortized loan needs installments and a non-zero rate")
241
+ installment = amortization_installment(
242
+ principal=principal,
243
+ interest_rate=interest_rate,
244
+ total_installments=total_installments,
245
+ )
246
+ growth = 1 + Fraction(interest_rate, _BASIS) / total_installments
247
+ growth_k = growth**repaid_installments
248
+ return ceil(
249
+ principal * growth_k - installment * (growth_k - 1) / (growth - 1),
250
+ )
251
+
252
+
253
+ def liquidation_min_collateral(
254
+ *,
255
+ debt: int,
256
+ principal_price: Fraction,
257
+ collateral_price: Fraction,
258
+ l_tv: int,
259
+ l_tv_divider: int,
260
+ ) -> int:
261
+ """Smallest collateral amount the contract does not consider liquidatable.
262
+
263
+ ``finance.ak`` can_liquidate liquidates when the collateral is worth nothing or
264
+ ``l_tv / l_tv_divider < debt_value / collateral_value`` (strictly), prices being
265
+ lovelace per smallest unit. The minimum safe collateral is therefore
266
+ ``ceil(debt_value * l_tv_divider / (l_tv * collateral_price))``, and at least 1.
267
+ """
268
+ if l_tv <= 0 or l_tv_divider <= 0 or collateral_price <= 0:
269
+ raise ValueError("liquidation LTV and collateral price must be positive")
270
+ minimum = ceil(
271
+ Fraction(debt) * principal_price * l_tv_divider / (l_tv * collateral_price),
272
+ )
273
+ return max(minimum, 1)
@@ -0,0 +1,195 @@
1
+ """Pool-borrow terms shared by the FluidTokens transaction builders.
2
+
3
+ Everything here reads only the pool datum fields V3 and V4 have in common, the signed
4
+ oracle witness, and the chain's min-UTxO rule: the lender-bond address and datum
5
+ commitment, the chosen collateral unit and its floor, the borrow validity window, and
6
+ the min-ADA of a synthesized output.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import hashlib
12
+ from fractions import Fraction
13
+ from math import ceil
14
+ from typing import TYPE_CHECKING
15
+ from typing import Any
16
+
17
+ from pycardano import Address
18
+ from pycardano import TransactionOutput
19
+ from pycardano import min_lovelace
20
+
21
+ from charli3_dendrite.dataclasses.models import Assets
22
+ from charli3_dendrite.lending.fluidtokens.datums import CollateralAsset
23
+ from charli3_dendrite.lending.fluidtokens.datums import PoolDatum
24
+ from charli3_dendrite.lending.fluidtokens.transactions._common import (
25
+ address_from_plutus,
26
+ )
27
+ from charli3_dendrite.lending.transactions.infra import OUTPUT_MIN_ADA
28
+ from charli3_dendrite.lending.transactions.infra import EvalContext
29
+ from charli3_dendrite.lending.units import constr
30
+ from charli3_dendrite.utility import asset_to_value
31
+
32
+ if TYPE_CHECKING:
33
+ from collections.abc import Sequence
34
+
35
+ from charli3_dendrite.lending.fluidtokens.oracles.witness import OracleReward
36
+
37
+ # The FluidTokens borrow validator caps the transaction's validity window at one hour
38
+ # (3600 slots), a distinct, wider bound than the 360-slot
39
+ # ``_common.LOAN_ACTION_VALIDITY_SLOTS`` the V3 loan-action validators use. The window
40
+ # additionally must fall inside the signed oracle witness's ms window.
41
+ BORROW_VALIDITY_SLOTS = 3600
42
+
43
+ # Plutus ``Bool`` True is constructor alternative 1.
44
+ _BOOL_TRUE = 1
45
+
46
+
47
+ def lender_bond_address(pool_datum: PoolDatum) -> Address:
48
+ """Decode the pool's committed ``lender_bond_address`` to a pycardano `Address`."""
49
+ raw = pool_datum.lender_bond_address
50
+ data = raw.data if hasattr(raw, "data") else raw
51
+ return address_from_plutus(data)
52
+
53
+
54
+ def lender_bond_datum_matches(pool_datum: PoolDatum, datum_hex: str) -> bool:
55
+ """True if ``datum_hex`` hashes to the pool's committed lender-bond datum hash."""
56
+ digest = hashlib.blake2b(bytes.fromhex(datum_hex), digest_size=32).digest()
57
+ return digest == bytes(pool_datum.lender_bond_inline_datum_hash)
58
+
59
+
60
+ def collateral_unit(pool_datum: PoolDatum, chosen_collateral_index: int) -> str:
61
+ """The unit (``policy_hex`` ++ ``name_hex``) of the chosen collateral option."""
62
+ chosen = list(pool_datum.collateral_options)[chosen_collateral_index]
63
+ if not isinstance(chosen, CollateralAsset):
64
+ chosen = CollateralAsset.from_primitive(chosen)
65
+ alt, fields = constr(chosen.maybe_asset_name)
66
+ name = bytes(fields[0]) if alt == 0 and fields else b""
67
+ return chosen.policy_id.hex() + name.hex()
68
+
69
+
70
+ def min_collateral_amount(
71
+ pool_datum: PoolDatum,
72
+ *,
73
+ chosen_collateral_index: int,
74
+ principal_amount: int,
75
+ price_num: int,
76
+ price_den: int,
77
+ principal_price_num: int | None = None,
78
+ principal_price_den: int | None = None,
79
+ ) -> int:
80
+ """Minimum collateral units required to back ``principal_amount``.
81
+
82
+ Mirrors the pool validator's collateral floor. For a dynamically-priced pool the
83
+ principal is first expressed in lovelace at its price
84
+ ``principal_price_num / principal_price_den`` (1:1 for an ADA principal, which
85
+ ignores the principal price), scaled by the option's
86
+ ``min_collateral_divider / min_collateral`` ratio, and converted to collateral units
87
+ at the collateral price ``price_num / price_den``:
88
+ ``ceil(principal * principal_price * divider / min_collateral / price)``. For a
89
+ statically-priced pool the floor is
90
+ ``ceil(principal_amount * min_collateral / min_collateral_div)``. Prices are
91
+ lovelace per smallest unit. A non-ADA principal needs its price and raises
92
+ ``NotImplementedError`` without it.
93
+ """
94
+ principal_asset = pool_datum.common_data.principal_asset
95
+ principal_price = Fraction(1)
96
+ if principal_asset.policy_id or principal_asset.asset_name:
97
+ if principal_price_num is None or principal_price_den is None:
98
+ raise NotImplementedError(
99
+ "min-collateral for a non-ADA principal pool needs the principal "
100
+ "oracle price",
101
+ )
102
+ principal_price = Fraction(principal_price_num, principal_price_den)
103
+ min_collateral = int(list(pool_datum.min_collateral)[chosen_collateral_index])
104
+ divider = int(list(pool_datum.min_collateral_divider)[chosen_collateral_index])
105
+ dynamic_alt, _ = constr(pool_datum.dynamic_collateral_price)
106
+ if dynamic_alt == _BOOL_TRUE:
107
+ collateral_in_lovelace = (
108
+ Fraction(principal_amount * divider, min_collateral) * principal_price
109
+ )
110
+ return ceil(collateral_in_lovelace * Fraction(price_den, price_num))
111
+ return ceil(Fraction(principal_amount * min_collateral, divider))
112
+
113
+
114
+ def borrow_window(
115
+ oracle: OracleReward,
116
+ *,
117
+ valid_from: int | None,
118
+ valid_to: int | None,
119
+ tip: int,
120
+ ) -> tuple[int, int]:
121
+ """The borrow's ``(valid_from, valid_to)`` slot window, covered by the witness.
122
+
123
+ :func:`signed_window` for one witness under the one-hour borrow cap.
124
+ """
125
+ return signed_window(
126
+ [oracle],
127
+ valid_from=valid_from,
128
+ valid_to=valid_to,
129
+ tip=tip,
130
+ cap=BORROW_VALIDITY_SLOTS,
131
+ )
132
+
133
+
134
+ def signed_window(
135
+ oracles: Sequence[OracleReward],
136
+ *,
137
+ valid_from: int | None,
138
+ valid_to: int | None,
139
+ tip: int,
140
+ cap: int,
141
+ ) -> tuple[int, int]:
142
+ """A ``(valid_from, valid_to)`` slot window every signed price covers.
143
+
144
+ A fully pinned window (byte-exact replay) is accepted only if it spans at most
145
+ ``cap`` slots AND every witness covers it. Otherwise the window starts at the
146
+ backend ``tip`` (or the latest witness start) and ends ``cap`` slots later or at
147
+ the earliest witness end; a window no witness set can cover raises (a witness is
148
+ stale relative to the tip). Without witnesses the window is ``cap`` slots from
149
+ the tip.
150
+ """
151
+ if valid_from is not None and valid_to is not None:
152
+ if valid_to - valid_from > cap:
153
+ raise ValueError(f"validity window exceeds {cap} slots")
154
+ if not all(o.contains_slot_window(valid_from, valid_to) for o in oracles):
155
+ raise ValueError(
156
+ "pinned validity window is not covered by the oracle witness",
157
+ )
158
+ return valid_from, valid_to
159
+ covered = [o.tx_validity_slots() for o in oracles]
160
+ lower = (
161
+ valid_from if valid_from is not None else max([tip, *(f for f, _ in covered)])
162
+ )
163
+ upper = (
164
+ valid_to
165
+ if valid_to is not None
166
+ else min([lower + cap, *(t for _, t in covered)])
167
+ )
168
+ if upper - lower > cap:
169
+ upper = lower + cap
170
+ if upper <= lower or not all(o.contains_slot_window(lower, upper) for o in oracles):
171
+ raise ValueError(
172
+ "could not fit a validity window inside the oracle witness; the witness "
173
+ "may be stale relative to the backend tip",
174
+ )
175
+ return lower, upper
176
+
177
+
178
+ def min_output_lovelace(
179
+ *,
180
+ address: str,
181
+ assets: dict[str, int],
182
+ datum: Any, # noqa: ANN401 - PlutusData, RawCBOR or None
183
+ slot: int,
184
+ ) -> int:
185
+ """The protocol min-ADA of an output with ``assets`` and ``datum`` at ``address``.
186
+
187
+ ``assets`` maps unit to quantity and excludes lovelace; the output is sized with a
188
+ placeholder coin, which ``min_lovelace`` does not depend on beyond its encoding.
189
+ """
190
+ output = TransactionOutput(
191
+ Address.decode(address),
192
+ asset_to_value(Assets(**{"lovelace": OUTPUT_MIN_ADA, **assets})),
193
+ datum=datum,
194
+ )
195
+ return min_lovelace(EvalContext(last_block_slot=slot), output=output)