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.
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/PKG-INFO +1 -1
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/pyproject.toml +2 -2
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/wingriders.py +21 -3
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/math.py +115 -8
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens/transactions/borrow_terms.py +195 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/context.py +51 -297
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/datum_synth.py +4 -2
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/resolve.py +6 -6
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens/transactions/utxos.py +160 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/datums.py +18 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/__init__.py +1 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/borrow.py +869 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/builder.py +193 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/change_collateral.py +371 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/common.py +127 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/lender_bond.py +93 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/loan_action.py +436 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/loan_terms.py +240 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/oracle.py +153 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/recast.py +274 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/redeemers.py +215 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/repay.py +335 -0
- charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens_v4/transactions/resolve.py +218 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/registry.py +4 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/LICENSE +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/README.md +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/backend_base.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/blockfrost/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/blockfrost/models.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/dbsync/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/dbsync/models.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/ogmios_kupo/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/ogmios_kupo/models.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/backend/utils.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dataclasses/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dataclasses/datums.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dataclasses/models.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/amm_base.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/amm_types.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/cswap.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/dano.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/minswap.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/muesli.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/multi_asset.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/spectrum.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/splash.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/sundae.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/sundae_v4.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/sundae_v4_deployments.json +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/amm/vyfi.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/core/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/core/base.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/core/errors.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/axo.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/cardanoswaps.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/chadswap.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/djed.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/geniusyield.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/ob_base.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/dexs/ob/saturnswap.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/base.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/constants.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/datums.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/loader.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/market.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/math.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/aggregator.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/aggregator_datums.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/deployments.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/forward.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/leaves.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/locator.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/lp_pricing.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/recipes.json +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/redeemer.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/reproduce.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/oracles/structured_datums.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/state.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/_common.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/build.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/builder.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/context.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/create_loan.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/datum_synth.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/increase_loan.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/loan_ids.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/modify_collateral.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/oracle_redeemer.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/oracle_synth.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/redeemers.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/repay.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/topup_withdraw.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/danogo/transactions/verify.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/constants.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/datums.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/loader.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/market.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/oracles/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/oracles/feeds.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/oracles/fluid_api.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/oracles/witness.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/state.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/_common.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/borrow.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/builder.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/change_collateral.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/lend.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/pool.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/recast.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/redeemers.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/repay.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens/transactions/request.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/constants.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/indexing.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/loader.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/fluidtokens_v4/state.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/math.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/charli3.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/dex_pooled.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/fluid.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/models.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/orcfax.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/oracles/qtoken.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/plutus.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/transactions/__init__.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/transactions/base.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/transactions/infra.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/transactions/snapshot.py +0 -0
- {charli3_dendrite-1.5.14.dev0 → charli3_dendrite-1.5.14.dev2}/src/charli3_dendrite/lending/units.py +0 -0
- {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
|
[tool.poetry]
|
|
2
2
|
name = "charli3_dendrite"
|
|
3
|
-
version = "1.5.14-
|
|
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-
|
|
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
|
|
843
|
-
|
|
844
|
-
|
|
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
|
|
51
|
-
transaction's validity upper bound
|
|
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
|
-
|
|
54
|
-
|
|
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)
|
charli3_dendrite-1.5.14.dev2/src/charli3_dendrite/lending/fluidtokens/transactions/borrow_terms.py
ADDED
|
@@ -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)
|