@gearbox-protocol/sdk 15.1.0-next.1 → 15.1.0-next.10
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.
- package/dist/cjs/abi/iExpirable.js +15 -0
- package/dist/cjs/common-utils/utils/apy/get-single-quota-borrow-rate.js +2 -0
- package/dist/cjs/common-utils/utils/creditAccount/calc-health-factor.js +24 -22
- package/dist/cjs/common-utils/utils/creditAccount/calc-quota-borrow-rate.js +2 -0
- package/dist/cjs/common-utils/utils/creditAccount/get-time-to-liquidation.js +8 -5
- package/dist/cjs/common-utils/utils/creditAccount/liquidation-price.js +21 -11
- package/dist/cjs/dev/AccountOpener.js +0 -1
- package/dist/cjs/dev/compareOpportunities.js +218 -0
- package/dist/cjs/model/charts.js +147 -0
- package/dist/cjs/model/charts.schema.js +240 -0
- package/dist/cjs/model/index.js +35 -22
- package/dist/cjs/model/liquidations.schema.js +1 -1
- package/dist/cjs/model/notices.schema.js +25 -0
- package/dist/cjs/model/opportunities.schema.js +1 -1
- package/dist/cjs/model/positions.schema.js +48 -2
- package/dist/cjs/new-sdk/AbstractNamespace.js +34 -4
- package/dist/cjs/new-sdk/GearboxSDK.js +72 -3
- package/dist/cjs/new-sdk/execute/ExecuteApi.js +95 -0
- package/dist/cjs/new-sdk/execute/index.js +3 -0
- package/dist/cjs/new-sdk/index.js +7 -0
- package/dist/cjs/new-sdk/opportunities/OpportunitiesNamespace.js +29 -6
- package/dist/cjs/new-sdk/positions/PositionsNamespace.js +3 -6
- package/dist/cjs/new-sdk/simulate/SimulateApi.js +361 -0
- package/dist/cjs/new-sdk/simulate/index.js +4 -0
- package/dist/cjs/new-sdk/utils/index.js +0 -1
- package/dist/cjs/offchain/AbstractOffchainNamespace.js +10 -7
- package/dist/cjs/offchain/GearboxAPI.js +7 -0
- package/dist/cjs/offchain/index.js +3 -0
- package/dist/cjs/offchain/notices/OffchainNotices.js +27 -0
- package/dist/cjs/offchain/notices/index.js +3 -0
- package/dist/cjs/offchain/opportunities/OffchainOpportunities.js +4 -8
- package/dist/cjs/offchain/positions/OffchainPositions.js +12 -12
- package/dist/cjs/preview/preview/CreditAccountState.js +14 -1
- package/dist/cjs/preview/preview/buildDelayedPreview.js +16 -6
- package/dist/cjs/preview/preview/previewAdjustCreditAccount.js +9 -2
- package/dist/cjs/preview/preview/previewOpenCreditAccount.js +11 -3
- package/dist/cjs/preview/preview/previewOperation.js +1 -1
- package/dist/cjs/sdk/MultichainSDK.js +3 -4
- package/dist/cjs/sdk/OnchainSDK.js +42 -13
- package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +2 -8
- package/dist/cjs/sdk/accounts/credit-account-compressor/CreditAccountCompressor.js +2 -90
- package/dist/cjs/sdk/accounts/index.js +5 -2
- package/dist/cjs/sdk/accounts/intents/guards.js +114 -0
- package/dist/cjs/sdk/accounts/intents/index.js +216 -358
- package/dist/cjs/sdk/accounts/intents/math.js +56 -0
- package/dist/cjs/sdk/accounts/intents/open-strategy.js +133 -0
- package/dist/cjs/sdk/accounts/intents/operations.js +165 -0
- package/dist/cjs/sdk/accounts/intents/plan.js +373 -0
- package/dist/cjs/sdk/accounts/intents/realize.js +301 -0
- package/dist/cjs/sdk/accounts/intents/testing/delayed.js +50 -0
- package/dist/cjs/sdk/accounts/intents/testing/market.js +166 -0
- package/dist/cjs/sdk/accounts/intents/testing/sdk-mock.js +194 -35
- package/dist/cjs/sdk/accounts/intents/tests/add-collateral.fixtures.js +123 -0
- package/dist/cjs/sdk/accounts/intents/tests/adjust-leverage.fixtures.js +254 -0
- package/dist/cjs/sdk/accounts/intents/tests/deposit.fixtures.js +324 -0
- package/dist/cjs/sdk/accounts/intents/tests/finish-decrease-leverage.fixtures.js +242 -0
- package/dist/cjs/sdk/accounts/intents/tests/finish-withdraw.fixtures.js +383 -0
- package/dist/cjs/sdk/accounts/intents/tests/open-strategy.fixtures.js +133 -0
- package/dist/cjs/sdk/accounts/intents/tests/withdraw-asset.fixtures.js +131 -0
- package/dist/cjs/sdk/accounts/intents/tests/withdraw.fixtures.js +426 -0
- package/dist/cjs/sdk/accounts/intents/types.js +16 -0
- package/dist/cjs/sdk/accounts/intents/utils/adjust-state-to-snapshot.js +18 -0
- package/dist/cjs/sdk/accounts/intents/utils/credit-account-slice.js +45 -0
- package/dist/cjs/sdk/accounts/intents/utils/index.js +17 -8
- package/dist/cjs/sdk/accounts/intents/utils/ledger.js +94 -0
- package/dist/cjs/sdk/accounts/intents/utils/pick-token.js +72 -0
- package/dist/cjs/sdk/accounts/intents/utils/quotas-for-update.js +27 -0
- package/dist/cjs/sdk/accounts/intents/utils/router-path.js +86 -0
- package/dist/cjs/sdk/accounts/intents/view.js +38 -0
- package/dist/cjs/sdk/accounts/liquidations/LiquidationsService.js +0 -3
- package/dist/cjs/sdk/accounts/withdrawal-compressor/AbstractWithdrawalCompressorContract.js +29 -18
- package/dist/cjs/sdk/base/BaseContract.js +1 -1
- package/dist/cjs/sdk/base/TokensMeta.js +78 -27
- package/dist/cjs/sdk/index.js +30 -7
- package/dist/cjs/sdk/market/MarketRegister.js +16 -7
- package/dist/cjs/sdk/market/ZapperRegister.js +56 -25
- package/dist/cjs/sdk/market/credit/CreditManagerV310Contract.js +1 -12
- package/dist/cjs/sdk/market/credit/CreditSuite.js +28 -9
- package/dist/cjs/sdk/market/credit/index.js +3 -0
- package/dist/cjs/sdk/market/credit/isStrategyCollateral.js +50 -0
- package/dist/cjs/sdk/market/index.js +17 -0
- package/dist/cjs/sdk/market/math.js +57 -44
- package/dist/cjs/sdk/market/oracle/PriceOracleBaseContract.js +10 -3
- package/dist/cjs/sdk/market/pool/PoolV310Contract.js +15 -1
- package/dist/cjs/sdk/market/rwa/RWARegistry.js +22 -0
- package/dist/cjs/sdk/opportunities/index.js +0 -13
- package/dist/cjs/sdk/options.js +1 -5
- package/dist/cjs/sdk/pools/PoolService.js +132 -3
- package/dist/cjs/sdk/pools/index.js +2 -0
- package/dist/cjs/sdk/positions/PositionsService.js +213 -1
- package/dist/cjs/sdk/positions/calcBorrowRate.js +43 -0
- package/dist/cjs/sdk/positions/calcHealthFactor.js +52 -0
- package/dist/cjs/sdk/positions/calcLiquidationPrice.js +23 -0
- package/dist/cjs/sdk/positions/calcLiquidationPriceForTarget.js +30 -0
- package/dist/cjs/sdk/positions/calcTimeToLiquidationMs.js +19 -0
- package/dist/cjs/sdk/positions/index.js +12 -1
- package/dist/cjs/sdk/positions/types.js +31 -0
- package/dist/cjs/sdk/utils/abi-decode.js +2 -2
- package/dist/cjs/sdk/utils/viem/executeMulticallBatches.js +32 -0
- package/dist/cjs/sdk/utils/viem/index.js +2 -0
- package/dist/esm/abi/iExpirable.js +14 -0
- package/dist/esm/common-utils/utils/apy/get-single-quota-borrow-rate.js +2 -0
- package/dist/esm/common-utils/utils/creditAccount/calc-health-factor.js +24 -22
- package/dist/esm/common-utils/utils/creditAccount/calc-quota-borrow-rate.js +2 -0
- package/dist/esm/common-utils/utils/creditAccount/get-time-to-liquidation.js +8 -5
- package/dist/esm/common-utils/utils/creditAccount/liquidation-price.js +21 -11
- package/dist/esm/dev/AccountOpener.js +1 -2
- package/dist/esm/dev/compareOpportunities.js +216 -0
- package/dist/esm/dev/withdrawalUtils.js +1 -1
- package/dist/esm/model/charts.js +140 -0
- package/dist/esm/model/charts.schema.js +226 -0
- package/dist/esm/model/index.js +9 -7
- package/dist/esm/model/liquidations.schema.js +1 -1
- package/dist/esm/model/notices.schema.js +23 -0
- package/dist/esm/model/opportunities.schema.js +1 -1
- package/dist/esm/model/positions.schema.js +46 -4
- package/dist/esm/new-sdk/AbstractNamespace.js +34 -4
- package/dist/esm/new-sdk/GearboxSDK.js +72 -4
- package/dist/esm/new-sdk/execute/ExecuteApi.js +94 -0
- package/dist/esm/new-sdk/execute/index.js +2 -0
- package/dist/esm/new-sdk/index.js +6 -2
- package/dist/esm/new-sdk/opportunities/OpportunitiesNamespace.js +29 -6
- package/dist/esm/new-sdk/positions/PositionsNamespace.js +3 -6
- package/dist/esm/new-sdk/simulate/SimulateApi.js +360 -0
- package/dist/esm/new-sdk/simulate/index.js +3 -0
- package/dist/esm/new-sdk/utils/index.js +0 -1
- package/dist/esm/offchain/AbstractOffchainNamespace.js +10 -7
- package/dist/esm/offchain/GearboxAPI.js +7 -0
- package/dist/esm/offchain/index.js +3 -1
- package/dist/esm/offchain/notices/OffchainNotices.js +26 -0
- package/dist/esm/offchain/notices/index.js +2 -0
- package/dist/esm/offchain/opportunities/OffchainOpportunities.js +4 -8
- package/dist/esm/offchain/positions/OffchainPositions.js +12 -12
- package/dist/esm/plugins/adapters/contracts/ERC4626AdapterContract.js +1 -1
- package/dist/esm/preview/preview/CreditAccountState.js +14 -1
- package/dist/esm/preview/preview/buildDelayedPreview.js +16 -6
- package/dist/esm/preview/preview/previewAdjustCreditAccount.js +9 -2
- package/dist/esm/preview/preview/previewOpenCreditAccount.js +11 -3
- package/dist/esm/preview/preview/previewOperation.js +1 -1
- package/dist/esm/preview/simulate/simulatePoolOperation.js +1 -1
- package/dist/esm/preview/trace/extractTransfers.js +1 -1
- package/dist/esm/sdk/MultichainSDK.js +3 -4
- package/dist/esm/sdk/OnchainSDK.js +42 -13
- package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +4 -10
- package/dist/esm/sdk/accounts/credit-account-compressor/CreditAccountCompressor.js +2 -90
- package/dist/esm/sdk/accounts/index.js +3 -2
- package/dist/esm/sdk/accounts/intents/guards.js +108 -0
- package/dist/esm/sdk/accounts/intents/index.js +214 -358
- package/dist/esm/sdk/accounts/intents/math.js +51 -0
- package/dist/esm/sdk/accounts/intents/open-strategy.js +132 -0
- package/dist/esm/sdk/accounts/intents/operations.js +153 -0
- package/dist/esm/sdk/accounts/intents/plan.js +361 -0
- package/dist/esm/sdk/accounts/intents/realize.js +300 -0
- package/dist/esm/sdk/accounts/intents/testing/delayed.js +38 -0
- package/dist/esm/sdk/accounts/intents/testing/market.js +148 -0
- package/dist/esm/sdk/accounts/intents/testing/sdk-mock.js +194 -35
- package/dist/esm/sdk/accounts/intents/tests/add-collateral.fixtures.js +110 -0
- package/dist/esm/sdk/accounts/intents/tests/adjust-leverage.fixtures.js +234 -0
- package/dist/esm/sdk/accounts/intents/tests/deposit.fixtures.js +302 -0
- package/dist/esm/sdk/accounts/intents/tests/finish-decrease-leverage.fixtures.js +220 -0
- package/dist/esm/sdk/accounts/intents/tests/finish-withdraw.fixtures.js +355 -0
- package/dist/esm/sdk/accounts/intents/tests/open-strategy.fixtures.js +119 -0
- package/dist/esm/sdk/accounts/intents/tests/withdraw-asset.fixtures.js +117 -0
- package/dist/esm/sdk/accounts/intents/tests/withdraw.fixtures.js +402 -0
- package/dist/esm/sdk/accounts/intents/types.js +16 -1
- package/dist/esm/sdk/accounts/intents/utils/adjust-state-to-snapshot.js +17 -0
- package/dist/esm/sdk/accounts/intents/utils/credit-account-slice.js +43 -0
- package/dist/esm/sdk/accounts/intents/utils/index.js +9 -7
- package/dist/esm/sdk/accounts/intents/utils/ledger.js +93 -0
- package/dist/esm/sdk/accounts/intents/utils/pick-token.js +68 -0
- package/dist/esm/sdk/accounts/intents/utils/quotas-for-update.js +27 -1
- package/dist/esm/sdk/accounts/intents/utils/router-path.js +85 -0
- package/dist/esm/sdk/accounts/intents/view.js +37 -0
- package/dist/esm/sdk/accounts/liquidations/LiquidationsService.js +1 -4
- package/dist/esm/sdk/accounts/withdrawal-compressor/AbstractWithdrawalCompressorContract.js +29 -18
- package/dist/esm/sdk/accounts/withdrawal-compressor/RedemptionLoggerV310Contract.js +1 -1
- package/dist/esm/sdk/accounts/withdrawal-compressor/WithdrawalCompressorV310Contract.js +1 -1
- package/dist/esm/sdk/accounts/withdrawal-compressor/WithdrawalCompressorV311Contract.js +1 -1
- package/dist/esm/sdk/accounts/withdrawal-compressor/WithdrawalCompressorV313Contract.js +1 -1
- package/dist/esm/sdk/base/BaseContract.js +1 -1
- package/dist/esm/sdk/base/TokensMeta.js +80 -29
- package/dist/esm/sdk/chain/detectNetwork.js +1 -1
- package/dist/esm/sdk/core/createAddressProvider.js +1 -1
- package/dist/esm/sdk/index.js +13 -4
- package/dist/esm/sdk/market/MarketRegister.js +16 -7
- package/dist/esm/sdk/market/ZapperRegister.js +56 -25
- package/dist/esm/sdk/market/credit/CreditFacadeV310BaseContract.js +1 -1
- package/dist/esm/sdk/market/credit/CreditManagerV310Contract.js +2 -13
- package/dist/esm/sdk/market/credit/CreditSuite.js +29 -10
- package/dist/esm/sdk/market/credit/index.js +2 -1
- package/dist/esm/sdk/market/credit/isStrategyCollateral.js +48 -0
- package/dist/esm/sdk/market/index.js +3 -1
- package/dist/esm/sdk/market/math.js +52 -40
- package/dist/esm/sdk/market/oracle/PriceOracleBaseContract.js +10 -3
- package/dist/esm/sdk/market/pool/PoolV310Contract.js +17 -3
- package/dist/esm/sdk/market/rwa/RWARegistry.js +22 -0
- package/dist/esm/sdk/market/zapper/IETHZapperContract.js +1 -1
- package/dist/esm/sdk/market/zapper/ZapperContract.js +1 -1
- package/dist/esm/sdk/opportunities/index.js +1 -2
- package/dist/esm/sdk/options.js +1 -5
- package/dist/esm/sdk/pools/PoolService.js +133 -6
- package/dist/esm/sdk/pools/index.js +2 -2
- package/dist/esm/sdk/positions/PositionsService.js +213 -1
- package/dist/esm/sdk/positions/calcBorrowRate.js +42 -0
- package/dist/esm/sdk/positions/calcHealthFactor.js +51 -0
- package/dist/esm/sdk/positions/calcLiquidationPrice.js +22 -0
- package/dist/esm/sdk/positions/calcLiquidationPriceForTarget.js +29 -0
- package/dist/esm/sdk/positions/calcTimeToLiquidationMs.js +18 -0
- package/dist/esm/sdk/positions/index.js +7 -2
- package/dist/esm/sdk/positions/types.js +31 -1
- package/dist/esm/sdk/utils/abi-decode.js +2 -2
- package/dist/esm/sdk/utils/viem/executeMulticallBatches.js +31 -0
- package/dist/esm/sdk/utils/viem/index.js +2 -1
- package/dist/esm/sdk/utils/viem/simulateWithPriceUpdates.js +1 -1
- package/dist/types/abi/iExpirable.d.ts +14 -0
- package/dist/types/common-utils/utils/apy/get-single-quota-borrow-rate.d.ts +2 -0
- package/dist/types/common-utils/utils/creditAccount/calc-health-factor.d.ts +3 -0
- package/dist/types/common-utils/utils/creditAccount/calc-quota-borrow-rate.d.ts +2 -0
- package/dist/types/common-utils/utils/creditAccount/get-time-to-liquidation.d.ts +6 -1
- package/dist/types/common-utils/utils/creditAccount/liquidation-price.d.ts +3 -0
- package/dist/types/dev/compareOpportunities.d.ts +153 -0
- package/dist/types/model/charts.d.ts +349 -0
- package/dist/types/model/charts.schema.d.ts +364 -0
- package/dist/types/model/index.d.ts +8 -6
- package/dist/types/model/notices.d.ts +29 -0
- package/dist/types/model/notices.schema.d.ts +23 -0
- package/dist/types/model/opportunities.d.ts +9 -9
- package/dist/types/model/positions.d.ts +133 -7
- package/dist/types/model/positions.schema.d.ts +128 -1
- package/dist/types/new-sdk/AbstractNamespace.d.ts +15 -2
- package/dist/types/new-sdk/GearboxSDK.d.ts +14 -2
- package/dist/types/new-sdk/execute/ExecuteApi.d.ts +108 -0
- package/dist/types/new-sdk/execute/index.d.ts +2 -0
- package/dist/types/new-sdk/index.d.ts +8 -4
- package/dist/types/new-sdk/opportunities/OpportunitiesNamespace.d.ts +19 -7
- package/dist/types/new-sdk/opportunities/types.d.ts +30 -9
- package/dist/types/new-sdk/positions/PositionsNamespace.d.ts +4 -5
- package/dist/types/new-sdk/positions/types.d.ts +9 -9
- package/dist/types/new-sdk/simulate/SimulateApi.d.ts +90 -0
- package/dist/types/new-sdk/simulate/index.d.ts +3 -0
- package/dist/types/new-sdk/simulate/types.d.ts +508 -0
- package/dist/types/new-sdk/types.d.ts +35 -1
- package/dist/types/new-sdk/utils/index.d.ts +1 -2
- package/dist/types/offchain/AbstractOffchainNamespace.d.ts +5 -21
- package/dist/types/offchain/GearboxAPI.d.ts +6 -0
- package/dist/types/offchain/index.d.ts +4 -2
- package/dist/types/offchain/notices/OffchainNotices.d.ts +19 -0
- package/dist/types/offchain/notices/index.d.ts +2 -0
- package/dist/types/offchain/opportunities/OffchainOpportunities.d.ts +8 -4
- package/dist/types/offchain/positions/OffchainPositions.d.ts +8 -6
- package/dist/types/preview/preview/CreditAccountState.d.ts +6 -0
- package/dist/types/preview/preview/buildDelayedPreview.d.ts +5 -1
- package/dist/types/preview/preview/types.d.ts +4 -2
- package/dist/types/sdk/MultichainSDK.d.ts +0 -5
- package/dist/types/sdk/OnchainSDK.d.ts +1 -5
- package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -7
- package/dist/types/sdk/accounts/credit-account-compressor/CreditAccountCompressor.d.ts +3 -12
- package/dist/types/sdk/accounts/credit-account-compressor/index.d.ts +2 -2
- package/dist/types/sdk/accounts/credit-account-compressor/types.d.ts +1 -19
- package/dist/types/sdk/accounts/index.d.ts +7 -5
- package/dist/types/sdk/accounts/intents/guards.d.ts +72 -0
- package/dist/types/sdk/accounts/intents/index.d.ts +130 -15
- package/dist/types/sdk/accounts/intents/math.d.ts +46 -0
- package/dist/types/sdk/accounts/intents/open-strategy.d.ts +64 -0
- package/dist/types/sdk/accounts/intents/operations.d.ts +215 -0
- package/dist/types/sdk/accounts/intents/plan.d.ts +189 -0
- package/dist/types/sdk/accounts/intents/realize.d.ts +35 -0
- package/dist/types/sdk/accounts/intents/testing/delayed.d.ts +50 -0
- package/dist/types/sdk/accounts/intents/testing/expect.d.ts +17 -21
- package/dist/types/sdk/accounts/intents/testing/market.d.ts +91 -0
- package/dist/types/sdk/accounts/intents/testing/sdk-mock.d.ts +64 -16
- package/dist/types/sdk/accounts/intents/tests/add-collateral.fixtures.d.ts +45 -0
- package/dist/types/sdk/accounts/intents/tests/adjust-leverage.fixtures.d.ts +56 -0
- package/dist/types/sdk/accounts/intents/tests/deposit.fixtures.d.ts +64 -0
- package/dist/types/sdk/accounts/intents/tests/finish-decrease-leverage.fixtures.d.ts +107 -0
- package/dist/types/sdk/accounts/intents/tests/finish-withdraw.fixtures.d.ts +136 -0
- package/dist/types/sdk/accounts/intents/tests/open-strategy.fixtures.d.ts +56 -0
- package/dist/types/sdk/accounts/intents/tests/withdraw-asset.fixtures.d.ts +60 -0
- package/dist/types/sdk/accounts/intents/tests/withdraw.fixtures.d.ts +79 -0
- package/dist/types/sdk/accounts/intents/types.d.ts +369 -43
- package/dist/types/sdk/accounts/intents/utils/adjust-state-to-snapshot.d.ts +13 -0
- package/dist/types/sdk/accounts/intents/utils/assemble-operation-calls.d.ts +1 -1
- package/dist/types/sdk/accounts/intents/utils/credit-account-slice.d.ts +29 -0
- package/dist/types/sdk/accounts/intents/utils/index.d.ts +7 -5
- package/dist/types/sdk/accounts/intents/utils/ledger.d.ts +41 -0
- package/dist/types/sdk/accounts/intents/utils/pick-token.d.ts +55 -0
- package/dist/types/sdk/accounts/intents/utils/quotas-for-update.d.ts +15 -4
- package/dist/types/sdk/accounts/intents/utils/router-path.d.ts +70 -0
- package/dist/types/sdk/accounts/intents/view.d.ts +15 -0
- package/dist/types/sdk/accounts/types.d.ts +17 -14
- package/dist/types/sdk/accounts/withdrawal-compressor/AbstractWithdrawalCompressorContract.d.ts +6 -0
- package/dist/types/sdk/accounts/withdrawal-compressor/types.d.ts +18 -0
- package/dist/types/sdk/base/TokensMeta.d.ts +44 -1
- package/dist/types/sdk/base/index.d.ts +2 -2
- package/dist/types/sdk/base/token-types.d.ts +12 -1
- package/dist/types/sdk/index.d.ts +28 -19
- package/dist/types/sdk/market/MarketRegister.d.ts +7 -3
- package/dist/types/sdk/market/ZapperRegister.d.ts +20 -2
- package/dist/types/sdk/market/credit/CreditManagerV310Contract.d.ts +0 -4
- package/dist/types/sdk/market/credit/CreditSuite.d.ts +6 -3
- package/dist/types/sdk/market/credit/index.d.ts +2 -1
- package/dist/types/sdk/market/credit/isStrategyCollateral.d.ts +74 -0
- package/dist/types/sdk/market/credit/types.d.ts +2 -9
- package/dist/types/sdk/market/index.d.ts +4 -2
- package/dist/types/sdk/market/math.d.ts +44 -34
- package/dist/types/sdk/market/oracle/PriceOracleBaseContract.d.ts +6 -2
- package/dist/types/sdk/market/oracle/types.d.ts +10 -2
- package/dist/types/sdk/market/pool/PoolV310Contract.d.ts +5 -0
- package/dist/types/sdk/market/pool/types.d.ts +5 -0
- package/dist/types/sdk/market/rwa/RWARegistry.d.ts +13 -0
- package/dist/types/sdk/market/types.d.ts +5 -1
- package/dist/types/sdk/opportunities/index.d.ts +1 -2
- package/dist/types/sdk/options.d.ts +0 -1
- package/dist/types/sdk/pools/PoolService.d.ts +32 -2
- package/dist/types/sdk/pools/index.d.ts +3 -3
- package/dist/types/sdk/pools/types.d.ts +109 -4
- package/dist/types/sdk/positions/PositionsService.d.ts +33 -2
- package/dist/types/sdk/positions/calcBorrowRate.d.ts +40 -0
- package/dist/types/sdk/positions/calcHealthFactor.d.ts +55 -0
- package/dist/types/sdk/positions/calcLiquidationPrice.d.ts +12 -0
- package/dist/types/sdk/positions/calcLiquidationPriceForTarget.d.ts +43 -0
- package/dist/types/sdk/positions/calcTimeToLiquidationMs.d.ts +16 -0
- package/dist/types/sdk/positions/index.d.ts +7 -2
- package/dist/types/sdk/positions/types.d.ts +58 -1
- package/dist/types/sdk/types/state.d.ts +6 -0
- package/dist/types/sdk/utils/viem/executeMulticallBatches.d.ts +39 -0
- package/dist/types/sdk/utils/viem/index.d.ts +3 -2
- package/package.json +2 -1
- package/dist/cjs/model/history.js +0 -53
- package/dist/cjs/model/history.schema.js +0 -128
- package/dist/cjs/sdk/accounts/intents/intents/index.js +0 -14
- package/dist/cjs/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.fixtures.js +0 -121
- package/dist/cjs/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.js +0 -15
- package/dist/cjs/sdk/accounts/intents/intents/resume/close/close.fixtures.js +0 -108
- package/dist/cjs/sdk/accounts/intents/intents/resume/close/close.js +0 -51
- package/dist/cjs/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.fixtures.js +0 -130
- package/dist/cjs/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.js +0 -83
- package/dist/cjs/sdk/accounts/intents/intents/resume/deposit/deposit.fixtures.js +0 -117
- package/dist/cjs/sdk/accounts/intents/intents/resume/deposit/deposit.js +0 -15
- package/dist/cjs/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.fixtures.js +0 -95
- package/dist/cjs/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.js +0 -15
- package/dist/cjs/sdk/accounts/intents/intents/resume/index.js +0 -13
- package/dist/cjs/sdk/accounts/intents/intents/resume/withdraw/withdraw.fixtures.js +0 -138
- package/dist/cjs/sdk/accounts/intents/intents/resume/withdraw/withdraw.js +0 -161
- package/dist/cjs/sdk/accounts/intents/operations/add-collateral/index.js +0 -17
- package/dist/cjs/sdk/accounts/intents/operations/claim-delayed/index.js +0 -54
- package/dist/cjs/sdk/accounts/intents/operations/close-credit-account/index.js +0 -26
- package/dist/cjs/sdk/accounts/intents/operations/decrease-debt/index.js +0 -12
- package/dist/cjs/sdk/accounts/intents/operations/increase-debt/index.js +0 -12
- package/dist/cjs/sdk/accounts/intents/operations/index.js +0 -27
- package/dist/cjs/sdk/accounts/intents/operations/quota-update/index.js +0 -22
- package/dist/cjs/sdk/accounts/intents/operations/repay-credit-account/index.js +0 -22
- package/dist/cjs/sdk/accounts/intents/operations/start-delayed-withdrawal/index.js +0 -18
- package/dist/cjs/sdk/accounts/intents/operations/swap/index.js +0 -18
- package/dist/cjs/sdk/accounts/intents/operations/unwrap-rwa-collateral/index.js +0 -27
- package/dist/cjs/sdk/accounts/intents/operations/withdraw-collateral/index.js +0 -43
- package/dist/cjs/sdk/accounts/intents/operations/wrap-rwa-collateral/index.js +0 -27
- package/dist/cjs/sdk/accounts/intents/quoters/close.js +0 -58
- package/dist/cjs/sdk/accounts/intents/quoters/index.js +0 -7
- package/dist/cjs/sdk/accounts/intents/quoters/swap.js +0 -79
- package/dist/cjs/sdk/accounts/intents/testing/expect.js +0 -167
- package/dist/cjs/sdk/accounts/intents/testing/resume.js +0 -172
- package/dist/cjs/sdk/accounts/intents/utils/simulate-adjust-state.js +0 -39
- package/dist/cjs/sdk/accounts/intents/utils/simulate-assets.js +0 -69
- package/dist/cjs/sdk/accounts/intents/utils/with-quota-update.js +0 -13
- package/dist/esm/model/history.js +0 -49
- package/dist/esm/model/history.schema.js +0 -116
- package/dist/esm/sdk/accounts/intents/intents/index.js +0 -8
- package/dist/esm/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.fixtures.js +0 -107
- package/dist/esm/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.js +0 -14
- package/dist/esm/sdk/accounts/intents/intents/resume/close/close.fixtures.js +0 -94
- package/dist/esm/sdk/accounts/intents/intents/resume/close/close.js +0 -50
- package/dist/esm/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.fixtures.js +0 -114
- package/dist/esm/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.js +0 -82
- package/dist/esm/sdk/accounts/intents/intents/resume/deposit/deposit.fixtures.js +0 -110
- package/dist/esm/sdk/accounts/intents/intents/resume/deposit/deposit.js +0 -14
- package/dist/esm/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.fixtures.js +0 -88
- package/dist/esm/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.js +0 -14
- package/dist/esm/sdk/accounts/intents/intents/resume/index.js +0 -7
- package/dist/esm/sdk/accounts/intents/intents/resume/withdraw/withdraw.fixtures.js +0 -121
- package/dist/esm/sdk/accounts/intents/intents/resume/withdraw/withdraw.js +0 -160
- package/dist/esm/sdk/accounts/intents/operations/add-collateral/index.js +0 -16
- package/dist/esm/sdk/accounts/intents/operations/claim-delayed/index.js +0 -52
- package/dist/esm/sdk/accounts/intents/operations/close-credit-account/index.js +0 -25
- package/dist/esm/sdk/accounts/intents/operations/decrease-debt/index.js +0 -11
- package/dist/esm/sdk/accounts/intents/operations/increase-debt/index.js +0 -11
- package/dist/esm/sdk/accounts/intents/operations/index.js +0 -14
- package/dist/esm/sdk/accounts/intents/operations/quota-update/index.js +0 -21
- package/dist/esm/sdk/accounts/intents/operations/repay-credit-account/index.js +0 -21
- package/dist/esm/sdk/accounts/intents/operations/start-delayed-withdrawal/index.js +0 -17
- package/dist/esm/sdk/accounts/intents/operations/swap/index.js +0 -17
- package/dist/esm/sdk/accounts/intents/operations/unwrap-rwa-collateral/index.js +0 -26
- package/dist/esm/sdk/accounts/intents/operations/withdraw-collateral/index.js +0 -42
- package/dist/esm/sdk/accounts/intents/operations/wrap-rwa-collateral/index.js +0 -26
- package/dist/esm/sdk/accounts/intents/quoters/close.js +0 -56
- package/dist/esm/sdk/accounts/intents/quoters/index.js +0 -3
- package/dist/esm/sdk/accounts/intents/quoters/swap.js +0 -77
- package/dist/esm/sdk/accounts/intents/testing/expect.js +0 -162
- package/dist/esm/sdk/accounts/intents/testing/resume.js +0 -157
- package/dist/esm/sdk/accounts/intents/utils/simulate-adjust-state.js +0 -38
- package/dist/esm/sdk/accounts/intents/utils/simulate-assets.js +0 -68
- package/dist/esm/sdk/accounts/intents/utils/with-quota-update.js +0 -12
- package/dist/types/model/history.d.ts +0 -153
- package/dist/types/model/history.schema.d.ts +0 -95
- package/dist/types/new-sdk/utils/history.d.ts +0 -18
- package/dist/types/sdk/accounts/intents/intents/index.d.ts +0 -8
- package/dist/types/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.d.ts +0 -13
- package/dist/types/sdk/accounts/intents/intents/resume/add-collateral/add-collateral.fixtures.d.ts +0 -38
- package/dist/types/sdk/accounts/intents/intents/resume/close/close.d.ts +0 -26
- package/dist/types/sdk/accounts/intents/intents/resume/close/close.fixtures.d.ts +0 -63
- package/dist/types/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.d.ts +0 -26
- package/dist/types/sdk/accounts/intents/intents/resume/decrease-leverage/decrease-leverage.fixtures.d.ts +0 -86
- package/dist/types/sdk/accounts/intents/intents/resume/deposit/deposit.d.ts +0 -13
- package/dist/types/sdk/accounts/intents/intents/resume/deposit/deposit.fixtures.d.ts +0 -48
- package/dist/types/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.d.ts +0 -13
- package/dist/types/sdk/accounts/intents/intents/resume/increase-leverage/increase-leverage.fixtures.d.ts +0 -46
- package/dist/types/sdk/accounts/intents/intents/resume/index.d.ts +0 -7
- package/dist/types/sdk/accounts/intents/intents/resume/withdraw/withdraw.d.ts +0 -33
- package/dist/types/sdk/accounts/intents/intents/resume/withdraw/withdraw.fixtures.d.ts +0 -68
- package/dist/types/sdk/accounts/intents/operations/add-collateral/index.d.ts +0 -23
- package/dist/types/sdk/accounts/intents/operations/claim-delayed/index.d.ts +0 -55
- package/dist/types/sdk/accounts/intents/operations/close-credit-account/index.d.ts +0 -22
- package/dist/types/sdk/accounts/intents/operations/decrease-debt/index.d.ts +0 -18
- package/dist/types/sdk/accounts/intents/operations/increase-debt/index.d.ts +0 -18
- package/dist/types/sdk/accounts/intents/operations/index.d.ts +0 -14
- package/dist/types/sdk/accounts/intents/operations/quota-update/index.d.ts +0 -24
- package/dist/types/sdk/accounts/intents/operations/repay-credit-account/index.d.ts +0 -31
- package/dist/types/sdk/accounts/intents/operations/start-delayed-withdrawal/index.d.ts +0 -23
- package/dist/types/sdk/accounts/intents/operations/swap/index.d.ts +0 -28
- package/dist/types/sdk/accounts/intents/operations/types.d.ts +0 -21
- package/dist/types/sdk/accounts/intents/operations/unwrap-rwa-collateral/index.d.ts +0 -30
- package/dist/types/sdk/accounts/intents/operations/withdraw-collateral/index.d.ts +0 -36
- package/dist/types/sdk/accounts/intents/operations/wrap-rwa-collateral/index.d.ts +0 -30
- package/dist/types/sdk/accounts/intents/quoters/close.d.ts +0 -43
- package/dist/types/sdk/accounts/intents/quoters/index.d.ts +0 -3
- package/dist/types/sdk/accounts/intents/quoters/swap.d.ts +0 -43
- package/dist/types/sdk/accounts/intents/testing/resume.d.ts +0 -84
- package/dist/types/sdk/accounts/intents/utils/simulate-adjust-state.d.ts +0 -19
- package/dist/types/sdk/accounts/intents/utils/simulate-assets.d.ts +0 -21
- package/dist/types/sdk/accounts/intents/utils/with-quota-update.d.ts +0 -16
- /package/dist/cjs/{new-sdk/utils/history.js → model/notices.js} +0 -0
- /package/dist/cjs/{sdk/accounts/intents/operations → new-sdk/simulate}/types.js +0 -0
- /package/dist/esm/{new-sdk/utils/history.js → model/notices.js} +0 -0
- /package/dist/esm/{sdk/accounts/intents/operations → new-sdk/simulate}/types.js +0 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import "../../constants/math.js";
|
|
2
|
+
import { IntentPreviewError } from "./types.js";
|
|
3
|
+
import { convertAmount } from "./utils/convert-amount.js";
|
|
4
|
+
import { assertCanBorrow, assertCollateralised, assertGrowthAllowed, assertMarketOperable, assertQuotaHeadroom } from "./guards.js";
|
|
5
|
+
import { assertDebtInBand, debtForLeverage } from "./math.js";
|
|
6
|
+
import { getQuotasForUpdate } from "./utils/quotas-for-update.js";
|
|
7
|
+
import { createRouterPaths } from "./utils/router-path.js";
|
|
8
|
+
import "./utils/index.js";
|
|
9
|
+
//#region src/sdk/accounts/intents/open-strategy.ts
|
|
10
|
+
/** Stand-in account address: nothing exists on chain until the tx lands. */
|
|
11
|
+
const NO_ACCOUNT = "0x0000000000000000000000000000000000000000";
|
|
12
|
+
/**
|
|
13
|
+
* Previews opening a leveraged position out of wallet collateral.
|
|
14
|
+
*
|
|
15
|
+
* Debt follows from the target leverage against the supplied margin
|
|
16
|
+
* (`debt = margin * (L - 1)`, `totalValue = margin * L`); the collateral and the
|
|
17
|
+
* borrowed underlying are then routed into the target token in one pathfinder call.
|
|
18
|
+
*
|
|
19
|
+
* There is no account yet, so this does not go through `startIntent` and produces
|
|
20
|
+
* no operation list — the caller passes the numbers and calls straight to
|
|
21
|
+
* `sdk.accounts.openCA`.
|
|
22
|
+
*/
|
|
23
|
+
async function previewOpenStrategy(props) {
|
|
24
|
+
const { sdk, creditManager, collateral, targetToken, leverage, slippage = 0, quotaReserve, leftoverBalances = [] } = props;
|
|
25
|
+
if (leverage < 100n) throw new IntentPreviewError("leverageOutOfRange", `openStrategy: leverage ${leverage} is below 1x`);
|
|
26
|
+
const suite = sdk.marketRegister.findCreditManager(creditManager);
|
|
27
|
+
const market = sdk.marketRegister.findByCreditManager(creditManager);
|
|
28
|
+
assertMarketOperable(suite);
|
|
29
|
+
const underlying = market.pool.underlying.toLowerCase();
|
|
30
|
+
const convert = convertAmount(sdk, creditManager);
|
|
31
|
+
const margin = collateral.reduce((acc, a) => acc + convert(a.token, underlying, a.balance), 0n);
|
|
32
|
+
if (margin <= 0n) throw new IntentPreviewError("insufficientSourceBalance", "openStrategy: collateral is worth nothing in underlying");
|
|
33
|
+
const debt = debtForLeverage(margin, leverage);
|
|
34
|
+
const account = {
|
|
35
|
+
creditAccount: NO_ACCOUNT,
|
|
36
|
+
creditManager: creditManager.toLowerCase(),
|
|
37
|
+
creditFacade: suite.creditFacade.address.toLowerCase(),
|
|
38
|
+
underlying,
|
|
39
|
+
enabledTokensMask: 0n,
|
|
40
|
+
totalDebtUSD: 0n,
|
|
41
|
+
accountDebt: 0n,
|
|
42
|
+
tokens: []
|
|
43
|
+
};
|
|
44
|
+
assertDebtInBand(debt, suite.creditFacade);
|
|
45
|
+
assertCanBorrow(suite, debt);
|
|
46
|
+
const leg = await createRouterPaths({
|
|
47
|
+
sdk,
|
|
48
|
+
creditAccount: account,
|
|
49
|
+
slippage
|
|
50
|
+
}).openStrategy({
|
|
51
|
+
expectedBalances: mergeExpectedBalances(collateral, underlying, debt),
|
|
52
|
+
leftoverBalances,
|
|
53
|
+
target: targetToken
|
|
54
|
+
});
|
|
55
|
+
const averageAssets = toAssets(leg.balances);
|
|
56
|
+
const minAssets = toAssets(leg.minBalances);
|
|
57
|
+
const quotasFor = (assets) => getQuotasForUpdate({
|
|
58
|
+
assetsBefore: [],
|
|
59
|
+
assetsAfter: assets,
|
|
60
|
+
initialQuotas: [],
|
|
61
|
+
quotaReserve,
|
|
62
|
+
underlyingToken: underlying,
|
|
63
|
+
liquidationThresholds: suite.creditManager.liquidationThresholds,
|
|
64
|
+
quotas: market.pool.pqk.quotas,
|
|
65
|
+
maxDebt: suite.creditFacade.maxDebt,
|
|
66
|
+
convert
|
|
67
|
+
}).quotaIncrease;
|
|
68
|
+
const averageQuota = quotasFor(averageAssets);
|
|
69
|
+
const minQuota = quotasFor(minAssets);
|
|
70
|
+
assertGrowthAllowed({
|
|
71
|
+
sdk,
|
|
72
|
+
suite,
|
|
73
|
+
market,
|
|
74
|
+
before: [],
|
|
75
|
+
after: averageAssets
|
|
76
|
+
});
|
|
77
|
+
assertQuotaHeadroom(market, averageQuota);
|
|
78
|
+
const snapshot = {
|
|
79
|
+
creditManager,
|
|
80
|
+
assets: averageAssets,
|
|
81
|
+
quotas: averageQuota,
|
|
82
|
+
totalDebt: debt,
|
|
83
|
+
totalValue: margin + debt
|
|
84
|
+
};
|
|
85
|
+
const metrics = {
|
|
86
|
+
healthFactor: sdk.positions.healthFactor(snapshot),
|
|
87
|
+
overallApy: 0,
|
|
88
|
+
borrowRate: sdk.positions.borrowRate(snapshot),
|
|
89
|
+
timeToLiquidation: sdk.positions.timeToLiquidation(snapshot),
|
|
90
|
+
liquidationPrice: sdk.positions.liquidationPrice(snapshot)
|
|
91
|
+
};
|
|
92
|
+
assertCollateralised(metrics.healthFactor);
|
|
93
|
+
return {
|
|
94
|
+
debt,
|
|
95
|
+
collateral: margin,
|
|
96
|
+
totalValue: margin + debt,
|
|
97
|
+
averageAssets,
|
|
98
|
+
minAssets,
|
|
99
|
+
averageQuota,
|
|
100
|
+
minQuota,
|
|
101
|
+
calls: [...leg.calls],
|
|
102
|
+
...metrics
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** Collateral plus the borrowed underlying, folded into one balance per token. */
|
|
106
|
+
function mergeExpectedBalances(collateral, underlying, debt) {
|
|
107
|
+
const merged = /* @__PURE__ */ new Map();
|
|
108
|
+
for (const a of collateral) {
|
|
109
|
+
const token = a.token.toLowerCase();
|
|
110
|
+
merged.set(token, (merged.get(token) ?? 0n) + a.balance);
|
|
111
|
+
}
|
|
112
|
+
if (debt > 0n) merged.set(underlying, (merged.get(underlying) ?? 0n) + debt);
|
|
113
|
+
return [...merged.entries()].map(([token, balance]) => ({
|
|
114
|
+
token,
|
|
115
|
+
balance
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
/** Router balance records carry mixed-case keys; normalise and drop empties. */
|
|
119
|
+
function toAssets(balances) {
|
|
120
|
+
const merged = /* @__PURE__ */ new Map();
|
|
121
|
+
for (const [token, balance] of Object.entries(balances)) {
|
|
122
|
+
if (balance <= 0n) continue;
|
|
123
|
+
const key = token.toLowerCase();
|
|
124
|
+
merged.set(key, (merged.get(key) ?? 0n) + balance);
|
|
125
|
+
}
|
|
126
|
+
return [...merged.entries()].map(([token, balance]) => ({
|
|
127
|
+
token,
|
|
128
|
+
balance
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
//#endregion
|
|
132
|
+
export { previewOpenStrategy };
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { MAX_UINT256 } from "../../constants/math.js";
|
|
2
|
+
//#region src/sdk/accounts/intents/operations.ts
|
|
3
|
+
function buildAddCollateralOperation(input) {
|
|
4
|
+
return {
|
|
5
|
+
type: "addCollateral",
|
|
6
|
+
token: input.token,
|
|
7
|
+
amount: input.amount,
|
|
8
|
+
value: input.value,
|
|
9
|
+
calls: input.sdk.accounts.prepareAddCollateral(input.creditAccount.creditFacade, [{
|
|
10
|
+
token: input.token,
|
|
11
|
+
balance: input.amount
|
|
12
|
+
}], {})
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function buildIncreaseDebtOperation(input) {
|
|
16
|
+
return {
|
|
17
|
+
type: "increaseDebt",
|
|
18
|
+
amount: input.amount,
|
|
19
|
+
calls: [input.sdk.accounts.prepareIncreaseDebt(input.creditAccount.creditFacade, input.amount)]
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function buildDecreaseDebtOperation(input) {
|
|
23
|
+
return {
|
|
24
|
+
type: "decreaseDebt",
|
|
25
|
+
amount: input.amount,
|
|
26
|
+
...input.full ? { full: true } : {},
|
|
27
|
+
calls: [input.sdk.accounts.prepareChangeDebt(input.creditAccount.creditFacade, input.full ? MAX_UINT256 : input.amount, true)]
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function buildWithdrawCollateralOperation(input) {
|
|
31
|
+
return {
|
|
32
|
+
type: "withdrawCollateral",
|
|
33
|
+
token: input.token,
|
|
34
|
+
amount: input.amount,
|
|
35
|
+
to: input.to,
|
|
36
|
+
...input.all ? { all: true } : {},
|
|
37
|
+
calls: [input.sdk.accounts.prepareWithdrawToken(input.creditAccount.creditFacade, input.token, input.all ? MAX_UINT256 : input.amount, input.to)]
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** One routed leg, with the amounts it was quoted at. */
|
|
41
|
+
function buildSwapOperation(input) {
|
|
42
|
+
return buildCloseSwapOperation({
|
|
43
|
+
from: [{
|
|
44
|
+
token: input.tokenIn,
|
|
45
|
+
balance: input.amountIn
|
|
46
|
+
}],
|
|
47
|
+
tokenOut: input.tokenOut,
|
|
48
|
+
amountOut: input.amountOut,
|
|
49
|
+
calls: input.calls
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The many-to-one leg an exit routes: every balance listed goes in, and the
|
|
54
|
+
* underlying comes out.
|
|
55
|
+
*/
|
|
56
|
+
function buildCloseSwapOperation(input) {
|
|
57
|
+
if (input.calls.length === 0) throw new Error("swap: missing router calls");
|
|
58
|
+
return {
|
|
59
|
+
type: "swap",
|
|
60
|
+
from: input.from,
|
|
61
|
+
tokenOut: input.tokenOut,
|
|
62
|
+
amountOut: input.amountOut,
|
|
63
|
+
calls: input.calls
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function buildQuotaUpdateOperation(input) {
|
|
67
|
+
const { update, creditAccount, sdk } = input;
|
|
68
|
+
const quotaAssets = [...update.quotaIncrease, ...update.quotaDecrease];
|
|
69
|
+
const calls = quotaAssets.length === 0 ? [] : sdk.accounts.prepareUpdateQuotas(creditAccount.creditFacade, {
|
|
70
|
+
averageQuota: quotaAssets,
|
|
71
|
+
minQuota: quotaAssets
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
type: "changeQuota",
|
|
75
|
+
desiredQuota: update.desiredQuota,
|
|
76
|
+
quotaIncrease: update.quotaIncrease,
|
|
77
|
+
quotaDecrease: update.quotaDecrease,
|
|
78
|
+
calls
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** Wraps an RWA asset into the market underlying. */
|
|
82
|
+
async function buildWrapRwaCollateralOperation(input) {
|
|
83
|
+
const calls = await input.sdk.accounts.assembleRWAWrapCalls(input.amountIn, input.creditAccount.creditManager);
|
|
84
|
+
if (!calls) throw new Error("wrapRwaCollateral: no wrap calls found");
|
|
85
|
+
return {
|
|
86
|
+
type: "wrapRwaCollateral",
|
|
87
|
+
tokenIn: input.tokenIn,
|
|
88
|
+
amount: input.amountIn,
|
|
89
|
+
tokenOut: input.tokenOut,
|
|
90
|
+
amountOut: input.amountOut,
|
|
91
|
+
calls
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** Unwraps the market underlying back into its RWA asset. */
|
|
95
|
+
async function buildUnwrapRwaCollateralOperation(input) {
|
|
96
|
+
const calls = await input.sdk.accounts.assembleRWAUnwrapCalls(input.amountIn, input.creditAccount.creditManager);
|
|
97
|
+
if (!calls) throw new Error("unwrapRwaCollateral: no unwrap calls found");
|
|
98
|
+
return {
|
|
99
|
+
type: "unwrapRwaCollateral",
|
|
100
|
+
tokenIn: input.tokenIn,
|
|
101
|
+
amount: input.amountIn,
|
|
102
|
+
tokenOut: input.tokenOut,
|
|
103
|
+
amountOut: input.amountOut,
|
|
104
|
+
calls
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function buildStartDelayedWithdrawalOperation(input) {
|
|
108
|
+
const { preview } = input;
|
|
109
|
+
return {
|
|
110
|
+
type: "startDelayedWithdrawal",
|
|
111
|
+
token: preview.token,
|
|
112
|
+
amountIn: preview.amountIn,
|
|
113
|
+
outputs: [...preview.outputs],
|
|
114
|
+
settlement: preview.outputs.some((o) => o.isDelayed) ? "delayed" : "instant",
|
|
115
|
+
calls: input.sdk.accounts.assembleStartDelayedWithdrawalCalls({
|
|
116
|
+
creditFacade: input.creditAccount.creditFacade,
|
|
117
|
+
preview
|
|
118
|
+
})
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function buildClaimDelayedWithdrawalOperation(input) {
|
|
122
|
+
const { claimable } = input;
|
|
123
|
+
return {
|
|
124
|
+
type: "claimDelayedWithdrawal",
|
|
125
|
+
token: claimable.token.toLowerCase(),
|
|
126
|
+
withdrawalPhantomToken: claimable.withdrawalPhantomToken.toLowerCase(),
|
|
127
|
+
withdrawalTokenSpent: claimable.withdrawalTokenSpent,
|
|
128
|
+
outputs: claimable.outputs.map((o) => ({
|
|
129
|
+
...o,
|
|
130
|
+
token: o.token.toLowerCase()
|
|
131
|
+
})),
|
|
132
|
+
calls: input.sdk.accounts.assembleClaimDelayedCalls({
|
|
133
|
+
creditFacade: input.creditAccount.creditFacade,
|
|
134
|
+
claimableNow: claimable
|
|
135
|
+
})
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* What a request or a claim puts on the account right away, as opposed to what
|
|
140
|
+
* only the phantom token represents.
|
|
141
|
+
*/
|
|
142
|
+
function instantOutput(outputs, token) {
|
|
143
|
+
for (const out of outputs) {
|
|
144
|
+
if (out.isDelayed || out.amount <= 0n) continue;
|
|
145
|
+
if (token != null && out.token.toLowerCase() !== token.toLowerCase()) continue;
|
|
146
|
+
return {
|
|
147
|
+
token: out.token,
|
|
148
|
+
amount: out.amount
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//#endregion
|
|
153
|
+
export { buildAddCollateralOperation, buildClaimDelayedWithdrawalOperation, buildCloseSwapOperation, buildDecreaseDebtOperation, buildIncreaseDebtOperation, buildQuotaUpdateOperation, buildStartDelayedWithdrawalOperation, buildSwapOperation, buildUnwrapRwaCollateralOperation, buildWithdrawCollateralOperation, buildWrapRwaCollateralOperation, instantOutput };
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { MAX_UINT256, PERCENTAGE_FACTOR } from "../../constants/math.js";
|
|
2
|
+
import "../../constants/index.js";
|
|
3
|
+
import { IntentPreviewError } from "./types.js";
|
|
4
|
+
import { eq } from "./utils/common.js";
|
|
5
|
+
import { assertDebtInBand, assertLeverageAtLeastOne, debtForLeverage, proportionalDebt } from "./math.js";
|
|
6
|
+
//#region src/sdk/accounts/intents/plan.ts
|
|
7
|
+
/** Whatever the previous convert produced. */
|
|
8
|
+
const RAISED = { raised: true };
|
|
9
|
+
/** Intent 5: the token lands as is; debt is untouched. */
|
|
10
|
+
function planAddCollateral(intent) {
|
|
11
|
+
assertPositive(intent.amount, "addCollateral");
|
|
12
|
+
return [add(intent.token, intent.amount, intent.value)];
|
|
13
|
+
}
|
|
14
|
+
/** Intent 4: one asset out at fixed debt. */
|
|
15
|
+
function planWithdrawAsset(intent, view) {
|
|
16
|
+
assertPositive(intent.amount, "withdrawAsset");
|
|
17
|
+
return payout(view, intent.token, intent.amount, intent.to);
|
|
18
|
+
}
|
|
19
|
+
/** Intent 6: collateral fixed, debt retargeted to `C0 · (L1 − 1)`. */
|
|
20
|
+
function planAdjustLeverage(intent, view) {
|
|
21
|
+
const { U, delta } = leverageShape(intent, view);
|
|
22
|
+
if (delta === 0n) return [];
|
|
23
|
+
const T = intent.token ?? positionToken(view, "adjustLeverage");
|
|
24
|
+
if (delta > 0n) return [borrow(delta), convert(U, T, delta)];
|
|
25
|
+
const shortfall = -delta - view.balanceOf(U);
|
|
26
|
+
if (shortfall > 0n && eq(T, U)) throw new IntentPreviewError("insufficientSourceBalance", `adjustLeverage: needs ${-delta} underlying, account holds ${view.balanceOf(U)}`);
|
|
27
|
+
return [...shortfall > 0n ? [convert(T, U, view.price(U, T, shortfall))] : [], repay(-delta)];
|
|
28
|
+
}
|
|
29
|
+
/** Intents 1.1 / 1.2: collateral grows by `a`, debt grows to match. */
|
|
30
|
+
function planDeposit(intent, view) {
|
|
31
|
+
assertPositive(intent.amount, "deposit");
|
|
32
|
+
const U = view.underlying;
|
|
33
|
+
if (!eq(intent.token, U) && !(view.rwaAsset && eq(intent.token, view.rwaAsset))) throw new IntentPreviewError("unsupportedCollateralToken", `deposit: only ${U}${view.rwaAsset ? ` or ${view.rwaAsset}` : ""} can be deposited, got ${intent.token}`);
|
|
34
|
+
const aU = view.price(intent.token, U, intent.amount);
|
|
35
|
+
const debtDelta = intent.targetLeverage === void 0 ? proportionalDebt(view, aU) : debtForLeverage(view.collateral + aU, intent.targetLeverage) - view.debt;
|
|
36
|
+
if (debtDelta < 0n) throw new IntentPreviewError("leverageOutOfRange", `deposit: target leverage ${intent.targetLeverage} would require repaying debt`);
|
|
37
|
+
assertDebtInBand(view.debt + debtDelta, view.band);
|
|
38
|
+
const T = intent.positionToken ?? positionToken(view, "deposit");
|
|
39
|
+
const depositStays = eq(intent.token, T);
|
|
40
|
+
return [
|
|
41
|
+
add(intent.token, intent.amount, intent.value),
|
|
42
|
+
...depositStays ? [] : [convert(intent.token, U, intent.amount)],
|
|
43
|
+
...debtDelta > 0n ? [borrow(debtDelta)] : [],
|
|
44
|
+
convert(U, T, debtDelta + (depositStays ? 0n : aU))
|
|
45
|
+
].filter((s) => s.kind !== "convert" || s.amount !== 0n);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Intent 3: funding comes in from the wallet and goes straight into the debt.
|
|
49
|
+
* Collateral never moves, so the whole plan is the funding's way to `U`.
|
|
50
|
+
*
|
|
51
|
+
* Funding in `U` needs no way there: it lands and is repaid, which is the whole
|
|
52
|
+
* plan. An RWA market also takes the raw asset behind its underlying, and that
|
|
53
|
+
* one is wrapped on the way in.
|
|
54
|
+
*
|
|
55
|
+
* `MAX_UINT256` settles the loan: the wallet is asked for the debt as it stands
|
|
56
|
+
* plus the headroom {@link SETTLE_MARGIN} allows for the interest of the blocks
|
|
57
|
+
* still to come, since the facade is told to repay everything outstanding
|
|
58
|
+
* rather than the amount quoted here.
|
|
59
|
+
*/
|
|
60
|
+
function planRepay(intent, view) {
|
|
61
|
+
assertPositive(intent.amount, "repay");
|
|
62
|
+
const U = view.underlying;
|
|
63
|
+
const fundsInU = eq(intent.token, U);
|
|
64
|
+
if (!fundsInU && !(view.rwaAsset && eq(intent.token, view.rwaAsset))) throw new IntentPreviewError("unsupportedCollateralToken", `repay: only ${U}${view.rwaAsset ? ` or ${view.rwaAsset}` : ""} can be repaid with, got ${intent.token}`);
|
|
65
|
+
if (view.debt <= 0n) throw new IntentPreviewError("debtOutOfRange", "repay: the account owes nothing");
|
|
66
|
+
const funding = everything(intent.amount) ? view.price(U, intent.token, withMargin(view.debt)) : intent.amount;
|
|
67
|
+
const repaid = min(view.price(intent.token, U, funding), view.debt);
|
|
68
|
+
assertDebtInBand(view.debt - repaid, view.band);
|
|
69
|
+
return [
|
|
70
|
+
add(intent.token, funding, intent.value),
|
|
71
|
+
...fundsInU ? [] : [convert(intent.token, U, funding)],
|
|
72
|
+
...repaid === view.debt ? [clearQuotas()] : [],
|
|
73
|
+
repay(repaid)
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Intent 2.1: `W` of value leaves, debt shrinks by `D0 · W / C0` so leverage
|
|
78
|
+
* holds. Both are funded by the source `S`.
|
|
79
|
+
*/
|
|
80
|
+
function planWithdraw(intent, view) {
|
|
81
|
+
const { U, T, S, WU, dD, all } = withdrawShape(intent, view);
|
|
82
|
+
if (all) return [
|
|
83
|
+
clearQuotas(),
|
|
84
|
+
{ kind: "closeAll" },
|
|
85
|
+
...view.debt > 0n ? [repay(view.debt)] : [],
|
|
86
|
+
{
|
|
87
|
+
kind: "sweep",
|
|
88
|
+
to: intent.to
|
|
89
|
+
}
|
|
90
|
+
];
|
|
91
|
+
if (eq(T, U)) return [
|
|
92
|
+
convert(S, U, view.price(U, S, WU + dD)),
|
|
93
|
+
repay(dD, intent.amount),
|
|
94
|
+
...payout(view, U, intent.amount, intent.to)
|
|
95
|
+
];
|
|
96
|
+
return [
|
|
97
|
+
convert(S, U, view.price(U, S, dD)),
|
|
98
|
+
repay(dD),
|
|
99
|
+
convert(S, T, view.price(U, S, WU)),
|
|
100
|
+
...payout(view, T, RAISED, intent.to)
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Intent 2.1 against a source that cannot be sold on a DEX.
|
|
105
|
+
*
|
|
106
|
+
* Some collateral only converts through its issuer — a Securitize dsToken, a
|
|
107
|
+
* Mellow share — which answers a redemption request now and pays out days
|
|
108
|
+
* later. The trade is unchanged; what changes is that the proceeds do not exist
|
|
109
|
+
* yet, so this half only requests the redemption:
|
|
110
|
+
*
|
|
111
|
+
* ```
|
|
112
|
+
* request(S, W + dD) → [days] → claim → convert → repay → withdraw
|
|
113
|
+
* ```
|
|
114
|
+
*
|
|
115
|
+
* The tail is planned at claim time by {@link planFinishWithdraw}, from the
|
|
116
|
+
* intent this request records — only then is the claimed amount, and the token
|
|
117
|
+
* it arrived in, known.
|
|
118
|
+
*/
|
|
119
|
+
function planWithdrawDelayed(intent, view) {
|
|
120
|
+
const { U, T, S, WU, dD, all } = withdrawShape(intent, view);
|
|
121
|
+
if (all) throw new IntentPreviewError("noDelayedRoute", "withdraw: taking the whole net value cannot be started as a redemption");
|
|
122
|
+
if (!eq(T, U) && !(view.rwaAsset && eq(T, view.rwaAsset))) throw new IntentPreviewError("noDelayedRoute", `withdraw: a delayed route cannot pay out in ${T}`);
|
|
123
|
+
const payoutIsSource = eq(T, S);
|
|
124
|
+
return [{
|
|
125
|
+
kind: "request",
|
|
126
|
+
token: S,
|
|
127
|
+
amount: view.price(U, S, payoutIsSource ? dD : WU + dD),
|
|
128
|
+
reserve: payoutIsSource ? intent.amount : 0n,
|
|
129
|
+
record: {
|
|
130
|
+
type: "WITHDRAW_COLLATERAL",
|
|
131
|
+
to: intent.to,
|
|
132
|
+
withdrawToken: T,
|
|
133
|
+
withdrawAmount: intent.amount,
|
|
134
|
+
sourceToken: S,
|
|
135
|
+
debtRepaid: dD
|
|
136
|
+
}
|
|
137
|
+
}];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Intent 6.2 against a position token that only redeems through its issuer.
|
|
141
|
+
*
|
|
142
|
+
* Only deleveraging can be delayed: raising leverage borrows and buys, both of
|
|
143
|
+
* which settle at once. The request covers whatever idle underlying does not
|
|
144
|
+
* already, and the tail repays from the claim.
|
|
145
|
+
*/
|
|
146
|
+
function planAdjustLeverageDelayed(intent, view) {
|
|
147
|
+
const { U, delta } = leverageShape(intent, view);
|
|
148
|
+
if (delta >= 0n) throw new IntentPreviewError("noDelayedRoute", "adjustLeverage: only deleveraging can settle with a delay");
|
|
149
|
+
const shortfall = -delta - view.balanceOf(U);
|
|
150
|
+
if (shortfall <= 0n) throw new IntentPreviewError("noDelayedRoute", "adjustLeverage: idle underlying covers the repayment, nothing to redeem");
|
|
151
|
+
const T = intent.token ?? positionToken(view, "adjustLeverage");
|
|
152
|
+
return [{
|
|
153
|
+
kind: "request",
|
|
154
|
+
token: T,
|
|
155
|
+
amount: view.price(U, T, shortfall),
|
|
156
|
+
reserve: 0n,
|
|
157
|
+
record: { type: "DECREASE_LEVERAGE" }
|
|
158
|
+
}];
|
|
159
|
+
}
|
|
160
|
+
/** Everything claimed goes into the debt. */
|
|
161
|
+
function planFinishDecreaseLeverage(claimable, claimed, view) {
|
|
162
|
+
return [
|
|
163
|
+
claim(claimable),
|
|
164
|
+
convert(claimed.token, view.underlying, claimed.amount),
|
|
165
|
+
repay(RAISED)
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The claim is split between the promised payout `W` and the debt the leading
|
|
170
|
+
* half deferred: the payout is served first, the debt gets what is left, so a
|
|
171
|
+
* routing shortfall shows as leverage a touch above target rather than as a
|
|
172
|
+
* payout the wallet was promised and did not get.
|
|
173
|
+
*/
|
|
174
|
+
function planFinishWithdraw(intent, claimable, claimed, view) {
|
|
175
|
+
const U = view.underlying;
|
|
176
|
+
const T = intent.withdrawToken;
|
|
177
|
+
const W = intent.withdrawAmount;
|
|
178
|
+
if (!eq(T, U) && !(view.rwaAsset && eq(T, view.rwaAsset))) throw new IntentPreviewError("noDelayedRoute", `finishWithdraw: cannot pay out in ${T}`);
|
|
179
|
+
if (intent.debtRepaid === 0n) return [
|
|
180
|
+
claim(claimable),
|
|
181
|
+
convert(claimed.token, T, claimed.amount),
|
|
182
|
+
...payout(view, T, {
|
|
183
|
+
raised: true,
|
|
184
|
+
max: W
|
|
185
|
+
}, intent.to)
|
|
186
|
+
];
|
|
187
|
+
if (eq(intent.sourceToken, T)) return [
|
|
188
|
+
claim(claimable),
|
|
189
|
+
convert(claimed.token, U, claimed.amount),
|
|
190
|
+
repay({
|
|
191
|
+
raised: true,
|
|
192
|
+
max: intent.debtRepaid
|
|
193
|
+
}),
|
|
194
|
+
...payout(view, T, W, intent.to)
|
|
195
|
+
];
|
|
196
|
+
if (eq(T, U)) return [
|
|
197
|
+
claim(claimable),
|
|
198
|
+
convert(claimed.token, U, claimed.amount),
|
|
199
|
+
repay(intent.debtRepaid, W),
|
|
200
|
+
...payout(view, U, {
|
|
201
|
+
raised: true,
|
|
202
|
+
max: W
|
|
203
|
+
}, intent.to)
|
|
204
|
+
];
|
|
205
|
+
const reserved = min(view.price(T, claimed.token, W), claimed.amount);
|
|
206
|
+
return [
|
|
207
|
+
claim(claimable),
|
|
208
|
+
convert(claimed.token, U, claimed.amount - reserved),
|
|
209
|
+
repay({
|
|
210
|
+
raised: true,
|
|
211
|
+
max: intent.debtRepaid
|
|
212
|
+
}),
|
|
213
|
+
convert(claimed.token, T, reserved),
|
|
214
|
+
...payout(view, T, {
|
|
215
|
+
raised: true,
|
|
216
|
+
max: W
|
|
217
|
+
}, intent.to)
|
|
218
|
+
];
|
|
219
|
+
}
|
|
220
|
+
/** Nothing is owed beyond the claim: the tokens land and quotas catch up. */
|
|
221
|
+
function planFinishClaimOnly(claimable) {
|
|
222
|
+
return [claim(claimable)];
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* What a withdrawal comes down to: the payout `W` of `T` priced in the
|
|
226
|
+
* underlying, the debt `dD` that keeps leverage flat, and the source `S` both
|
|
227
|
+
* are funded from. Shared so that the instant and the delayed leading half
|
|
228
|
+
* cannot disagree on the amounts.
|
|
229
|
+
*/
|
|
230
|
+
function withdrawShape(intent, view) {
|
|
231
|
+
assertPositive(intent.amount, "withdraw");
|
|
232
|
+
const U = view.underlying;
|
|
233
|
+
const T = intent.tokenOut ?? U;
|
|
234
|
+
const S = intent.sourceToken ?? sourceToken(view);
|
|
235
|
+
if (everything(intent.amount)) {
|
|
236
|
+
assertHasValue(view);
|
|
237
|
+
return {
|
|
238
|
+
U,
|
|
239
|
+
T,
|
|
240
|
+
S,
|
|
241
|
+
WU: view.collateral,
|
|
242
|
+
dD: view.debt,
|
|
243
|
+
all: true
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const WU = view.price(T, U, intent.amount);
|
|
247
|
+
if (WU <= 0n) throw new IntentPreviewError("insufficientSourceBalance", `withdraw: cannot price ${intent.amount} of ${T}`);
|
|
248
|
+
if (WU >= view.collateral) {
|
|
249
|
+
assertHasValue(view);
|
|
250
|
+
return {
|
|
251
|
+
U,
|
|
252
|
+
T,
|
|
253
|
+
S,
|
|
254
|
+
WU,
|
|
255
|
+
dD: view.debt,
|
|
256
|
+
all: true
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
const dD = proportionalDebt(view, WU);
|
|
260
|
+
assertDebtInBand(view.debt - dD, view.band);
|
|
261
|
+
return {
|
|
262
|
+
U,
|
|
263
|
+
T,
|
|
264
|
+
S,
|
|
265
|
+
WU,
|
|
266
|
+
dD,
|
|
267
|
+
all: false
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* The debt move a leverage target implies. Shared by the instant and the
|
|
272
|
+
* delayed leading half; the token that funds it is resolved by the caller,
|
|
273
|
+
* once it knows the move needs one at all.
|
|
274
|
+
*/
|
|
275
|
+
function leverageShape(intent, view) {
|
|
276
|
+
assertLeverageAtLeastOne(intent.targetLeverage);
|
|
277
|
+
if (view.collateral <= 0n) throw new IntentPreviewError("insufficientSourceBalance", "adjustLeverage: account has no collateral to lever");
|
|
278
|
+
const target = debtForLeverage(view.collateral, intent.targetLeverage);
|
|
279
|
+
assertDebtInBand(target, view.band);
|
|
280
|
+
return {
|
|
281
|
+
U: view.underlying,
|
|
282
|
+
delta: target - view.debt
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
const add = (token, amount, value) => ({
|
|
286
|
+
kind: "add",
|
|
287
|
+
token,
|
|
288
|
+
amount,
|
|
289
|
+
value
|
|
290
|
+
});
|
|
291
|
+
const borrow = (amount) => ({
|
|
292
|
+
kind: "borrow",
|
|
293
|
+
amount
|
|
294
|
+
});
|
|
295
|
+
const repay = (amount, keep) => keep === void 0 ? {
|
|
296
|
+
kind: "repay",
|
|
297
|
+
amount
|
|
298
|
+
} : {
|
|
299
|
+
kind: "repay",
|
|
300
|
+
amount,
|
|
301
|
+
keep
|
|
302
|
+
};
|
|
303
|
+
const convert = (from, to, amount) => ({
|
|
304
|
+
kind: "convert",
|
|
305
|
+
from,
|
|
306
|
+
to,
|
|
307
|
+
amount
|
|
308
|
+
});
|
|
309
|
+
const claim = (claimable) => ({
|
|
310
|
+
kind: "claim",
|
|
311
|
+
claimable
|
|
312
|
+
});
|
|
313
|
+
const clearQuotas = () => ({ kind: "clearQuotas" });
|
|
314
|
+
/**
|
|
315
|
+
* Headroom a settlement raises on top of the debt it read, in
|
|
316
|
+
* `PERCENTAGE_FACTOR`: enough interest for the transaction to sit in the
|
|
317
|
+
* mempool for hours at any sane borrow rate, small enough not to matter to the
|
|
318
|
+
* wallet that fronts it.
|
|
319
|
+
*/
|
|
320
|
+
const SETTLE_MARGIN = 10n;
|
|
321
|
+
const withMargin = (debt) => debt + debt * SETTLE_MARGIN / PERCENTAGE_FACTOR;
|
|
322
|
+
/** The amount that asks for all of it, whatever "all" turns out to be. */
|
|
323
|
+
const everything = (amount) => amount >= MAX_UINT256;
|
|
324
|
+
const min = (a, b) => a < b ? a : b;
|
|
325
|
+
/**
|
|
326
|
+
* Hands `amount` of `token` to `to`. The wrapped underlying of an RWA market
|
|
327
|
+
* cannot leave the account, so it is unwrapped into the raw asset on the way.
|
|
328
|
+
*/
|
|
329
|
+
function payout(view, token, amount, to) {
|
|
330
|
+
if (view.rwaAsset && eq(token, view.underlying)) return [convert(view.underlying, view.rwaAsset, amount), {
|
|
331
|
+
kind: "withdraw",
|
|
332
|
+
token: view.rwaAsset,
|
|
333
|
+
amount: RAISED,
|
|
334
|
+
to
|
|
335
|
+
}];
|
|
336
|
+
return [{
|
|
337
|
+
kind: "withdraw",
|
|
338
|
+
token,
|
|
339
|
+
amount,
|
|
340
|
+
to
|
|
341
|
+
}];
|
|
342
|
+
}
|
|
343
|
+
function positionToken(view, flow) {
|
|
344
|
+
const pick = view.fattest([view.underlying]);
|
|
345
|
+
if (!pick) throw new IntentPreviewError("insufficientSourceBalance", `${flow}: no position token on the account`);
|
|
346
|
+
return pick;
|
|
347
|
+
}
|
|
348
|
+
function sourceToken(view) {
|
|
349
|
+
const pick = view.fattest();
|
|
350
|
+
if (!pick) throw new IntentPreviewError("insufficientSourceBalance", "withdraw: account has no spendable balance");
|
|
351
|
+
return pick;
|
|
352
|
+
}
|
|
353
|
+
/** An account whose debt has eaten its collateral has nothing to hand over. */
|
|
354
|
+
function assertHasValue(view) {
|
|
355
|
+
if (view.collateral <= 0n) throw new IntentPreviewError("insufficientSourceBalance", `withdraw: nothing to withdraw, net value is ${view.collateral}`);
|
|
356
|
+
}
|
|
357
|
+
function assertPositive(amount, flow) {
|
|
358
|
+
if (amount <= 0n) throw new IntentPreviewError("insufficientSourceBalance", `${flow}: amount must be positive`);
|
|
359
|
+
}
|
|
360
|
+
//#endregion
|
|
361
|
+
export { RAISED, planAddCollateral, planAdjustLeverage, planAdjustLeverageDelayed, planDeposit, planFinishClaimOnly, planFinishDecreaseLeverage, planFinishWithdraw, planRepay, planWithdraw, planWithdrawAsset, planWithdrawDelayed };
|