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.
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/PKG-INFO +1 -1
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/pyproject.toml +2 -2
- charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/fluidtokens_v4/market.py +418 -0
- charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/fluidtokens_v4/rates.py +274 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/state.py +40 -0
- charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/markets.py +226 -0
- charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/normalized.py +535 -0
- charli3_dendrite-1.5.17.dev0/src/charli3_dendrite/lending/rates.py +138 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/LICENSE +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/README.md +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/backend_base.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/backend/utils.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dataclasses/datums.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dataclasses/models.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/dano.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/multi_asset.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/sundae_v4.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/sundae_v4_deployments.json +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/amm/wingriders.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/core/base.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/core/errors.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/cardanoswaps.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/base.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/constants.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/datums.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/loader.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/market.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/math.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/aggregator_datums.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/deployments.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/forward.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/leaves.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/locator.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/lp_pricing.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/recipes.json +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/redeemer.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/reproduce.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/oracles/structured_datums.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/state.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/_common.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/build.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/builder.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/context.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/create_loan.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/datum_synth.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/increase_loan.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/loan_ids.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/modify_collateral.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_redeemer.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/oracle_synth.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/redeemers.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/repay.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/topup_withdraw.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/danogo/transactions/verify.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/constants.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/datums.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/loader.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/market.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/math.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/feeds.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/fluid_api.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/oracles/witness.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/state.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/_common.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow_terms.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/builder.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/change_collateral.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/context.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/datum_synth.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/lend.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/pool.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/recast.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/redeemers.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/repay.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/request.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/resolve.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens/transactions/utxos.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/constants.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/datums.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/indexing.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/loader.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/borrow.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/builder.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/change_collateral.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/claim.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/common.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/lender_bond.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/loan_action.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/loan_terms.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/oracle.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_action.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_cancel.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_create.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_edit.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/pool_terms.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/recast.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/redeemers.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/repay.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/fluidtokens_v4/transactions/resolve.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/math.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/charli3.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/dex_pooled.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/fluid.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/models.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/orcfax.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/oracles/qtoken.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/plutus.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/registry.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/transactions/__init__.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/transactions/base.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/transactions/infra.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/transactions/snapshot.py +0 -0
- {charli3_dendrite-1.5.16.dev0 → charli3_dendrite-1.5.17.dev0}/src/charli3_dendrite/lending/units.py +0 -0
- {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
|
[tool.poetry]
|
|
2
2
|
name = "charli3_dendrite"
|
|
3
|
-
version = "1.5.
|
|
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.
|
|
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)
|